In questo articolo mostrerò come utilizzare quel comodo helper di rails, pluralize, con tutte le lingue mediante l’utilizzo di I18n.
Diamo per scontato che l’applicazione sia internazionalizzata, quindi modelli e campi presenti nei file yaml di configurazione.
Ora dobbiamo aggiungere i termini per i quali vogliamo internazionalizzare la pluralità: modelli, attributi ecc.
activerecord: &activerecord models: &models user: "Utente" users: "Utenti" activity: "Impiego" activities: "Impieghi" task: "Incarico" tasks: "Incarichi" project: "Progetto" projects: "Progetti" attributes: &attributes activity: task: "Incarico" day: "Giorno" hours: "Ore" hour: "Ora" description: "Descrizione"
Ipotizziamo che il nostro modello “Incarico” sia relazionato col modello “Impiego” e che questo abbia un campo di nome “Ore”. Vogliamo creare una frase che descriva quanti impieghi sono presenti per tale incarico ed il totale delle ore.
In base ai dati nel database, vogliamo ottenere frasi del tipo:
Questo incarico ha 1 impiego per un totale di 1 ora.
Questo incarico ha 13 impieghi per un totale di 0 ore.
Questo incarico ha 1 impiego per un totale di 15 ore.
…e in tutte le lingue:
This task has 1 activity with an amount of 15 hours.
Diese Aufgabe haben 1-Aktivität für eine Gesamtmenge von 15 Stunden.
Cette tâche a 1 activité pour un total de 15 heures.
Esta tarea tiene 1 actividad para un total de 15 horas.
このタスクは、 15時間の量1活性を持つ
Vogliamo evitare:
Questo incarico ha 1 impieghi per un totale di 1 ore
This task has 1 activities with an amount of 1 hours
Aggiungiamo la frase in ogni file yaml I18n:
#it.yml
task_activities: "Questo incarico ha <strong>{{activities}}</strong> per un totale di <strong>{{hours}}</strong>."
#en.yml
task_activities: "This task has <strong>{{activities}}</strong> with an amount of <strong>{{hours}}</strong>."
#etc.Per fare ciò ci avvaliamo del comodo helper di rails, pluralize, opportunamente modificato per eliminare il numero dal risultato. Pluralizziamo il termine inglese da usare come chiave per I18n.
Creiamo nell’helper dell’applicazione:
module ApplicationHelper #Pluralize without the number def I18n_pluralize(count, singular, plural = nil) ((count == 1 || count =~ /^1(\.0+)?$/) ? singular : (plural || singular.pluralize)) end end
Nella view richiamiamo la frase I18n passando il numero di impieghi ed il totale di ore (per motivi descrittivi ho inserito nella view operazioni che però riterrei più opportuno posizionare nel controller):
<% tot_hours = @activities.map{|a| a.hours}.inject{|tot,h| tot+h} || 0 %> <% str_hour = t("attributes.activity.#{I18n_pluralize(tot_hours,'hour')}") %> <% str_activity = t("models.#{I18n_pluralize(@activities.size,'activity')}") %> <%= t :task_activities, :activities => "#{@activities.size} #{str_activity}", :hours => "#{@tot_hours} #{str_hour}" %>
Osserviamo questa riga alla moviola:
t("attributes.activity.#{I18n_pluralize(tot_hours,'hour')}")
In base al numero di ore otteniamo la chiave I18n: hour o hours
chiave = I18n_pluralize(tot_hours,'hour')
equivale
t("attributes.activity.#{chiave}")
se tot_hours = 1 avremo:
t("attributes.activity.hour")
altrimenti:
t("attributes.activity.hours")
