Rails I18n:根据语言环境调用不同的逻辑

时间:2012-02-09 03:44:01

标签: ruby-on-rails internationalization

我有一个自定义辅助方法,可以输出保存的百分比。例如,它将计算物品的折扣并输出“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

有更好的方法吗?

2 个答案:

答案 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 %>

不确定这是管理翻译块的最佳方法,但我发现它很有用))