Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails i18n多元化:无限_Ruby On Rails_Internationalization_Rails I18n - Fatal编程技术网

Ruby on rails Rails i18n多元化:无限

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”版本中,您可以获得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"

有没有一种方法可以使无穷大插入“无限”而不是“无限”呢

创建一个包含以下内容的文件
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中测试了它,这解释了我为什么会出错。