i18nを使った日本語化
・i18nって?
ある言語を他の言語に翻訳してくれる機能
国際化(Internationalization)の略称
・デフォルトに日本語を設定するまでの手順
・rails-i18n gemのインストール
Gemfileに
gem 'rails-i18n', '~> 5.1' # For 5.0.x, 5.1.x and 5.2.x
を記述してbundle install
・デフォルトの言語設定
Railsではデフォルトでは英語をロケールとして扱っているので、デフォルトに日本語を設定したい場合は、config/application.rbに
config.i18n.default_locale = :ja
と指定する必要がある
ロケールファイルはconfig/locales以下に配置、この時、config/locales/defaults、 config/locales/models、config/locales/views のように使われる場所によってディレクトリを分類してそこにそれぞれのロケールファイルを配置した方がひとつにロケールファイルをまとめるより管理がしやすい。
ただこれだと、railsではデフォルトのローケルファイルの読み込みでは、ネストされたロケールファイルを読み込めないので、
config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}').to_s]
を記述することで訳文の読み込みのパスを設定することができる
今回モデルの日本語化の設定はconfig/locales/modelsに
ja: activerecord: models: user: 'ユーザー' # view側 : User.model_name.human = 'ユーザー' / t('activerecord.models.user')と同じ attributes: user: last_name: '姓' # view側: User.human_attribute_name :last_name => "姓" / t("activerecord.attributes.user.last_name")と同じ first_name: '名' email: 'メールアドレス' password: 'パスワード' password_confirmation: 'パスワード確認'
models以下のインデントに日本語化したいモデルを指定、attributes以下にモデルの属性を指定
この時、viewでform_withメソッドの引数にユーザーのモデルを渡しているとき(ユーザーの新規登録ページなど)は、Railsが勝手にlabelにロケールファイルの翻訳を適用してくれる
#users/new.html.erb <%= form_with(model:@user,local: true,) do |form| %> <div class="form-group"> <%= form.label :last_name %> <%= form.text_field :last_name,class: "form-control" %> </div> <div class="form-group"> <%= form.label :first_name %> <%= form.text_field :first_name,class: "form-control" %> </div> <div class="form-group"> <%= form.label :email %> <%= form.text_field :email,class: "form-control" %> </div> <div class="form-group"> <%= form.label :password %> <%= form.password_field :password,class: "form-control" %> </div> <div class="form-group"> <%= form.label :password_confirmation %> <%= form.password_field :password_confirmation,class: "form-control" %> </div> <%= form.submit (t 'defaults.register'), class: "btn btn-primary" %> <% end %>
また、引数にモデルを渡していない時(ユーザーログインページなど)は、label自身に直接翻訳を適用する必要がある
#user_sessions/new.html.erb <%= form_with url: login_path, method: :post, local: true do |form| %> <div class="form-group"> <%= form.label :email, User.human_attribute_name(:email) %> <%= form.text_field :email, class: "form-control" %> </div> <div class="form-group"> <%= form.label :password, User.human_attribute_name(:password) %> <%= form.password_field :password, class: "form-control" %> </div> <div class="actions"> <%= form.submit (t 'defaults.login'),class: "btn btn-primary" %> </div> <% end %>
viewの日本語化の設定はconfig/locales/viewsに
ja: defaults: login: 'ログイン' register: '登録' logout: 'ログアウト' users: new: signup: 'ユーザー登録' to_login_page: 'ログインページへ' user_sessions: new: login: 'ログイン' to_register_page: '登録ページへ' password_forget: 'パスワードをお忘れの方はこちら'
のように設定
lazy lookupとは?
Controllerやviewファイルのディレクトリの階層」を翻訳ファイルに設定する事で、Controllerやviewファイルの内部で参照するキーを短縮してアクセスする事が出来る仕組み
例えば、app/views/users/new.html.erbファイル内で<h1>ログインページへ</h1>
をロケールファイル(今回は上記のロケールファイル)を使って翻訳して記述したい場合、<h1><%= t('users.new.to_login_page') %></h1>
と記述するが、lazy lookup記法を使うことで、<h1><%= t('.to_login_page') %></h1>
と記述を省略できる。
参考文献
Rails 国際化 (i18n) API - Railsガイド