diff --git a/src/mibew/configs/routing.yml b/src/mibew/configs/routing.yml
index cdccd8c3..436d5510 100644
--- a/src/mibew/configs/routing.yml
+++ b/src/mibew/configs/routing.yml
@@ -90,6 +90,13 @@ cron:
path: /cron
defaults: { _controller: Mibew\Controller\CronController::runAction }
+# A set of localization constants for the client side applications is generated
+# dynamically
+js_translation:
+ path: /locales/{locale}/translation.js
+ defaults:
+ _controller: Mibew\Controller\Localization\JsTranslationController::indexAction
+
license:
path: /license
defaults: { _controller: Mibew\Controller\LicenseController::indexAction }
diff --git a/src/mibew/libs/classes/Mibew/Controller/Localization/JsTranslationController.php b/src/mibew/libs/classes/Mibew/Controller/Localization/JsTranslationController.php
new file mode 100644
index 00000000..af5fb4a4
--- /dev/null
+++ b/src/mibew/libs/classes/Mibew/Controller/Localization/JsTranslationController.php
@@ -0,0 +1,64 @@
+attributes->get('locale');
+
+ $item = $this->getCache()->getItem('translation/js/' . $locale);
+ $content = $item->get(Invalidation::OLD);
+ if ($item->isMiss()) {
+ $item->lock();
+
+ $messages = load_messages($locale);
+ $content = sprintf(
+ '%s(%s);',
+ 'Mibew.Localization.set',
+ json_encode($messages)
+ );
+
+ $item->set($content);
+ }
+
+ $response = new Response();
+ $response->headers->set('Content-Type', 'text/javascript');
+ $response->setContent($content);
+
+ return $response;
+ }
+}
diff --git a/src/mibew/libs/classes/Mibew/Controller/Localization/TranslationController.php b/src/mibew/libs/classes/Mibew/Controller/Localization/TranslationController.php
index 73ee1bc4..36bf250f 100644
--- a/src/mibew/libs/classes/Mibew/Controller/Localization/TranslationController.php
+++ b/src/mibew/libs/classes/Mibew/Controller/Localization/TranslationController.php
@@ -190,6 +190,9 @@ class TranslationController extends AbstractController
save_message($target, $string['source'], $translation);
+ // Remove cached client side translations.
+ $this->getCache()->getItem('translation/js/' . $target)->clear();
+
$page['saved'] = true;
$page['title'] = getlocal("Translations");
$page = array_merge(
diff --git a/src/mibew/libs/classes/Mibew/Controller/Localization/TranslationImportController.php b/src/mibew/libs/classes/Mibew/Controller/Localization/TranslationImportController.php
index c936e454..a4131752 100644
--- a/src/mibew/libs/classes/Mibew/Controller/Localization/TranslationImportController.php
+++ b/src/mibew/libs/classes/Mibew/Controller/Localization/TranslationImportController.php
@@ -116,6 +116,9 @@ class TranslationImportController extends AbstractController
// Try to import new messages.
import_messages($target, $file->getRealPath(), $override);
+ // Remove cached client side translations.
+ $this->getCache()->getItem('translation/js/' . $target)->clear();
+
// The file is not needed any more. Remove it.
unlink($file->getRealPath());
} catch (\Exception $e) {
diff --git a/src/mibew/styles/dialogs/default/templates_src/server_side/chat.handlebars b/src/mibew/styles/dialogs/default/templates_src/server_side/chat.handlebars
index 8b354d49..ac492117 100644
--- a/src/mibew/styles/dialogs/default/templates_src/server_side/chat.handlebars
+++ b/src/mibew/styles/dialogs/default/templates_src/server_side/chat.handlebars
@@ -22,6 +22,9 @@
+
+
+
@@ -30,43 +33,11 @@
+
+
+
{{{additional_js}}}