2011-12-31 14 views
22

वर्तमान में एंड्रॉइड ऐप उपयोगकर्ता को ग्रंथों को प्रदर्शित करने के लिए उपयोग की जाने वाली भाषा (लोकेल) कैसे प्राप्त करें?वर्तमान में एंड्रॉइड ऐप प्रदर्शित करने वाली भाषा (लोकेल) कैसे प्राप्त करें?

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


मैं एप्लिकेशन द्वारा प्रदर्शित भाषा (स्थान) का निर्धारण करने की जरूरत है, इस प्रकार अनुप्रयोग, सर्वर के लिए भाषा पारित कर सकते हैं तो यह लौटाए गए परिणाम स्थानीयकरण कर सकते हैं।

उत्तर

41

मेरा स्वयं का समाधान strings.xml कुंजी-मूल्य जोड़ी locale=<locale code> में जोड़ने के लिए है, इस प्रकार context.getResources().getString(R.string.locale) प्रयुक्त लोकेल के लिए लोकेल कोड विशिष्ट लौटाएगा।

+0

मुझे लगता है कि यह समाधान आपके प्रश्न का हिस्सा माना जाना चाहिए था। –

+1

@Yaqub अहमद मैं बाद में इस समाधान में आया था। लेकिन मैं अभी भी संभव बेहतर समाधान की प्रतीक्षा कर रहा हूं। –

+1

मुझे यह समाधान पसंद है क्योंकि तब मुझे केवल स्थानीय कोड प्राप्त करने की गारंटी है यदि मेरे अनुवाद संसाधनों का उपयोग किया जा रहा है। और यही वह समय है जिसे मैं चाहता हूं। अन्यथा, अगर मुझे लोकेल प्राप्त करने में कुछ गलती हुई तो मुझे दूसरी भाषा में एक भाषा और अन्य स्ट्रिंग संसाधनों में तिथियां मिल सकती हैं। – Suragch

32

यह अपने अनुप्रयोग विन्यास पर है, तो उसे अपने साथ प्राप्त कर सकते हैं:

getResources().getConfiguration().locale 

इस से

Locale.getDefault() 

अलग है और एप्लिकेशन जो अलग हो सकता है का उपयोग करता है लोकेल को दर्शाता है।

यह क्योंकि डेवलपर एप्लिकेशन विन्यास को अपडेट करके इसे बदल सकते हैं अलग हो सकता है, जांच: Resources.updateConfiguration

+0

आपके द्वारा सूचीबद्ध पहली एफएन के लिए दस्तावेज़ "लोकेल संसाधन योग्यता के अनुरूप स्थानीय लोकेल के लिए वर्तमान उपयोगकर्ता वरीयता" कहते हैं। यदि यह 'वर्तमान उपयोगकर्ता वरीयता' है तो यह दूसरे एफएन से अलग कैसे है। किसी भी तरह से, लोकेल क्लास का कौन सा फ़ंक्शन लोकेल कोड स्ट्रिंग (संसाधन एक्सटेंशन के समतुल्य) प्राप्त करने के लिए एक कॉल करता है जिसे सर्वर पर वापस भेजा जा सकता है (मूल प्रश्न के रूप में)? – Tom

+0

यह उत्तर 'लोकेल' (कोड की पहली पंक्ति) प्राप्त करने का सही तरीका बताता है। लेकिन यह गलत है कि एक अंतर है: 'Locale.getDefault() 'पहले उदाहरण के बराबर है। यदि आप भाषा कोड प्राप्त करना चाहते हैं, तो आपको 'getLanguage() 'कॉल करना होगा। – caw

+6

दुर्भाग्यवश, यह मेरी तरह काम नहीं करता है। यदि सिस्टम भाषा सेट करें, उदाहरण के लिए, डांस्क (डेनिश) के लिए, 'getResources()। GetConfiguration()। लोकेल' da_DK देता है, जबकि अंग्रेज़ी स्ट्रिंग्स प्रदर्शित करता है ('value/strings.xml' से)। –

0

आप नीचे दिए गए कोड का उपयोग कर सकते हैं। उदाहरण के लिए, नीचे प्रस्तुत किए गए कार्यों को कक्षा के अंदर रखा जा सकता है, जो कि कक्षा वर्ग को बढ़ाया गया है।

public class MyApplication extends Application { 
    ... 
    public static String APP_LANG; 
    private Context ctx = getBaseContext(); 
    private Resources res = ctx.getResources(); 
    public SharedPreferences settingPrefs; 
    ... 

    public void restoreAppLanguage(){ 
    /** 
    *Use this method to store the app language with other preferences. 
    *This makes it possible to use the language set before, at any time, whenever 
    *the app will started. 
    */ 
     settingPrefs = getSharedPreferences("ConfigData", MODE_PRIVATE); 
     String lang = settingPrefs.getString("AppLanguage", ""); 
     if(!settingPrefs.getAll().isEmpty() && lang.length() == 2){ 
      Locale myLocale; 
      myLocale = new Locale(lang); 
      Locale.setDefault(myLocale); 
      Configuration config = new Configuration(); 
      config.locale = myLocale; 
      res.updateConfiguration(config, res.getDisplayMetrics()); 
     } 
    } 

