Rails I18n: вызов другой логики в зависимости от локали - PullRequest
1 голос
/ 09 февраля 2012

У меня есть собственный вспомогательный метод, который выводит сохраненный процент.Например, он рассчитает скидку на товар и выдаст «скидка 20%».

Я локализую сайт на китайский, и на китайском языке эта же скидка выражена по-разному. «20% скидка» выражается как «8 Cut» или «80% от первоначальной цены» .Поскольку эти два выражения совершенно разные, я думаю, что мне нужно написать две версии вспомогательного метода.

В настоящее время я написал это так, проверяя локаль в самом помощнике:

  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 ]

2 голосов
/ 10 февраля 2012

Возможно, вы захотите изменить код, чтобы вычисление числа, использованного для представления скидки, было отделено от выбора / создания вашего локализованного сообщения.

Вот идея в этом духе:

В вашем 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 голос
/ 10 февраля 2012

Единственная плохая вещь в вашем помощнике, которую я вижу, это то, что вы пишете процентную скидку, но не очевидно, что она вернется (поэтому я бы создал здесь 2 различных вспомогательных метода.

Замечу ли яиспользование проверки локали в представлениях выглядит не очень красиво, когда вы видите, что блоки для разных переводов стали совершенно разными, поэтому я создал вспомогательный метод 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 %>

Не уверен, что это лучший способ управления переведенными блоками, но я нашел его полезным))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...