Cómo recuperar todas las traducciones de archivos yml en rieles I18n
-
26-09-2019 - |
Pregunta
supongo que los carriles almacena los archivos de todas las traducciones yml Analizada en una especie de matriz / hash. ¿Hay una manera de acceder a este?
Por ejemplo, si tengo un archivo:
en:
test_string: "testing this"
warning: "This is just an example
¿Puedo hacer algo así, I18n.translations_store [: en] [: test_string]? Podría analizar el archivo YAML :: yml con la carga, pero en mi caso he dividido los archivos yml en subcarpetas para la organización, y estoy bastante seguro de que los carriles ya todos ellos analizados.
Solución
Tienes que llamar a un método privado en el backend. Así es como se consigue el acceso:
translations = I18n.backend.send(:translations)
translations[:en][:test_string] # => "testing this"
Otros consejos
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 que tienen tanto la precarga de las traducciones o especificar la configuración regional.
Si está utilizando I18n::Fallbacks
desgracia no se puede utilizar I18n.t('.')
ya que sólo devuelve el contenido localización actual (por ejemplo. 'En-GB') y nada de cualquiera de los lugares de retorno (por ejemplo 'en'). Para evitar esto se puede iterar sobre el uso y retrocesos deep_merge!
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
El backend I18n defecto es I18n :: :: Backend simple, que no expone las traducciones en su caso. (I18.backend.translations es un método protegido.)
Esto no es generalmente una buena idea, pero si realmente necesita esta información y no se puede analizar el archivo, se puede extender la clase de servidor.
class I18n::Backend::Simple
def translations_store
translations
end
end
A continuación, puede llamar I18n.backend.translations_store
para obtener las traducciones analizada. Es probable que no se debe confiar en esto como una estrategia a largo plazo, pero se obtiene la información que necesita en este momento.
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
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 usted puede simplemente extraer todas las traducciones utilizando I18n.t("all")
, que tiene la ventaja de inicializar y volver a cargar las traducciones en el modo de desarrollo de forma automática (algo que no sucede si se llama a los métodos protegidos.)