プログラミング学習記録

主にRuby on Railsを使ったプログラミングを学んでいます。

i18nによる日本語化対応

i18nrails-i18n

Railsでは様々な言語に対応するために、デフォルトでi18nというgemが導入されている。
以下Railsガイド Rails 国際化 (i18n) APIより引用

 RubyI18n (国際化・多言語化を意味する internationalization を短縮したもの) gemはRuby on Rails 2.2以降からRailsに同梱されています。このgemは、アプリケーションの文言を英語以外の 別の1つの言語に翻訳 する機能や 多言語サポート 機能を簡単かつ拡張可能な方式で導入するためのフレームワークを提供します。

つまり、導入のためのフレームワークであり、これだけでは日本語化対応ができない。
翻訳するためのファイルを用意したり、読み込むようにパスを設定したりする必要があるということ。

rails-i18nというgemがあり、これには様々な言語の翻訳ファイルが入っている。
rails-i18nをインストールし、アプリケーションのデフォルト言語を日本語に設定することで必要最低限(バリデーションエラー時のメッセージや、月や曜日など)の日本語を使用できるようになる。
ただし、必要最低限の日本語対応となるので、個別のアプリケーションのモデルやビューなどで使用している用語の日本語を設定したい場合は、別途YAML形式の翻訳ファイルを作成する必要がある。(拡張子は.yml 日本語のファイルなのでファイル名はja.ymlにする)

日本語化

まず、Railsのデフォルトの言語を日本語に設定する必要がある。
config/application.rb

module AppName
  class Application < Rails::Application
    #このクラス内に書く
    config.i18n.default_locale = :ja
  end
end

次にGemfileに

gem 'rails-i18n'

を追加しbundle installする。
このgemを導入することによって、Railsを日本語で使う場合のデフォルトのロケールファイル

rails-i18n/ja.yml at master · svenfuchs/rails-i18n · GitHub

をダウンロードしてローカル(config/locales以下にja.ymlとして)に配置しなくても、gem内部にある日本語の国際化設定ファイルを参照するようになる。

ViewとModelの日本語化

config/application.rb

module AppName
  class Application < Rails::Application
    config.i18n.default_locale = :ja
    # 読み込む対象のファイルを増やす
    config.i18n.load_path += Dir[Rails.root.join('config/locales/**/*.{rb,yml}').to_s]
  end
end

と記載して、i18n対応ファイルをlocales以下に配置することで、多言語対応させたviewを表示させることができる。
必要最低限の日本語対応に加え、モデルに関連する内容のみを記載するファイル、viewの表示の内容のみを記載するファイルなどと、i18nの定義ファイルを複数に分けて設定できる。
※この設定の変更を反映させるためには、サーバーの再起動が必要。

開発の初期段階から、作成したモデル名やカラムの翻訳ファイルを作成しておくとよい。
ActiveRecordとViewで翻訳ファイルを分けて作成すると管理しやすい。

(例)
locales以下にviews,activerecordディレクトリを作り、そこに配置する。
config/locales/views/ja.yml
config/locales/activerecord/ja.yml

翻訳ファイルはアプリケーションが大きくなるほど単一のファイルでの管理が難しくなる。その場合はviewの翻訳ファイルさらに細かく分け、コントローラごとに分けるなどする。(可読性はもちろん、後述するlazy-lookup記法を使う為の配慮)

翻訳ファイルの書き方例

config/locales/views/ja.yml

ja:
  defaults:
    login: 'ログイン'
    logout: 'ログアウト'
  users:
    new:
      title: 'ユーザー登録'
  user_sessions:
    new:
      title: 'ログイン'

config/locales/activerecord/ja.yml

ja:
  activerecord:
    models:
      user: 'ユーザー'
      post: '投稿'
    attributes:
      user:
        email: 'メールアドレス'
        password: 'パスワード'

tメソッド

viewで翻訳ファイルに記載した用語を使用する場合は、tメソッドを使う。(tはtranslateのt)
上の翻訳ファイルの書き方例の場合

<%= t('defaults.login') %>

ログインと表示できる。

<%= t('users.new.title') %>

ユーザー登録と表示できる。

lazy-lookup記法

<%= t('users.new.title') %>

と書く場合、app/views/users/new.htmlのようにビューテンプレートの階層と翻訳ファイルの階層構造が同じ場合は

<%= t('.title') %>

のように省略して書くことができる。この書き方がlazy-lookup記法。

参考サイト

Rails 国際化 (i18n) API - Railsガイド

[初学者]Railsのi18nによる日本語化対応 - Qiita

RailsでI18nを使ってViewに表示する文字列を一元管理する - Qiita

ruby - Railsのファイルの変更の自動読み込みについて - スタック・オーバーフロー