Rails I18n에 대해서

Posted by negabaro kim on Wednesday, May 23, 2018 Tags: rails/i18n   4 minute read

i18n사용방법

config/locales밑에 언어별로 파일을 만든다.

#config/locales/en.yml
en:
  view:
    hello: Hello world
#config/locales/ja.yml
ja:
  view:
    hello: ハローワールド

rails console에서 i18n의 설정 접근법

I18n.t("view.hello")
=>   "Hello world"
I18n.t("view.hello", locale: :en)
=>   "Hello world"
I18n.t("view.hello", locale: :ja)
=>   "ハローワールド"

rails view에서의 접근법

translate メソッドでフルパスを書くことで参照することもできます。

<%= t('view.hello') %>
<%= I18n.t('view.hello') %>

이외에도 Model명.human_attribute_name도 사용가능

i18n관련 자주 사용하는 설정

#config/application.rb
config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}').to_s]
config.i18n.default_locale = :ja #필자의 경우를 일본사이트를 주로 만드므로 default_locale=ja으로 설정

load_path설정을 넣어줌으로 인해 config/locales/안의 모든 디렉토리에 있는 yml,rb파일을 읽어옴 뷰의 계층구조와 같은 구조로 config/locales이하에 yml파일을 두면 해당 view의 xx.yml파일을 찾기 편함

예를 들어 app/views/home/top.html.erb이 있다고하면 config/locales/views/home/top/ja.yml이런식으로 맞춤

ja.yml의 설정은 이하와 같다.

ja:
  home:
    top:
      hello: Hello world

日付や時刻のフォーマットを定義する

config/locales/ja.yml

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 に定義したフォーマットで出力される。

変数を渡す

config/locales/ja.yml

ja:
  airmax: "NIKE AIRMAX %{year}"
I18n.t('airmax', year: 95) #=> 'NIKE AIRMAX 95'

Model.model_name.human

ja:
  activerecord:
    errors:
      models:
        user:
          attributes:
            name:
              blank: "が空になっています。入力してください。"
            email:
              blank: "が空になっています。入力してください。"
    models:
      user: "会員"
    attributes:
      user:
        name: "名前"
        email: "Eメール"

このようにすることで、エラーメッセージ等の文言を日本語化することができるんです。 models 階層の文字列を取得するには、

User.model_name.human
=> 会員

I18n.t("activerecord.models.user")
=> 会員

モデル名.human_attribute_name(:カラム名)

ActiveRecord::Base のクラスメソッドであり、内部的に I18n モジュールを利用してくれるシロモノらしいです! つまり config/locales/ja.yml に定義してある翻訳内容を良しなに解釈してくれるメソッドってなわけ。

---
ja:
  activerecord:
    errors:
      messages:
        record_invalid: "バリデーションに失敗しました: %{errors}"
        restrict_dependent_destroy:
          has_one: "%{record}が存在しているので削除できません"
          has_many: "%{record}が存在しているので削除できません"
    models:
      tasks: タスク
    attributes:
      task:
        id: ID
        name: 名称
        description: 内容
        created_at: 登録日時
        updated_at: 更新日時
# t("activerecord.attributes.task.name")と同じ
Task.human_attribute_name(:name)
=> "名称"

t("activerecord.attributes.task.name")
=> "名称"

Task.human_attribute_name(:created_at)
=> "登録日時"

t("activerecord.attributes.task.created_at")
=> "登録日時"