rails6 パラメーターで表示する言語を切り替える

rails6 パラメーターで表示する言語を切り替える

rails6でrails-i18nを使用して、パラメーターで表示する言語を切り替えて多言語対応を行うまでの手順を記述してます。Railsのバージョンは6.1.1を使用してます。

環境

  • OS CentOS Linux release 7.9.2009 (Core)
  • Ruby 2.7.2
  • Rails 6.1.1
  • rbenv 1.1.2-40-g62d7798

rails-i18nインストール

Gemfileに以下を追加して、

gem "rails-i18n"

rails-i18nをインストールを実行します。

bundle install

言語切り替え

まず言語を切り替えるため「config/locales」配下に「ja.yml」という名前でファイルを以下の内容で作成します。

ja:
  disp:
    index:
      title: ユーザ一覧

同じ階層にある「en.yml」も編集しておきます。

en:
  disp:
    index:
      title: User list

次に「config」配下にある「application.rb」に以下を追加します。

# 言語ファイルのパス
I18n.load_path += Dir[Rails.root.join("config/locales/*.{rb,yml}")]

# 使用する言語ファイル
config.i18n.available_locales = %i(ja en)

# 言語ファイルがない場合はエラーを出すか
config.i18n.enforce_available_locales = true

# デフォルトの言語
config.i18n.default_locale = :ja

「app/controllers」配下にある「application_controller.rb」に以下の関数を追加して、「locale」パラメーターにより言語を切り替えられるようにします。

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

「config」配下の「routes.rb」も対象のページを以下のように、scopeで囲みます。

scope "(:locale)", locale: /#{I18n.available_locales.map(&:to_s).join("|")}/ do
  get "disp", to: "disp#index"
end

これでrailsを再起動すれば、言語の切り替えを行うことが可能です。

Viewで表示

viewで利用する場合は、以下のコードを追加します。

<%= t(".title") %>

表示結果「http://localhost/disp」

切り替える場合は、URLにパラメーター
「http://localhost/disp?locale=en」を追加します。