基礎編5

2021.3.11

i18nにより日本語化対応

参照サイト

https://qiita.com/shimadama/items/7e5c3d75c9a9f51abdd5

 

❶デフォルト言語の設定

デフォルト言語を英語から日本語に設定する為に、config/application.rbに↓を追加する。=config/locales/ja.ymlを読み込む宣言

module 〇〇
class Application < Rails::Application
 config.i18n.default_locale = :ja #この行追加
end

 

❷gem 'rails-i18n'をインストール

*❶のconfig.i18n.default_locale = :ja を設定しないと反映されないので注意!

*gemをインストールすることでhttps://github.com/svenfuchs/rails-i18n/blob/master/rails/locale/ja.yml に載っている一般的なメッセージについての日本語の国際か設定ファイルを参照するようになる。

→config/locales/ja.yml というファイルをローカルに作る必要がない。

(Gemfile)

gem 'rails-i18n', '~> 5.1'

このgemを導入すると、Railsを日本語で使う場合のデフォルトのロケールファイル(svenfuchs/rails-i18n)をダウンロードしなくても使えるようになる。

 

 

i18nの複数ロケールファイルが読み込まれるようにpathを通す。

(config/application.rb)

config.i18n.default_localle = :ja
#❶の分デフォルトのlocaleを日本語(:ja)にする
config.i18n.load_path += Dir[Rails.root.join('config/
locales/**/*.{rb,yml}').to_s] #追加

 

*❶と❷の

config.i18n.default_locale = :ja
config.i18n.load_path += Dir[Rails.root.join('config/locales/**/*.{rb,yml}').to_s]

を追加することによって、locale/ja.yml以外にモデルに関連する内容のみを記載する「locale/applicationrecord/ja.yml」やviewの表示のみの内容を記載する「locale/view/ja.yml」などi18nの定義ファイルを分けて設定可能

 

❹config/locales 以下にロケールファイルを配置する。地道に...(今回controllerは省略)

こんな構図になる

 

config

   |---locales

              |--activerecord

                    |--ja.yml       #modelは1つのファイルで管理

              |---views   #views関連のファイルはここで管理する今回は一括で管理

                     |--ja.yml

 

❺ja.ymlに日本語を設定する。

ビューはビューを格納しているフォルダ名を起点にし、ビュー毎に記述する。インデント(2space)でpathを制御している。

(config/locales/views/ja.yml)

ja:
users:
new:
#view側: <%= t(".last_name") %> =>"名前"と表示 (views/users/new.html.erbで)
title: ユーザー登録
last_name: 名前
first_name:
email: メールアドレス
password: パスワード
#view側: <%= t.("title") %> =>"詳細ページ"と表示 (views/users/index.html.erbで)
user_sessions:
title: 登録ページ
#引数の指定も可能。
#view側で t(.title), user.name みたいな感じで設定できる
edit:
title: '%{user_name}さんのユーザー情報を編集'

 

❻modelの日本語化を設定する。

モデルは全てactiverecord 以下に記述する。

これによりUser.model_name.humanでモデル名User.human_attribute_name({attr_name})アトリビュート名を取得可能。

(config/locales/model.ja.yml)

ja:
models:
#view側:User.model_name.human =>"ユーザー"が表示 (views/user以下で)
#↑t.("activerecord.models.user")と同じ
user: ユーザー
#modelごとに定義したいattributesを記述
attributes:
user:
id:ID
#view側: User.human_attribute_name :name =>"名前"が表示(views/user/以下で)
#↑t.("activerecord.attributes.user.first_name")と同じ
first_name: 名前
last_namr:
email: メールアドレス
crypted_password: パスワード
#全てのmodelで共通して使用するattributesを定義
#view側: User.human_attribute_name(:created_at)
=>作成日(views/以下で)
attributes:
created_at: 作成日
updated_at: 更新日
#submitはここに入力
helpers:
submit:
create: 登録
create_page: 登録ページへ
login: ログイン
login_page: ログインページへ

 

❻設定した日本語を表示させる

*登録フォームはform_with model: @userのようにmodelオプションにUserみ出るのインスタンスを設定しているので、「このフォームはユーザー用のフォームだな」とRailsが解釈して、翻訳までやってくれる。

*一方で、ログインフォームはform_withがあるものの、modelオプションを設定していないので、モデルと紐づいていないのでよしなに翻訳してくれない。この場合は、<%= f.label:email, User.human_attrubute_name(:email) %>のように明示的にテキストを渡す必要がある。

 

❼設定した日本語を表示させる

view

対応するビューの中ではツリーを省略可能。

<h1><%= t ('user_sessions.new.title') %></h1>

 

model

 t("activerecord.attributes.user.email")と同じ
%= f.label :email, User.human_attribute_name(:email) %>

 

 

<ポイント>

・app以下のコードやconfig/routes.rbなどのファィルは再起動せずに反映されるが、他のファイルは基本的にサーバーを起動し直す必要がある。

 

・国際化の際にはlazy lookupを使用する

ビューだけでなくコントローラーでも使えるので。

「Controllerやviewファイルのディレクトリの階層」を翻訳ファイルに設定する事で、Controllerやviewファイルの内部で参照するキーを短縮してアクセスする事が出来る仕組みのこと。
例えば、app/views/users/new.html.erbファイル内で<h1>ログイン</h1>を<h1><%= t('users.new.to_login_page') %></h1>と記述するところ、

<h1><%= t('.to_login_page') %></h1>と省略できる。

参照

https://railsguides.jp/i18n.html#%E6%8E%A2%E7%B4%A2%E3%81%AE%E3%80%8C%E9%81%85%E5%BB%B6%E3%80%8D%EF%BC%88lazy-lookup%EF%BC%89

 

・国際化の際には「human_attribute_name」や「Model.model_name.human」を使用する

モデル名と属性名を参照元を明示して国際化できるので

ja:
models:
user: ユーザー
attributes:
user:
first_name:
last_name:

User.model_name.humanは"ユーザー"を返す。

User.human_attribute_name("first_name")は"名"を返す。

参照

https://railsguides.jp/i18n.html#active-record%E3%83%A2%E3%83%87%E3%83%AB%E3%81%A7%E7%BF%BB%E8%A8%B3%E3%82%92%E8%A1%8C%E3%81%AA%E3%81%86