LoginSignup
2
7

More than 5 years have passed since last update.

【Ruby on Rails】Railsの日本語化対応

Last updated at Posted at 2019-03-22

Railsで日本語でenumを使うところまでのメモ。

まずは基本的な設定から

config\initializersにlocale.rbを作成し、以下を記述。

config\initializers\locale.rb
Rails.application.config.i18n.default_locale = :ja

下記URLから日本語化用のja.ymlをダウンロードし、config\localesに置く。
https://github.com/svenfuchs/rails-i18n/blob/master/rails/locale/ja.yml

deviseを使う場合はこちらもダウンロードして、config\localesに置いておくと便利。
http://qiita.com/MasatoYoshioka@github/items/8d910e793e7c485403bb

これで基本的なフォームのラベルやエラーメッセージは日本語に対応することができる。

ja.ymlの編集

日本語に対応する部分を編集する。

config\locales\ja.yml
---
ja:
  activerecord:
    errors:
      messages:
        record_invalid: 'バリデーションに失敗しました: %{errors}'
        restrict_dependent_destroy:
          has_one: "%{record}が存在しているので削除できません"
          has_many: "%{record}が存在しているので削除できません"
    attributes:
      user:
        name: 名前
        email: メールアドレス
        birth_date: 年齢
        sex: 性別
        school: 学校名
        admin: 管理者権限
        password: パスワード
        password_confirmation: パスワード(確認)
        created_at: 登録日時
        updated_at: 更新日時
        remember_me: ログインを記憶する

attributeの後に日本語に対応した部分を記述する。ここではUserモデルに対して追加した。

こうすることで以下のように使える。(コンソールで実行)

irb(main):001:0> User.human_attribute_name(:name)
=> "名前"
irb(main):002:0> User.human_attribute_name(:email)
=> "メールアドレス"

こんな使い方もできる。

irb(main):003:0> Time.now.to_s(:ja)
=> "2019年03月22日 19時13分"

enumの日本語化対応

まずenumの設定

今回は性別をenumで管理する場合を考える。
以下のマイグレーションを実行。

class AddColumnUsers < ActiveRecord::Migration[5.1]
  def change
    add_column :users, :sex, :integer
  end
end

性別をenumで管理するための設定を追加する。

User.rb
class User < ApplicationRecord
  enum sex: { woman: 0, man: 1 }
end

enumを簡単に日本語化できるgemがあるのでGemfileに以下を追加してbundle。

gem 'enum_help'

これで以下のように日本語でenumから値を取り出せる。

irb(main):004:0> User.last.sex_i18n
  User Load (1.0ms)  SELECT  "users".* FROM "users" ORDER BY "users"."id" DESC LIMIT $1  [["LIMIT", 1]]
=> "女性"

enumで扱う値はselectboxを使うことが多いため、formでは以下のようにmapを使うと簡単に実装できる。(sexesのように複数形になることに注意)

edit.html.slim
    = f.select :sex, User.sexes_i18n.keys.map {|k| [User.sexes_i18n[k], k]}, {}, autofocus: true
    = f.label :school

enum_select.png

最後に

多言語化対応しない場合でも、ラベルも日本語で直接書くよりも常にhuman_attribute_name等を使った方が後々ja.ymlだけを編集すればよくなるので楽かも。

2
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
7