Jede Nacht... träume ich denselben Traum. Und dann... beginnt der Alptraum.
Ich tue, was ich tun muss ... um i18n zu schützen.
Mit diesem Blogbeitrag öffne ich eine Tür zwischen Universen, und ich weiss nicht, wer oder was durch sie gehen wird...
Was wissen Sie über das i18n-Format-Multiversum?
Manche Leute haben ihre Theorien... sie glauben, dass es gefährlich ist.
Ich denke, sie haben Recht ... aber ich möchte, dass Sie zumindest wissen, dass andere Paralleluniversen existieren und wie sie aussehen.
Klarstellung
Es gibt weitaus mehr i18n-Formate als diejenigen, welche ich hier aufliste. Um mich nicht im Wahnsinn der unendlichen i18n-Format-Universen zu verlieren, beschränke ich mich hier auf die ersten acht Formate, die im JavaScript-Ökosystem verwendet werden und die ich finden konnte.
Um eine Art Sortierung zu definieren, werden die Formate basierend auf ihren wöchentlichen Downloads aufgelistet:
i18next
Eines der beliebtesten i18n-Formate wird vom i18n-Framework [i18next] verwendet.(https://www.i18next.com).
Es ist normalerweise ein JSON-basiertes Format mit der Fähigkeit, Plurale zu behandeln (auch für Sprachen mit mehreren Pluralformen), Kontext, Interpolation, Formate, Verschachtelungen und mehr.
Stellen wir uns vor, wir möchten diesen Text basierend darauf anzeigen, wie viel von welchem Dessert ich essen möchte:
- Ich möchte einen Kuchen essen.
- Ich möchte 3 Muffins essen.
- Ich würde gerne etwas essen.
So können wir entscheiden, was und wie viel wir essen.
With this format it would look like this:
1 | { |
Und der instrumentierte Code kann so aussehen (kann je nach gewählter Technologie abweichen):
1 | i18next.t('dessert', { context: 'cake', count: 1 }) // -> "Ich möchte einen Kuchen essen." |
Sie sehen, dass der Übersetzungsschlüssel für jeden Aufruf gleich bleibt und die Optionen context
und count
unterschiedlich sind.
Übrigens: Für Sprachen mit mehreren Pluralformen bleibt der instrumentierte Code unverändert, aber die Übersetzung im json wäre anders.
Dies ist ein "deutschifiziertes" Beispiel für arabische Pluralregeln (damit die meisten Leute es lesen können):
Die Pluralregel für Arabisch lautet wie folgt:
Pluralform | Beispiel Anzahl |
---|---|
zero | 0 |
one | 1 |
two | 2 |
few | 3-10, 103-110, 1003, … |
many | 11-26, 111, 1011, … |
other | 100-102, 200-202, 300-302, 400-402, 500-502, 600, 1000, 10000, 100000, 1000000, … |
1 | { |
1 | i18next.t('dessert', { context: 'cake', count: 1 }) // -> "Ich möchte einen Kuchen essen." |
Mit Verschachtelung können wir auch die Wiederholungen reduzieren:
1 | { |
Aber es kann sein, dass die Übersetzer diese Verschachtelungssubstitution weniger mögen.
ICU Message Format
Das zweite Format ist das ICU Message Format.
Es gibt mehrere JavaScript-Module, welche die ICU Message Format Syntax implementieren. Eines der am häufigsten verwendeten ist intl-messageformat von Format.js. Es wird hinter den Kulissen auch in react-intl verwendet.
Es ist auch ein Schlüssel/Wert-basiertes Format, welches in einem JSON gespeichert werden kann oder wie Sie auch immer möchten:
1 | import { createIntl } from '@formatjs/intl' |
Es bietet auch Plural und Select, und der instrumentierte Code kann wie folgt aussehen (kann je nach gewählter Technologie abweichen):
Im Vergleich zum vorherigen Format verwendet dieses nur 1 Schlüssel, um alle Variationen zu generieren. Der Wert kann also etwas komplexer aussehen.
1 | intl.formatMessage({ id: 'dessert' }, { what: 'cake', count: 1 }) // -> "Ich möchte einen Kuchen essen." |
Auch hier bleibt der Übersetzungsschlüssel für jeden Aufruf gleich, und die Kontext- und Zähloption ist unterschiedlich.
vue-i18n
Das nächste gefundene Format beim Erkunden des Multiversums ist das vue-i18n-Format. Es wird praktisch nur im Framework vue-i18n selbst verwendet.
Es ist auch in der Lage Interpolation mit Formatierung anzubieten, Plurale und anderes. Aber eine Kontextfunktion fehlt.
So würde unser Beispiel aussehen:
1 | import { createI18n } from 'vue-i18n' |
And the corresponding invocation:
1 | $t('dessert_cake', { count: 1 }) // -> "Ich möchte einen Kuchen essen." |
Im Vergleich zu den vorherigen Formaten muss dieses den Übersetzungsschlüssel ändern, um eine kontextähnliche Funktion zu erreichen.
i18n-js
Der Ursprung dieses Formats ist in Ruby. Das i18n-js-Format ist ein direkter Export von Übersetzungen, welche von Ruby on Rails.
Zum Exportieren der Übersetzungen kann ein Ruby Gem verwendet werden, das vollständig von Rails getrennt ist und ausschliesslich zum Exportieren der Übersetzungen verwendet werden kann, auch wenn Ihr Projekt in einer anderen Sprache geschrieben ist.
Für JavaScript gibt es ein begleitendes JavaScript-Paket.
Es wird mit allen Basisübersetzungen geliefert, welche von rails-i18n zur Verfügung gestellt werden. Basisübersetzungen ermöglichen unter anderem die Formatierung von Datum, Zahlen und Satzkonnektoren.
Das verwendete JSON-basierte Format sieht folgendermassen aus:
1 | { |
Die Pluralisierungsschlüssel sind unter dem normalen Übersetzungsschlüssel verschachtelt organisiert.
Und der entsprechende Aufruf:
1 | i18n.t('dessert_cake', { count: 1 }); // -> "Ich möchte einen Kuchen essen." |
Auch dieses Format muss den Übersetzungsschlüssel ändern, um eine kontextähnliche Funktion zu erreichen.
Polyglot.js
Dieses ältere Format bietet eine Lösung für Interpolation und Pluralisierung, basierend auf der Erfahrung von Airbnb.
Polyglot.js fügt den Backbone.js- und Node.js-Apps von Airbnb grundlegende i18n-Funktionen hinzu.
Dieses Format verwendet nur 3 Schlüssel, aber...
1 | { |
Die Pluralformen werden zu einem einzigen Wert zusammengefasst, welcher durch das Trennzeichen ||||
(4 senkrechte Striche) getrennt ist.
Und der entsprechende Aufruf:
1 | polyglot.t('dessert_cake', { smart_count: 1 }) // -> "Ich möchte einen Kuchen essen." |
Auch dieses Format muss den Übersetzungsschlüssel ändern, um eine kontextähnliche Funktion zu erreichen.
Gettext
Gettext ist ein sehr alter Übersetzungsstandard. Es gibt Implementierungen von Gettext in vielen Programmiersprachen.
Jed ist eine der am häufigsten verwendeten gettext-Implementierungen für JavaScript. Jed enthält keinen Gettext-Dateiparser, aber es gibt mehrere Parser von Drittanbietern, deren Ausgabe für Jed angepasst werden kann.
Also ein originales Gettext po Format...
1 | msgid "" |
...würde so aussehen, wenn es in Jed verwendet wird:
1 | const i18n = new Jed({ |
Nicht sehr intuitiv, aber es funktioniert.
1 | i18n.translate('dessert').withContext('cake').fetch() // -> "Ich möchte einen Kuchen essen." |
Dieses Format bietet Pluralisierung, Interpolation und eine Kontextfunktion, aber meiner Meinung nach eine seltsame API.
FBT
Von allen im i18n-Multiversum anzutreffenden Formaten ist dieses Format wohl das am weitesten entfernte Universum, oder sollte ich sagen: das am weitesten entfernte "Metaversum" ;-)
FBT wird von Facebook erfunden, verwendet und gepflegt.
Es ist... besonders. Es kommt mit Textextraktion und im Zentrum stehen nicht die Übersetzungen, sondern Ihr Code.
Also müssen Sie zuerst Ihren Code instrumentieren:
1 | <fbt desc="eating cake"> |
Führen Sie einige Skripte aus, und Sie können die vorbereiteten Übersetzungsdateien verwenden:
1 | { |
Jeder instrumentierte Codeteil wird mit einem Hash auf die Übersetzungen abgebildet.
Wie gesagt... es ist wirklich anders als alle anderen Formate.
Fluent
Das letzte Format dieser Multiversum-Reise ist Fluent, ein Mozilla-Projekt.
Das Fluent-Format teilt viele Philosophien, welche das Design von ICU Message Format vorangetrieben haben.
Es ist auch ein Schlüssel/Wert-basiertes Format:
1 | import { FluentBundle, FluentResource } from "@fluent/bundle"; |
Wie ICU Message Format verwendet es nur 1 Schlüssel, um alle Variationen zu generieren. Der Wert kann also etwas komplexer aussehen, wie eine eigenständige Sprache.
Zurück nach Hause kommen
Wir haben die Portale des i18n-Multiversums durchforstet und ein paar kleine erste Eindrücke zu den verschiedenen Formaten gewonnen.
Einige sind sehr ähnlich und einige andere sind wirklich anders. Am Ende ist es Geschmackssache.
Mit welchem Format fühlen Sie sich wohl?
Das Wichtigste ist, dass alle Teammitglieder damit vertraut sind und dass alle Tools im Lokalisierungsprozess dieses Format unterstützen.
Wählen Sie Ihr Übersetzungsmanagementsystem (TMS) also sorgfältig aus.
Wenn wir uns die Geschichte des derzeit am häufigsten verwendeten i18n-Formats ansehen, können wir sehen, dass die Schöpfer von i18next auch die Gründer eines grossartigen Übersetzungsmanagementsystems sind.
Mit der Wahl von locize unterstützen Sie also direkt die Zukunft von i18next.
➡️ i18next + locize = echte kontinuierliche Lokalisierung
Sehen Sie sich dieses Video an, um mehr darüber zu erfahren: