2013-02-20 13 views
30

Jak użyłbym NSLocalizedString do tego wyrażenie:NSLocalizedString z formatem

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

Podczas korzystania stringWithFormat przed Używałem go w następujący sposób:

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

Hot Licks ma właściwą odpowiedź, ale proponuję również przeczytać http://nshipster.com/nslocalizedstring/ –

+0

Przypuszczam, że moja odpowiedź nie obsługuje osadzonych cytatów, ale zostały one zerwane w oryginale. –

+0

Jednym z widocznych krótkich następstw implementacji iOS dla zlokalizowanych ciągów jest to, że komentarz nie jest częścią klucza. Z tego powodu możesz mieć dwie różne wiadomości o tym samym angielskim brzmieniu, ale różne komentarze, a system operacyjny nie będzie (widocznie) w stanie je rozróżnić. –

Odpowiedz

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 tak NSLocalizedString rozpoznaje '% @'? –

+8

Nie, ale stringWithFormat ma. –

+0

Jeśli używasz Swift, możesz użyć 'String (format: NSLocalizedString (" foo% @ baz ")," bar ")'. –

24

Biorąc pod uwagę zdania mogą być zbudowany z zmiennych części w innej kolejności w niektórych językach, wtedy myślę, że powinieneś użyć argumentów pozycyjnych z [NSString stringWithFormat:]:

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

Które załadować następujący ciąg na angielski:

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

A może coś jeszcze dla języka francuskiego (nie znam francuskiego, więc nie będę próbować tłumaczenie, ale może to dobrze mieć pierwszy i drugi argument w innej kolejności):

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

i można bezpiecznie sformatować ciąg jako normalny:

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

Nie musisz używać żetonów określających pozycję w wersji angielskiej (jeśli zamówienie jest zgodne). Mogą nadal być używane w języku francuskim (lub cokolwiek innego) w razie potrzeby. –

+1

@HotLicks Myślę, że sensowne jest używanie ich wszędzie, jeśli są w ogóle używane. – trojanfoe

+1

Inną rzeczą, która może się nie udać, jest w większości przypadków. –

11

Po prostu chcę dodać jedną bardzo pomocną definicję, której używam w wielu moich projektach.

Dodałem tę funkcję do mojego header prefix pliku:

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

ta pozwala na zdefiniowanie zlokalizowaną ciąg jak poniżej:

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

i może być używany przez:

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

Działa jak urok i bardzo elegancki. – agarcian

+3

Należy jednak zauważyć, że zabija to narzędzie "genstrings", które szuka tylko bezpośrednich odniesień do NSLocalizedStrings. Nie przetwarza makr. – AHM

Powiązane problemy