はじめに
FJORD BOOT CAMPのプラクティスで「Railsのi18nを理解する」というものがあります。
この課題については、少し前にOKをいただけたのですが、自分なりに手順をまとめていかないと、忘れた時に「どの記事を参考にすれば良かったんだっけ💦」となってしまいそうなので、Railsアプリの国際化の手順をまとめたいと思います💪
そもそも「i18n」とは?
Internationalization(国際化)のことです。iからnまで18文字あるから、そう呼ばれているようです。
国際化とは、どの国の人でもアプリを使えるようにするものです。つまりは、アプリを多言語に対応させるということです。
実際の手順
- 辞書ファイルを作成する
- デフォルトのロケールを変更する
- URLにロケールを含まない時の処理を設定する
- viewファイルに訳文を挿入する
大きく分けて上記の3つの手順になります。
1. 辞書ファイルを作成する
まずは、config/locales/ja.yml
とconfig/locales/en.yml
ファイルを作成します。
今回は英語と日本語に対応させたいと思うので、英語辞書ファイルと日本語辞書ファイルを用意する必要があります。
有り難いことにgithubに様々な言語のロケールファイルが挙げられているので、今回はhttps://github.com/svenfuchs/rails-i18n/tree/master/rails/locale
から、ja.yml
とen.yml
を使わせていただきましょう。
wgetしても良いですし、コピペでも良いです。
config/locales/ja.yml
とconfig/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の記述方をまとめてみた - まっしろけっけ