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'];