Domanda

Mi piacerebbe mostrare la lingua corrente che l'interfaccia utente del dispositivo sta usando. Quale codice dovrei usare?

Voglio questo come un NSString in formato completamente scritto. (Non @ "en_US")

EDIT:. Per chi guida il da, ci sono un sacco di commenti utili qui, come la risposta è evoluta con nuovi iOS release

È stato utile?

Soluzione

Le soluzioni fornite effettivamente restituire l'area corrente del dispositivo - non la lingua selezionata. Questi sono spesso la stessa cosa. Tuttavia, se mi trovo in Nord America e ho impostato la mia lingua giapponese, la mia regione sarà ancora inglese (Stati Uniti). Al fine di recuperare la lingua attualmente selezionata, si può fare:

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

Ciò restituirà un codice di due lettere per la lingua selezionata. "en" per l'inglese, "es" per lo spagnolo, "de" per il tedesco, ecc Per ulteriori esempi, consulta questa voce Wikipedia (in particolare, la colonna 639-1):

Elenco dei codici ISO 639-1

Allora è una semplice questione di convertire i codici a due lettere alla stringa che si desidera visualizzare. Quindi, se è "en", visualizzare "inglese".

Spero che questo aiuti qualcuno che sta cercando di distinguere tra regione e la lingua selezionata.

Modifica

Vale la pena di citare le informazioni di intestazione da 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

Le persone interessate a lingua app dare un'occhiata a @ di MindVision risposta

Altri suggerimenti

La risposta selezionata restituisce la lingua del dispositivo corrente, ma non la lingua effettivamente utilizzato in app. Se non si fornisce una localizzazione nella tua app per la lingua preferita dell'utente, la prima localizzazione disponibili, ordinate per ordine preferito dell'utente, viene utilizzato.

Per scoprire la lingua corrente selezionata con i tuoi localizzazioni usare

[[NSBundle mainBundle] preferredLocalizations];

Esempio:

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

Swift:

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

Soluzione per iOS 9:

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

language = "it-IT"

NSDictionary *languageDic = [NSLocale componentsFromLocaleIdentifier:language];

languageDic avrà i componenti necessari

NSString *countryCode = [languageDic objectForKey:@"kCFLocaleCountryCodeKey"];

countryCode = "US"

NSString *languageCode = [languageDic objectForKey:@"kCFLocaleLanguageCodeKey"];

languageCode = "it"

Questo probabilmente darà ciò che si vuole:

NSLocale *locale = [NSLocale currentLocale];

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

Vi mostrerà il nome della lingua, nella lingua stessa. Ad esempio:

Français (France)
English (United States)

warning La accettato, e le altre risposte tutti non tengono conto del fatto che il preferito lingua può essere un'altra lingua diversa dalla lingua dispositivo .

Il lingua del dispositivo è la lingua in cui vengono presentati gli elementi del sistema operativo di Apple e le applicazioni.

Il lingua preferita è la lingua che l'utente vorrebbe avere applicazioni localizzate in. Apple fornisce solo un insieme limitato di traduzioni. Se la lingua preferita è una lingua di Apple tradotto le loro applicazioni per, sarà anche la lingua del dispositivo. Tuttavia se l'utente preferisce un linguaggio per il quale Apple non fornisce traduzioni del dispositivo e lingue preferite non corrisponderà . La lingua del dispositivo non sarà in prima posizione nella lista lingue preferite.

La seguente funzione passerà attraverso la lista lingue preferite e verificare se esiste una traduzione nei quadri di Apple. La prima lingua ad avere una traduzione è la lingua del dispositivo. La funzione restituisce il suo codice di lingua.

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
}

Questo funziona se la lista lingua preferita è:

  1. Afrikaans (iOS non è tradotto in afrikaans)
  2. spagnolo (lingua Periferica)

La lista dei lingua preferita può essere modificato in : Settings.app -> Generale -> Lingua e Regione -> Lingua preferita Ordine


È possibile che utilizzare il codice lingua del dispositivo e tradurlo nel nome della lingua. Le seguenti linee stamperà la lingua del dispositivo nella lingua del dispositivo. Ad esempio "Español" se il dispositivo è impostato spagnolo.

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)
    }
} 

Io uso questo

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

ignorare perdita di memoria ..

