Mendapatkan bahasa perangkat saat ini di iOS?

431

Saya ingin menunjukkan bahasa saat ini yang menggunakan perangkat UI. Kode apa yang akan saya gunakan?

Saya ingin ini sebagai NSStringformat yang sepenuhnya dijabarkan. (Bukan @ "en_US")

EDIT: Bagi mereka yang mengemudi, ada satu ton komentar yang berguna di sini, karena jawabannya telah berevolusi dengan rilis iOS baru.

Moshe
sumber
1
Ini dibangun ke dalam NSLocale. Lihat jawaban saya.
Erik B
15
Komentar iOS9: perhatikan fakta bahwa untuk beberapa alasan aneh, Apple telah mengubah format yang dikembalikan oleh [NSLocale preferredLanguages]. dulu dipisahkan oleh garis bawah (misalnya en_US), tapi sekarang diubah menjadi tanda hubung:en-US
ishahak
7
Lebih lanjut tentang iOS9: Mendapatkan [NSLocale preferLanguages] pada simulator iOS 8.4 versus 9.0 juga memiliki perbedaan. Di iOS 8.4 itu adalah "en" dan iOS 9.0 itu adalah "en-US"
Kris Subramanian
Komentar ini banyak membantu saya! Kami terjebak dengan masalah sederhana bertanya-tanya apa yang salah selama sekitar 1 jam sampai saya melihat komentar Anda.
thandasoru
3
NSLocalememiliki metode componentsFromLocaleIdentifier:dan localeIdentifierFromComponents:yang mungkin merupakan cara yang tepat untuk menangani format (berpotensi dapat diubah).
Benjohn

Jawaban:

808

Solusi yang diberikan sebenarnya akan mengembalikan wilayah perangkat saat ini - bukan bahasa yang saat ini dipilih. Ini sering satu dan sama. Namun, jika saya berada di Amerika Utara dan saya mengatur bahasa saya ke Jepang, wilayah saya masih akan bahasa Inggris (Amerika Serikat). Untuk mengambil bahasa yang saat ini dipilih, Anda dapat melakukan:

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

Ini akan mengembalikan kode dua huruf untuk bahasa yang saat ini dipilih. "id" untuk bahasa Inggris, "es" untuk bahasa Spanyol, "de" untuk bahasa Jerman, dll. Untuk lebih banyak contoh, silakan lihat entri Wikipedia ini (khususnya, kolom 639-1):

Daftar kode ISO 639-1

Maka itu adalah masalah sederhana mengkonversi dua kode huruf ke string yang ingin Anda tampilkan. Jadi jika "en", tampilkan "Bahasa Inggris".

Semoga ini bisa membantu seseorang yang ingin membedakan antara wilayah dan bahasa yang saat ini dipilih.

EDIT

Layak untuk mengutip informasi header dari 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

Orang-orang yang tertarik dengan bahasa aplikasi melihat jawaban @ mindvision

Dubron
sumber
2
Persis apa yang saya cari. Saya memiliki masalah yang sama di mana wilayah tidak sama dengan bahasa.
Jasarien
12
jawaban buruk: mengembalikan zh-Hans untuk bahasa Cina, yang bukan kode iso.
cyrilchampier
2
Dua karakter pertama memberi negara, barang setelah tanda hubung memberikan wilayah, sisanya hanya untuk mempersempitnya lebih jauh (seperti dialek lokal). zh terdaftar sebagai kode iso untuk Bahasa Mandarin. Bagi mereka yang mencari bahasa tertentu seperti saya, coba pendaftar IANA
Xono
3
zh-Hans adalah satu-satunya pengecualian atau ada kode bahasa lain yang berbeda dari standar ISO 639-1?
MPaulo
57
Peringatan: di iOS 9 , nilai pengembalianNSLocale preferredLanguagesberubah. Jika sebelum Anda hanya mendapatkan "en", di iOS 9 Anda akan mendapatkan "en-US" atau "en-JP", dll. Referensi: happyteamlabs.com/blog/…
Dj S
281

