こんにちは、ペーパーエンジニアのよしこです。
既存のRailsアプリを国際化アプリにレベルアップ(ローカライズ/多言語化)させたい!
Railsアプリ標準のエラーメッセージが英語だから日本語化したい!
ということでRails I18nを用いて多言語化に対応するための準備を行います。
基本的にRailsガイドのRails 国際化 (i18n) APIに沿った内容です。
今回は、
という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
※ 書き込みファイルと設定内容は、翻訳先の言語をどこから引っ張ってくるかによって変わります。
今回は、このような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リポジトリに、日本語翻訳文のテンプレみたいなものが落ちているので、必要な方は自環境に導入してください。
お疲れさまでした!