2010-07-22 8 views
17

Tengo una aplicación que estoy traduciendo a muchos idiomas diferentes. El problema es que la aplicación tendrá unos valores diferentes en Australia que en Nueva Zelanda, que son ambos países de habla inglesa.Localización de la aplicación iPhone - ¿Problemas en inglés?

He creado un en_AU y un archivo de idioma en_NZ, pero ambos usan el archivo estándar en inglés. Borré el archivo de idioma inglés, pero continúa sucediendo ...

¿Alguna idea sobre cómo puedo hacer que esto funcione?

Gracias,

--d

+0

borrar el archivo en inglés causó un montón de problemas ... Tengo un montón de otros idiomas trabajando, pero cuando quiero usar el mismo idioma pero para diferentes regiones, no funciona: S – dewberry

Respuesta

37

localizaciones iPhone (o es que localizaciones?) No toman ninguna notificación de la Región de las series de usuario (es decir, UK, Aus, NZ). Solo hay una traducción de idioma "inglés" disponible por defecto. Sin embargo, puedes hackear cosas para forzarlo a utilizar una configuración de traducción diferente. Acabo de hacer esto para elegir entre "inglés" (EE. UU.) Y "en_GB" (inglés británico).

En el archivo main.m, alterar para que se vea como algo más abajo (poner en sus propias pruebas para NZ o AU)

int main(int argc, char *argv[]) { 
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 

// Set up the locale jiggery pokery 
NSString *language = [[NSLocale preferredLanguages] objectAtIndex:0]; 
NSString *locale = [[NSLocale currentLocale] objectForKey: NSLocaleCountryCode]; 
if ([language isEqualToString:@"en"] && [locale isEqualToString:@"GB"]) { 
    [[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"en_GB", @"en", nil] forKey:@"AppleLanguages"]; 
} 

int retVal = UIApplicationMain(argc, argv, nil, nil); 
[pool release]; 
return retVal; 

}

Esto hace aparecer el idioma usuarios (por ejemplo " en ") en el lenguaje NSString y la configuración regional de los usuarios (p. ej., NZ, GB, AU) en la configuración regional NSString. Si ellos (en mi caso) coinciden en en y GB, entonces establezco las configuraciones de preferencia de idioma del usuario para que sean "en_GB", luego "en".

Luego, en su aplicación a los delegados de aplicación: Método didFinishLaunchingWithOptions que desea eliminar que NSUserDefaults ajuste que acaba de establecer con el código

[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"AppleLanguages"]; 

Es seguro retirar en este momento porque toda la inicialización paquete se ha completado. Su aplicación ahora debería usar un archivo Localization.strings dentro del directorio en_GB.lproj.

Es una solución horrible, hacky, pero me funciona.

+0

funciona para usted , funciona para mí ... ¡simplemente funciona! ¡increíble gracias! – dewberry

+0

Gracias por esta respuesta. Realmente me ayudó aquí para resolver mis problemas. – AppAspect

+0

Gracias por NSString * language = [[NSLocale preferredLanguages] objectAtIndex: 0]; – CReaTuS

4

Apple documents this missing iOS feature here.

Importante: En iOS, las interfaces paquete no toman dialecto o escritura de información en cuenta cuando en busca de recursos localizados; solo se considera el código de designación de idioma como . Por lo tanto, si su proyecto incluye directorios de proyectos específicos del idioma con un lenguaje y un designador de región , esos directorios se ignoran. Las interfaces del paquete en Mac OS X no son compatibles con los designadores de región en los directorios de proyectos específicos del idioma .

14

He llegado a lo que creo que es una versión ligeramente mejorada de la respuesta aceptada de rickerbh. Lo primero es darse cuenta de que los valores predeterminados del usuario están organizados en dominios, y la clave @"AppleLanguages" no proviene del dominio de la aplicación, sino de algún dominio más arriba de la jerarquía de dominios.Esto significa que es completamente seguro para eliminarlo de valores predeterminados del usuario:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
[defaults removeObjectForKey:@"AppleLanguages"]; 

Después de llamar a este código, usted notará que llamar [defaults objectForKey:@"AppleLanguages"] sigue devolviendo un valor. Por lo tanto, en lugar de eliminar @"AppleLanguages" en algún momento posterior, lo que podría ser problemático según la complejidad de su aplicación, debe hacer lo contrario: eliminar @"AppleLanguages" inmediatamente. Esencialmente, esto lo restablece a su valor predeterminado y captura cualquier cambio que el sistema haya realizado, si, por ejemplo, el usuario ha cambiado su idioma preferido.

Aquí es lo que hago:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
[defaults removeObjectForKey:@"AppleLanguages"]; 

NSMutableArray *appleLanguages = [[defaults objectForKey:@"AppleLanguages"] mutableCopy]; 
NSString *region = [[NSLocale currentLocale] objectForKey:NSLocaleCountryCode]; 
NSArray *languages = [appleLanguages filteredArrayUsingPredicateFormat:@"not (self contains '-')"]; 
for (NSString *language in languages) { 
    NSString *languageAndRegion = [NSString stringWithFormat:@"%@-%@", language, region]; 
    [appleLanguages removeObject:languageAndRegion]; 
} 
for (NSString *language in languages) { 
    NSString *languageAndRegion = [NSString stringWithFormat:@"%@-%@", language, region]; 
    NSInteger index = [appleLanguages indexOfObject:language]; 
    [appleLanguages insertObject:languageAndRegion atIndex:index]; 
} 
[defaults setObject:appleLanguages forKey:@"AppleLanguages"]; 

(. Tenga en cuenta que filteredArrayUsingPredicateFormat: es un método de extensión que escribí No es ciencia espacial para averiguar lo que hace o cómo funciona.)

Esto crea localizaciones para cada idioma de la lista combinado con la región del usuario. Por ejemplo, si la lista original era es en en-GB y la región del usuario es AU, obtendremos es-AU es en-AU en en-GB. Tenga en cuenta que es-AU no existe, pero no hace ninguna diferencia. Como la aplicación no encuentra localizaciones o recursos asociados, simplemente lo ignora.

+1

Con ios 8.1 esta es la solución. – Mike

+0

Esto se ve sólido. Una cosa para agregar, @selector (filteredArrayUsingPredicateFormat :) es un método de categoría en NSArray que puedes encontrar aquí: https://github.com/huguesbr/library-ios/blob/master/Categories/NSArray%2BFilteredSortedShortcuts.m –

+0

También , ¿dónde pones esto en tu código: en la aplicación delegada o en tu función "principal"? –

0

Tuve los mismos problemas con el alemán y creo que encontré la solución "correcta". El error fue que originalmente mi idioma base era solo "alemán (de)", al agregar localizaciones "alemán/austriaco (de_AT)", los archivos fueron ignorados. Al cambiar el idioma base a "alemán/Alemania (de_DE)", las traducciones austríacas no se ignoraron.

0

Merece la pena señalar que XCode es muy engañoso: puede ir a Project (not Target), Info, Localizations, presionar el botón + que aparece debajo de la lista de idiomas, luego desplácese hasta la parte inferior de la lista de idiomas que aparecen en la ventana emergente hasta llegar a "Otro" (con la flecha derecha al lado), esto abrirá una gran lista que incluye variantes regionales para los idiomas. Sin embargo, estas variantes regionales no funcionan en el iPhone; no obtienes nada (como documenta Apple y se menciona en otra respuesta que aparece aquí). Evidentemente, una de las soluciones basadas en código enumeradas anteriormente es necesaria.

Cuestiones relacionadas