Jawaban yang dipilih mengembalikan bahasa perangkat saat ini, tetapi bukan bahasa sebenarnya yang digunakan dalam aplikasi. Jika Anda tidak memberikan pelokalan dalam aplikasi Anda untuk bahasa pilihan pengguna, pelokalan pertama yang tersedia, dipesan berdasarkan pesanan yang disukai pengguna, digunakan.

Untuk menemukan bahasa saat ini yang dipilih dalam pelokalan Anda, gunakan

[[NSBundle mainBundle] preferredLocalizations];

Contoh:

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

Cepat:

let language = NSBundle.mainBundle().preferredLocalizations.first as NSString
mindvision
sumber
Luar biasa, ini juga yang saya minati. Diuji dan berfungsi dengan benar!
smileyborg
5
sempurna! ini memungkinkan saya untuk membangun jalur sumber daya jarak jauh lokal dengan hanya bahasa yang didukung aplikasi saya dalam urutan yang lebih baik.
Yevhen Dubinin
bagaimana jika kita ingin mendapatkan seluruh nama bahasa setelah ini?
Shabarinath Pabba
Jika Anda ingin mendapatkan seluruh nama bahasa dari preferalLocalization, Anda dapat menggunakan [[alokasi NSLocale] initWithLocaleIdentifier: language] (dari atas). Kemudian Anda memiliki lokal dan dapat memanggil displayNameForKey.
Vanessa Forney
87

Solusi untuk iOS 9:

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

language = "en-US"

NSDictionary *languageDic = [NSLocale componentsFromLocaleIdentifier:language];

languageDic akan memiliki komponen yang dibutuhkan

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

countryCode = "AS"

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

languageCode = "en"

amir
sumber
5
kCFLocaleLanguageCodeKey adalah konstanta yang didefinisikan yang dapat Anda gunakan daripada membuat string Anda sendiri.
SNyamathi
1
NSLocaleLanguageCode = @ "kCFLocaleCountryCodeKey"
crow
gunakan NSLocaleCountryCode dan NSLocaleLanguageCode untuk @ "kCFLocaleCountryCodeKey", @ "kCFLocaleLanguageCodeKey", secara berurutan
berkokok
65

Ini mungkin akan memberi Anda apa yang Anda inginkan:

NSLocale *locale = [NSLocale currentLocale];

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

Ini akan menampilkan nama bahasa, dalam bahasa itu sendiri. Sebagai contoh:

Français (France)
English (United States)
Philippe Leybaert
sumber
31
jawaban yang salah: ini mengembalikan lokal, bukan bahasa, yang bisa berbeda ...
cyrilchampier
4
Ini jelas salah, misalnya jika Anda mengatur bahasa di pengaturan telepon ke bahasa Inggris dan format Wilayah untuk katakanlah Jerman, Jerman, contoh di atas mengembalikan "Jerman". Bahasa telepon masih diatur ke Bahasa Inggris.
jake_hetfield
2
Ini tidak salah sama sekali. Lokal berisi informasi bahasa dan wilayah. Jadi dalam contoh @ jake_hetfield itu tidak akan mengembalikan "Jerman", itu akan mengembalikan "Bahasa Inggris (Jerman)". Ini dikombinasikan dengan jawaban dreamlab harus menjadi jawaban yang benar.
SeanR
36

peringatanJawaban yang diterima, dan jawaban lainnya tidak memperhitungkan bahwa bahasa yang dipilih dapat berupa bahasa lain dari bahasa perangkat .

Bahasa perangkat adalah bahasa tempat elemen sistem operasi dan aplikasi Apple disajikan.

Bahasa yang disukai adalah bahasa yang ingin dilokalisasi oleh pengguna. Apple hanya menyediakan serangkaian terjemahan terbatas. Jika bahasa yang disukai adalah satu bahasa yang diterjemahkan Apple ke aplikasi mereka, itu juga akan menjadi bahasa perangkat. Namun jika pengguna lebih memilih bahasa yang Apple tidak menyediakan terjemahan, perangkat dan bahasa pilihan tidak akan cocok . Bahasa perangkat tidak akan berada di posisi pertama dalam daftar bahasa yang disukai.

