Railsのi18n対応

i18nとは

Internationalization、日本語で言う国際化のこと iとnの間が18文字だからこう言うそう。

参考にさせていただいた記事

qiita.com

qiita.com

alfa.hatenablog.jp

rails3try.blogspot.com

実際にやったこと

1 デフォルトの言語を日本語に設定する config/application.rbを下記のようにする

require_relative 'boot'
require 'rails/all'

Bundler.require(*Rails.groups)

module BoardApp
  class Application < Rails::Application
    config.time_zone = 'Tokyo' ★
    config.active_record.default_timezone = :local

 # アプリケーションが対応している言語のホワイトリスト(ja = 日本語, en = 英語)
    config.i18n.available_locales = %i(ja en)

   # 言語ファイルを階層ごとに設定するための記述 ※
    config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}').to_s] 

  # 上記の対応言語以外の言語が指定された場合、エラーとするかの設定(今回は書かなかった)
    config.i18n.enforce_available_locales = true

    # 以下の記述を追記する(設定必須)
    # デフォルトのlocaleを日本語(:ja)にする
    config.i18n.default_locale = :ja

  end
end
  • コメントアウトになっている部分を#消して有効にした。
  • ★部分…これ記述したらrails sでエラーになりました。確かTOKYOにする前はデフォルトでカナダ?とかになってた気がする。消しても問題なかったですが、コメントアウトがいいかなと思います。

2 gem 'rails-i18n'をインストール $ gem install rails-i18n

Gemfileに以下を記述

gem 'rails-i18n'

$ bundle install

3 辞書になるファイルを作成する config/localesに多言語設定ファイル(*.yml)を配置する。

locales

├── en.yml

├── ja.yml

└── translation_ja.yml

モデルごとに置くこともできるみたいだけど、よくわからず一個だけ置きました😇 中身はこんな感じ(ja.yml)

ja:
 view: 
    name: '名前'
    age: '年齢'
  

en.ymlはこれの英語バージョン

4 HTMLに埋め込む t('view.name')

完成🥰

5 動的に切り替える controller/application_controller.rbに以下を設定

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

上記設定を入れることで、localeを動的に変更します。

config/routes.rbに以下を追記

Rails.application.routes.draw do
  scope '(:locale)', locale: /#{I18n.available_locales.map(&:to_s).join('|')}/ do
    # For details on the DSL available within this file, see 
    resources :resource_As
  end
end

動的多言語対応するアクションをscopeで囲むと[domain]/ja/hogehoge/といった記述で表示する言語をパラメタとしてアクションに渡すことができます。渡されたパラメタは、application_controller.rb内で、判断され、対応言語の場合はその言語で画面描画します。(あんまりよくわかってない)

以上!備忘録でした〜🌈