2012-02-28 13 views
41

इसलिए मैं डिवाइस/ऐप की वर्तमान लोकेल सेटिंग के बावजूद कई स्थानीय लोगों में स्ट्रिंग का मान प्राप्त करना चाहता हूं। मैं कैसे करूं?एंड्रॉइड में विभिन्न स्थानों से स्ट्रिंग कैसे प्राप्त करें?

असल में मैं क्या जरूरत है एक समारोह getString(int id, String locale) बजाय getString(int id)

मैं ऐसा कैसे कर सकता है?

धन्यवाद

+1

आपने वास्तव में इसे कैसे कार्यान्वित किया ?? कृपया उत्तर दें :) –

+0

स्वीकृत उत्तर –

+0

के रूप में संपत्ति का संदर्भ देने के लिए 'संसाधन बंडल' है ?? या वे हमारे res फ़ोल्डर का उपयोग कर सकते हैं? –

उत्तर

80

नोट यदि आपका न्यूनतम API 17+ है, इस सवाल का जवाब की तह तक सीधे जाओ। ,

Configuration conf = getResources().getConfiguration(); 
conf.locale = new Locale("pl"); 
DisplayMetrics metrics = new DisplayMetrics(); 
getWindowManager().getDefaultDisplay().getMetrics(metrics); 
Resources resources = new Resources(getAssets(), metrics, conf); 
String str = resources.getString(id); 

वैकल्पिक रूप से आप सिर्फ @ द्वारा उपयोग करते हुए विधि की ओर इशारा किया अपनी गतिविधि को पुनः आरंभ कर सकते हैं: अन्यथा, पर पढ़ें ...

आप अलग अलग स्थानों के लिए विभिन्न रेस फ़ोल्डरों है, तो आप कुछ इस तरह कर सकते हैं jyotiprakash।

नोटResources कॉलर इस तरह के कन्स्ट्रक्टर को एंड्रॉइड में आंतरिक रूप से कुछ बदलता है। चीज़ों को वापस पाने के लिए आपको अपने मूल लोकेल के साथ कन्स्ट्रक्टर का आह्वान करना होगा।

संपादित एक थोड़ा अलग (और कुछ हद क्लीनर) एक विशिष्ट स्थान से संसाधनों वापस लाने के लिए नुस्खा है:

Resources res = getResources(); 
Configuration conf = res.getConfiguration(); 
Locale savedLocale = conf.locale; 
conf.locale = desiredLocale; // whatever you want here 
res.updateConfiguration(conf, null); // second arg null means don't change 

// retrieve resources from desired locale 
String str = res.getString(id); 

// restore original locale 
conf.locale = savedLocale; 
res.updateConfiguration(conf, null); 

एपीआई स्तर 17 के रूप में, आप conf.setLocale() बजाय सीधे conf.locale स्थापित करने का उपयोग करना चाहिए। यदि आप दाएं से बाएं और बाएं से दाएं स्थान के बीच स्विचिंग करते हैं तो यह कॉन्फ़िगरेशन की लेआउट दिशा को सही ढंग से अपडेट करेगा। (लेआउट दिशा 17. में पेश किया गया था)

वहाँ (के रूप में @Nulano एक टिप्पणी में पता चलता है) एक नई Configuration वस्तु बनाने का कोई मतलब नहीं है, क्योंकि फोन करने updateConfigurationres.getConfiguration() फोन करके प्राप्त मूल विन्यास को बदलने के लिए जा रहा है।

यदि आप लोकेल के लिए कई स्ट्रिंग संसाधन लोड करने जा रहे हैं तो मैं इसे getString(int id, String locale) विधि में बंडल करने में संकोच करूंगा। स्थानीय स्थान बदलना (या तो रेसिपी का उपयोग करके) ढांचे के लिए सभी संसाधनों को पुनर्निर्मित करने के लिए बहुत सारे काम करने के लिए कहते हैं। स्थानीय लोगों को एक बार अपडेट करना बेहतर होता है, आपको जो भी चाहिए उसे पुनः प्राप्त करें, और फिर लोकेल को वापस सेट करें।

संपादित (धन्यवाद @Mygod के लिए):

यदि आपका न्यूनतम API स्तर 17+ है, वहाँ, एक बेहतर तरीका है के रूप में एक और धागा पर this answer में दिखाया गया है।

@NonNull Resources getLocalizedResources(Context context, Locale desiredLocale) { 
    Configuration conf = context.getResources().getConfiguration(); 
    conf = new Configuration(conf); 
    conf.setLocale(desiredLocale); 
    Context localizedContext = context.createConfigurationContext(conf); 
    return localizedContext.getResources(); 
} 

तो बस संसाधनों आप स्थानीय Resource वस्तु इस विधि द्वारा लौटाए से पसंद को पुनः प्राप्त: उदाहरण के लिए, आप एक से अधिक Resource वस्तुओं, प्रत्येक स्थान में आप की जरूरत के लिए एक, के साथ बना सकते हैं। संसाधनों को पुनर्प्राप्त करने के बाद कुछ भी रीसेट करने की आवश्यकता नहीं है।

