54 votes

Rails: Internationalisation des chaînes 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 I8n 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 suis en train de penser que je pourrais toujours avoir l'application Rails servent les fichiers JS, mais qui semble assez brut. Existe-il des plugins pour ce faire? Aïe.

96voto

Ryan Montgomery Points 5153

Pourquoi pas quelque chose de simple comme:

 <script type="text/javascript">
  window.I18n = <%= I18n.backend.send(:translations).to_json.html_safe %>
</script>
 

Ensuite, dans JS, vous pouvez faire des choses comme:

 I18n["en-US"]["alpha"]["bravo"];
 

J'ai emballé le mien dans un assistant d'application.

 def current_translations
  @translations ||= I18n.backend.send(:translations)
  @translations[I18n.locale].with_indifferent_access
end
 

Ensuite, l'appel dans application.html.erb ressemble à ceci:

 <script type="text/javascript">
  window.I18n = <%= current_translations.to_json.html_safe %>
</script>
 

Cela vous permet d'éviter de connaître les paramètres régionaux actuels en JavaScript.

 I18n["alpha"]["bravo"];
 

Ou

 I18n.alpha.bravo;
 

19voto

Balibu est abandonné. Utilisez i18n-js: https://github.com/fnando/i18n-js

9voto

life_like_weeds Points 66

La solution de Ryan ci-dessus est parfaite, sauf que le système doit être initialisé s'il ne l'a pas déjà été.

 I18n.backend.send(:init_translations) unless I18n.backend.initialized?
# now you can safely dump the translations to json
 

2voto

sblom Points 15074

Babilu est un plugin Rails qui le fait pour vous.

1voto

macler Points 31

La solution de Ryan est géniale. Mais pour ne pas inclure le fichier entier, vous devez utiliser: @translations[I18n.locale].with_indifferent_access["alpha"] au lieu de I18n.backend.send(:translations)["alpha"]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X