รับภาษาของอุปกรณ์ปัจจุบันใน iOS?


431

ฉันต้องการแสดงภาษาปัจจุบันที่ UI ของอุปกรณ์ใช้อยู่ ฉันจะใช้รหัสอะไร

ฉันต้องการสิ่งนี้NSStringในรูปแบบที่สะกดออกมาอย่างสมบูรณ์ (ไม่ใช่ @ "en_US")

แก้ไข: สำหรับผู้ขับขี่บนโดยมีความคิดเห็นที่มีประโยชน์มากมายที่นี่เป็นคำตอบที่มีการพัฒนากับ iOS รุ่นใหม่


1
สิ่งนี้ถูกสร้างไว้NSLocaleภายใน ดูคำตอบของฉัน
Erik B

15
ความคิดเห็น iOS9:ใส่ใจกับความจริงที่ว่าด้วยเหตุผลบางลาง, [NSLocale preferredLanguages]แอปเปิ้ลมีการเปลี่ยนแปลงรูปแบบที่ส่งกลับโดย มันเคยถูกคั่นด้วยเครื่องหมายขีดล่าง (เช่นen_US) แต่ตอนนี้มันเปลี่ยนเป็นประ:en-US
ishahak

7
ข้อมูลเพิ่มเติมเกี่ยวกับ iOS9: การใช้ [ภาษาที่ต้องการของ NSLocale] บนตัวจำลอง iOS 8.4 กับตัวจำลอง 9.0 ยังมีความคลาดเคลื่อน บน iOS 8.4 เป็น "en" และ iOS 9.0 คือ "en-US"
Kris Subramanian

ความคิดเห็นนี้ช่วยฉันได้มาก! เราติดอยู่กับปัญหาง่าย ๆ ที่สงสัยว่าเกิดอะไรขึ้นประมาณ 1 ชั่วโมงจนกระทั่งฉันเห็นความคิดเห็นของคุณ
thandasoru

3
NSLocaleมีวิธีการcomponentsFromLocaleIdentifier:และlocaleIdentifierFromComponents:น่าจะเป็นวิธีที่เหมาะสมในการจัดการรูปแบบ (อาจมีการเปลี่ยนแปลง)
Benjohn

คำตอบ:


808

โซลูชันที่ให้มาจะส่งคืนพื้นที่ปัจจุบันของอุปกรณ์ไม่ใช่ภาษาที่เลือกในปัจจุบัน สิ่งเหล่านี้มักจะเป็นแบบเดียวกัน อย่างไรก็ตามถ้าฉันอยู่ในอเมริกาเหนือและฉันตั้งค่าภาษาของฉันเป็นญี่ปุ่นภูมิภาคของฉันจะยังคงเป็นภาษาอังกฤษ (สหรัฐอเมริกา) ในการรับภาษาที่เลือกไว้ในปัจจุบันคุณสามารถทำได้:

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

นี่จะส่งคืนรหัสตัวอักษรสองตัวสำหรับภาษาที่เลือกในปัจจุบัน "en" สำหรับภาษาอังกฤษ "es" สำหรับภาษาสเปน "de" สำหรับภาษาเยอรมัน ฯลฯ สำหรับตัวอย่างเพิ่มเติมโปรดดูรายการ Wikipedia นี้ (โดยเฉพาะคอลัมน์ 639-1):

รายการรหัส ISO 639-1

จากนั้นเป็นเรื่องง่าย ๆ ในการแปลงรหัสตัวอักษรสองตัวให้เป็นสตริงที่คุณต้องการแสดง ดังนั้นหากเป็น "en" ให้แสดง "ภาษาอังกฤษ"

หวังว่านี่จะช่วยให้บางคนที่กำลังมองหาความแตกต่างระหว่างภูมิภาคและภาษาที่เลือกในปัจจุบัน

แก้ไข

คุ้มค่าที่จะเสนอราคาข้อมูลส่วนหัวจาก 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

ผู้ที่สนใจในภาษาของแอพจะดูคำตอบของ @ mindvision


2
สิ่งที่ฉันกำลังมองหา ฉันมีปัญหาเดียวกันกับที่ภูมิภาคไม่เหมือนกับภาษา
Jasarien

12
คำตอบที่ไม่ดี: ส่งกลับ zh-Hans สำหรับภาษาจีนซึ่งไม่ใช่รหัส iso
cyrilchampier

2
ตัวละครสองตัวแรกให้ประเทศสิ่งหลังเส้นประให้พื้นที่ส่วนที่เหลือเป็นเพียงการแคบลงอีก (เช่นภาษาท้องถิ่น) zh แสดงรายการเป็นรหัส iso สำหรับภาษาจีน สำหรับผู้ที่กำลังมองหาภาษาที่เฉพาะเจาะจงเช่นฉันลองสตรี IANA
Xono

