From 958846a86cabeaef1a75d6ff8293a6c2686149a6 Mon Sep 17 00:00:00 2001 From: veselcraft Date: Sat, 4 Dec 2021 16:06:28 +0300 Subject: [PATCH] L10n: tr function for JS scripts --- Web/Presenters/AboutPresenter.php | 12 ++++++++++ Web/Presenters/templates/@layout.xml | 2 ++ Web/Util/Localizator.php | 8 +++++++ Web/routes.yml | 2 ++ Web/static/js/l10n.js | 36 ++++++++++++++++++++++++++++ bootstrap.php | 5 ++++ 6 files changed, 65 insertions(+) create mode 100755 Web/static/js/l10n.js diff --git a/Web/Presenters/AboutPresenter.php b/Web/Presenters/AboutPresenter.php index 1a919e4d..7952c57f 100644 --- a/Web/Presenters/AboutPresenter.php +++ b/Web/Presenters/AboutPresenter.php @@ -2,6 +2,7 @@ namespace openvk\Web\Presenters; use openvk\Web\Themes\Themepacks; use openvk\Web\Models\Repositories\{Users, Managers}; +use openvk\Web\Util\Localizator; use Chandler\Session\Session; final class AboutPresenter extends OpenVKPresenter @@ -66,6 +67,17 @@ final class AboutPresenter extends OpenVKPresenter } } + function renderExportJSLanguage($lg = NULL): void + { + $localizer = Localizator::i(); + $lang = $lg; + if(is_null($lg)) + $this->throwError(404, "Not found", "Language is not found"); + header("Content-Type: application/javascript"); + echo "window.lang = " . json_encode($localizer->export($lang)) . ";"; // привет хардкод :DDD + exit; + } + function renderSandbox(): void { $this->template->languages = getLanguages(); diff --git a/Web/Presenters/templates/@layout.xml b/Web/Presenters/templates/@layout.xml index 56a4f4b5..2a759469 100644 --- a/Web/Presenters/templates/@layout.xml +++ b/Web/Presenters/templates/@layout.xml @@ -9,8 +9,10 @@ + {script "js/node_modules/jquery/dist/jquery.min.js"} {script "js/node_modules/umbrellajs/umbrella.min.js"} + {script "js/l10n.js"} {script "js/openvk.cls.js"} {ifset $thisUser} diff --git a/Web/Util/Localizator.php b/Web/Util/Localizator.php index 6f11db54..d73bec13 100644 --- a/Web/Util/Localizator.php +++ b/Web/Util/Localizator.php @@ -60,5 +60,13 @@ class Localizator return $array[$id] ?? "@$id"; } + function export($lang = NULL): ?array + { + $lang = is_null($lang) ? static::DEFAULT_LANG : $lang; + $array = @self::parse(dirname(__FILE__) . "/../../locales/$lang.strings"); + + return $array; + } + use TSimpleSingleton; } diff --git a/Web/routes.yml b/Web/routes.yml index b66dd873..715a8a84 100644 --- a/Web/routes.yml +++ b/Web/routes.yml @@ -25,6 +25,8 @@ routes: handler: "Support->delete" - url: "/language" handler: "About->language" + - url: "/language/{text}.js" + handler: "About->exportJSLanguage" - url: "/donate" handler: "About->donate" - url: "/kb/{slug}" diff --git a/Web/static/js/l10n.js b/Web/static/js/l10n.js new file mode 100755 index 00000000..8fb53d20 --- /dev/null +++ b/Web/static/js/l10n.js @@ -0,0 +1,36 @@ +function tr(string, ...arg) { + let output = window.lang[string]; + if(arg.length > 0) { + if(typeof arg[0] == 'number') { + let numberedStringId; + let cardinal = arg[0]; + switch(cardinal) { + case 0: + numberedString = string + '_zero'; + break; + case 1: + numberedString = string + '_one'; + break; + default: + numberedString = string + (cardinal < 5 ? '_few' : '_other'); + } + + let newoutput = window.lang[numberedString]; + if(newoutput === null) { + newoutput = window.lang[string + '_other']; + if(newoutput === null) { + newoutput = output; + } + } + + output = newoutput; + } + } + + let i = 1; + arg.forEach(element => { + output = output.replace(RegExp('(\\$' + i + ')'), element); + i++; + }); + return output; +} \ No newline at end of file diff --git a/bootstrap.php b/bootstrap.php index bcf0b9f5..1a52140c 100644 --- a/bootstrap.php +++ b/bootstrap.php @@ -115,6 +115,11 @@ function setLanguage($lg): void trigger_error("The language '$lg' is not available", E_USER_NOTICE); } +function getLanguage(): string +{ + return Session::i()->get("lang", "ru"); +} + function getLanguages(): array { return chandler_parse_yaml(OPENVK_ROOT . "/locales/list.yml")['list'];