Rails: internationalisation des chaînes Javascript?
donc, nous avons une application Rail 2.3.5 existante qui ne supporte pas du tout L'internationalisation. Je connais bien les Rails i18n, mais nous avons beaucoup de chaînes de sortie dans /javascripts/
. Je ne suis pas un grand fan de cette approche, mais malheureusement il est trop tard pour y remédier maintenant.
comment internationaliser les chaînes stockées dans les fichiers JS dans une application Rails? Les Rails ne servent même pas les fichiers JS...
je pense que je pourrais toujours avoir L'application Rails fournit les fichiers JS, mais cela semble assez grossier. Y a-t-il des plugins pour faire ça?
10 réponses
pourquoi pas quelque chose de simple comme:
<script type="text/javascript">
window.I18n = <%= I18n.backend.send(:translations).to_json.html_safe %>
</script>
alors dans JS vous pouvez faire des choses comme:
I18n["en-US"]["alpha"]["bravo"];
j'ai enveloppé le mien dans un assistant d'application.
def current_translations
@translations ||= I18n.backend.send(:translations)
@translations[I18n.locale].with_indifferent_access
end
puis mon appel dans ma candidature.HTML.erb ressemble à ceci:
<script type="text/javascript">
window.I18n = <%= current_translations.to_json.html_safe %>
</script>
cela vous permet d'éviter d'avoir à connaître la localisation actuelle en JavaScript.
I18n["alpha"]["bravo"];
ou
I18n.alpha.bravo;
Balibu est abandonné. Use i18n-js: https://github.com/fnando/i18n-js
la solution de Ryan ci-dessus est parfaite, sauf que l'arrière-plan 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
pour les applications rails 3 vous pouvez faire ceci:
créer un i18n.js.erb fichier et l'ajouter à votre application.js. Et ajouter ce morceau de code dans le fichier.
<%
@translator = I18n.backend
@translator.load_translations
@translations ||= @translator.send(:translations)[I18n.locale][:javascript]
%>
window.I18n = <%= @translations.to_json.html_safe %>
j'évalue aussi mes traductions à ne pas avoir un énorme fichier javascript. Ma portée est :javascript.
Espère que cela aide quelqu'un!
pourquoi pas simplement ceci dans votre fichier Javascript:
var a_message = "<%= I18n.t 'my_key' %>"
Pour que cela fonctionne, vous devez ajouter .erb à l'extension de votre fichier Javascript.
vous pourriez aussi avoir besoin d'ajouter la ligne suivante en haut de votre fichier Javascript si vous n'utilisez pas ruby >= 2.0.
<%# encoding: utf-8 %>
voir le dernier commentaire de la réponse acceptée dans ce thread pour plus d'informations: Encoding issues in javascript files using rails asset pipeline
une autre option qui pourrait être utile:
suppose que vous avez un langage modèle (slug) qui contient toutes vos langues disponibles. Il gère les cas où il y a une traduction manquante (elle est remplacée par la version locale par défaut)
assets/javascript/i18n.js.erb
<%
@translator = I18n.backend
@translator.load_translations
translations = {}
Language.all.each do |l|
translations[l.slug] = @translator.send(:translations)[l.slug.to_sym]
end
@translations = translations
%>
window.I18n = <%= @translations.to_json.html_safe %>
window.I18n.t = function(key){
if(window.I18n[current_locale]){
el = eval("I18n['"+current_locale+"']." + key);
}
if(window.I18n[default_locale] && typeof(el) == 'undefined'){
el = eval("I18n['"+default_locale+"']." + key);
}
if(typeof(el) == 'undefined'){
el = key;
}
return el;
};
vues/layout / application.HTML.erb
...
<%= javascript_tag "var current_locale = '#{I18n.locale.to_s}';" %>
<%= javascript_tag "var default_locale = '#{I18n.default_locale}';" %>
...
dans votre code javascript, vous pouvez traduire comme ceci:
// current_locale:fr , default_locale:en
// existing translation (in french)
I18n.t('message.hello_world'); // => Bonjour le monde
// non-existing translation (in french) but existing in english
I18n.t('message.hello_this_world'); // => Hello this world
// non-existing translation (french & english)
I18n.t('message.hello_this_new_world'); // => message.hello_this_new_world
espérons que ça aide!
la solution de Ryan est brillante.
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"]
I18n-js fonctionne très bien pour moi et je le recommande. Si vous utilisez son rewrite branch alors le plugin inclura un fichier /assets/i18n/filtered.js
qui affiche exactement ce que @ryan-montgomery a répondu, sans avoir à faire quoi que ce soit vous-même manuellement.
de Cette façon, vous pouvez utiliser les mêmes traductions sur le backend
avec Rails helpers t(:key)
et en utilisant I18n.t('key')
en Javascript sur le frontend.
pour des applications comme celle que vous avez décrite "qui ne supporte pas du tout L'internationalisation" et "est trop tard pour la corriger maintenant" j'ai écrit une approche très rapide: le plugin jQuery Quick-i18n: https://github.com/katio/Quick-i18n démo (et comment l'utiliser): http://johannpaul.net/Quick-i18n /