我对复数有一个大问题:当为 0 时,它确实复数了这个词
pluralize(@posts.size,"post")
如果 @posts.size 等于 0 :
0 posts
如果 @posts.size 等于 1 :
1 post
如果 @posts.size 等于 2 或更多:
n posts
因为默认情况下它不应该在 0 时添加 s,所以我迷路了。有没有人看到这里出了什么问题?
我对复数有一个大问题:当为 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.
编辑:您的请求相当大,任何人(至少对我而言)可能无法简洁地将其放在一个帖子中。我宁愿建议您通读 Internationalization(通常称为 i18n)文档。
http://guides.rubyonrails.org/i18n.html
基本上,有两件事,Translations
和Inflectors
。
变形器是定义字符串或模式如何替换为单数或复数或者它是否不可数的规则。例如,复数 for is
isare
被定义为屈折词。
I18n 帮助您为字符串定义语言环境指定的人性化文本。如果您在 Rails 项目中config
看到文件夹内,您将看到一个名为 的文件夹locales
,其中包含YAML
每个语言环境的单个文件。这种针对语言环境的人性化文本称为翻译。
pluralize
是在 3 个地方定义的函数:
String
的实例方法。ActionView
。通常在 Rails 中,我们调用 helper 方法,它可能会调用 String 的方法,而 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 复数函数并将其作为 3 个参数传递给上述函数。例如,对于fr
语言环境,您可以尝试以下操作:
pluralize 0, "post", "post".pluralize(:fr) # => will return for fr locale
在 SO 上提出更多问题,让专家更详细地解释。
希望这对您有所帮助。
我为此使用了另一种方法:
在我看来:
= t('counts.offers', count: project.nb_offers)
# t() is a shortcut for I18n.translate
第一个参数是你的文件语言环境文件中的路径,第二个是你要计算的东西。
然后,在您的 config/locales/xx.yml (在我的情况下为 fr):
fr:
counts:
offers:
zero: 0 offre
one: 1 offre
other: "%{count} offres"
所以我不必创建新的配置文件,只需使用语言环境