この記事では、Railsに同梱されているi18n gemを使ってアプリケーションを多言語化する方法を紹介します。
1. 実行環境
- macOS:12.5.1
- Ruby:3.1.2
- Rails:6.1.7
- i18n:1.12.0
2. 手順
2-1. i18nモジュールの設定
使用する言語のリストとデフォルトで使用する言語を設定します。
config/initializers/locale.rbに以下を追記します。
# 英語と日本語の利用を許可する
I18n.available_locales = [:en, :ja]
# デフォルトの言語を日本語にする
I18n.default_locale = :ja
2-2. ロケールファイルのダウンロード
使用する言語のデフォルトのロケールファイルをsvenfuchs/rails-i18nからダウンロードします。
日本語
$ curl -s https://raw.githubusercontent.com/svenfuchs/rails-i18n/master/rails/locale/ja.yml -o config/locales/ja.yml
英語
$ curl -s https://raw.githubusercontent.com/svenfuchs/rails-i18n/master/rails/locale/en.yml -o config/locales/en.yml
上記のコマンドによりconfig/locales/ja.ymlとconfig/locales/en.ymlが作成されます。
以降はこれらのファイルに翻訳を追加していきます。
2-3. Active Recordモデルで翻訳を行なう
config/locales/ja.ymlに以下を追記します。
ja:
activerecord:
models:
book: 本
attributes:
book:
title: タイトル
memo: メモ
model_name.humanとhuman_attribute_nameを使ってモデル名とカラム名の訳語を表示します。
Book.model_name.human #=> 本
Book.human_attribute_name(:title) #=> タイトル
Book.human_attribute_name(:memo) #=> メモ
config/locales/en.ymlに英訳を追加します。
en:
activerecord:
models:
book: Book
attributes:
book:
title: Title
memo: Memo
2-4. その他の翻訳
config/locales/ja.ymlに以下を追記します。
ja:
views:
common:
show: 詳細
title_new: "%{name}の新規作成"
controllers:
common:
notice_create: "%{name}が作成されました。"
I18n.translateメソッドを使って訳文を参照します。
I18n.translate()はI18n.t()またはt()のように省略可能です。
t('views.common.show') #=> 詳細
t('views.common.title_new', name: Book.model_name.human) #=> 本の新規作成
t('controllers.common.notice_destroy', name: Book.model_name.human) #=> 本が作成されました。
config/locales/en.ymlに英訳を追加します。
en:
views:
common:
show: Show
title_new: "New %{name}"
controllers:
common:
notice_create: "%{name} was successfully created."
2-5. URLクエリパラメータでロケールを切り替え
app/controllers/application_controller.rbに以下を追記します。
class ApplicationController < ActionController::Base
around_action :switch_locale
def switch_locale(&action)
locale = params[:locale] || I18n.default_locale
I18n.with_locale(locale, &action)
end
def default_url_options
{ locale: I18n.locale }
end
end
上記の設定により、http://localhost:3000/books?locale=jaで日本語に、http://localhost:3000/books?locale=enで英語に切り替えることができます。
default_url_optionsにより全てのURLのクエリパラメータに自動的にロケール情報が含まれるようになります。
【参考】