web-dev-qa-db-fra.com

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

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).

9
JonMcL

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 pouvoir traduire cela dans l'interface de traduction.

8
googletorp

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érer Drupal va attraper toutes les variables javascript contenant des chaînes que vous lancez sur Drupal.t.

Si vous voulez 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é à nouveau lors de la prochaine exécution (vérifiez également).

6
user19814

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 . À partir de Drupal 7.22, Drupal.locale.strings Ne semble pas se mettre à jour automatiquement si vous êtes en insérant des fichiers JavaScript dans Drupal . L'interface de traduction est toujours sélectionnée la chaîne de toute façon, 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 invocations de Drupal.t(). C'est techniquement quelque chose que vous devriez faire de toute façon;)

De là, c'est vraiment assez indolore. Utilisez simplement Drupal.t() autour du texte que vous voulez 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.

0
Chris Ruppel