3
zh-Hans เป็นข้อยกเว้นเพียงอย่างเดียวหรือมีรหัสภาษาอื่นที่แตกต่างจากมาตรฐาน ISO 639-1?
MPaulo

57
คำเตือน: ใน iOS 9ค่าส่งคืนของการNSLocale preferredLanguagesเปลี่ยนแปลง หากก่อนที่คุณจะได้รับ "en" เท่านั้นใน iOS 9 คุณจะได้รับ "en-US" หรือ "en-JP" เป็นต้นอ้างอิง: happyteamlabs.com/blog/…
Dj S

281

คำตอบที่เลือกจะส่งคืนภาษาของอุปกรณ์ปัจจุบัน แต่ไม่ใช่ภาษาจริงที่ใช้ในแอป หากคุณไม่มีการแปลเป็นภาษาท้องถิ่นในแอปของคุณสำหรับภาษาที่ผู้ใช้ต้องการระบบจะใช้การแปลเป็นภาษาแรกที่มีการสั่งซื้อโดยผู้ใช้ที่ต้องการ

เพื่อค้นหาภาษาปัจจุบันที่เลือกภายในการแปลของคุณใช้

[[NSBundle mainBundle] preferredLocalizations];

ตัวอย่าง:

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

สวิฟท์:

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

ยอดเยี่ยมนี่คือสิ่งที่ฉันสนใจเช่นกัน ผ่านการทดสอบและทำงานได้อย่างถูกต้อง!
smileyborg

5
ที่สมบูรณ์แบบ! มันทำให้ฉันสามารถสร้างพา ธ ของทรัพยากรรีโมตที่แปลเป็นภาษาท้องถิ่นด้วยภาษาที่แอพของฉันรองรับเท่านั้น
Yevhen Dubinin

เกิดอะไรขึ้นถ้าเราต้องการที่จะได้รับชื่อภาษาทั้งหมดหลังจากนี้
Shabarinath Pabba

หากคุณต้องการรับชื่อภาษาทั้งหมดจาก PreferredLocalization คุณสามารถใช้ [[NSLocale alloc] initWithLocaleIdentifier: language] (จากด้านบน) จากนั้นคุณมีสถานที่และสามารถเรียก displayNameForKey
Vanessa Forney

87

โซลูชันสำหรับ iOS 9:

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

language = "en-US"

NSDictionary *languageDic = [NSLocale componentsFromLocaleIdentifier:language];

languageDic จะมีส่วนประกอบที่จำเป็น

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

countryCode = "US"

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

languageCode = "en"


5
kCFLocaleLanguageCodeKeyเป็นค่าคงที่ที่กำหนดที่คุณสามารถใช้แทนการสร้างสตริงของคุณเอง
SNyamathi

1
NSLocaleLanguageCode = @ "kCFLocaleCountryCodeKey"
อีกา

ใช้ NSLocaleCountryCode และ NSLocaleLanguageCode สำหรับ @ "kCFLocaleCountryCodeKey", @ "kCFLocaleLanguageCodeKey", repectively
อีกา

65

นี่อาจจะให้สิ่งที่คุณต้องการ:

NSLocale *locale = [NSLocale currentLocale];

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

มันจะแสดงชื่อของภาษาในภาษาของตัวเอง ตัวอย่างเช่น:

Français (France)
English (United States)

31
คำตอบที่ไม่ถูกต้อง: สิ่งนี้ส่งคืนโลแคลไม่ใช่ภาษาซึ่งอาจแตกต่างกัน ...
cyrilchampier

4
นี่เป็นสิ่งที่ผิดอย่างแน่นอนตัวอย่างเช่นหากคุณตั้งค่าภาษาในการตั้งค่าโทรศัพท์เป็นภาษาอังกฤษและรูปแบบภูมิภาคเพื่อให้พูดว่าเยอรมัน, เยอรมัน, ตัวอย่างข้างต้นจะส่งกลับ "เยอรมัน" ภาษาของโทรศัพท์ยังคงเป็นภาษาอังกฤษ
jake_hetfield

2
มันไม่ผิดเลย โลแคลมีทั้งภาษาและข้อมูลภูมิภาค ดังนั้นในตัวอย่างของ @ jake_hetfield มันจะไม่ส่งคืน "เยอรมัน" มันจะส่งคืน "อังกฤษ (เยอรมัน)" รวมกับคำตอบของ Dreamlab ควรเป็นคำตอบที่ถูกต้อง
SeanR

