前回の記事ではRailsにdeviseでメール認証を使ったパスワード再設定を実装しました。 今回はアプリ全体の表示をdevise-i18n gemで多言語化します。
tigrish/devise-i18n: Translations for the devise gem
実装対象のアプリはRailsにdeviseを使ってログイン機能を実装する記事で使用したアプリです。
実装は下記手順で行います。
- devise-i18n gemのインストール
- デフォルト言語設定
- 多言語化に対応したviewファイルの作成
- devise-i18nの翻訳ファイルを追加
- devise-i18nの翻訳ファイルの修正
- メールの多言語化について
1. devise-i18n gemインストール
Gemfileにdevise-i18n gemを追加後、bundle install
します。
# Gemfile ... gem 'devise' # 下記を追加 gem 'devise-i18n'
2. デフォルト言語設定
config/application.rb
にデフォルト言語の設定を追加します。
今回は日本語に設定します。
# config/application.rb ... module BooksApp class Application < Rails::Application # Initialize configuration defaults for originally generated Rails version. config.load_defaults 6.1 # 下記を追加 config.i18n.default_locale = :ja ... end end
3. 多言語化に対応したviewファイルの作成
認証機能付きモデルのviewファイルの存在の有無で手順が異なります。
tigrish/devise-i18n: Translations for the devise gem
- 認証機能付きモデルのviewファイルを未作成: viewファイルの新規作成
- 認証機能付きモデルのviewファイルを作成済み: 既存のviewファイルの上書き
パターン1: 多言語化用のviewファイルの新規作成
rails g devise:views
コマンドでviewファイルを作成していない場合はrails g devise:i18n:views モデル名単数
コマンドで多言語化用のviewファイルを新規作成します。
$ rails g devise:i18n:views user
これで多言語化に対応した認証機能付きモデルのviewファイルが作成できます。
上記コマンドはdevise-i18n gemを使わない場合のrails g devise:views
コマンドに相当します。
# モデルを指定して通常のviewファイルを作成 $ rails g devise:views モデル名単数 # モデルを指定せずに通常のviewファイルを作成 $ rails g devise:views # モデルを指定して多言語化用のviewファイルを作成 $ rails g devise:i18n:views モデル名単数 # モデルを指定せずに多言語化用のviewファイルを作成 $ rails g devise:i18n:views
作成されるviewファイルのディレクトリも下記のようにrails g devise:views
コマンドと同様です。
- モデル指定:
app/views/モデル名/モジュール名/viewファイル
- モデル指定無し:
app/views/devise/モジュール名/viewファイル
開発初期の時点で多言語化を想定しているのであれば最初からdevise-i18n gemのrails g devise:i18n:views
コマンドでviewファイルを新規作成する方が良いと思います。
パターン2: 既存のviewファイルを多言語化用のviewファイルに上書き
既に認証機能付きモデルのviewファイルを作成している場合はrails g devise:i18n:views
コマンドで多言語化用のviewファイルに上書きすることができます。上書きする際には既に記述しているコードが消えてしまわないように注意してください。
今回はログイン機能を実装する際に認証機能付きのUserモデルのviewファイルを作成済みなのでこちらの方法を選択しました。
既に対象の認証機能付きviewファイルが存在している状態でrails g devise:i18n:views
コマンドを実行すると次のように動作選択を求められます。
$ rails g devise:i18n:views users Running via Spring preloader in process 6579 invoke Devise::I18n::SharedViewsGenerator exist app/views/users/shared identical app/views/users/shared/_error_messages.html.erb conflict app/views/users/shared/_links.html.erb Overwrite /Users/karlley/Workspace/fjord-books_app/app/views/users/shared/_links.html.erb? (enter "h" for help) [Ynaqdhm] h Y - yes, overwrite n - no, do not overwrite a - all, overwrite this and all others q - quit, abort d - diff, show the differences between the old and the new h - help, show this help m - merge, run merge tool ...
上書き(y
or a
)やマージ(m
)を行い表示されるファイルの数だけ多言語化用のviewファイルに書き換えます。
認証機能付きモデルのviewファイルの作成をrails g devise:views
コマンドではなくrails g devise:i18n:views
コマンドで行っているパターン1の場合はviewファイルの上書き作業は不要です。
4. devise-i18nの翻訳ファイルを追加
不足した翻訳情報を補うためにdevise-i18n gemでrails g devise:i18n:locale ロケール名
コマンドで翻訳ファイルを追加します。
デフォルト言語を含めて多言語化する言語の数だけ翻訳ファイルを追加する必要がありそうです。
今回はja
とen
の2つの翻訳ファイルを追加します。
tigrish/devise-i18n: Translations for the devise gem
# ja $ rails g devise:i18n:locale ja Running via Spring preloader in process 12368 create config/locales/devise.views.ja.yml # en $ rails g devise:i18n:locale en Running via Spring preloader in process 14524 create config/locales/devise.views.en.yml
作成した翻訳ファイルを作成したviewファイルに合わせて修正し、不足した翻訳情報を補っていきます。
5. devise-i18nの翻訳ファイルの修正
作成した翻訳ファイルを作成したviewファイルに合わせて修正します。
認証機能付きモデルのviewファイル作成時にrails g devise:i18n:views モデル名単数
コマンドでモデル名を指定して作成している場合に翻訳情報を読み込む為に修正が必要になります。
モデル名を指定してviewファイルを作成している場合、作成した次の翻訳情報が読み込まれない状態になっているはずです。
config/locales/devise.views.ja.yml
内のja.devise
以下の翻訳情報config/locales/devise.views.en.yml
内のen.devise
以下の翻訳情報
この読み込まれない翻訳情報を作成したモデル名に合わせて修正します。
なお、rails g devise:i18n:views
コマンドでモデル名を指定していない場合は不要な作業です。
Devise Viewをカスタマイズするとdevise-i18nが効かない – myMemoBlog by 256hax
モデル名複数形
になっている点に注意して修正します。
# config/locales/devise.views.ja.yml ja: activerecord: ... devise: # ここを作成したモデル名に合わせて↓のように修正 users: ...
# config/locales/devise.views.en.yml en: activerecord: ... devise: # ここを作成したモデル名に合わせて↓のように修正 users: ...
これで作成した認証機能付きモデルのviewファイルで追加した翻訳ファイルconfig/locales/devise.views.ja.yml
とconfig/locales/devise.views.en.yml
を読み込むようになります。
あとは必要に応じて翻訳情報を手動で追加すればokです。
i18nで多言語化する - karlley's tech blog
6. メールの多言語化について
deviseのメール認証等で使用するメール本文の多言語化はdevise-i18n gemが自動で行ってくれます。
config/application.rb
で指定したデフォルト言語に合わせてメール本文の言語も多言語化される。- 例としてUserモデルのカスタムビューを作成している場合はメール本文のテキストは
app/views/users/mailer/*.html.erb
としてメール機能別に用意されている。 app/views/users/mailer/*.html.erb
内で各言語の翻訳ファイルconfig/locales/devise.views.各言語.yml
を読み込むことで多言語化している。
まとめ
なんとか多言語化することができました。 多言語化は今後も触る機会が多そうなので色々と理解できて良かったです! 提出物の完成まであと少しなのでがんばります!
参照
[*Rails*] deviseの使い方(rails6版) - Qiita
Railsにdeviseをサクッと導入!認証機能の使い方も解説【日本語化】 | キツネの惑星
【Rails】認証機能を実装するdeviseの導入方法 - TASK NOTES
devise導入からユーザのプロフィール画面を作成するまで - Qiita
Devise で作成した User モデル用のコントローラーの index, show アクションを追加 | EasyRamble