I18nとlocale

I18nとは、ある言語の文言を別の言語の文言に翻訳してくれる機能のこと。

言語化以外にも、何度も使う文言を一限管理するために使われる。 住所、会社名、時間をフォーマットする時の形式、今日の日付を出力する時の形式などを管理する。

まずconfig/application.rbに言語を設定する必要がある。

config.i18n.default_locale = :ja

その後、ja.ymlに文言を設定する。

ja:
  hello: Hello World
  company:
    name: ABC株式会社
    address: 〒181-0003 東京都府中市中区大関2丁目7−1


erbに書き出すとこうなる。

<%= t('hello') %> <!-- Hello World -->
<%= t('company.name') %> <!-- ABC株式会社 -->


モデルなどではこうなる。

I18n.t('hello') #=> 'Hello World'
I18n.t('company.name') #=> 'ABC株式会社'


日付などへの適用

ja:
  date:
    formats:
      default: "%Y/%m/%d"
      long: "%Y年%m月%d日(%a)"
      short: "%m/%d"
  time:
    formats:
      default: "%Y/%m/%d %H:%M:%S"
      long: "%Y年%m月%d日(%a) %H時%M分%S秒 %z"
      short: "%y/%m/%d"
I18n.l(Date.today) #=> '2020/02/14'
I18n.l(Date.today, format: :long) #=> '2020年02月14日(金)'

I18n.l(Time.zone.now) #=> '2020/02/14 18:34:25'
I18n.l(user.created_at, format: :short) #=> '20/02/14'
  • DateクラスやTimeクラスの値をセットすると、dateやtimeに定義した形でフォーマットする
  • formatを省略するとdefaultの内容が適用される
  • lはlocalizeの略。ちなみにtはtranslateの略。
  • created_atやupdated_atをI18n.l()でラップすると、timeに定義したフォーマットで出力される。