web-dev-qa-db-fra.com

NSLocalizedString avec la variable Swift

J'essaie de localiser mon application à l'aide de NSLocalizedString. Lorsque j'importe le fichier XLIFF, la plupart fonctionnent comme un charme, mais quelque chose ne fonctionne pas et une chaîne n'est pas localisée. J'ai remarqué que le problème vient de NSLocalizedString contenant quelque chose de variable à l'intérieur comme:

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

ou

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

Peut-être que ce n'est pas la syntaxe correcte pour ce genre de choses. Quelqu'un peut m'expliquer comment faire cela rapidement? Merci beaucoup.

64
Andorath

Vous pouvez utiliser les paramètres de format sprintf dans NSLocalizedString pour que votre exemple ressemble à ceci:

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

Dans la session n ° 412 de la WWDC2014 "Localisation avec Xcode 6", la manière appropriée de procéder dans Swift est la suivante:

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

J'ai suivi l'approche consistant à créer une extension de String car j'ai beaucoup de chaînes à localiser.

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

Pour l'utiliser pour la localisation dans le code, procédez comme suit:

self.descriptionView.text = "Description".localized

Pour les chaînes avec des variables dynamiques, suivez: 

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

Déclarez les chaînes dans des fichiers de chaîne pour différentes langues (exemple: arabe et anglais)

 enter image description here  enter image description here

Hope va aider!

16
JaspreetKour

J'ai essayé les solutions ci-dessus mais le code ci-dessous a fonctionné pour moi

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

Voici une extension que j'utilise dans String, elle ajoute une fonction localizeWithFormat avec des arguments variables, 

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

Usage:

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)

Veillez simplement à ne pas utiliser les mêmes noms de fonction et de propriété que String. J'utilise normalement un préfixe de 3 lettres pour toutes mes fonctions du framework.

1
the Reverend