今回は、Railsにおける国際化(多言語化)を実現するための機能を提供するi18n(internationalization)について学習しました。
Railsでは、i18nを使用することで、アプリケーションで使用されるテキストメッセージやエラーメッセージなどを簡単に多言語対応させることができます。
学んだこと✏️
前提知識
国際化:使用されるすべての文言や、ロケール固有の要素(日付や通貨フォーマット等)の抽象化までの作業。
Localization(日本語化など):具体的な翻訳方法を提供したり、そのためのフォーマットを提供したりすること。
i18nの主要なメソッド
- translateメソッド...
config/locales
以下の翻訳ファイルの参照 - localizeメソッド...日付や時刻を設定した言語のフォーマットに変換する
- translateメソッド...
以下は作成済みの新規アプリケーションがあることが前提です。
1.デフォルト言語を日本語に設定
- 以下を
config/application.rb
に追加して、デフォルト言語を英語から日本語に設定する。
config.i18n.default_locale = :ja
2.日本語と英語のロケールファイル(翻訳ファイル)のダウンロード
- 手動でも作成可能だが、GitHub上のレポジトリ(svenfuchs/rails-i18n)から、使用する言語のロケールファイルをダウンロードできる。
#日本語のロケールファイル $ curl -s https://raw.githubusercontent.com/svenfuchs/rails-i18n/master/rails/locale/ja.yml -o config/locales/ja.yml
3.Active Recordモデルで翻訳
- 例えば、日本語の場合は
config/locales/ja.yml
に以下のように設定。 この例では、Userモデルの翻訳を設定している。activerecord.models.user
は、Userモデル自体の翻訳を設定し、activerecord.attributes.user
は、Userモデルの属性(ここではnameとemail)の翻訳を設定している。
ja: activerecord: models: user: ユーザー attributes: user: name: 名前 email: メールアドレス
- 次に
model_name.human
とhuman_attribute_name
を使用しモデル名とカラム名の訳語を表示する。human
メソッドは、i18nのロケールに応じてモデル名を翻訳することができる。 現在のロケールに対応する翻訳がある場合はそれを返し、ない場合は自動的に生成された人間が読みやすい形式のモデル名を返す。
例えば、日本語のロケールであれば、"User"が"ユーザー"に変換される。
User.model_name.human
また、以下のようにname属性の翻訳を取得することができる。
User.human_attribute_name(:name)
補足
- Railsの
pluralize
ヘルパーメソッドを使用することで、複数形の単語を生成することができる。 このヘルパーメソッドをi18nと組み合わせることで、多言語対応アプリケーションでの単語の複数形の生成が容易になる。
例えば、"post"という単語の複数形を生成する場合は、以下のようにpluralize
メソッドを使用。
pluralize(2, "post")
このコードは、第1引数で指定した数値が2であるため、"post"という単語を複数形に変換して"posts"を生成。
i18nと組み合わせる場合は、以下のように記述。
t("views.post", count: 2)
このコードは、"views.post"というi18nのキーを指定し、countオプションに数値を指定することで、その数に応じた単数形または複数形を生成。 i18nの設定については、config/locales以下にファイルを作成し、以下のように記述。
en: views: post: one: "1 post" other: "%{count} posts"
これにより、数値が1の場合は"1 post"、それ以外の場合は"%{count} posts"という文字列が返される。 "other"キーには、%{count}というプレースホルダーを使用して、動的に数値を埋め込むことができる。 また、複数形のルールについては、i18nの設定ファイルで指定することができる。
4.各ページ、flashメッセージを翻訳
- i18nでは、翻訳メッセージの中に変数を含めることができる。例えば、以下のように訳文に変数
count
を含めることができる。
en: users: message: There are %{count} users.
このように、訳文中に%{変数名}を含めることで、変数を埋め込むことができる。この場合、変数名はcount
。
変数を埋め込む場合、以下のようにI18n.t
メソッド(またはt()
)を呼び出し、第2引数として変数の値を渡すことができる。
I18n.t('users.message', count: 10)
この場合、users.message
は翻訳メッセージのキー、count: 10
は変数count
の値を表している。
このようにして、変数を含めた翻訳メッセージを扱うことができる。
5.ロケール管理方法の追加
app/controllers/application_controller.rb
に以下を追記。例えばhttp://localhost:3000/books?locale=ja
で 日本語に切り替えることができる。default_url_options
を使用することで、URLに言語情報を含めることができる。 これにより、ユーザーがページを切り替えた場合にも、言語情報が維持される。
class ApplicationController < ActionController::Base around_action :switch_locale def switch_locale(&action) locale = params[:locale] || I18n.default_locale I18n.with_locale(locale, &action) end def default_url_options { locale: I18n.locale } end end
まとめ
他にもやり方があると思いますが、自分が普段何気なく使ってるアプリもこのように比較的簡単に翻訳がされていると知り感動しました!