Ruby on rails Rails i18n多元化:无限
我的应用程序的定价计划有一些功能是无限的。例如,在“Pro”版本中,您可以获得10张表单,而在“Unlimited”版本中,您可以获得无限表单 这在计划模型中由整数或Float::Infinity表示Ruby on rails Rails i18n多元化:无限,ruby-on-rails,internationalization,rails-i18n,Ruby On Rails,Internationalization,Rails I18n,我的应用程序的定价计划有一些功能是无限的。例如,在“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('.for
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"
有没有一种方法可以使无穷大插入“无限”而不是“无限”呢 创建一个包含以下内容的文件
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"
这是干什么的?
这并不像我当时想的那么神秘。我第一次尝试它(从中获得灵感)
当您包含它时,它将开始寻找一个键i18n.plural.rule
,它应该在加载路径的任何位置响应调用。因此plurals.rb
文件名并不重要,只需确保它是i18n.load\u路径中的一个文件
我们将该文件设置为一个带有散列的ruby文件,这样我们就可以将i18n.plural.rule
键设置为lambda(因此它响应调用
),然后调用lambda并传入计数
{
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"
这是干什么的?
这并不像我当初想的那么神秘。我第一次尝试了它(从中获得灵感)
当您包含它时,它将开始寻找一个键i18n.plural.rule
,它应该在加载路径的任何位置响应调用。因此plurals.rb
文件名并不重要,只需确保它是i18n.load\u路径中的一个文件
我们将该文件设置为一个带有散列的ruby文件,这样我们就可以将i18n.plural.rule
键设置为lambda(因此它响应调用
),然后调用lambda并传入计数。正如前面指出的那样,在为插值提供字符串时,需要使用引号
。在YAML%中,
用于(很少)向解释器提供特殊指令。谢谢,很好的捕获。这就是导致异常的原因。我重新表述了这个问题;我仍然希望插入“Unlimited”来代替“Infinity”。在为插值其他:%{count}形式提供字符串时,需要使用引号
。在YAML%中,
用于(很少)向解释器发出特殊指令。谢谢,捕捉得好。这就是导致异常的原因。我重新表述了问题;我仍然想插入“无限”来代替“无限”.Edited.finite?
是由Float
定义的,所以在Fixnum上调用finite?
会导致NoMethodError
。完美,正是我想要的。有一件事我很困惑-为什么config/locales/multiple.rb
是一个散列,是什么引起的?你是怎么弄明白的?我通读了全文“我的想法是从2011年开始的,我不确定它是否仍然有效。我在我的测试应用程序中提供了一个你想要的示例,它似乎仍然有效。我仍在努力解决所有这些问题的“如何”以及为什么会散列,如果我得到一个答案,我会更新我的答案。”你有什么发现吗out@max看来你是对的,我在ruby 2.4中,它不再有Fixnum(而Numeric有finite?所以当我测试一个整数时,一切都正常了),我会更新答案啊,我在2.3.1上测试了它,这解释了我为什么会出错。编辑。finite?
是由Float
定义的,所以在Fixnum上调用finite?
会导致NoMethodError
。完美,正是我想要的。有一件事我很困惑,为什么config/locales/multiple.rb
是散列,这是怎么回事?你是怎么知道的?我在上读了源代码,但看的都是错的。@mysmallidea我是从2011年开始读的,我不确定它是否仍然有效。我在我的测试应用程序中提供了一个你想要的示例,它似乎仍然有效。我仍在尝试通过我自己也知道这一切的“方式”和原因,如果我能找到任何东西,我会更新我的答案out@max看来你是对的,我在ruby 2.4中,它不再有Fixnum(而Numeric有finite?所以当我测试一个整数时,一切正常),我会更新答案,我在2.3.1中测试了它,这解释了我为什么会出错。