LoginSignup
5

More than 1 year has passed since last update.

posted at

Organization

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

こんにちは、ペーパーエンジニアのよしこです。

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

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

基本的にRailsガイドのRails 国際化 (i18n) APIに沿った内容です。

今回は、

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を実行します。

設定の書き込み

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

  • ./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節移行の部分)です。

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

Rails-I18nのGitHubリポジトリに、日本語翻訳文のテンプレみたいなものが落ちているので、必要な方は自環境に導入してください。

お疲れさまでした!

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
5