Fungsi berikut akan melalui daftar bahasa yang disukai dan memeriksa apakah ada terjemahan dalam kerangka kerja Apple. Bahasa pertama yang memiliki terjemahan adalah bahasa perangkat. Fungsi akan mengembalikan kode bahasanya.

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
}

Ini berfungsi jika daftar bahasa yang disukai adalah:

  1. Afrikaans (iOS tidak diterjemahkan ke dalam Afrikaans)
  2. Spanyol (Bahasa Perangkat)

Daftar bahasa yang disukai dapat diedit di : Settings.app -> Umum -> Bahasa & Wilayah -> Urutan Bahasa Pilihan


Anda dapat menggunakan kode bahasa perangkat dan menerjemahkannya ke nama bahasa. Baris berikut akan mencetak bahasa perangkat dalam bahasa perangkat. Misalnya "Español" jika perangkat diatur ke bahasa Spanyol.

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)
    }
} 
dreamlab
sumber
Pemahaman saya adalah bahwa dengan menginisialisasi bundel NSBundle(forClass: UIView.self)Anda dengan Anda mencoba memberikan bahasa yang paling spesifik untuk tampilan yang diberikan. Namun, menggunakan ini saya mengalami masalah di mana untuk kelas yang diberikan bahasa tidak dikembalikan. Saya mengubah inisialisasi ke NSBundle.mainBundle()dan mengembalikan kode bahasa yang diharapkan.
palmi
Klarifikasi: Inisialisasi bundel dengan mainBundle()muncul menjadi salah satu yang direkomendasikan oleh Apple seperti yang disarankan di header untuk NSLocale, // 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.
palmi
@Pouria NSBundle.mainBundle()mengembalikan bundel aplikasi Anda, sedangkan NSBundle(forClass: UIView.self)mengembalikan bundel sistem UIKit. metode yang dijelaskan mencari direktori dalam bundel. bundel aplikasi Anda hanya akan berisi yang untuk bahasa yang ingin Anda pelokalkan. untuk menentukan bahasa perangkat Anda perlu memeriksa bundel sistem.
dreamlab
1
@Pouria masalahnya mungkin karena iOS 9 mengubah nilai kembali dari NSLocale.preferredLanguages(). saya memperbarui jawaban untuk mendukung iOS 9 .
dreamlab
@dreamlab sayangnya pendekatan ini memberikan hasil positif palsu ketika Anda memasukkan komponen pihak ketiga, seperti pod, dengan pelokalan yang tidak Anda dukung dalam pengaturan proyek.
kokoko
12

saya menggunakan ini

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

abaikan kebocoran memori ..

dan hasilnya

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
enzoyang
sumber
hanya untuk rasa ingin tahu, di mana ingatannya bocor di sini?
Can Poyrazoğlu
Kebocoran - [[[alokasi NSLocale] initWithLocaleIdentifier: lan].
Pavel
1
Hanya untuk proyek non-ARC.
Josh Hinman
12

Menerjemahkan kode bahasa seperti en_US ke bahasa Inggris (Amerika Serikat) adalah fitur bawaan NSLocaledan NSLocaletidak peduli dari mana Anda mendapatkan kode bahasa tersebut. Jadi tidak ada alasan untuk menerapkan terjemahan Anda sendiri seperti yang disarankan oleh jawaban yang diterima.

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

Cetakan: Bahasa Inggris, Jerman, Swedia

Erik B
sumber
1
Sebenarnya, Anda harus menggunakan [NSLocale autoupdatingCurrentLocale] untuk menginisialisasi instance lokal Anda. Dengan begitu nama-nama bahasa akan ditampilkan dalam bahasa ibu pengguna. Misalnya Swedia akan menjadi Svenska.
Maciej Swic
8

Bahkan ada cara yang lebih baik untuk mendapatkan bahasa perangkat saat ini. Mari kita coba dengan kode di bawah ini -

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

Disarankan oleh Abizern di sini

Praveenkumar
sumber
7

Anda dapat menggunakan displayNameForKey:value:metode 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"]);

Ini akan mencetak:

français (France)
anglais tats-Unis)

