0
2

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

PFに言語切り替え機能を実装した時のメモ。
※日本語化対応は既に実装されていることを想定しています。

完成イメージ

言語切り替え.gif

実装と解説

言語切り替えはURLにパラメーターをつけることで切り替えます。
例えば日本語ならexapmle.com/?locale=ja英語ならexapmle.com/?locale=enみたいな感じです。

① application_controller

app/controllers/application_controller.rb
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

解説

app/controllers/application_controller.rb
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.rbbefore_actionset_localeを指定しているのかというと、
application_controller.rbは全てのcontrollerに継承されている。つまり全てのcontrollerの実行前にset_localeが実行されるという仕組みです。

app/controllers/application_controller.rb
  def default_url_options
    { locale: I18n.locale }
  end

default_url_optionsはデフォルトで必ず実行されるメソッドらしいので、
ここで書いているのはexapmle.com/?locale=jaのようなパラメータをデフォルトの状態、つまり最初にサイトにアクセスしたときから付けるという処理です。

② 言語の.ymlファイルの作成

今回は日本語と英語で言語を切り替えるのでconfig/localesにja.ymlとen.ymlファイルを作成し各言語を記述していきます。
※今回は完成イメージのように検索ページのタイトル部分を変更することを想定しています。

config/locales/events.ja.yml
ja:
  events:
    search-title: "イベントを探す"
config/locales/events.en.yml
en:
  events:
    search-title: "Search Event"

③ 該当箇所のHTMLを書き換え

今回言語切り替えがしたいイベントを探すの部分を書き換えていきます。

(変更前)

app/views
.title
  %h2 イベントを探す

(変更後)

app/views
.title
  %h2= I18n.t('events.search-title')

解説

I18n.t('events.search-title')

ここで先ほど作成したlocalesのファイルにあるeventsのsearch-titleの部分を指定しています。

言語切り替えボタンの作成

あとは言語切り替えのためのボタンを作って完成です。
ボタンは全ページに設置したいのでapp/views/layouts/aplication.htmlの部分に記述します。

app/views/layouts/aplication.html.haml
%lang.lang-container
  - if I18n.locale == :en
    = link_to '日本語', url_for(locale: :ja)
  - else
    = link_to 'English', url_for(locale: :en)

link_tourl_forを使うことでパラメーターのみの変更が可能です。

これで完成。

0
2
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
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?