Kostenloses Werkzeug
.xcstrings in JSON umwandeln
Ein String Catalog ist JSON, aber kein JSON, das irgendeine i18n-Bibliothek lesen kann. Hier wird daraus die Form, die i18next, next-intl und react-intl erwarten.
Läuft im Browser. Kein Konto, kein Upload, nichts verlässt den Rechner.
Läuft im Browser. Die Datei wird nicht hochgeladen.
Warum ein String Catalog kein brauchbares JSON ist
Wer eine .xcstrings im Editor öffnet, sieht JSON und hält es für eine Sache von zwei Minuten. Ist es nicht: Jede Zeichenkette liegt unter strings.SCHLÜSSEL.localizations.SPRACHE.stringUnit.value, Plural liegt noch eine Ebene tiefer unter variations.plural, und die Quellsprache fehlt regelmäßig ganz, weil Xcode den Schlüssel als englischen Text benutzt. Dieses Werkzeug geht alle drei Fälle durch und gibt ein flaches oder verschachteltes Objekt zurück, in dem die Texte tatsächlich drinstehen: die Form, die ein Web-Frontend oder ein React-Native-Bundle laden kann.
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.
Gerätevarianten und substitutions überleben nicht: JSON hat keinen Platz dafür. Plural bleibt als schlüssel.plural.one und schlüssel.plural.other stehen, statt zusammenzufallen, damit es sich auf das abbilden lässt, was die eigene Bibliothek benutzt. extractionState und der Übersetzungsstand je Zeichenkette fallen weg; sie beschreiben Xcodes Arbeitsablauf, nicht den Text.
So läuft es
- Schritt 1
Datei hineingeben
.xcstrings 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.
- 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.
- 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
- Verschachtelte oder flache Schlüssel?
- Beides. Unter der Ausgabe steht ein Schalter. Verschachtelt ist die Voreinstellung, weil i18next, next-intl und vue-i18n alle verschachtelte Objekte erwarten. Flach lässt settings.title als wörtlichen Schlüssel stehen, was react-intl und die meisten Flachdatei-Aufbauten wollen.
- Es kommen weniger Schlüssel heraus als erwartet.
- Der Zähler unter der Ausgabe sagt, wie viele durchgekommen sind. Hat eine Zeichenkette keine Lokalisierung für die Quellsprache und ist der Schlüssel nicht selbst der Text, ist nichts zu lesen. Als veraltet markierte Einträge werden mitgenommen; auf extractionState wird nicht gefiltert.
- Kann ich JSON zurück in einen String Catalog wandeln?
- Ja, über den Pfeil in der Mitte. Die Schlüssel werden alphabetisch geschrieben, so wie Xcode sie schreibt. Damit bleibt das Ergebnis in Git vergleichbar.
- Funktioniert das auch mit .stringsdict?
- Nicht direkt. .stringsdict war das Pluralformat vor dem String Catalog. Wer noch eines hat, lässt Xcode selbst daraus eine .xcstrings machen. Ab dort übernimmt dieses Werkzeug.