Kostenloses Werkzeug

.arb in JSON umwandeln

Flutters Application Resource Bundle auf der einen Seite, gewöhnliches i18n-JSON auf der anderen, für Produkte, die als App und als Website ausgeliefert werden.

Läuft im Browser. Kein Konto, kein Upload, nichts verlässt den Rechner.

.arbJSON

Läuft im Browser. Die Datei wird nicht hochgeladen.

ARB ist JSON mit einer Regel

Eine .arb ist JSON, in dem jeder Schlüssel mit @ am Anfang ein Metadatum zum gleichnamigen Schlüssel ohne @ ist, und @@locale ein Metadatum zur ganzen Datei. Diese eine Regel ist der Grund, warum ein schlichtes JSON.parse eine Datei mit doppelt so vielen Schlüsseln liefert, von denen die Hälfte Objekte sind. Dieses Werkzeug trennt beides: Die Texte werden zum JSON, und @schlüssel.description wird zum Übersetzerhinweis, wo das Zielformat einen Platz dafür hat.

Was heil bleibt

Umwandeln ist einfach. Die Datei nicht zu zerlegen ist die Arbeit.

Jeder Konverter, der eine Sprachdatei als Fließtext behandelt, liefert irgendwann einen Absturz aus. An diesen drei Stellen passiert es.

Platzhalter bleiben Platzhalter
%@, %lld, %1$s, {name} und {{count}} kommen genau so heraus, wie sie hineingegangen sind. Ein Platzhalter, der maskiert, umnummeriert oder übersetzt wurde, ist kein Schönheitsfehler, sondern ein Absturz auf dem Gerät.
Pluralformen bleiben getrennt
Xcodes variations, das plurals-Element von Android und msgstr[n] aus Gettext meinen dasselbe und schreiben es alle anders. Hier werden sie aufeinander abgebildet, statt zu einer Zeichenkette zusammenzufallen. Polnisch hat vier Formen; alle vier überleben.
Schlüssel behalten ihre Form
Verschachtelung, Punktpfade, Felder und Übersetzerhinweise gehen mit, wo das Zielformat einen Platz dafür hat. Wo nicht, steht es im Abschnitt darunter.

Was nicht mitkommt

Steht hier, weil man es sonst erst im kaputten Build erfährt.

Platzhalter-Deklarationen überleben nicht. Ein Block, der erklärt, dass count ein int im Format compact ist, trägt Typinformation, für die die Zwischenform kein Feld hat, und ein geratener Typ ist schlimmer als ein fehlender: flutter gen-l10n erzeugt daraus eine falsch typisierte Methodensignatur. ICU-Plural im Wert selbst, {count, plural, one {…} other {…}}, wird unangetastet durchgereicht, denn für ARB ist das gewöhnlicher Text.

So läuft es

  1. Schritt 1

    Datei hineingeben

    .arb auf das linke Feld ziehen, über den Knopf auswählen oder den Text einfügen. Nichts wird hochgeladen. Die Umwandlung läuft in diesem Tab.

  2. Schritt 2

    Ergebnis lesen

    Das JSON steht da, während getippt wird. Der Zähler unter dem Feld sagt, wie viele Schlüssel durchgekommen sind. Eine Datei, die die Hälfte verloren hat, sieht man sofort.

  3. Schritt 3

    Kopieren oder herunterladen

    Text in die Zwischenablage, oder als Datei mit der richtigen Endung. Der Pfeil in der Mitte dreht die Richtung um.

Eine Sprachdatei rein. 64 Sprachen raus.

Ein Format umzuwandeln ist der Teil, den man von Hand machen kann. 3.627 Schlüssel in 64 Sprachen zu übersetzen, ohne einen einzigen Platzhalter zu zerlegen, ist der Teil, den man nicht von Hand macht. Beim nächsten Release zahlt man nur für die Strings, die sich geändert haben.

19 € im Monat inkl. MwSt., monatlich kündbar.

Fragen

Bleibt ICU-Plural im Text erhalten?
Ja, wörtlich. Bei ARB steht Plural als ICU-Ausdruck IM Wert, {count, plural, one {…} other {…}}, und nicht in einer eigenen Struktur. Der Konverter behandelt ihn als Text und fasst keine Klammer an.
Und @@locale?
Wird als Metadatum der Datei gelesen und nicht zu einem übersetzbaren Schlüssel. In der Gegenrichtung wird ein @@locale für die Zielsprache geschrieben.
Geht auch JSON nach .arb für eine neue Flutter-App?
Ja, über den Pfeil. Heraus kommt gültiges ARB mit @@locale und einem description-Block für jeden Schlüssel, der einen Kommentar trug. Die placeholders-Deklarationen für Strings mit typisierten Argumenten trägt man danach von Hand nach.
Verkraftet es eine .arb mit 3.000 Schlüsseln?
Ja. Alles läuft lokal. Die Grenze ist der Arbeitsspeicher des Browsers, nicht eine Upload-Größe oder eine Drosselung.