【Rails】rails+devise+errorの日本語化の手順(rails-i18n)

# 実装すること

* railsの標準言語を日本語に設定する。
* deviseの日本語化(エラーやメッセージが日本語に変わる。)
* モデル名に関しても日本語で表示する。

github: https://github.com/svenfuchs/rails-i18n

#完成版
**[ログイン後のフラッシュメッセージ]**

|![スクリーンショット 2021-05-20 0.02.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1029483/00b5dcd7-83fb-cb1b-68c1-2e0e5b6cf44f.png)|
|:-:|

**[投稿時のエラーメッセージ]**

|![スクリーンショット 2021-05-20 0.49.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1029483/253b7ee4-ff3b-b8cd-8f24-a027fa5d2978.png)|
|:-:|


#環境

* Ruby : 2.6.3
* Rails : 5.2.5

# 前提

* devise機能実装済み。
* 投稿機能があれば、なお良い。(モデルに関しても日本語化するため)

```rb:schema.rb
ActiveRecord::Schema.define(version: 2021_03_08_102510) do
  create_table "users", force: :cascade do |t|
    t.string "email", default: "", null: false
    t.string "encrypted_password", default: "", null: false
    t.string "reset_password_token"
    t.datetime "reset_password_sent_at"
    t.datetime "remember_created_at"
    t.string "name"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.index ["email"], name: "index_users_on_email", unique: true
    t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true
  end

  create_table "books", force: :cascade do |t|
    t.text "title"
    t.string "image_id"
    t.text "body"
    t.integer "user_id"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end
```
# 手順

1. configファイルへの記述
2. gem 'rails-i18n'のインストール
3. deviseの日本語化設定
4. modelの日本語化設定

# 実装

###1. configファイルへの記述

configファイルにあるapplication.rbに下記を記述します。

```ruby:config/application.rb
config.i18n.default_locale = :ja
```

localeについては、こちらにて。

https://qiita.com/d0ne1s/items/89846ebe97c9114865ca

簡単にいうと、ソフトウェアの言語設定等を管理する場所。

つまり、そのデフォルトをja(japan)にします。と意味してます。

###2. gem 'rails-i18n'のインストール

まずは、gemをGemfileに記載します。

```rb:Gemfile
gem 'rails-i18n'
```
インストールします。

```terminal:terminal
$ bundle install
```

現状がどうなったか確認してみましょう。
おそらく下記になっているかと思います。

**[ログイン後のフラッシュメッセージ]**

|![スクリーンショット 2021-05-19 23.26.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1029483/167a1958-34be-39ba-2aa9-be698b606216.png)|
|:-:|

**[投稿時のエラーメッセージ]**

|![スクリーンショット 2021-05-19 23.51.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1029483/3f1adee5-4b7f-07bd-cbe1-d15bc054018b.png)|
|:-:|


ログイン後のフラッシュメッセージが日本語化になっていて、
投稿時のエラーメッセージが日本語になっていると思います。

これは、投稿時のエラーメッセージは deviseではなくrails自体の機能であるためです。
先ほどapplication.rbでrailsの標準言語を変更したためです。

また、表示されている日本語は下記のファイルで既に設定してあります。
gemをインストールしたことで表示が変わりました。

ja.yml: https://github.com/svenfuchs/rails-i18n/blob/master/rails/locale/ja.yml

残りは、**``devise``**と**``modelのカラム名``**の日本語設定です。

###3. deviseの日本語化設定

まずは、 deviseの日本語化設定から。
最初にconfig/locales/に**``devise.ja.yml``**を作成しましょう。

次に、下記のURLから中身をコピーして貼り付けます。
devise-i18n: https://github.com/tigrish/devise-i18n/blob/master/rails/locales/ja.yml


※ 一応、gem devise-i18を使用した実装方法もあります。

https://remonote.jp/rails-devise-i18n-locale-ja

参考例として書いておきます。長いので略してあります。

```yml:config/locales/devise.ja.yml
ja:
  activerecord:
    attributes:
      user:
        confirmation_sent_at: パスワード確認送信時刻
        confirmation_token: パスワード確認用トークン
        confirmed_at: パスワード確認時刻
        created_at: 作成日
        current_password: 現在のパスワード
        current_sign_in_at: 現在のログイン時刻
        current_sign_in_ip: 現在のログインIPアドレス
        email: Eメール

        ---省略---

        one: エラーが発生したため %{resource} は保存されませんでした。
        other: "%{count} 件のエラーが発生したため %{resource} は保存されませんでした。"
```
これにてdeviseの日本語化設定が完了しました。
確認すると、無事変更されていました。

|![スクリーンショット 2021-05-20 0.02.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1029483/c7cabfe5-9538-613e-e3d0-b35501493a81.png)|
|:-:|


###4. modelの日本語化設定

最後ににmodelの日本語化設定です。
deviseと同様にファイルを作成します。今回は、**``ja.yml``**と作成しましょう。
中身は、下記のように記述していきます。

```:config/locales/ja.yml
ja:
  activerecord:
    models:
　　　　モデル名： 日本語
    attributes:
      モデル名：
　　　　　カラム名：　日本語
　　　　　カラム名：　日本語
```
最終的にはこの様になります。
入力の際には、**``全角スペースを入力しうない様に気をつけましょう。``**

```yml:config/locales/ja.yml
ja:
  activerecord:
    models:
      book: 本
    attributes:
       book:
         title: タイトル
         body: 詳細内容  
```

確認してみましょう。日本語に変わっているかと思います。

|![スクリーンショット 2021-05-20 0.49.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1029483/c2649796-2b86-9c3b-ef92-513c6fc93a69.png)|
|:-:|

# 補足

もし、2件のエラーが、、、、の部分が変わっていないのであれば、
viewで　deviseのエラーメッセージを使っていないからだと思われます。

私はviewを参考例として載せておきます。

```erb:views/books/index.html.erb
<%= render "devise/shared/error_messages", resource: @book %>
```

これで日本語化されるかと思います。

以上です。