対象のRailsバージョン: 7.0〜8.0くらい
結論
application.rb
は以下の設定でいいと思います。 en
も必要なければjaだけでOK.
config.i18n.available_locales = %i[en ja] config.i18n.default_locale = :ja
config.i18n.fallbacks
は、自動生成された produciton.rb
で config.i18n.fallbacks = true
が入っているので以下のように評価されます。
これで、 en
のリソースがなければ ja
のリソースが使われます。
irb(main):001> I18n.fallbacks => {:en=>[:en, :ja], :ja=>[:ja]}
細かいところいろいろ
config.i18n.raise_on_missing_translations
デフォルト値はfalse
なので、development/testでは true
にした方がいいです。
config.i18n.load_path
はネストしたリソースも読み込む
Railsガイドに以下の記述があるけど、これは誤りで、v7.0からlocales配下のネストしたリソースも自動で読み込まれます。
The default locale loading mechanism in Rails does not load locale files in nested dictionaries, like we have here. So, for this to work, we must explicitly tell Rails to look further:
Railsのデフォルトのロケール読み込みメカニズムでは、ここで使っているようなネストした辞書に含まれるロケールファイルを読み込みません。そのため、Railsでこれらが読み込まれるようにするためには、以下のように明示的に指定する必要があります。
# config/application.rb config.i18n.load_path += Dir[Rails.root.join("config", "locales", "**", "*.{rb,yml}")]
ドキュメント修正のPRがすでにマージされています。 Remove note about nested locale folders configuration by pixeltrix · Pull Request #53966 · rails/rails
i18nバックエンドの実体は ruby-i18n/i18n
Railsのi18nバックエンドは ruby-i18n/i18n: Internationalization (i18n) library for Ruby 。なので、ルックアップの挙動や詳細を知りたい場合はこのリポジトリのコードを読むのがいいです。