6

javascript ソース ファイル内のメッセージを翻訳するための yii フレームワークのメカニズムはありますか。

たとえば、次のようにします。

yiic message config-message.php

すべての Yii::t() の翻訳 .php ファイルを生成できます。

同じメカニズムで .js ファイルを生成することは可能ですか。現在、翻訳ファイルによって返されるテーブルを使用して、javascript json データに含めています。

4

6 に答える 6

4

これを処理する拡張機能を作成しました。

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

于 2012-09-21T12:36:17.317 に答える
4

別の解決策は、Yii に翻訳されたメッセージを DOM に含めさせることです。これは後で JS コードによってアクセスされます。

  1. JS コードを繰り返す必要はありません。
  2. 翻訳は、PHP/Yii フレームワークに集中しています。
于 2011-11-03T22:33:31.630 に答える
2

それは本当に問題です。多言語サイトは常に問題です。YII は php コードの問題を解決します。しかし、js コードの問題はまだ残っています。

私はあまりエレガントなソリューションではありませんが、うまくいきます。コントローラー/コンポーネントを作成し、t() を使用してオンザフライでローカライズを行う js コードを生成します。

/js/get/?file=レイアウト内のいくつかの js ファイル:

もちろん、すべての JS を書き直す必要があります。小さなコード (cs()->RegisterScript) を使用する場合は、t() も使用します。

于 2011-06-17T01:10:10.527 に答える
2

私はちょうどこの問題に遭遇しました.コントローラーを使用してオンザフライで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').'\';
    ');
}
?>
于 2012-08-13T06:47:31.400 に答える
1

その問題に対処するための特定の方法はありません。

たとえば、'message-id' => 'translation' を使用して配列を含むファイルを生成し、正しいものを含めてから、alert($messages['itemDeleted']) などを実行できます。

別の方法として、javascript のビューを作成し、Yii::t() 関数を使用することもできます。

于 2010-08-02T11:53:57.240 に答える
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!')

于 2021-04-05T20:28:09.507 に答える