Come posso ottenere stringhe tradotte in Drupal.locale.strings?


9

Quindi sto cercando di usare la funzione Drupal.t () in alcuni dei miei codici Javascript personalizzati (nel mio tema).

Come ottengo le stringhe di cui ho bisogno popolate nell'oggetto Drupal.locale.strings? Vedo alcune stringhe lì dentro, ma ovviamente l'intero database non può essere caricato. Qual è il modo migliore per aggiungerlo? Vorrei usare la funzione PHP t () in modo che le stringhe aggiunte possano essere modificate nell'interfaccia Translate.

Risposte:


8

Drupal gestisce il popolamento delle stringhe necessarie nell'oggetto javascript. Proprio come l'intera raccolta di stringhe non viene caricata su ogni pagina, solo le stringhe necessarie vengono aggiunte al JavaScript.

Credo che ciò avvenga attraversando i file di script prima che vengano effettivamente aggiunti alla pagina.

Quindi, se aggiungi Drupal.t('Some string');al tuo codice JavaScript, dovresti essere in grado di tradurlo nell'interfaccia di traduzione.


Bene, allora non sta succedendo. (l'attraversamento dello script per trovare le chiamate Drupal.t ()). Sto aggiungendo lo script tramite il file .info del tema (scripts [] = scripts / script.js). Forse devo aggiungere tramite drupal_add_js ()?
JonMcL

Hai ragione. Ho dovuto rintracciare per comprendere appieno, ma in effetti accade in modo automatico. In Drupal 7, la funzione è locale_js_alter () (in locale.module). Utilizza l'elenco completo dei file Javascript e analizza ognuno in _locale_parse_js_file (). Fai attenzione a assicurarti che file_get_contents () possa caricare il tuo file JS con il percorso fornito (cioè non iniziare il tuo percorso con un / se è nella cartella del tuo tema). Puoi usare drupal_add_js o l'impostazione degli script [] nel file .info del tuo tema. Certo, assicurati di cancellare le cache e tradurre la stringa! :)
JonMcL,

6

Ho appena incontrato questo stesso problema oggi e ho studiato un po 'di più. Chris sopra ha un buon commento, ma alla fine non è corretto. Non è necessario utilizzare Drupal.behaviors perché funzioni.

Come notato dallo stesso JonMcL nel suo ultimo commento, la funzione _locale_parse_js_file in locale.inc è responsabile dell'analisi dei pattern di Drupal.t ("somestring") a partire dalla riga 1493 (in 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);

È solo una funzione di analisi "stupida" che non si preoccupa della semantica e trova semplicemente tutte le istanze di Drupal.t ("qualcosa") in qualsiasi file che riceve.

Quello che potrebbe essere un gotcha comune è che devi avere l'intera stringa nel tuo codice sorgente nel modulo Drupal.t ("translateme"), perché (ovviamente) nessun javascript viene eseguito quando il file viene aperto tramite file_get_contents in php. Ciò significa che non puoi mai eseguire Drupal.t (in alcuni casi) e sperare che Drupal rilevi tutte le variabili javascript contenenti stringhe che passi a Drupal.t.

Se vuoi tradurre "donne" per un grafico e dare un contesto alla stringa, la sintassi sarebbe:

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

Inoltre, se hai installato drush, verifica che il tuo file js sia analizzato con il comando;

drush vget javascript_parsed

Quindi puoi pulire la cache con

drush cc all

... e ripeti il ​​comando vget sopra per verificare che l'elenco dei file già analizzati sia vuoto. In questo modo il tuo file verrà replicato alla prossima esecuzione (verifica anche quello).


1
Grazie per drush vget javascript_parsed! Un modo più rapido per forzare la ricostruzione dei file degli script di traduzione è semplicemente rimuovendo i file CSS e JS usando drush @sitealias cc css-js.
lmeurs,

0

Un paio di gotcha in cui mi sono imbattuto durante l'implementazione di JS multilingue in Drupal 7:

  1. Innanzitutto, assicurati che il tuo file JS non sia incluso in linea . A partire da Drupal 7.22, Drupal.locale.stringsnon sembra aggiornarsi automaticamente se stai incorporando file JavaScript in Drupal . L'interfaccia di traduzione ha comunque raccolto la stringa, aggiungendo alla mia confusione.

  2. In secondo luogo, assicurati di utilizzare Drupal.behaviors per collegare il tuo JS alla pagina. Le chiusure regolari di JS non attiveranno l'analisi "magica" delle Drupal.t()invocazioni da parte di Drupal . Questo è tecnicamente qualcosa che dovresti fare comunque;)

Da lì è davvero abbastanza indolore. Usa solo il Drupal.t()testo che vuoi tradurre, svuota la cache ogni volta che aggiorni il file e i tuoi traduttori dovrebbero vedere la nuova stringa nell'interfaccia in /admin/config/regional/translate/translate. È abbastanza bello quando lo fai funzionare.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.