2012-02-09 7 views
1

保存されたパーセンテージを出力するカスタムヘルパーメソッドがあります。たとえば、アイテムの割引を計算し、 "20%off"を出力します。Rails I18n:ロケールに基づいて異なるロジックを呼び出す

私はサイトを中国語にローカライズしていますが、中国語では同じ割引が異なって表現されています。 「20%off」は、「8カット」または「元価格の80%」で表されます。これらの2つの表現は全く異なるので、私はヘルパーメソッドの2つのバージョンを書く必要があると思います。

は現在、私はヘルパー自体にロケールを確認し、このようにそれを書いた:

def percent_off(discount, locale=I18n.locale) 
     if not locale.to_s.include?('zh') 
     n = ((1 - (discount.preferential_price/discount.original_price)) * 100) .to_i 
     "#{n}% off" 
     else 
     # Chinese 
     n = ((discount.preferential_price/discount.original_price) * 10) .to_i 
     "#{n} cut" 
     end 
    end 

はこれを行うには良い方法はありますか?

答えて

1

私が見ることができるあなたのヘルパーで唯一の悪い点の・ギアは、あなたがpercent_off割引を書くということですが、それはそれは(私はここに2つの異なるヘルパーメソッドを作成します戻ります何明らかではありません。

私が使用して注目されますあなたはブロックが異なる翻訳のための完全に異なるとなった表示したときのビューでのロケールのチェックはかなり見ていないので、私はその目的のための国際化ヘルパーメソッドを作成しました:

module ApplicationHelper 
    def translate_to(locales, &blk) 
    locales = [locales.to_s] if !locales.is_a?(Array) 
    yield if locales.include?(I18n.locale.to_s) 
    end 
    alias :tto :translate_to 
end 

とビューで:

<% tto :en do %> 
    <% # some en-translated routine %> 
<% end %> 
<% tto :zh do %> 
    <% # zh-translated routine %> 
<% end %> 
0を

翻訳されたブロックを管理する最善の方法はわかりませんが、便利です))

2

割引を表す数値の計算が選択/作成から切り離されているように、コードをリファクタリングしますあなたのローカライズされたメッセージここで

は、これらの線に沿ってアイデアです:あなたen.yml

あなた zh.yml
# value for "n% off" 
    discount_msg: "%{n}% off!" 

# value for "(100-n)% of original price" 
    discount_msg: "%{n}% of original price (in Chinese)" 

それだけで計算するように次にpercent_offヘルパーメソッドをリファクタリング暗黙のロケールに応じて正しい値割引値:

def percent_off(discount) 
    n = ((1 - (discount.preferential_price/discount.original_price)) * 100) .to_i  
    if I18n.locale.to_s.include?('zh') 
    n = 100 - n 
    end 
    n 
end 

その後、あなたは上記のような呼び出すことができます:

I18n.t('discount_msg', :n=>percent_off(discount)) 
+0

を私は今、あなたのソリューションは、最もきれいだと思いますが、各ロケールの文言とロジックは非常に密接に結合されているので、私は一緒になりますが、それらを入れて感じます簡単に管理できます。 – lulalala

関連する問題