翻訳された文字列をDrupal.locale.stringsに変換するにはどうすればよいですか?


9

したがって、(テーマ内の)カスタムJavaScriptコードの一部でDrupal.t()関数を使用しようとしています。

Drupal.locale.stringsオブジェクトに必要な文字列を取得するにはどうすればよいですか?そこにいくつかの文字列が表示されますが、もちろんデータベース全体をロードできません。それに追加する最良の方法は何ですか?追加した文字列を翻訳インターフェースで編集できるように、PHPのt()関数を使用したいと思います。

回答:


8

Drupalは、必要な文字列をJavaScriptオブジェクトに入力します。文字列のコレクション全体がすべてのページに読み込まれるのではなく、必要な文字列だけがJavaScriptに追加されます。

これは、実際にページに追加される前にスクリプトファイルをたどることによって行われると思います。

そのDrupal.t('Some string');ため、JavaScriptコードに追加すると、それを変換インターフェースで変換できるはずです。


さて、それは起こっていません。(Drupal.t()呼び出しを見つけるためのスクリプトの走査)。テーマの.infoファイルを介してスクリプトを追加しています(scripts [] = scripts / script.js)。多分私はdrupal_add_js()経由で追加する必要がありますか?
JonMcL

あなたは正しいです。私は完全に理解するためにトレースする必要がありましたが、それは確かに自動的に行われます。Drupal 7では、関数はlocale_js_alter()(locale.module内)です。Javascriptファイルの完全なリストを使用し、_locale_parse_js_file()で各ファイルを解析します。file_get_contents()が提供されたパスを使用してJSファイルをロードできることを確認してください(つまり、テーマフォルダー内にある場合は、/でパスを開始しないでください)。drupal_add_jsまたはテーマの.infoファイルのscripts []設定を使用できます。もちろん、キャッシュをクリアして文字列を翻訳してください!:)
JonMcL

6

今日同じ問題に遭遇し、もう少し調査しました。上記のクリスは良いコメントをしていますが、最終的には正しくありません。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コマンドを繰り返して、解析済みのファイルのリストが空であることを確認します。このようにして、ファイルは次回の実行で再解析されます(これも確認してください)。


1
ありがとうdrush vget javascript_parsed!翻訳スクリプトファイルを強制的に再構築するより速い方法は、を使用してCSSファイルとJSファイルを削除することですdrush @sitealias cc css-js
lmeurs 14

0

Drupal 7で多言語JSを実装しているときに遭遇したいくつかの落とし穴:

  1. まず、JSファイルがインラインに含まれていないことを確認します。DrupalでJavaScriptファイルをインライン化しているDrupal.locale.strings場合、Drupal 7.22以降、は自動的に更新されないようです。とにかく、翻訳インターフェースが文字列を拾い上げ、混乱を招きました。

  2. 次に、JSをページに添付するためにDrupal.behaviorsを使用していることを確認します。通常のJSクロージャーは、DrupalのDrupal.t()呼び出しの「魔法の」解析をトリガーしません。これは技術的にはとにかくやるべきことです;)

そこからはそれは本当にかなり痛くないです。Drupal.t()翻訳したいテキストの周りだけを使用し、ファイルを更新するたびにキャッシュをクリアすると、翻訳者はのインターフェースで新しい文字列を確認できます/admin/config/regional/translate/translate。あなたがそれを働かせたら、それはとてもいいです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.