Як отримати перекладені рядки в Drupal.locale.strings?


9

Тому я намагаюся використовувати функцію Drupal.t () у деяких моїх спеціальних кодах Javascript (у моїй темі).

Як отримати рядки, які мені потрібно заповнити в об’єкт Drupal.locale.strings? Я бачу деякі рядки там, але, звичайно, не можна завантажити всю базу даних. Який найкращий спосіб додати його? Я хотів би використовувати функцію PHP t (), щоб додані рядки можна редагувати в інтерфейсі Translate.

Відповіді:


8

Drupal обробляє заповнення потрібних рядків в об'єкт javascript. Так само, як і вся колекція рядків не завантажується на кожну сторінку, лише необхідні рядки додаються до JavaScript.

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

Отже, якщо ви додасте Drupal.t('Some string');до свого коду JavaScript, ви повинні мати можливість перекласти це в інтерфейс перекладу.


Ну тоді це не відбувається. (обхід сценарію для пошуку викликів Drupal.t (). Я додаю сценарій через .info файл теми (script [] = script / 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 вашої теми. Звичайно, обов’язково очистіть кеші та перекладіть рядок! :)
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 ("щось") у будь-якому отриманому файлі.

Що може бути загальним gotcha, це те, що вам потрібно мати всю рядок у вихідному коді у формі Drupal.t ("translateme"), тому що (очевидно) жоден JavaScript не виконується, коли файл відкривається через file_get_contents у php. Це означає, що ви ніколи не можете робити Drupal.t (кілька змінних) і сподіваєтесь, що Drupal знайде всі змінні JavaScript-змінні, які ви кинете на Drupal.t.

Якщо ви хочете перекласти "жінки" для діаграми і дати рядку контекст, синтаксис буде таким:

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

Крім того, якщо у вас встановлено барабан, перевірте, чи ваш файл js розібраний за допомогою команди;

drush vget javascript_parsed

Тоді ви можете очистити кеш

drush cc all

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


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.t()текст, який потрібно перекласти, очистіть кеш-пам'ять кожного разу, коли ви оновлюєте файл, і ваші перекладачі повинні побачити нову рядок в інтерфейсі на /admin/config/regional/translate/translate. Це дуже приємно, як тільки ви працюєте.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.