【Rails7】エラーメッセージを日本語化する

Railsでエラーメッセージを表示しようとすると、デフォルトでは英語設定になっているため、このように英語でエラーメッセージが表示されてしまう。

これを日本語化する方法について書き残しておこうと思います。

目次

エラーメッセージを日本語化する流れ

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

まずは、デフォルトの言語を日本語に設定します。

設定はconfig/application.rbに以下の1行を追記します。

config.i18n.default_locale = :ja

ついでに、タイムゾーンも設定もしておくといいでしょう(デフォルトではUS & Canadaになっている)。

config.i18n.default_locale = :ja
# 追記
config.time_zone = "Tokyo" 
config.active_record.default_timezone = :local 

これでデフォルトの言語は日本語になりました。

続いては、日本語の翻訳ファイルを作成します。

日本語化の翻訳ファイルを作成する

config/localesja.ymlファイルを新規作成し、下記の内容をコピーします。

ja:
  activerecord:
    errors:
      messages:
        record_invalid: 'バリデーションに失敗しました: %{errors}'
        restrict_dependent_destroy:
          has_one: "%{record}が存在しているので削除できません"
          has_many: "%{record}が存在しているので削除できません"
  date:
    abbr_day_names:
    - 日
    - 月
    - 火
    - 水
    - 木
    - 金
    - 土
    abbr_month_names:
    -
    - 1月
    - 2月
    - 3月
    - 4月
    - 5月
    - 6月
    - 7月
    - 8月
    - 9月
    - 10月
    - 11月
    - 12月
    day_names:
    - 日曜日
    - 月曜日
    - 火曜日
    - 水曜日
    - 木曜日
    - 金曜日
    - 土曜日
    formats:
      default: "%Y/%m/%d"
      long: "%Y年%m月%d日(%a)"
      short: "%m/%d"
    month_names:
    -
    - 1月
    - 2月
    - 3月
    - 4月
    - 5月
    - 6月
    - 7月
    - 8月
    - 9月
    - 10月
    - 11月
    - 12月
    order:
    - :year
    - :month
    - :day
  datetime:
    distance_in_words:
      about_x_hours:
        one: 約1時間
        other: 約%{count}時間
      about_x_months:
        one: 約1ヶ月
        other: 約%{count}ヶ月
      about_x_years:
        one: 約1年
        other: 約%{count}年
      almost_x_years:
        one: 1年弱
        other: "%{count}年弱"
      half_a_minute: 30秒前後
      less_than_x_seconds:
        one: 1秒以内
        other: "%{count}秒未満"
      less_than_x_minutes:
        one: 1分以内
        other: "%{count}分未満"
      over_x_years:
        one: 1年以上
        other: "%{count}年以上"
      x_seconds:
        one: 1秒
        other: "%{count}秒"
      x_minutes:
        one: 1分
        other: "%{count}分"
      x_days:
        one: 1日
        other: "%{count}日"
      x_months:
        one: 1ヶ月
        other: "%{count}ヶ月"
      x_years:
        one: 1年
        other: "%{count}年"
    prompts:
      second: 秒
      minute: 分
      hour: 時
      day: 日
      month: 月
      year: 年
  errors:
    format: "%{attribute}%{message}"
    messages:
      accepted: を受諾してください
      blank: を入力してください
      confirmation: と%{attribute}の入力が一致しません
      empty: を入力してください
      equal_to: は%{count}にしてください
      even: は偶数にしてください
      exclusion: は予約されています
      greater_than: は%{count}より大きい値にしてください
      greater_than_or_equal_to: は%{count}以上の値にしてください
      inclusion: は一覧にありません
      invalid: は不正な値です
      less_than: は%{count}より小さい値にしてください
      less_than_or_equal_to: は%{count}以下の値にしてください
      model_invalid: 'バリデーションに失敗しました: %{errors}'
      not_a_number: は数値で入力してください
      not_an_integer: は整数で入力してください
      odd: は奇数にしてください
      other_than: は%{count}以外の値にしてください
      present: は入力しないでください
      required: を入力してください
      taken: はすでに存在します
      too_long: は%{count}文字以内で入力してください
      too_short: は%{count}文字以上で入力してください
      wrong_length: は%{count}文字で入力してください
    template:
      body: 次の項目を確認してください
      header:
        one: "%{model}にエラーが発生しました"
        other: "%{model}に%{count}個のエラーが発生しました"
  helpers:
    select:
      prompt: 選択してください
    submit:
      create: 登録する
      submit: 保存する
      update: 更新する
  number:
    currency:
      format:
        delimiter: ","
        format: "%n%u"
        precision: 0
        separator: "."
        significant: false
        strip_insignificant_zeros: false
        unit: 円
    format:
      delimiter: ","
      precision: 3
      separator: "."
      significant: false
      strip_insignificant_zeros: false
    human:
      decimal_units:
        format: "%n %u"
        units:
          billion: 十億
          million: 百万
          quadrillion: 千兆
          thousand: 千
          trillion: 兆
          unit: ''
      format:
        delimiter: ''
        precision: 3
        significant: true
        strip_insignificant_zeros: true
      storage_units:
        format: "%n%u"
        units:
          byte: バイト
          eb: EB
          gb: GB
          kb: KB
          mb: MB
          pb: PB
          tb: TB
    percentage:
      format:
        delimiter: ''
        format: "%n%"
    precision:
      format:
        delimiter: ''
  support:
    array:
      last_word_connector: "、"
      two_words_connector: "、"
      words_connector: "、"
  time:
    am: 午前
    formats:
      default: "%Y年%m月%d日" #"(%a)%H時%M分%S秒 %z"
      long: "%Y/%m/%d %H:%M"
      short: "%m/%d %H:%M"
    pm: 午後

