Il existe en fait une alternative à la lourde approche i18n. La solution s'appelle Tr8n.
Votre code ci-dessus serait simplement:
<%= tr("You have {num || kid}", num: 1) %>
C'est ça. Pas besoin d'extraire vos clés de votre code et de les maintenir dans des ensembles de ressources, pas besoin d'implémenter des règles de pluralisation pour chaque langue. Tr8n est livré avec des règles de contexte numériques pour toutes les langues. Il est également livré avec des règles de genre, des règles de liste et des cas de langue.
La définition complète de la clé de traduction ci-dessus ressemblerait en fait à ceci:
<%= tr("You have {num:number || one: kid, other: kids}", num: 1) %>
Mais puisque nous voulons économiser de l'espace et du temps, num est automatiquement mappé sur des règles numériques et il n'est pas nécessaire de fournir toutes les options pour les valeurs de règle. Tr8n est livré avec des pluraliseurs et des inflecteurs qui feront le travail pour vous à la volée.
La traduction de votre clé en russe serait simplement:
"У вас есть {num || ребенок, ребенка, детей}"
En passant, votre traduction serait inexacte dans les langues qui ont des règles spécifiques au genre. Par exemple, en hébreu, vous devrez en fait spécifier au moins 2 traductions pour votre exemple, car «Vous» serait différent en fonction du sexe de l'utilisateur qui regarde. Tr8n le gère très bien. Voici une translittération des traductions hébraïques:
"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}}
Donc, votre clé anglaise unique, dans ce cas, nécessite 4 traductions. Toutes les traductions sont effectuées en contexte - vous n'avez pas à casser la phrase. Tr8n a un mécanisme pour mapper une clé à plusieurs traductions en fonction de la langue et du contexte - le tout à la volée.
Une dernière chose. Et si vous deviez rendre la partie comptage en gras? Ce serait simplement:
<%= tr("You have [bold: {num || kid}]", num: 1, bold: "<strong>{$0}</strong>") %>
Juste au cas où vous voudriez redéfinir votre "gras" plus tard - ce serait très facile - vous n'aurez pas à parcourir tous vos fichiers YAML et à les modifier - vous le faites simplement en un seul endroit.
Pour en savoir plus, jetez un œil ici:
https://github.com/tr8n/tr8n_rails_clientsdk
Divulgation: Je suis le développeur et le mainteneur du framework Tr8n et de toutes ses bibliothèques.
"#{....}"
ne sont pas nécessaires dans le code ci-dessus.