当count为0时,ra​​ils4 // pluralize do复数

时间:2014-10-30 11:01:56

标签: string ruby-on-rails-4 pluralize

我对复数有一个很大的问题:当为0时,它确实复数了

pluralize(@posts.size,"post")

如果@ posts.size等于0:

0 posts

如果@ posts.size等于1:

1 post

如果@ posts.size等于2或更多:

n posts

因为默认情况下不应该在0时添加s,所以我输了。有没有人在这看到什么问题?

2 个答案:

答案 0 :(得分:2)

任何不是1的数字都被视为复数。而不是说:

You have 0 posts.

正确的英语句子是:

You do not have any posts.

查看herehere

编辑:您的请求相当大,任何人(至少对我来说)都可能无法将其简洁地放在一个帖子中。我宁愿建议你阅读国际化(通常称为i18n)doc。

http://guides.rubyonrails.org/i18n.html

基本上,有两件事,TranslationsInflectors

Inflectors是定义字符串或模式如何替换为单数或复数或如果它不可数的规则。例如,is的复数are被定义为变形器。

I18n可帮助您为字符串定义区域设置指定的人性化文本。如果您在Rails项目的config文件夹中看到,您将看到一个名为locales的文件夹,其中包含每个区域设置的单个YAML文件。这种用于语言环境的人性化文本称为翻译。

pluralize是一个在3个地方定义的函数:

  1. 内部变形模块。
  2. 作为String的实例方法。
  3. 作为ActionView内的帮助方法。
  4. 通常在Rails中,我们调用helper方法,该方法可以调用String的方法,该方法又调用Inflector的方法。

    您尝试在config/initializers/filename.rb中添加以下代码并尝试再次运行:

    module ActionView
      module Helpers
        module TextHelper
          def pluralize(count, singular, plural = nil)
            "#{count || 0} " + ([0, 1, '0', '1'].include?(count) ? singular : (plural || singular.pluralize))
          end
        end
      end
    end
    

    这将返回0 post,但仅针对en的默认语言环境。如果您希望针对特定语言环境执行此操作,请使用所选语言环境调用String pluralize函数,并将其作为3参数传递给上面的函数。例如,对于fr语言环境,您可以尝试类似:

    pluralize 0, "post", "post".pluralize(:fr) # => will return for fr locale
    

    在此处提出更多问题,让专家更详细地解释。

    希望这会对你有所帮助。

答案 1 :(得分:0)

我为此使用了另一种方法:

我认为:

= t('counts.offers', count: project.nb_offers)
# t() is a shortcut for I18n.translate

第一个参数是文件区域设置文件中的路径,第二个参数是您要计算的内容。

然后,在您的config / locales / xx.yml中(以我为例):

fr:
  counts:
    offers:
      zero: 0 offre
      one: 1 offre
      other: "%{count} offres"

所以我不必创建新的配置文件,只需使用语言环境