回答:
Drupalは、必要な文字列をJavaScriptオブジェクトに入力します。文字列のコレクション全体がすべてのページに読み込まれるのではなく、必要な文字列だけがJavaScriptに追加されます。
これは、実際にページに追加される前にスクリプトファイルをたどることによって行われると思います。
そのDrupal.t('Some string');
ため、JavaScriptコードに追加すると、それを変換インターフェースで変換できるはずです。
今日同じ問題に遭遇し、もう少し調査しました。上記のクリスは良いコメントをしていますが、最終的には正しくありません。Drupal.behaviorsを使用する必要はありません。
JonMcL自身の最後のコメントで述べたように、locale.incの関数_locale_parse_js_fileは、行1493(Drupal 7.22)から始まるDrupal.t( "somestring")パターンの解析を担当します。
preg_match_all('~
[^\w]Drupal\s*\.\s*t\s* # match "Drupal.t" with whitespace
\(\s* # match "(" argument list start
(' . LOCALE_JS_STRING . ')\s* # capture string argument
(?:,\s*' . LOCALE_JS_OBJECT . '\s* # optionally capture str args
(?:,\s*' . LOCALE_JS_OBJECT_CONTEXT . '\s*) # optionally capture context
?)? # close optional args
[,\)] # match ")" or "," to finish
~sx', $file, $t_matches);
これは、セマンティクスを気にせず、受け取ったファイル内のDrupal.t( "something")のすべてのインスタンスを単に見つける、「ダム」の解析関数です。
よくある落とし穴は、ソースコードの文字列全体をDrupal.t( "translateme")フォームに含める必要があることです。これは、(明らかに)ファイルがphpのfile_get_contentsで開かれるときにJavaScriptが実行されないためです。つまり、Drupal.t(somevariable)を実行することはできず、Drupal.tでスローする文字列を含むすべてのJavaScript変数をDrupalがキャッチできることを期待しています。
チャートの「女性」を翻訳して文字列にコンテキストを与える場合、構文は次のようになります。
Drupal.t("women", {}, {context: "charts"}
また、drushがインストールされている場合は、jsファイルがコマンドで解析されていることを確認してください。
drush vget javascript_parsed
次に、あなたはあなたのキャッシュをきれいにすることができます
drush cc all
...上記のvgetコマンドを繰り返して、解析済みのファイルのリストが空であることを確認します。このようにして、ファイルは次回の実行で再解析されます(これも確認してください)。
drush vget javascript_parsed
!翻訳スクリプトファイルを強制的に再構築するより速い方法は、を使用してCSSファイルとJSファイルを削除することですdrush @sitealias cc css-js
。
Drupal 7で多言語JSを実装しているときに遭遇したいくつかの落とし穴:
まず、JSファイルがインラインに含まれていないことを確認します。DrupalでJavaScriptファイルをインライン化しているDrupal.locale.strings
場合、Drupal 7.22以降、は自動的に更新されないようです。とにかく、翻訳インターフェースが文字列を拾い上げ、混乱を招きました。
次に、JSをページに添付するためにDrupal.behaviorsを使用していることを確認します。通常のJSクロージャーは、DrupalのDrupal.t()
呼び出しの「魔法の」解析をトリガーしません。これは技術的にはとにかくやるべきことです;)
そこからはそれは本当にかなり痛くないです。Drupal.t()
翻訳したいテキストの周りだけを使用し、ファイルを更新するたびにキャッシュをクリアすると、翻訳者はのインターフェースで新しい文字列を確認できます/admin/config/regional/translate/translate
。あなたがそれを働かせたら、それはとてもいいです。