¿Cómo obtengo cadenas traducidas en Drupal.locale.strings?

9

Así que estoy tratando de usar la función Drupal.t () en algunos de mis códigos JavaScript personalizados (en mi tema).

¿Cómo consigo que se completen las cadenas que necesito en el objeto Drupal.locale.strings? Veo algunas cadenas allí, pero, por supuesto, no se puede cargar toda la base de datos. ¿Cuál es la mejor manera de agregarle? Me gustaría usar la función t () de PHP para que las cadenas agregadas se puedan editar en la interfaz de traducción.

JonMcL
fuente

Respuestas:

8

Drupal maneja las cadenas necesarias en el objeto javascript. Al igual que la colección completa de cadenas no se carga en cada página, solo las cadenas necesarias se agregan al JavaScript.

Creo que esto se hace atravesando los archivos de script antes de que realmente se agreguen a la página.

Entonces, si agrega Drupal.t('Some string');a su código JavaScript, debería poder traducirlo en la interfaz de traducción.

googletorp
fuente
Bueno, entonces no está sucediendo. (el recorrido del script para encontrar las llamadas a Drupal.t ()). Estoy agregando el script a través del archivo .info del tema (scripts [] = scripts / script.js). Tal vez tengo que agregar a través de drupal_add_js ()?
JonMcL
Estás en lo correcto. Tuve que rastrear para obtener una comprensión completa, pero de hecho sucede de forma automática. En Drupal 7, la función es locale_js_alter () (en locale.module). Utiliza la lista completa de archivos Javascript y analiza cada uno de ellos en _locale_parse_js_file (). Tenga cuidado de asegurarse de que file_get_contents () pueda cargar su archivo JS con la ruta provista (es decir, no comience su ruta con un / si está en su carpeta de temas). Puede usar drupal_add_js o la configuración de scripts [] en el archivo .info de su tema. ¡Por supuesto, asegúrese de borrar los cachés y traducir la cadena! :)
JonMcL
6

Hoy me encontré con este mismo problema y lo investigué un poco más. Chris arriba tiene un buen comentario, pero en última instancia es incorrecto. No necesita usar Drupal.behaviors para que funcione.

Como señaló el propio JonMcL en su último comentario, la función _locale_parse_js_file en locale.inc es responsable del análisis de los patrones Drupal.t ("somestring") a partir de la fila 1493 (en 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);

Es solo una función de análisis "tonta" que no se preocupa por la semántica y simplemente encuentra todas las instancias de Drupal.t ("algo") en cualquier archivo que recibe.

Lo que podría ser un problema común es que necesita tener toda la cadena en su código fuente en la forma Drupal.t ("translateme"), porque (obviamente) no se ejecuta javascript cuando el archivo se abre a través de file_get_contents en php. Eso significa que nunca puedes hacer Drupal.t (alguna variable) y esperar que Drupal capture todas las variables de JavaScript que contienen cadenas que arrojas a Drupal.t.

Si desea traducir "mujeres" para un gráfico y darle un contexto a la cadena, la sintaxis sería:

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

Además, si tiene drush instalado, verifique que su archivo js se analice con el comando;

drush vget javascript_parsed

Entonces puedes limpiar tu caché con

drush cc all

... y repita el comando vget anterior para verificar que la lista de archivos ya analizados esté vacía. De esta manera, su archivo se analizará la próxima vez (verifique eso también).

usuario19814
fuente
1
Gracias por drush vget javascript_parsed! Una forma más rápida de forzar la reconstrucción de los archivos de script de traducción es simplemente mediante la eliminación de archivos CSS y JS drush @sitealias cc css-js.
lmeurs
0

Un par de problemas con los que me he encontrado al implementar JS multilingüe en Drupal 7:

  1. Primero, asegúrese de que su archivo JS no se incluya en línea . A partir de Drupal 7.22, Drupal.locale.stringsno parece actualizarse automáticamente si está incorporando archivos JavaScript en Drupal . La interfaz de traducción todavía recogió la cadena de todos modos, lo que aumentó mi confusión.

  2. En segundo lugar, asegúrese de estar usando Drupal.behaviors para adjuntar su JS a la página. Los cierres regulares de JS no activarán el análisis "mágico" de Drupal.t()invocaciones de Drupal . Esto es técnicamente algo que deberías estar haciendo de todos modos;)

A partir de ahí, realmente es bastante indoloro. Simplemente use Drupal.t()alrededor del texto que desea traducir, borre su caché cada vez que actualice el archivo, y sus traductores deberían ver la nueva cadena en la interfaz en /admin/config/regional/translate/translate. Es bastante agradable una vez que lo haces funcionar.

Chris Ruppel
fuente