将单个单词复用很简单:
pluralize(@total_users, "user")
但如果我想打印“有是 N用户/用户”该怎么办:
有0位用户
有1位用户
有2个用户
,即如何复数句子 ?
答案 0 :(得分:33)
您可以为其添加自定义变形。默认情况下,Rails会将inflections.rb
添加到config/initializers
。在那里你可以添加:
ActiveSupport::Inflector.inflections do |inflect|
inflect.irregular "is", "are"
end
然后,您就可以使用pluralize(@total_users, "is")
返回使用与用户/用户相同的规则。
编辑:您澄清了如何复句化的问题。这通常要难得多,但如果你想这样做,你必须dive into NLP。
正如评论所暗示的那样,你可以用I18n做一些事情,如果你只想用几句话来做,你可以建立这样的东西:
def pluralize_sentence(count, i18n_id, plural_i18n_id = nil)
if count == 1
I18n.t(i18n_id, :count => count)
else
I18n.t(plural_i18n_id || (i18n_id + "_plural"), :count => count)
end
end
pluralize_sentence(@total_users, "user_count")
在config/locales/en.yml
:
en:
user_count: "There is %{count} user."
user_count_plural: "There are %{count} users."
答案 1 :(得分:7)
这可能是Rails i18n复数功能最好的。改编自http://guides.rubyonrails.org/i18n.html#pluralization
I18n.backend.store_translations :en, :user_msg => {
:one => 'There is 1 user',
:other => 'There are %{count} users'
}
I18n.translate :user_msg, :count => 2
# => 'There are 2 users'
答案 2 :(得分:5)
我认为马丁戈登答案的第一部分非常好。
或者,它有点乱,但你总是可以自己编写逻辑:
"There #{@users.size == 1 ? 'is' : 'are'} #{@users.size} user#{'s' unless @users.size == 1}."
答案 3 :(得分:0)
代码更新:我不再使用@Martin Gordon 的回答中所述的拐点路线。由于某种原因,它会导致其他不相关的函数出错。我做了大量的测试来确认,但无法找到原因。所以,下面是我现在使用的并且有效。
有很多方法可以做到这一点。这就是我使用 Rails 6.0.3.4 和 Ruby 2.7.1 做到的。
我想把这句话复数化:
我所做的是转到 application_helper.rb
并添加了以下代码:
def pluralize_private_statement(list, word)
num_in_list = list.count
is_or_are = num_in_list == 1 ? 'is' : 'are'
return "There " + is_or_are + " " + num_in_list.to_s + " private " + word.pluralize(num_in_list)
end
现在,在我看来,我必须使用的是:
<%= pluralize_private_statement(private_groups, "group") %>
# private_groups = 2
# -> There are 2 private groups
application_helper.rb
中的代码首先为传递的列表中的项目数创建一个变量并将其存储在 num_in_list
中。然后它创建第二个变量,检查 num_in_list 是否等于 1,如果是,则返回“is”,否则返回“are”。然后,它返回用获得的信息构造的句子。
句子的第一部分是一个简单的字符串,然后是 is_or_are 变量,如上所述,它包含“is”或“are”。然后它添加一个包含列表项数的空格,从整数转换为字符串,后跟“私有”字。然后它添加传递给初始函数的单词的复数形式;但是,只返回单数/复数词,没有像 pluralize(@total_users, "is")
那样附加数字。
以下是您如何将其用于您的特定问题。
首先,将其添加到您的 application_helper.rb
文件中:
def pluralize_sentence(list, word)
num_in_list = list.count
is_or_are = num_in_list == 1 ? 'is' : 'are'
return "There " + is_or_are + " " + num_in_list.to_s + " " + word.pluralize(num_in_list)
end
最后,您可以在任何需要复数句子的地方使用此代码:
<%= pluralize_sentence(@total_users, "user") %>
快乐编码!