2012-01-09 14 views
18

pluralizante una sola palabra es simple:¿Cómo pluralizar "Hay/hay N objetos/objetos"?

pluralize(@total_users, "user") 

Pero lo que si quiero imprimir "No es/son N de usuario/usuarios":

hay 0 usuarios
existe 1 usuario
Hay 2 usuarios

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

Respuesta

29

Puede agregarle una inflexión personalizada. De forma predeterminada, Rails agregará un inflections.rb a config/initializers. No se puede agregar:

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

A continuación, será capaz de utilizar pluralize(@total_users, "is") para volver está/están utilizando las mismas reglas que el usuario/usuarios.

EDIT: Aclaraste 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 dive into NLP.

Como el comentario sugiere, se puede hacer algo con I18n si lo que desea es hacerlo con un par de frases, se podría 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." 
+0

En realidad, creo que la pregunta es más acerca de cómo interpolar el número de usuarios, es decir, algo que podría parecerse a una mezcla entre i18n y pluralización por ejemplo, 'pluralize (@total_users," there is $ 1 user ")' ... que evidentemente fallará :) – Pierre

+0

En [Agile Development with Rails, Fourth Edition] (http://pragprog.com/book/rails4/agile- web-development-with-rails), página 217, usan 'one' y' other' en el archivo YAML para pluralizar los mensajes de error. Esto se usa sin ningún código adicional para mostrar los errores de página, por lo que debería funcionar directamente con 't()'. – l0b0

+0

Uno de los problemas que acerté con esta solución es si tiene un modelo que termina en "son" (en mi caso, ExtendedCare) todos sus códigos se rompen – Doug

4

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

alternativa, que es un poco desordenado, pero siempre se puede simplemente escribir la lógica sí mismo:

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

Este es probablemente el más cubierto por las características i18n pluralización Rails. 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' 
Cuestiones relacionadas