deviseをdevise-i18nを使って多言語化する

前回の記事ではRailsにdeviseでメール認証を使ったパスワード再設定を実装しました。 今回はアプリ全体の表示をdevise-i18n gemで多言語化します。

tigrish/devise-i18n: Translations for the devise gem

実装対象のアプリはRailsにdeviseを使ってログイン機能を実装する記事で使用したアプリです。

実装は下記手順で行います。

  1. devise-i18n gemのインストール
  2. デフォルト言語設定
  3. 言語化に対応したviewファイルの作成
    • パターン1: 多言語化用のviewファイルの新規作成
    • パターン2: 既存のviewファイルを多言語化用のviewファイルに上書き
  4. devise-i18nの翻訳ファイルを追加
  5. devise-i18nの翻訳ファイルの修正
  6. メールの多言語化について

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 ロケール名 コマンドで翻訳ファイルを追加します。 デフォルト言語を含めて多言語化する言語の数だけ翻訳ファイルを追加する必要がありそうです。 今回はjaen の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.ymlconfig/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

Rails のルーティング - Railsガイド

devise導入からユーザのプロフィール画面を作成するまで - Qiita

Devise で作成した User モデル用のコントローラーの index, show アクションを追加 | EasyRamble