2011-01-31 20 views
14

Me preguntaba si es posible tener varios archivos de un local, tal vez organizados en directorios y seguir utilizando los alias YAML, por ejemplo:rieles I18n varios archivos aliasing

en un archivo común:

# config/locales/common/en.yml 
en: 
    first_name: &first_name "First name" 
    last_name: &last_name "Last name" 

y en un archivo más específico:

# config/locales/models/user/en.yml 
en: 
    helpers: 
    label: 
     user: 
     first_name: *first_name 
     last_name: *last_name 

Esto ayudará a minimizar traducciones y cambiar en traducciones. en la configuración de mi riel, lo configuro para cargar todo el archivo de configuración regional en subdirectorios. Esta configuración no funciona para mí, obtengo un error de alias incorrecto cuando cargo una página.

Intenté tener un script de inicio que compila todo el en.yml en uno y simplemente use ese archivo, y el alias funciona y todo, pero no puedo fusionar las teclas. Por ejemplo, si tengo otros "ayudantes" en algún otro archivo, solo usa lo que se especificó al final (de hecho, la "en" también se sobrescribe) en lugar de fusionar las claves.

¿O hay un patrón mejor para todo esto? ¡Muchas gracias!

Respuesta

5

El patrón predeterminado para organizar lugares se presenta aquí:

http://guides.rubyonrails.org/i18n.html#organization-of-locale-files

+0

¡Gracias por su respuesta! He repasado esa guía, y eso es similar a cómo lo estoy organizando. Sin embargo, parece que no puedo hacer el aliasing como quiero arriba con la configuración recomendada. Ese es mi punto principal, es cómo hacer el alias en múltiples archivos t8n. ¡Gracias de nuevo! – janechii

5

Trate de sustituir en application.rb valor predeterminado de * * config.i18n.load_path parámetro con el que:

config.i18n.load_path += Dir[Rails.root.join('config/locales/**/*.yml').to_s] 

Funciona para mí.

+1

Skydan, gracias por la entrada! desafortunadamente, eso no funcionó para mí. Tenga en cuenta que estoy usando alias YAML. Sin los alias, funcionaría bien como dijiste. Un año después de la pregunta original y todavía no he encontrado una solución ideal. Acabo de repetir las traducciones. – janechii

4

Por lo que tengo entendido, usted quiere tener múltiples archivos .yml y aún tener la función de fusión.

Lamentablemente no es posible por la forma en que funciona Rails.

técnico:

Hay dos pasos importantes que son realizadas por dos sistemas inconexos:

  • Cada archivo .yml se carga de forma individual utilizando una biblioteca YAML. Eso es donde se resuelven los anclajes y los alias. Los nodos duplicados no están permitidos en este paso, es decir, cada nodo anula un nodo anterior con el mismo nombre y padre.
  • Los valores hash resultantes se combinan luego en Rails usando Ruby. Ahí es donde se fusionan los nodos YAML y se permiten los duplicados de archivos diferentes.

Es por eso que los anclajes y los alias no pueden abarcar varios archivos. Por otro lado, obtienes una función de combinación ordenada que no es compatible con YAML.

En otras palabras: al compilar todo en un archivo gigante, obtendría la función de "alias global", pero perdería la función de fusión. Puedes tener uno o el otro, pero no ambos. En términos de mantenibilidad, el enfoque de múltiples archivos es definitivamente más agradable.


PS: Por supuesto, la duplicación como en tu ejemplo me hace temblar, también, pero es mejor centrarse en teclas DRY y una buena estructura clave que en traducciones DRY.

Esto se debe a que las traducciones a menudo cambian con el tiempo: Lo que sucedió en las primeras etapas de la aplicación puede ser ligeramente diferente una vez que la aplicación ha evolucionado. Quizás en algunos lugares debe ser "Nombre" y en otro debe ser "Escriba su nombre, por favor".

También me puedo imaginar que tener una "traducción maestra" no funciona para todos los idiomas, con respecto a la gramática y otros contextos que no tienen relevancia en inglés.

Así que mi consejo personal sería: seguir con el método sugerido por Rails (es decir, varios archivos) e ignorar alguna duplicación inevitable.