i18nで例えば大人と子供で文言を変えたい場合
条件に応じて文言を変えたい場合があると思います。
例えば大人と子供で文言を変えたい場合とかですかね。
ログインユーザが大人の場合は大人料金と表示し、子供の場合は子供料金と表示するようにします。
1 2 3 4 5 |
|
これが一箇所ならいいですが、たくさん出現するとつらいですね。
helperにまとめたりするのでしょうか。
こういった文言だけのif文分岐がviewに大量に出現するとコード量も増え非常に見ずらく、またhelperに乱立してしまうのは避けたいですね。
そこで自動でi18nの読み込み先を条件に応じて読み替えたいと思います
ついでにjpmobile使用してviewをpcとスマフォで切り替えている場合に
lazy lookup記法時にスマフォページでsmart_phoneがついているlocaleを探してしまうのを防ぎます。
config/initializers/switch_translation_helper.rbを作ります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
|
上記の(A)でActionView::Helpers::TranslationHelperを再オープンしてprependでSwitchTranslationHelperを差し込みます。
これでメソッド呼び出しの順序がSwitchTranslationHelperのtransalteメソッドの方が先に呼ばれるようになります。
aliasは呼ばれたクロージャ的な動きで呼ばれた段階のメソッドが固定されるようなので再度SwitchTranslationHelperのメソッドを向くように設定しなおしています。
transalateメソッドではキーの先頭に大人ならadult、子供ならchildを挿入します。
またlazy lookup(先頭に.がついている呼びだし)時にsmart_phoneが含まれるview内の場合ではpcもスマフォも同一の文言を使いたいのでキーからsmart_phoneを削除しています。
その後superを読んで元のRailsのi18nの流れへ戻しています。
次にja.ymlを作ります。
1 2 3 4 5 6 7 8 9 10 11 12 |
|
これでpriceコントローラのshowアクションのテンプレート内で
1
|
|
とすると、ユーザが大人の場合は大人料金。
ユーザが子供の場合は子供料金と表示されます。
prefixの条件を変えることで読込先をうまく切り替えることができますね。