NSLocalizedString mit schneller Variable


83

Ich versuche, meine App mit NSLocalizedString zu lokalisieren. Wenn ich die XLIFF-Datei importiere, funktioniert das meiste wie ein Zauber, aber etwas nicht und einige Zeichenfolgen sind nicht lokalisiert. Ich habe festgestellt, dass das Problem von NSLocalizedString herrührt, das etwas Variables enthält, wie:

NSLocalizedString(" - \(count) Notifica", comment: "sottotitolo prescrizione per le notifiche al singolare")

oder

NSLocalizedString("Notifica per \(medicina!) della prescrizione \(prescription!)\nMemo: \(memoTextView.text)", comment: "Messaggio della Local Notification")

Vielleicht ist dies nicht die richtige Syntax für solche Sachen. Kann mir jemand erklären, wie man das schnell macht? Vielen Dank.


Dies ist ein sehr guter Artikel über die Lokalisierung in Swift für eine robuste Architektur
Mendy

Antworten:


131

Sie können die sprintfFormatparameter in verwenden NSLocalizedString, sodass Ihr Beispiel folgendermaßen aussehen kann:

let myString = String(format: NSLocalizedString(" - %d Notifica", comment: "sottotitolo prescrizione per le notifiche al singolare"), count)

6
Wie sieht es in der Localizable.string aus
Van Du Tran

das gleiche wie in Obj-C:" - %d Notifica"=" - %d Notifica";
ReDetection

3
Wie ersetze ich einen String? Ich habe versucht, einen %sModifikator zu verwenden, der nicht funktioniert hat = \
igrek

12
@igrek %@Zum Ersetzen eines Strings.
Yeehaw

2
Die Referenz für diese Formatierungsparameter ist developer.apple.com/library/content/documentation/Cocoa/…
Shaun Dychko

94

In Sitzung Nr. 412 des WWDC2014 "Lokalisieren mit Xcode 6" ist der richtige Weg in Swift der folgende:

String.localizedStringWithFormat(
    NSLocalizedString(" - %d Notifica",
    comment: "sottotitolo prescrizione per le notifiche al singolare"),
    count)

Warum müssen Sie NSLocalizedString (...) verwenden? passiert das nicht bei der Implementierung von String.localizedStringWithFormat (...)?
Yitzchak


1
Danke, ich habe es schon gesehen, nachdem ich gefragt habe. Es wird für andere sehr hilfreich sein, also danke
Yitzchak

25

Ich habe den Ansatz verfolgt, eine Erweiterung für String zu erstellen, da ich viele Strings lokalisieren muss.

extension String {
    var localized: String {
        return NSLocalizedString(self, comment:"")
    }
}

Um es für die Lokalisierung im Code zu verwenden, gehen Sie wie folgt vor:

self.descriptionView.text = "Description".localized

Für Zeichenfolgen mit dynamischen Variablen folgen Sie:

self.entryTimeLabel.text = "\("Doors-open-at".localized) \(event.eventStartTime)"

Deklarieren Sie die Zeichenfolgen in Zeichenfolgendateien für verschiedene Sprachen (Beispiel: Arabisch und Englisch).

Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein

Hoffnung wird helfen!


2
Aber es scheint mir, dass Sie nur die Zeit an die Zeichenfolge anhängen. Was passiert , wenn Ihre lokalisierten String war wie The doors open at %@ o'clock. Würde Ihre Lösung noch funktionieren?
Houman

Ja, es funktioniert perfekt, da ich von hinten Zeit als String bekomme.
JaspreetKour

1
Vielen Dank für die Aufnahme eines Verweises auf Localizable.strings. Ich denke jedoch, dass @Houman ein berechtigtes Anliegen hat.
Matt

Ich weiß nicht, warum Leute den "Kommentar" -Wert streichen wollen. Es gibt den Lokalisierungsingenieuren die Beschreibung des Textes und seinen Zweck, ohne die sie nicht die Absicht erkennen können, diesen Text auf einer Schaltfläche oder als Beschriftung usw. zu verwenden.
Satyam

7

Ich habe die oben genannten Lösungen ausprobiert, aber der folgende Code hat für mich funktioniert

SWIFT 4

extension String {

    /// Fetches a localized String
    ///
    /// - Returns: return value(String) for key
    public func localized() -> String {
        let path = Bundle.main.path(forResource: "en", ofType: "lproj")
        let bundle = Bundle(path: path!)
        return (bundle?.localizedString(forKey: self, value: nil, table: nil))!
    }


    /// Fetches a localised String Arguments
    ///
    /// - Parameter arguments: parameters to be added in a string
    /// - Returns: localized string
    public func localized(with arguments: [CVarArg]) -> String {
        return String(format: self.localized(), locale: nil, arguments: arguments)
    }

}

// variable in a class
 let tcAndPPMessage = "By_signing_up_or_logging_in,_you_agree_to_our"
                                     .localized(with: [tAndc, pp, signin])

// Localization File String
"By_signing_up_or_logging_in,_you_agree_to_our" = "By signing up or logging in, you agree to our \"%@\" and \"%@\" \nAlready have an Account? \"%@\"";

6

Hier ist eine Erweiterung, die ich in String verwende. Sie fügt eine localizeWithFormat-Funktion mit variablen Argumenten hinzu.

extension String:{

     func localizeWithFormat(arguments: CVarArg...) -> String{
        return String(format: self.localized, arguments: arguments)        
     }

     var localized: String{
         return Bundle.main.localizedString(forKey: self, value: nil, table: "StandardLocalizations")
     }
}

Verwendung:

let siriCalendarText = "AnyCalendar"
let localizedText = "LTo use Siri with my app, please set %@ as the default list on your device reminders settings".localizeWithFormat(arguments: siriCalendarTitle)

Achten Sie nur darauf, nicht dieselben Funktions- und Eigenschaftsnamen wie String zu verwenden. Normalerweise verwende ich für alle meine Framework-Funktionen ein Präfix mit 3 Buchstaben.


-5

Ich habe ein extensionzu geschaffen , Stringda ich viele stringszu haben hatte localized.

extension String {
    var localized: String {
        return NSLocalizedString(self, tableName: nil, bundle: Bundle.main, value: "", comment: "")
    }
}

Beispielsweise:

let myValue = 10
let anotherValue = "another value"

let localizedStr = "This string is localized: \(myValue) \(anotherValue)".localized
print(localizedStr)

6
Der große Nachteil dieses Ansatzes besteht darin, dass Sie die Zeichenfolgen manuell extrahieren müssen, um sie an den Übersetzer zu senden, da Editor > Export for Localization...sie nicht erfasst werden.
Jason Moore

Angesichts der Vorschläge von @JasonMoore halte ich dies nicht für den richtigen Ansatz.
Yuchen Zhong

@ JasonMoore stimme dir vollkommen zu. Hat jemand von euch eine Lösung dafür gefunden?
Gasparuff

Ich wusste nicht, warum diese Lösung herabgestuft wird :(. und fast das unten stehende Nest unter der Lösung ist das gleiche, aber es hat eine Aufwertung
Amr Angry
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.