Zet losse .strings-bestanden direct in je browser om naar een catalogus: gratis, zonder account, er wordt niets geüpload.
Voordat je migreert
Twee voorzorgen die de meeste nare verrassingen voorkomen:
- Een schone Git-tree, op een aparte branch. Alles wat je daarna moet controleren, staat in de diff, dus die wil je apart houden.
- Een build die vóór de migratie slaagt. Xcode vult de catalogus door tijdens de build je code te scannen. Compileert het project niet, dan blijft de catalogus onvolledig en weet je niet waarom.
De migratie zelf
Klik in de project navigator met de rechtermuisknop op Localizable.strings en kies Migrate to String Catalog. Xcode toont de betrokken bestanden en targets; de precieze bewoording kan per Xcode-versie verschillen, het idee niet.
De bestanden fr.lproj/Localizable.strings, de.lproj/Localizable.strings… worden vervangen door één Localizable.xcstrings met alle talen. Commentaar uit de .strings-bestanden wordt het commentaar van elke sleutel.
Hoe het bestand eruitziet
Een String Catalog is JSON. Een eenvoudige sleutel:
{
"sourceLanguage" : "en",
"strings" : {
"welcome_user" : {
"comment" : "Home screen greeting",
"localizations" : {
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Bon retour, %@ !"
}
}
}
}
},
"version" : "1.0"
}
En een meervoud, opgeslagen onder variations:
"items_left" : {
"localizations" : {
"fr" : {
"variations" : {
"plural" : {
"one" : { "stringUnit" : { "state" : "translated", "value" : "%lld article restant" } },
"other" : { "stringUnit" : { "state" : "translated", "value" : "%lld articles restants" } }
}
}
}
}
}
Let op de opmaak: een spatie vóór elke dubbele punt, zoals Xcode het schrijft. Een tool die het bestand herschrijft als "standaard" JSON, levert een enorme diff op zonder ook maar één vertaling te veranderen.
Wat je in de diff nakijkt
Sleutels gemarkeerd als Stale. Na een build markeert Xcode sleutels die het niet meer in je code vindt. Ze zijn niet per se dood: een sleutel die tijdens runtime wordt opgebouwd (NSLocalizedString(variable, comment: ""), een sleutel uit een configuratiebestand) is onzichtbaar voor de scan. Controleer voordat je verwijdert.
Nieuwe sleutels uit de code. De build kan teksten toevoegen die je nooit in Localizable.strings hebt gezet, meestal SwiftUI-literals Text("…"), die standaard lokaliseerbaar zijn. Ze komen onvertaald binnen, dus het percentage dat Xcode per taal toont, daalt. Dat is normaal.
Statussen. Elke waarde heeft een status: translated, needs_review, of new voor een tekst die nog niemand heeft vertaald. Over drie maanden weet je zo wat echt is nagekeken.
Format specifiers. Een SwiftUI-tekst als Text("\(count) items left") levert de sleutel %lld items left op. Gebruikte je oude .strings voor dezelfde zin %d, dan heb je nu twee bijna identieke sleutels; houd de sleutel die je code echt gebruikt.
En oudere iOS-versies?
iOS 17 is niet nodig. De catalogus is een bronformaat: tijdens de build compileert Xcode hem naar gewone .strings-bestanden in de app-bundle. Je deployment target verandert niet.
De catalogus buiten Xcode bewerken
De editor van Xcode volstaat voor een handvol teksten. Om een hele taal na te kijken, in bulk te vertalen of placeholders te controleren, is een aparte tool handiger. LocalePilot opent .xcstrings-bestanden en schrijft ze terug in de stijl van Xcode: een ongewijzigde catalogus komt er byte-identiek uit, een bewerking verandert alleen haar eigen regels, en een bewerkte waarde krijgt de status translated. Meervoudsvormen en apparaatvariaties zijn bewerkbaar; sleutels met substituties (%#@count@) en sleutels met shouldTranslate: false blijven zoals ze zijn, zodat je ze in Xcode kunt bewerken.