61 votes

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

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

Par exemple, j'ai quelques chaînes de caractères dont je veux afficher les versions localisées. Cependant, je voudrais utiliser une variable comme 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 récupérer une version localisée de la chaîne avec les mêmes paramètres de formatage. Puis-je faire ce qui suit ?

Cas 1 : Variable NSLocalizedstring :

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 de caractères).

Merci !

127voto

Wevah Points 17636

Si ce que vous voulez, c'est renvoyer la version localisée de "Ceci est une pomme/orange/quelque chose", vous voudrez :

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

(c'est-à-dire l'imbrication de NSLocalizedString() y [NSString stringWithFormat:] sont inversés).

Si ce que vous voulez est le format à localiser, 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 %@";

0 votes

Oui, mais la variable peut contenir n'importe quoi, pas seulement des "pommes" ou des "oranges". Donc j'ai besoin de maintenir la flexibilité.

1 votes

Permettez-moi d'ajouter ma réponse, juste au cas où.

0 votes

Merci beaucoup ; la réponse ci-jointe est en fait ce que je cherchais - et j'espère que vous aurez bientôt une case à cocher "accepter".

24voto

Alexander Points 2514

Je souhaite simplement ajouter une définition très utile que j'utilise dans nombre de mes projets.

Inspiré par la possibilité des androïdes, j'ai ajouté cette fonction à mon système de gestion de l'information. header prefix fichier :

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

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

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

et il peut être utilisé via :

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

4voto

futureelite7 Points 6247

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

2voto

zeiteisen Points 2894

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

Dans Localizable.strings

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

Et utiliser stringByReplacingOccurrencesOfString 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);

49 votes

Cela semble très compliqué. Vous pouvez simplement utiliser des caractères de remplacement numérotés : "exampleKey" = "%1$@ has bought %3$d apples and %2$d oranges." [NSString stringWithFormat:NSLocalizedString(@"exampleKey", nil), @"Markus", 4, 3] Cela donnerait un résultat : Markus has bought 3 apples and 4 oranges .

9 votes

Et ensuite aller expliquer ce type de chaînes cryptographiques à vos traducteurs dans le monde entier.

0 votes

C'est %1 ou %2 qui doit être utilisé.

0voto

JWWalker Points 11189

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X