見出し画像

【Rails】 多言語化対応

多言語化の導入

Gemfile 

# rails-i18n
gem 'rails-i18n'

でインストール

terminal

$ bundle install

config/application.rb
config/application.rbに設定情報を追加します。

module Habilidad
 class Application < Rails::Application
...
   # 言語ファイルを階層ごとに設定するための記述
   config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}').to_s]
   # アプリケーションが対応している言語のホワイトリスト(ja = 日本語, en = 英語)
   config.i18n.available_locales = %i(ja en)
   # 上記の対応言語以外の言語が指定された場合、エラーとするかの設定
   config.i18n.enforce_available_locales = true
   # デフォルトの言語設定
   # config.i18n.default_locale = :en
   config.i18n.default_locale = :ja
...
 end
end


config/locales
config/localesに多言語設定ファイル(*.yml)を配置する。

config.i18n.load_pathの設定で、階層的に設定ファイルを管理することができる。ちなみに作成中のアプリはこんな感じ

config/locales
/my_application/config/locales
|--defaults          ## 共通系
|  |--en.yml
|  |--ja.yml
|--models            ## モデル系
|  |--model_name_A   ## 各モデルのディレクトリ
|  |  |--en.yml
|  |  |--ja.yml
|  |--model_name_B
|  |  |--en.yml
|  |  |--ja.yml
|--views             ## ビュー系
|  |--view_name_A    ## 各ビューのディレクトリ
|  |  |--en.yml
|  |  |--ja.yml
|  |--view_name_B
|  |  |--en.yml
|  |  |--ja.yml

こうしてモデルごと画面ごとに多言語設定ファイルを管理できるので、複数人で開発していても問題が起こりにくい。

viewもindex.ja.ymlなど画面単位でも切り分けられるのですが、流石に冗長すぎると感じたので、私は採用していません。(複雑になったら採用するかもしれませんが)

.yml
ファイル名は対応言語。
こちらを参考に作成しました。

default/ja.yml

default/ja.yml

ja:                              ## 言語名
 dictionary:                    ## 共通系であることを示す
   title:                       ## 画面のタイトル
     create: "新規作成"
     update: "更新"
     destory:
       confirm: "削除確認"
   message:                     ## 固定メッセージ
     create:
       complete: "登録しました"
     update:
       complete: "更新しました"
     destory:
       confirm: "削除しますか?"
   button:                      ## 表示するボタン
     create: "新規作成"
     search: "検索"
     clear: "クリア"
     update: "更新"
     destory: "削除"
     cancel: "キャンセル"
 time:                          ## 表示する時間の形式
   formats:
     default: ! "%Y-%m-%d %H:%M:%S"

models/model_name_A/ja.yml


ja:
 activerecord:                 ## モデルの開始はactiverecord
   models:                     ## モデル
     model_name_A: "モデルA"
   attributes:                 ## 属性(カラム)
     model_name_A:
       id: "ID"
       name: "名称"
       created_at: "登録日時"
       updated_at: "更新日時"
views/view_name_A/ja.yml
ja:
 view_name_A:
   index:
     title: "画面A"

埋め込み


viewに埋め込みます。
呼び出し方は以下のような感じ

ruby

## モデル
$ Model_name_A.model_name.human
=> モデルA
$ Model_name_A.human_attribute_name(:name)
=> 名称
## ロケール指定
$ t('dictionary.button.search')
=> 検索
$ t('view_name_A.index.title')
=> 画面A
## フォーマット
$ l(model_name_A.created_at, format: :default)
=> 2019-01-01

以上のようにすると、config/application.rbで設定した、言語に応じて.ymlで設定した文言を表示します。

動的に切り替える


今までは、都度設定ファイルの言語を更新することで言語を変更してきましたが、動的に切り替えるためるための方法を説明します。

controller/application_controller.rb

class ApplicationController < ActionController::Base
   before_action :set_locale
   def set_locale
       I18n.locale = locale
   end
   def locale
       @locale ||= params[:locale] ||= I18n.default_locale
   end
   def default_url_options(options={})
       options.merge(locale: locale)
   end
end


上記設定を入れることで、localeを動的に変更します。

config/routes.rb

Rails.application.routes.draw do
 scope '(:locale)', locale: /#{I18n.available_locales.map(&:to_s).join('|')}/ do
   # For details on the DSL available within this file, see 
   resources :resource_As
 end
end


動的多言語対応するアクションをscopeで囲むと[domain]/ja/hogehoge/といった記述で表示する言語をパラメタとしてアクションに渡すことができます。渡されたパラメタは、application_controller.rb内で、判断され、対応言語の場合はその言語で画面描画します。

jaを指定すると日本語に、enを指定すると英語に表示を切り替えることができます!

参考

https://qiita.com/tsunemiso/items/bedc7593c7ccd05c395b


この記事が気に入ったらサポートをしてみませんか?