NSLocalizedString con variabile swift


86

Sto cercando di localizzare la mia app utilizzando NSLocalizedString. Quando importa il file XLIFF, la maggior parte funziona come un fascino ma qualcosa non lo fa e alcune stringhe non sono localizzate. Ho notato che il problema è da NSLocalizedString contenente qualcosa di variabile all'interno come:

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

o

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

Forse questa non è la sintassi corretta per questo tipo di cose. Qualcuno può spiegarmi come farlo in fretta? Grazie mille.


Questo è un ottimo articolo sulla localizzazione in Swift per un'architettura robusta
Mendy

Risposte:


138

Puoi utilizzare i sprintfparametri di formato all'interno NSLocalizedString, quindi il tuo esempio può essere simile a questo:

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

6
Come appare in Localizable.string
Van Du Tran

come in Obj-C:" - %d Notifica"=" - %d Notifica";
ReDetection

3
Come si sostituisce una stringa? Ho provato a usare il %smodificatore che non ha funzionato = \
igrek

12
@igrek Utilizzare %@per sostituire una stringa.
Yeehaw

3
Il riferimento per questi parametri di formattazione è developer.apple.com/library/content/documentation/Cocoa/…
Shaun Dychko

96

Nella sessione n. 412 del WWDC2014 "Localizing with Xcode 6" il modo corretto per farlo in Swift è il seguente:

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

Perché è necessario utilizzare NSLocalizedString (...)? non accade nell'implementazione di String.localizedStringWithFormat (...)?
Yitzchak,


1
Grazie l'ho già visto dopo averlo chiesto. Sarà molto utile per gli altri, quindi grazie
Yitzchak

25

Ho seguito l'approccio della creazione di estensioni a String poiché ho molte stringhe da localizzare.

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

Per usarlo per la localizzazione nel codice:

self.descriptionView.text = "Description".localized

Per le stringhe con variabili dinamiche seguire:

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

Dichiarare le stringhe nei file String per lingue diverse (esempio: arabo e inglese)

inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine

La speranza aiuterà!


2
Ma mi sembra che tu stia solo attaccando il tempo alla stringa. E se la tua stringa localizzata fosse come The doors open at %@ o'clock. La tua soluzione funzionerebbe ancora?
Houman

Sì, funziona perfettamente perché sto guadagnando tempo come String dal retro.
JaspreetKour

1
Grazie per aver incluso un riferimento a Localizable.strings. Tuttavia, penso che @Houman abbia una valida preoccupazione.
Matt

Non so perché le persone vogliano abbandonare il valore "comment". Fornisce la descrizione del testo e il suo scopo agli ingegneri della localizzazione senza i quali non possono distinguere l'intenzione di utilizzare quel testo su un pulsante o come un'etichetta, ecc.
Satyam

8

Ho provato le soluzioni di cui sopra, tuttavia il codice seguente ha funzionato per me

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? \"%@\"";

7

Ecco un'estensione che uso in String, aggiunge una funzione localizeWithFormat con argomenti variabili,

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")
     }
}

Utilizzo:

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)

Fai solo attenzione a non usare la stessa funzione e i nomi delle proprietà di String. Normalmente uso un prefisso di 3 lettere per tutte le mie funzioni del framework.


-5

Ho creato un extensiona Stringdato che ne avevo molti stringsda essere localized.

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

Per esempio:

let myValue = 10
let anotherValue = "another value"

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

6
Il grande svantaggio di questo approccio è che devi estrarre manualmente le stringhe da inviare al traduttore in quanto Editor > Export for Localization...non le raccoglierà.
Jason Moore

Dato quanto suggerito da @JasonMoore, non credo che questo sia l'approccio giusto.
Yuchen Zhong

@JasonMoore totalmente d'accordo con te. Qualcuno di voi ha trovato una soluzione per questo?
gasparuff

non sapevo perché questa soluzione è stata sottovalutata :(. e quasi la soluzione sotto il nido sotto è la stessa ma ha un aumento
Amr Angry
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.