あまブログ

ドキドキ......ドキドキ2択クイ〜〜〜〜〜〜〜ズ!!

【Rails】i18nで日本語化する方法

この記事では、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.ymlconfig/locales/en.ymlが作成されます。

以降はこれらのファイルに翻訳を追加していきます。

2-3. Active Recordモデルで翻訳を行なう

config/locales/ja.ymlに以下を追記します。

ja:
  activerecord:
    models:
      book:attributes:
      book:
        title: タイトル
        memo: メモ

model_name.humanhuman_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のクエリパラメータに自動的にロケール情報が含まれるようになります。


【参考】