Gibt es ein Swift-Äquivalent von NSLocalizedString(...)
? In verwenden Objective-C
wir normalerweise:
NSString *string = NSLocalizedString(@"key", @"comment");
Wie kann ich dasselbe in Swift erreichen? Ich habe eine Funktion gefunden:
func NSLocalizedString(
key: String,
tableName: String? = default,
bundle: NSBundle = default,
value: String = default,
#comment: String) -> String
Es ist jedoch sehr lang und überhaupt nicht bequem.
ios
swift
localization
nslocalizedstring
RaffAl
quelle
quelle
NSLocalizedString("Cancel", comment: "Cancel button title")
die Standardwerte nutzen. Es ist bequem, denke ich.Antworten:
Ich benutze die nächste Lösung:
1) Erweiterung erstellen:
2) in der Datei Localizable.strings :
3) Anwendungsbeispiel:
genießen! ;)
--upd: -
Für den Fall mit Kommentaren können Sie diese Lösung verwenden:
1) Verlängerung:
2) in der .strings-Datei:
3) mit:
quelle
genstrings
Dienstprogramm nicht zum Generieren Ihrer .strings-Dateien verwenden können.func localized(comment: String = "") -> String
damit es kleiner und mit optionalen Kommentaren wird :)genstrings
?genstrings
durcheinander bringt , da nur wörtliche Zeichenfolgen funktionieren, die an NSLocalizedString übergeben werden. Mit dieser cleveren Problemumgehung verlieren Sie die Möglichkeit, Ihre .strings-Dateien mit demgenstrings
Tool zu aktualisieren , und zumindest für mich bedeutet dies, dass ich diesen vereinfachten Ansatz nicht verwenden kann.Das
NSLocalizedString
existiert auch in der Swift-Welt.Die
tableName
,bundle
undvalue
Parameter sind mit einem gekennzeichnetdefault
Schlüsselwort , das bedeutet , dass wir diese Parameter weglassen kann , während die Funktion aufrufen. In diesem Fall werden ihre Standardwerte verwendet.Dies führt zu der Schlussfolgerung, dass der Methodenaufruf vereinfacht werden kann, um:
Swift 5 - keine Änderung, funktioniert immer noch so.
quelle
Wrap in NSLocalizedString
Option, die die Sache wirklich einfach macht, indem Sie einfach Text markieren, mit der rechten Maustaste klicken und den Menüpunkt auswählen.Eine Variation der vorhandenen Antworten:
Swift 5.1:
Sie können es dann einfach mit oder ohne Kommentar verwenden:
Bitte beachten Sie, dass
genstrings
dies mit dieser Lösung nicht funktioniert.quelle
Auf diese Weise ist es möglich, eine unterschiedliche Implementierung für verschiedene Typen zu erstellen (z. B. Int- oder benutzerdefinierte Klassen wie CurrencyUnit, ...). Es ist auch möglich, mit dem Dienstprogramm genstrings nach dieser Methode zu suchen. Fügen Sie dem Befehl einfach das Routine-Flag hinzu
Erweiterung:
Verwendung:
quelle
Swift 3 Version :) ...
quelle
Tatsächlich können Sie Ihre Texte in Swift-Projekten in zwei Phasen übersetzen:
1) In der ersten Phase werden alle übersetzbaren Zeichenfolgen auf die alte Weise erstellt:
1.1) Dann sollten Sie genstrings verwenden, um Localizable.strings zu generieren:
2) Danach sollten Sie diese Antwort verwenden .
2.1) Verwenden Sie Ihre XCode-Option "Suchen und Ersetzen" basierend auf dem regulären Ausdruck. Für das angegebene Beispiel (wenn Sie keine Kommentare haben) lautet der reguläre Ausdruck:
und ersetzen Sie es durch
oder (wenn Sie Kommentare haben)
und ersetzen Sie es durch
Sie können nach Belieben mit Regex und verschiedenen Erweiterungskombinationen spielen. Der allgemeine Weg besteht darin, den gesamten Prozess in zwei Phasen aufzuteilen. Hoffentlich hilft das.
quelle
NSLocalizedString("Cancel", comment: "Cancel button title")
?NSLocalizedString
sieht weniger schnell aus, als es aussehen sollte.String.localized
Auf der anderen Seite sieht es schneller aus, aber Sie können keingesntrings
Dienstprogramm verwenden, das üblicherweise verwendet wird, um Ihre Arbeit mit der Internationalisierung zu erleichtern. Mein Punkt ist, dass es ziemlich einfach ist, beide Ansätze zu mischen. Es geht also hauptsächlich um die Lesbarkeit.genstrings
? Ersetzen Sie alles wieder.localized
durchNSLocalizedString
?Erstellt eine kleine Hilfsmethode für Fälle, in denen "Kommentar" immer ignoriert wird. Weniger Code ist leichter zu lesen:
Platzieren Sie es einfach irgendwo (außerhalb einer Klasse) und Xcode findet diese globale Methode.
quelle
Der wahrscheinlich beste Weg ist dieser hier .
und
Sie können es dann so verwenden
Für mich ist das das Beste, weil
quelle
static var Hello: String = { return NSLocalizedString("Hello") }
Wenn Sie ein SDK entwickeln. Sie benötigen eine zusätzliche Operation.
1) Erstellen Sie Localizable.strings wie gewohnt in YourLocalizeDemoSDK.
2) Erstellen Sie die gleichen Localizable.strings in YourLocalizeDemo.
3) Finden Sie Ihren Bundle-Pfad von YourLocalizeDemoSDK.
Swift4 :
Bundle(for: type(of: self))
hilft Ihnen, das Bundle in YourLocalizeDemoSDK zu finden. Wenn SieBundle.main
stattdessen verwenden, erhalten Sie einen falschen Wert (tatsächlich ist es dieselbe Zeichenfolge mit dem Schlüssel).Aber wenn Sie die von Dr. OX erwähnte String-Erweiterung verwenden möchten . Sie müssen noch etwas tun. Die Ursprungserweiterung sieht so aus.
Wie wir wissen, entwickeln wir ein SDK,
Bundle.main
erhalten das Bundle des YourLocalizeDemo-Bundles. Das wollen wir nicht. Wir benötigen das Bundle in YourLocalizeDemoSDK. Dies ist ein Trick, um es schnell zu finden.Führen Sie den folgenden Code in einer NSObject-Instanz in YourLocalizeDemoSDK aus. Und Sie erhalten die URL von YourLocalizeDemoSDK.
Wenn Sie beide URLs drucken, werden Sie feststellen, dass wir eine bundleURLofSDK-Basis auf mainBundleURL erstellen können. In diesem Fall ist es:
Und die String-Erweiterung lautet:
Ich hoffe es hilft.
quelle
Ich habe mein eigenes Genstrings-Tool zum Extrahieren von Strings mithilfe einer benutzerdefinierten Übersetzungsfunktion erstellt
https://gist.github.com/Maxdw/e9e89af731ae6c6b8d85f5fa60ba848c
Es analysiert alle Ihre schnellen Dateien und exportiert die Zeichenfolgen und Kommentare in Ihrem Code in eine .strings-Datei.
Wahrscheinlich nicht der einfachste Weg, aber es ist möglich.
quelle
Dies ist zwar keine Antwort auf das Verkürzungsproblem, hat mir jedoch bei der Organisation der Nachrichten geholfen. Ich habe eine Struktur für Fehlermeldungen wie unten erstellt
Auf diese Weise können Sie die Nachrichten organisieren und Genstrings zum Laufen bringen.
Und dies ist der verwendete Befehl genstrings
quelle
Hilfreich für die Verwendung in Unit-Tests:
Dies ist eine einfache Version, die auf verschiedene Anwendungsfälle erweitert werden kann (z. B. unter Verwendung von tableNames).
Verwenden Sie es so:
Oder so mit einem Kommentar:
quelle
Dies ist eine Verbesserung gegenüber dem "lokalisierten" Ansatz. Beginnen Sie mit dem Hinzufügen der Klassenerweiterung, da dies bei allen Zeichenfolgen hilft, die Sie programmgesteuert festgelegt haben:
Beispiel für die Verwendung für Zeichenfolgen, die Sie programmgesteuert festlegen:
Jetzt machen die Storyboard-Übersetzungsdateien von Xcode den Dateimanager unübersichtlich und verarbeiten Aktualisierungen des Storyboards auch nicht gut. Ein besserer Ansatz besteht darin, eine neue grundlegende Labelklasse zu erstellen und sie allen Storyboard-Labels zuzuweisen:
Jetzt wird jedes Etikett, das Sie hinzufügen und für das im Storyboard die Standardvorgabe angegeben ist, automatisch übersetzt, vorausgesetzt, Sie haben eine Übersetzung dafür bereitgestellt.
Sie können dasselbe für UIButton tun:
quelle
Wenn Sie beispielsweise aus dem Englischen, wo eine Phrase dieselbe ist, in eine andere Sprache übersetzen möchten, in der sie sich unterscheidet (aufgrund des Geschlechts, der Verbkonjugationen oder der Deklination), ist die einfachste NSString-Form in Swift, die in allen Fällen funktioniert, die drei Argumente eins . Beispielsweise wird der englische Ausdruck "Vorheriges war" für den Fall "Gewicht" ("предыдущ щ был") und für "Taille" ("предыдущ ая был а " anders als Russisch übersetzt ") .
In diesem Fall benötigen Sie zwei verschiedene Übersetzungen für eine Quelle (in Bezug auf das in WWDC 2018 empfohlene XLIFF-Tool). Sie können dies nicht mit zwei Argumenten erreichen: NSLocalizedString, wobei "previous was" sowohl für den "key" als auch für die englische Übersetzung (dh für den Wert) gleich ist. Die einzige Möglichkeit besteht darin, die Form mit drei Argumenten zu verwenden
Dabei sind die Schlüssel ("previousWasFeminine" und "previousWasMasculine") unterschiedlich.
Ich weiß, dass der allgemeine Rat darin besteht, den Ausdruck als Ganzes zu übersetzen, aber manchmal ist er zu zeitaufwändig und unpraktisch.
quelle
Lokalisierung mit Standardsprache:
quelle