Плюралирование одного слова просто:
pluralize(@total_users, "user")
Но что, если я хочу напечатать "Там есть/есть N пользователь/пользователи":
Есть 0 пользователей
Существует 1 пользователь
Есть 2 пользователя
т.е. как плюрализовать предложение?
Плюралирование одного слова просто:
pluralize(@total_users, "user")
Но что, если я хочу напечатать "Там есть/есть N пользователь/пользователи":
Есть 0 пользователей
Существует 1 пользователь
Есть 2 пользователя
т.е. как плюрализовать предложение?
Вы можете добавить для него пользовательский перегиб. По умолчанию Rails добавит inflections.rb в config/initializers. Там вы можете добавить:
ActiveSupport::Inflector.inflections do |inflect|
inflect.irregular "is", "are"
end
Затем вы сможете использовать pluralize(@total_users, "is") для возврата, используя/те же правила, что и пользователь/пользователи.
EDIT. Вы уточнили вопрос о том, как плюрализовать предложение. Это гораздо сложнее сделать в общем, но если вы хотите это сделать, вам нужно погрузиться в НЛП.
Как следует из комментария, вы можете сделать что-то с 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."
Это, вероятно, лучше всего охватывает функции плюрализации 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'
Я думаю, что первая часть ответа Мартина Гордона довольно хороша.
В качестве альтернативы, это довольно грязно, но вы всегда можете просто написать логику самостоятельно:
"There #{@users.size == 1 ? 'is' : 'are'} #{@users.size} user#{'s' unless @users.size == 1}."