はじめに
この記事はTwitterで人気のハッシュタグ#100DaysOfCodeをつけて、
100日間プログラミング学習を続けるチャレンジに挑戦した4日目の記録です。
動作環境
- ruby 2.4.1
- Rails 5.0.1
現在学習している内容のリポジトリ
本日学んだこと
- I18nの使い方
I18nとは?
正式名称は、internationalization(:インターナショナライゼーション)。
18が使われている理由は、Iとnの間が18文字であることが理由らしいです。
設定方法
まずはGemfileに以下の記述を追加。
# Gemfile
gem 'rails-i18n', '~> 5.1'
その後bundle installを実行します。
次に、config/initializersディレクトリ配下にlocale.rbを作成します。
# config/initializers/locale,rb
I18n.default_locale = :ja
I18n.default_locale = :jaのように記述することで、デフォルトの言語を日本語に変更できます。
次に、config/localesディレクトリ配下に、ja.ymlを作成します。
試しに、「hello」を「こんにちは!」に変更して見ます。
ja:
hello: "こんにちは!"
ここでのポイントは、インデント。ja:の下にあるhelloには半角2個分、こんにちは!とhello:には半角1個分のスペースが必要になるので注意です。
このインデントがしっかりしていないと読み込みエラーになってしまいます。
rails consoleで試してみる
bundle exec rails consoleでコンソールを立ち上げて、これまでの設定がちゃんと有効になっているかどうか確認して見ます。
irb(main):008:0> I18n.translate('hello')
=> "こんにちは!"
うまく読み込んでくれていますね。
ちなみに、translateの部分はtに省略することも可能です。
irb(main):011:0> I18n.t('hello')
=> "こんにちは!"
また、現在のデフォルトロケールを確認するのには、I18n.default_localeを使います。
irb(main):010:0> I18n.default_locale
=> :ja
実際にアプリやAPIを開発する時には、config/locales/ja.ymlに以下のリンク先になる内容をコピペした上で、内容をアレンジすると捗りやすいですね。
【ちょっと応用編】日付の表示をYYYY/MM/DD形式にしてみる
ここまで学んだ知識を生かして、日付の表記を2018/06/19のようなYYYY/MM/DD形式にしてみます。
今回Contactモデルがあると仮定して、日本語ロケールに変換するto_jaメソッドを実装して見ましょう。
まずは、モデルに以下のようなコードを書きます。
class Contact < ApplicationRecord
belongs_to :kind
def to_ja
{ name: self.name,
email: self.email,
birthdate: (I18n.l(self.birthdate) unless self.birthdate.blank?)
}
end
selfの部分は、Contactモデル自身を指しています。
つまり、name: self.nameはname: Contact.nameを簡単にした書き方になっています。
self.birthdateの元々の戻り値は、2018-06-19のようなアメリカ表記の形式です。
I18n.lの引数に渡すことで、先で設定したロケールの表記に変換することができます。
したがって、I18n.l(self.birthdate)の戻り値は2018/06/19になりますね。
なお、unless self.birthdate.blank?の箇所については、「もしContactモデルのbirthdateが空でなければ」という意味。
全体を要約すれば、Contactモデルのbirthdateに値があればI18n.l(self.birthdateを実行するということですね。