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?

53
demandé sur wpp 2010-04-24 00:20:29

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;
90
répondu Ryan Montgomery 2012-12-17 22:22:13

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

18
répondu Felipe Elias Philipp 2012-02-16 09:52:20

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
8
répondu life_like_weeds 2013-09-18 02:03:09

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!

6
répondu Vince V. 2013-10-19 15:29:20

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

5
répondu Dany Marcoux 2017-05-23 10:31:07

Babilu est un plugin de Rails qui fait cela pour vous.

2
répondu sblom 2010-04-23 20:22:40

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!

2
répondu melalj 2014-05-24 00:40:46

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"]

1
répondu macler 2013-06-05 11:31:35

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.

0
répondu robbie613 2013-10-13 21:04:44

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 /

0
répondu Johann Echavarria 2013-10-14 00:14:44