    public void storeAppLanguage(int lang) { 
    /** 
    *Store app language on demand 
    */ 
     settingPrefs = getSharedPreferences("ConfigData", MODE_PRIVATE); 
     Editor ed = settingPrefs.edit(); 

     Locale myLocale; 
     myLocale = new Locale(lang); 
     Locale.setDefault(myLocale); 
     Configuration config = new Configuration(); 
     config.locale = myLocale; 
     res.updateConfiguration(config, res.getDisplayMetrics()); 
     ed.putString("AppLanguage", lang); 

     ed.commit(); 
    } 

    public void setAppLanguage(String lang){ 
    /** 
    *Use this method together with getAppLanguage() to set and then restore 
    *language, whereever you need, for example, the specifically localized 
    *resources. 
    */ 
     Locale myLocale; 
     myLocale = new Locale(lang); 
     Locale.setDefault(myLocale); 
     Configuration config = new Configuration(); 
     config.locale = myLocale; 
     res.updateConfiguration(config, res.getDisplayMetrics()); 
    } 

    public void getAppLanguage(){ 
    /** 
    *Use this method to obtain the current app language name 
    */ 
     settingPrefs = getSharedPreferences("ConfigData",MODE_PRIVATE); 
     String lang = settingPrefs.getString("AppLanguage", ""); 
     if(!settingPrefs.getAll().isEmpty() && lang.length() == 2){ 
      APP_LANG = lang; 
     } 
     else APP_LANG = Locale.getDefault().getLanguage(); 
    } 
} 

और फिर जहाँ भी मुख्य कोड में हम लिख सकते हैं:

public class MainActivity extends ActionBarActivity { 
    ... 
    MyApplication app; 
    ... 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     ... 
     app = (MyApplication)getApplicationContext(); 
     ... 
     if(settingPrefs.getAll().isEmpty()){ 
      //Create language preference if it is not 
      app.storeAppLanguage(Locale.getDefault().getLanguage()); 
     } 

     //Restore previously used language 
     app.restoreAppLanguage(); 
     ... 
    } 
    ... 
    void SomethingToDo(){ 
     String lang = "en"; //"fr", "de", "es", "it", "ru" etc. 
     ... 
     app.getAppLanguage(); 
     app.setAppLanguage(lang); 
     ... 
     //do anything 
     ... 
     app.setAppLanguage(app.APP_LANG); 
    } 
    ... 
} 

आपके मामले में, आप कुछ ही समय, getAppLanguage() उपयोग कर सकते हैं और उसके बाद प्राप्त करने के लिए क्या भाषा वर्तमान में प्रयोग किया जाता है सार्वजनिक चर APP_LANG जाँच ।

0
public boolean CheckLocale(Context context, String app_language) { 
     Locale myLocale = new Locale(app_language); 
     Resources res = context.getResources(); 
     Configuration conf = res.getConfiguration(); 
     conf.locale = myLocale; 
     if(res.getConfiguration().locale==myLocale) 
      return true; 
     else 

     return false; 

    } 

इस विधि का प्रयोग करें।

3

निम्नलिखित कोड मेरे लिए काम करता है:

@TargetApi(Build.VERSION_CODES.M) 
private String getCurrentDefaultLocaleStr(Context context) { 
    Locale locale = context.getResources().getConfiguration().locale; 
    return locale.getDefault().toString(); 
} 

नोट: वहाँ कैसे आप Build.VERSION_CODES.N पर स्थान मिलना चाहिए पर एक मामूली परिवर्तन है। एन और ऊपर के लिए, कोड नीचे कोड ब्लॉक की तरह दिखना चाहिए; हालांकि, मैं इसे उपरोक्त कोड ब्लॉक में एम और नीचे के लिए करता हूं और यह एन और ऊपर के लिए भी संगत है।

// Build.VERSION_CODES.N 
    Locale locale = context.getResources().getConfiguration().getLocales().get(0); 

मैं राष्ट्रीय भाषाओं पर निम्नलिखित मिल रहा समर्थन करते हैं:

locale.getDefault:

English:    en 
Traditional Chinese: zh_TW_#Hant 
Simplified Chinese: zh_CN_#Hans 
Spanish:    es_ES 
French:    fr_FR 
Japanese:   ja_JP 
German:    de_DE 

वहाँ तरीकों कि विभिन्न स्वरूपों में एक ही स्थान की जानकारी देने की एक सूची है() .getCountry();
locale.getDefault()। GetISO3Language();
locale.getDefault()।getISO3Country();
locale.getDefault()। GetDisplayCountry();
locale.getDefault()। GetDisplayName();
locale.getDefault()। GetDisplayLanguage();
locale.getDefault()। GetLanguage();
locale.getDefault()। ToString();

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