PFに言語切り替え機能を実装した時のメモ。
※日本語化対応は既に実装されていることを想定しています。
完成イメージ
実装と解説
言語切り替えはURLにパラメーターをつけることで切り替えます。
例えば日本語ならexapmle.com/?locale=ja
英語ならexapmle.com/?locale=en
みたいな感じです。
① application_controller
class ApplicationController < ActionController::Base
before_action :set_locale
def default_url_options
{ locale: I18n.locale }
end
private
def set_locale
I18n.locale = params[:locale] || I18n.default_locale
end
end
解説
class ApplicationController < ActionController::Base
before_action :set_locale
private
def set_locale
I18n.locale = params[:locale] || I18n.default_locale
end
end
set_locale
にはURLにパラメーターをつける処理を書いています。
具体的には、exapmle.com/?locale=ja
のようにURLにパラメータが付いているならそれを使い、なければデフォルトのパラメーターなしのURLを使うという処理です。
なぜapplication_controller.rb
のbefore_action
にset_locale
を指定しているのかというと、
application_controller.rb
は全てのcontrollerに継承されている。つまり全てのcontrollerの実行前にset_locale
が実行されるという仕組みです。
def default_url_options
{ locale: I18n.locale }
end
default_url_options
はデフォルトで必ず実行されるメソッドらしいので、
ここで書いているのはexapmle.com/?locale=ja
のようなパラメータをデフォルトの状態、つまり最初にサイトにアクセスしたときから付けるという処理です。
② 言語の.ymlファイルの作成
今回は日本語と英語で言語を切り替えるのでconfig/localesにja.ymlとen.ymlファイルを作成し各言語を記述していきます。
※今回は完成イメージのように検索ページのタイトル部分を変更することを想定しています。
ja:
events:
search-title: "イベントを探す"
en:
events:
search-title: "Search Event"
③ 該当箇所のHTMLを書き換え
今回言語切り替えがしたいイベントを探すの部分を書き換えていきます。
(変更前)
.title
%h2 イベントを探す
(変更後)
.title
%h2= I18n.t('events.search-title')
解説
I18n.t('events.search-title')
ここで先ほど作成したlocalesのファイルにあるeventsのsearch-titleの部分を指定しています。
言語切り替えボタンの作成
あとは言語切り替えのためのボタンを作って完成です。
ボタンは全ページに設置したいのでapp/views/layouts/aplication.html
の部分に記述します。
%lang.lang-container
- if I18n.locale == :en
= link_to '日本語', url_for(locale: :ja)
- else
= link_to 'English', url_for(locale: :en)
link_to
のurl_for
を使うことでパラメーターのみの変更が可能です。
これで完成。