javascript ソース ファイル内のメッセージを翻訳するための yii フレームワークのメカニズムはありますか。
たとえば、次のようにします。
yiic message config-message.php
すべての Yii::t() の翻訳 .php ファイルを生成できます。
同じメカニズムで .js ファイルを生成することは可能ですか。現在、翻訳ファイルによって返されるテーブルを使用して、javascript json データに含めています。
javascript ソース ファイル内のメッセージを翻訳するための yii フレームワークのメカニズムはありますか。
たとえば、次のようにします。
yiic message config-message.php
すべての Yii::t() の翻訳 .php ファイルを生成できます。
同じメカニズムで .js ファイルを生成することは可能ですか。現在、翻訳ファイルによって返されるテーブルを使用して、javascript json データに含めています。
これを処理する拡張機能を作成しました。
別の解決策は、Yii に翻訳されたメッセージを DOM に含めさせることです。これは後で JS コードによってアクセスされます。
それは本当に問題です。多言語サイトは常に問題です。YII は php コードの問題を解決します。しかし、js コードの問題はまだ残っています。
私はあまりエレガントなソリューションではありませんが、うまくいきます。コントローラー/コンポーネントを作成し、t() を使用してオンザフライでローカライズを行う js コードを生成します。
/js/get/?file=レイアウト内のいくつかの js ファイル:
もちろん、すべての JS を書き直す必要があります。小さなコード (cs()->RegisterScript) を使用する場合は、t() も使用します。
私はちょうどこの問題に遭遇しました.コントローラーを使用してオンザフライで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').'\';
');
}
?>
その問題に対処するための特定の方法はありません。
たとえば、'message-id' => 'translation' を使用して配列を含むファイルを生成し、正しいものを含めてから、alert($messages['itemDeleted']) などを実行できます。
別の方法として、javascript のビューを作成し、Yii::t() 関数を使用することもできます。
これが私のやり方です。
私のアプリケーションの小さなコンテキスト:
$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!')