iphone - localize - multi language swift
NSLocale currentLocale siempre devuelve "en_US", no el idioma actual del usuario (9)
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.
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, la locale
siempre se evalúa como "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
, sino que 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);
En lugar de consultar los valores predeterminados directamente utilizando una clave no documentada, solicite a la clase NSLocale la matriz de idiomas preferidos .
La pregunta es demasiado antigua, pero este código puede ayudar a muchos:
El main.m debería verse así:
NSString *localecode=[[NSLocale currentLocale] localeIdentifier];
localecode=[localecode substringToIndex:2]; //en_GB -> en
NSArray *arr = [NSLocale preferredLanguages];
NSMutableArray * mutable = [arr mutableCopy];
NSString *prefered = [mutable firstObject];
if(![localecode isEqualToString:prefered]){
if(![prefered isEqualToString:@"es"] && ![prefered isEqualToString:@"en"] && ![prefered isEqualToString:@"pt"]){
int index = [mutable indexOfObject:@"en"];
[mutable replaceObjectAtIndex:0 withObject:@"en"];
[mutable replaceObjectAtIndex:index withObject:prefered];
[[NSUserDefaults standardUserDefaults] setObject:mutable forKey:@"AppleLanguages"];
}
else{
int index = [mutable indexOfObject:localecode];
[mutable replaceObjectAtIndex:0 withObject:localecode];
[mutable replaceObjectAtIndex:index withObject:prefered];
[[NSUserDefaults standardUserDefaults] setObject:mutable forKey:@"AppleLanguages"];
}
}
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
Que hace esto? Si el idioma actual del dispositivo es español, inglés o portugués, la aplicación utiliza las cadenas localizadas; por otro lado, si el idioma actual no es uno de ellos y la aplicación no lo admite, se configura en inglés.
Muestra la ubicación correcta cuando está en un iPad real. Sin embargo, el simulador tiene su propio iOS, que por defecto está configurado en en-US. Vaya a las preferencias de iOS del simulador y cambie el idioma y la región a la que desee.
Eso hace el truco.
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).
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?
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];
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.
[NSLocale currentLocale]
se basa en la configuración del 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.