Me gustaría i18n un texto que se parece a esto:
¿Ya estás registrado? ¡Iniciar sesión!
Tenga en cuenta que hay un enlace en el texto. En este ejemplo, apunta a Google; en realidad, apuntará al de mi aplicación log_in_path
.
Encontré dos formas de hacer esto, pero ninguna parece "correcta".
La primera forma que conozco implica tener este mi en.yml
:
log_in_message: "Already signed up? <a href='{{url}}'>Log in!</a>"
Y en mi opinión:
<p> <%= t('log_in_message', :url => login_path) %> </p>
Esto funciona , pero tener la <a href=...</a>
pieza puesta en.yml
no me parece muy limpio.
La otra opción que conozco es usar vistas localizadas - login.en.html.erb
y login.es.html.erb
.
Esto tampoco se siente bien ya que la única línea diferente sería la mencionada anteriormente; el resto de la vista (~ 30 líneas) se repetirá para todas las vistas. No estaría muy SECO.
Supongo que podría usar "parciales localizados", pero eso parece demasiado complicado; Creo que prefiero la primera opción a tener tantos archivos de visualización pequeños.
Entonces mi pregunta es: ¿hay una forma "adecuada" de implementar esto?
Respuestas:
en.yml
login.html.erb
fuente
%{href}
en la cadena de traducción YAML. Además, debido a que la salida se escapa automáticamente, debe especificarraw
o.html_safe
explícitamente, o agregar un sufijo a su clave de traducción_html
, ya que enlogin_message_html
y el escape se omitirá automáticamente.t('string')
es idéntico at("string")
. Son lo mismo.t('some.key', link: link_to()).html_safe
La separación de texto y enlace en el archivo locale.yml funciona por un tiempo, pero con texto más largo es difícil traducirlos y mantenerlos, ya que el enlace está en un elemento de traducción separado (como en la respuesta de Simones). Si comienza a tener muchas cadenas / traducciones con enlaces, puede secarlo un poco más.
Hice un ayudante en mi application_helper.rb:
En mi en.yml:
Y en mi opinión:
De esta manera es más fácil traducir mensajes ya que también el texto del enlace está claramente definido en los archivos locale.yml.
fuente
This is a %{link:link to Google}
. Le permite tener varios enlaces en una sola cadena, se encarga de XSS y permite traducciones anidadas. Eche un vistazo a github.com/iGEL/i18n_linkflash
mensaje en Rails 3+, hágalo asíview_context.it(key, ...)
Tomé la solución de Hollis e hice una gema llamada
it
con ella. Veamos un ejemplo:Y entonces
Para obtener más detalles, consulte https://github.com/iGEL/it .
fuente
En en.yml
En de.yml
en new.html.erb [asumido]
fuente
Muchas gracias, holli, por compartir este enfoque. Funciona de maravilla para mí. Le votaría a favor si pudiera, pero esta es mi primera publicación, así que me falta la reputación adecuada ... Como pieza adicional al rompecabezas: el problema del que me di cuenta con su enfoque es que todavía no funciona desde adentro. el controlador. Investigué un poco y combiné tu enfoque con el de Glenn sobre rubypond .
Esto es lo que se me ocurrió:
Ver ayuda, por ejemplo, application_helper.rb
En el controlador:
En locale.yml:
En la vista:
Espero que esta publicación me gane la reputación de votarte, holli :) Cualquier comentario es bienvenido.
fuente
Tuvimos lo siguiente:
o más explícitamente:
luego en ApplicationController.rb solo
Dada una clave en el
en.yml
archivo comose puede utilizar en ERB como
debería generar
fuente
Quería un poco más de flexibilidad que simplemente agregar enlaces a mensajes flash desde archivos YAML (por ejemplo, el nombre de usuario registrado, etc.), así que en su lugar quería usar la notación ERB en la cadena.
Mientras lo estoy usando
bootstrap_flash
, modifiqué el código auxiliar de la siguiente manera para decodificar las cadenas ERB antes de mostrarlas:Entonces es posible usar cadenas como las siguientes (usando devise):
Es posible que esto no funcione para todas las situaciones y puede haber un argumento de que el código y las definiciones de cadena no deben mezclarse (especialmente desde una perspectiva DRY), pero esto parece funcionar bien para mí. El código debe poder adaptarse a muchas otras situaciones, siendo los bits importantes los siguientes:
fuente
Creo que una forma sencilla de hacer esto es simplemente haciendo:
fuente
¿Por qué no usar la primera forma, pero dividiéndolo como
Y entonces
fuente