with - Rails: ¿internacionalización de cadenas de Javascript?
rails i18n with parameters (10)
Por lo tanto, tenemos una aplicación Rails 2.3.5 existente que no admite la Internacionalización en absoluto. Ahora, estoy familiarizado con las cosas de Rails I18n, pero tenemos MUCHAS cadenas de salida dentro de /javascripts/
. No soy un gran admirador de este enfoque, pero desafortunadamente es demasiado tarde para solucionarlo ahora.
¿Cómo podríamos internacionalizar cadenas almacenadas en archivos JS en una aplicación de Rails? Rails ni siquiera sirve los archivos JS ...
Estoy pensando que siempre podría hacer que la aplicación Rails sirva los archivos JS, pero eso parece bastante asqueroso. ¿Hay complementos para hacer esto?
¿Por qué no algo simple como:
<script type="text/javascript">
window.I18n = <%= I18n.backend.send(:translations).to_json.html_safe %>
</script>
Luego en JS puedes hacer cosas como:
I18n["en-US"]["alpha"]["bravo"];
He envuelto el mío en una aplicación de ayuda.
def current_translations
@translations ||= I18n.backend.send(:translations)
@translations[I18n.locale].with_indifferent_access
end
Entonces mi llamada en mi application.html.erb se ve así:
<script type="text/javascript">
window.I18n = <%= current_translations.to_json.html_safe %>
</script>
Esto le permite evitar tener que conocer la configuración regional actual en JavaScript.
I18n["alpha"]["bravo"];
O
I18n.alpha.bravo;
¿Por qué no simplemente esto en su archivo Javascript?
var a_message = "<%= I18n.t ''my_key'' %>"
Para que esto funcione, debe agregar .erb a la extensión de su archivo Javascript.
También podría necesitar agregar la siguiente línea en la parte superior de su archivo Javascript si no está usando ruby> = 2.0.
<%# encoding: utf-8 %>
Consulte el último comentario de la respuesta aceptada en este hilo para obtener más información: problemas de codificación en archivos javascript que utilizan la canalización de activos de rieles
Balibu está abandonado. Use i18n-js: https://github.com/fnando/i18n-js
La solución de Ryan anterior es perfecta, excepto que el backend necesita ser inicializado si no ha sido así.
I18n.backend.send(:init_translations) unless I18n.backend.initialized?
# now you can safely dump the translations to json
La solución de Ryan es brillante. Pero para no incluir todo el archivo, debe usar: @translations[I18n.locale].with_indifferent_access["alpha"]
lugar de I18n.backend.send(:translations)["alpha"]
Otra opción que podría ser útil:
Supongamos que tiene un Lenguaje modelo (slug) que contiene todos sus idiomas disponibles. Maneja los casos cuando falta una traducción (se reemplaza por la versión local predeterminada)
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;
};
views / layout / application.html.erb
...
<%= javascript_tag "var current_locale = ''#{I18n.locale.to_s}'';" %>
<%= javascript_tag "var default_locale = ''#{I18n.default_locale}'';" %>
...
En su código javascript, puede traducir de esta manera:
// 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
Espero que ayude!
Para aplicaciones como la que describió "que no admite la internacionalización en absoluto" y "es demasiado tarde para solucionarlo ahora", escribí un enfoque muy rápido: el complemento jQuery Quick-i18n: https://github.com/katio/Quick-i18n Demostración https://github.com/katio/Quick-i18n (y cómo usarla): http://johannpaul.net/Quick-i18n/
Para aplicaciones de rieles 3 puedes hacer esto:
Cree un archivo i18n.js.erb y agréguelo a su application.js. Y agrega este fragmento de código al archivo.
<%
@translator = I18n.backend
@translator.load_translations
@translations ||= @translator.send(:translations)[I18n.locale][:javascript]
%>
window.I18n = <%= @translations.to_json.html_safe %>
También alcance mis traducciones para no tener un gran archivo javascript. Mi alcance es: javascript.
Espero que ayude a alguien!
Babilu es un plugin de Rails que hace esto por ti.
https://github.com/fnando/i18n-js está funcionando bien para mí y lo recomendaría. Si usa su rama de reescritura , el complemento incluirá un archivo /assets/i18n/filtered.js
que arrojará exactamente lo que contestó @ ryan-montgomery, sin tener que hacer nada manualmente.
De esta forma, puede usar las mismas traducciones en el back-end con Rails helpers t(:key)
y usando I18n.t(''key'')
en Javascript en el frontend.