Railsのi18nを使うと、日本語のテキストを一つのファイルにまとめて、呼び出したい文言を共通化して呼び出すことができる。
また、railsの言語設定を変更することでエラーメッセージの変更もできる。
##目次
- i18nとは?
- i18nの使い方
- config/application.rbに以下を追記する
- 言語ファイルの作成
- 呼び出し
- 日付と時刻を呼び出す方法
- 変数を渡す方法
- htmlとして呼び出す方法
- ファイルを分割する方法
- localeファイルのディレクトリパスを変更する方法
##i18nとは? APIの一つで、Internationalizationの略。iとnの間に18文字あるので、i18nとなっている。
意味は国際化・多言語化。例えば英語用の言語ファイルと日本語用の言語ファイルを用意しておいて、i18nを使って言語を切り替えれば、ビューに表示される言語を切り替えることができる。
日付や時刻のフォーマット変更ができる。言語ファイルの中で数式を使って記述することも可能。
##i18nの使い方 i18nを使得るようにするのはとても簡単。
##1. config/application.rbに以下を追記する
module RailsScreamer
class Application < Rails::Application
#追記
config.i18n.default_locale = :ja
end
end
・config.i18n.default_locale = :ファイル名
ファイル名はconfig/locale配下で参照したいファイルの名前を入力する。(拡張子 .yml は省略)
##2. 言語ファイルの作成 config/locales/ja.yml を作成する。`ja:`で書き出して、`キー名: 文字列`の形で記述していく。
ja:
test: テスト
deep:
test: 深いテスト
##3. 呼び出し 作成したテキストを呼び出すには、ビューとコントローラの中では`t('キー名')`を使う。
railsコンソールではI18n.t 'キー名'
を使う。
カッコをつけても機能する: t('キー名')
###3-1. コントローラで表示する方法
デバッグ用のppを使うと便利。localeの指定は`t('キー名.キー名...')で指定。
class TopController < ApplicationController
def index
pp t 'test'
pp t 'deep.test'
end
end
▼注意点
ja.ymlに値が存在しない場合は、translation missing: 入力した値
が表示される。
pp t 'dummy'
pp t 'xxx.存在しない'
###3-2. ビューで表示する方法
<%= t 'キー名' %>
を使う。
<%= t 'test' %>
<%= t 'deep.test' %>
▼注意点
ja.ymlに値が存在しない場合は、入力した値が表示される。
<%= t 'dummy' %>
<%= t 'yyy.存在しない' %>
###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: 入力した値
が表示される。
変更内容はリアルタイムで反映されないため、後からlocaleのja.ymlを変更した場合は、一旦railsコンソールをexit
で抜けて、rails c
で再度対話モードに入る必要がある。
##4. 日付と時刻を呼び出す方法 ja.ymlの中で`date`と`time`を定義すると現在の日付や時刻を呼び出せるようになる。(定義せずに呼び出そうとするとエラーになる)
###4-1. ja.ymlの編集
formatsの中に、defaultと任意の名前のフォーマットを追加する。
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"
###4-2. 呼び出し
コントローラやビューの中で呼び出す場合は以下となる。
・l Date.today, format: :フォーマット名
・l Time.now, format: :フォーマット名
▼defaultを呼び出す場合
defaultを呼び出す場合は, format以下を省略できる。
・l Date.today
・l Time.now
####コントローラでの呼び出し例
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として出力される。
####ビューでの呼び出し例
<%= 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>
### railsコンソールでの呼び出し
・I18n.l Date.メソッド
・I18n.l Time.メソッド
$ 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"
##5. 変数を渡す方法 呼び出し時に変数名と値を指定することで、代入した文字列を抽出できる。
▼ビューやコントローラの記述
・t 'キー名', 変数名: 数値
・t 'キー名', 変数名: :文字列
※文字列を渡す場合は冒頭に:
をつける。
▼ja.ymlの記述
・キー名: "文字列%{変数名}文字列"
ja:
product: "%{price}円"
product2:
price: "%{price}円"
<%= t 'product', price: 543 %> <br>
<%= t 'product2.price', price: 543 %>
##6. htmlとして呼び出す方法 キー名が`html`または、`_html`で終わる場合はhtmlとして呼び出せる。
ja:
test:
html: "<p>pタグで囲まれている</p>"
div_html: "<div>divタグで囲まれている</div>"
tag_html: "<%{tag}>%{tag}タグで囲まれている</%{tag}>"
<%= t 'test.html' %>
<%= t 'div_html' %>
<%= t 'tag_html', tag: :b %>
##7. ファイルを分割する方法 locale配下で`.ja.yml`を末尾に付ければ好きなファイルを作成することができる。
▼注意点
- ファイル毎にキー名は区別できない
- キー名が被った場合は後から読み込まれたファイルの値で上書きする
###実例
例えば以下の3つのファイルを作成したとする。並び順はアルファベット順で自動整列。
┝ locales
┝ ja.yml
┝ product.ja.yml
┝ test.ja.yml
ja:
test: "ja.ymlのtestです"
test1: "ja.yaml専用のtest1"
ja:
test: "test.ja.yamlのtestです"
test2: "test.ja.yaml専用のtest2"
ja:
test: "product.ja.ymlのtestです"
test3: "product.ja.yaml専用のtest3"
▼ビューの設定
<%= t 'test' %> <br>
<%= t 'test1' %> <br>
<%= t 'test2' %> <br>
<%= t 'test3' %> <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
の前に記述すること。
#追記
config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}')]
config.i18n.default_locale = :ja
##関連リンク