आईओएस में वर्तमान डिवाइस भाषा हो रही है?


431

मैं उस वर्तमान भाषा को दिखाना चाहूंगा जिसका डिवाइस UI उपयोग कर रहा है। मैं किस कोड का उपयोग करूंगा?

मैं इसे NSStringपूरी तरह से वर्तनी के प्रारूप में चाहता हूं । (नहीं @ "en_US")

EDIT: द्वारा ड्राइविंग करने वालों के लिए, यहां उपयोगी टिप्पणियों का एक टन है, क्योंकि उत्तर नए iOS रिलीज के साथ विकसित हुआ है।


1
इसमें बनाया गया है NSLocale। मेरा जवाब देखिए।
एरिक बी

15
iOS9 टिप्पणी: इस तथ्य पर ध्यान दें कि किसी अजीब कारण से, Apple ने बदले हुए प्रारूप को बदल दिया है [NSLocale preferredLanguages]। इसे अंडरस्कोर (जैसे en_US) से अलग किया जाता था, लेकिन अब इसे एक डैश में बदल दिया गया:en-US
ishahak

7
IOS9 पर अधिक: iOS 8.4 सिम्युलेटर बनाम 9.0 सिम्युलेटर पर [NSLocale तरजीह] प्राप्त करना भी विसंगतियां हैं। आईओएस 8.4 पर यह "एन" है और आईओएस 9.0 यह "एन-यूएस" है
क्रिश सुब्रमण्यन

इस टिप्पणी से मुझे बहुत मदद मिली! जब तक मैं आपकी टिप्पणी नहीं देख लेता, हम यह सोचकर एक साधारण मुद्दे पर अड़ गए कि लगभग 1 घंटे तक क्या हुआ।
thandasoru

3
NSLocaleतरीके हैं componentsFromLocaleIdentifier:और localeIdentifierFromComponents:जो संभवतः (संभावित परिवर्तनशील) प्रारूप को संभालने का सही तरीका है।
बेंजो

जवाबों:


808

प्रदान किए गए समाधान वास्तव में डिवाइस के वर्तमान क्षेत्र को लौटाएंगे - वर्तमान में चयनित भाषा नहीं। ये अक्सर एक ही होते हैं। हालांकि, अगर मैं उत्तरी अमेरिका में हूं और मैंने अपनी भाषा जापानी में सेट की है, तो मेरा क्षेत्र अभी भी अंग्रेजी (संयुक्त राज्य) होगा। वर्तमान में चयनित भाषा को पुनः प्राप्त करने के लिए, आप यह कर सकते हैं:

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

यह वर्तमान में चयनित भाषा के लिए एक दो अक्षर कोड लौटाएगा। अंग्रेजी के लिए "en", स्पेनिश के लिए "es", जर्मन के लिए "de", आदि। अधिक उदाहरणों के लिए, कृपया इस विकिपीडिया प्रविष्टि (विशेष रूप से, 639-1 कॉलम) देखें:

आईएसओ 639-1 कोड की सूची

फिर यह दो अक्षर कोड को उस स्ट्रिंग में परिवर्तित करने का एक सरल मामला है जिसे आप प्रदर्शित करना चाहते हैं। तो अगर यह "एन" है, तो "अंग्रेजी" प्रदर्शित करें।

आशा है कि यह किसी को उस क्षेत्र और वर्तमान में चयनित भाषा के बीच अंतर करने में मदद करता है।

संपादित करें

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
ठीक वही जो मेरे द्वारा खोजा जा रहा था। मेरे पास एक ही मुद्दा था जहां क्षेत्र भाषा के समान नहीं है।
जसारीन

12
खराब उत्तर: चीनी के लिए zh-Hans लौटाता है, जो iso कोड नहीं है।
cyrilchampier

2
पहले दो अक्षर देश को देते हैं, डैश के बाद सामान क्षेत्र देता है, बाकी सिर्फ इसे और कम करने के लिए है (जैसे स्थानीय बोलियाँ)। zh को चीनी के लिए आईएसओ कोड के रूप में सूचीबद्ध किया गया है। मैं जैसी विशिष्ट भाषा की तलाश करने वालों के लिए
बजे

3
zh-Hans एकमात्र अपवाद है या अन्य भाषा कोड हैं जो ISO 639-1 मानक से भिन्न हैं?
MPaulo

57
चेतावनी: iOS 9 में , बदले हुए मूल्य की वापसीNSLocale preferredLanguages। यदि इससे पहले कि आप "एन" केवल आईओएस 9 में प्राप्त कर रहे हैं, तो आपको "एन-यूएस" या "एन-जेपी", आदि संदर्भ मिलेगा
Dj S

281

चयनित उत्तर वर्तमान डिवाइस भाषा देता है, लेकिन ऐप में उपयोग की जाने वाली वास्तविक भाषा नहीं। यदि आप उपयोगकर्ता की पसंदीदा भाषा के लिए अपने ऐप में स्थानीयकरण प्रदान नहीं करते हैं, तो उपयोगकर्ता के पसंदीदा ऑर्डर के आधार पर उपलब्ध पहला स्थानीयकरण उपयोग किया जाता है।

