Как сделать множественное число «Есть / есть N объект / объекты»? - PullRequest
20 голосов
/ 09 января 2012

Множить одно слово просто:

pluralize(@total_users, "user")

Но что, если я хочу напечатать "Там есть / есть N пользователь / пользователи":

0 пользователей
Есть 1 пользователь
Сейчас 2 пользователя

, т. Е. как перемножить предложение ?

Ответы [ 3 ]

33 голосов
/ 09 января 2012

Вы можете добавить собственный перегиб для него. По умолчанию Rails добавит inflections.rb к config/initializers. Там можно добавить:

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

После этого вы сможете использовать pluralize(@total_users, "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."
7 голосов
/ 14 апреля 2013

Это, вероятно, лучше всего охватывается функциями плюрализации 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'
5 голосов
/ 09 января 2012

Я думаю, что первая часть ответа Мартина Гордона довольно хорошая.

Кроме того, это немного грязно, но вы всегда можете написать логику самостоятельно:

"There #{@users.size == 1 ? 'is' : 'are'} #{@users.size} user#{'s' unless @users.size == 1}."
...