環境
- rails 5.2
- ruby 2.5
方針
- できるだけ手軽に日英対応
概要
- 言語切り替えボタンをヘッダーに設置
- コントローラー内でセッション変数session[:locale]などにロケール情報を格納
- before_action で各ページ読み込み前に言語設定
- ymlファイルへ訳文記入
- Viewなどで使用
実装
1. 言語切り替えボタンをヘッダーに設置
簡単に切り替えができるようにヘッダーにボタン設置しました。
application.html.erb
ヘッダーに以下を設置
<% if session[:locale] == "en" || session[:locale].blank? %>
<%= link_to "/home/change_language/ja" do %>
日本語
<% end %>
<% elsif session[:locale] == "ja" %>
<%= link_to "/home/change_language/en" do %>
English
<% end %>
<% end %>
今回は日英のみ対応なので
- session[:locale]に"ja"が入っている場合は「English」
- session[:locale]に"en"が入っている場合は「日本語」
を表示するようにしました。
2. コントローラー内でsession変数格納
routes.rb
get "/home/change_language/:language" => "home#change_language"
home_controller.rb
def change_language
session[:locale] = params[:language]
redirect_back(fallback_location: "/")
end
3. 各ページ読み込み前にbefore_actionでI18nにlocale設定
before_action に設定することでどのページにアクセスしても先に言語情報が設定されます。
※ユーザーのログイン状態のようなにします
application.rb
before_action :set_locale
private
def set_locale
if %w(ja en).include?(session[:locale])
I18n.locale = session[:locale]
end
end
4. app>config>locales>
- ja.yml
- en.yml
に分けて訳文を記入しました。
例)英語はjaをenに変えるだけです。
ja.yml
ja:
#共通で使う言葉
dictionary:
words:
hello: "こんにちは"
activerecord:
#Model名
model:
user: "ユーザー"
#カラム名
attributes:
user_name: "ユーザーネーム"
password: "パスワード"
#viewごとに設定
users:
show:
profile: "プロフィール"
picture: "写真"
form:
required_field: "必須項目"
5. Viewなどで使用する
show.html.erb
<%= t("dictionary.words.hello") %> => こんにちは
<%= t("activerecord.attributes.user_name") %> => ユーザーネーム
# Viewがusers show の場合以下のように省略して記載可能
<%= t(".profile") %> => プロフィール
<%= t(".picture") %> => 写真
# カラム名を設定しておけばフォームヘルパーでも言語により自動で切り替え
<%= form_with scope: @user ,,,,,%>
<%= form.label :user_name %> =>ユーザーネーム
<% end %>
_form.html.erb
# パーシャルはアンダーバーを省き利用Viewがusers _form.html.erbの場合
<%= t(".required_field") %> => 必須項目
# このパーシャルがusers show.html.erbで利用されていたとしても
<%= t(".picture") %> => × これは利用できません。