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"