Как получить переведенные строки в Drupal.locale.strings?

9

Поэтому я пытаюсь использовать функцию Drupal.t () в некоторых моих пользовательских кодах Javascript (в моей теме).

Как получить нужные мне строки в объекте Drupal.locale.strings? Я вижу некоторые строки там, но, конечно, не может быть загружена вся база данных. Какой лучший способ добавить к этому? Я хотел бы использовать функцию PHP t (), чтобы добавленные строки можно было редактировать в интерфейсе перевода.

JonMcL
источник

Ответы:

8

Drupal обрабатывает заполнение нужных строк в объекте javascript. Подобно тому, как вся коллекция строк загружается не на каждой странице, в JavaScript добавляются только необходимые строки.

Я считаю, что это делается путем обхода файлов сценариев до того, как они действительно добавляются на страницу.

Поэтому, если вы добавите Drupal.t('Some string');в свой код JavaScript, вы сможете перевести его в интерфейсе перевода.

googletorp
источник
Ну, тогда этого не происходит. (обход скрипта для поиска вызовов 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 или параметр scripts [] в файле .info вашей темы. Конечно, обязательно очистите кеш и переведите строку! :)
JonMcL
6

Просто столкнулся с этой же проблемой сегодня и исследовал ее немного больше. Крис выше имеет хороший комментарий, но в конечном итоге он неверен. Вам не нужно использовать Drupal.behaviors для его работы.

Как отметил сам JonMcL в своем последнем комментарии, функция _locale_parse_js_file в locale.inc отвечает за синтаксический анализ шаблонов Drupal.t ("somestring"), начиная со строки 1493 (в Drupal 7.22):

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 («что-то») в любом файле, который она получает.

Что может быть распространенным недостатком, так это то, что вам нужно иметь всю строку в вашем исходном коде в форме Drupal.t ("translateme"), потому что (очевидно) никакой javascript не выполняется, когда файл открывается через file_get_contents в php. Это означает, что вы никогда не сможете использовать Drupal.t (somevariable) и надеяться, что Drupal перехватит все строковые переменные javascript, которые вы выбросили в Drupal.t.

Если вы хотите перевести «женщины» для диаграммы и дать строку контекст, синтаксис будет следующим:

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

Также, если у вас установлен drush, проверьте, что ваш js-файл анализируется с помощью команды;

drush vget javascript_parsed

Затем вы можете очистить кэш

drush cc all

... и повторите приведенную выше команду vget, чтобы убедиться, что список уже проанализированных файлов пуст. Таким образом, ваш файл будет обработан при следующем запуске (проверьте это тоже).

user19814
источник
1
Спасибо за drush vget javascript_parsed! Более быстрый способ перестроить файлы сценариев переводов - просто удалить файлы CSS и JS с помощью drush @sitealias cc css-js.
lmeurs
0

Несколько ошибок, с которыми я столкнулся при реализации многоязычного JS в Drupal 7:

  1. Во-первых, убедитесь, что ваш файл JS не включен . Начиная с Drupal 7.22, Drupal.locale.stringsкажется, не обновляется автоматически, если вы встраиваете файлы JavaScript в Drupal . Интерфейс перевода все равно уловил строку, добавив к моему замешательству.

  2. Во-вторых, убедитесь, что вы используете Drupal.behaviors для прикрепления вашего JS к странице. Регулярное закрытие JS не вызовет "магический" анализ Drupal.t()вызовов Drupal . Технически это то, что вы должны делать в любом случае;)

Оттуда это действительно довольно безболезненно. Просто используйте Drupal.t()текст, который вы хотите перевести, очищайте кэш каждый раз, когда вы обновляете файл, и ваши переводчики должны видеть новую строку в интерфейсе по адресу /admin/config/regional/translate/translate. Это довольно приятно, как только вы работаете.

Крис Руппел
источник