string - rails4//pluralize 当计数为 0 时进行复数化

标签 string ruby-on-rails-4 pluralize

我对 pluralize 有一个大问题:当为 0 时,它会复数这个词

pluralize(@posts.size,"post")

如果@posts.size 等于 0 :

0 posts

如果@posts.size 等于 1:

1 post

如果@posts.size 等于或大于 2:

n posts

默认情况下它不应该在 0 时添加 s,我迷路了。有人看到这里出了什么问题吗?

最佳答案

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

You have 0 posts.

正确的英文句子是:

You do not have any posts.

看看herehere .

编辑:您的要求相当大,任何人(至少对我而言)都不可能将其简洁地放在一个帖子中。我宁愿建议您阅读国际化(通常称为 i18n)文档。

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

基本上,有两件事,TranslationsInflectors

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

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

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

  1. Inflector 模块。
  2. 作为 String 的实例方法。
  3. 作为 ActionView 中的辅助方法。

通常在 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

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

希望对你有帮助。

关于string - rails4//pluralize 当计数为 0 时进行复数化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26651269/

相关文章:

ruby-on-rails - 如何使用secrets.yml 在Rails 4.1 中动态生成 secret token ?

ruby-on-rails - Rails 的常用 XSS 保护有多防弹?

ruby-on-rails - Rails 中的非标准多元化

nlp - 词干提取和去复数化之间的区别

java - 如何阻止 if/else 中的 else 被执行?

c++ - 关于 string.c_str() 生命周期

c++ - 选择哈希键类型的理由

java - 如何截断一定长度的字符串但截断后包含完整的单词

ruby-on-rails - ruby on Rails 应用程序重新启动时执行脚本

python - Django {% blocktrans %} : How to handle pluralization inside a for loop?