前回の記事ではi18nを使った多言語化用の設定を行いました。 i18_generaor gemを使った方が簡単に生成できそうでしたが理解を深める為に今回はあえて手動で翻訳情報を追加します。
tメソッドについて
下記のようなロケールファイルを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名を自動で判断して翻訳情報を参照しているっぽい。
翻訳情報の追加
ロケールファイルを下記のように区分分けして翻訳情報を追加します。
- 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から取得するデータのカラム名などの翻訳情報を追加します。
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)
# 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.erb
のform_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入門書~日本語化対応の手順と応用的な使い方 | Pikawaka
Railsのフォームのsubmitをhelpers.submit.createで翻訳できる理由を調べた - karlley's tech blog