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