はじめに
この記事は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
を実行するということですね。