Help us understand the problem. What is going on with this article?

【Rails】localeの使い方

localeとは

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

基本

config/application.rbでデフォルトの言語を指定

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

config/locales以下にlocaleファイルを作成

config/locales/ja.yml
ja:
  hello: Hello World
  company:
    name: サンプル株式会社
    address: 〒231-0001 神奈川県横浜市中区新港2丁目7−1
viewから呼び出す
<%= t('hello') %> <!-- Hello World -->
<%= t('company.name') %> <!-- サンプル株式会社 -->
modelから呼び出す
I18n.t('hello') #=> 'Hello World'
I18n.t('company.name') #=> 'サンプル株式会社'

ポイント

  • 呼び出し時、jaの部分は書かない
  • localeファイルの名前は何でも良い。
  • viewから呼び出す時はI18n.の部分を省略できる。
  • 同じキーのデータが複数あった場合、後に定義したデータで上書きされる

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

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クラスの値をセットすると、datetimeに定義した形でフォーマットする
  • formatを省略するとdefaultの内容が適用される。
  • lはlocalizeの略。ちなみにtはtranslateの略。
  • created_atupdated_atI18n.l()でラップすると、timeに定義したフォーマットで出力される。

変数を渡す

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

モデルの情報を定義する

主にエラーメッセージ中のモデル名や属性名を日本語化する目的で。

config/locales/ja.yml
ja:
  activerecord:
    # モデル名
    models:
      user: ユーザー
      item: アイテム
    # モデルごとの属性
    attributes:
      user:
        name: 名前
        address: 住所
      item:
        power: パワー
  # 全モデル共通の属性
  attributes:
    created_at: 作成日時
    updated_at: 更新日時

階層分け

・スッキリ管理する
・conflictのリスクを減らす
ために、localeファイルを階層分けしてたくさん作ることも多い。

階層分けをする場合config.i18n.load_pathの設定をすることで、config/locale直下のファイル以外も参照できるように設定します。

config/application.rb
config.i18n.default_locale = :ja
#↓追加
config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}').to_s]

rails-i18n

rails-i18nというgemを使うと、よく使う単語を全部一気に導入できます。

多言語対応をする時には有用だと思いますが、日本語だけの場合はわざわざgemを入れなくても、上記のページに書いてある内容を全部コピペすれば良い気がします。

参考

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした