spanish rails multi locales language i18n ruby-on-rails internationalization yaml rails-i18n

ruby on rails - multi - Cómo recuperar todas las traducciones de archivos yml en Rails I18n



rails translation interpolation (6)

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

En general, esta 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 a I18n.backend.translations_store para obtener las traducciones analizadas. Probablemente no deba confiar en esto como una estrategia a largo plazo, pero obtiene la información que necesita en este momento.

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?

Por ejemplo, si tengo un archivo:

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

¿Podría hacer algo como, 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 organización, y estoy bastante seguro de que los rieles ya los analizaron todos.


Para las personas que deambulan por esta vieja pregunta, existe una solución que no requiere llamar a métodos protegidos. Cambie su archivo yml la siguiente manera:

nl: &all ... translations here ... all: <<: *all

Ahora puede simplemente extraer todas las traducciones usando I18n.t("all") , que tiene la ventaja de inicializar y recargar automáticamente las traducciones en modo de desarrollo (algo que no sucede si llama a los métodos protegidos).


Según 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.


Si está haciendo esto en una tarea de rake, recuerde incluir el entorno, o de lo contrario no cargará sus propias configuraciones regionales que viven en 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


Si está utilizando I18n::Fallbacks lamentablemente no puede usar I18n.t(''.'') que solo devuelve el contenido de la configuración regional actual (por ejemplo, ''en-GB'') y nada de ninguno de los entornos alternativos (por ejemplo, '' en ''). Para evitar esto, puedes iterar sobre los deep_merge! 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


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

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