Es gibt tatsächlich eine Alternative zum umständlichen i18n-Ansatz. Die Lösung heißt Tr8n.
Ihr obiger Code wäre einfach:
<%= tr("You have {num || kid}", num: 1) %>
Das ist es. Sie müssen Ihre Schlüssel nicht aus Ihrem Code extrahieren und in Ressourcenpaketen verwalten. Sie müssen keine Pluralisierungsregeln für jede Sprache implementieren. Tr8n enthält numerische Kontextregeln für alle Sprachen. Es kommt auch mit Geschlechterregeln, Listenregeln und Sprachfällen.
Die vollständige Definition des obigen Übersetzungsschlüssels würde tatsächlich so aussehen:
<%= tr("You have {num:number || one: kid, other: kids}", num: 1) %>
Da wir jedoch Platz und Zeit sparen möchten, wird num automatisch numerischen Regeln zugeordnet, und es müssen nicht alle Optionen für die Regelwerte angegeben werden. Tr8n wird mit Pluralisierern und Inflektoren geliefert, die die Arbeit im laufenden Betrieb für Sie erledigen.
Die Übersetzung für Ihren Schlüssel auf Russisch wäre einfach:
"У вас есть {num || ребенок, ребенка, детей}"
Übrigens wäre Ihre Übersetzung in Sprachen mit geschlechtsspezifischen Regeln ungenau. Auf Hebräisch müssten Sie beispielsweise mindestens zwei Übersetzungen für Ihr Beispiel angeben, da "Sie" je nach Geschlecht des angezeigten Benutzers unterschiedlich wären. Tr8n handhabt es sehr gut. Hier ist eine Transliteration hebräischer Übersetzungen:
"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}}
In diesem Fall benötigt Ihr einzelner englischer Schlüssel 4 Übersetzungen. Alle Übersetzungen erfolgen im Kontext - Sie müssen den Satz nicht brechen. Tr8n verfügt über einen Mechanismus, mit dem ein Schlüssel basierend auf Sprache und Kontext mehreren Übersetzungen zugeordnet werden kann - alles im laufenden Betrieb.
Eine letzte Sache. Was wäre, wenn Sie den Zählteil fett machen müssten? Es wäre einfach:
<%= tr("You have [bold: {num || kid}]", num: 1, bold: "<strong>{$0}</strong>") %>
Nur für den Fall, dass Sie Ihr "Fett" später neu definieren möchten - es wäre sehr einfach - müssen Sie nicht alle Ihre YAML-Dateien durchgehen und ändern - Sie tun es einfach an einem Ort.
Um mehr zu erfahren, schauen Sie bitte hier:
https://github.com/tr8n/tr8n_rails_clientsdk
Offenlegung: Ich bin der Entwickler und Betreuer des Tr8n-Frameworks und aller seiner Bibliotheken.
"#{....}"
im obigen Code nicht erforderlich sind.