Ich verwende (wie alle anderen) NSLocalizedString
, um meine App zu lokalisieren.
Leider gibt es einige "Nachteile" (nicht unbedingt die Schuld von NSLocalizedString selbst), einschließlich
- Keine automatische Vervollständigung für Zeichenfolgen in Xcode. Dies macht das Arbeiten nicht nur fehleranfällig, sondern auch mühsam.
- Möglicherweise definieren Sie eine Zeichenfolge neu, nur weil Sie nicht wussten, dass bereits eine entsprechende Zeichenfolge vorhanden ist (z. B. "Bitte Passwort eingeben" vs. "Passwort zuerst eingeben").
- Ähnlich wie beim Autocompletion-Problem müssen Sie sich die Kommentarzeichenfolgen "merken" / kopieren, sonst erhalten Sie
genstring
mehrere Kommentare für eine Zeichenfolge - Wenn Sie verwenden möchten,
genstring
nachdem Sie bereits einige Zeichenfolgen lokalisiert haben, müssen Sie darauf achten, dass Ihre alten Lokalisierungen nicht verloren gehen. - Dieselben Zeichenfolgen sind über das gesamte Projekt verteilt. Beispielsweise haben Sie
NSLocalizedString(@"Abort", @"Cancel action")
überall verwendet, und dann werden Sie von Code Review aufgefordert, die Zeichenfolge umzubenennenNSLocalizedString(@"Cancel", @"Cancel action")
, um den Code konsistenter zu machen.
Was ich tue (und nach einigen Suchen auf SO habe ich gedacht, dass viele Leute dies tun), ist eine separate strings.h
Datei, in der ich den #define
gesamten Lokalisierungscode habe. Beispielsweise
// In strings.h
#define NSLS_COMMON_CANCEL NSLocalizedString(@"Cancel", nil)
// Somewhere else
NSLog(@"%@", NSLS_COMMON_CANCEL);
Dies bietet im Wesentlichen Code-Vervollständigung, einen einzigen Ort zum Ändern von Variablennamen (sodass keine Genzeichenfolge mehr erforderlich ist) und ein eindeutiges Schlüsselwort für die automatische Umgestaltung. Dies geht jedoch zu #define
Lasten einer ganzen Reihe von Anweisungen, die nicht von Natur aus strukturiert sind (z. B. LocString.Common.Cancel oder ähnliches).
Obwohl dies etwas gut funktioniert, habe ich mich gefragt, wie ihr es in euren Projekten macht. Gibt es andere Ansätze, um die Verwendung von NSLocalizedString zu vereinfachen? Gibt es vielleicht sogar ein Framework, das es einschließt?
Antworten:
NSLocalizedString
Es gibt einige Einschränkungen, aber es ist für Cocoa so zentral, dass es nicht zumutbar ist, benutzerdefinierten Code für die Lokalisierung zu schreiben, was bedeutet, dass Sie ihn verwenden müssen. Trotzdem kann ein wenig Werkzeug helfen. So gehe ich vor:Aktualisieren der Zeichenfolgendatei
genstrings
Überschreibt Ihre String-Dateien und verwirft alle Ihre vorherigen Übersetzungen. Ich habe update_strings.py geschrieben , um die alte Zeichenfolgendatei zu analysieren, auszuführengenstrings
und die Lücken auszufüllen, damit Sie Ihre vorhandenen Übersetzungen nicht manuell wiederherstellen müssen. Das Skript versucht, die vorhandenen Zeichenfolgendateien so genau wie möglich abzugleichen, um zu vermeiden, dass beim Aktualisieren ein zu großer Unterschied auftritt.Benennen Sie Ihre Saiten
Wenn Sie
NSLocalizedString
wie angegeben verwenden:Möglicherweise definieren Sie dieselbe Zeichenfolge in einem anderen Teil Ihres Codes, was zu Konflikten führen kann, da derselbe englische Begriff in verschiedenen Kontexten unterschiedliche Bedeutungen haben kann (
OK
undCancel
in den Sinn kommt). Deshalb verwende ich immer einen bedeutungslosen All-Caps-String mit einem modulspezifischen Präfix und einer sehr genauen Beschreibung:Verwenden derselben Zeichenfolge an verschiedenen Stellen
Wenn Sie dieselbe Zeichenfolge mehrmals verwenden, können Sie entweder ein Makro wie zuvor verwenden oder es als Instanzvariable in Ihrem View Controller oder Ihrer Datenquelle zwischenspeichern. Auf diese Weise müssen Sie die Beschreibung nicht wiederholen, die möglicherweise veraltet und zwischen Instanzen derselben Lokalisierung inkonsistent wird, was immer verwirrend ist. Da Instanzvariablen Symbole sind, können Sie die automatische Vervollständigung für diese am häufigsten verwendeten Übersetzungen verwenden und "manuelle" Zeichenfolgen für die spezifischen Übersetzungen verwenden, die ohnehin nur einmal vorkommen würden.
Ich hoffe, dass Sie mit diesen Tipps produktiver mit der Kakaolokalisierung umgehen können!
quelle
genstrings
nichtgestring
.Für die automatische Vervollständigung von Zeichenfolgen in Xcode können Sie https://github.com/questbeat/Lin verwenden .
quelle
Stimmen Sie mit ndfred überein, aber ich möchte Folgendes hinzufügen:
Der zweite Parameter kann als ... Standardwert verwendet werden !!
(NSLocalizedStringWithDefaultValue funktioniert nicht richtig mit genstring, deshalb habe ich diese Lösung vorgeschlagen)
Hier ist meine benutzerdefinierte Implementierung, die NSLocalizedString verwendet und einen Kommentar als Standardwert verwendet:
1. Definieren Sie in Ihrem vorkompilierten Header (.pch-Datei) das Makro 'NSLocalizedString' neu:
2. Erstellen Sie eine Klasse, um den Lokalisierungshandler zu implementieren
3. Verwenden Sie es!
Stellen Sie sicher, dass Sie in Ihren App-Erstellungsphasen ein Ausführungsskript hinzufügen, damit Ihre Localizable.strings-Datei bei jedem Build aktualisiert wird. Das heißt, eine neue lokalisierte Zeichenfolge wird in Ihre Localized.strings-Datei eingefügt:
Mein Build-Phase-Skript ist ein Shell-Skript:
Wenn Sie also diese neue Zeile in Ihren Code einfügen:
Führen Sie dann einen Build durch. Ihre ./Localizable.scripts-Datei enthält diese neue Zeile:
Und da key == value für 'view_settings_title' ist, gibt der benutzerdefinierte LocalizedStringHandler den Kommentar zurück, dh 'Settings ".
Voilà :-)
quelle
In Swift verwende ich Folgendes, z. B. für die Schaltfläche "Ja" in diesem Fall:
Beachten Sie die Verwendung von
value:
für den Standardtextwert. Der erste Parameter dient als Übersetzungs-ID. Der Vorteil der Verwendung desvalue:
Parameters besteht darin, dass der Standardtext später geändert werden kann, die Übersetzungs-ID jedoch gleich bleibt. Die Datei Localizable.strings enthält"btn_yes" = "Yes";
Wenn der
value:
Parameter nicht verwendet wurde, wird der erste Parameter sowohl für die Übersetzungs-ID als auch für den Standardtextwert verwendet. Die Datei Localizable.strings würde enthalten"Yes" = "Yes";
. Diese Art der Verwaltung von Lokalisierungsdateien scheint seltsam zu sein. Insbesondere wenn der übersetzte Text lang ist, ist auch die ID lang. Wenn ein Zeichen des Standardtextwerts geändert wird, wird auch die Übersetzungs-ID geändert. Dies führt zu Problemen bei der Verwendung externer Übersetzungssysteme. Unter Ändern der Übersetzungs-ID wird das Hinzufügen eines neuen Übersetzungstextes verstanden, was möglicherweise nicht immer erwünscht ist.quelle
Ich habe ein Skript geschrieben, um Localizable.strings in mehreren Sprachen zu verwalten. Während es bei der automatischen Vervollständigung nicht hilft, hilft es, .strings-Dateien mit dem folgenden Befehl zusammenzuführen:
Weitere Informationen finden Sie unter: https://github.com/hiroshi/merge_strings
Einige von Ihnen finden es nützlich, hoffe ich.
quelle
Wenn jemand nach einer Swift-Lösung sucht. Vielleicht möchten Sie sich meine Lösung ansehen, die ich hier zusammengestellt habe: SwiftyLocalization
Mit wenigen Schritten zum Einrichten haben Sie eine sehr flexible Lokalisierung in Google Spreadsheet (Kommentar, benutzerdefinierte Farbe, Hervorhebung, Schriftart, mehrere Blätter und mehr).
Kurz gesagt, sind die Schritte: Google Spreadsheet -> CSV-Dateien -> Localizable.strings
Darüber hinaus wird Localizables.swift generiert, eine Struktur, die für Sie als Schnittstelle zum Abrufen und Dekodieren von Schlüsseln fungiert (Sie müssen jedoch manuell angeben, wie ein String vom Schlüssel dekodiert werden soll).
Warum ist das toll?
Zwar gibt es Tools, mit denen Sie Ihren lokalisierbaren Schlüssel automatisch vervollständigen können. Durch die Bezugnahme auf eine echte Variable wird sichergestellt, dass es sich immer um einen gültigen Schlüssel handelt, andernfalls wird er nicht kompiliert.
Das Projekt verwendet Google App Script zum Konvertieren von Blättern -> CSV und Python-Skript zum Konvertieren von CSV-Dateien -> Localizable.strings. In diesem Beispielblatt können Sie einen kurzen Blick darauf werfen, was möglich ist.
quelle
Unter iOS 7 und Xcode 5 sollten Sie die Methode 'Localization.strings' vermeiden und die neue Methode 'base localization' verwenden. Es gibt einige Tutorials, wenn Sie nach "Basislokalisierung" googeln.
Apple-Dokument: Basislokalisierung
quelle
quelle
Ich selbst werde oft von der Codierung mitgerissen und vergesse, die Einträge in .strings-Dateien zu speichern. Daher habe ich Hilfsskripte, um herauszufinden, was ich schulde, um sie wieder in .strings-Dateien zu speichern und zu übersetzen.
Da ich mein eigenes Makro über NSLocalizedString verwende, überprüfen und aktualisieren Sie das Skript, bevor Sie es verwenden, da ich der Einfachheit halber angenommen habe, dass nil als zweiter Parameter für NSLocalizedString verwendet wird. Der Teil, den Sie ändern möchten, ist
Ersetzen Sie es einfach durch etwas, das Ihrer Makro- und NSLocalizedString-Verwendung entspricht.
Hier kommt das Skript, Sie brauchen in der Tat nur Teil 3. Der Rest ist einfacher zu sehen, woher alles kommt:
Die Ausgabedatei enthält Schlüssel, die im Code gefunden wurden, jedoch nicht in der Datei Localizable.strings. Hier ist ein Beispiel:
Sicher kann mehr poliert werden, dachte aber ich würde teilen.
quelle