2010-08-10 11 views
56

He intentado usar una variable como parámetro de entrada para NSLocalizedString, pero todo lo que estoy recuperando es el parámetro de entrada. ¿Qué estoy haciendo mal? ¿Es posible usar un valor de cadena variable como índice para la cadena NSLocalized?Posible usar variables y/o parámetros con NSLocalizedString?

Por ejemplo, tengo algunas cadenas que quiero que se muestren las versiones localizadas. Sin embargo, me gustaría usar una variable como parámetro para NSLocalizedString, en lugar de una cadena constante. Del mismo modo, me gustaría incluir elementos de formato en el parámetro para NSLocalizedString, por lo que podría recuperar una versión localizada de la cadena con los mismos parámetros de formato. ¿Puedo hacer lo siguiente:

Caso 1: NSLocalizedString variable:

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

Caso 2: con formato NSLocalizedString:

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

(Tenga en cuenta que la variable puede contener cualquier cosa, no sólo un fijo conjunto de cadenas.)

Gracias!

Respuesta

4

Resulta que una entrada de destino falta es la culpa. ¡Simplemente comprobando que mi objetivo de compilación actual incluye el archivo Localizable.string resolvió el problema!

115

Si lo que desea es volver la versión localizada de "Este es un Apple/naranja/lo que sea", que querría:

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

(Es decir, la anidación de NSLocalizedString() y [NSString stringWithFormat:] se invierten.)

Si lo que quiere es el formato a ser localizado, pero no el valor sustituido-in, haga lo siguiente:

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

Y en su Localizable.strings:

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

Sí, pero la variable puede contener cualquier cosa, no solo "manzanas" o "naranjas". Entonces necesito mantener flexibilidad. – futureelite7

+1

Permítanme agregar mi respuesta por si acaso. – Wevah

+0

Muchas gracias; la respuesta adjunta es, de hecho, lo que estaba buscando, y espero que obtenga una casilla de verificación 'aceptar' pronto. – RonLugge

0

Sus ideas deben trabajar. Pero si está recuperando el parámetro de entrada, significa que el parámetro de entrada no se encontró como una clave en su archivo Localizable.strings. Verifique la sintaxis y la ubicación de ese archivo.

4

Si usted tiene más de una variable en su cadena localizada se puede usar esta solución:

En Localizable.strings

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

Y el uso de stringByReplacingOccurrencesOfString para insertar los valores

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

muy útil! gracias – david

+41

esto parece muy complicado. solo puede usar marcadores de posición numerados: '" exampleKey "="% 1 $ @ ha comprado% 3 $ d manzanas y% 2 $ d naranjas. ' ' [NSString stringWithFormat: NSLocalizedString (@ "exampleKey", nil), @ "Markus", 4, 3] ' Esto daría como resultado:' Markus ha comprado 3 manzanas y 4 naranjas'. – denbec

+7

Y que vaya y explique este tipo de cadenas criptográficas a sus traductores de todo el mundo. – zeiteisen

21

Solo quiero agregar una definición muy útil que uso en muchos de mis proyectos.

Inspirado por androides posibilidad, he añadido esta función para mi header prefix archivo:

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

Esto le permite definir una cadena localizada como la siguiente:

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

y puede ser usado vía:

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

Para swift:

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