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.

¿Fue útil?

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.)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top