Pregunta

Me gustaría mostrar el idioma actual de que el panel de la máquina está utilizando. ¿Qué código debo utilizar?

Quiero esto como una NSString en formato totalmente explicado. (No @ "en_US")

EDIT:. Para aquellos que conducen encendido cerca, hay un montón de comentarios muy útiles aquí, ya que la respuesta ha evolucionado con nuevos lanzamientos IOS

¿Fue útil?

Solución

Las soluciones aportadas en realidad devolver la región actual del dispositivo - no el idioma seleccionado en ese momento. Estos son a menudo una y la misma. Sin embargo, si estoy en América del Norte y me puse mi lengua al japonés, mi región seguirá siendo Inglés (Estados Unidos). Con el fin de recuperar el idioma actualmente seleccionado, que puede hacer:

NSString * language = [[NSLocale preferredLanguages] firstObject];

Esto devolverá un código de dos letras del idioma seleccionado en ese momento. "En" para Inglés, "es" para español, "es" de España, etc. Para más ejemplos, consulta esta entrada de Wikipedia (en particular, la columna 639-1):

Lista de códigos ISO 639-1

A continuación, se trata de una simple cuestión de la conversión de los códigos de dos letras a la cadena que desea mostrar. Así que si es "en", la pantalla "Inglés".

Espero que esto ayude a alguien que está mirando para diferenciar entre la región y el idioma seleccionado actualmente.

Editar

Vale la pena citar la información de 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 aplicación echar un vistazo a la respuesta @ de MindVision

Otros consejos

La respuesta seleccionada devuelve el idioma del dispositivo actual, pero no el idioma real que se utiliza en la aplicación. Si usted no proporciona una localización en su aplicación para el idioma preferido del usuario, la primera localización disponibles, ordenados por orden de preferencia del usuario, se utiliza.

Para descubrir el idioma actual seleccionado dentro de sus localizaciones utilizar

[[NSBundle mainBundle] preferredLocalizations];

Ejemplo:

NSString *language = [[[NSBundle mainBundle] preferredLocalizations] objectAtIndex:0];

Swift:

let language = NSBundle.mainBundle().preferredLocalizations.first as NSString

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"

Esto probablemente le dará lo que quiere:

NSLocale *locale = [NSLocale currentLocale];

NSString *language = [locale displayNameForKey:NSLocaleIdentifier 
                                         value:[locale localeIdentifier]];

Se mostrará el nombre de la lengua, en el lenguaje mismo. Por ejemplo:

Français (France)
English (United States)

warning El aceptó, y las otras respuestas todos no toman en cuenta que el preferían el lenguaje puede ser otro idioma que no sea el idioma del dispositivo .

La idioma del dispositivo es el idioma en el que se presentan los elementos del sistema operativo y las aplicaciones de Apple.

La idioma preferido es el idioma que el usuario le gustaría tener aplicaciones localizadas en. Apple sólo ofrece un conjunto limitado de traducciones. Si el idioma preferido es un idioma de Apple tradujo sus aplicaciones a, será también el idioma del dispositivo. No obstante si el usuario prefiere un idioma para el que Apple no proporciona traducciones en el dispositivo de idiomas preferidos y no coincidirá . El idioma del dispositivo no estará en primera posición en la lista de idiomas preferidos.

La siguiente función pasará a través de la lista de idiomas preferidos y comprobar si hay una traducción en los marcos de Apple. La primera lengua de tener una traducción es el idioma del dispositivo. La función devolverá el código en lenguaje.

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
}

Estos trabajos si la lista idioma preferido es:

  1. Afrikaans (IOS no se traduce en afrikáans)
  2. español (Idioma de dispositivo)

La lista idioma puede ser Editado : Settings.app -> General -> Idioma y Región -> Idioma preferido de pedido


Puede utilizar el código de idioma del dispositivo y traducirla en el nombre del idioma. Las siguientes líneas se imprimirán el idioma del dispositivo en el idioma del dispositivo. Por ejemplo, "Español" si el dispositivo está ajustado 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)
    }
} 

Yo uso este

    NSArray *arr = [NSLocale preferredLanguages];
for (NSString *lan in arr) {
    NSLog(@"%@: %@ %@",lan, [NSLocale canonicalLanguageIdentifierFromString:lan], [[[NSLocale alloc] initWithLocaleIdentifier:lan] displayNameForKey:NSLocaleIdentifier value:lan]);
}

ignorar 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

La traducción de códigos de idioma, como en_US en Inglés (Estados Unidos) es una función incorporada de NSLocale y NSLocale no le importa donde se obtiene a partir de los códigos de idioma. Así que realmente no hay razón para poner en práctica su propia traducción como la respuesta aceptada sugiere.

// 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);

Las impresiones: Inglés, Alemán, Sueco

Incluso hay una mejor manera de conseguir el idioma del dispositivo actual. Vamos a intentarlo por debajo de código -

NSLog(@"Current Language - %@", [[NSLocale preferredLanguages] firstObject]);

sugerido por Abizern en aquí

Puede utilizar el método de displayNameForKey:value: 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 el initWithLocaleIdentifier: y también el método displayNameForKey:value:, a continuación, se le dará el nombre nativo de la lengua. He descubierto que si se quita el código de país y el uso justo y fr en, que también va a omitir el país a partir del nombre de visualización (en Mac OS X, al menos, no está seguro acerca de iOS).

