🌏

【Rails5】initializers/locale.rbを使ったWebアプリの多言語化設定について、駆け出しVimmerが説明してみた

2021/05/28に公開

1.この記事の対象者

以下の方に向けてこの記事を書いています。

  • i18nとは何?と考えている方
  • initializers/locale.rbを使ってWebアプリを多言語化したい方

早く結論を知りたい方は5章から読むことをお勧めします。

2.なぜこの記事を書いた?

以下の理由でこの記事を書いてます。

  • initializers/locale.rbを使ったWebアプリの多言語化設定を書いた記事が、インターネット上に多く存在しなかった為。

自分は多言語化を実装するのにとても時間をかけてしまいました。同じような問題を抱いている方がこの記事を読んで、少しでも問題が解消されれば幸いです。また、間違っている箇所がございましたら、コメントしていただけると嬉しいです。

3.i18nとは何?

i18nとは多言語管理機能を提供するGemです。i18nの語源の由来はinternationalization(国際化)と言われています。この単語は20文字なので、間を省略してi18nとして定義されています。i18nはデフォルトでRailsアプリケーションにインストールされています。Gemfile.lockをご確認していただけるとi18nが記載されていることが分かると思います。

間違いやすい点としては、このi18nがRailsアプリケーションにインストールされているだけでは、webアプリケーションの多言語化対応はできません。Yamlファイルを設定したり、i18nが提供するメソッドなどを使ったりして、Webアプリケーションを事前に設定する必要があります。

4.configディレクトリ配下のファイルとディレクトリ構成

話をスムーズに進めるために、configディレクトリ配下のinitializersディレクトリとapplication.rbファイルついて先に説明します。
まず、configディレクトリ配下のファイルとディレクトリ構成は以下のようになります。

config
├── application.rb
├── boot.rb
├── cable.yml
├── credentials.yml.enc
├── database.yml
├── environment.rb
├── environments
│   ├── development.rb
│   ├── production.rb
│   └── test.rb
├── initializers
│   ├── application_controller_renderer.rb
│   ├── assets.rb
│   ├── backtrace_silencers.rb
│   ├── content_security_policy.rb
│   ├── cookies_serializer.rb
│   ├── filter_parameter_logging.rb
│   ├── inflections.rb
│   ├── locale.rb
│   ├── mime_types.rb
│   ├── sorcery.rb
│   └── wrap_parameters.rb
├── locales
│   ├── activerecord
│   │   └── ja.yml
│   └── views
│       └── ja.yml
├── puma.rb
├── routes.rb
├── spring.rb
└── storage.yml

configディレクトリは実行環境に関する設定情報が入ったディレクトリです。
configはconfigurationの略で、この単語には”設定”という意味があります。そのため、このディレクトリは”設定に関するディレクトリ”として定義されています。

次に、configディレクトリ配下に存在するinitializersディレクトリとapplication.rbファイルについて説明します。

  • initializers
    アプリケーションで使用する、さまざまな初期化情報の設定ファイルを管理するディレクトリです。

  • application.rb
    各実行環境(開発/テスト/運用)に共通の設定を行うファイルです。また、initializersディレクトリ内にある全ての.rbファイルの初期化情報を組み込む役割を担います。

5.本題

そもそもなぜ、apprication.rbを使わずにinitializers/locale.rbを使ってWebアプリケーションを多言語化設定しているのかというと、Rails5ではinitializers/locale.rbを使って多言語化設定することが推奨されているからです。しかし、どちらの手法でも多言語化設定できるそうです。そのため、何らかの理由でapplication.rbファイルを使用したくない場合には後者がオススメです。

以下の手順でinitializers/locale.rbを使ってWebアプリケーションを多言語化設定します。

  1. config/initializersディレクトリにlocale.rbというファイルを作成します。
  2. locale.rbファイルに以下の記述をします。
initializers/locale.rb
# Where the I18n library should search for translation files
I18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}').to_s]

#アプリケーションで有効とする言語を指定
I18n.available_locales = :ja

#デフォルトの言語を指定
I18n.default_locale = :ja
  1. 手順2で多言語化設定は終了したので、後は、個人で好きな辞書ファイルを作成します。
  2. サーバーを起動して、Webアプリケーションを確認すると、指定した言語で表示されています。
  3. 終了

initializers/locale.rb内の1番目のコードは絶対書かなければいけません。このコードを書かないと作成した辞書ファイルをRailsアプリケーションに読み込ませることができず、多言語設定されません。

6.終わり

奇跡的に英語と日本語の分かりやすいサイトに遭遇したことで、自分の抱える問題を解決することができました。この記事を通して一人でも多くの人の悩みが解消されたら幸いです。

7.参考文献

https://yalantis.com/blog/multi-language-ruby-on-rails-app-development/
https://qiita.com/tai_tai_work/items/3af41931958456a73211
https://forest-valley17.hatenablog.com/entry/2018/12/28/121724

Discussion