Comment obtenir des chaînes traduites en Drupal.locale.strings?

9

J'essaie donc d'utiliser la fonction Drupal.t () dans certains de mes codes Javascript personnalisés (dans mon thème).

Comment puis-je obtenir les chaînes dont j'ai besoin dans l'objet Drupal.locale.strings? Je vois des chaînes là-dedans, mais bien sûr, la base de données entière ne peut pas être chargée. Quelle est la meilleure façon d'y ajouter? Je voudrais utiliser la fonction PHP t () pour que les chaînes ajoutées puissent être éditées dans l'interface Translate.

JonMcL
la source

Réponses:

8

Drupal gère le remplissage des chaînes nécessaires dans l'objet javascript. Tout comme la collection complète de chaînes n'est pas chargée sur chaque page, seules les chaînes nécessaires sont ajoutées au JavaScript.

Je crois que cela se fait en parcourant les fichiers de script avant qu'ils ne soient réellement ajoutés à la page.

Donc, si vous ajoutez Drupal.t('Some string');à votre code JavaScript, vous devriez être capable de traduire cela dans l'interface de traduction.

googletorp
la source
Eh bien, cela ne se produit pas. (la traversée du script pour trouver les appels Drupal.t ()). J'ajoute le script via le fichier .info du thème (scripts [] = scripts / script.js). Peut-être que je dois ajouter via drupal_add_js ()?
JonMcL
Vous avez raison. J'ai dû remonter pour bien comprendre, mais cela se produit en effet de manière automatique. Dans Drupal 7, la fonction est locale_js_alter () (dans locale.module). Il utilise la liste complète des fichiers Javascript et analyse chacun d'eux dans _locale_parse_js_file (). Veillez à vous assurer que file_get_contents () peut charger votre fichier JS avec le chemin d'accès fourni (c'est-à-dire ne commencez pas votre chemin par un / s'il est dans votre dossier de thème). Vous pouvez utiliser drupal_add_js ou le paramètre scripts [] dans le fichier .info de votre thème. Bien sûr, assurez-vous d'effacer les caches et de traduire la chaîne! :)
JonMcL
6

Je suis juste tombé sur ce même problème aujourd'hui et je l'ai étudié un peu plus. Chris ci-dessus a un bon commentaire, mais il est finalement incorrect. Vous n'avez pas besoin d'utiliser Drupal.behaviors pour que cela fonctionne.

Comme indiqué par JonMcL lui-même dans son dernier commentaire, la fonction _locale_parse_js_file dans locale.inc est responsable de l'analyse des modèles Drupal.t ("somestring") à partir de la ligne 1493 (dans 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);

C'est juste une fonction d'analyse "stupide" qui ne se soucie pas de la sémantique et trouve simplement toutes les instances de Drupal.t ("quelque chose") dans n'importe quel fichier qu'il reçoit.

Ce qui pourrait être un piège commun, c'est que vous devez avoir toute la chaîne dans votre code source sous la forme Drupal.t ("translateme"), car (évidemment) aucun javascript n'est exécuté lorsque le fichier est ouvert via file_get_contents en php. Cela signifie que vous ne pouvez jamais faire Drupal.t (une variable) et espérons que Drupal interceptera toutes les variables javascript contenant des chaînes que vous lancez sur Drupal.t.

Si vous souhaitez traduire "femmes" pour un graphique et donner un contexte à la chaîne, la syntaxe serait:

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

De plus, si vous avez installé drush, vérifiez que votre fichier js est analysé avec la commande;

drush vget javascript_parsed

Ensuite, vous pouvez nettoyer votre cache avec

drush cc all

... et répétez la commande vget ci-dessus pour vérifier que la liste des fichiers déjà analysés est vide. De cette façon, votre fichier sera analysé lors de la prochaine exécution (vérifiez également).

user19814
la source
1
Merci pour drush vget javascript_parsed! Un moyen plus rapide de forcer la reconstruction des fichiers de script de traduction consiste simplement à supprimer les fichiers CSS et JS à l'aide de drush @sitealias cc css-js.
lmeurs
0

Quelques accrochages que j'ai rencontrés lors de l'implémentation de JS multilingue dans Drupal 7:

  1. Tout d'abord, assurez-vous que votre fichier JS n'est pas inclus en ligne . Depuis Drupal 7.22, Drupal.locale.stringsne semble pas se mettre à jour automatiquement si vous insérez des fichiers JavaScript dans Drupal . L'interface de traduction a quand même repris la chaîne, ajoutant à ma confusion.

  2. Ensuite, assurez-vous que vous utilisez Drupal.behaviors pour attacher votre JS à la page. Les fermetures JS régulières ne déclencheront pas l'analyse "magique" par Drupal des Drupal.t()invocations. C'est techniquement quelque chose que vous devriez faire de toute façon;)

De là, c'est vraiment assez indolore. Utilisez simplement le Drupal.t()texte que vous souhaitez traduire, videz votre cache chaque fois que vous mettez à jour le fichier, et vos traducteurs devraient voir la nouvelle chaîne dans l'interface à /admin/config/regional/translate/translate. C'est assez agréable une fois que vous l'avez fait fonctionner.

Chris Ruppel
la source