yii框架中是否有任何机制来翻译javascript源文件中的消息。
例如:
yiic message config-message.php
我可以为所有Yii :: t()生成翻译.php文件。
是否可以使用相同的机制生成.js文件。目前我已经将我的javascript json数据包含在翻译文件返回的表中。
答案 0 :(得分:4)
另一种解决方案是让Yii在DOM中包含已翻译的消息,稍后将由您的JS代码访问,所以:
答案 1 :(得分:4)
我已经创建了一个应该处理此问题的扩展程序:
答案 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!')