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>
6条答案
按热度按时间7rfyedvj1#
另一个解决方案是让Yii在DOM中包含翻译后的消息,稍后您的JS代码将访问这些消息,因此:
1.您不需要重复JS代码。
1.翻译集中在PHP/Yii框架中。
ukdjmx9f2#
我已经创建了一个扩展来处理这个问题:
http://www.yiiframework.com/extension/jstrans/
dtcbnfnu3#
这是一个真正的问题。多语言网站总是问题。YII解决了问题的php代码。但js代码的问题仍然存在。
我没有很优雅的解决方案,但它的作品。创建控制器/组件和生成js代码与本地化的飞行使用t()。
/js/get/?file=布局中的某个js文件:
当然,每一个JS都需要重写。如果使用小段代码(cs()-〉RegisterScript),我也会使用t()。
nlejzf6q4#
我只是偶然发现了这个问题,使用控制器来动态生成js代码并不是一个选择,因为你会浪费资源,因为在每个请求上启动一个额外的PHP进程。这在高流量的站点上可能是一个问题。所以我实现了一个不同的方法:在.js中,消息存储在变量中,例如
如果当前语言与应用程序的源语言不同,则在视图中添加翻译:
wgxvkvu95#
没有具体的办法来处理这个问题。
例如,您可以在'message-id' =〉'translation'中生成带有数组的文件,并包含正确的数组,然后执行alert($messages ['itemDeleted'])之类的操作。
另一种方法是创建javascript的视图,并在其上使用Yii::t()函数。
qco9c6ql6#
这是我的方法。
我的应用程序的小背景:
$availableLanguages
变量获得。$langFiles
的变量,我可以在控制器中更改它。现在我可以使用和Yii2中相同的语法直接把翻译翻译到我的脚本中。
t('app/quotes', 'Hello World. Captain speaking!')