web-dev-qa-db-ja.com

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

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

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

9
JonMcL

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

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

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

8
googletorp

今日同じ問題に遭遇し、もう少し調査しました。上記のクリスは良いコメントをしていますが、最終的には正しくありません。 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がDrupal.tでスローするすべての文字列を含むjavascript変数をキャッチすることを望みます。

チャートの「女性」を翻訳して文字列にコンテキストを与える場合、構文は次のようになります。

Drupal.t("women", {}, {context: "charts"}

また、drushがインストールされている場合は、jsファイルがコマンドで解析されていることを確認してください。

drush vget javascript_parsed

次に、あなたはあなたのキャッシュをきれいにすることができます

drush cc all

...上記のvgetコマンドを繰り返して、解析済みのファイルのリストが空であることを確認します。このようにして、ファイルは次回の実行で再解析されます(これも確認してください)。

6
user19814

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

  1. まず、JSファイルがインラインに含まれていないことを確認してください。 Drupal 7.22以降、_Drupal.locale.strings_は DrupalでのJavaScriptファイルのインライン化 の場合、自動的に更新されないようです。とにかく文字列、私の混乱を追加します。

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

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

0
Chris Ruppel