2011-06-10 16 views
15

Necesito enviar a mi servidor una lista de localizaciones para una cadena en particular.iPhone/iOS: ¿Cómo puedo obtener una lista de cadenas localizadas en todos los idiomas en los que se localiza mi aplicación?

Significado, si mi aplicación tiene una cadena de Foo que se localiza como @ "Foo" en Inglés y @ "Фу" en ruso, me gustaría enviar al servidor una lista como esta:

  • cadena Foo:
    • Inglés: "Foo"
    • ruso: "Фу"

Lo que creo que es necesario para poder hacer es:

  1. cadenas Enumerar localizados para cada idioma mi aplicación se localiza a
  2. obtener la versión localizada de Foo para cada idioma

¿Cómo lo hago (1) y cómo lo hago (2)?

+0

¿Ha echado un vistazo en 'NSLocalizedStringFromTable'? http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Miscellaneous/Foundation_Functions/Reference/reference.html%23//apple_ref/c/macro/NSLocalizedStringFromTableInBundle – joshpaul

+1

De la tabla parece ser un forma de compartimentar sus cadenas, en lugar de mantenerlos todos en una tabla predeterminada. Esto no es lo que quiero. Quiero obtener todas las localizaciones diferentes de una cadena en particular. –

Respuesta

31

Puede recuperar todas las claves de cadena mediante la lectura en English.lproj/Localizable.strings como un diccionario y que obtiene sus claves:

NSString *stringsPath = [[NSBundle mainBundle] pathForResource:@"Localizable" ofType:@"strings"]; 
NSDictionary *dictionary = [NSDictionary dictionaryWithContentsOfFile:stringsPath]; 

Para obtener la traducción de cada idioma, se puede iterar sobre los idiomas de cada tecla Inglés y utilizar NSLocalizedStringFromTableInBundle:

for (NSString *language in [[NSUserDefaults standardUserDefaults] objectForKey:@"AppleLanguages"]) { 
    NSBundle *bundle = [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:language ofType:@"lproj"]]; 
    NSLog(@"%@: %@", language, NSLocalizedStringFromTableInBundle(@"Testing", @"Localizable", bundle, nil)); 
} 
+0

Esto suena razonable; las otras opciones que vi requerían reescribir la forma en que recuperamos las cadenas, pero esto es mucho menos invasivo y parece que hace lo que necesito. Lo intentaré hoy. –

+0

me ayudó :) – Swati

+2

Tenga en cuenta que la primera llamada a 'pathForResource' en los ejemplos de código anteriores devolverá la ruta para la localización * actual *, no necesariamente la inglesa (por ejemplo, si su simulador/dispositivo está configurado en alemán, obtendrá el camino a 'de.lproj/Localizable.strings'). – Alessandro

Cuestiones relacionadas