2009-12-03 11 views
7

como un ejemplo, tengo un archivo por defecto Inglés locale "en.yml" con contenidos:rieles - Cómo agregar dinámicamente/anulación redacción a yaml i18n

en: 
    messages: messages 
    users: users 

ahora, no es un cliente, que quiere mensajes para que se nombren discusiones en su producto, pero los usuarios deben seguir siendo usuarios. Así que lo que quiero hacer es crear archivo "customer.en.yml"

en: 
messages: discussions 

que anular los "mensajes" por defecto traducción, pero mantendría todas las otras palabras misma. ¿Cómo puedo lograrlo?

porque si me carga con en.yml:

config.i18n.load_path += Dir[File.join(RAILS_ROOT, 'config', 'locales', '*.{rb,yml}')] 

y después cargar customer.en.yml (APP_CONFIG [ 'nombre-cliente'] se define antes) con

config.i18n.load_path += Dir[File.join(RAILS_ROOT, 'config', 'custom_locales', APP_CONFIG['customer_name']+'.{rb|yml}')] 

se acaba de sobrescribo mi configuración regional "en" y la traducción de "usuarios" desaparecerá, ¿verdad?

Respuesta

3

No debe sobrescribir su configuración regional "en". Las traducciones se fusionan. store_translations en la simple backend I18n llama merge_translations, que se ve así:

# Deep merges the given translations hash with the existing translations 
# for the given locale 
def merge_translations(locale, data) 
    locale = locale.to_sym 
    translations[locale] ||= {} 
    data = deep_symbolize_keys(data) 

    # deep_merge by Stefan Rusterholz, see http://www.ruby-forum.com/topic/142809 
    merger = proc { |key, v1, v2| Hash === v1 && Hash === v2 ? v1.merge(v2, &merger) : v2 } 
    translations[locale].merge!(data, &merger) 
end 

Como se puede ver, sólo las teclas que escriba en este último archivo yml traducción se sobrescribirán.

1

Quería algo similar cuando estábamos escribiendo una traducción de pirate.yml, pero quería que todo lo que no estaba definido en pirate.yml fuera el predeterminado en lo que teníamos en en.yml.

Lo que escribí se puede encontrar en Github.

+0

¡El enlace de Github ya no es válido! –

+0

¿No es válido? Si bien es un proyecto muy antiguo, el enlace aún funciona para mí. ¿Estás obteniendo un 404? –

+0

¡Exactamente una "página no encontrada" es lo que obtengo! –

-1

Creo que podría estar mezclando dos cosas diferentes.

El archivo i18n es para traducciones.

Si tiene un cliente que necesita un nombre específico para un campo, no es un problema de traducción, sino una funcionalidad.

En otras palabras, creo que necesita algo como esto:

en: 
    messages: messages 
    users: users 
    discussions: discussions 

y luego añadir la funcionalidad específica en otro lugar, por ejemplo, en su opinión:

if(customer.needs_discussions?) 
<%= t(:discussions) %> 
else 
<%= t(:messages) %> 
end 

Alternativamente, se podría añadir un atributo de cadena para sus clientes, por defecto a 'mensajes'. Luego, su vista se vería así:

<%= t(customer.messages_field_name) %> 
+2

bueno, entonces si necesita 200 cambios en la redacción, tengo que escribir 200 ifs y agregar 200 configuraciones de cliente, y lo mismo para cada cliente usando el producto a su manera. esto aumentaría en gran medida la cantidad de código. y, si el cliente específico se va, todos esos ifs permanecerán en el código, mientras que de lo contrario, simplemente elimino la anulación de traducción. –

+0

El código fue solo un ejemplo; lo que quise decir es que no debería usar i18n para eso. He editado mi comentario con otras soluciones. Si continúa pensando en usar i18n, piense en lo que sucederá cuando tenga que traducir su aplicación al francés, por ejemplo. – kikito

+1

ya tengo i18n en francés e inglés, y además de ellos, cargo las anulaciones de clientes. Tengo locales/en.yml, locales/fr.yml y además de ellos, cargo locales/customer.en.yml y locales/customer.fr.yml, si es necesario. Lo siento, pero realmente creo que de esta manera es mucho mejor para las personalizaciones de redacción simples –

5

Uso i18n.fallbacks

No estoy seguro de que cuando esto se añadió a los carriles, pero en 4.2.2 que puede hacer:

# application.rb 
# If key is not found in a locale, we look in fallback 
config.i18n.fallbacks = { 
    "locale_1" => "en", 
    "locale_2" => "en", 
    "locale_3" => "de", 
} 

Si también establece config.action_view.raise_on_missing_translations = true (que hago en el desarrollo y prueba), que aumentará sólo si la llave no se encuentra en la localidad o el repliegue.

Cuestiones relacionadas