NSLocale currentLocale हमेशा "en_US" लौटाता है उपयोगकर्ता की वर्तमान भाषा नहीं


82

मैं एक iPhone ऐप का अंतर्राष्ट्रीयकरण करने की प्रक्रिया में हूं - मुझे उपयोगकर्ता के वर्तमान स्थान के आधार पर कुछ विचारों के लिए प्रोग्रामेटिक बदलाव करने की आवश्यकता है। मैं पागल हो रहा हूँ, क्योंकि iPhone सिम्युलेटर या वास्तविक हार्डवेयर पर कोई भी भाषा वरीयता नहीं है, localeहमेशा "en_US" का मूल्यांकन करता है:

NSString *locale = [[NSLocale currentLocale] localeIdentifier];
NSLog(@"current locale: %@", locale);

पागल बात यह है कि बाकी एप्लिकेशन उम्मीद के मुताबिक व्यवहार करते हैं। सही तार लोकलाइज़ेशन.स्ट्रिंग्स फ़ाइल से चुने जाते हैं और इंटरफ़ेस में उपयोग किए जाते हैं, और चयनित लोकेल के लिए सही .xib फ़ाइलों का उपयोग किया जाता है।

मैंने भी निम्नलिखित कोशिश की है, कोई फायदा नहीं हुआ और उसी परिणाम के साथ:

NSString *locale = [[NSLocale autoupdatingCurrentLocale] localeIdentifier];
NSLog(@"current locale: %@", locale);

क्या कुछ सरल है जो मुझे याद आ रहा है? एक वरीयता या एक आयात शायद?

मैं क्या करता था:

जैसा कि डैरेन का उत्तर बताता है, मैं जिस वरीयता की तलाश कर रहा हूं वह इसमें नहीं है NSLocale, बल्कि यह है:

NSUserDefaults* userDefaults = [NSUserDefaults standardUserDefaults];
NSArray* languages = [userDefaults objectForKey:@"AppleLanguages"];
NSString* preferredLanguage = [languages objectAtIndex:0];
NSLog(@"preferredLanguage: %@", preferredLang);

पीटर का जवाब एक बेहतर समाधान लगता है:

NSArray* preferredLanguages = [NSLocale preferredLanguages];
NSLog(@"preferredLanguages: %@", preferredLanguages);

जवाबों:


36

डिफाल्ट कुंजी का उपयोग करके सीधे डिफॉल्ट को क्वेरी करने के बजाय, पसंदीदा भाषाओं के सरणी के लिए NSLocale क्लास से पूछें


@PeterHosey मुझे वर्तमान भाषा के बारे में भी ऐसी ही समस्या है और मैंने हर चीज़ की कोशिश की, लेकिन उनमें से किसी ने भी काम नहीं किया। इतना दुखद ... क्या आप इस पर एक नज़र डाल सकते हैं, stackoverflow.com/questions/26572115/… ? धन्यवाद!
191 पर S1U

@ s1u Xcode 6.1 में एक बग है। इस उत्तर की जाँच करें: stackoverflow.com/a/26641497/1085556
बार्ट वैन कुइक

@ s1u: चीजों की जोड़ी: (1) कई पसंदीदा भाषाएं हो सकती हैं; आपके (हटाए गए) उत्तर के संबंध में एक भी "वर्तमान भाषा" नहीं है, और (2) उत्तर है, जो वर्तमान लोकेल (उर्फ क्षेत्र) की प्रमुख भाषा देता है, कि उपयोगकर्ता की पसंदीदा भाषा।
पीटर होसे

2
AppleLanguagesकुंजी undocumented नहीं है, यह केवल प्रलेखित तरीका है OS X 10.5 से पहले सिस्टम पर उपयोगकर्ता की पसंदीदा भाषा प्राप्त करने के लिए (जो, इन दिनों बहुत दुर्लभ है, लेकिन अभी भी, यह है प्रलेखित )।
ड्रीमलैक्स

58

[NSLocale currentLocale]डिवाइस के क्षेत्र प्रारूप सेटिंग्स पर आधारित है, न कि भाषा। यदि क्षेत्र संयुक्त राज्य में सेट है, तो आपको en_US मिलेगा चाहे आप जिस भाषा का उपयोग कर रहे हों।


धन्यवाद डैरेन, जो मुझे शुरू कर दिया, मैंने यह भी पता लगाया कि वर्तमान भाषा सेटिंग कैसे प्राप्त की जाए, जो कि मैं वास्तव में करने की कोशिश कर रहा था।
प्रिटिरिडॉग

2
हाय प्रेरिडॉग, आपको वर्तमान भाषा सेटिंग कैसे मिली? मैं भी एक ही समस्या है .. और भाषा के लिए एन मूल्य देता है।
ज़ल्दी

@ZaldzBugz: कुछ इस तरह: NSLocale * locale = [NSLocale currentLocale]; NSString * लैंग = [लोकेल डिस्प्लेनमेफॉरके: एनएसलोकेलडेंटिफायर मूल्य: [[एनएसएलोकेल पसंदीदालेन्जेस] ऑब्जेक्टएटइंडेक्स: 0]];
powerj1984

