【Rails】I18nを使用した多言語対応(日本語化)

はじめに

Ruby on Railsのデフォルトの言語は英語です。デフォルト言語が英語ということで一番初めに困るのは、エラーメッセージが英語で表示されることでしょう。バリデーションエラーにより表示されたメッセージが英語だと、とてもユーザーフレンドリーなアプリケーション設計とはいえません。

Railsには、このようなエラーメッセージを多言語化(もちろん日本語化も)する機能があります。エラーメッセージ以外にも、例えばビューで使用する文字列なども簡単に変換することができます。

本記事では、I18nを使用した多言語対応についてまとめています。

I18nについて

I18nとはRubyのGemのひとつで、「Internationalization(国際化)」の略記です。Rails 2.2から標準同梱されているのでインストールすることなく使えます。

Railsアプリの日本語化

手っ取り早くRailsアプリを日本語化したいだけなら、次の手順を行います。

config/application.rbに以下を追記します。Railsアプリのデフォルト言語を英語(en)から日本語(ja)に変更します。これにより、ロケールファイルのうち、ja配下の翻訳が使用できるようになります。また、config/locales/ディレクトリ配下の拡張子がrbまたはymlのファイルをロケールファイルとして追加します。

module ApplicationName
  class Application < Rails::Application
    # 以下を追記
    config.i18n.default_locale = :ja
    config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}').to_s]
  end
end

rails-i18nのGitHubから日本語のロケールファイルをダウンロードし、config/locales/ディレクトリに配置します。

config
 |-locale
    |-en.yml
    |-ja.yml   # 追加

以上で日本語化対応は完了です。バリデーションのエラーメッセージなどが日本語されていることを確認してください。

I18nの使い方

ロケールファイルの形式

I18nのロケールファイルでは、Ruby形式(rb)とYAML形式(yml)2種類のファイル形式をサポートしています。どちらの形式で書いても構いませんが、書き方が若干異なるので注意が必要です。

Ruby形式(rb)の書き方は以下の通りです。

{
  ja: {
    article: {
      title: 題名,
      content: 内容
    }
  }
}

YAML形式(yml)の書き方は以下の通りです。

ja:
  article:
    title: 題名
    content: 内容

見て分かる通り、{}を書かなくて言い分、YAML形式のほうが簡単に書けます。Railsにデフォルトで用意されている英語のロケールファイルもYAML形式で書いてあるので、自分でロケールファイルを作成するときもYAML形式で書くのがいいかと思います。

なお、新しいロケールファイルを追加した場合はサーバーを再起動する必要があります(追記の場合は不要)。

ロケールファイルの書き方

ロケールファイルの基本的な書き方は、階層ごとにインデントを足していくだけという非常にシンプルなものですが、特別な階層名を使用することでより便利に使うことができます。なお、以下の分け方は独断によるものなので、公式見解とは異なる可能性があります。

ビューの翻訳

日本語の識別子jaの次の階層をコントローラー名、次の階層をビューのファイル名とし、その次の階層にビュー内で使用する文字列の翻訳を書きます。ビュー内ではスコープを省略して翻訳を呼び出すことがでるようになります。以下の例だと、articles/index.html.erb内ではt(".title")のように呼び出すことができます。

ja:
  articles:
    index:
      title: 題名
      content: 本文

モデルの翻訳

日本語の識別子jaの次の階層をactiverecordとし、modelsの下にモデル名、attributesの下にモデル名とカラム名の翻訳を書きます。このような翻訳は特別な識別子で呼び出すことができるようになります。以下の例だと、モデル名はArticle.model_name.human、カラム名はArticle.human_attribute_name(:title)で呼び出すことができます。

なお、カラム名の次の階層にカラムの値を書いても、特別な識別子で呼び出せるようになるわけではありません。

ja:
  activerecord:
    models:
      article:  記事
    attributes:
      article:
        title: 題名
        content: 本文

エラーメッセージの翻訳

I18nはエラーメッセージの翻訳をロケールファイルの中から以下の優先度で探索します。最も優先度の低い翻訳も見つからなければデフォルト(英語)のエラーメッセージが表示されます。

1. activerecord.errors.models.[model_name].attributes.[attribute_name]
2. activerecord.errors.models.[model_name]
3. activerecord.errors.messages
4. errors.attributes.[attribute_name]
5. errors.messages

