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 得到调用传入的计数。正如所指出的,有
我的应用程序的定价计划有一些不受限制的功能。例如,在 "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 得到调用传入的计数。正如所指出的,有