3
iOS 8 पर यह मामला नहीं है। यदि आपकी भाषा जर्मन है और आपका क्षेत्र USA है तो iOS 8 "de_US" लौटाएगा। जो करना है।
अयोध्या

क्या उपयोगकर्ता को कहते हैं कि ऑस्ट्रेलिया में क्षेत्र ऑटो अपडेट किया गया है?
नागेन्द्र राव


9

हमारे लिए यह मुद्दा था कि हम अपनी देव योजना में आवेदन की भाषा और आवेदन क्षेत्र से आगे निकल रहे थे। सुनिश्चित करें कि एप्लिकेशन भाषा स्कीम विकल्पों में सिस्टम भाषा पर सेट है (स्कीम को संपादित करें -> विकल्प)।


धन्यवाद साइमन इस पहलू को इंगित करने के लिए ... परीक्षण के लिए मैंने इसे स्थानीय भाषा में सेट किया था और मैं इसे बाद में बदलना भूल गया था।
अमीर

वह यह था! विश्वास नहीं कर सकता यह एक Xcode सेटिंग थी जो इसे गड़बड़ कर रही थी।
पेड्रो

इससे मेरी बेकन बच गई! धन्यवाद।
किर्बी टॉड ने

4

मेरे लिए, दोनों

NSString *localeString = [[NSLocale currentLocale] localeIdentifier];

तथा

NSArray *array = [NSLocale preferredLanguages];
self.label.text = array[0];

जब आप सिम्युलेटर में हों तो वही परिणाम दें।


2
दरअसल, मेरे मामले में, iOS 8 / Xcode 6 पर हमेशा en_US
एड्रियन

3

मेरे पास एक मुद्दा था जहां फ्रेंच भाषा में सेट डिवाइस पर अंग्रेजी में महीने के नाम प्रारूपण किए गए थे।

मेरा समाधान यह उपयोग करना था:

    NSLocale *locale = [NSLocale localeWithLocaleIdentifier:[[NSLocale preferredLanguages] objectAtIndex:0] ];
    [self.monthNameFormatter setLocale:locale];
    [self.monthNameFormatter setDateFormat:@"MMMM"];
    [self.monthNameFormatter stringFromDate:myDate];

मैंने पाया कि [NSLocale currentLocale] महीने के नामों को iOS10 में ठीक से फ्रेंच में अनुवाद कर रहा था लेकिन iOS11 में नहीं था। उपयोग करना: NSLocale * locale = [NSLocale localeWithLocaleIdentifier: [[NSLocale अधिमान्य भाषा] objectAtIndex: 0]]; समस्या को ठीक किया। धन्यवाद बेन +1
पक्षी

2

मैंने पाया कि अगर मैं "en_US" को छोड़ देता हूं, लेकिन "en" को स्थानीयकरण है जो "en_US" की एक प्रति है, तो सिम्युलेटर स्वचालित रूप से भाषा सेटिंग्स का सम्मान करना शुरू कर देता है, लेकिन जैसे ही "en_US" एक विकल्प होता है, हमेशा इसे ध्यान से चुनता है। सेटिंग्स की।


1

प्रश्न बहुत पुराना है, लेकिन यह कोड कई लोगों की मदद कर सकता है:

Main.m इस तरह दिखना चाहिए:

    NSString *localecode=[[NSLocale currentLocale] localeIdentifier];
    localecode=[localecode substringToIndex:2]; //en_GB -> en
    NSArray *arr = [NSLocale preferredLanguages];
    NSMutableArray * mutable = [arr mutableCopy];
    NSString *prefered = [mutable firstObject];
    if(![localecode isEqualToString:prefered]){
        if(![prefered isEqualToString:@"es"] && ![prefered isEqualToString:@"en"] && ![prefered isEqualToString:@"pt"]){
            int index = [mutable indexOfObject:@"en"];
            [mutable replaceObjectAtIndex:0 withObject:@"en"];
            [mutable replaceObjectAtIndex:index withObject:prefered];
            [[NSUserDefaults standardUserDefaults] setObject:mutable forKey:@"AppleLanguages"];

        }
        else{
            int index = [mutable indexOfObject:localecode];
            [mutable replaceObjectAtIndex:0 withObject:localecode];
            [mutable replaceObjectAtIndex:index withObject:prefered];
            [[NSUserDefaults standardUserDefaults] setObject:mutable forKey:@"AppleLanguages"];
        }
    }
    return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));

ये क्या करते हैं? अगर डिवाइस की वर्तमान भाषा es स्पैनिश, अंग्रेजी या पुर्तगाली उपयोग करते हैं तो एप्लिकेशन स्थानीय भाषा का उपयोग करता है, दूसरी ओर यदि वर्तमान भाषा उन में से एक नहीं है और आवेदन द्वारा समर्थित नहीं है तो अंग्रेजी में सेट है।


0

यह वास्तविक आईपैड पर सही लोकेल दिखाता है। हालाँकि, सिम्युलेटर में इसका स्वयं का iOS है जो डिफ़ॉल्ट रूप से en-US पर सेट है। सिम्युलेटर iOS वरीयताओं पर जाएं और अपनी इच्छित भाषा और क्षेत्र स्विच करें।

वह चालबाजी करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.