チワワかわいいブログ

RUNTEQでrails勉強する日々の記録

2020/12/30 i18nによる日本語化

やること

rails-i18nと、手動でのファイル作成の2通りで日本語化する。
Ruby on Railsでは、デフォルトの言語設定が英語になっている。
configファイルの設定を変更しgem 'rails-i18n'を導入することで、言語設定を日本語に変更する。
また、gem 'rails-i18n'に含まれていない言葉をアプリケーション上で日本語表示にするため、辞書ファイル(ja.yml)を作成し読み込ませる。

configファイルの設定を変更する

config/application.rbに以下を追記。(アプリケーション全体の設定なのでこのファイル)

config.i18n.default_locale = :ja
gem 'rails-i18n'をインストールする

gemファイルに以下を追記し、bundle install

gem 'rails-i18n'

このgemを入れるとここに含まれるものは日本語に設定される。
早速実験

irb(main):002:0> user = User.new(last_name: "ryutaro")
=> #<User id: nil, email: nil, crypted_password: nil, salt: nil, last_name: "ryutaro", first_name: nil, created_at: nil, updated_at: nil>
irb(main):003:0> user.save
   (0.1ms)  begin transaction
  User Exists (0.1ms)  SELECT  1 AS one FROM "users" WHERE "users"."email" IS NULL LIMIT ?  [["LIMIT", 1]]
   (0.0ms)  rollback transaction
=> false
irb(main):004:0> user.errors
=> #<ActiveModel::Errors:0x00007fb8fb854038 @base=#<User id: nil, email: nil, crypted_password: nil, salt: nil, last_name: "ryutaro", first_name: nil, created_at: nil, updated_at: nil>, @messages={:password=><span style="color: #ff5252">["は3文字以上で入力してください"]</span>, :password_confirmation=>["を入力してください"], :first_name=>["を入力してください"], :email=>["を入力してください"]}, @details={:password=>[{:error=>:too_short, :count=>3}], :password_confirmation=>[{:error=>:blank}], :first_name=>[{:error=>:blank}], :email=>[{:error=>:blank}]}>

日本語になった!

辞書ファイルを作る

ja.ymlファイルをconfig/locales以下に作成する。
今回は、model用、view用に分けて2つ作成。
ja.ymlを作成したフォルダ名を起点に、ディレクトリごとにインテンドを入れて記述する。

ja:
  activerecord:
    models:
      user: ユーザー
    attributes:
      user: #インテンド一個下げる
        id: ID
        first_name: 名
        last_name: 姓
        email: メールアドレス
        crypted_password: パスワード
        password: パスワード
        password_confirmation: パスワード(確認用)
  attributes:
    created_at: 作成日
    updated_at: 更新日
configファイルの設定を変更する②

ja.ymlファイルが複数あるため、読み込みできるように設定を追記

config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}').to_s]
設定を反映する
viewの場合
<%= link_to t('login'), login_path %>

上位フォルダがある場合は
t('users.index.login')のように記載

<%= f.label :email, t('activerecord.attributes.user.email') %>

フォームのmodelに@userなどモデルのインスタンスを渡している場合
<%= f.label :email %>

モデルで使う場合

モデル名.human_attribute_name(:カラム名)

ActiveRecordのメソッドで、モデルごとに指定した属性名を取得できる。
モデル名と属性名を参照元を明示して国際化対応できるため、こちらで記述を行う方がいい。