In realtà esiste un'alternativa all'ingombrante approccio i18n. La soluzione si chiama Tr8n.
Il tuo codice sopra sarebbe semplicemente:
<%= tr("You have {num || kid}", num: 1) %>
Questo è tutto. Non è necessario estrarre le chiavi dal codice e mantenerle in bundle di risorse, né implementare regole di pluralizzazione per ogni lingua. Tr8n viene fornito con regole di contesto numeriche per tutte le lingue. Viene inoltre fornito con regole di genere, regole di elenco e casi linguistici.
La definizione completa della chiave di traduzione sopra sarebbe effettivamente simile a questa:
<%= tr("You have {num:number || one: kid, other: kids}", num: 1) %>
Ma poiché vogliamo risparmiare spazio e tempo, num viene automaticamente mappato su regole numeriche e non è necessario fornire tutte le opzioni per i valori delle regole. Tr8n viene fornito con pluralizzatori e inflettori che faranno il lavoro per te al volo.
La traduzione della tua chiave in russo sarebbe semplicemente:
"У вас есть {num || ребенок, ребенка, детей}"
A proposito, la tua traduzione sarebbe imprecisa nelle lingue che hanno regole specifiche di genere. Ad esempio, in ebraico, dovresti effettivamente specificare almeno 2 traduzioni per il tuo esempio, poiché "Tu" sarebbe diverso in base al sesso dell'utente che lo visualizza. Tr8n lo gestisce molto bene. Ecco una traslitterazione delle traduzioni ebraiche:
"Yesh leha yeled ahad" with {context: {viewing_user: male, num: one}}
"Yesh leha {num} yeladim" with {context: {viewing_user: male, num: other}}
"Yesh lah yeled ahad" with {context: {viewing_user: female, num: one}}
"Yesh lah {num} yeladim" with {context: {viewing_user: female, num: other}}
Quindi la tua singola chiave inglese, in questo caso, necessita di 4 traduzioni. Tutte le traduzioni vengono eseguite nel contesto: non è necessario interrompere la frase. Tr8n ha un meccanismo per mappare una chiave a più traduzioni in base alla lingua e al contesto, tutto fatto al volo.
Un'ultima cosa. E se dovessi rendere la parte conteggio in grassetto? Sarebbe semplicemente:
<%= tr("You have [bold: {num || kid}]", num: 1, bold: "<strong>{$0}</strong>") %>
Nel caso in cui desideri ridefinire il tuo "grassetto" in seguito - sarebbe molto facile - non dovrai esaminare tutti i tuoi file YAML e cambiarli - lo fai semplicemente in un posto.
Per saperne di più, dai un'occhiata qui:
https://github.com/tr8n/tr8n_rails_clientsdk
Divulgazione: sono lo sviluppatore e il manutentore del framework Tr8n e di tutte le sue librerie.
"#{....}"
non sono necessari nel codice precedente.