web-dev-qa-db-fra.com

Possible d'utiliser des variables et/ou des paramètres avec NSLocalizedString?

J'ai essayé d'utiliser une variable en tant que paramètre d'entrée pour NSLocalizedString, mais tout ce que je récupère, c'est le paramètre d'entrée. Qu'est-ce que je fais mal? Est-il possible d'utiliser une valeur de chaîne de variable comme index pour une chaîne NSLocalized?

Par exemple, j'ai certaines chaînes pour lesquelles je souhaite que les versions localisées soient affichées. Cependant, j'aimerais utiliser une variable en tant que paramètre de NSLocalizedString, au lieu d'une chaîne constante. De même, j'aimerais inclure des éléments de formatage dans le paramètre de NSLocalizedString afin de pouvoir extraire une version localisée de la chaîne avec les mêmes paramètres de formatage. Puis-je faire ce qui suit:

Cas 1: chaîne NSLocalized variable:

NSString *varStr = @"Index1";
NSString *string1 = NSLocalizedString(varStr,@"");

Cas 2: NSLocalizedString formaté:

NSString *string1 = [NSString stringWithFormat:NSLocalizedString(@"This is an %@",@""),@"Apple"];

(Veuillez noter que la variable peut contenir n'importe quoi, pas seulement un ensemble fixe de chaînes.)

Merci!

59
futureelite7

Il s'avère qu'une entrée de cible manquante est à blâmer. Le simple fait de vérifier que ma cible de construction actuelle inclut le fichier Localizable.string a résolu le problème!

4
futureelite7

Si ce que vous voulez, c'est retourner la version localisée de "Ceci est une pomme/orange/peu importe", vous voudriez:

NSString *localizedVersion = NSLocalizedString(([NSString stringWithFormat:@"This is an %@", @"Apple"]), nil);

(C'est-à-dire que les fonctions NSLocalizedString() et [NSString stringWithFormat:] sont inversées.)

Si ce que vous voulez, c'est que le format soit localisé, mais pas la valeur substituée, faites ceci:

NSString *finalString = [NSString stringWithFormat:NSLocalizedString(@"SomeFormat", nil), @"Apple"];

Et dans votre Localizable.strings:

SomeFormat = "This is an %@";
118
Wevah

Je veux juste ajouter une définition très utile que j'utilise dans plusieurs de mes projets.

Inspiré par les possibilités androïdes, j'ai ajouté cette fonction à mon fichier header prefix:

#define NSLocalizedFormatString(fmt, ...) [NSString stringWithFormat:NSLocalizedString(fmt, nil), __VA_ARGS__]

Cela vous permet de définir une chaîne localisée comme suit:

 "ExampleScreenAuthorizationDescriptionLbl"= "I authorize the payment of %@ to %@.";

et il peut être utilisé via:

self.labelAuthorizationText.text = NSLocalizedFormatString(@"ExampleScreenAuthorizationDescriptionLbl", self.formattedAmount, self.companyQualifier);
21
Alexander

Pour Swift:

let myString = String(format: NSLocalizedString("I authorize the payment of %d ", comment: ""), amount)
7
Xero

Si vous avez plus d'une variable dans votre chaîne localisée, pouvez-vous utiliser cette solution:

Dans Localizable.strings

"winpopup" = "#name# wins a #type# and get #points# points(s)"; 

Et utilisez stringByReplacingOcurrencesOfString pour insérer les valeurs

NSString *string = NSLocalizedString(@"winpopup", nil); //"#name# wins a #type# and get #points# points(s)"
NSString *foo = [string stringByReplacingOccurrencesOfString:@"#name#" withString:gameLayer.turn];
NSString *fooo = [foo stringByReplacingOccurrencesOfString:@"#type#" withString:winMode];
NSString *msg = [fooo stringByReplacingOccurrencesOfString:@"#points#" withString:[NSString stringWithFormat:@"%i", pkt]];
NSLog(@"%@", msg);
4
zeiteisen
extension String {
    public var localizedString: String {
        return NSLocalizedString(self, comment: "")
    }

    public func localizedString(with arguments: [CVarArg]) -> String {
        return String(format: localizedString, arguments: arguments)
    }
}

Localizable.string:

"Alarm:Popup:DismissOperation:DeviceMessage" = "\"%@\" will send position updates on a regular basis again.";
"Global:Text:Ok" = "OK";

Usage:

let message = "Alarm:Popup:DismissOperation:DeviceMessage".localizedString(with: [name])

et

let title = "Global:Text:Ok".localizedString
1
mientus

Vos idées devraient fonctionner. Mais si vous récupérez le paramètre d'entrée, cela signifie que le paramètre d'entrée n'a pas été trouvé en tant que clé dans votre fichier Localizable.strings. Vérifiez la syntaxe et l'emplacement de ce fichier.

0
JWWalker