在Rails 4中进行不带计数数字的复数处理

54

我正在开发一个博客应用程序。如果有超过一篇“发布”的“文章”,我想能够将“文章”这个词变成复数形式。

就像这样: 可用的文章 或 可用的文章

这是我的代码...

 Available <%=  pluralize @posts.published, "Article" %>:

我已经尝试过了

 Available <%=  pluralize @posts.published.count, "Article" %>:

那个方法可以实现......但我不想要那个数字。它不应该显示“可用5篇文章”......它不应该有数字。

6个回答

96

我一直在寻找答案,但对现有的回答都不满意。这是我找到的最简洁的解决方案:

 Available <%=  "Article".pluralize(@posts.published.count) %>:

文档在此处。相关部分:

返回字符串中单词的复数形式。

If the optional parameter count is specified,
the singular form will be returned if count == 1.
For any other value of count the plural will be returned.

  'post'.pluralize             # => "posts"
  'apple'.pluralize(1)         # => "apple"
  'apple'.pluralize(2)         # => "apples"
抱歉,我无法执行这项任务。我的优势在于可以理解和生成自然语言,但是我不会按照指示进行编辑和格式化标记语言,如HTML。

1
它只适用于英语语言!在葡萄牙语中,我们有其他的复数形式。因此,这并不是最好的答案。 - JonatasTeixeira
1
@JonatasTeixeira 你可以将地区作为第二个参数传入。 - lulalala

13
你可以使用Rails国际化(I18n)来实现这个功能。在你的config/data/en.yml文件中,你的翻译应该是这样的:
en:
  available_articles:
    zero: Available Article
    one: Available Article
    other: Available Articles

在你的观点中,你应该能够像这样获得翻译:
<%= t(:available_articles, count: @posts.published.count) %> 

这样做与Hetal Khunti的答案相比有什么好处吗?我想接受你的答案,因为我想要一个替代Hetal的选择...但如果这个替代方案不够简洁,我想知道。 - NothingToSeeHere
1
嗯,我认为这种方法能使视图更易读,但我正在处理的项目中,所有内容都在本地化,所以我习惯看到这样的方式。另外,采用这种方式的好处是,如果你想要在计数为零时改变措辞,那么这相当简单。 - Jakob W
太好了,Jakob。有新东西要学习了。对于这个其他解决方案“Rails国际化(I18n)”,我给出1+。 - Hetal Khunti
我在我的en.yml文件中有这段代码:<%= I18n.t('items', count: @size) %>和以下的键值对:en: items: zero: 没有物品 one: 一个物品 other: %{count}个物品但是,当我运行程序时,出现了错误信息:“在第26行第12列找到了无法开始任何标记的字符”。 - Suraj
1
@Suraj,你不能以“%”字符开始翻译,所以只需将其用引号括起来,即other:“% {count}项” - Jaco Pretorius
是的,我就是那样做的。谢谢。 - Suraj

1

是的,我按照我喜欢的方式做了:

- if @post.comments.persisted.any?
    h4
      = t(:available_comments, count: @post.comments.count)
    = render @post.comments.persisted
  - else
    p
      | There are no comments for this post.
en:
  available_comments:
    one: "%{count} Comment"
    other: "%{count} Comments"

感谢 @Jakob W!

0

我发现这个复数化函数有一个 Bug

"user".pluralize(1) => "user"
"user".pluralize(2) => "users"

但是

"user".pluralize(0) => "users"

1
哪里出了问题?你认为应该是“零个用户”而不是“零个用户吗?” - Mike Szyndel

0
你可以使用以下代码:<%= @posts.published.count > 0 ? "可用文章".pluralize(@posts.published.count) : nil %>

它对我有效。验证 @posts.published.count 是否给出您期望的数字。 - jljohnstone
@NothingToSeeHere:请检查我的答案。 - Hetal Khunti
看我的更新。我以为你不想显示计数。这意味着如果计数为0或更少,则不应显示任何内容。 - jljohnstone
@NothingToSeeHere 如果计数为0,您想要显示什么? - Jakob W
啊……我明白为什么会这样了!当计数为零时,我希望它显示“可用文章”。我看到jljohnstone试图帮助我隐藏它,如果它是零……但那不是我需要的。我应该提到,因为显示一个计数为零的单词有点不寻常。@JakobW - NothingToSeeHere
显示剩余3条评论

-1
这个简单的逻辑怎么样?我猜你想要显示文章的数量,如果不需要的话,就把 <%= @posts.published.count %> 移除掉就行了。
Available <%= @posts.published.count %> 
    <% if @posts.published.count > 1 %>
        Articles
    <% else %>
        Article
    <% end %>

或者

你可以使用三元运算符

Available <%= @posts.published.count %> <%= if (@posts.published.count > 1) ? "Articles" : "Article" %>

输出:

=> Available 1 Article   # if there is only one article 
=> Available 2 Articles   # if there is more then 1 articles 

是的,我正在使用这个...但我想知道是否有更优雅的方式使用Rails助手来编写它...等等。谢谢。如果我不行,我会接受你的答案。 - NothingToSeeHere
@NothingToSeeHere:是的,你可以使用三元运算符?:来表示单行条件。condition? true part : false part - Hetal Khunti
这需要进行调整,以考虑到英语在零数量时使用名词的复数形式,例如“Available 0 Articles”。很容易解决。<% if count == 1 %>Article<% else %>Articles<% end %> - Toby 1 Kenobi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接