rails-i18nの日本語のロケールファイルにはactiverecord.errors.messageserrors.messagesが含まれています。特定のモデルのバリデーションでこれらの翻訳を使用したくないという場合、それより優先度の高いactiverecord.errors.models.[model_name].attributes.[attribute_name]などの翻訳を追加する必要があります。

タグを含む翻訳

翻訳にタグを含めることができます。末尾に_htmlのついたキーと、htmlというキーの翻訳に含まれるタグはビューでそのまま描画されます。タグも文字列として描画したいならrawキーワードを使います。

ja:
  articles:
    title_html: <h1>題名</h1>
    content:
      html: <b>本文</b>
<%= t("articles.title_html") %>
<%= raw t("articles.content.html") %>

翻訳の呼び出し

ロケールファイルの翻訳を呼び出すには、I18n.tメソッドとI18n.lメソッドを使うか、Railsのヘルパーメソッドtメソッドとlメソッドを使うことができます。

ビューの呼び出し

ビューでロケールファイルの翻訳を呼び出すには以下のように記述します。

<%= t("articles.index.title") %>

ビューarticles/index.html.erb内で上記を呼び出す場合、以下のようにスコープを省略して書くこともできます。

<%= t(".title") %>

モデルの呼び出し

モデルでロケールファイルの翻訳を呼び出すには以下のように記述します。

@model = Article.model_name.human
@column = Article.human_attribute_name(:title)

以下のようにスコープを使った書き方でも呼び出すことができます。

@model = I18n.t("activerecord.models.article")
@column = I18n.t("activerecord.attributes.article.title")

正直、どちらの書き方でも長さはそんなに変わりません。特別な呼び出し方を用意するのならもう少し短い名前にしても良かったんじゃないかと思います(特にhumanが謎)。

日付/時間の呼び出し

日付/時間を現地のフォーマットに変換したい場合、以下のように記述します。

<%= l(Time.now) %>

formatオプションで長い日付/時間形式や短い日付/時間形式を呼び出すこともできます(何も指定しなければデフォルト)。

<%= l(Time.now, format: :long) %>

日付/時間でフォーマットの翻訳を記述しておく必要があります。

ja:
  time:
    formats:
      default: "%Y年%m月%d日(%a) %H時%M分%S秒 %z"
      long: "%Y/%m/%d %H:%M"
      short: "%m/%d %H:%M"

まとめ

デフォルト言語を日本語に設定し、日本語のロケールファイルを用意するだけでRailsアプリの日本語化はできてしまいます。しかし、開発を進めているとそれだけでは不十分となってきて、自分でロケールファイルを書く必要が出てきます。ロケールファイルは自由に書くこともできますが、一定のルールを覚えておくとより便利に書くこともできます。

本記事を参考にして、Railsアプリの多言語対応(日本語化)を行っていただければと思います。

関連記事

【Rails】ダウンロードしたフリーフォントをWebpackerを使って導入する方法
# はじめに Webサイトのデザインを彩るひとつの要素にフォントの種類があります。Google Fontsの登場により、様々なフォントが手軽に導入できるようになりました。しかし、世の中にはGoogle Fontsが提供するフォント以外にもたくさん [...]
2021年10月16日 13:26
【Rails】mimemagicに依存しているRailsアプリでbundle installコマンドが失敗する事象の対処法
# はじめに Railsアプリで`bundle install`コマンドを実行しようとしたところ、以下のエラーメッセージが出力されコマンドに失敗しました。 ``` Your bundle is locked to mimemagic (0 [...]
2021年10月14日 14:44
【Rails】macOSのアップデート後にrailsコマンドが失敗する事象の対処法
# はじめに 久しぶりにRailsアプリに手を入れようと思い、`rails server`コマンドを実行してRailsサーバーを立ち上げようとしたところ、エラーが出て起動に失敗してしまいました。 前回までの間にしたことの中で思い当たることと [...]
2021年10月14日 12:11
【Rails】Railsアプリのデバッグ《マルチデバイス篇》
# はじめに 近年のWebアプリはレスポンシブ対応が当たり前になっています。最低でもPCとスマートフォンに対応したデザイン、ときにはその中間のタブレットに対応したデザインなんかも作成する必要があります。 Webアプリの開発はPCを使って行う [...]
2021年5月23日 13:02
【Rails】Railsアプリのデバッグ《Better Errors篇》
# はじめに Railsアプリの開発中になんらかのエラーが発生すると、デフォルトでは以下のような画面が表示されます(画像をクリックすると拡大します)。 <a class="gallery" data-group="gallery" href [...]
2021年5月22日 19:42