una traducir ingles idioma español como chino cambiar app aplicaciones aplicacion ios xcode4 localization

traducir - ¿Por qué mi aplicación iOS solo detecta correctamente el idioma actual en la primera ejecución?



como cambiar el idioma en snapchat android (5)

Estoy localizando mi aplicación iOS, y en el simulador se ejecuta correctamente en el idioma que he elegido cada vez.

Al realizar pruebas en mi iPhone 5, solo detecta el idioma correctamente la primera vez que se ejecuta la aplicación. Cada vez que compilo y ejecuto mi aplicación en el dispositivo, detecta "en" como idioma, aunque estoy probando con Español ("es") seleccionado.

Detecto el lenguaje usando:

[[[NSBundle mainBundle] preferredLocalizations] objectAtIndex:0]

También he usado:

[[NSLocale preferredLanguages] objectAtIndex:0]

Mismo resultado

Si elimino la aplicación después de la primera ejecución y la reinicio en el dispositivo, seguirá detectando el idioma correctamente.

Pero si mato la aplicación y luego compilo / reinicio a través de Xcode después de la ejecución inicial, se cargará con "en" (inglés) detectado.

Después de eso, matar y reiniciar la aplicación se detecta continuamente en inglés a menos que elimine la aplicación por completo, y vuelva a compilar / reinstalar / ejecutar la aplicación a través de Xcode. El ciclo luego se repite ... la reconstrucción / reinicio posterior sin eliminar primero la aplicación del dispositivo da como resultado una detección errónea.

Todas las demás aplicaciones en mi dispositivo se muestran en idioma español todo el tiempo. Toda la interfaz de usuario se muestra en español.

ACTUALIZACIÓN: Ahora he probado en mi iPad (tercera generación) que también ejecuta iOS 6 y estoy experimentando el mismo comportamiento.

ACTUALIZACIÓN 2:

En didFinishLaunchingWithOptions, tengo este código para detectar el idioma: (language is a NSString *):

language = [[NSLocale preferredLanguages] objectAtIndex:0];

Seguido por esta declaración de depuración, para comparar el valor que estoy obteniendo, así como una forma ligeramente diferente de detectarla, solo para la depuración:

NSLog(@"Detected language: %@ / %@", language, [[[NSBundle mainBundle] preferredLocalizations] objectAtIndex:0]);

La salida se muestra como "Idioma detectado: es / es" cuando la aplicación funciona correctamente en el modo español, y luego se muestra como "Idioma detectado: en / en" cuando no funciona. Todavía no tengo idea de por qué decide cargar como inglés a veces ...

ACTUALIZACIÓN 4: Aprecio las respuestas de todos, y he intentado varias sugerencias. Desafortunadamente, no pude otorgar la recompensa de +100 ya que ninguna de las sugerencias pareció solucionar el problema. Si alguien finalmente encuentra una solución que funcione para mí, le otorgaré otra recompensa de +50 en ese momento.

ACTUALIZACIÓN 5: He actualizado de Xcode 4.5 a 4.5.2, y estoy experimentando este mismo problema.

ACTUALIZACIÓN 6: ¡Ahora he creado un nuevo proyecto de prueba desde cero, y funciona perfectamente bien! Obviamente, algo debe estar mal en la forma en que se presenta mi proyecto, o tal vez en uno de los archivos de datos. Supongo que mi próximo viaje será volver a crear el proyecto desde cero, copiando los datos del archivo uno por uno ...

ACTUALIZACIÓN 7 (MESES DESPUÉS): Lamentablemente, de nuevo me enfrento a este problema después de resolverlo temporalmente (aparentemente) al recrear minuciosamente mi proyecto. En la primera carga, el idioma se representa correctamente, pero en las cargas subsiguientes, vuelve al inglés.

RESUELTO Ver mi solución final a below . Gracias por la ayuda a todos. Puedo repartir algunas de las recompensas ya que de todos modos se desperdiciará.


¿Utiliza por casualidad NSUserDefaults para guardar algo relacionado con el idioma?

Busque en su directorio de la aplicación del simulador -> Biblioteca -> Preferencias -> <YourAppBundleName>.plist

Consulte: Cómo forzar a NSLocalizedString a usar un idioma específico para la descripción del método NSUserDefaults para configurar un idioma.

Quizás solo guardas tu idioma y, por lo tanto, la detección simplemente devuelve el valor guardado.


En configuración-> general-> internacional, hay una opción para configurar el idioma de la ubicación, etc. Si lo establece en el idioma que está intentando probar, funcionará si su código es correcto.


Intenta con el siguiente código:

LocalizationSystem.h ===

#import <Foundation/Foundation.h> #define AMLocalizedString(key, comment) / [[LocalizationSystem sharedLocalSystem] localizedStringForKey:(key) value:(comment)] #define LocalizationSetLanguage(language) / [[LocalizationSystem sharedLocalSystem] setLanguage:(language)] #define LocalizationGetLanguage / [[LocalizationSystem sharedLocalSystem] getLanguage] #define LocalizationReset / [[LocalizationSystem sharedLocalSystem] resetLocalization] @interface LocalizationSystem : NSObject { NSString *language; } + (LocalizationSystem *)sharedLocalSystem; //gets the string localized - (NSString *)localizedStringForKey:(NSString *)key value:(NSString *)comment; //sets the language - (void) setLanguage:(NSString*) language; //gets the current language - (NSString*) getLanguage; //resets this system. - (void) resetLocalization; @end

Sistema de localización.m ===

