【Rails】I18nでview毎にlocaleを設定する方法

0pt   2018-11-08 10:17
IT技術情報局

一部のviewだけに英語を適応させたい。

I18n.locale = :en

I18nでlocaleを設定して一部のviewだけ英語に適応させたものの、サイドバーやナビバーなど他のテンプレートでは日本語用のlocaleファイルしかないため、translation missing en. ~~~~ と、英語のlocaleファイルなんてないよ!と表示されてしまう。

しかもlocale自体を変更してしまうとキャッシュされてしまうため、view毎に表示が適応されない。
つまり今回の場合、localeを変更せずに日本語、英語を切り替える必要がある。

考えられる対策として、
・ 日本語用のlocaleファイルしかないものは、英語用のlocaleも全て作る。
・ translation missing en. ~~~~ となっている場所を全て日本語に明示的に指定する
・ viewのselfに対して,localeを設定する

というものだが、どれも非常に面倒くさいし日本語版しかないのにわざわざ同じ英語版を作るのも好ましくない。

結局たどり着いた答え↓

localeを明示的かつ動的に指定する

まず、言語を明示的に指定するには第二引数にlocaleを設定してあげる。

I18n.t("views.users.name", locale: :en)

しかし、もちろんこれでは日本語を表示させたい場合であっても英語でしか表示さえれない。
なのでこの:enの部分をグローバル変数として動的に変更させればいい。

app/controllers/users.rb @locale = user.foreigner? ? :en : I18n.default_locale app/views/users.rb I18n.t("views.users.name", locale: @locale)

①コントローラで条件別にlocaleを設定。
②コントローラで設定したlocaleをviewに渡してlocaleで明示的に指定

こうすれば、一部のviewだけに日本語、英語を表示することができる。

Source: rails tag

   ITアンテナトップページへ
情報処理/ITの話題が沢山。