Pergunta

Acho que o Rails armazena todos os arquivos YML de traduções analisadas em uma espécie de matriz/hash. Existe uma maneira de acessar isso?

Por exemplo, se eu tiver um arquivo:

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

Eu poderia fazer algo como, i18n.translations_store [: en] [: test_string]? Eu poderia analisar o arquivo YML com o YAML :: Load, mas no meu caso dividi os arquivos YML em subpastas para organização, e tenho certeza de que o Rails já analisou todos eles.

Foi útil?

Solução

Você precisa chamar um método privado no back -end. É assim que você obtém acesso:

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

Outras dicas

De acordo com o comentário de 8xx8, uma versão mais simples de:

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

é

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

Isso mitiga a ter que pré -carregar as traduções ou especificar o local.

Se você está usando I18n::Fallbacks Infelizmente você não pode usar I18n.t('.') Como apenas retorna o conteúdo atual do local (por exemplo. Para contornar isso, você pode iterar sobre os fallbacks e usar deep_merge! para combiná -los.

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

O back -end do i18N padrão é i18n :: back -end :: simples, que não expõe as traduções para você. (I18.backend.Translations é um método protegido.)

Geralmente, isso não é uma boa ideia, mas se você realmente precisa dessas informações e não pode analisar o arquivo, poderá estender a classe de back -end.

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

Você pode então ligar I18n.backend.translations_store Para obter as traduções analisadas. Você provavelmente não deve confiar nisso como uma estratégia de longo prazo, mas recebe as informações necessárias agora.

Se você estiver fazendo isso em uma tarefa de ancinho, lembre -se de incluir o ambiente ou de outra forma ele não carregará seus próprios locais que vive sob 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 as pessoas entrando nessa antiga pergunta, há uma solução que não requer chamadas de métodos protegidos. Mudar seu yml Arquivo o seguinte:

nl: &all

  ... translations here ...

  all:
    <<: *all

Agora você pode simplesmente extrair todas as traduções usando I18n.t("all"), que tem o benefício de inicializar e recarregar automaticamente as traduções no modo de desenvolvimento (algo que não acontece se você chamar os métodos protegidos.)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top