Rails: l'Internationalisation des Chaînes de caractères Javascript?
Donc, nous avons déjà Rails 2.3.5 application qui ne prend pas en charge l'Internationalisation à tous. Maintenant, je suis très familier avec Rails I18n choses, mais nous avons BEAUCOUP de chaînes de sortie à l'intérieur de /javascripts/
. Je ne suis pas un grand fan de cette approche, mais malheureusement il est trop tard pour y remédier maintenant.
Comment pourrions-nous internationaliser les chaînes stockées dans les fichiers JS dans une application Rails? Les Rails n'a même pas de servir les fichiers JS...
Je pense que je pourrais toujours avoir l'application Rails servent les fichiers JS, mais qui semble assez brut. Existe-il des plugins pour ce faire?
Vous devez vous connecter pour publier un commentaire.
Pourquoi pas quelque chose de simple comme:
Ensuite en JS vous pouvez faire des choses comme:
J'ai enveloppé le mien dans une demande d'aide.
Puis mon appel dans mon application.html.erb ressemble à ceci:
Cela vous permet de vous éviter d'avoir à connaître les paramètres régionaux actuels en JavaScript.
Ou
t
méthode pour le rendre plus railsish. gist.github.com/6a3f1b3a4cf8de889e34t("products.price");
I18n.backend.send(:translations)
retourne la valeur de hachage de sorte que vous pourriez champ d'application les traductions avec quelque chose commeI18n.backend.send(:translations)["alpha"]
qui ne serait que la charge de la section dont vous avez besoin.en.yml
,en-US.yml
, etc... car si il ne trouve pas une chaîne de caractères dansen-US.yml
, il ne prendra pas en compte les clés définies dansen.yml
.@translations[I18n.locale].with_indifferent_access
à@translations[I18n.locale].with_indifferent_access['public']
. Merci!JSON.parse
autour de"#{j current_translations.to_json.html_safe}"
en HAML.window.I18n = #{I18n.t(:js_localizations).to_json }
Balibu est abandonné. Utiliser i18n-js: https://github.com/fnando/i18n-js
De Ryan solution ci-dessus est parfait, sauf le backend doit être initialisé si elle n'a pas déjà été.
Pour rails 3 applications que vous pourriez faire ceci:
Créer un i18n.js.erb fichier et l'ajouter à votre application.js. Et d'ajouter ce bout de code
dans le fichier.
J'ai aussi de la portée de mes traductions de ne pas avoir un énorme fichier javascript. Mon champ d'action est :javascript.
Espère que cela aide quelqu'un!
tmp/cache
chaque fois que vous changez de traductions dans yml.Pourquoi ne pas tout simplement dans votre fichier Javascript:
Pour que cela fonctionne, vous devez ajouter .erb à l'option Javascript de votre extension de fichier.
Vous pourriez aussi avoir besoin d'ajouter la ligne suivante au début de votre fichier Javascript si vous n'êtes pas à l'aide de ruby >= 2.0.
Voir le dernier commentaire de la accepté de répondre dans ce fil pour plus d'info: Problèmes d'encodage dans les fichiers javascript à l'aide de rails asset pipeline
Babilu est un Rails plugin qui fait cela pour vous.
Une autre option qui pourrait être utile:
En supposant que vous avez un modèle de Langue (slug) qui contient tous vos langues disponibles.
Il gère les cas, il y a un manque de traduction (il est remplacé par les paramètres régionaux par défaut de la version)
actifs/javascript/i18n.js.erb
views/layout/de l'application.html.erb
Dans vous code javascript, vous pouvez traduire comme ceci:
Espère que ça aide!
Ryan solution est brillant.
Mais afin de ne pas inclure la totalité du fichier, vous devez utiliser:
@translations[I18n.locale].with_indifferent_access["alpha"]
au lieu de
I18n.backend.send(:translations)["alpha"]
I18n-js est très bien fonctionné pour moi et je le recommande. Si vous utilisez son réécriture de la branche puis le plugin comprendra un
/assets/i18n/filtered.js
fichier qui génère exactement ce que @ryan-montgomery répondu, sans avoir rien à faire vous-même manuellement.De cette façon, vous pouvez utiliser les mêmes traductions sur le backend
avec des Rails aides
t(:key)
et à l'aide deI18n.t('key')
en Javascript sur le frontend.Pour des applications comme celui que vous avez décrit "qui ne prend pas en charge l'Internationalisation à tous" et "est-ce trop tard pour le corriger maintenant" j'ai écrit un très rapide approche: le plugin jQuery Rapide-i18n: https://github.com/katio/Quick-i18n démo (et comment l'utiliser): http://johannpaul.net/Quick-i18n/