2012-01-09 3 views
18

плюрализация одно слово просто:Как плюрализировать «Есть/есть объект или объекты N»?

pluralize(@total_users, "user") 

Но что, если я хочу, чтобы напечатать «Там является/являются N пользователей/пользователей»:

Там 0 пользователей
Там находится 1 пользователь
есть 2 пользователей

, т.е. как для плюрализации предложения ?

ответ

29

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

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

Вы тогда будете в состоянии использовать pluralize(@total_users, "is") на возвращение/используют одни и те же правила, что и пользователей/пользователей.

EDIT: Вы уточнили вопрос о том, как плюрализовать предложение. Это гораздо сложнее сделать в общем, но если вы хотите это сделать, вам нужно будет 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." 
+0

На самом деле, я думаю, что вопрос о том, как интерполировать число пользователей, то есть нечто такое, что может выглядеть как смесь между i18n и плюрализацией например 'pluralize (@total_users,« есть пользователь в $ 1 »)' ..., который, очевидно, будет неудачно сбой :) – Pierre

+0

В [Agile Development with Rails, четвертое издание] (http://pragprog.com/book/rails4/agile- web-development-with-rails), стр. 217, они используют «один» и «другой» в файле YAML для плюрализации сообщений об ошибках. Это используется без дополнительного кода для отображения ошибок страницы, поэтому он должен работать непосредственно с 't()'. – l0b0

+0

Одна из проблем, с которой я столкнулся с этим решением, - это если у вас есть модель, которая заканчивается на «есть» (в моем случае ExtendedCare), все ваши разрывы кода – Doug

4

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

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

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

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