2010-09-29 9 views
29

Supongo que los rieles almacenan todos los archivos yml de las traducciones analizadas en una especie de matriz/hash. ¿Hay alguna manera de acceder a esto?Cómo recuperar todas las traducciones de archivos yml en Rails I18n

Por ejemplo, si tengo un archivo:

en: 
    test_string: "testing this" 
    warning: "This is just an example 

podía hacer algo así, I18n.translations_store [: en] [: test_string]? Podría analizar el archivo yml con YAML :: load, pero en mi caso he dividido los archivos yml en subcarpetas para la organización, y estoy bastante seguro de que los rieles ya los analizaron todos.

Respuesta

53

Tienes que llamar a un método privado en el back-end. Así es como se consigue el acceso:

translations = I18n.backend.send(:translations) 
translations[:en][:test_string] # => "testing this" 
+22

Tenga en cuenta que 'translations' estará vacío si el backend no se ha inicializado, es decir, si aún no lo ha usado para nada más. Verá esto si abre una nueva consola e intenta cargar las traducciones. Puedes evitarlo haciendo 'I18n.t (: foo); translations = I18n.backend.send (: translations) '(incluso si no tiene una traducción' foo'). Estoy seguro de que hay una mejor manera. –

+0

Gracias, @HenrikN, me salvaste el día. – lifecoder

+10

Muchas gracias. Si el backend aún no se ha inicializado y el hash está vacío, puede inicializarlo de esta manera: 'I18n.backend.send (: init_translations) a menos que I18n.backend.initialized?' – Robin

2

El servidor I18n predeterminado es I18n :: Backend :: Simple, que no le muestra las traducciones. (I18.backend.translations es un método protegido)

Generalmente no es una buena idea, pero si realmente necesita esta información y no puede analizar el archivo, puede extender la clase backend.

class I18n::Backend::Simple 
    def translations_store 
    translations 
    end 
end 

A continuación, puede llamar I18n.backend.translations_store para obtener las traducciones analizados. Probablemente no deba confiar en esto como una estrategia a largo plazo, pero obtiene la información que necesita en este momento.

0

Para las personas que deambulan en esta vieja pregunta, hay una solución que no requiere llamar a los métodos protegidas. Cambiar el archivo yml de la siguiente manera:

nl: &all 

    ... translations here ... 

    all: 
    <<: *all 

Ahora simplemente puede extraer todas las traducciones usando I18n.t("all"), que tiene la ventaja de inicializar y volver a cargar las traducciones en el modo de desarrollo (algo que no sucede si se llama al protegido de forma automática métodos).

15

de acuerdo con el comentario de 8xx8, una versión más simple de:

I18n.t(:foo) 
I18n.backend.send(:translations)[:en][:test_string] 

es

I18n.t(".")[:test_string] 

Esto mitiga tener que precargar las traducciones o especificar la configuración regional.

+0

Esta fue la mejor solución para mí 'I18n.t (". ")'. Gracias. – jordelver

0

Si usted está haciendo esto en una tarea de rastrillo, recuerde incluir el medio ambiente, o de lo contrario no va a cargar sus propios locales, que vive bajo config/locales/

require "./config/environment.rb" # Do not forget this 

namespace :i18n do 
    desc "Import I18n to I18n_active_record" 
    task :setup do 
    I18n.t(:foo) 
    translations = I18n.backend.send(:translations) 
    end 
end 
2

Si está utilizando I18n::Fallbacks lamentablemente se puede' t use I18n.t('.'), ya que simplemente devuelve el contenido de la configuración regional actual (por ejemplo, 'en-GB') y nada de ninguno de los entornos de reserva (por ejemplo, 'en'). Para evitar esto, puede iterar sobre los errores y usar deep_merge! para combinarlos.

module I18n 
    class << self 
    def all 
     fallbacks[I18n.locale].reverse.reduce({}) do |translations, fallback| 
     translations.deep_merge!(backend.translate(fallback, '.')) 
     end 
    end 
    end 
end 
Cuestiones relacionadas