2010-03-17 5 views
10

Je suis familier avec l'utilisation de NSLocalizedString() pour localiser des chaînes, mais le problème que j'ai aujourd'hui nécessite un peu plus de finesse. Ma situation est comme ceci:Localisation de chaînes concaténées ou dynamiques

NSString *userName; //the users name, entered by the user. Does not need localized 
NSString *favoriteFood; //the users favorite food, also entered by user, and not needing localized 

NSString *summary = [NSString stringWithFormat:@"%@'s favorite food is %@", userName, favoriteFood]; 

Cela fonctionne bien pour l'anglais, mais pas toutes les langues utilise le même ordre des mots que l'anglais, par exemple, un mot par mot traduction du même Sentance du japonais en anglais serait lire: pizza nourriture préférée

UserName est

Sans oublier que l » est ne fait pas un possessif dans toutes les langues. Quelles techniques sont disponibles pour localiser ce type de phrase concaténée?

Quelles sont les techniques disponibles pour localiser ce type de phrase concaténée?

MISE À JOUR AU BÉNÉFICE D'AUTRES: @Jon Reed a raison, les spécificateurs de position sont très importants pour la localisation. Le document qu'il lie ne contient qu'une référence au fait qu'ils peuvent être utilisés avec NSString, NSLog, un autre, le lien ne dit pas vraiment comment les utiliser.

J'ai trouvé this link, ça l'explique bien. Cela explique aussi ma question mieux que moi. À partir du lien:

Les chaînes de format pour printf et sprintf (voir Printf) présentent un problème particulier pour la traduction. Tenir compte de la suivante: 1

printf(_"String `%s' has %d characters\n", 
      string, length(string))) A possible German 

traduction pour ce pourrait être:

"%d Zeichen lang ist die Zeichenkette `%s'\n" The problem 

devrait être évident: l'ordre des spécifications de format est différent de l'original! Même si gettext peut renvoyer la chaîne traduite à runtime, il ne peut pas modifier l'argument dans l'appel à printf.

Pour résoudre ce problème, le format printf spécificateurs peuvent avoir un supplémentaire élément facultatif, que nous appelons un spécificateur de position . Par exemple:

"%2$d Zeichen lang ist die Zeichenkette `%1$s'\n" Here, the 

spécificateur de position se compose d'un nombre entier , ce qui indique que l'argument à utiliser , et un « $ ». Les chiffres sont basés sur un seul et la chaîne de format elle-même n'est pas incluse. Ainsi, dans le exemple suivant, 'string' est le premier argument et 'longueur (string)' est la seconde:

$ gawk 'BEGIN { 
>  string = "Dont Panic" 
>  printf _"%2$d characters live in \"%1$s\"\n", 
>       string, length(string) 
> }' 
-| 10 characters live in "Dont Panic" 

Répondre

27

Pour spécifier l'ordre de substitution, utilisez %[email protected] et %[email protected] comme indicateurs de format. La chaîne de format localisée peut les utiliser dans n'importe quel ordre. Par exemple, dites que votre clé de chaîne est "FavoriteFood". Appelez

NSString *summary = 
      [NSString stringWithFormat:NSLocalizedString(@"FavoriteFood", nil), 
             userName, favoriteFood]; 

La localisation place les spécificateurs de format là où cela est utile pour les paramètres régionaux. Exemple:

"FavoriteFood" = "%[email protected] is the favorite food of %[email protected]"; 

Voir String Format Specifiers

+0

J'ai suivi votre lien, et lisez Localizing String Resources (http://developer.apple.com/mac/library/documentation/MacOSX/Conceptual/BPInternational/Articles/StringsFiles.html) aussi. Je n'ai vu aucune référence aux spécificateurs de format que vous mentionnez (% 2 $ @) Pouvez-vous expliquer cela un peu s'il vous plaît? – SooDesuNe

+1

Suivez le lien et recherchez "spécificateurs de position". Aussi, essayez-le. C'est un outil essentiel pour la localisation. –

+0

Le '% $ 1 @' devrait être '% 1 $ @' à la fin de votre exemple. – bovine

-1

Application NSLocalizedString() à la chaîne de format @"%@'s favorite food is %@" devrait lui permettre d'être remplacé avec l'ordre approprié des mots et possessifs pour la langue locale.

+0

Peut-être que je méconnaissent NSLocalizedString. Comment cela permet-il de changer l'ordre des variables de substitution? – SooDesuNe

+0

@SooDesuNe, je ne le pense pas; mais votre exemple n'a pas ce problème. Y a-t-il des langues qui placent l'objet avant le sujet? Wikipedia me dit qu'il y a quelques langues indigènes brésiliennes, et Klingon ... peut-être que ce n'est pas une grosse affaire? –

+0

@SooDesuNe: comme dans la réponse de Jon Reid, vous pouvez utiliser des spécificateurs de format de chaîne spécifiques à la position pour prendre en charge le problème d'ordre. – Isaac

Questions connexes