Railsの国際化におけるYMLファイルからすべての翻訳を取得する方法
-
26-09-2019 - |
質問
私はレールの店がすべて解析された翻訳が配列/ハッシュのソートにファイルをYML推測しています。 この?
にアクセスする方法はありますかたとえば、私はファイルをしている場合:
en:
test_string: "testing this"
warning: "This is just an example
[:EN] [:test_string] 私はI18n.translations_store、のような何かをしてもらえますか? 私はYAML ::負荷とYMLファイルを解析することができますが、私の場合、私は組織のサブフォルダにYMLファイルを分割さてきた、と私はかなり確信してレールがすでにそれらをすべて解析されていることです。
解決
あなたはバックエンドでプライベートメソッドを呼び出すようになりました。これは、あなたがアクセスを取得する方法です。
translations = I18n.backend.send(:translations)
translations[:en][:test_string] # => "testing this"
他のヒント
8xx8さんのコメントを1として、の簡単なバージョン:
I18n.t(:foo)
I18n.backend.send(:translations)[:en][:test_string]
タグであります
I18n.t(".")[:test_string]
この緩和するには、両方の予圧への翻訳を有するか、またはロケールを指定します。
あなたは、残念ながらI18n::Fallbacks
を使用している場合は、それだけで中身現在のロケール(たとえば、「エンGB」)とフォールバックロケール(たとえば、「エン」)のいずれかから何を返すようごI18n.t('.')
を使用することはできません。このラウンドを取得するには、それらを結合するためにフォールバックや使用deep_merge!
を反復処理することができます。
module I18n
class << self
def all
fallbacks[I18n.locale].reverse.reduce({}) do |translations, fallback|
translations.deep_merge!(backend.translate(fallback, '.'))
end
end
end
end
デフォルトの国際化のバックエンドは国際化である::バックエンド:: Simpleは、あなたに翻訳を公開しません。 (I18.backend.translationsを保護する方法である。)
これは一般的に良いアイデアではありませんが、あなたが本当にこの情報を必要とし、ファイルを解析できない場合、あなたはバックエンドクラスを拡張することができます。
class I18n::Backend::Simple
def translations_store
translations
end
end
あなたはその後、解析された翻訳を取得するにはI18n.backend.translations_store
を呼び出すことができます。あなたは、おそらく長期的な戦略としてこれに頼るべきではありませんが、それはあなたが今、必要な情報を取得します。
は、的環境を含めることを忘れないでください、またはそれ以外の場合は、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
は、この古い質問にさまよう人々のために、保護されたメソッドを呼び出す必要はありません解決策があります。次のようにyml
ファイルを変更します:
nl: &all
... translations here ...
all:
<<: *all
今、あなたは、単に自動的に初期化し、開発モードで翻訳をリロードする利点があるI18n.t("all")
、使用してすべての翻訳抽出することができます(あなたが保護されたメソッドを呼び出す場合は発生しません、何かを。)