2017-05-29 3 views
1

Pour faciliter localisant plus facile dans une application très faible de la mienne, j'ai cette méthode d'extension de chaîne:NSLocalizedString avec spécificateurs à Swift donne des ordures

extension String { 
    func localized(with values: Any...) -> String { 
     // debug values 
     for v in values { 
      print("\(type(of: v)): \(v)") 
     } 

     return String.localizedStringWithFormat(NSLocalizedString(self, comment: ""), values) 
    } 
} 

Ma localisation allemande de Localizable.strings contient cette paire clé/valeur : "WeeksFuture" = "In %d Wochen";

Faire ceci:

for _ in 0..<5 { 
    let localized = "WeeksFuture".localized(with: 3) 
    print(localized) 
} 

tout en ayant Xcode mis à déboguer l'application en allemand (althou gh cela se produit dans toutes les autres langues aussi) imprime ce à la fenêtre de sortie:

Int: 3 
In 151.456 Wochen 
Int: 3 
In 186.912 Wochen 
Int: 3 
In 186.880 Wochen 
Int: 3 
In 187.264 Wochen 
Int: 3 
In 187.488 Wochen 

De toute évidence, cela est faux. Pourquoi ai-je d'abord obtenir la sortie correcte de "Int: 3", puis une chaîne avec un numéro de poubelle apparemment aléatoire?

+0

connexes: [localizeWithFormat et arguments variadique à Swift] (https://stackoverflow.com/questions/27914053/localizewithformat-and-variadic-arguments-in -swift) et [Comment utiliser correctement VarArgs pour localiser les chaînes?] (https://stackoverflow.com/questions/42457503/how-to-properly-use-varargs-for-localizing-strings). –

Répondre

2

String.localizedStringWithFormat prend un String et CVarArg... comme arguments. Vous avez passé dans un tableau de Any - values comme deuxième argument. Il est forcé de convertir un tableau en un nombre décimal, ce qui donne le résultat bizarre.

Pour résoudre ce problème, il vous suffit de trouver une surcharge qui prend un [CVarArg] à la place. Heureusement, il y a une surcharge init comme ça:

return String.init(format: 
    NSLocalizedString(self, comment: ""), arguments: values) 

Cependant, values est un [Any], qui est incompatible avec le [CVarArg] prévu. Vous devriez probablement changer le type de paramètre.

donc votre extension tout ressemble à ceci:

func localized(with values: CVarArg...) -> String { 
    return String.init(format: NSLocalizedString(self, comment: ""), arguments: values) 
} 
+0

Cela fonctionne comme un charme, merci beaucoup! –