##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クラスの値をセットすると、
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'
##モデルの情報を定義する
主にエラーメッセージ中のモデル名や属性名を日本語化する目的で。
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を入れなくても、上記のページに書いてある内容を全部コピペすれば良い気がします。
##参考