yii 如何处理javascript国际化

idv4meu8  于 2022-11-09  发布在  Java
关注(0)|答案(6)|浏览(205)

yii框架中有没有什么机制来翻译javascript源文件中的消息。
例如:

yiic message config-message.php

我可以为所有Yii::t()生成翻译.php文件。
有没有可能用同样的机制生成.js文件。目前我正在把翻译文件返回的表包含到我的javascript json数据中。

7rfyedvj

7rfyedvj1#

另一个解决方案是让Yii在DOM中包含翻译后的消息,稍后您的JS代码将访问这些消息,因此:
1.您不需要重复JS代码。
1.翻译集中在PHP/Yii框架中。

ukdjmx9f

ukdjmx9f2#

我已经创建了一个扩展来处理这个问题:
http://www.yiiframework.com/extension/jstrans/

dtcbnfnu

dtcbnfnu3#

这是一个真正的问题。多语言网站总是问题。YII解决了问题的php代码。但js代码的问题仍然存在。
我没有很优雅的解决方案,但它的作品。创建控制器/组件和生成js代码与本地化的飞行使用t()。
/js/get/?file=布局中的某个js文件:
当然,每一个JS都需要重写。如果使用小段代码(cs()-〉RegisterScript),我也会使用t()。

nlejzf6q

nlejzf6q4#

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

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

如果当前语言与应用程序的源语言不同,则在视图中添加翻译:

<?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').'\';
    ');
}
?>
wgxvkvu9

wgxvkvu95#

没有具体的办法来处理这个问题。
例如,您可以在'message-id' =〉'translation'中生成带有数组的文件,并包含正确的数组,然后执行alert($messages ['itemDeleted'])之类的操作。
另一种方法是创建javascript的视图,并在其上使用Yii::t()函数。

qco9c6ql

qco9c6ql6#

这是我的方法。
我的应用程序的小背景:

  • 可用的语言因节而异,可通过$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!')

相关问题