koheitakahashiのブログ

2020.07.01にプログラマーとして生を受けた私が学んだことや、日常について徒然に書いていきます。

Railsアプリの国際化の手順をまとめてみました

はじめに

FJORD BOOT CAMPのプラクティスで「Railsのi18nを理解する」というものがあります。

この課題については、少し前にOKをいただけたのですが、自分なりに手順をまとめていかないと、忘れた時に「どの記事を参考にすれば良かったんだっけ💦」となってしまいそうなので、Railsアプリの国際化の手順をまとめたいと思います💪

そもそも「i18n」とは?

Internationalization(国際化)のことです。iからnまで18文字あるから、そう呼ばれているようです。

国際化とは、どの国の人でもアプリを使えるようにするものです。つまりは、アプリを多言語に対応させるということです。

実際の手順

  1. 辞書ファイルを作成する
  2. デフォルトのロケールを変更する
  3. URLにロケールを含まない時の処理を設定する
  4. viewファイルに訳文を挿入する

大きく分けて上記の3つの手順になります。

1. 辞書ファイルを作成する

まずは、config/locales/ja.ymlconfig/locales/en.ymlファイルを作成します。

今回は英語と日本語に対応させたいと思うので、英語辞書ファイルと日本語辞書ファイルを用意する必要があります。

有り難いことにgithubに様々な言語のロケールファイルが挙げられているので、今回はhttps://github.com/svenfuchs/rails-i18n/tree/master/rails/locale

から、ja.ymlen.ymlを使わせていただきましょう。

wgetしても良いですし、コピペでも良いです。

config/locales/ja.ymlconfig/locales/en.ymlを作成しましょう。

2. デフォルトのロケールを変更する

次は、デフォルトのロケールを変更します。デフォルトを日本語にしたいため以下のように記述します。

config/application.rb

config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}')]
config.i18n.default_locale = :ja

上記は、上の1行で、読み込む辞書ファイルの場所を指定し、下の1行でデフォルトのロケールを日本語にしています。

加えて以下のように記述します。

app/controllers/application_controller.rb

class ApplicationController < ActionController::Base
  before_action :set_locale # ロケールを設定するという処理を差し込む

  private
    def set_locale # ロケールのパラメータが設定されていない場合にはデフォルトのロケールを設定するという処理
      I18n.locale = params[:locale] || I18n.default_locale
    end

    def default_url_options # URLパラメータにロケール情報を渡すという処理
      { locale: I18n.locale }
    end
end

3. URLにロケールを含まない時の処理を設定する

ここまで設定すると、http://localhost:3001/books/?locale=jaのように、URLパラメータにロケール情報を渡すことができます。

しかし、このままではlURLにlocale情報が必ず入ってしまうことになります。また、ロケールの設定は、アプリケーションの構造的にドメインよりも上位に位置すると考えられます。

つまり、localeを含めないURLがルーティングされるように、さらに、http://ja/localhost:3001/ja/booksのように、ロケールが渡された時にドメインよりもロケール情報が上位に位置するようにしたいのです。

この問題に関しては以下のように記述することで解決します。

config/routes.rb

Rails.application.routes.draw do
  scope "(:locale)", locale: /en|ja/ do
    resources :books
  end
end

これは何をしているかとうと、scope "(:locale)"の中にresourcesを入れることで、resourcesの上位にロケール情報が位置するように設定しています。

また、(:locale)のように括弧で囲むことで、ロケール情報を必須ではなくしているということです。

4. viewファイルに訳文を挿入する

ここまで設定できたら、最後に多言語化したい部分を以下のように記述することで、多言語で表示してくれます。

I18n.t 'books'

例えば以下のような辞書ファイルがあるとして config/locales/ja.yml

ja:
  title:
    Books: 書籍一覧
    New_Book: 新規登録
    Editing_Book: 書籍情報の編集

config/locales/en.yml

en:
  title:
    Books: Book
    New_Book: New Book
    Editing_Book: Editing Boo

Booksを多言語化するためには、viewファイルに以下のように記述します。

I18.t 'title.Books'

とすると、多言語で表示することができます。 また、以下のように省略した書き方もできます。

t 'title.Books'

最後に

今回は、Railsアプリの国際化の手順をまとめてみました。

国際化の課題は終わらせることができたものの、なんとなく書いている部分もあり、今回ブログにまとめたことで、以前よりも手順を深く理解することができた感じがしてます💪

参考にさせていただいたサイト

初心者じゃなくても役に立つかもしれないRailsのroutingの記述方をまとめてみた - まっしろけっけ

Rails 国際化 (i18n) API - Rails ガイド

rails-i18n/rails/locale at master · svenfuchs/rails-i18n