36

คำเตือนได้รับการยอมรับและคำตอบอื่น ๆ ทั้งหมดไม่ได้คำนึงถึงว่าภาษาที่สามารถเป็นภาษาอื่นที่ไม่ใช่ภาษาอุปกรณ์

ภาษาของเครื่องที่เป็นภาษาที่องค์ประกอบของระบบปฏิบัติการและแอพพลิเคแอปเปิ้ลจะถูกนำเสนอ

ภาษาที่เป็นภาษาที่ผู้ใช้ต้องการที่จะมีแอพพลิเคท้องถิ่นใน. แอปเปิ้ลเพียง แต่ให้ชุด จำกัด ของการแปล หากภาษาที่ต้องการคือภาษาเดียวที่ Apple แปลแอปของพวกเขาเป็นภาษาของอุปกรณ์ อย่างไรก็ตามหากผู้ใช้ชอบภาษาที่แอปเปิ้ลไม่ได้ให้คำแปลที่อุปกรณ์และภาษาที่แนะนำจะไม่ตรงกับ ภาษาของอุปกรณ์จะไม่อยู่ในตำแหน่งแรกในรายการภาษาที่ต้องการ

ฟังก์ชั่นต่อไปนี้จะผ่านรายการภาษาที่ต้องการและตรวจสอบว่ามีการแปลในกรอบของ Apple หรือไม่ ภาษาแรกที่มีการแปลคือภาษาของอุปกรณ์ ฟังก์ชั่นจะส่งคืนรหัสภาษา

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
}

ใช้งานได้หากรายการภาษาที่ต้องการคือ:

  1. แอฟริกัน(iOS ไม่ได้แปลเป็นแอฟริกัน)
  2. สเปน(ภาษาของอุปกรณ์)

รายการภาษาที่ต้องการสามารถแก้ไขได้ใน : Settings.app -> ทั่วไป -> ภาษาและภาค -> ที่ต้องการสั่งซื้อสินค้าภาษา


คุณสามารถใช้รหัสภาษาของอุปกรณ์และแปลมันเป็นชื่อภาษาได้ บรรทัดต่อไปนี้จะพิมพ์ภาษาของอุปกรณ์ในภาษาของอุปกรณ์ ตัวอย่างเช่น "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)
    }
} 

ความเข้าใจของฉันคือว่าโดยการเริ่มต้นอินสแตนซ์มัดของคุณด้วยNSBundle(forClass: UIView.self)คุณพยายามที่จะให้ภาษาที่เฉพาะเจาะจงมากที่สุดสำหรับมุมมองที่กำหนด อย่างไรก็ตามเมื่อใช้สิ่งนี้ฉันพบปัญหาซึ่งในชั้นเรียนที่กำหนดไม่มีการส่งคืนภาษา ฉันเปลี่ยนการกำหนดค่าเริ่มต้นเป็นNSBundle.mainBundle()และได้ส่งคืนรหัสภาษาที่คาดหวัง
palmi

ชี้แจง: เริ่มต้นมัดด้วยmainBundle()ปรากฏขึ้นที่จะเป็นหนึ่งที่แนะนำโดยแอปเปิ้ลได้รับการแนะนำในส่วนหัวสำหรับ,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()ส่งคืนชุดแอปของคุณในขณะที่NSBundle(forClass: UIView.self)ส่งคืนชุด UIKit ระบบ เมธอดที่อธิบายจะค้นหาไดเร็กทอรีในบันเดิล ชุดแอปของคุณจะมีเฉพาะภาษาที่คุณตั้งใจจะแปล เพื่อกำหนดภาษาของอุปกรณ์คุณจะต้องตรวจสอบบันเดิลของระบบ
dreamlab

1
@Pouria ปัญหาอาจจะได้รับที่ 9 iOS NSLocale.preferredLanguages()ของคุณเปลี่ยนแปลงค่าผลตอบแทนจาก ฉันปรับปรุงคำตอบเพื่อรองรับ iOS 9
dreamlab

@dreamlab น่าเสียดายที่วิธีการนี้ให้ผลลัพธ์ที่ผิดพลาดเมื่อคุณรวมส่วนประกอบของบุคคลที่สามเช่นพ็อดที่มีการแปลเป็นภาษาท้องถิ่นที่คุณไม่สนับสนุนในการตั้งค่าโครงการ
kokoko

12

ฉันใช้สิ่งนี้

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

ละเว้นการรั่วไหลของหน่วยความจำ ..

และผลลัพธ์คือ

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

แค่อยากรู้อยากเห็นหน่วยความจำรั่วอยู่ตรงไหน?
Can Poyrazoğlu

