Android को वर्तमान स्थान मिलता है, डिफ़ॉल्ट रूप से नहीं


300

मुझे एंड्रॉइड में उपयोगकर्ता का वर्तमान लोकेल कैसे मिलेगा?

मुझे डिफ़ॉल्ट एक मिल सकता है, लेकिन यह वर्तमान सही नहीं हो सकता है?

मूल रूप से मुझे वर्तमान लोकेल से दो अक्षर का भाषा कोड चाहिए। डिफ़ॉल्ट एक नहीं। कोई नहीं हैLocale.current()


default()एक बहुत ही सुरक्षित शर्त है, बस इसे प्रोसेसिंग के लिए उपयोग न करें (जैसे डॉक्स कहते हैं)।
ए - सी

@ ए - सी प्रसंस्करण के लिए इसका उपयोग करते हैं?
सीक्यूएम

हाँ, देखें कि डॉक्स क्या कहता है: कुछ स्थान दशमलव बिंदु और 'के रूप में', 'का उपयोग करेंगे।' अंकों के समूहन के लिए। इतना सामान parseInt () विफल हो सकता है। ध्यान दें कि वे अभी भी उपयोग करने की सलाह देते हैं default(), लेकिन सामान के लिए नहीं जो कोड को तोड़ सकते हैं।
ए - सी

जवाबों:


487

डिफॉल्ट Localeका निर्माण सिस्टम प्रॉपर्टी सेटिंग्स से आपकी एप्लिकेशन प्रक्रिया के लिए रनटाइम पर किया जाता है, इसलिए यह एप्लिकेशन लॉन्च होनेLocale पर उस डिवाइस पर चयनित का प्रतिनिधित्व करेगा । आमतौर पर, यह ठीक है, लेकिन इसका मतलब यह है कि यदि उपयोगकर्ता आपकी एप्लिकेशन प्रक्रिया के चलने के बाद सेटिंग्स में बदलाव करता है, तो संभवत: इसका मूल्य तुरंत अपडेट नहीं किया जाएगा।LocalegetDefaultLocale()

यदि आपको अपने आवेदन में किसी कारण से इस तरह की घटनाओं को फंसाने की आवश्यकता है, तो आप इसके बजाय Localeसंसाधन Configurationऑब्जेक्ट से उपलब्ध प्राप्त करने का प्रयास कर सकते हैं , अर्थात

Locale current = getResources().getConfiguration().locale;

आप पा सकते हैं कि यह मान सेटिंग बदलने के बाद और अधिक तेज़ी से अपडेट किया जाता है यदि आपके आवेदन के लिए यह आवश्यक है।


1
क्या किसी ने चेक किया कि सिस्टम में बदलने पर डिफ़ॉल्ट लोकेल को ऐप में नहीं बदला गया है? मुझे लगता है कि यह उन "कॉन्फ़िगरेशन परिवर्तनों" में से एक है, जो गतिविधियों को नष्ट कर देता है और फिर से बना देता है
मिशैल के

11
मैंने इसका परीक्षण किया, जब मैं स्थान बदल रहा था, तब दोनों का उत्पादन किया; परिणाम है, आउटपुट समान है। इसलिए Locale.getDefault () को सुरक्षित रूप से उपयोग किया जा सकता है क्योंकि यह तुरंत अपडेट हो जाता है। Log.d("localeChange", "Default locale lang: " + Locale.getDefault().getLanguage()); Log.d("localeChange", "Config locale lang: " + getResources().getConfiguration().locale.getLanguage());
एलेसियो

58
इसे विन्यास वर्ग में हटा दिया गया है, इस सलाह के लिए नवीनतम डॉक्स देखें:locale This field was deprecated in API level 24. Do not set or read this directly. Use getLocales() and setLocales(LocaleList). If only the primary locale is needed, getLocales().get(0) is now the preferred accessor.
MrBigglesworth

7
वे सिर्फ एक getFirstLocale () पद्धति से क्यों नहीं जोड़ते कि अजीब getLocales () से बचें। (0)?
user3290180

1
यदि आप एपी के पुराने और नए संस्करणों का समर्थन करना चाहते हैं तो क्या होगा?
इवान

179

Android N (Api level 24) अपडेट (कोई चेतावनी नहीं):

   Locale getCurrentLocale(Context context){
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N){
            return context.getResources().getConfiguration().getLocales().get(0);
        } else{
            //noinspection deprecation
            return context.getResources().getConfiguration().locale;
        }
    }

6
अगर-और से बचने के लिए सहायता पुस्तकालय में कुछ है?
फ़ेडरिको पोंज़ी

8
@TargetApi (Build.VERSION_CODES.N) को आपके कोड में आवश्यक नहीं है अगर आप if और fallback कोड शामिल करते हैं
पैट्रिक फेवर

@FedericoPonzi कोई रिसोर्सकंप लोकेल के लिए 25.0.1 की विधि नहीं लगती है
पैट्रिक फेवर

