【Rails】i18nとは？使い方まとめ。ビュー(View),コントローラー(Controller), コンソールでの呼び出し方とlocaleの使い方

Railsのi18nを使うと、日本語のテキストを一つのファイルにまとめて、呼び出したい文言を共通化して呼び出すことができる。

また、railsの言語設定を変更することでエラーメッセージの変更もできる。

##目次

1. [i18nとは？](#i18nとは)
1. [i18nの使い方](#i18nの使い方)
1. [config/application.rbに以下を追記する](#1-configapplicationrbに以下を追記する)
1. [言語ファイルの作成](#2-言語ファイルの作成)
1. [呼び出し](#3-呼び出し)
    1. [コントローラで表示する方法](#3-1-コントローラで表示する方法)
    1. [ビューで表示する方法](#3-2-ビューで表示する方法)
    1. [railsコンソールで表示する方法](#3-3-railsコンソールで表示する方法)
1. [日付と時刻を呼び出す方法](#4-日付と時刻を呼び出す方法)
1. [変数を渡す方法](#5-変数を渡す方法)
1. [htmlとして呼び出す方法](#6-htmlとして呼び出す方法)
1. [ファイルを分割する方法](#7-ファイルを分割する方法)
1. [localeファイルのディレクトリパスを変更する方法](#8-localeファイルのディレクトリパスを変更する方法)




<br>
##i18nとは？
APIの一つで、Internationalizationの略。iとnの間に18文字あるので、i18nとなっている。

意味は国際化・多言語化。例えば英語用の言語ファイルと日本語用の言語ファイルを用意しておいて、i18nを使って言語を切り替えれば、ビューに表示される言語を切り替えることができる。

日付や時刻のフォーマット変更ができる。言語ファイルの中で数式を使って記述することも可能。


<br>
##i18nの使い方
i18nを使得るようにするのはとても簡単。


##1. config/application.rbに以下を追記する

```rb:config/application.rb
module RailsScreamer
  class Application < Rails::Application
    
    #追記
    config.i18n.default_locale = :ja

 end
end  
```

・`config.i18n.default_locale = :ファイル名`
ファイル名はconfig/locale配下で参照したいファイルの名前を入力する。（拡張子 .yml は省略）



<br>
##2. 言語ファイルの作成
config/locales/ja.yml　を作成する。`ja:`で書き出して、`キー名: 文字列`の形で記述していく。

```yml:ja
ja:
  test: テスト
  deep:
    test: 深いテスト
```


<br>
##3. 呼び出し
作成したテキストを呼び出すには、ビューとコントローラの中では`t('キー名')`を使う。

railsコンソールでは`I18n.t 'キー名'`を使う。

カッコをつけても機能する：　`t('キー名')`


###3-1. コントローラで表示する方法
デバッグ用のppを使うと便利。localeの指定は`t('キー名.キー名...')で指定。

```rb:controller
class TopController < ApplicationController
  def index
    pp t 'test'
    pp t 'deep.test'
  end
end
```


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/41f3115f-f9e9-2fa6-4205-9e400e8d6da2.png)

**▼注意点**
ja.ymlに値が存在しない場合は、`translation missing: 入力した値`が表示される。

```rb:controller
pp t 'dummy'
pp t 'xxx.存在しない'
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/f89308b8-c901-b3cd-27f2-db5fba99154d.png)




<br>
###3-2. ビューで表示する方法

`<%= t 'キー名' %>`を使う。

```erb:.html.erb
<%= t 'test' %> 
<%= t 'deep.test' %>
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/6a88fc0b-7ef6-839e-090f-84112434496f.png)


**▼注意点**
ja.ymlに値が存在しない場合は、入力した値が表示される。

```erb:
<%= t 'dummy' %>
<%= t 'yyy.存在しない' %>
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/828ccc67-f463-ed1c-ffbb-d66e127313bd.png)


<br>
###3-3. railsコンソールで表示する方法

`I18n.t 'キー名'`で呼び出すことができる。

```
# rails c
Running via Spring preloader in process 197
Loading development environment (Rails 6.1.3.1)

irb(main):002:0> I18n.t 'test'
=> "テスト"

irb(main):001:0> I18n.t 'deep.test'
=> "深いテスト"
```


**▼注意点**
ja.ymlに値が存在しない場合は、`translation missing: 入力した値`が表示される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/2a9b1227-dd30-c15f-27fc-95d062377789.png)


変更内容はリアルタイムで反映されないため、後からlocaleのja.ymlを変更した場合は、一旦railsコンソールを`exit`で抜けて、`rails c`で再度対話モードに入る必要がある。



<br>
##4. 日付と時刻を呼び出す方法
ja.ymlの中で`date`と`time`を定義すると現在の日付や時刻を呼び出せるようになる。（定義せずに呼び出そうとするとエラーになる）

###4-1. ja.ymlの編集

formatsの中に、defaultと任意の名前のフォーマットを追加する。

```yaml:ja.yml
ja:
  date:
    formats:
      default: "%Y/%m/%d"
      long: "%Y年%m月%d日(%a)"
      short: "%m/%d"
    day_names: [日曜日, 月曜日, 火曜日, 水曜日, 木曜日, 金曜日, 土曜日]
    abbr_day_names: [日, 月, 火, 水, 木, 金, 土]

    month_names: [~, 1月, 2月, 3月, 4月, 5月, 6月, 7月, 8月, 9月, 10月, 11月, 12月]
    abbr_month_names: [~, 1月, 2月, 3月, 4月, 5月, 6月, 7月, 8月, 9月, 10月, 11月, 12月]

  time:
    formats:
      default: "%Y/%m/%d %H:%M:%S"
      long: "%Y年%m月%d日(%a) %H時%M分%S秒 %z"
      short: "%y/%m/%d %H:%M"
    am: "午前"
    pm: "午後"
```

`day_names`や`abbr_day_names`は曜日を表す`%a`など日本語の曜日や月を表示するときに必須。

これらがないとエラーになるので注意。

```:エラー例
#"%Y年%m月%d日(%a)"を呼び出そうとした
"translation missing: ja.date.abbr_day_names"
```

<br>
###4-2. 呼び出し

コントローラやビューの中で呼び出す場合は以下となる。

・`l Date.today, format: :フォーマット名`
・`l Time.now, format: :フォーマット名`

**▼defaultを呼び出す場合**
defaultを呼び出す場合は, format以下を省略できる。

・`l Date.today`
・`l Time.now`


####コントローラでの呼び出し例

```rb:controller
class TopController < ApplicationController
  def index
    pp l Date.today
    pp l Date.today, format: :long
    pp l Date.today, format: :short
    pp l Time.now
    pp l Time.now, format: :long
    pp l Time.now, format: :short
  end
end
```

railsサーバーを起動しているコンソールにlogとして出力される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/337424c7-1156-b94a-2444-9c3b838f8431.png)


<br>
####ビューでの呼び出し例

```erb:.html.erb
<%= l Date.today %><br>
<%= l Date.today, format: :long %><br>
<%= l Date.today, format: :short %><br>
<%= l Time.now %><br>
<%= l Time.now, format: :long %><br>
<%= l Time.now, format: :short %><br>
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/2f695b94-9fdf-d950-118b-16557dbac8b9.png)



<br>
### railsコンソールでの呼び出し

・`I18n.l Date.メソッド`
・`I18n.l Time.メソッド`

```bash
$ rails c
Running via Spring preloader in process 93
Loading development environment (Rails 6.1.3.1)
irb(main):001:0> I18n.l Date.today
=> "2021/04/14"
irb(main):002:0> I18n.l Date.today, format: :long
=> "2021年04月14日(水)"
irb(main):003:0> I18n.l Date.today, format: :short
=> "04/14"
```



<br>
##5. 変数を渡す方法
呼び出し時に変数名と値を指定することで、代入した文字列を抽出できる。

**▼ビューやコントローラの記述**
・`t 'キー名', 変数名: 数値`
・`t 'キー名', 変数名: :文字列`

※文字列を渡す場合は冒頭に`:`をつける。


**▼ja.ymlの記述**
・`キー名: "文字列%{変数名}文字列"`


```yml:ja.yml
ja:
  product: "%{price}円"
  product2:
    price: "%{price}円"
```

```erb:.html.erb
<%= t 'product', price: 543 %> <br>
<%= t 'product2.price', price: 543 %>
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/ca9854bf-c3a2-1ea3-9320-3afe181cdf4a.png)



<br>
##6. htmlとして呼び出す方法
キー名が`html`または、`_html`で終わる場合はhtmlとして呼び出せる。


```yml:ja.yml
ja:
  test:
    html: "<p>pタグで囲まれている</p>"
  div_html: "<div>divタグで囲まれている</div>"
  tag_html: "<%{tag}>%{tag}タグで囲まれている</%{tag}>"
```

```erb:.html.erb
<%= t 'test.html' %>
<%= t 'div_html' %>
<%= t 'tag_html', tag: :b %>
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/584d1d78-a36b-7822-c261-eb6abd4281ce.png)


<br>
##7. ファイルを分割する方法
locale配下で`.ja.yml`を末尾に付ければ好きなファイルを作成することができる。

**▼注意点**

- ファイル毎にキー名は区別できない
- キー名が被った場合は後から読み込まれたファイルの値で上書きする


###実例

例えば以下の３つのファイルを作成したとする。並び順はアルファベット順で自動整列。

┝ locales
　┝ ja.yml
　┝ product.ja.yml
　┝ test.ja.yml

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/5361e72c-b897-bc27-15b6-d827e7357992.png)


```yml:ja.yml
ja:
  test: "ja.ymlのtestです"
  test1: "ja.yaml専用のtest1"
```

```yml:test.ja.yml
ja:
  test: "test.ja.yamlのtestです"
  test2: "test.ja.yaml専用のtest2"
```

```yml:product.ja.yml
ja:
  test: "product.ja.ymlのtestです"
  test3: "product.ja.yaml専用のtest3"
```

**▼ビューの設定**

```erb:
<%= t 'test' %> <br>
<%= t 'test1' %> <br>
<%= t 'test2' %> <br>
<%= t 'test3' %> <br>
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/2d440224-6b05-415b-f399-b21aff5d4474.png)


<br>
##8. localeファイルのディレクトリパスを変更する方法

localeディレクトリ以外の.ymlファイルも読み込みたい場合は、config/application.rbに設定を追記する。

・`config.i18n.load_path += Dir[Rails.root.join('パス', 'locales', '*.{rb,yml}')]`

上記設定であれば、パス > localse 配下のrbまたはymlファイルをlocaleファイルとして読み込む。

`config.i18n.default_locale`の前に記述すること。


```rb:application.rb
#追記
config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}')]

config.i18n.default_locale = :ja
```




<br>
##関連リンク

https://railsguides.jp/i18n.html