如何处理javascript国际化

时间:2010-08-01 17:36:27

标签: javascript internationalization yii

yii框架中是否有任何机制来翻译javascript源文件中的消息。

例如:

yiic message config-message.php

我可以为所有Yii :: t()生成翻译.php文件。

是否可以使用相同的机制生成.js文件。目前我已经将我的javascript json数据包含在翻译文件返回的表中。

6 个答案:

答案 0 :(得分:4)

另一种解决方案是让Yii在DOM中包含已翻译的消息,稍后将由您的JS代码访问,所以:

  1. 您不需要重复JS代码。
  2. 翻译集中在PHP / Yii框架中。

答案 1 :(得分:4)

我已经创建了一个应该处理此问题的扩展程序:

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

答案 2 :(得分:2)

这是一个真正的问题。多语言网站始终存在问题。 YII解决了php代码的问题。但是js代码问题仍然存在。

我不是很优雅的解决方案,但它的确有效。使用t()创建控制器/组件并生成具有本地化的js代码。

/ JS / GET /?文件=一些-JS-文件 在布局中:

当然,每个JS都需要重写。如果使用小块代码(cs() - > RegisterScript)我也使用t()。

答案 3 :(得分:2)

我只是偶然发现了这个问题并且使用控制器动态生成js代码不是一种选择,因为你会因为在每个请求上启动一个额外的PHP进程而浪费资源。这可能是高流量站点上的问题。 所以我实施了一种不同的方法: 在.js中,消息存储在变量中,例如

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

如果当前语言与App的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').'\';
    ');
}
?>

答案 4 :(得分:1)

没有具体的方法来处理这个问题。

例如,您可以使用'message-id'=&gt;生成带有数组的文件'翻译'并包含正确的内容然后执行诸如alert($ messages ['itemDeleted'])之类的内容。

另一种方法是创建javascript视图并在其上使用Yii :: t()函数。

答案 5 :(得分:0)

这是我的做法。

我的应用程序的小上下文:

  • 可用语言因一节而异,可通过 $availableLanguages 变量获取。
  • 我创建了非常小的消息文件,以便能够在没有任何安全问题的情况下公开其中的一些。然后我创建了一个名为 $langFiles 的变量,我可以在控制器中更改该变量。
use yii\helpers\Json;
use yii\helpers\FileHelper;

$files = FileHelper::findFiles(\Yii::getAlias('@app/messages/'));
$translations = [];

// Loop into all the available languages
foreach($availableLanguages as $lang) {
    $translations[$lang] = [];

    // Get all the available message files
    foreach ($langFiles as $file) {

        // Import the php file if it exists
        $filePath = \Yii::getAlias("@app/messages/{$lang}/{$file}.php");
        $key = "app/{$file}";

        $translations[$lang][$key] = file_exists($filePath) ? include($filePath) : [];

        // Replace '.' by '_' to use the get method
        foreach($translations[$lang][$key] as $msg => $value) {
            unset($translations[$lang][$key][$msg]);

            $msg = str_replace('.', '_', $msg);
            $translations[$lang][$key][$msg] = $value;
        }
    }
}
?>

<script>
var translations = <?= Json::encode($translations) ?>;
var lang = document.getElementsByTagName('html')[0].getAttribute('lang');

function t(category, message) {
    // Get method thats works exactly like lodash
    const get = (value, path, defaultValue) => {
        return String(path).split('.').reduce((acc, v) => {
            try {
                acc = acc[v];

                if(typeof acc === 'undefined') {
                    throw "Undefined";
                }
            } catch (e) {
                return defaultValue;
            }
            return acc;
        }, value)
    }

    // Replace '.' by '_' to use the get method.
    var key = message.replace('.', '_');

    // If the translation is not found, return the original message
    console.log(lang+'.'+category+'.'+key, message);
    return get(translations, lang+'.'+category+'.'+key, message);
}
</script>

我现在可以使用与 Yii2 中相同的语法将翻译直接放入我的脚本中。示例:

t('app/quotes', 'Hello World. Captain speaking!')