plus - Localización de aplicaciones de iPhone-¿Problemas de inglés?
problemas ios 11 iphone 6 (5)
Cabe destacar que XCode es muy engañoso: puede ir a Proyecto (no Destino), Información, Localizaciones, presione el botón + que aparece debajo de la lista de idiomas, luego desplácese hacia abajo hasta el final de la lista de idiomas que aparecen en la hasta que llegue a "Otro" (con la flecha derecha al lado), se abrirá una lista grande y bonita que incluye variantes regionales para los idiomas. Sin embargo, estas variantes regionales no funcionan en el iPhone; no obtiene nada (tal como lo documenta Apple y se menciona en otra respuesta que aparece aquí). Evidentemente, una de las soluciones basadas en código enumeradas anteriormente es necesaria.
Tengo una aplicación que estoy traduciendo a un montón de idiomas diferentes. El problema es que la aplicación tendrá unos valores diferentes en Australia que los de Nueva Zelanda, que son países de habla inglesa.
He creado un archivo de idioma en_AU y un idioma en_NZ, pero ambos están usando el archivo de inglés estándar. He eliminado el archivo de idioma inglés, pero sigue ocurriendo ...
¿Alguna idea sobre cómo puedo hacer que esto funcione?
Gracias,
--re
Las localizaciones de iPhone (¿o es que las localizaciones?) no hacen ninguna notificación de la Región que el usuario establece (es decir, Reino Unido, Aus, NZ). Solo hay una traducción de "inglés" disponible de forma predeterminada. Sin embargo, puede hackear con cosas para forzarlo a usar 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 su archivo main.m, modifíquelo para que se vea como a continuación (ponga 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 coloca el idioma de los usuarios (por ejemplo, "en") en el idioma NSString, y la configuración regional de los usuarios (por ejemplo, NZ, GB, AU) en la ubicación NSString. Si (en mi caso) coinciden con y GB, entonces configuro la configuración de preferencia de idioma predeterminada de los usuarios como "en_GB", luego "en".
Luego, en la aplicación de la aplicación de delegados: método didFinishLaunchingWithOptions que desea eliminar la configuración de NSUserDefaults que acaba de establecer con el código
[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"AppleLanguages"];
Es seguro eliminarlo en este momento porque se ha completado toda la inicialización del paquete. Su aplicación ahora debe usar un archivo Localization.strings dentro del directorio en_GB.lproj.
Es una solución un tanto horrible y pirata, pero funciona para mí.
Se me ocurrió lo que creo que es una versión ligeramente mejorada de la respuesta aceptada de rickerbh. Lo primero que debe darse cuenta es que los valores predeterminados de los usuarios 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 en la jerarquía de dominios. Esto significa que es completamente seguro eliminarlo de los valores predeterminados del usuario:
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults removeObjectForKey:@"AppleLanguages"];
Después de llamar a este código, notará que la llamada [defaults objectForKey:@"AppleLanguages"]
aún devuelve un valor. Entonces, en lugar de eliminar @"AppleLanguages"
en algún momento posterior, lo que podría ser problemático dependiendo de la complejidad de su aplicación, quiere hacer lo contrario: eliminar @"AppleLanguages"
inmediatamente . Esencialmente, esto lo restablece a su valor predeterminado y captura cualquier cambio que haya realizado el sistema, si, por ejemplo, el usuario ha cambiado su idioma preferido.
Esto 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 una ciencia de cohetes para averiguar qué hace o cómo funciona).
Esto crea localizaciones para cada idioma en la lista combinada 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 la ignora.
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 / Austria (de_AT)", los archivos se ignoraron. Al cambiar el idioma base a "Alemán / Alemania (de_DE)" las traducciones austriacas no fueron ignoradas.
Apple documenta esta característica de iOS que falta aquí.
Importante: en iOS, las interfaces del paquete no tienen en cuenta la información de dialectos o secuencias de comandos cuando se buscan recursos localizados; solo se considera el código del designador de idioma. Por lo tanto, si su proyecto incluye directorios de proyectos específicos del idioma con un designador de idioma y región, esos directorios se ignoran. Las interfaces de paquete en Mac OS X sí admiten los designadores de región en directorios de proyectos específicos del idioma.