Jak przekonwertować ciągi znaków na Drupal.locale.strings?

9

Próbuję więc użyć funkcji Drupal.t () w niektórych niestandardowych kodach JavaScript (w moim motywie).

Jak uzyskać ciągi, które muszę wypełnić w obiekcie Drupal.locale.strings? Widzę tam jakieś ciągi, ale oczywiście nie można załadować całej bazy danych. Jak najlepiej to dodać? Chciałbym użyć funkcji PHP t (), aby dodane łańcuchy mogły być edytowane w interfejsie Tłumacz.

JonMcL
źródło

Odpowiedzi:

8

Drupal obsługuje wypełnianie potrzebnych ciągów w obiekcie javascript. Podobnie jak cała kolekcja ciągów nie jest ładowana na każdej stronie, tylko potrzebne ciągi są dodawane do JavaScript.

Wierzę, że dzieje się to poprzez przeglądanie plików skryptów, zanim zostaną one faktycznie dodane do strony.

Więc jeśli dodasz Drupal.t('Some string');do kodu JavaScript, powinieneś być w stanie przetłumaczyć to w interfejsie tłumaczenia.

googletorp
źródło
Więc to się nie dzieje. (przejście skryptu w celu znalezienia wywołań Drupal.t ()). Dodam skrypt za pomocą pliku .info kompozycji (scripts [] = scripts / script.js). Może muszę dodać za pomocą drupal_add_js ()?
JonMcL
Masz rację. Musiałem prześledzić, aby w pełni zrozumieć, ale tak naprawdę dzieje się to automatycznie. W Drupal 7 funkcją jest locale_js_alter () (in locale.module). Wykorzystuje pełną listę plików JavaScript i analizuje każdy z nich w _locale_parse_js_file (). Uważaj, aby upewnić się, że file_get_contents () może załadować plik JS z podaną ścieżką (tzn. Nie rozpoczynaj ścieżki od / jeśli znajduje się w folderze motywu). Możesz użyć drupal_add_js lub ustawienia skryptów [] w pliku .info twojego motywu. Oczywiście pamiętaj o wyczyszczeniu pamięci podręcznej i przetłumaczeniu łańcucha! :)
JonMcL
6

Właśnie natknąłem się dziś na ten sam problem i przestudiowałem go nieco bardziej. Chris powyżej ma dobry komentarz, ale ostatecznie jest niepoprawny. Nie musisz używać Drupal.behaviors, aby działało.

Jak zauważył sam JonMcL w swoim ostatnim komentarzu, funkcja _locale_parse_js_file w locale.inc jest odpowiedzialna za analizowanie wzorców Drupal.t („somestring”) począwszy od wiersza 1493 (w 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);

Jest to po prostu „głupia” funkcja parsująca, która nie dba o semantykę i po prostu znajduje wszystkie wystąpienia Drupal.t („coś”) w każdym otrzymywanym pliku.

To, co może być powszechną gotcha, to to, że musisz mieć cały ciąg w kodzie źródłowym w formie Drupal.t („translateme”), ponieważ (oczywiście) żaden skrypt javascript nie jest wykonywany, gdy plik jest otwierany przez file_get_contents w php. Oznacza to, że nigdy nie możesz zrobić Drupal.t (gdziekolwiek) i mam nadzieję, że Drupal wyłapie wszystkie zmienne javascript zawierające łańcuchy, które rzucisz w Drupal.t.

Jeśli chcesz przetłumaczyć „kobiety” dla wykresu i nadać ciągowi kontekst, składnia wyglądałaby następująco:

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

Ponadto, jeśli masz zainstalowany Drush, sprawdź, czy plik js jest analizowany za pomocą polecenia;

drush vget javascript_parsed

Następnie możesz wyczyścić pamięć podręczną

drush cc all

... i powtórz powyższe polecenie vget, aby sprawdzić, czy lista już przeanalizowanych plików jest pusta. W ten sposób twój plik zostanie ponownie przeanalizowany przy następnym uruchomieniu (to też sprawdź).

użytkownik19814
źródło
1
Dzięki za drush vget javascript_parsed! Szybszym sposobem wymuszenia odbudowania plików skryptów tłumaczeń jest usunięcie plików CSS i JS przy użyciu drush @sitealias cc css-js.
lmeurs
0

Kilka problemów, na które natknąłem się podczas wdrażania wielojęzycznego JS w Drupal 7:

  1. Najpierw upewnij się, że plik JS nie jest dołączany bezpośrednio . Począwszy od Drupal 7.22, Drupal.locale.stringswydaje się , że nie aktualizuje się automatycznie, jeśli wstawiasz pliki JavaScript w Drupal . Interfejs tłumaczenia i tak podniósł ciąg znaków, co jeszcze bardziej mnie zamieszało.

  2. Po drugie, upewnij się, że używasz Drupal.behaviors, aby dołączyć JS do strony. Regularne zamykanie JS nie uruchomi „magicznej” analizy Drupal.t()wywołań Drupala . To jest technicznie coś, co powinieneś robić;)

Stamtąd naprawdę jest całkiem bezbolesne. Po prostu użyj Drupal.t()wokół tekstu, który chcesz przetłumaczyć, wyczyść pamięć podręczną przy każdej aktualizacji pliku, a tłumacze powinni zobaczyć nowy ciąg znaków w interfejsie na /admin/config/regional/translate/translate. To całkiem miłe, kiedy już zaczniesz działać.

Chris Ruppel
źródło