Rails i18n 复数:无穷大

Rails i18n pluralization: Infinity

我的应用程序的定价计划有一些不受限制的功能。例如,在 "Pro" 版本中,您可以获得 10 个表格,而在 "Unlimited" 版本中,您可以获得无限个表格。

这在计划模型中用整数或 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 将插值 "Unlimited" 而不是 "Infinity"?

使用以下

创建一个文件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 得到调用传入的计数。正如所指出的,有