LoginSignup
1
4

More than 3 years have passed since last update.

Ruby on Rails 日英対応 i18n

Last updated at Posted at 2020-05-30

環境

  • rails 5.2
  • ruby 2.5

方針

  • できるだけ手軽に日英対応

概要

  1. 言語切り替えボタンをヘッダーに設置
  2. コントローラー内でセッション変数session[:locale]などにロケール情報を格納
  3. before_action で各ページ読み込み前に言語設定
  4. ymlファイルへ訳文記入
  5. 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") %>  => × これは利用できません。
1
4
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
1
4