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.
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)
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)
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)
Hope va aider!
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? \"%@\"";
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.