para - ios 9
¿Obteniendo el idioma actual del dispositivo en iOS? (28)
Me gustaría mostrar el idioma actual que usa la interfaz de usuario del dispositivo. ¿Qué código usaría?
Quiero esto como una NSString
en un formato completamente detallado. (No @ "en_US")
EDITAR: Para aquellos que conducen, hay un montón de comentarios útiles aquí, ya que la respuesta ha evolucionado con las nuevas versiones de iOS.
Rápido
Para obtener el idioma actual del dispositivo.
NSLocale.preferredLanguages()[0] as String
Para obtener el idioma de la aplicación
NSBundle.mainBundle().preferredLocalizations[0] as NSString
Nota:
Obtiene el lenguaje que has dado en CFBundleDevelopmentRegion of info.plist
si CFBundleAllowMixedLocalizations se cumple en info.plist, se devuelve el primer elemento de CFBundleLocalizations en info.plist
A partir de iOS 9, si solo desea el código de idioma sin código de país, querrá este tipo de función de ayuda, ya que el idioma contendrá el código de país.
// gets the language code without country code in uppercase format, i.e. EN or DE
NSString* GetLanguageCode()
{
static dispatch_once_t onceToken;
static NSString* lang;
dispatch_once(&onceToken, ^
{
lang = [[[NSLocale preferredLanguages] objectAtIndex:0] uppercaseString];
NSRegularExpression* regex = [NSRegularExpression regularExpressionWithPattern:@"^[A-Za-z]+" options:0 error:nil];
NSTextCheckingResult* match = [regex firstMatchInString:lang options:0 range:NSMakeRange(0, lang.length)];
if (match.range.location != NSNotFound)
{
lang = [lang substringToIndex:match.range.length];
}
});
return lang;
}
El aceptado, y las otras respuestas, no tienen en cuenta que el idioma preferido puede ser otro idioma que el idioma del dispositivo .
El idioma del dispositivo es el idioma en el que se presentan los elementos del sistema operativo y las aplicaciones de Apple.
El idioma preferido es el idioma en el que el usuario desea que se localicen las aplicaciones. Apple solo proporciona un conjunto limitado de traducciones. Si el idioma preferido es un idioma al que Apple tradujo sus aplicaciones, también será el idioma del dispositivo. Sin embargo, si el usuario prefiere un idioma para el cual Apple no proporciona traducciones, el dispositivo y los idiomas preferidos no coincidirán . El idioma del dispositivo no estará en la primera posición en la lista de idiomas preferidos.
La siguiente función recorrerá la lista de idiomas preferidos y verificará si hay una traducción en los marcos de Apple. El primer idioma para tener una traducción es el idioma del dispositivo. La función devolverá su código de idioma.
func deviceLanguage() -> String? {
let systemBundle: NSBundle = NSBundle(forClass: UIView.self)
let englishLocale: NSLocale = NSLocale(localeIdentifier: "en")
let preferredLanguages: [String] = NSLocale.preferredLanguages()
for language: String in preferredLanguages {
let languageComponents: [String : String] = NSLocale.componentsFromLocaleIdentifier(language)
guard let languageCode: String = languageComponents[NSLocaleLanguageCode] else {
continue
}
// ex: es_MX.lproj, zh_CN.lproj
if let countryCode: String = languageComponents[NSLocaleCountryCode] {
if systemBundle.pathForResource("/(languageCode)_/(countryCode)", ofType: "lproj") != nil {
// returns language and country code because it appears that the actual language is coded within the country code aswell
// for example: zh_CN probably mandarin, zh_HK probably cantonese
return language
}
}
// ex: English.lproj, German.lproj
if let languageName: String = englishLocale.displayNameForKey(NSLocaleIdentifier, value: languageCode) {
if systemBundle.pathForResource(languageName, ofType: "lproj") != nil {
return languageCode
}
}
// ex: pt.lproj, hu.lproj
if systemBundle.pathForResource(languageCode, ofType: "lproj") != nil {
return languageCode
}
}
return nil
}
Esto funciona si la lista de idiomas preferidos es:
- Afrikaans (iOS no está traducido al Afrikaans)
- Español (idioma del dispositivo)
La lista de idiomas preferidos se puede editar en : Settings.app -> General -> Idioma y región -> Orden de idioma preferido
Puede utilizar el código de idioma del dispositivo y traducirlo al nombre del idioma. Las siguientes líneas imprimirán el idioma del dispositivo en el idioma del dispositivo. Por ejemplo, "Español" si el dispositivo está configurado en español.
if let deviceLanguageCode: String = deviceLanguage() {
let printOutputLanguageCode: String = deviceLanguageCode
let printOutputLocale: NSLocale = NSLocale(localeIdentifier: printOutputLanguageCode)
if let deviceLanguageName: String = printOutputLocale.displayNameForKey(NSLocaleIdentifier, value: deviceLanguageCode) {
// keep in mind that for some localizations this will print a language and a country
// see deviceLanguage() implementation above
print(deviceLanguageName)
}
}
En Swift
:
let languageCode = NSLocale.currentLocale().objectForKey(NSLocaleLanguageCode) as? String
Esto probablemente te dará lo que quieres:
NSLocale *locale = [NSLocale currentLocale];
NSString *language = [locale displayNameForKey:NSLocaleIdentifier
value:[locale localeIdentifier]];
Mostrará el nombre del idioma, en el mismo idioma. Por ejemplo:
Français (France)
English (United States)
Formato de dos letras. Apple utiliza la norma ISO ISO-3166 .
NSString *localeCountryCode = [[NSLocale autoupdatingCurrentLocale] objectForKey:NSLocaleCountryCode];
Función Swift 3 simple:
@discardableResult
func getLanguageISO() -> String {
let locale = Locale.current
guard let languageCode = locale.languageCode,
let regionCode = locale.regionCode else {
return "de_DE"
}
return languageCode + "_" + regionCode
}
Incluso hay una mejor manera de obtener el idioma actual del dispositivo. Probémoslo por el siguiente código:
NSLog(@"Current Language - %@", [[NSLocale preferredLanguages] firstObject]);
Sugerido por Abizern here
La respuesta seleccionada devuelve el idioma actual del dispositivo, pero no el idioma real utilizado en la aplicación. Si no proporciona una localización en su aplicación para el idioma preferido del usuario, se utiliza la primera localización disponible, ordenada por el orden preferido del usuario.
Para descubrir el idioma actual seleccionado dentro de sus localizaciones use
[[NSBundle mainBundle] preferredLocalizations];
Ejemplo:
NSString *language = [[[NSBundle mainBundle] preferredLocalizations] objectAtIndex:0];
Rápido:
let language = NSBundle.mainBundle().preferredLocalizations.first as NSString
La traducción de códigos de idioma como en_US al inglés (Estados Unidos) es una función incorporada de NSLocale
y a NSLocale
no le importa de dónde obtiene los códigos de idioma. Así que realmente no hay razón para implementar su propia traducción como sugiere la respuesta aceptada.
// Example code - try changing the language codes and see what happens
NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en"];
NSString *l1 = [locale displayNameForKey:NSLocaleIdentifier value:@"en"];
NSString *l2 = [locale displayNameForKey:NSLocaleIdentifier value:@"de"];
NSString *l3 = [locale displayNameForKey:NSLocaleIdentifier value:@"sv"];
NSLog(@"%@, %@, %@", l1, l2, l3);
Estampas: inglés, alemán, sueco.
Las soluciones proporcionadas devolverán realmente la región actual del dispositivo, no el idioma seleccionado actualmente. Estos son a menudo uno y el mismo. Sin embargo, si estoy en América del Norte y establezco mi idioma en japonés, mi región seguirá siendo el inglés (Estados Unidos). Para recuperar el idioma seleccionado actualmente, puedes hacer:
NSString * language = [[NSLocale preferredLanguages] firstObject];
Esto devolverá un código de dos letras para el idioma seleccionado actualmente. "en" para inglés, "es" para español, "de" para alemán, etc. Para más ejemplos, consulte esta entrada de Wikipedia (en particular, la columna 639-1):
Lista de los códigos ISO 639-1
Entonces es una simple cuestión de convertir los dos códigos de letras a la cadena que le gustaría mostrar. Así que si es "en", muestra "inglés".
Espero que esto ayude a alguien que busca diferenciar entre la región y el idioma seleccionado actualmente.
EDITAR
Vale la pena citar la información del encabezado de NSLocale.h:
+ (NSArray *)preferredLanguages NS_AVAILABLE(10_5, 2_0); // note that this list does not indicate what language the app is actually running in; the [NSBundle mainBundle] object determines that at launch and knows that information
Las personas interesadas en el lenguaje de la aplicación pueden ver la respuesta de @ mindvision
Obviamente, las soluciones que confían, por ejemplo, en
[[NSLocale preferredLanguages] objectAtIndex:0]
Generalmente funciona bien y devuelve el idioma actual del dispositivo.
Pero podría ser engañoso en algunos casos:
Si la aplicación en la que desea obtener este valor ya ha cambiado el idioma, por ejemplo con este tipo de código:
NSString *lg = @"en"; // or anything like @"en", @"fr", etc.
[[NSUserDefaults standardUserDefaults]
setObject:[NSArray arrayWithObjects:lg, nil]
forKey:@"AppleLanguages"]
En este caso, [NSLocale preferredLanguages] en realidad devuelve el conjunto de idioma preferido (y utilizado) en esta aplicación en particular, ¡no en el idioma actual del dispositivo!
Y ... en este caso, la única forma de obtener correctamente el idioma actual del dispositivo (y no el establecido previamente en la aplicación), es en primer lugar borrar la clave @ "appleLanguages" en NSUserDefaults, como esto:
[[NSUserDefaults standardUserDefaults]removeObjectForKey:@"AppleLanguages"];
Entonces, [NSLocale preferredLanguages] ahora devuelve el valor correcto.
Espero que esto ayude.
Para Swift 3.0, debajo del código puede usarse para responder a su pregunta:
let language = Bundle.main.preferredLocalizations.first! as NSString
Para Swift 3:
NSLocale.preferredLanguages [0] como cadena
Para los desarrolladores de MonoTouch C # use:
NSLocale.PreferredLanguages.FirstOrDefault() ?? "en"
Nota: Sé que esta era una pregunta de iOS, pero como soy un desarrollador de MonoTouch, la respuesta en esta página me llevó en la dirección correcta y pensé que compartiría los resultados.
Para obtener el idioma actual del dispositivo del usuario, use el siguiente código que funcionó para mí.
NSString * myString = [[NSLocale preferredlanguage]objectAtIndex:0];
Puedes usar el método displayNameForKey:value:
de NSLocale
:
// get a French locale instance
NSLocale *frLocale = [[[NSLocale alloc] initWithLocaleIdentifier:@"fr_FR"] autorelease];
// use it to get translated display names of fr_FR and en_US
NSLog(@"%@", [frLocale displayNameForKey:NSLocaleIdentifier value:@"fr_FR"]);
NSLog(@"%@", [frLocale displayNameForKey:NSLocaleIdentifier value:@"en_US"]);
Esto imprimirá:
français (France)
anglais (États-Unis)
Si especifica el mismo identificador de configuración regional para initWithLocaleIdentifier:
y también el método displayNameForKey:value:
le dará el nombre nativo del idioma. Descubrí que si elimina el código de país y usa solo fr
y en
, también omitirá el país del nombre de visualización (al menos en Mac OS X, no estoy seguro sobre iOS).
Respuesta de @amir en Swift:
// Get language prefered by user
let langageRegion = NSLocale.preferredLanguages().first!
let languageDic = NSLocale.componentsFromLocaleIdentifier(langageRegion)
let language = languageDic[NSLocaleLanguageCode]
SWIFT-4
// To get device default selected language. It will print like short name of zone. For english, en or spain, es.
let language = Bundle.main.preferredLocalizations.first! as NSString
print("device language",language)
Según la documentation Apple.
NSUserDefaults* defs = [NSUserDefaults standardUserDefaults];
NSArray* languages = [defs objectForKey:@"AppleLanguages"];
NSString* preferredLang = [languages objectAtIndex:0];
Si busca el código de idioma preferido ("en", "de", "es" ...) y el nombre de idioma preferido localizado (para la ubicación actual), aquí hay una extensión simple en Swift:
extension Locale {
static var preferredLanguageIdentifier: String {
let id = Locale.preferredLanguages.first!
let comps = Locale.components(fromIdentifier: id)
return comps.values.first!
}
static var preferredLanguageLocalizedString: String {
let id = Locale.preferredLanguages.first!
return Locale.current.localizedString(forLanguageCode: id)!
}
}
Si quieres obtener solo el idioma aquí es mi respuesta sugerida:
NSString *langplusreg = [[NSLocale preferredLanguages] objectAtIndex:0];
NSString * langonly = [[langplusreg componentsSeparatedByString:@"-"]
objectAtIndex:0];
En mi caso, solo quería el idioma Locale, no la región regional.
Salida: Si el idioma de tu Locale es japonés y la región del locale es Japón, entonces:
langplusreg = ja-JP
langonly = ja
Traté de encontrar la solución correcta para mí. Cuando uso Locale.preferredLanguages.first
se me devolvió el idioma preferido de la configuración de la aplicación.
Si desea conocer el idioma de la configuración del dispositivo del usuario, debe utilizar la siguiente cadena:
Swift 3
let currentDeviceLanguage = Locale.current.languageCode
// Will return the optional String
Para desenvolver y usar mira la siguiente línea:
if let currentDeviceLanguage = Locale.current.languageCode {
print("currentLanguage", currentDeviceLanguage)
// For example
if currentDeviceLanguage == "he" {
UIView.appearance().semanticContentAttribute = .forceRightToLeft
} else {
UIView.appearance().semanticContentAttribute = .forceLeftToRight
}
}
yo uso esto
NSArray *arr = [NSLocale preferredLanguages];
for (NSString *lan in arr) {
NSLog(@"%@: %@ %@",lan, [NSLocale canonicalLanguageIdentifierFromString:lan], [[[NSLocale alloc] initWithLocaleIdentifier:lan] displayNameForKey:NSLocaleIdentifier value:lan]);
}
ignorar la pérdida de memoria ..
y el resultado es
2013-03-02 20:01:57.457 xx[12334:907] zh-Hans: zh-Hans 中文(简体中文)
2013-03-02 20:01:57.460 xx[12334:907] en: en English
2013-03-02 20:01:57.462 xx[12334:907] ja: ja 日本語
2013-03-02 20:01:57.465 xx[12334:907] fr: fr français
2013-03-02 20:01:57.468 xx[12334:907] de: de Deutsch
2013-03-02 20:01:57.472 xx[12334:907] nl: nl Nederlands
2013-03-02 20:01:57.477 xx[12334:907] it: it italiano
2013-03-02 20:01:57.481 xx[12334:907] es: es español
Respuesta actualizada para Swift 4
let language = Bundle.main.preferredLocalizations.first
Solución para iOS 9:
NSString *language = [[NSLocale preferredLanguages] objectAtIndex:0];
language = "en-US"
NSDictionary *languageDic = [NSLocale componentsFromLocaleIdentifier:language];
languageDic tendrá los componentes necesarios
NSString *countryCode = [languageDic objectForKey:@"kCFLocaleCountryCodeKey"];
countryCode = "US"
NSString *languageCode = [languageDic objectForKey:@"kCFLocaleLanguageCodeKey"];
languageCode = "en"
Swift 3
let locale = Locale.current
let code = (locale as NSLocale).object(forKey: NSLocale.Key.countryCode) as! String?
print(code!)
-(NSString *)returnPreferredLanguage { //as written text
NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults];
NSArray *preferredLanguages = [defaults objectForKey:@"AppleLanguages"];
NSString *preferredLanguageCode = [preferredLanguages objectAtIndex:0]; //preferred device language code
NSLocale *enLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en"]; //language name will be in English (or whatever)
NSString *languageName = [enLocale displayNameForKey:NSLocaleIdentifier value:preferredLanguageCode]; //name of language, eg. "French"
return languageName;
}