Como recuperar todas as traduções de arquivos YML em Rails i18n
-
26-09-2019 - |
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.
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.)