2013-02-20 5 views
30

Come vorrei usare NSLocalizedString per questa stringa:NSLocalizedString con il formato

[NSString stringWithFormat:@"Is “%@“ still correct for “%@“ tap “OK“ otherwise tap “Change“ to choose new contact details", individual.contactInfo, individual.name]; 

Quando si utilizza stringWithFormat prima ho usato nel modo seguente:

[NSString stringWithFormat:@"%d %@", itemCount, NSLocalizedString(@"number of items", nil)]; 
+0

Hot Licks ha la risposta giusta, ma suggerirei anche di leggere http://nshipster.com/nslocalizedstring/ –

+0

Suppongo che la mia risposta non gestisca le virgolette incorporate, ma sono state interrotte nell'originale. –

+0

Un apparente ritardo dell'implementazione iOS per stringhe localizzate è che il commento non è incluso come parte della chiave. Per questo motivo puoi avere due messaggi diversi con lo stesso testo inglese ma commenti diversi, e il sistema operativo non sarà (apparentemente) in grado di disambigarli. –

risposta

64
[NSString stringWithFormat:NSLocalizedString(@"Is “%@“ still correct for “%@“ tap “OK“ otherwise tap “Change“ to choose new contact details", @"Query if parm 1 is still correct for parm 2"), individual.contactInfo, individual.name]; 
+0

Ah so NSLocalizedString riconosce '% @'? –

+8

No, ma stringWithFormat. –

+0

Se sei su Swift, puoi usare 'String (formato: NSLocalizedString (" pippo% @ baz ")," barra ")'. –

24

frasi Attribuite può essere costruito con le parti variabili in un ordine diverso in alcune lingue, quindi penso che dovresti usare gli argomenti posizionali con [NSString stringWithFormat:]:

NSString *format = NSLocalizedString(@"number_of_items", @"Number of items"); 

Che sarebbe caricare la seguente stringa per l'inglese:

@"Is \"%[email protected]\" still correct for \"%[email protected]\" tap \"OK\" otherwise tap \"Change\" to choose new contact details" 

E forse qualcosa di diverso per il francese (non so francese quindi non tentare una traduzione, ma potrebbe anche avere il primo e il secondo argomento in un ordine diverso):

"French \"%[email protected]\" french \"%[email protected]\" french" 

e si può formattare in modo sicuro la stringa come normale:

NSString *translated = [NSString stringWithFormat:format individual.contactInfo, individual.name]; 
+0

Non è necessario utilizzare i token che specificano la posizione nella versione inglese (se l'ordine è conforme senza). Possono ancora essere utilizzati in francese (o qualsiasi altra cosa) se necessario. –

+1

@HotLicks Penso che abbia senso usarli ovunque se usati affatto. – trojanfoe

+1

Solo un'altra cosa da sbagliare, nella maggior parte dei casi. –

11

Voglio solo aggiungere una definizione molto utile che uso in molti dei miei progetti.

ho aggiunto questa funzione alla mia header prefix lima:

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

Questo consente di definire una stringa localizzata come la seguente:

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

e può essere utilizzato tramite:

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

Funziona come un fascino e molto elegante. – agarcian

+3

Si noti, tuttavia, che questo elimina lo strumento 'genstrings' che cerca solo i riferimenti diretti a NSLocalizedStrings. Non elabora le macro. – AHM