4
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Posted at

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

既存の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リポジトリに、日本語翻訳文のテンプレみたいなものが落ちているので、必要な方は自環境に導入してください。

お疲れさまでした!

4
6
0

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
  3. You can use dark theme
What you can do with signing up
4
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?