รั่วไหล - [[[NSLocale alloc] initWithLocaleIdentifier: lan]
Pavel

1
สำหรับโครงการที่ไม่ใช่ ARC เท่านั้น
Josh Hinman

12

การแปลรหัสภาษาเช่นen_USเป็นภาษาอังกฤษ (สหรัฐอเมริกา)เป็นคุณสมบัติในตัวNSLocaleและNSLocaleไม่สนใจว่าคุณจะได้รับรหัสภาษาจากที่ใด ดังนั้นจึงไม่มีเหตุผลที่จะใช้การแปลของคุณเองเป็นคำตอบที่ยอมรับได้

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

พิมพ์: อังกฤษ, เยอรมัน, สวีเดน


1
ที่จริงแล้วคุณควรใช้ [NSLocale autoupdatingCurrentLocale] เพื่อเริ่มต้นอินสแตนซ์สถานที่ของคุณ วิธีนั้นชื่อภาษาจะปรากฏในภาษาของผู้ใช้ เช่นสวีเดนจะกลายเป็น Svenska
Maciej Swic

8

แม้จะมีวิธีที่ดีกว่าในการรับภาษาของอุปกรณ์ในปัจจุบัน ลองด้วยโค้ดด้านล่าง -

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

แนะนำโดยAbizernในที่นี่


7

คุณสามารถใช้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"]);

สิ่งนี้จะพิมพ์ออกมา:

français (France)
anglais tats-Unis)

หากคุณระบุตัวระบุตำแหน่งที่ตั้งเดียวกันสำหรับinitWithLocaleIdentifier:และdisplayNameForKey:value:วิธีการนั้นจะทำให้คุณมีชื่อพื้นเมืองของภาษา ฉันได้ค้นพบว่าถ้าคุณลบรหัสประเทศและใช้เพียงfrและenมันจะละเว้นประเทศจากชื่อที่แสดง (บน Mac OS X อย่างน้อยไม่แน่ใจเกี่ยวกับ iOS)


6

รวดเร็ว

เพื่อรับภาษาของอุปกรณ์ในปัจจุบัน

NSLocale.preferredLanguages()[0] as String

เพื่อรับภาษาแอพพลิเคชั่น

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

บันทึก:

มันดึงข้อมูลภาษาที่คุณให้ไว้ในCFBundleDevelopmentRegionของ info.plist

ถ้าCFBundleAllowMixedLocalizationsเป็นจริงใน info.plist รายการแรกของCFBundleLocalizationsใน info.plist จะถูกส่งกลับ


6

ฉันพยายามค้นหาวิธีแก้ปัญหาที่เหมาะสมสำหรับตัวเอง เมื่อฉันใช้Locale.preferredLanguages.firstกลับถูกภาษาที่ต้องการจากการตั้งค่าแอพของคุณ

หากคุณต้องการทำความรู้จักภาษาจากการตั้งค่าอุปกรณ์ผู้ใช้คุณควรใช้สตริงด้านล่าง:

สวิฟท์ 3

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

หากต้องการแกะและใช้ดูบรรทัดด้านล่าง:

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

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

คุณไม่ต้องแกะถ้าคุณใช้ Bundle.main.preferredLocalisation [0] นี้เป็นสตริง
μολὼν.λαβέ

5

สำหรับการรับภาษาปัจจุบันของอุปกรณ์ผู้ใช้ให้ใช้รหัสต่อไปนี้เพื่อใช้งานกับฉัน

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

4

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

ผู้ใช้สามารถเลือกภาษาที่ต้องการของแอพได้อย่างอิสระจากภาษาของระบบปฏิบัติการ

คุณสามารถใช้สิ่งเหล่านี้:

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

3

สำหรับนักพัฒนา MonoTouch C # ให้ใช้:

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

หมายเหตุ: ฉันรู้ว่านี่เป็นคำถาม iOS แต่เมื่อฉันเป็นนักพัฒนา MonoTouch คำตอบในหน้านี้ทำให้ฉันไปในทิศทางที่ถูกต้องและฉันคิดว่าฉันจะแบ่งปันผลลัพธ์


ปัจจุบันฉันใช้ NSLocale.PreferredLanguage และฉันได้อาร์เรย์ที่ว่างเปล่า ฉันคิดว่าคุณได้อ่านในเอกสารแล้วว่ามันอาจไม่เคยว่างเปล่า แต่ฉันไม่สามารถเห็นสิ่งนี้ได้ทุกที่?
JFoulkes

ไม่นะนั่นเป็นเพียงข้อสันนิษฐานของฉันเอง
Chuck Savage

