2010-08-10 14 views
56

Ich habe versucht, eine Variable als Eingabeparameter für NSLocalizedString zu verwenden, aber alles, was ich bekomme, ist der Eingabeparameter. Was mache ich falsch? Ist es möglich, einen variablen String-Wert als Index für NSLocalized String zu verwenden?Möglich, Variablen und/oder Parameter mit NSLocalizedString zu verwenden?

Zum Beispiel habe ich einige Zeichenfolgen, die lokalisierte Versionen angezeigt werden sollen. Ich möchte jedoch eine Variable als Parameter für NSLocalizedString anstelle einer konstanten Zeichenfolge verwenden. Ebenso möchte ich Formatierungselemente in den Parameter für NSLocalizedString einfügen, sodass ich eine lokalisierte Version der Zeichenfolge mit denselben Formatierungsparametern abrufen könnte. Kann ich folgendes tun:

Fall 1: Variable NSLocalizedString:

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

Fall 2: Formatierte NSLocalizedString:

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

(Bitte beachten Sie, dass die Variable alles enthalten kann, nicht nur ein fester Satz Zeichenfolgen.)

Danke!

Antwort

4

Es stellt sich heraus, dass ein fehlender Zieleintrag schuld ist. Überprüfen Sie einfach, dass mein aktuelles Build-Ziel die Localizable.string-Datei enthält, das Problem wurde behoben!

115

Wenn Sie was Sie wollen, ist die lokalisierte Version von „Dies ist ein Apple/Orange/was auch immer“ zurückzukehren, würden Sie wollen:

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

(dh die Verschachtelung von NSLocalizedString() und [NSString stringWithFormat:] umgekehrt sind.)

Wenn das, was Sie wollen, ist das Format lokalisiert, aber nicht die substituierten Wert, dies tun werden:

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

Und in Ihrem Localizable.strings:

SomeFormat = "This is an %@"; 
+0

Ja, aber die Variable kann alles enthalten, nicht nur "Äpfel" oder "Orangen". Ich muss also flexibel bleiben. – futureelite7

+1

Lassen Sie mich meine Antwort nur für den Fall anhängen. – Wevah

+0

Vielen Dank; Die angefügte Antwort ist in der Tat, was ich gesucht habe - und ich hoffe, dass Sie bald eine "akzeptieren" Checkbox bekommen. – RonLugge

0

sollten Ihre Ideen arbeiten. Wenn Sie jedoch den Eingabeparameter zurück erhalten, bedeutet dies, dass der Eingabeparameter nicht als Schlüssel in Ihrer Localizable.strings-Datei gefunden wurde. Überprüfen Sie die Syntax und den Speicherort dieser Datei.

4

Wenn Sie mehr als eine Variable in Ihrer lokalisierten String haben, können Sie diese Lösung verwenden:

In Localizable.strings

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

Und verwenden stringByReplacingOccurrencesOfString die Werte einfügen

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); 
+0

sehr hilfreich! danke – david

+41

das scheint sehr kompliziert. Sie können einfach nummerierte Platzhalter verwenden: '" exampleKey "="% 1 $ @ hat% 3 $ d apples und% 2 $ d orangens gekauft. "' '[NSString stringWithFormat: NSLocalizedString (@" exampleKey ", nil), @ "Markus", 4, 3] ' Dies würde ausgeben:' Markus hat 3 Äpfel und 4 Orangen gekauft'. – denbec

+7

Und dann diese Art von kryptografischen Zeichenfolgen Ihren Übersetzern auf der ganzen Welt erklären. – zeiteisen

21

Ich möchte nur eine sehr hilfreiche Definition hinzufügen, die ich in vielen meiner Projekte verwende.

Inspiriert von Androiden Möglichkeit habe ich diese Funktion zu meiner header prefix Datei hinzugefügt:

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

Auf diese Weise können Sie eine lokalisierte Zeichenfolge wie folgt definieren:

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

und es kann sein, verwendet über:

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

Für swift:

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