【问题标题】:Rails i18n pluralization: InfinityRails i18n 复数形式:Infinity
【发布时间】:2017-12-17 07:13:16
【问题描述】:

我的应用的定价计划包含一些不受限制的功能。例如,在“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”?

【问题讨论】:

  • 在为插值other: "%{count} Forms"提供字符串时需要使用引号。在 YAML 中,%(很少)用于向解释器提供特殊指令。 yaml.org/refcard.html
  • 谢谢,很好。这就是导致异常的原因。我改写了这个问题;我仍然想插入“无限”来代替“无限”。

标签: ruby-on-rails internationalization rails-i18n


【解决方案1】:

使用以下内容创建文件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 并传入计数。如所指出的外面有

【讨论】:

  • 已编辑。 finite?Float 定义,因此在 Fixnum 上调用 finite? 会导致 NoMethodError
  • 完美,正是我想要的。我很困惑的一件事 - 为什么config/locales/plural.rb 是一个哈希值,是什么?还有你是怎么想出来的?我阅读了github.com/svenfuchs/rails-i18n 的源代码,发现这一切都错了。
  • @mysmallidea 我是从 this post 获取的,因为它是从 2011 年开始的,我不确定它是否仍然有效工作。我仍在努力解决这一切的“如何”以及为什么我自己会散列,如果我能找到任何答案,我会更新我的答案
  • @max 看来你是对的,我在 ruby​​ 2.4 中,它不再有 Fixnum(并且 Numeric 是有限的?所以当我测试一个整数时一切正常),我会更新答案
  • 啊,我在 2.3.1 上测试过,这就解释了为什么我会出错。
猜你喜欢
  • 1970-01-01
  • 2011-12-20
  • 1970-01-01
  • 1970-01-01
  • 2013-10-11
  • 1970-01-01
  • 2017-04-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多