我的应用的定价计划有一些无限的功能。例如,在" 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"?
答案 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并计数传递正如所指出的那样