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