【Rails】i18nのja.ymlを分割する理由について

# はじめに
現在プログラミングスクールRUNTEQに通う初学者です。
Ruby on Railsで日本語対応について学習をしている中で、英語情報を日本語に翻訳できるのはとても便利だなと思った一方で、「どこのファイルに翻訳情報を書けばいいんだ？」と悩んだことがあったので、このテーマについて書くことにしました。

（**こうやって一つ一つ理解していくことで学習がワクワクしますね！（今年のテーマ回収）**）

もし間違いや改善点があれば教えていただけると幸いです。

## 対象読者
* Railsのi18nで翻訳情報をどこに書けばいいのか迷ったことのある方

## そもそもi18nとは？
Railsガイドではi18nを以下のように表現しています。[該当箇所のリンク](https://railsguides.jp/i18n.html#:~:text=%E3%81%93%E3%81%AEgem%E3%81%AF%E3%80%81%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E6%96%87%E8%A8%80%E3%82%92%E8%8B%B1%E8%AA%9E%E4%BB%A5%E5%A4%96%E3%81%AE%E5%88%A5%E3%81%AE1%E3%81%A4%E3%81%AE%E8%A8%80%E8%AA%9E%E3%81%AB%E7%BF%BB%E8%A8%B3%E3%81%99%E3%82%8B%E6%A9%9F%E8%83%BD%E3%82%84%E3%80%81%E5%A4%9A%E8%A8%80%E8%AA%9E%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88%E6%A9%9F%E8%83%BD%E3%82%92%E7%B0%A1%E5%8D%98%E3%81%8B%E3%81%A4%E6%8B%A1%E5%BC%B5%E5%8F%AF%E8%83%BD%E3%81%AA%E6%96%B9%E5%BC%8F%E3%81%A7%E5%B0%8E%E5%85%A5%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AE%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AF%E3%82%92%E6%8F%90%E4%BE%9B%E3%81%97%E3%81%BE%E3%81%99%E3%80%82)
> このgemは、アプリケーションの文言を英語以外の別の1つの言語に翻訳する機能や、多言語サポート機能を簡単かつ拡張可能な方式で導入するためのフレームワークを提供します。

Railsアプリケーションはデフォルトで英語の設定がされていますが、日本語に翻訳したり、別言語に翻訳する際にこのi18nが必要になります。


実装の方法については下記が参考になります。
### 参考文献
https://pikawaka.com/rails/i18n#1.%20%E3%83%87%E3%83%95%E3%82%A9%E3%83%AB%E3%83%88%E8%A8%80%E8%AA%9E%E3%81%AE%E8%A8%AD%E5%AE%9A

私のこの記事では、特に
* 翻訳時のざっくりとした内部処理
* どのファイルに翻訳情報を書くのか
* なぜファイルを分割するのか

という部分について焦点を当てたいと思います。

# 想定されるファイル構造
Railsアプリケーション内にはja.ymlが複数ある場合があります。

例えば以下のような構造です。
```
config/locales/
├── devise/
│   ├── ja.yml
│   └── en.yml
├── models/
│   ├── article/
│   │   ├── ja.yml
│   │   └── en.yml
│   ├── user/
│   │   ├── ja.yml
│   │   └── en.yml
├── views/
│   ├── articles/
│   │   ├── ja.yml
│   │   └── en.yml
│   ├── users/
│   │   ├── ja.yml
│   │   └── en.yml
```

articleとuserのモデルがあり、対応するビューもあるといった状況です。
ユーザーの認証周りはdeviseというgemで実装することができますが、deviseを使用する場合も上記のようにフォルダ分けしたりします。

# 翻訳時の内部処理のざっくりとした理解
翻訳されるときは以下のような動きをしています。
1. アプリが実行される
2. config/locales配下のファイルがすべて読み込まれ、ひとまとめに統合される

ポイントは2の**ひとまとめに統合される**ところです。
つまり、**先ほどのファイル構造のようにしていても、config/locales/ja.ymlのように1ファイルにしていても、翻訳される（実質的な挙動は変わらない）と言えます。**

# ja.ymlを分割するメリット
<br>
では、なぜファイルを分ける必要があるのでしょうか。

理由は、**開発者にとってどの翻訳情報がどこに書かれているかを分かりやすくするため**だと思います！

<br>
例えば、「このページの翻訳の文言を少し修正したいんだけど、どこに書いてあったっけ？」
というときに位置を探しやすくすることができます。

ここからは、以下のパターンでja.ymlの中身を比較し、探しやすさについてぜひ皆さんにも考えてみていただきたいと思います。
* １ファイルにまとめる場合
* 複数ファイルに分割する場合

## 1つのファイルにまとめる場合
1つのファイルにまとめたときは、config/locals/ja.ymlに以下のような内容が書かれます。
（詳細な書き方は先ほどの参考資料がわかりやすいです。）
```
ja:
  devise:
    sessions:
      user:
        new:
          title: 'ログイン'
          email: 'メールアドレス'
          password: 'パスワード'
          remember_me: 'ログイン情報を記憶する'
          submit: 'ログイン'
    registrations:
      user:
        new:
          title: '新規登録'
          email: 'メールアドレス'
          password: 'パスワード'
          password_confirmation: 'パスワード確認'
          submit: '登録する'
    passwords:
      user:
        new:
          title: 'パスワードを忘れた場合'
          email: 'メールアドレス'
          submit: 'パスワード再設定'
  
  activerecord:
    models:
      article: '記事'
    attributes:
      article:
        title: 'タイトル'
        published_at: '公開日'
        tag_ids: 'タグ'

  views:
    articles:
      index:
        title: '記事一覧'
        new_article: '新しい記事を作成'
      show:
        title: '記事詳細'
        edit: '編集'
        delete: '削除'
        back: '戻る'
      new:
        title: '新しい記事を作成'
        create: '作成'
      edit:
        title: '記事を編集'
        update: '更新'

```
1ファイルにまとめてしまうと行数が多くなるので修正箇所が探しにくくなります。

## 複数ファイルに分割する場合
ファイルを分割すると、例えば以下のように分かれます。

* config/locales/devise/ja.yml
```
ja:
  devise:
    sessions:
      user:
        new:
          title: 'ログイン'
          email: 'メールアドレス'
          password: 'パスワード'
          remember_me: 'ログイン情報を記憶する'
          submit: 'ログイン'
    registrations:
      user:
        new:
          title: '新規登録'
          email: 'メールアドレス'
          password: 'パスワード'
          password_confirmation: 'パスワード確認'
          submit: '登録する'
    passwords:
      user:
        new:
          title: 'パスワードを忘れた場合'
          email: 'メールアドレス'
          submit: 'パスワード再設定'
```
* config/locales/models/articles/ja.yml
```
ja:
  activerecord:
    models:
      article: '記事'
    attributes:
      article:
        title: 'タイトル'
        published_at: '公開日'
        tag_ids: 'タグ'
```
* config/locales/views/articles/ja.yml
```
ja:
  views:
    articles:
      index:
        title: '記事一覧'
        new_article: '新しい記事を作成'
      show:
        title: '記事詳細'
        edit: '編集'
        delete: '削除'
        back: '戻る'
      new:
        title: '新しい記事を作成'
        create: '作成'
      edit:
        title: '記事を編集'
        update: '更新'
```
「ビューに関しての翻訳の文言を修正したい」というときは、「config/locales/views配下のファイルを探せばよい」と当たりが付き、該当の修正位置を探しやすくなります。
<br>
この話は個人開発だけではなく、チームで開発するときにも活きると思います。

プロジェクト内でyamlファイルの作り方や構造を標準化しておくことで、ほかのチームメンバーが作成した翻訳の文言を変えたいといった場合にも修正位置をすぐに探すことが可能になります。

# ファイルの分割方法
ファイルの分割としては、config/locales/配下にフォルダやファイルを作成すれば、あとはどのように分割しても動きます。
先ほどの例ではconfig/locals/配下に、「MVC」のキーワードを起点にmodelsフォルダ・viewsフォルダを用意しましたが、以下のようにdevise、article、userなど要素ごとに分けて作成することも可能です。
```
config/locales/
├── devise/
│   ├── ja.yml
│   └── en.yml
├── article/
│   ├── model/
│   │   ├── ja.yml
│   │   └── en.yml
│   ├── view/
│   │   ├── ja.yml
│   │   └── en.yml
├── user/
│   ├── model/
│   │   ├── ja.yml
│   │   └── en.yml
│   ├── view/
│   │   ├── ja.yml
│   │   └── en.yml
```
**※チーム開発をする際は、この点についても方針を統一する必要があります。**

## さいごに
今回、この記事を書こうと思った発端が「どこに翻訳情報を書けばいいんだ？」と悩んだことでした。
結論として、「どこに書いてもいい」が正解ですが、わかりやすくファイルを分けるのがベターということで納得しました。その一例が今回のようにMVCや要素ごとにフォルダを分けるやり方です。

この記事が、同じように悩んでいる方々の助けとなり、少しでも理解を深めるお手伝いができれば幸いです。最後まで読んでいただき、ありがとうございました！