#import "LocalizationSystem.h" @implementation LocalizationSystem //Singleton instance static LocalizationSystem *_sharedLocalSystem = nil; //Current application bundle to get the languages. static NSBundle *bundle = nil; + (LocalizationSystem *)sharedLocalSystem{ @synchronized([LocalizationSystem class]) { if (!_sharedLocalSystem){ [[self alloc] init]; } return _sharedLocalSystem; } // to avoid compiler warning return nil; } +(id)alloc{ @synchronized([LocalizationSystem class]) { NSAssert(_sharedLocalSystem == nil, @"Attempted to allocate a second instance of a singleton."); _sharedLocalSystem = [super alloc]; return _sharedLocalSystem; } // to avoid compiler warning return nil; } - (id)init{ if ((self = [super init])) { //empty. bundle = [NSBundle mainBundle]; } return self; } // Gets the current localized string as in NSLocalizedString. - (NSString *)localizedStringForKey:(NSString *)key value:(NSString *)comment{ return [bundle localizedStringForKey:key value:comment table:nil]; } // If this function is not called it will use the default OS language. // If the language does not exists y returns the default OS language. - (void) setLanguage:(NSString*) l{ NSLog(@"preferredLang: %@", l); NSString *path = [[ NSBundle mainBundle ] pathForResource:l ofType:@"lproj" ]; if (path == nil) //in case the language does not exists [self resetLocalization]; else bundle = [[NSBundle bundleWithPath:path] retain]; [[NSUserDefaults standardUserDefaults] setObject: [NSArray arrayWithObjects:l, nil] forKey:@"AppleLanguages"]; } // Just gets the current setted up language. // returns "es","fr",... // // example call: // NSString * currentL = LocalizationGetLanguage; - (NSString*) getLanguage{ NSArray* languages = [[NSUserDefaults standardUserDefaults] objectForKey:@"AppleLanguages"]; NSString *preferredLang = [languages objectAtIndex:0]; return preferredLang; } // Resets the localization system, so it uses the OS default language. // // example call: // LocalizationReset; - (void) resetLocalization{ bundle = [NSBundle mainBundle]; } @end

Este código funciona perfectamente como usted mencionó. Funcionó para mí y ese juego está en vivo ahora en la tienda de aplicaciones, si quieres comprobarlo (HueShapes).


Probé tus pasos en mi iPhone 5 sin problemas. Esto me lleva a pensar que hay algo más en juego aquí: lo más probable es que haya algo que interfiera con la forma en que se lee el valor de la configuración regional.

Los pasos que le recomiendo que tome para ayudarlo a solucionar este problema son:

  1. Publique el código completo del método en el que está obteniendo el valor de idioma preferido. Asegúrese de que el método se ejecute cada vez que se ejecute la aplicación.
  2. Asegúrese de que el código que publica incluya la ubicación de la directiva NSLog que está usando para probar la configuración de idioma.
  3. ¿Está almacenando el idioma preferido en otro lugar después de la primera ejecución?

¡Finalmente he resuelto este problema después de muchos meses! Gracias a todos por la ayuda (también tuve un buen intercambio con un desarrollador de Apple a través de los canales de desarrollo).

TL; DR: accidentalmente estaba sincronizando las preferencias de idioma (entre muchas otras cosas inesperadas) entre dispositivos, ¡utilizando el almacén de valores de claves de iCloud de mi aplicación (a través de MKiCloudSync)! Sigue leyendo

Estoy usando una clase de terceros llamada MKiCloudSync, que ayuda a sincronizar [NSUserDefaults standardUserDefaults] con el almacén de valores clave de iCloud de mi aplicación. Mi intención cuando comencé a usarlo era dejar que manejara la sincronización de algunos favoritos del usuario en segundo plano.

Sin embargo, al no entender cómo funcionan los valores de usuario standardUserDefaults , lo que no me di cuenta es que hay muchas otras cosas que se escriben en standardUserDefaults valores de usuario standardUserDefaults aparte de mi propia configuración de aplicación personalizada.

Entonces, lo que estaba pasando era esto:

  1. Inicia la aplicación por primera vez. Los nuevos valores estándar del usuario están en su lugar, y la clave interna "AppleLanguages" que almacena la lista ordenada de preferencias de idioma es correcta según las opciones de dispositivo actuales.

  2. La aplicación se muestra correctamente en el idioma designado.

  3. En el fondo, MKiCloudSync sincroniza TODOS los valores predeterminados del usuario standardUserDefaults a iCloud. A la inversa, si hubiera ejecutado esta aplicación en otro lugar, digamos que con un dispositivo de configuración en inglés, ese dispositivo también habría sincronizado su configuración de idioma hasta iCloud. Así que ahora esta aplicación en ejecución actual tiene sus preferencias de idioma sobrescritas.

  4. BOOM ... la próxima vez que se ejecute la aplicación, independientemente de lo que hayas seleccionado en el dispositivo, ¡lo que se haya bajado de iCloud se utilizará como idioma predeterminado!

Qué planeo hacer para resolver el problema con mi próxima actualización de la aplicación:

  1. Use una versión bifurcada de MKiCloudSync que permita sincronizar solo los nombres de clave en la lista blanca.

  2. Agregue el código que hará una limpieza de una sola vez, primero limpiando el almacén de claves de iCloud para mi aplicación, luego (en función de esta respuesta SO ), llamando a este código para restablecer los valores predeterminados del usuario:

    NSString * appDomain = [[NSBundle mainBundle] bundleIdentifier]; [[NSUserDefaults standardUserDefaults] removePersistentDomainForName: appDomain];

En mis pruebas hasta ahora, este tipo de solución resuelve el problema ... desafortunadamente, el usuario tendría que reiniciar la aplicación para que la corrección de idioma comience a funcionar. Sin embargo, creo que la mayoría de los usuarios no están experimentando este problema, ya que es poco probable para estar utilizando múltiples dispositivos con diferentes idiomas por defecto.