Edited at

I18nについて学ぶ_100DaysOfCodeチャレンジ4日目(Day_4:#100DaysOfCode)

More than 1 year has passed since last update.


はじめに

この記事はTwitterで人気のハッシュタグ#100DaysOfCodeをつけて、

100日間プログラミング学習を続けるチャレンジに挑戦した4日目の記録です。


動作環境


  • ruby 2.4.1

  • Rails 5.0.1


現在学習している内容のリポジトリ

https://github.com/yuta-ushijima/notebook-api-on-rails


本日学んだこと


  • 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に以下のリンク先になる内容をコピペした上で、内容をアレンジすると捗りやすいですね。

日本語のlocaleファイル


【ちょっと応用編】日付の表示を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.namename: 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を実行するということですね。


参考リンク

すぐ忘れるので、RubyとRailsの日付操作周りについてまとめました

Rails国際化 (I18n) API

日本語のlocaleファイル

【Ruby入門】nil?empty?blank?present?の基礎と応用!