e il risultato è

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 traduzione dei codici di linguaggio come it in Inglese (Stati Uniti) è una costruito in funzione di NSLocale e NSLocale non importa dove si ottiene i codici di lingua da. Quindi non c'è davvero alcun motivo per implementare la propria traduzione, come suggerisce la risposta accettata.

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

Stampe: Inglese, Tedesco, Svedese

Anche c'è un modo migliore per ottenere la lingua corrente del dispositivo. Proviamo dal sottostante Codice -

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

Abizern su qui

È possibile utilizzare il metodo displayNameForKey:value: di 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"]);

Questo stamperà:

français (France)
anglais (États-Unis)

Se si specifica lo stesso identificatore locale per la initWithLocaleIdentifier: e anche il metodo displayNameForKey:value:, poi si darà il nome nativo della lingua. Ho scoperto che se si rimuove il codice del paese e utilizzare solo fr e en, che sarà anche omettere il paese dal nome di visualizzazione (su Mac OS X, almeno, non è sicuro su iOS).

ho cercato di fondare la soluzione giusta per me. Quando uso Locale.preferredLanguages.first è stato restituito la lingua preferita da impostazioni dell'app.

Se vuoi conoscere la lingua da impostazioni del dispositivo dell'utente, si dovrebbe utilizzare la stringa qui sotto:

Swift 3

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

a scartare e l'uso sguardo alla linea di seguito:

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

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

Per ottenere dispositivo dell'utente uso del linguaggio corrente il seguente codice di esso ha funzionato per me.

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

Swift

Per ottenere la lingua corrente del dispositivo

NSLocale.preferredLanguages()[0] as String

Per ottenere lingua dell'applicazione

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

Nota:

Si recupera la lingua che avete dato in CFBundleDevelopmentRegion di info.plist

se CFBundleAllowMixedLocalizations è vero in info.plist allora primo elemento di CFBundleLocalizations in info.plist viene restituito

Per MonoTouch C # sviluppatori di utilizzare:

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

Nota:. So che questa era una domanda iOS, ma come io sono uno sviluppatore di MonoTouch, la risposta in questa pagina mi ha portato nella giusta direzione e ho pensato di condividere i risultati

In 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!)

semplice funzione 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
  }

Se siete alla ricerca di codice lingua preferita ( "it", "de", "es" ...), e localizzato nome della lingua preferita (da impostazioni PC), ecco una semplice estensione a 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;

}

Se si desidera ottenere solo il linguaggio ecco la mia risposta suggerita:

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

Nel mio caso volevo solo solo non è la lingua Locale regione locale.

Output: Se la lingua locale è giapponese e regione locale è il Giappone, allora:

langplusreg = ja-JP

langonly = ja

risposta aggiornata per Swift 4

let language = Bundle.main.preferredLocalizations.first

Per Swift 3.0 sotto il codice può essere utilizzato per rispondere alla tua domanda:

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

In Swift 4.2 e 10.1 Xcode

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

Secondo la documentazione di Apple

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

Due lettere di formato. Apple utilizza il ISO norma ISO-3166 .

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

Risposta @amir a Swift:

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

Per Swift 3:

NSLocale.preferredLanguages ??[0] as String

Come di iOS 9, se si desidera solo il codice della lingua, senza codice del paese, ti consigliamo questo tipo di funzione di supporto -. In quanto la lingua conterrà il codice del paese

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

Ovviamente, le soluzioni basandosi, ad esempio, il

[[NSLocale preferredLanguages] objectAtIndex:0]

di solito funzionano bene e restituire la lingua del dispositivo corrente.

Ma potrebbe essere fuorviante in alcuni casi:

Se l'applicazione in cui si desidera ottenere questo valore ha già cambiato la lingua, ad esempio, con questo tipo di codice:

NSString *lg = @"en"; // or anything like @"en", @"fr", etc.
[[NSUserDefaults standardUserDefaults] 
    setObject:[NSArray arrayWithObjects:lg, nil]  
    forKey:@"AppleLanguages"]

In questo caso, [NSLocale preferredLanguages] ritorna in realtà il set lingua preferita (e usato) in questa particolare applicazione, non il linguaggio dispositivo corrente!

E ... in questo caso l'unico modo per ottenere correttamente il linguaggio vero e proprio dispositivo corrente (e non quello precedentemente impostato in app), è quello di eliminare innanzi tutto il tasto @ "appleLanguages" in NSUserDefaults, come questo:

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

Poi, [NSLocale preferredLanguages] ora restituisce il valore corretto.

Spero che questo aiuto.

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)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top