Me intentó encontrado la solución correcta para mí. Cuando uso Locale.preferredLanguages.first fue devuelto el idioma preferido de la configuración de la aplicación.

Si desea conocer el lenguaje de los ajustes del dispositivo de usuario, si la cadena de uso a continuación:

Swift 3

let currentDeviceLanguage = Locale.current.languageCode
// Will return the optional String

Para Separar y el uso vistazo a la línea de abajo:

if let currentDeviceLanguage = Locale.current.languageCode {
    print("currentLanguage", currentDeviceLanguage)

    // For example
    if currentDeviceLanguage == "he" {
        UIView.appearance().semanticContentAttribute = .forceRightToLeft
    } else {
        UIView.appearance().semanticContentAttribute = .forceLeftToRight
    }
}

Para obtener dispositivo de usuario actual uso del lenguaje el siguiente código que funcionó para mí.

NSString * myString = [[NSLocale preferredlanguage]objectAtIndex:0];

Swift

Para obtener el lenguaje actual del dispositivo

NSLocale.preferredLanguages()[0] as String

Para llegar idioma de la aplicación

NSBundle.mainBundle().preferredLocalizations[0] as NSString

Nota:

Se obtiene el idioma que usted ha dado en CFBundleDevelopmentRegion de info.plist

si CFBundleAllowMixedLocalizations es cierto en info.plist entonces primer elemento de CFBundleLocalizations se devuelve en info.plist

Para MonoTouch desarrolladores de C # utilizan:

NSLocale.PreferredLanguages.FirstOrDefault() ?? "en"

Nota:. Sé que esto era una cuestión de iOS, pero como soy un desarrollador MonoTouch, la respuesta en esta página me llevó en la dirección correcta y yo pensé en compartir los resultados

En Swift:

let languageCode = NSLocale.currentLocale().objectForKey(NSLocaleLanguageCode) as? String

Swift 3

let locale = Locale.current
let code = (locale as NSLocale).object(forKey: NSLocale.Key.countryCode) as! String?
print(code!)

simple función Swift 3:

  @discardableResult
  func getLanguageISO() -> String {
    let locale = Locale.current
    guard let languageCode = locale.languageCode,
          let regionCode = locale.regionCode else {
        return "de_DE"
    }
    return languageCode + "_" + regionCode
  }

Si usted está buscando un código de idioma preferido ( "en", "de", "es" ...), y localizado nombre de idioma preferido (por localización actual), aquí es una simple extensión 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)!
}

}

-(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;

}

Si desea obtener único lenguaje que aquí está mi respuesta sugerida:

NSString *langplusreg = [[NSLocale preferredLanguages] objectAtIndex:0];
NSString * langonly = [[langplusreg componentsSeparatedByString:@"-"] 
objectAtIndex:0];

En mi caso yo sólo quería no sólo el lenguaje Locale región local.

Salida: Si el idioma de configuración regional es japonés y la región local es Japón continuación:

langplusreg = ja-JP

langonly = ja

Respuesta de Actualización de Swift 4

let language = Bundle.main.preferredLocalizations.first

Para Swift 3.0 por debajo de código se puede utilizar para responder a su pregunta:

 let language = Bundle.main.preferredLocalizations.first! as NSString

En Swift 4,2 y Xcode 10.1

let language = NSLocale.preferredLanguages[0]
print(language)//en

De acuerdo con la documentación de Apple

NSUserDefaults* defs = [NSUserDefaults standardUserDefaults];
NSArray* languages = [defs objectForKey:@"AppleLanguages"];
NSString* preferredLang = [languages objectAtIndex:0];

Dos cartas de formato. Apple utiliza el de la norma ISO-3166 .

NSString *localeCountryCode = [[NSLocale autoupdatingCurrentLocale] objectForKey:NSLocaleCountryCode];

respuesta @amir en Swift:

// Get language prefered by user
    let langageRegion = NSLocale.preferredLanguages().first!
    let languageDic = NSLocale.componentsFromLocaleIdentifier(langageRegion)
    let language = languageDic[NSLocaleLanguageCode]

Para Swift 3:

NSLocale.preferredLanguages ??[0] como cadena

A partir de IOS 9, si lo que desea el código de idioma y sin código de país, tendrá que este tipo de función auxiliar -. Ya que el lenguaje 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;
}

Obviamente, las soluciones que dependen, por ejemplo, en

[[NSLocale preferredLanguages] objectAtIndex:0]

por lo general funcionan bien y devolver el idioma del dispositivo actual.

Sin embargo, 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] realidad devuelve el conjunto de idioma preferido (y utilizado) en esta aplicación particular, no el idioma del dispositivo actual!

Y ... en este caso, la única manera de conseguir adecuadamente el idioma del dispositivo de corriente real (y no es que previamente configurado en la aplicación), es eliminar en primer lugar la tecla @ "appleLanguages" en NSUserDefaults, como esto:

[[NSUserDefaults standardUserDefaults]removeObjectForKey:@"AppleLanguages"];

A continuación, [NSLocale preferredLanguages] ahora devuelve el valor correcto.

Espero que esto ayuda.

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)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top