我对复数有一个很大的问题:当为0时,它确实复数了
pluralize(@posts.size,"post")
如果@ posts.size等于0:
0 posts
如果@ posts.size等于1:
1 post
如果@ posts.size等于2或更多:
n posts
因为默认情况下不应该在0时添加s,所以我输了。有没有人在这看到什么问题?
答案 0 :(得分:2)
任何不是1的数字都被视为复数。而不是说:
You have 0 posts.
正确的英语句子是:
You do not have any posts.
编辑:您的请求相当大,任何人(至少对我来说)都可能无法将其简洁地放在一个帖子中。我宁愿建议你阅读国际化(通常称为i18n)doc。
http://guides.rubyonrails.org/i18n.html
基本上,有两件事,Translations
和Inflectors
。
Inflectors是定义字符串或模式如何替换为单数或复数或如果它不可数的规则。例如,is
的复数are
被定义为变形器。
I18n可帮助您为字符串定义区域设置指定的人性化文本。如果您在Rails项目的config
文件夹中看到,您将看到一个名为locales
的文件夹,其中包含每个区域设置的单个YAML
文件。这种用于语言环境的人性化文本称为翻译。
pluralize
是一个在3个地方定义的函数:
String
的实例方法。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
在此处提出更多问题,让专家更详细地解释。
希望这会对你有所帮助。
答案 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"
所以我不必创建新的配置文件,只需使用语言环境