@LarryF ดูวิดีโอนี้: jonas.follesoe.no/2011/07/22/cross-platform-mobile-ndc-2011 มันมีข้อมูลมากเกี่ยวกับวิธีการจัดโครงสร้างแอปพลิเคชั่นรหัส / หลายแพลตฟอร์มของคุณ
Chuck Savage


3

สวิฟท์ 3

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

ยินดีต้อนรับสู่ Stack Overflow! ในขณะที่โค้ดนี้อาจตอบคำถามได้ดีกว่าที่จะรวมคำอธิบายว่าปัญหาคืออะไรและรหัสของคุณจะจัดการกับปัญหาที่กำหนดได้อย่างไร สำหรับอนาคตนี่คือข้อมูลบางส่วนวิธีถอดรหัสคำตอบที่ดีเยี่ยมเกี่ยวกับ Stack Overflow
dirtydanee

3

ฟังก์ชั่น Simple 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
  }

3

หากคุณกำลังมองหารหัสภาษาที่ต้องการ ("en", "de", "es" ... ) และชื่อภาษาที่ต้องการแปลเป็นภาษาท้องถิ่น (สำหรับสถานที่ปัจจุบัน) นี่เป็นส่วนขยายอย่างง่ายใน 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)!
}

}


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;

}

2

หากคุณต้องการได้รับเฉพาะภาษาที่นี่คือคำตอบของฉัน:

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

ในกรณีของฉันฉันต้องการเพียงภาษา Locale ไม่ใช่ภูมิภาคสถานที่เกิดเหตุ

ผลลัพธ์: หากภาษา Locale ของคุณเป็นภาษาญี่ปุ่นและภูมิภาคของสถานที่คือญี่ปุ่นดังนั้น:

langplusreg = ja-JP

langonly = ja


1

@amir การตอบสนองใน Swift:

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

1

เห็นได้ชัดว่าการแก้ปัญหาอาศัยเช่น

[[NSLocale preferredLanguages] objectAtIndex:0]

มักจะทำงานได้ดีและส่งคืนภาษาของอุปกรณ์ปัจจุบัน

แต่อาจทำให้เข้าใจผิดในบางกรณี:

หากแอพที่คุณต้องการรับค่านี้เปลี่ยนภาษาไปแล้วตัวอย่างเช่นด้วยรหัสประเภทนี้:

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

ในกรณีนี้ [NSLocale ที่ต้องการภาษา] จริง ๆ แล้วส่งคืนชุดภาษาที่ต้องการ (และใช้) ในแอพนี้โดยเฉพาะไม่ใช่ภาษาอุปกรณ์ในปัจจุบัน!

และ ... ในกรณีนี้วิธีเดียวที่จะได้รับภาษาของอุปกรณ์ในปัจจุบันอย่างถูกต้อง (และไม่ใช่ที่ตั้งไว้ก่อนหน้าในแอป) คือการล้างคีย์ @ "appleLanguages" ใน NSUserDefaults เป็นอย่างแรก:

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

จากนั้น [NSLocale ที่ต้องการภาษา] ตอนนี้ส่งกลับค่าที่ถูกต้อง

หวังว่าความช่วยเหลือนี้


1

อัปเดตคำตอบสำหรับ Swift 4

let language = Bundle.main.preferredLocalizations.first

โปรดทราบว่าสิ่งนี้จะดึงข้อมูลรายการที่รวบรวมได้ (รองรับโดยชุดข้อมูลเช่นคุณ) และการแปลที่ต้องการ (โดยผู้ใช้) NSLocale.preferredLanguagesควรส่งคืนสิ่งที่ต้องการของผู้ใช้โดยไม่เคารพสิ่งที่กลุ่มสนับสนุน
จอนนี่

1

สำหรับรหัส Swift 3.0 ด้านล่างนี้สามารถใช้ในการตอบคำถามของคุณ:

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





0

สำหรับ iOS 9 หากคุณต้องการรหัสภาษาที่ไม่มีรหัสประเทศคุณจะต้องการฟังก์ชันตัวช่วยประเภทนี้เนื่องจากภาษาจะมีรหัสประเทศ

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

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)

โปรดทราบว่าสิ่งนี้จะดึงข้อมูลรายการที่รวบรวมได้ (รองรับโดยชุดข้อมูลเช่นคุณ) และการแปลที่ต้องการ (โดยผู้ใช้) NSLocale.preferredLanguagesควรส่งคืนสิ่งที่ต้องการของผู้ใช้โดยไม่เคารพสิ่งที่กลุ่มสนับสนุน
จอนนี่
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.