2
यदि उपयोगकर्ता के पास कई भाषाएँ स्थापित हैं, तो यह काम नहीं कर सकता है। आपको इसका उपयोग करना चाहिए LocaleList.getDefault().get(0);क्योंकि यह पसंदीदा भाषा द्वारा छांटे गए स्थान को लौटा देगा।
घुंघराले

21
@FedericoPonzi @ for3st मैंने इसे इस ConfigurationCompatरूप में पाया , जैसेConfigurationCompat.getLocales(getResources().getConfiguration()).get(0)
युवल सेप

63

यदि आप एंड्रॉइड सपोर्ट लाइब्रेरी का उपयोग कर रहे हैं, तो आप ConfigurationCompatपदावनति चेतावनी से छुटकारा पाने के लिए @ Makalele की विधि के बजाय उपयोग कर सकते हैं :

Locale current = ConfigurationCompat.getLocales(getResources().getConfiguration()).get(0);

या कोटलिन में:

val currentLocale = ConfigurationCompat.getLocales(resources.configuration)[0]

8
यदि आपके पास कोई संदर्भ नहीं है तो आप यह भी कर सकते हैंConfigurationCompat.getLocales(Resources.getSystem().getConfiguration()).get(0);
क्वेंटिन जी।

@QuentinG। हां, लेकिन इस मामले में एप्लिकेशन संदर्भ का उपयोग करना बेहतर है ।
मैकमैथ

तो स्पष्ट होने के लिए, यह डिफ़ॉल्ट लोकल नहीं लौटाएगा, लेकिन उपयोगकर्ता को स्थानीय पसंद है?
सेसाबा टोथ

12

से getDefaultकी प्रलेखन:

उपयोगकर्ता का पसंदीदा स्थान लौटाता है। हो सकता है कि इस प्रक्रिया के लिए सेटफॉल्ट (लोकेल) के साथ ओवरराइड किया गया हो।

Localeडॉक्स से भी :

डिफ़ॉल्ट लोकेल उन कार्यों के लिए उपयुक्त है जिसमें उपयोगकर्ता के लिए डेटा प्रस्तुत करना शामिल है।

लगता है जैसे आपको इसका उपयोग करना चाहिए।


7
यह उत्तर गलत है, डिफ़ॉल्ट लोकेल मिला है लेकिन यदि उपयोगकर्ता ने इसे फ्लाई पर बदल दिया है तो यह गलत दिखाई देता है। अगला उत्तर सही है
user170317

सहमत, गलत जवाब। मेरे मामले में, मैं getResources () का उपयोग नहीं करने का एक तरीका ढूंढ रहा था, जिसका अर्थ है कि मुझे एक संदर्भ की आवश्यकता है। मेरी समस्या एक सहायक वर्ग की थी, जिसके पास कोई संदर्भ नहीं था, लेकिन लगता है कि मुझे इसमें पास करना होगा। यदि आपके पास कोई ऐसा ऐप है जो लोगों को अपना स्थान बदलने देता है और उनके विचारों के तार, संख्या प्रारूप आदि बदल जाते हैं, तो आपको Devunwired की प्रतिक्रिया का उपयोग करने की आवश्यकता है
1mike12

मेरे लिए काम। यदि मैं एक ब्रेकपॉइंट सेट करता हूं Locale.setDefault(), तो यह तब मिलता है जब मैं डिवाइस भाषा को कम से कम एंड्रॉइड 5.0 पर वापस बदल देता हूं (जो कि मैंने परीक्षण किया है)
कपटपूर्ण

6

उपरोक्त सभी उत्तर - काम नहीं करते हैं। तो मैं यहाँ एक फंक्शन डालूँगा जो 4 और 9 android पर काम करता है

private String getCurrentLanguage(){
   if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N){
      return LocaleList.getDefault().get(0).getLanguage();
   } else{
      return Locale.getDefault().getLanguage();
   }
}

डिवाइस के स्तर पर उपयोगकर्ता की पसंदीदा भाषा की दिशा में लौटने वाले कुछ उत्तरों में से एक। LocaleListCompat.getDefault()यदि आप AndroidX का उपयोग करते हैं, तो आप इसका उपयोग भी कर सकते हैं ।
सैम

1

मैंने इसका इस्तेमाल किया है:

String currentLanguage = Locale.getDefault().getDisplayLanguage();
if (currentLanguage.toLowerCase().contains("en")) {
   //do something
}

0

आधिकारिक दस्तावेज़ीकरण के अनुसार कॉन्फ़िगरेशनकम्पैट को समर्थन पुस्तकालयों में पदावनत किया गया है

आप उपयोग करने पर विचार कर सकते हैं

LocaleListCompat.getDefault()[0].toLanguageTag() 0 वां स्थान उपयोगकर्ता का पसंदीदा स्थान होगा

0 स्थान पर डिफ़ॉल्ट स्थान पाने के लिए होगा LocaleListCompat.getAdjustedDefault()


हां, लेकिन इसे Androidx कॉन्फ़िगरेशनकंपैट संस्करण से प्रतिस्थापित नहीं किया गया है, डेवलपर
।android.com

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