2012-05-18 23 views
23

एंड्रॉयड यहाँ प्रलेखन http://developer.android.com/guide/topics/resources/localization.html बताते हैं कि इस विधि से वर्तमान स्थान प्राप्त कर सकते हैं:एंड्रॉइड का वर्तमान लोकेल पाने का अपना तरीका क्यों है?

context.getResources().getConfiguration().locale 

ऐसा लगता है जावा पहले से ही इस विधि के रूप में इस जानकारी प्रदान करता है:

java.util.Locale.getDefault() 

तो क्यों किया एंड्रॉइड डेवलपर्स लोकेल पाने के लिए एक और तरीका पेश करते हैं? क्या कोड की उपरोक्त दो पंक्तियां एक ही समय में एक साथ चलने पर अलग-अलग परिणाम उत्पन्न करती हैं?

उत्तर

27

मैं मानता हूं कि यह भ्रमित है और जब मैं इसका हमला नहीं कर रहा हूं और न ही मैं इसका बचाव कर रहा हूं, तो मैं इसे कुछ चीजों को करने की अनुमति दे सकता हूं।

चलो शुरुआत से शुरू करते हैं।

java.util.Locale.getDefault() जावा रनटाइम द्वारा परिभाषित किया गया है। यह फोन/डिवाइस का लोकेल है। डेटफॉर्मैट्स (आईएसओ डेटफॉर्मैट मानक, यूएस प्रारूप मानक, इत्यादि), संख्याफॉर्मैट्स (कॉमा या डेसिमल, 3 या 4, आदि के समूह) और कर्रेनफॉर्मैट्स (क्या यह $ $ या सीएडी जैसा दिखता है) जैसी कोई शक्तियां नहीं होती हैं, जब कोई लोकेल नहीं होता है दिया हुआ। इन मामलों के लिए वैसे भी लोकेल को इन प्रकार की वस्तुओं को निर्दिष्ट करना सबसे अच्छा है।

context.getResources().getConfiguration().locale वह स्थान है जो दिए गए संदर्भ में मौजूदा संसाधन पैक के साथ पंजीकृत है। इसमें लोकेल वैल्यू शामिल हो सकता है कि सभी संसाधन सामग्री वर्तमान संदर्भ/संसाधन जोड़ी के लिए सम्मान करेगी। कॉन्फ़िगरेशन डिवाइस की वर्तमान स्थिति की तरह हो सकता है जो वर्तमान संसाधनों को सर्वोत्तम रूप से फ़िल्टर किया जाता है। आपको किसी भी सामग्री को निर्दिष्ट करने की आवश्यकता नहीं है जो लोकेल के आधार पर बदलती है, लेकिन यह एक विकल्प है।

संसाधन कॉन्फ़िगरेशन में भेदभावकर्ताओं के एक सेट का उपयोग करते हैं जैसे अभिविन्यास, स्क्रीन चौड़ाई, लोकेल इत्यादि। तो अपने ऐप के भीतर आप लोकल ऐप कॉन्फ़िगरेशन को एक अलग लोकेल में बदलकर वर्तमान संसाधन() को ओवरराइड करने की अनुमति दे सकते हैं। उदाहरण के लिए, आप किसी पते के लिए लेआउट बना रहे थे। देश चुनने के आधार पर आप कुछ क्षेत्रों को मोर्फ़ करना चाहते हैं। (यह नहीं कह रहा कि यह इस तरह के ऐप के लिए सही व्यवहार है लेकिन अभी यह सोचने की सबसे आसान बात है)। यदि आपको बस Locale.getDefault() पर भरोसा करना पड़ा, तो यह सिस्टम ऐप्स और राज्य की कुछ अजीब रीसेटिंग के लिए होगा जब आप कुछ ऐसा करना चाहते थे जैसा मैंने अभी वर्णित किया था।

आपको अनिवार्य रूप से पूरे डिवाइस के लिए लोकेल को संशोधित करने की आवश्यकता होगी (यह आवश्यक रूप से सुरक्षित नहीं है, और न ही यह कोई पुराना उपयोगकर्ता आनंद लेगा)। यहां तक ​​कि अगर हम सुरक्षा प्रबंधक के मुद्दों को नजरअंदाज करते हैं जिन्हें होस्ट वीएम द्वारा डुप्लिकेट किया जाएगा; अधिकांश उपकरणों पर देश के किट के लिए कैश किया जाता है। तो इस मूल्य को स्विच करते समय काफी अंतराल और शायद अस्थिरता होगी (अगर कोई ऐसा कर सकता है)। दूसरा विकल्प हमेशा सब कुछ के लिए लोकेल निर्दिष्ट करना होगा। आप देख सकते हैं कि कितना परेशान होगा। तो यह संदर्भ के कॉन्फ़िगरेशन के अंदर है।

तो यह अजीब है, लेकिन यह स्वतंत्रता और सुरक्षा, और सुविधा की एक अतिरिक्त डिग्री प्रदान करता है। अधिकांश समय यह Locale.getDefault() होगा क्योंकि आपका एप्लिकेशन उस प्रक्रिया से शुरू किया गया था जिसका मूल संदर्भ Locale.getDefault() में प्रारंभ किया गया था। आम तौर पर मैं Locale.getDefault() मान का उपयोग करने से दूर शर्मिंदा होगा। उपभोक्ता ऐप विकास में कई बार नहीं होते हैं जब यह कुछ ऐसा होगा जो विश्वसनीय होना चाहिए।

फिर से तथ्य पर आधारित नहीं है क्योंकि मैं ओएस देव नहीं हूं, जो ज्यादातर सिस्टम के पेशेवरों और विपक्ष का विश्लेषण करने पर आधारित है। मुझे लगता है कि विन्यास में लोकेल पूरी तरह से उचित है।

+0

पता लेआउट के लिए एक और लोकेल का उपयोग करना केस केस का एक बड़ा उदाहरण है। – Wernight

+1

एपीआई स्तर 24 में 'प्राप्त कॉन्फ़िगरेशन()। लोकेल' [बहिष्कृत] [https://developer.android.com/reference/android/content/res/Configuration.html#locale) था, अनुशंसित तरीका [अब ऐसा लगता है थोड़ा और वर्बोज़ बनें] (http://stackoverflow.com/q/38267213/56285)। – Jonik

संबंधित मुद्दे