我有一个自定义辅助方法,可以输出保存的百分比。例如,它将计算物品的折扣并输出“20%的折扣”。
我正在将网站本地化为中文,而在中文中,相同的折扣表达方式不同。 “20%折扣”表示为“8 Cut”或“80%原价”。由于这两个表达式完全不同,我想我需要编写两个版本的helper方法。
目前我这样写了,检查帮助器本身的区域设置:
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
有更好的方法吗?
答案 0 :(得分:2)
您可能希望重构代码,以便将用于表示折扣的数字的计算与选择/创建本地化消息分开。
以下是这样的想法:
在en.yml
:
# value for "n% off"
discount_msg: "%{n}% off!"
在zh.yml
:
# 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))
答案 1 :(得分:1)
你可以看到帮助器中唯一不好的事情就是你写了百分之百折扣,但是它不会显示它会返回什么(所以我会在这里创建两种不同的辅助方法。
我注意到当视图块对于不同的翻译变得完全不同时,在视图中使用区域设置检查看起来并不漂亮,所以我为此创建了一个i18n辅助方法:
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 %>
不确定这是管理翻译块的最佳方法,但我发现它很有用))