Pregunta NSLocale currentLocale siempre devuelve "en_US", no el idioma actual del usuario


Estoy en los procesos de internacionalización de una aplicación para iPhone: necesito realizar cambios programáticos en ciertas vistas en función de la configuración regional actual del usuario. Me estoy volviendo loco porque no importa cuál sea la preferencia de idioma en el simulador de iPhone o el hardware real, locale siempre evalúa a "en_US":

NSString *locale = [[NSLocale currentLocale] localeIdentifier];
NSLog(@"current locale: %@", locale);

Lo loco es que el resto de la aplicación se comporta como se esperaba. Las cadenas correctas se seleccionan del archivo Localization.strings y se utilizan en la interfaz, y se utilizan los archivos .xib correctos para la configuración regional seleccionada.

También he intentado lo siguiente, sin éxito y con el mismo resultado:

NSString *locale = [[NSLocale autoupdatingCurrentLocale] localeIdentifier];
NSLog(@"current locale: %@", locale);

¿Hay algo simple que me estoy perdiendo? Una preferencia o una importación tal vez?

Lo que solía hacer:

Como sugiere la respuesta de Darren, la preferencia que estoy buscando no está en NSLocale, más bien está aquí:

NSUserDefaults* userDefaults = [NSUserDefaults standardUserDefaults];
NSArray* languages = [userDefaults objectForKey:@"AppleLanguages"];
NSString* preferredLanguage = [languages objectAtIndex:0];
NSLog(@"preferredLanguage: %@", preferredLang);

La respuesta de Pedro parece ser una mejor solución:

NSArray* preferredLanguages = [NSLocale preferredLanguages];
NSLog(@"preferredLanguages: %@", preferredLanguages);

74
2017-10-05 20:28


origen


Respuestas:


En lugar de consultar los valores predeterminados directamente con una clave no documentada, pregunta al NSLocale clase para la variedad de idiomas preferidos.


34
2018-03-29 04:10



[NSLocale currentLocale] se basa en la configuración de formato de región del dispositivo, no en el idioma. Si la región está configurada en Estados Unidos, recibirá en_US independientemente del idioma que esté utilizando.


55
2017-10-05 21:55



Para obtener el idioma actual del dispositivo, use esto en su lugar:

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

Como se describe aquí: Obtener el idioma actual del dispositivo en iOS?


13
2018-03-07 14:26



para mí, ambos

NSString *localeString = [[NSLocale currentLocale] localeIdentifier];

y

NSArray *array = [NSLocale preferredLanguages];
self.label.text = array[0];

produce el mismo resultado cuando estás en un simulador.


4
2017-11-18 20:48



Descubrí que si dejo "en_US", pero tengo una localización "en" que es una copia de "en_US", el simulador comienza automágicamente a respetar la configuración de idioma, pero tan pronto como "en_US" es una opción, siempre lo elige independientemente de la configuración.


2
2018-01-11 17:24



Tuve un problema donde los nombres de los meses de formato salieron en inglés en un dispositivo configurado en francés.

Mi solución fue usar esto:

    NSLocale *locale = [NSLocale localeWithLocaleIdentifier:[[NSLocale preferredLanguages] objectAtIndex:0] ];
    [self.monthNameFormatter setLocale:locale];
    [self.monthNameFormatter setDateFormat:@"MMMM"];
    [self.monthNameFormatter stringFromDate:myDate];

2
2018-03-13 16:17



Para nosotros, el problema era que anulamos el idioma de la aplicación y la región de aplicación en nuestro esquema de desarrollo. Asegúrese de que el Idioma de la aplicación esté configurado en Idioma del sistema en las opciones del esquema (Editar esquema -> Opciones).


2
2018-05-22 11:08