i18nで多言語化する

前回の記事ではi18nを使った多言語化用の設定を行いました。 i18_generaor gemを使った方が簡単に生成できそうでしたが理解を深める為に今回はあえて手動で翻訳情報を追加します。

tメソッドについて

  • t メソッドはi18nに用意されているtranslate メソッドの略。
  • ロケールファイルから翻訳情報を参照できる。

下記のようなロケールファイルをrailsコンソールからtitle: を参照してみます。

# config/locales/ja.yml

ja:
  books:
    index:
      title: 書籍一覧
$ rails c
> I18n.translate('books.index.title')
=> "書籍一覧"

> I18n.t('books.index.title')
=> "書籍一覧"

遅延検索

  • 参照する翻訳情報を短縮してアクセスできる仕組み。
  • view、controllerから使用可能。
  • ロケールファイルからview、contoller名を自動で判断して翻訳情報を参照しているっぽい。

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

翻訳情報の追加

ロケールファイルを下記のように区分分けして翻訳情報を追加します。

  • view: 各viewファイル毎に固定化された文字列
  • activerecord: DBから取得するデータのカラム名など
  • controller: CRUD処理後のフラッシュメッセージなど
  • helpers: CRUD処理を実行するボタンの文字列など
  • その他: 複数のファイルで使い回す文字列

view

各viewファイル毎の固定化された文字列の翻訳情報を追加します。 app/views/ ディレクトリ内の各viewファイル毎に階層を分けて翻訳情報を追加することで多言語化できます。

例) app/views/books/index.html.erb のタイトルの翻訳情報を参照します。

ロケールファイルにapp/views/ ディレクトリ以下から翻訳情報を追加します。 翻訳情報はリソース名 → HTTPメソッド → 翻訳情報 の順で階層で表現します。

# config/locales/ja.yml

ja:
  books: # app/views/books/ の部分(リソース名)
    index: # app/views/books/index.html.erb の部分(HTTPメソッド)
      title: 書籍一覧 # 参照する翻訳情報

viewファイルにt メソッドで参照先を追加します。

# app/views/books/index.html.erb

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

遅延検索を使い参照先を省略して書くこともできます。

# app/views/books/index.html.erb

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

controller

CRUD処理後のフラッシュメッセージなど動的に表示される文字列の翻訳情報を追加します。 viewと同様に遅延検索での参照が行えるので最終的にt('.success') のように省略して参照できるようにします。

例) app/controllers/books_controller.rb 内のCRUD処理後のフラッシュメッセージを多言語化する。

ロケールファイルにapp/controllers/ ディレクトリ以下から翻訳情報を追加します。 翻訳情報はviewと同様にリソース名 → HTTPメソッド → 翻訳情報 の順で階層で表現します。

# config/locales/ja.yml

ja:
  books: #app/controllers/books_controller.rbの部分(リソース名)
    create: # HTTPメソッド
      success: 登録されました。 # 参照する翻訳情報
# app/controllers/books_controller.rb
class BooksController < ApplicationController

  def create
      ...
        format.html { redirect_to @book, notice: t('.success') } # t('books.create.success') の省略形
      ...
  end

end

activerecord

DBから取得するデータのカラム名などの翻訳情報を追加します。

例) Bookモデルのモデル名、カラム名を多言語化する。

  • activerecord: 直下のmodel: に翻訳するモデル名を追加する。
  • activerecord: 直下のattributes: にモデル毎の翻訳情報を追加する。
# config/locales/ja.yml

ja:
  activerecord:
    models:
      book: 書籍 # 翻訳するモデル名
    attributes:
      book: # モデル毎の翻訳情報
        title: 書籍名
        memo: 概要
        author: 著者
        picture: 画像

viewファイルからは以下の方法で参照できます。

  • モデル名: Model.model_name.human
  • モデル毎のカラム名: Model.human_attribute_name(attribute)

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

# app/views/books/index.html.erb

# モデル名
<%= Book.model_name.human %>

# カラム名
<%= Book.human_attribute_name(:title) %>
<%= Book.human_attribute_name(:memo) %>
<%= Book.human_attribute_name(:author) %>
<%= Book.human_attribute_name(:picture) %>

railsコンソールでモデル名とカラム名(タイトル)を取得できるのを確認できます。

$ rails c
> Book.model_name.human
=> "書籍"

> Book.human_attribute_name(:title)
=> "書籍名"

helpers

CRUD処理を実行するボタンの文字列などの翻訳情報を追加します。 Railsであらかじめ設定されている翻訳情報を上書きすることで翻訳できます。

例) app/views/_form.html.erbform_with 内のsubmit ボタンを多言語化する。

helpers を起点にして翻訳情報を追加します。 レコードが存在する場合はupdate、存在しない場合はcreate の翻訳情報が適応されます。

【Rails】 I18n入門書~日本語化対応の手順と応用的な使い方 | Pikawaka

# config/locales/ja.yml

ja:
  helpers:
    submit:
      create: 登録する
      update: 更新する
# app/views/_form.html.erb

<%= form_with(model: book, local: true) do |form| %>
    <%= form.label :title %>
    <%= form.text_field :title %>
 
    <%= form.submit %>
<% end %>

helpers 以下の翻訳情報を参照する理由はi18nの仕様について調べた記事で詳しく書いていますので参考にして下さい。

その他

複数のファイルで使い回す文字列の翻訳情報を追加します。 今回はviewファイルで共通するリンクの文字列をviews: にまとめて追加します。

# config/locales/ja.yml

ja:
  views:
    common:
      show: 詳細
      edit: 編集
      delete: 削除
      new: 新規作成
<%= link_to t('views.common.show'), book %>
<%= link_to t('views.common.edit'), edit_book_path(book) %>
<%= link_to t('views.common.delete'), book, method: :delete, data: { confirm: 'Are you sure?' } %>
<%= link_to t('views.common.new'), new_book_path %>

上記のように独自で追加したい翻訳情報はja: 直下に階層を追加することで翻訳できるようになります。翻訳情報を遅延検索できないので参照先をt('.show') のように省略して記述できない点に注意してください。

まとめ

言語化は設定から翻訳情報の追加までとにかくめんどくさかったです笑 ソースコードを読んだり新たなことにチャレンジできたので結果的には良かったと感じています。 実際の現場ではgemを使ってサクッと終わらせるような作業だと思うので、次はi18n_generators gemを使って多言語化してみたいと思います。

参照

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

i18nとは - karlley's tech blog

日本語対応のためのGem 'rails-i18n'の使い方

【Rails】 I18n入門書~日本語化対応の手順と応用的な使い方 | Pikawaka

Railsのフォームのsubmitをhelpers.submit.createで翻訳できる理由を調べた - karlley's tech blog