Railsのi18n を理解する(英語、日本語対応)

今回は、Railsにおける国際化(多言語化)を実現するための機能を提供するi18n(internationalization)について学習しました。
Railsでは、i18nを使用することで、アプリケーションで使用されるテキストメッセージやエラーメッセージなどを簡単に多言語対応させることができます。

Rails 国際化(i18n)API

学んだこと✏️

前提知識
  • 国際化:使用されるすべての文言や、ロケール固有の要素(日付や通貨フォーマット等)の抽象化までの作業。

  • Localization(日本語化など):具体的な翻訳方法を提供したり、そのためのフォーマットを提供したりすること。

    • Railsフレームワーク内のすべての静的文字列(Active Recordのバリデーションメッセージ、時刻や日付のフォーマットなど)の国際化部分は既に完了している。 ローカライズは、単にこれらのデフォルト文字列(ロケール)を訳文でオーバーライドするだけ。
  • i18nの主要なメソッド

    • translateメソッド...config/locales以下の翻訳ファイルの参照
    • localizeメソッド...日付や時刻を設定した言語のフォーマットに変換する

以下は作成済みの新規アプリケーションがあることが前提です。

1.デフォルト言語を日本語に設定
  • 以下をconfig/application.rbに追加して、デフォルト言語を英語から日本語に設定する。
config.i18n.default_locale = :ja
2.日本語と英語のロケールファイル(翻訳ファイル)のダウンロード
#日本語のロケールファイル
$ curl -s https://raw.githubusercontent.com/svenfuchs/rails-i18n/master/rails/locale/ja.yml -o config/locales/ja.yml

curlコマンドの使い方(HTTPリクエスト)

3.Active Recordモデルで翻訳
  • 例えば、日本語の場合はconfig/locales/ja.ymlに以下のように設定。 この例では、Userモデルの翻訳を設定している。 activerecord.models.userは、Userモデル自体の翻訳を設定し、 activerecord.attributes.userは、Userモデルの属性(ここではnameとemail)の翻訳を設定している。
ja:
  activerecord:
    models:
      user: ユーザー
    attributes:
      user:
        name: 名前
        email: メールアドレス
  • 次にmodel_name.humanhuman_attribute_nameを使用しモデル名とカラム名の訳語を表示する。 humanメソッドは、i18nロケールに応じてモデル名を翻訳することができる。 現在のロケールに対応する翻訳がある場合はそれを返し、ない場合は自動的に生成された人間が読みやすい形式のモデル名を返す。

例えば、日本語のロケールであれば、"User"が"ユーザー"に変換される。

User.model_name.human

また、以下のようにname属性の翻訳を取得することができる。

User.human_attribute_name(:name)

4.7.2 Active Modelのメソッド

補足
  • Railspluralizeヘルパーメソッドを使用することで、複数形の単語を生成することができる。 このヘルパーメソッドをi18nと組み合わせることで、多言語対応アプリケーションでの単語の複数形の生成が容易になる。

例えば、"post"という単語の複数形を生成する場合は、以下のようにpluralizeメソッドを使用。

pluralize(2, "post")

このコードは、第1引数で指定した数値が2であるため、"post"という単語を複数形に変換して"posts"を生成。

i18nと組み合わせる場合は、以下のように記述。

t("views.post", count: 2)

このコードは、"views.post"というi18nのキーを指定し、countオプションに数値を指定することで、その数に応じた単数形または複数形を生成。 i18nの設定については、config/locales以下にファイルを作成し、以下のように記述。

en:
  views:
    post:
      one: "1 post"
      other: "%{count} posts"

これにより、数値が1の場合は"1 post"、それ以外の場合は"%{count} posts"という文字列が返される。 "other"キーには、%{count}というプレースホルダーを使用して、動的に数値を埋め込むことができる。 また、複数形のルールについては、i18nの設定ファイルで指定することができる。

pluralize

4.各ページ、flashメッセージを翻訳
  • i18nでは、翻訳メッセージの中に変数を含めることができる。例えば、以下のように訳文に変数countを含めることができる。
en:
  users:
    message: There are %{count} users.

このように、訳文中に%{変数名}を含めることで、変数を埋め込むことができる。この場合、変数名はcount

変数を埋め込む場合、以下のようにI18n.tメソッド(またはt())を呼び出し、第2引数として変数の値を渡すことができる。

I18n.t('users.message', count: 10)

この場合、users.messageは翻訳メッセージのキー、count: 10は変数countの値を表している。 このようにして、変数を含めた翻訳メッセージを扱うことができる。

3.3 訳文に変数を渡す

5.ロケール管理方法の追加
  • app/controllers/application_controller.rbに以下を追記。例えばhttp://localhost:3000/books?locale=jaで 日本語に切り替えることができる。default_url_optionsを使用することで、URLに言語情報を含めることができる。 これにより、ユーザーがページを切り替えた場合にも、言語情報が維持される。
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

2.2 リクエスト間でロケールを管理する

まとめ

他にもやり方があると思いますが、自分が普段何気なく使ってるアプリもこのように比較的簡単に翻訳がされていると知り感動しました!