+1

क्या आपको 'getResources() द्वारा लौटाए गए एक से नई कॉन्फ़िगरेशन नहीं करना चाहिए। कॉन्फ़िगरेशन() 'प्राप्त करें? GrepCode के अनुसार, यह संसाधनों के भीतर संग्रहीत एक स्थानीय उदाहरण देता है। लोकेल फ़ील्ड को बाद में बदलना संभवतः एंड्रॉइड उलझन में सही कारण है। आपको पहले और दूसरी पंक्ति के बीच 'conf = new Configuration (conf); '(लौटा कॉन्फ़िगरेशन क्लोन करने के लिए) करना चाहिए। – Nulano

+0

@ नूलानो - यह कोशिश करने लायक है, लेकिन मुझे नहीं लगता कि एंड्रॉइड "भ्रमित" क्यों है (जैसा कि आपने इसे रखा है) का स्रोत है। 'संसाधन' कन्स्ट्रक्टर के स्रोत को देखें और आप देखेंगे कि इस तरह की एक नई 'संसाधन' वस्तु बनाना इस प्रक्रिया की संपत्तियों (जाहिर तौर पर एक सिंगलटन) में गहरी चीजें बदलता है। एक बार मुझे एहसास हुआ कि चीजों को रीसेट करने की आवश्यकता होगी, मैंने बिल्कुल नीचे क्यों ट्रैकिंग को परेशान नहीं किया। एक नया 'संसाधन' ऑब्जेक्ट बनाने के लिए एक वैकल्पिक (शायद क्लीनर) दृष्टिकोण स्थानीय संसाधनों को बदलने के बाद 'resource.update कॉन्फ़िगरेशन (conf, null)' को कॉल करना है। –

+0

@TedHopp: हैलो सर, कृपया मेरे [प्रश्न] (http://stackoverflow.com/q/40398528) पर एक नज़र डालें। यदि आप मदद कर सकते हैं तो मैं वास्तव में सराहना करता हूं। धन्यवाद ... :) –

-9

आप के लिए ResourceBundle वर्ग कहा जाता है देख रहे हैं क्या। यहाँ लिंक है:

Google Docs for ResourceBundle

+6

-1, कोई स्पष्टीकरण –

+0

यह उत्तर कोई समझ नहीं आता है क्योंकि यह सेब और संतरे मिश्रण कर रहा है। जब आप 'res/values ​​/ strings.xml' में स्ट्रिंग डालते हैं, तो यह उत्तर बताता है कि मान ** ** संसाधन' बंडल 'के माध्यम से प्राप्त नहीं किया गया है। इसके बजाय इसे 'संदर्भ' से प्राप्त एंड्रॉइड-विशिष्ट 'संसाधन' ऑब्जेक्ट के माध्यम से एक्सेस किया जाता है। 'संसाधन बंडल' इस ऑपरेशन के लिए अप्रासंगिक है। इसके अलावा, फ़ील्ड 'R.string.my_message' एक 'int' मान है, और विधि' संसाधन Bundle.getString() 'विधि' स्ट्रिंग 'तर्क लेती है, इसलिए कोड उदाहरण सबसे अच्छा भ्रामक है। अंत में, इस उत्तर (मूल मुद्दे) में 'लोकेल' के लिए कोई भूमिका नहीं है। –

+0

@TedHopp - आप सही हैं, यह एक मस्तिष्क गोज़ था। विवादित जानकारी हटा दी गई। – BitBank

8

यहां Ted Hopp द्वारा वर्णित दृष्टिकोणों का एक संयुक्त संस्करण है।

public static String getLocaleStringResource(Locale requestedLocale, int resourceId, Context context) { 
    String result; 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { // use latest api 
     Configuration config = new Configuration(context.getResources().getConfiguration()); 
     config.setLocale(requestedLocale); 
     result = context.createConfigurationContext(config).getText(resourceId).toString(); 
    } 
    else { // support older android versions 
     Resources resources = context.getResources(); 
     Configuration conf = resources.getConfiguration(); 
     Locale savedLocale = conf.locale; 
     conf.locale = requestedLocale; 
     resources.updateConfiguration(conf, null); 

     // retrieve resources from desired locale 
     result = resources.getString(resourceId); 

     // restore original locale 
     conf.locale = savedLocale; 
     resources.updateConfiguration(conf, null); 
    } 

    return result; 
} 

प्रयोग उदाहरण: इस तरह, कोड किसी भी Android संस्करण के लिए काम करता

String englishName = getLocaleStringResource(new Locale("en"), id, R.string.name); 

नोट

जैसा कि पहले ही मूल जवाब में कहा गया है, यह अधिक को बदलने के लिए कुशल हो सकता है एक ही कॉन्फ़िगरेशन परिवर्तन और एकाधिक संसाधनों के साथ उपरोक्त कोड के एकाधिक कॉल .getString() कॉल।

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

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