Jika Anda menentukan pengidentifikasi lokal yang sama untuk initWithLocaleIdentifier:dan juga displayNameForKey:value:metode, maka itu akan memberi Anda nama asli bahasa tersebut. Saya telah menemukan bahwa jika Anda menghapus kode negara dan menggunakan hanya frdan en, itu juga akan menghilangkan negara dari nama tampilan (setidaknya pada Mac OS X, tidak yakin tentang iOS).

dreamlax
sumber
6

Cepat

Untuk mendapatkan bahasa perangkat saat ini

NSLocale.preferredLanguages()[0] as String

Untuk mendapatkan bahasa aplikasi

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

catatan:

Itu mengambil bahasa yang Anda berikan di CFBundleDevelopmentRegion of info.plist

jika CFBundleAllowMixedLocalizations benar di info.plist maka item pertama CFBundleLocalizations di info.plist dikembalikan

Durai Amuthan.H
sumber
6

Saya mencoba mencari solusi yang tepat untuk diri saya sendiri. Ketika saya menggunakan Locale.preferredLanguages.firstdikembalikan bahasa yang disukai dari pengaturan aplikasi Anda.

Jika Anda ingin mengenal bahasa dari pengaturan perangkat pengguna, Anda harus menggunakan string di bawah ini:

Cepat 3

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

Untuk membuka dan menggunakan, lihat baris di bawah ini:

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

    // For example
    if currentDeviceLanguage == "he" {
        UIView.appearance().semanticContentAttribute = .forceRightToLeft
    } else {
        UIView.appearance().semanticContentAttribute = .forceLeftToRight
    }
}
Roman Romanenko
sumber
Anda tidak perlu membuka bungkusan jika Anda menggunakan Bundle.main.preferredLocalizations ini [0] sebagai String
μολὼν.λαβέ
5

Untuk mendapatkan bahasa pengguna perangkat saat ini, gunakan kode berikut yang berfungsi untuk saya.

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

iOS13, Swift 5+, WWDC2019 https://developer.apple.com/videos/play/wwdc2019/403/

Pengguna dapat memilih bahasa aplikasi yang dipilih secara independen dari bahasa OS.

Anda dapat menggunakan ini:

    // Returns a list of the user's preferred languages.
    // Maybe more than (or none of) your app supports!
    Locale.preferredLanguages

    // a subset of this bundle's localizations, re-ordered into the preferred order
    // for this process's current execution environment; the main bundle's preferred localizations
    // indicate the language (of text) the user is most likely seeing in the UI
    Bundle.main.preferredLocalizations



    // The current running app language
    Bundle.main.preferredLocalizations.first

    // list of language names this bundle appears to be localized to
    Bundle.main.localizations
norbDEV
sumber
3

Untuk pengembang MonoTouch C # gunakan:

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

Catatan: Saya tahu ini adalah pertanyaan iOS, tetapi karena saya adalah pengembang MonoTouch, jawaban pada halaman ini mengarahkan saya ke arah yang benar dan saya pikir saya akan membagikan hasilnya.

Chuck Savage
sumber
Saat ini saya menggunakan NSLocale.PreferredLanguages ​​dan saya mendapatkan array kosong. Saya berasumsi Anda telah membaca dalam dokumentasi bahwa itu mungkin tidak pernah kosong tetapi saya tidak dapat melihat ini di mana pun?
JFoulkes
Tidak, jujur ​​itu hanya asumsi saya sendiri.
Chuck Savage
@LarryF Tonton video ini: jonas.follesoe.no/2011/07/22/cross-platform-mobile-ndc-2011 Sangat informatif tentang cara menyusun kode Anda / aplikasi multi-platform.
Chuck Savage
3

Dalam Swift:

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

Cepat 3

