i18n入門書(分からなくなったらこのサイトに戻ってきたい)
課題反省点
・ログイン・新規登録ページしか実装していないかった
→header(ログイン後ヘッダー)とbefore(ログイン前ヘッダー)
・重複する記述が多くて翻訳ファイルを分けた意味がなくなっていた
・gem:rails-18nがあれば、バリデーションエラー時のメッセージなど、一般的なものに関して設定する必要がなくなる、ことが分かっていなかった
Railsの初期化とは
Railsでは、rails s
コマンドを実行してから実際にアプリケーションが立ち上がるまでの間に初期化作業(スタート地点に立つ準備)をしている。
初期化時には以下3つのファイルが呼び出され、それぞれが異なる初期化作業を実行している。
config/initializers以下各ファイル
特定のツールや機能に対する設置ファイルをファイル別に記述する。
config/environments以下
環境別に行いたい初期化作業を記述する
config/application.rb
アプリケーション全体に関する設定を行う
↑言語設定はアプリケーション全体のため、こちらに必要事項を記載する。
ホワイトリストって何?
アプリケーションが対応している言語のホワイトリスト指定
config.i18n.available_locales = %i[ja en]
↑これが何のことか分からなかったため少し調べた。
ホワイトリストとは、悪事に使われないことが分かっているもののリスト。ブラックリストと対をなす。基本的にはまずホワイトリスト(only)が使用されるが、スパムフィルタなど、ホワイトリストで作成しようのないもはブラックリスト(except)にする。
before_actionではonly:[...]を使った方が、アクション追加する時に勝手がいい。(exceptだとその都度追加しなくてはならないので面倒)
config/application.rb(言語設定における記載事項)
アプリケーションが対応している言語のホワイトリスト指定
(なくて良いとのこと)
config.i18n.available_locales = %i[ja en]
デフォルトで使用する言語の指定
config.i18n.default_locale = :ja
localeディレクトリ以外の.ymlファイルも読み込みたい場合
翻訳ファイルはアプリケーションの規模が大きくなるほど、単一ファイルでの管理が難しくなるため、viewの翻訳ファイルをコントローラごとに分割するなどして、自ずと下記の設定が必要になる。
config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}').to_s]
↑config/locales/**/配下にあるrbまたはymlファイルをlocaleファイルとして読み込む
という設定
i18nの定義ファイルを分ける
・モデルに関連する内容のみを記載する
locale/appricationrecord/ja.yml
・Viewnの表示のみの内容を記載する
locale/view/ja.yml
※定義ファイルの設定変更を反映させるには、サーバーを再起動させる必要がある!!
app以下のコード、config/routes.rbなどのファイルは再起動しなくても反映されるが、他のファイルは基本的にはサーバーを再起動し直す必要がある。
※モデルに関連づいたformの場合は、自動的に翻訳が適用されるので、不要にi18nを適用させる必要はない。(form_withがモデルに基づいているのか、url:オプションで送信先を決めているのか注意すること。前者の場合はi18nを適用不要、後者が適用が必要。なぜなら、モデルに紐づいていないから)
たぶん...
tメソッドで参照するとき、タイトルやラベルなどは()かっこがなくても、ブラウザで表示されたが、link_toメソッドでかっこを外すとエラーが出てしまった。link_to t('.crete')
の様にかっこをつけた方が良いのかも。
<h1><%= t'.title' %></h1> <%= f.label t'.email' %>
<div class='text-center'> <%= link_to t('.create'), new_user_path %>
<div class='text-center'> <%= link_to (t'.create'), new_user_path %>
↑かっこが全体を囲う形でも大丈夫だった。
Model.human_attribute_name(attribute)メソッドとは?
Model.model_name.humanメソッドとModel.human_attribute_name(attribute)メソッドを使うことで、モデル名と属性名を透過的に参照できるようになる
↑モデル名と属性名を参照元を明示して国際化対応できるため
以下の翻訳定義において、User.model_name.human
は顧客
を返し、User.human_attribute_name("login")
はログイン
を返す。
ja: activerecord: models: user: '顧客' attributes: user: login: 'ログイン'
lazy lookupについて
ビュー内部でロケールを参照するときに便利な方法
参照する時に長々書かずに済む。
ja: book: index: title: 'チュートリアル'
↑のような辞書、翻訳がある時、以下の様にしてapp/views/books/index.html.erb
ビューテンプレ内部でbook.index.titile値にアクセスできる。
<%= t '.title'%> # 「.」(ドット)が使われていることに注意
参考にしたサイト
【Rails】 I18n入門書~日本語化対応の手順と応用的な使い方 | Pikawaka
【Rails】i18nとは?使い方まとめ。ビュー(View),コントローラー(Controller), コンソールでの呼び出し方とlocaleの使い方 - Qiita