これで、エラーメッセージが日本語化されるはずです。

日本語化される前のエラーメッセージと比較してみましょう。

英語のエラーメッセージが日本語化されていることがわかります。(タイトルと「3 error prohibited …」の部分はテンプレートファイルを編集し、日本語に書き換えればOKです)

ボタンも「Create User」から「登録する」に変わっていますね。

ただ、NameEmailなどのテーブルのカラム名が日本語化されていません。

テーブルのカラム名の翻訳も先ほどのja.ymlに追記しても良いんですが、行数が多くメンテナンスが大変になるので、カラム名の翻訳は別途ファイルを作成します。

テーブルカラム用の翻訳ファイルを別途作成する

同じくconfig/localesmodels.ja.ymlファイルを新規作成します。

~ja.ymlが含まれていれば、ファイル名はなんでもOKです)

作成したら下記の内容を参考に翻訳ファイルを作成します。

article, user, categoryモデルを作成した場合の例)

ja:
  activerecord:
    models:
      article: 投稿
      user: ユーザー
      category: カテゴリー
    attributes:
      article:
        id: ID
        title: タイトル
        description: 本文
        created_at: 投稿日
        updated_at: 更新日
      user:
        id: ID
        name: ユーザー名
        email: メールアドレス
        password: パスワード
        created_at: 作成日
        updated_at: 更新日
      category:
        id: ID
        name: カテゴリー名

上記のmodels:の下層にモデルのカラム名とその翻訳を、attributes:の下層に翻訳するモデル名、およびモデル名の下層にカラム名とその翻訳を記述します。

モデル名やカラム名は必要に応じて書き換えてください。

保存したらrailsサーバーを再起動し、エラーメッセージが日本語化されていることを確認します。

これで無事に日本語化できました。

めでたしめでたし。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

愛知の34歳。無職で暇になり始めたプログラミング(Ruby on Rails)の忘備録をまとめたブログです。最近は別にやりたいことができたのでプログラミングほぼやっていません。気が向いたらまた再開するかも。僕の日常はメインブログの方で更新しています。

コメント

コメントする

目次