21

复数一个单词很简单:

pluralize(@total_users, "user")

但是如果我想打印“有/有N 个用户/用户”怎么办:

有 0 个用户
有 1 个用户
有 2 个用户

,即,如何复数一个句子

4

4 回答 4

34

您可以为其添加自定义变形。默认情况下,Rails 会添加一个inflections.rbto config/initializers。在那里你可以添加:

ActiveSupport::Inflector.inflections do |inflect|
  inflect.irregular "is", "are"
end

然后,您将能够使用pluralize(@total_users, "is")与用户/用户相同的规则来返回 is/正在使用。

编辑:你澄清了如何复数一个句子的问题。这通常很难做到,但如果你想这样做,你必须深入研究 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."
于 2012-01-09T15:01:58.110 回答
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'
于 2013-04-14T02:19:31.140 回答
5

我认为马丁戈登回答的第一部分非常好。

或者,它有点乱,但你总是可以自己编写逻辑:

"There #{@users.size == 1 ? 'is' : 'are'} #{@users.size} user#{'s' unless @users.size == 1}."
于 2012-01-09T16:43:18.517 回答
0

代码更新:我不再使用@Martin Gordon 的回答中所述的变形路线。由于某种原因,它会导致其他不相关的功能出错。我进行了广泛的测试以确认,但无法找到原因。所以,下面是我现在使用的并且它有效。

有很多方法可以做到这一点。这就是我使用 Rails 6.0.3.4 和 Ruby 2.7.1 的方式。

我想复数这句话:

  • 单数:有 1 个私人群组
  • 复数:有 2 个私人团体

我所做的是我去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") %>

快乐编码!

于 2020-12-18T20:29:12.280 回答