🗂

Rails 多言語化対応 View編

2023/09/14に公開

はじめに

このグローバル社会!
開発するサービスによっては多言語化対応が必要になりますよね?
今回自社の開発で多言語化対応をしたので簡単ではありますが導入を紹介します。

Model編はこちら↓
Rails 多言語化対応 Model編

参考サイト

以下のサイトを参考にしました。
記事を読む前に一読お願いします。

before_action以外

i18nについて
特にこの2つ
i18nのベーシックな使い方
辞書ファイルを分割して管理をしやすくする

before_action

Ruby on Railsで言語切り替え機能を作る

実装

config

config/application.rbにデフォルトの言語と複数のロケールファイルを読み込む設定を記述します。

config/application.rb
module TestProject
  class Application < Rails::Application
    # Settings in config/environments/* take precedence over those specified here.
    # Application configuration should go into files in config/initializers
    # -- all .rb files in that directory are automatically loaded.
    config.i18n.default_locale = :ja
    config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}').to_s]
  end
end

before_action

controller/application_controller.rbにbefore_actionとして、localeの指定があった場合変更する処理を書きます。
ログイン情報と一緒にlocale情報を持っておいてページを読み込むたびにチェックするイメージです。

controller/application_controller.rb
class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception
  
  before_action :set_locale

  def set_locale
    I18n.locale = locale
  end

  def locale
    # ここで言語の切り替えを行う
    @locale ||= params[:locale] || I18n.default_locale
  end
end

dictionary

1つのファイルに全文言をかくと意味不明状態になるので、
参考サイトに倣って然るべき場所に然るべきファイルを作成し文言を記述していきます。
今回はbrandのviewで使いたかったので

  • config/locales/views/brands/ja.yml
  • config/locales/views/brands/en.yml

を作成しています。

config/locales/views/brands/ja.yml
ja:
  brand_index_title: "ブランド一覧"
config/locales/views/brands/en.yml
en:
  brand_index_title: "Brand List"

これ以外にも階層を持った書き方もできたりします。
詳しくは調べてください。

view

書き方はいろいろありますが、階層を持たない場合はこれで統一してください。
(この例にはslimを使用しています)

view/brands/index.rb
h1 = t(:brand_index_title)

結果

locale = :jaの場合

locale = :enの場合

補足

今回はviewでの利用方法でしたが、modelでも利用することになります。
(validのエラーメッセージで使うはず)

Discussion