国際化する際の柔軟性
修正前
修正後
なぜこのように修正するのか?
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}という%の表記について
抽象化を正しく行うために、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} €"
%というのは国際化における式展開の書き方らしい!