ruby-on-rails ruby-on-rails-3.1 inflection plural

ruby on rails - ¿Cómo pluralizar “Hay/hay N objeto/objetos”?



ruby-on-rails ruby-on-rails-3.1 (3)

Creo que la primera parte de la respuesta de Martin Gordon es bastante buena.

Alternativamente, es un poco desordenado, pero siempre puedes escribir la lógica tú mismo:

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

Pluralizar una sola palabra es simple:

pluralize(@total_users, "user")

Pero qué pasa si quiero imprimir "Hay / hay N usuarios / usuarios":

Hay 0 usuarios
Hay 1 usuario
Hay 2 usuarios

, es decir, ¿cómo pluralizar una oración ?


Probablemente esto esté mejor cubierto por las características de pluralización de Rails i18n. Adaptado de 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''


Puede agregar una inflexión personalizada para ello. Por defecto, Rails agregará un inflections.rb a config/initializers . Allí puedes añadir:

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

Entonces podrá usar pluralize(@total_users, "is") para devolver si están usando las mismas reglas que los usuarios / usuarios.

EDIT : Aclaró la pregunta sobre cómo pluralizar una oración. Esto es mucho más difícil de hacer genéricamente, pero si quieres hacerlo, tendrás que sumergirte en la PNL .

Como sugiere el comentario, puedes hacer algo con I18n si solo quieres hacerlo con unas pocas frases, puedes construir algo como esto:

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")

Y en config/locales/en.yml :

en: user_count: "There is %{count} user." user_count_plural: "There are %{count} users."