Rails i18n复数:无限

时间:2017-07-12 18:08:37

标签: ruby-on-rails internationalization rails-i18n

我的应用的定价计划有一些无限的功能。例如,在" Pro"版本,你得到10个表格,并在"无限"版本你得到无限的形式。

这在Plan模型中用整数或Float :: Infinity表示。

pro = Plan.find_by name: 'Pro'
pro.forms_limit
#=> 10

unl = Plan.find_by name: 'Unlimited'
unl.forms_limit
#=> Float::INFINITY

在视图中:

= t('.forms', count: plan.forms_limit)

我试图找到一种有效的方法来插入I18n。我想做的是:

plans:
  index:
    forms: 
      zero: No Forms
      one: 1 Form
      other: "%{count} Forms"
      infinity: Unlimited Forms

这会起作用,但会导致不希望的输出,如:

"Infinity Forms"

有没有办法构建这个,以便Infinity将插入"无限"而不是" Infinity"?

1 个答案:

答案 0 :(得分:2)

使用以下

创建文件config/locales/plurals.rb
{
  en: {
    i18n: {
      plural: {
        keys: [:one, :other, :infinity],
        rule: lambda do |n|
          if n == 1
            :one
          elsif n == Float::INFINITY
            :infinity
          else
            :other
          end
        end
      }
    }
  }
}

然后在我的config/locales/en.yml中,我有

en:
  forms:
    zero: 'No Forms'
    one: '1 Form'
    other: '%{count} Forms'
    infinity: 'Unlimited Forms'

config/initializers/locale.rb

中添加
I18n::Backend::Simple.send(:include, I18n::Backend::Pluralization)

并在IRB中测试

I18n.t(:forms, count: 0)
# => "No Forms"
I18n.t(:forms, count: 1)
# => "1 Form"
I18n.t(:forms, count: 10)
# => "10 Forms"
I18n.t(:forms, count: Float::INFINITY)
# => "Unlimited Forms"

这是做什么的?

这并不像我想象的那么神秘。我第一次尝试了它(从this related question获得了想法。

当您加入I18n::Backend::Pluralization时,它将开始在加载路径中的任何位置寻找应响应呼叫的密钥i18n.plural.rule。因此plurals.rb文件名不重要,只需要确保它是I18n.load_path中的文件。

我们将该文件设置为带有哈希的ruby文件,以便我们可以将i18n.plural.rule键设置为lambda(因此它响应call)然后调用lambda并计数传递正如所指出的那样