अपने स्थानीयकरणों के भीतर चुनी गई वर्तमान भाषा की खोज करने के लिए

[[NSBundle mainBundle] preferredLocalizations];

उदाहरण:

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

स्विफ्ट:

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

बहुत बढ़िया, यह वही है जिसमें मुझे दिलचस्पी थी। परीक्षण किया गया और यह सही ढंग से काम करता है!
स्माइबॉर्ग

5
उत्तम! यह मुझे स्थानीय दूरस्थ संसाधन पथों के निर्माण की अनुमति देता है, केवल उन्हीं भाषाओं के साथ जो मेरा ऐप बेहतर ऑर्डर पर समर्थन करता है।
येवैन दुबीनिन

क्या होगा अगर हम इसके बाद पूरी भाषा का नाम प्राप्त करना चाहते हैं?
शबरीनाथ पाब्बा

यदि आप पसंदीदा भाषा से संपूर्ण भाषा का नाम प्राप्त करना चाहते हैं, तो आप [[NSLocale आवंटन] initWithLocaleIdentifier: भाषा] (ऊपर से) का उपयोग कर सकते हैं। फिर आपके पास स्थान है और प्रदर्शन को नामांकित कह सकते हैं।
वेनेसा फॉरेनी

87

IOS 9 के लिए समाधान:

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

भाषा = "एन-यूएस"

NSDictionary *languageDic = [NSLocale componentsFromLocaleIdentifier:language];

languageDic में आवश्यक घटक होंगे

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

देशकोड = "यूएस"

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

भाषाकोड = "एन"


5
kCFLocaleLanguageCodeKey एक परिभाषित स्थिरांक है जिसे आप अपनी स्ट्रिंग बनाने के बजाय उपयोग कर सकते हैं।
एसएनमथी

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
गलत उत्तर: यह लोकेल लौटाता है, भाषा नहीं, जो अलग हो सकती है ...
साइरिलचैम्पियर

4
यह निश्चित रूप से गलत है, उदाहरण के लिए यदि आप फोन की सेटिंग में भाषा को अंग्रेजी में सेट करते हैं और जर्मन, जर्मनी को "जर्मन" रिटर्न के ऊपर का उदाहरण बताने के लिए रीजन फॉर्मेट देता है। अभी भी फोन की भाषा अंग्रेजी में सेट है।
jake_hetfield

2
यह बिल्कुल भी गलत नहीं है। लोकेल में भाषा और क्षेत्र दोनों की जानकारी होती है। तो @ jake_hetfield के उदाहरण में यह "जर्मन" वापस नहीं आएगा, यह "अंग्रेजी (जर्मनी)" लौटाएगा। ड्रीमलैब के उत्तर के साथ संयुक्त यह सही उत्तर होना चाहिए।
सीनआर

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()और अपेक्षित भाषा कोड लौटा दिया गया।
पलमी २१'१६ को

सरलीकरण: बंडल के साथ शुरू mainBundle()करने के लिए Apple द्वारा अनुशंसित एक प्रतीत होता है जैसा कि हेडर में सुझाव दिया गया है 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
पल्मी

@Pouria NSBundle.mainBundle()आपके ऐप बंडल को NSBundle(forClass: UIView.self)लौटाता है , जबकि सिस्टम UIKit बंडल लौटाता है। बंडल में निर्देशिकाओं के लिए वर्णित विधि दिखती है। आपके एप्लिकेशन बंडल में केवल वे ही भाषाएं होंगी जिन्हें आप स्थानीय बनाना चाहते हैं। डिवाइस भाषा निर्धारित करने के लिए आपको सिस्टम बंडल की जांच करनी होगी।
ड्रीमलैब

1
@ समस्या यह हो सकती है कि iOS 9 ने रिटर्न वैल्यूज को बदल दिया है NSLocale.preferredLanguages()। मैंने iOS 9 का समर्थन करने के लिए उत्तर अपडेट किया
ड्रीमलैब

@dreamlab दुर्भाग्यवश जब आप 3rd पार्टी घटकों जैसे कि पॉड्स को शामिल करते हैं, तो यह दृष्टिकोण गलत-सकारात्मक परिणाम देता है, स्थानीयकरण के साथ आप प्रोजेक्ट सेटिंग्स में समर्थन नहीं करते हैं।
कोको

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

सिर्फ जिज्ञासा के लिए, स्मृति रिसाव यहाँ कहाँ है?
Poyrazoğlu

