Ruby
Rails
I18n
初心者
RubyOnRails

[初学者]Railsのi18nによる日本語化対応


目的


  • 日本語化対応した時のメモ

  • 今後、railsを学ぶ方に向けての参考に役立てる。


条件


  • ruby 2.5.1

  • Rails 5.0.7


リスト


  1. デフォルトの言語を日本語に設定する

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

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


  4. config/locales以下にロケールファイルを配置

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

  6. 設定した日本を表示させる

  7. 様々な記述方法


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

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

end
end



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


Gemfile

# rails5系なら以下を記述

gem 'rails-i18n', '~> 5.1' # For 5.0.x, 5.1.x and 5.2.x

# rails4系なら以下を記述
gem 'rails-i18n', '~> 4.0' # For 4.0.x


上記のgemを導入することによって、

Railsを日本語で使う場合のデフォルトのロケールファイルを「svenfuchs/rails-i18n」をダウンロードしなくても使えるようになります。


1 の作業config.i18n.default_locale = :ja を設定しないと反映されないので設定必須!


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


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
config.i18n.default_locale = :ja # デフォルトのlocaleを日本語(:ja)にする

# # 以下の記述を追記する(設定必須)
config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}').to_s]

end
end


上記を記述することによって、複数のローケルファイルが読み込まれるようになった


4. config/locales以下にロケールファイルを配置

次に、views / modelによってロケールファイルを分けます。(今回controllerは省略)


ファイル構造(例)

config

└── locales
├── model.ja.yml # modelは1つのファイルで管理します。
└── views # views関連のファイルはここで管理する
├── admin
│ ├── dashboards
│ │ └── ja.yml
│ ├── ja.yml
│ ├── user_sessions
│ │ └── ja.yml
│ └── users
│ └── ja.yml
├── boards
│ └── ja.yml
├── dashboards
│ └── ja.yml
├── password_resets
│ └── ja.yml
├── shared
│ └── ja.yml
├── user_sessions
│ └── ja.yml
└── users
└── ja.yml


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


viewsの日本語化を設定する


config/locales/views/users/ja.yml


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

ja:
users:
index:
title: 'ユーザ一覧'
show:
title: '%{user_name}さんのユーザ情報' # 引数の指定もできる。
edit:
title: '%{user_name}さんのユーザ情報を編集' # view側で t(.titile), user_name: @user.name みたいな感じで設定できる



modelの日本語化を設定する


config/locales/model.ja.yml


# モデルは全て activerecord 以下に記述する。
# これにより、User.model_name.human / User.human_attribute_name({attr_name})で使用可能。

ja:
activerecord:
models:
user: ユーザー # view側: User.model_name.human => "ユーザ" / t("activerecord.models.user")と同じ
board: 掲示板
attributes:
user:
id: ID
first_name: 名前 # view側: User.human_attribute_name :name => "名前" / t("activerecord.attributes.user.name")と同じ
last_name:
email: メールアドレス
file: プロフィール画像
crypted_password: パスワード
created_at: 作成日
updated_at: 更新日



6. 設定した日本を表示させる


app/views/users/index.html.erb


#### viewで使う場合

# 対応するビューの中ではツリーを省略できる。
# 「ユーザ一覧」が表示される(users.index.titleを参照)
<%= t '.title' %>

# 省略しない記述は以下のようになる。
# 「ユーザ一覧」が表示される
<%= t 'users.index.title' %>

-----------------------------------------------

#### modelで使う場合

# 「ユーザー」が表示される。(activerecord.models.userを参照)
<li><%= User.model_name.human %></li>

# 「ID」が表示される。(activerecord.attributes.user.idを参照)
<li><%= User.human_attribute_name(:id) %></li>

# 「メールアドレス」が表示される。(activerecord.attributes.user.emailを参照)
<li><%= User.human_attribute_name(:email) %></li>



7. 様々な記述方法


ja.yml


# 全ファイル共通の使いまわす可能性のあるワードは dictionary を起点にする。
ja:
dictionary:
messages:
hello_user: 'こんにちは%{user_name}さん'
words:
user: &user 'ユーザ情報' # &user はエイリアスで *user で参照できる。(同一ファイル内のみ有効)
user_copy: *user # ユーザ情報' となる。


ja.yml


# ヘルパー関数はhelpersを起点にする。
# ヘルパー関数内で tメソッドを使用すると、呼び出し元のビューに基づいたパスが呼び出される。
# 例えばusersのshowから呼ばれたヘルパー関数内で t('.hoge') を実行した場合 users.show.hoge が参照される。
# 呼び出し元によって文言を変えたい場合はビュー側に記述する。(そんなことあるかわからないけど。)

ja:
helpers:
user:
welcome: 'ようこそ!'



ja.yml

# グローバルな感じのエラーはerrorsを起点にする。

ja:
errors:
nanikore_error: 'よくわからないけど例外です。'


ja.yml

# flashのi18nの設定方法

ja:
flash:
new: 作成しました!
updated: 更新しました!
failed: 失敗しました!
destroy: 削除しました!
login: ログインしました!
logout: ログアウトしました!
limited_access: 不正な侵入です!!
tag_follow: タグをフォローしました!
tag_not_follow: タグをフォローできませんでした。
tag_remove_follow: タグのフォローを解除しました!



参考

Rails国際化 (I18n) API

Ruby on RailsのI18nで使用する名前空間に関してのまとめと、ベストプラクティスの検討。 - 波打際のブログさん