Railsアプリを多言語化に対応して国際的アプリにする 【設定編】

こんにちは、[ペーパーエンジニアのよしこ](https://twitter.com/K2_Yoshiko)です。

**既存のRailsアプリを国際化アプリにレベルアップ（ローカライズ／多言語化）させたい！**
**Railsアプリ標準のエラーメッセージが英語だから日本語化したい！**

ということでRails I18nを用いて多言語化に対応するための準備を行います。

基本的に[RailsガイドのRails 国際化 (i18n) API](https://railsguides.jp/i18n.html)に沿った内容です。

今回は、

>https://www.foo.com/bar?locale=ja

というURL paramsを元に翻訳言語を判別する方法を選択します。


# 概略

- 必要ファイルを作成
- Gemのインストール
- 設定の書き込み


# 環境

```
$ rails --version
Rails 5.2.4.2

$ ruby --version
ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-darwin19]
```



# ファイル作成

まず必要なファイルを作成します。

```

# ターミナル

$ cd /RailsAppName

$ touch ./config/locales/ja.yml
$ touch ./config/initializers/locale.yml

```



# Gemインストール

次にGemをインストールします。

```
# ./Gemfile

gem 'rails-i18n'
```

その後、ターミナルで`bundle install`を実行します。



# 設定の書き込み

５つのファイルに設定を書き込んでいきます。

- ./config/application.rb
- ./config/initializers/locale.rb (新規作成)
- ./config/locales/ja.yml (新規作成)
- ./config/routes.rb
- ./app/controllers/application_controller.rb

※ 書き込みファイルと設定内容は、翻訳先の言語をどこから引っ張ってくるかによって変わります。

>https://www.foo.com/bar?locale=ja

今回は、このようなURL paramsを元に翻訳言語を判別する設定を行います。



## 1 locale.rb

次の2つを設定します。

- 読み込まれる翻訳文のファイルパス
- デフォルトの言語（ロケール）

```
# ./config/locale.rb (新規作成)

# I18nライブラリに訳文の探索場所を指示する
# 外部Gemを利用する場合は、次の一文は削除する
I18n.load_path += Dir[Rails.root.join('lib/locale/*.{rb,yml}')]

# アプリケーションでの利用を許可するロケールをホワイトリスト化する
I18n.available_locales = [:en, :ja]

# ロケールを:en以外に変更する
I18n.default_locale = :ja
```



## 2 application.rb

デフォルトの設定を変更する場合などにはapplication.rbに記入します。

```
# ./config/application.rb

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

```



## 3 翻訳文

翻訳文を記述するファイルです。
ここでは初期状態で作成しておきます。

```
# ./config/locales/ja.yml (新規作成)

ja:
```


## 4 ルーティングの設定

`www.hogehoge.com/ja/bar`とパラメータによって言語を選択できるようにするため、ルーティングを書き換えます。

また、言語選択のパラメータを強制しないために、省略も受け入れるようにしています。
`www.hogehoge.com/bar`でもアクセス可能（デフォルトのロケール）

```
# ./config/routes.rb

Rails.application.routes.draw do
  scope "(:locale)", locale: /en|ja/ do
    root 'Controllers#method'

    （省略）
    
    get '/:locale' => 'static_pages#home'
  end
end
```



## 5 application_controller.rb

コントローラー

```
# ./app/controllers/application_controller.rb

class ApplicationController < ActionController::Base
  # ロケール振り分けを全てのアクションで実行
  around_action :switch_locale
  
  # params値のロケールによる振り分け
  def switch_locale(&action)
    locale = params[:locale] || I18n.default_locale
    I18n.with_locale(locale, &action)
  end

  # url_for関係メソッドでロケールを設定するよう上書き
  def default_url_options
    { locale: I18n.locale }
  end
end
```



# 設定完了

以上で、多言語化するための準備が完了しました。

試しに、rails serverをローカルで実行してから（起動中の場合は再起動が必要です）次のURLにアクセスしてみてください。

>https://www.foo.com/bar?locale=ja
>https://www.foo.com/bar?locale=en

エラーなく全てのページが表示されたなら、準備は完了です。

これ以後の作業は、次の通り（[Railsガイド I18n 第3節移行の部分](https://railsguides.jp/i18n.html#国際化とローカライズ)）です。

- View や Controllerなどの表示に関する部分を抽象化する（I18nのメソッドを用いる）
- 抽象化した部分の翻訳を作成する
- カスタマイズする

[Rails-I18nのGitHubリポジトリ](https://github.com/svenfuchs/rails-i18n/blob/master/rails/locale/ja.yml)に、日本語翻訳文のテンプレみたいなものが落ちているので、必要な方は自環境に導入してください。

お疲れさまでした！