Rails Diary

プログラミングの学習記録です。

国際化する際の柔軟性

修正前

https://i.gyazo.com/86466988460c8b130449f11681031cd8.png

https://i.gyazo.com/7e2839e07132543f37e2158ffdba5c30.png

修正後

https://i.gyazo.com/e569fde633546bd0ebfd068ce12fdd34.png

https://i.gyazo.com/841fb09b8ee1cacb8d19764cdc07ddc9.png

なぜこのように修正するのか?

success: t('defaults.message.created', item: Board.model_name.human)

flash.now[:danger]=t('dafaults.message.not_created', item: Board.model_name.human)

"%{item}を作成しました"として、後から値item: Board.model_name.humanを記載する理由

"〜を作成しました"というメッセージは汎用的であり、例えば今後掲示板へのコメント機能を実装する際にComment.model_name.humanといった形で使い回しができるから。重複して記述を避けることができる。また、実際の現場において後から「作成しました。」とまるを付けてくださいという指示があった際に一箇所の修正で済む。

%{item}という%の表記について

3.3 訳文に変数を渡す

抽象化を正しく行うために、I18n gemには「変数の式展開」機能が含まれており、訳文定義で変数を使えるようにし、翻訳メソッドでそれらに値を渡せるようにします。

使用する言語をローカライズする際、例えばお金の単位は英語で「$10」だが、スペイン語での正しい表記は「10€」であり、下記のような翻訳だと「€10」のように表記されてしまう。

<%= "#{t('currency')}#{@product.price}" %>
#config/locales/en.yml
en:
  currency: "$"
# config/locales/es.yml
es:
  currency: ""

こんな時に使うのが「変数の式展開」機能

翻訳文を英語、スペイン語でそれぞれproduct_price: "$%{price}"product_price: "%{price} €"のようにしておき、ビューでi18nを適用する際に後からprice: @product.priceのように値を代入する形にすれば、どの言語でも柔軟に対応できる。

<%= t('product_price', price: @product.price) %>
# config/locales/en.yml
en:
  product_price: "$%{price}"
# config/locales/es.yml
es:
  product_price: "%{price} €"

%というのは国際化における式展開の書き方らしい!