Как бороться с интернационализацией JavaScript - PullRequest
5 голосов
/ 01 августа 2010

Есть ли какой-либо механизм в среде yii для перевода сообщений в исходных файлах javascript.

Например, с помощью:

yiic message config-message.php

Я могу генерировать файлы .php перевода для всех Yii :: t().

Возможно ли создавать файлы .js с таким же механизмом.В настоящее время я включаю в свой javascript данные json таблицу, возвращаемую файлом перевода.

Ответы [ 5 ]

4 голосов
/ 21 сентября 2012

Я создал расширение, которое должно обрабатывать это:

http://www.yiiframework.com/extension/jstrans/

4 голосов
/ 04 ноября 2011

Альтернативным решением было бы включение в Yii переведенных сообщений в DOM, к которым впоследствии будет обращаться ваш код JS, поэтому:

  1. Вам не нужно повторять код JS.
  2. Перевод централизован в среде PHP / Yii.
2 голосов
/ 13 августа 2012

Я только что наткнулся на эту проблему, и использование контроллера для генерации js-кода на лету не вариант, потому что вы будете тратить ресурсы из-за запуска дополнительного процесса PHP при каждом запросе. Это может быть проблемой на сайтах с высоким трафиком. Поэтому я реализовал другой подход: В .js сообщения хранятся в переменных, например

var MyJsClass = {
    lang:
    {
        foo: 'Foo',
        bar: 'Bar',
    },
    doSomething: function()
    {
        console.log(this.lang.foo);
    },  
};

в представлении вы добавляете перевод, если текущий язык отличается от sourceLanguage приложения:

<?php
$cs = Yii::app()->clientScript;
$cs->registerScriptFile($this->module->assetsUrl.'/js/myjsclass.js');
if (Yii::app()->sourceLanguage != Yii::app()->language) {
    $cs->registerScript('MyScriptID', '
        MyJsClass.lang.foo = \''.Yii::t('TranslationCategory', 'Translated Foo').'\';
        MyJsClass.lang.bar = \''.Yii::t('TranslationCategory', 'Translated Bar').'\';
    ');
}
?>
2 голосов
/ 17 июня 2011

Это действительно проблема. Многоязычные сайты - это всегда проблема. YII решить проблему для PHP-кода. Но проблема с кодом js остается на месте.

Я не очень элегантное решение, но оно работает. Создайте контроллер / компонент и сгенерируйте js-код с локализацией на лету, используя t ().

/ JS файл / получить /? = Некоторые-JS-файл в макете:

Конечно, каждый JS нужно переписать. Если использовать небольшие кусочки кода (cs () -> RegisterScript), я также использую t ().

1 голос
/ 02 августа 2010

Нет конкретного способа решить эту проблему.

Например, вы можете сгенерировать файл с массивом с 'message-id' => 'translation' и включить правильный, а затем делать такие вещи, как alert ($ messages ['itemDeleted']) или что-то в этом роде.

Альтернативой может быть создание представлений вашего javascript и использование для него функции Yii :: t ().

...