let locale = Locale.current
let code = (locale as NSLocale).object(forKey: NSLocale.Key.countryCode) as! String?
print(code!)
Tarik
sumber
Selamat Datang di Stack Overflow! Meskipun kode ini dapat menjawab pertanyaan, lebih baik untuk memasukkan deskripsi tentang apa masalahnya, dan bagaimana kode Anda akan mengatasi masalah yang diberikan. Untuk masa depan, berikut adalah beberapa informasi, cara memecahkan jawaban yang hebat di Stack Overflow.
dirtydanee
3

Fungsi Swift 3 sederhana:

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

Jika Anda mencari kode bahasa pilihan ("en", "de", "es" ...), dan nama bahasa pilihan lokal (untuk lokal saat ini), berikut ini adalah ekstensi sederhana di 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)!
}

}

Jovan Stankovic
sumber
2
-(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;

}
Johnny Rockex
sumber
2

Jika Anda hanya ingin mendapatkan bahasa di sini adalah jawaban yang disarankan:

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

Dalam kasus saya, saya hanya ingin hanya bahasa Lokal bukan wilayah lokal.

Output: Jika bahasa Lokal Anda adalah bahasa Jepang dan wilayah lokal adalah Jepang maka:

langplusreg = ja-JP

langonly = ja

Danboz
sumber
1

@amir respons di Swift:

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

Jelas, solusinya mengandalkan, misalnya, pada

[[NSLocale preferredLanguages] objectAtIndex:0]

biasanya berfungsi dengan baik dan mengembalikan bahasa perangkat saat ini.

Tetapi dalam beberapa kasus bisa menyesatkan:

Jika aplikasi tempat Anda ingin mendapatkan nilai ini telah mengubah bahasa, misalnya dengan kode jenis ini:

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

Dalam hal ini, [NSLocale preferLanguages] sebenarnya mengembalikan set bahasa yang disukai (dan digunakan) dalam aplikasi khusus ini, bukan bahasa perangkat saat ini!

Dan ... dalam hal ini satu-satunya cara untuk mendapatkan bahasa perangkat saat ini dengan benar (dan bukan yang sebelumnya diatur dalam aplikasi), adalah dengan terlebih dahulu menghapus kunci @ "appleLanguages" di NSUserDefaults, seperti ini:

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

Kemudian, [NSLocale preferLanguages] sekarang mengembalikan nilai yang benar.

Semoga bantuan ini.

Chrysotribax
sumber
1

Jawaban yang diperbarui untuk Swift 4

let language = Bundle.main.preferredLocalizations.first
Md. Ibrahim Hassan
sumber
Perhatikan bahwa ini mengambil daftar agregat yang tersedia (didukung oleh bundel yaitu Anda) dan lebih disukai (oleh pengguna) lokalisasi. NSLocale.preferredLanguagesharus mengembalikan yang disukai pengguna tanpa memperhatikan apa yang didukung oleh bundel.
Jonny
1

Untuk Swift 3.0 kode di bawah ini dapat digunakan untuk menjawab pertanyaan Anda:

 let language = Bundle.main.preferredLocalizations.first! as NSString
Apurv Soni
sumber
1

Di Swift 4.2 dan Xcode 10.1

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

Menurut dokumentasi Apple

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

Format dua huruf. Apple menggunakan standar ISO ISO-3166 .

NSString *localeCountryCode = [[NSLocale autoupdatingCurrentLocale] objectForKey:NSLocaleCountryCode];
Jakub Truhlář
sumber
0

Untuk Swift 3:

NSLocale.preferredLanguages ​​[0] sebagai String

Bill Chan
sumber
0

Pada iOS 9, jika Anda hanya ingin kode bahasa tanpa kode negara, Anda akan menginginkan fungsi pembantu semacam ini - karena bahasa tersebut akan berisi kode negara.

// 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;
}
jjxtra
sumber
0

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)
anshul-systematix
sumber
Perhatikan bahwa ini mengambil daftar agregat yang tersedia (didukung oleh bundel yaitu Anda) dan lebih disukai (oleh pengguna) lokalisasi. NSLocale.preferredLanguagesharus mengembalikan yang disukai pengguna tanpa memperhatikan apa yang didukung oleh bundel.
Jonny