Rails I18n について理解したことをまとめます。
今回行いたかったこと
- I18nを利用して、Railsのviewファイル内の翻訳
I18n導入について
- まず、I18nを導入する際に、config/application.rb内に以下のコードを追加します。
config.i18n.load_path += Dir[Rails.root.join('config/locales/**/*.{rb,yml}')]
config.i18n.default_locale = :ja
ymlファイルの作成
- 次にconfig/locales内に、ja.ymlファイルを作成します。
- 自分の場合は、view用にja.ymlを分割したかったので、config/locales/view/モデル名/ja.ymlとしました。
- 作成が完了しましたら、ja.yml内に翻訳したい言葉と翻訳後の言葉を記載していきます。
ja:
defaults:
Tasks Index: 'タスク一覧'
New Task: 'タスクを登録する'
tasks:
index:
Tasks Index Page: 'タスク一覧ページ'
title: 'タイトル'
content: '内容'
created_at: '作成日時'
Show: '詳細'
Edit: '編集'
Destroy: '削除'
Are you sure?: '本当に削除してもよろしいですか?'
- 今回はTaskモデルのviewのindexファイル内の言葉を翻訳したいので上記のように記述しました。
- また、default内にはapplication.html.erbに記載したヘッダーを翻訳するための言葉を記載してあります。
ymlファイルに記載した言葉をviewファイルで呼び出す
- それではいよいよ本題に入ります。
- viewのindexファイル内にて翻訳した言葉を呼び出す際には、I18nについて解説している記事では多くの場合、<%= t('.title') %>のように記載してやる必要があると書かれています。
- しかしながら、この参照方法についてよく理解しないまま活用しようとしてしまうと"translation missing: ja.title"とエラーが発生してしまします。
"translation missing:"が出た際に確認すること
- 上記の続きで、<%= t('.title') %>をドットより左側を省略しない書き方で書いてみようと思います。
<%= t('tasks.index.title') %>
- 省略しない場合、 「tasks.index」が加わりました。では、この「tasks.index」はなんなのでしょうか?
- ここで、先ほどのymlファイルをみてください。
ymlファイル内にja:を1つインデントした段にtasksとあります。
さらに、tasksを1つインデントした段にindexがあります。
そして、indexを1つインデントした段にtitleが現れます。
つまり、ja:から目的の言葉にたどり着くまでの流れをインデントをドットに置き換えて表現しているということです。 - 実際にrails consoleにて確認してみました。
- コンソールではtに全てのパスを与えてやらないと値を取得できません。
そのため、「.title」では何を取得してきたらいいのか見つけられないのでエラーとなってしまいます。
なぜ<%= t('.title') %>で値を取得でき、翻訳可能なのか?
- ここまで、理解できた方の中には、「じゃあめんどくさいから全部記述してしまえばいいじゃないか」と思われる方もいるかも知れません。
実際には、それで動くのでそれでも構いません。 - しかし、コードリーディングする際に意味がわからなくなるかも知れないのでこの部分についても解説します。
- ここで、viewファイルの中のファイルパスに注目してみます。
tasksフォルダの中に、indexファイルがあります。
ここで、何か気づかないでしょうか?
そうです。
ymlファイルから目的の言葉を取り出す際に記述した流れと同じなのです。
ymlファイルでは、インデントを付けることで、ファイルパスを表しています。
そして、<%= t('.title') %>はtasksフォルダ内のindexファイルに記述されています。
- このことより、ファイルパスを記載する必要がなくなるので、<%= t('tasks.index.title') %>の「tasks.index」の部分は省略可能となるのです。
おまけ
- ja.ymlファイルに記載したdefaults部分を利用して、view/layout/applicationファイル内に記載したヘッダー部分を翻訳してみたいと思います。
- 実際に記載したコードは以下の通りです。
<%= link_to t('defaults.Tasks Index'), tasks_path, id: 'tasks-index' %>
<%= link_to t('defaults.New Task'), new_task_path, id: 'new-task' %>
- 先ほどの<%= t('.title') %>のようにドットで省略表記できない理由がわかりますか?
わかればI18nについてマスターしたと言っても過言ではないですね!🎉 - 理由は、記載しているファイル名がapplicationであり、defaultsではないためです。そのため、省略してしまうとdefaultsインデント下のTasks Indexと.New Taskの翻訳文を参照することができません。
まとめ
- 今回はI18nを利用する際にポイントとなるymlファイルからの取り出しについて理解したことをまとめました。
- localesフォルダ内にてファイルをこまめに分割することで、見やすく整理しやすくなると思いますので、取り出し方についてマスターして国際化の波に備えましょう!!