लीक - [[[NSLocale आबंटित] initWithLocaleIdentifier: lan]।
पावेल

1
केवल गैर-एआरसी परियोजनाओं के लिए, हालांकि।
जोश हिनमैन

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] का उपयोग करना चाहिए। इस तरह भाषा के नाम को उपयोगकर्ताओं की मूल भाषा में प्रदर्शित किया जाएगा। उदाहरण के लिए स्वीडिश स्वेन्स्का बन जाएगा।
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, तो यह देश को डिस्प्ले नाम (मैक ओएस एक्स पर कम से कम, आईओएस के बारे में निश्चित नहीं है) से हटा देगा।


6

तीव्र

डिवाइस की वर्तमान भाषा प्राप्त करने के लिए

NSLocale.preferredLanguages()[0] as String

आवेदन की भाषा पाने के लिए

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

ध्यान दें:

यह उस भाषा को प्राप्त करता है जो आपने CFBundleDevelopmentRegion में दी है of 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.preferredLocalizations का उपयोग [0] स्ट्रिंग के रूप में
μολὼν.λαβέ

5

उपयोगकर्ता डिवाइस वर्तमान भाषा प्राप्त करने के लिए निम्न कोड का उपयोग करें जो मेरे लिए काम करता है।

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

4

iOS13, स्विफ्ट 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 सवाल था, लेकिन जैसा कि मैं एक मोनोऑउट डेवलपर हूं, इस पेज पर जवाब ने मुझे सही दिशा में ले गया और मुझे लगा कि मैं परिणाम साझा करूंगा।


मैं वर्तमान में NSLocale.PreferredLanguages ​​का उपयोग कर रहा हूं और मुझे एक खाली सरणी मिल रही है। मुझे लगता है कि आपने प्रलेखन में पढ़ा है कि यह कभी खाली नहीं हो सकता है लेकिन मैं इसे कहीं भी नहीं देख सकता हूं?
JFoulkes

नहीं, ईमानदारी से यह सिर्फ मेरी खुद की एक धारणा थी।
चक सावज

@LarryF इस वीडियो को देखें: jonas.follesoe.no/2011/07/22/cross-platform-mobile-ndc-2011 यह आपके कोड / मल्टी-प्लेटफ़ॉर्म ऐप को कैसे तैयार किया जाए, इस पर बहुत जानकारी है।
चक सेवेज

3

इन Swift:

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

3

स्विफ्ट 3

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

ढेर अतिप्रवाह में आपका स्वागत है! हालांकि यह कोड प्रश्न का उत्तर दे सकता है, लेकिन समस्या क्या थी, इसका विवरण शामिल करना बेहतर है, और आपका कोड दी गई समस्या से कैसे निपटेगा। भविष्य के लिए, यहां कुछ जानकारी है, स्टैक ओवरफ्लो पर एक भयानक जवाब कैसे क्रैक करना है
गंदा '

3

सरल स्विफ्ट 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" ...), और स्थानीयकृत पसंदीदा भाषा नाम (वर्तमान स्थान के लिए) खोज रहे हैं, तो यहां स्विफ्ट में एक सरल एक्सटेंशन दिया गया है:

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

मेरे मामले में मैं सिर्फ लोकेल भाषा चाहता था न कि स्थानीय क्षेत्र।

आउटपुट: यदि आपकी लोकेल भाषा जापानी है और स्थानीय क्षेत्र जापान है तो:

langplusreg = ja-JP

लंगड़ी = जा


1

स्विफ्ट में @ आमिर की प्रतिक्रिया:

// 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 अधिमानतः भाषाएं] वास्तव में इस विशेष ऐप में पसंदीदा भाषा सेट (और प्रयुक्त) देता है, न कि वर्तमान डिवाइस भाषा!

और ... इस मामले में वास्तविक वर्तमान डिवाइस भाषा को ठीक से प्राप्त करने का एकमात्र तरीका है (और जो पहले ऐप में सेट नहीं है), सबसे पहले NSUserDefaults में इस तरह से @ "appleLanguages" को साफ़ करना है:

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

उसके बाद, [NSLocale तरजीह] अब सही मूल्य लौटाता है।

उममीद है कि इससे मदद मिलेगी।


1

स्विफ्ट 4 के लिए अद्यतन उत्तर

let language = Bundle.main.preferredLocalizations.first

ध्यान दें कि यह उपलब्ध (बंडल अर्थात आप द्वारा समर्थित) और पसंदीदा (उपयोगकर्ता द्वारा) स्थानीयकरणों की कुल सूची प्राप्त करता है । NSLocale.preferredLanguagesबंडल द्वारा समर्थित के संबंध में उपयोगकर्ता के पसंदीदा को वापस करना चाहिए।
जॉनी

1

आपके प्रश्न का उत्तर देने के लिए स्विफ्ट 3.0 से नीचे के कोड का उपयोग किया जा सकता है:

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

1

स्विफ्ट 4.2 और एक्सकोड 10.1 में

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




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

स्विफ्ट-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बंडल द्वारा समर्थित के संबंध में उपयोगकर्ता के पसंदीदा को वापस करना चाहिए।
जॉनी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.