2012-01-09 11 views
18

pluralizzando una sola parola è semplice:Come pluralizzare "C'è/sono N oggetto/oggetti"?

pluralize(@total_users, "user") 

Ma cosa succede se voglio stampare "C'è è/sono N utente/utenti":

Ci sono 0 utenti
c'è 1 utente
ci sono 2 utenti

, vale a dire, come pluralizzare una frase ?

risposta

29

È possibile aggiungere un'inflessione personalizzata per esso. Per impostazione predefinita, Rails aggiungerà uno inflections.rb a config/initializers. Ci si può aggiungere:

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

Sarà quindi in grado di utilizzare pluralize(@total_users, "is") di tornare è/sono usando le stesse regole come utente/utenti.

MODIFICA: Hai chiarito la domanda su come pluralizzare una frase. Questo è molto più difficile da fare in termini generici, ma se vuoi farlo, devi fare dive into NLP.

Come il commento suggerisce, si potrebbe fare qualcosa con I18n se si desidera solo per farlo con poche frasi, si potrebbe costruire qualcosa di simile:

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

E in config/locales/en.yml:

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

realtà, credo che la questione è di più su come interpolare il numero di utenti, vale a dire qualcosa che potrebbe apparire come un mix tra i18n e pluralizzazione per esempio 'pluralize (@total_users," c'è $ 1 utente ")' ... che ovviamente fallirà miseramente :) – Pierre

+0

In [Agile Development with Rails, Quarta Edizione] (http://pragprog.com/book/rails4/agile- web-development-with-rails), pagina 217, usano 'one' e' other' nel file YAML per pluralizzare i messaggi di errore. Questo è usato senza alcun codice aggiuntivo per visualizzare gli errori di pagina, quindi dovrebbe funzionare direttamente con 't()'. – l0b0

+0

Un problema che ho riscontrato con questa soluzione è che se un modello termina con "sono" (nel mio caso ExtendedCare) tutte le interruzioni di codice – Doug

4

Penso che la prima parte della risposta di Martin Gordon sia piuttosto buona.

In alternativa, è una specie di disordine, ma si può sempre e solo scrivere la logica da soli:

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

Questo è probabilmente più coperta dalle rotaie caratteristiche i18n pluralizzazione. Adattato da 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'