Railsは、解析されたすべての翻訳ymlファイルを一種の配列/ハッシュに格納していると思います。これにアクセスする方法はありますか?
たとえば、ファイルがある場合:
en:
test_string: "testing this"
warning: "This is just an example
I18n.translations_store [:en] [:test_string]のようなことをしてもいいですか? YAML :: loadを使用してymlファイルを解析することもできますが、私の場合は、整理のためにymlファイルをサブフォルダーに分割しており、Railsはすでにすべてを解析していると確信しています。
バックエンドでプライベートメソッドを呼び出す必要があります。アクセス方法は次のとおりです。
translations = I18n.backend.send(:translations)
translations[:en][:test_string] # => "testing this"
8xx8のコメントによると、より単純なバージョン:
I18n.t(:foo)
I18n.backend.send(:translations)[:en][:test_string]
です
I18n.t(".")[:test_string]
これにより、翻訳をプリロードするか、ロケールを指定する必要がなくなります。
_I18n::Fallbacks
_を使用している場合、残念ながらI18n.t('.')
は使用できません。これは、コンテンツの現在のロケール(例: 'en-GB')を返すだけで、フォールバックロケール(例: ')からは何も返さないためです。 en ')。これを回避するには、フォールバックを繰り返し処理し、_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
_
デフォルトのI18nバックエンドはI18n :: Backend :: Simpleであり、翻訳を公開しません。 (I18.backend.translationsは保護されたメソッドです。)
これは一般的には良い考えではありませんが、本当にこの情報が必要でファイルを解析できない場合は、バックエンドクラスを拡張できます。
class I18n::Backend::Simple
def translations_store
translations
end
end
次に、I18n.backend.translations_store
を呼び出して、解析された翻訳を取得できます。長期的な戦略としてこれに頼るべきではないかもしれませんが、今必要な情報が得られます。
Rakeタスクでこれを行う場合は、環境を含めることを忘れないでください。そうしないと、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")
を使用してすべての翻訳を簡単に抽出できます。これには、開発モードで翻訳を自動的に初期化して再読み込みするという利点があります(保護されたメソッドを呼び出した場合は発生しません)。