web-dev-qa-db-ja.com

Rails I18nのymlファイルからすべての翻訳を取得する方法

Railsは、解析されたすべての翻訳ymlファイルを一種の配列/ハッシュに格納していると思います。これにアクセスする方法はありますか?

たとえば、ファイルがある場合:

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

I18n.translations_store [:en] [:test_string]のようなことをしてもいいですか? YAML :: loadを使用してymlファイルを解析することもできますが、私の場合は、整理のためにymlファイルをサブフォルダーに分割しており、Railsはすでにすべてを解析していると確信しています。

32
Tiago

バックエンドでプライベートメソッドを呼び出す必要があります。アクセス方法は次のとおりです。

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

8xx8のコメントによると、より単純なバージョン:

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

です

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

これにより、翻訳をプリロードするか、ロケールを指定する必要がなくなります。

18
Eric H.

_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
_
3
Steve England

デフォルトのI18nバックエンドはI18n :: Backend :: Simpleであり、翻訳を公開しません。 (I18.backend.translationsは保護されたメソッドです。)

これは一般的には良い考えではありませんが、本当にこの情報が必要でファイルを解析できない場合は、バックエンドクラスを拡張できます。

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

次に、I18n.backend.translations_storeを呼び出して、解析された翻訳を取得できます。長期的な戦略としてこれに頼るべきではないかもしれませんが、今必要な情報が得られます。

2
Dave Pirotte

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
1
Dan Andreasson

この古い質問に迷い込んでいる人々のために、保護されたメソッドを呼び出す必要のない解決策があります。 ymlファイルを次のように変更します。

_nl: &all

  ... translations here ...

  all:
    <<: *all
_

これで、I18n.t("all")を使用してすべての翻訳を簡単に抽出できます。これには、開発モードで翻訳を自動的に初期化して再読み込みするという利点があります(保護されたメソッドを呼び出した場合は発生しません)。

0
Jacob