जब उपयोगकर्ता भाषा का चयन करता है तो ऐप की भाषा कैसे बदलें?


106

मैं चाहता हूं कि मेरा ऐप तीन भाषाओं स्पेनिश, पुर्तगाली और अंग्रेजी का समर्थन करे। और app में भाषा का चयन करने का विकल्प दें। मैंने बनाया है

1) 3 ड्रॉएबल फोल्डर drawable-es, drawable-pt, drawable।

2) 3 मान फ़ोल्डर के मूल्य-एस, मान-पीटी, मान। भाषाओं के अनुसार स्ट्रिंग स्ट्रिंग। xml मान।

मेरे पास भाषा का चयन करने के लिए imageView है। जब वह खुले मेनू पर क्लिक करें जिसमें विकल्प अंग्रेजी, स्पेनिश, पुर्तगाली हो।

मैंने इस कोड द्वारा विकल्प चयन पर लोकेल को ऐप के अंदर सेट किया

public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.en:
             Locale locale = new Locale("en"); 
             Locale.setDefault(locale);
             Configuration config = new Configuration();
             config.locale = locale;
             getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());
             Toast.makeText(this, "Locale in English !", Toast.LENGTH_LONG).show();
             break;

        case R.id.pt:
             Locale locale2 = new Locale("pt"); 
             Locale.setDefault(locale2);
             Configuration config2 = new Configuration();
             config2.locale = locale2;
             getBaseContext().getResources().updateConfiguration(config2, getBaseContext().getResources().getDisplayMetrics());

             Toast.makeText(this, "Locale in Portugal !", Toast.LENGTH_LONG).show();
             break;

        case R.id.es:
             Locale locale3 = new Locale("es"); 
             Locale.setDefault(locale3);
             Configuration config3 = new Configuration();
             config3.locale = locale3;
             getBaseContext().getResources().updateConfiguration(config3, getBaseContext().getResources().getDisplayMetrics());

             Toast.makeText(this, "Locale in Spain !", Toast.LENGTH_LONG).show();
             break;     
    }
    return super.onOptionsItemSelected(item);
}

मैंने घोषणापत्र में घोषणा की है- android: configChanges = "locale"

यह काम करता है लेकिन इसका कुछ मुद्दा है।

संकट:-

1) जब भाषा का चयन किया जाता है, तो स्क्रीन जिसमें भाषा चयन की छवि होती है, लेकिन अन्य स्क्रीन नहीं बदलती हैं।

2) ओरिएंटेशन चेंज ऐप के बाद फोन के लोकेल के अनुसार भाषा को पुनर्स्थापित करें।


1
दूसरी समस्या को जोड़ने का प्रयास करें: android:configChanges="locale"AndroidManifest.xml के अंदर अपनी गतिविधि के लिए
पार्थ दोशी

मैंने पहले ही अपने प्रदर्शन में हर सक्रियता को जोड़ दिया है।
मुकेश

आप निम्नलिखित लाइब्रेरी का उपयोग कर सकते हैं, जो भाषा सूची, आपकी सेटिंग स्क्रीन के लिए वरीयता प्रदान करती है, और आपके आवेदन में भाषा को ओवरराइड करती है: github.com/delight-im/Android-Languages
caw

जवाबों:


172

यह वेबपेज के लिए अंश है: http://android.programmerguru.com/android-localization-at-runtion/

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

public void setLocale(String lang) { 
    Locale myLocale = new Locale(lang); 
    Resources res = getResources(); 
    DisplayMetrics dm = res.getDisplayMetrics(); 
    Configuration conf = res.getConfiguration(); 
    conf.locale = myLocale; 
    res.updateConfiguration(conf, dm); 
    Intent refresh = new Intent(this, AndroidLocalize.class); 
    finish();
    startActivity(refresh); 
} 

सुनिश्चित करें कि आपने निम्नलिखित पैकेज आयात किए हैं:

import java.util.Locale; 
import android.os.Bundle; 
import android.app.Activity; 
import android.content.Intent; 
import android.content.res.Configuration; 
import android.content.res.Resources; 
import android.util.DisplayMetrics; 

गतिविधि में प्रकट करें android: configChanges = "locale | अभिविन्यास"


2
हां यकीनन। मैं वेब पेज का अंश प्रदान कर सकता हूं। जहां मुझे प्रदान करने की आवश्यकता है कृपया मुझे बताएं। धन्यवाद।
उधय १

3
फिनिश () जोड़ना सुनिश्चित करें ताकि आपके पास नेविगेशन स्टैक में आपकी गतिविधि की दो प्रतियां न हों।
जोएल टेपली

6
finish()पहले बुलाया जाना चाहिए startActivity(refresh)। अन्यथा एप्लिकेशन फिर से शुरू होने की बजाय गतिविधि से बाहर निकल सकता है।
मोहम्मद अली

10
नमस्ते, मैंने यह किया, यह काम करता है, लेकिन जब मैं एप्लिकेशन को पुनरारंभ करता हूं, तो यह डिफ़ॉल्ट भाषा पर वापस लौटता है ..
सोफ़ियान हसैनी

5
कॉन्फ़िगरेशन कॉन्फ़िगरेशन = नया कॉन्फ़िगरेशन (newConfig); config.locale = locale; मेरे मामले में यह संदेश मिल रहा है। स्थानीय स्तर पर एपीआई स्तर 25 में
मिलाया

9

अच्छा समाधान यहाँ बहुत अच्छी तरह से समझाया गया है। लेकिन यहाँ एक और है।

अपने स्वयं के CustomContextWrapperवर्ग का विस्तार करें ContextWrapperऔर इसका उपयोग पूर्ण अनुप्रयोग के लिए लोकेल सेटिंग बदलने के लिए करें। यहां उपयोग के साथ एक जिस्ट है

और फिर गतिविधि जीवनचक्र पद्धति में हिंदी भाषा के लिए CustomContextWrapperसहेजे गए स्थानीय पहचानकर्ता के साथ कॉल करें । यहाँ उपयोग:'hi'attachBaseContext

@Override
protected void attachBaseContext(Context newBase) {
    // fetch from shared preference also save the same when applying. Default here is en = English
    String language = MyPreferenceUtil.getInstance().getString("saved_locale", "en");
    super.attachBaseContext(MyContextWrapper.wrap(newBase, language));
}

लिंक के लिए धन्यवाद यह काम कर रहा है, लेकिन मैं कुछ बातें समझ में नहीं आया, मैं सिर्फ कहा जाता है MyContextWrapper.warpमें onAttachमेरे ऐप का सिर्फ एक टुकड़ा की लेकिन भाषा पूरे एप्लिकेशन के लिए बदल गया था, लेकिन गतिविधि खिताब परिवर्तित नहीं किया गया, मैं इसे लगता है इसलिए कि मैनिफ़ेस्ट टाइटल पूर्वता लेता है, लेकिन यदि मैं onAttachBaseContexअपने उप-अनुप्रयोग पर उसी विधि को कॉल करता हूं, तो गतिविधि टाइटल भी चयनित भाषा में बदल जाती है, लेकिन तब परिवर्तन केवल उस टुकड़े पर लागू होते हैं, जिसे मैंने ताना विधि में कहा था, ऐसा क्यों है ?
अभिनव चौहान

@AbhinavChauhan मुझे इस बात पर यकीन नहीं है कि यह सच है। मुझे उस एक की जांच करने की आवश्यकता है। मैंने इस मुद्दे का कभी सामना नहीं किया जब मैंने इस समाधान को लागू किया। हालांकि, यह लंबे समय से है और नए संस्करणों के लिए एंड्रॉइड कार्यान्वयन में कुछ बदलाव हो सकते हैं। वैकल्पिक रूप से इस पोस्ट पर कुछ नए उत्तर आज़माएं।
सूद

मैंने कई समाधान की कोशिश की, लेकिन उनमें से गैर ने काम किया या शायद मैंने उन्हें गलत तरीके से लागू किया, क्या आपकी कक्षा गतिविधियों के साथ अच्छा काम कर सकती है, मैं इसका खंडन करने की warpविधि का उपयोग कर रहा onAttachहूं, पहले मैंने कहा था कि मुझे इसे मुख्यता के टुकड़े के साथ करने की आवश्यकता है और भाषा में बदल गई यह पूरी तरह से सही है, लेकिन सभी अन्य टुकड़ों के लिए भाषा में परिवर्तन के लिए विन्यास में परिवर्तन होता है, इसलिए मुझे onattachसभी टुकड़ों में डालने की जरूरत है और प्रकट होने के बजाय मैंने एक्शनबार शीर्षक को कोड में सेट किया है, अब यह ऐप उम्मीद के मुताबिक काम कर रहा है। धन्यवाद
अभिनव चौहान

ठीक है! मुझे यकीन है कि आपको हर स्क्रीन के लिए ऐसा करने की ज़रूरत नहीं है, बस पहली गतिविधि जो लॉन्च होती है और attachBaseContextकेवल फ़ंक्शन के अंदर होती है। और यह सभी स्क्रीन के लिए करता है। क्या आपने अपने ऐप में सभी गतिविधियों के लिए एक `BaseActivity’ बनाई है?
सूद

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

6

आपको या तो android:configChanges="locale"प्रकट से हटा देना चाहिए , जिससे गतिविधि फिर से लोड हो जाएगी, या ओवरराइड onConfigurationChangedविधि:

@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
    // your code here, you can use newConfig.locale if you need to check the language
    // or just re-set all the labels to desired string resource
}

Android निकालना: configChanges = "लोकेल" प्रकट होने से एप्लिकेशन को पुनरारंभ होने से नहीं रोकता है। यदि यह प्रकट या जोड़ा नहीं जाता है, तो इसकी परवाह किए बिना इसे पुनः आरंभ किया जाएगा।
portfoliobuilder

मैं यह नहीं कह रहा हूं कि एंड्रॉइड को हटाने: कॉन्फिगरेशन = "लोकेल" प्रकट होने से ऐप को पुनरारंभ करने से रोकता है, मैं बिल्कुल विपरीत कह रहा हूं। अब, जब हमारे पास एंड्रॉइड है: कॉन्फिगरेशन = "लोकेल" मेनिफेस्ट में, यह एप्लिकेशन को उस समय पुनः लोड करने से रोकता है जब मैंने यह उत्तर लिखा था, मैं निश्चित रूप से यह नहीं कह सकता कि अब यह मामला है।
फ्रांस पोल्जक

6

उपरोक्त सभी @ उदय का कोड सही है लेकिन केवल एक चीज़ गायब है (build.gradle में डिफ़ॉल्ट कॉन्फ़िगरेशन)

public void setLocale(String lang) { 
Locale myLocale = new Locale(lang); 
Resources res = getResources(); 
DisplayMetrics dm = res.getDisplayMetrics(); 
Configuration conf = res.getConfiguration(); 
conf.locale = myLocale; 
res.updateConfiguration(conf, dm); 
Intent refresh = new Intent(this, AndroidLocalize.class); 
finish();
startActivity(refresh); 

}

मेरा सिर्फ इसलिए काम नहीं कर रहा था क्योंकि भाषाओं का विन्यास फाइल में नहीं था (build.gradle)

 defaultConfig {
    resConfigs "en", "hi", "kn"
}

उसके बाद, सभी भाषाएँ चलने लगीं


3
इट्स नॉट वर्किंग
शाह

क्या वाकई इसकी जरूरत है?
JCarlosR

1
@JCarlosR हाँ। जब मैंने कॉन्फ़िगर फ़ाइल में भाषाएँ जोड़ीं तो उधय का कोड चलने लगा
लोकेश तिवारी

3

संस्करण जारी करने वालों को इस कोड की कोशिश करो ..

public static void switchLocal(Context context, String lcode, Activity activity) {
        if (lcode.equalsIgnoreCase(""))
            return;
        Resources resources = context.getResources();
        Locale locale = new Locale(lcode);
        Locale.setDefault(locale);
        android.content.res.Configuration config = new 
        android.content.res.Configuration();
        config.locale = locale;
        resources.updateConfiguration(config, resources.getDisplayMetrics());
        //restart base activity 
        activity.finish();
        activity.startActivity(activity.getIntent());
    }

2

उधय का नमूना कोड अच्छी तरह से काम करता है। सोफिया हसैनी और चिराग सोलंकी के सवाल को छोड़कर, फिर से प्रवेश के लिए, यह काम नहीं करता है। मैं onCreate में गतिविधि को फिर से शुरू किए बिना उधय के कोड को कॉल करने की कोशिश करता हूं (), super.onCreate (saveInstanceState) से पहले; तब तो ठीक है! केवल थोड़ी समस्या है, मेनू स्ट्रिंग्स अभी भी सेट लोकेल में नहीं बदले हैं।

    public void setLocale(String lang) { //call this in onCreate()
      Locale myLocale = new Locale(lang); 
      Resources res = getResources(); 
      DisplayMetrics dm = res.getDisplayMetrics(); 
      Configuration conf = res.getConfiguration(); 
      conf.locale = myLocale; 
      res.updateConfiguration(conf, dm); 
      //Intent refresh = new Intent(this, AndroidLocalize.class); 
      //startActivity(refresh); 
      //finish();
    } 

मेनू स्ट्रिंग्स के साथ भी यही समस्या है। क्या आप समस्या का समाधान करते हैं?
एलेक्सज डिस

@ एलेक्स, मुझे मेनू स्ट्रिंग में समस्या को ठीक करने के तरीके नहीं मिले। लेकिन ऐप से बाहर निकलने और फिर रीइंटर करने के लिए पाया गया, मेनू स्ट्रिंग्स को आम तौर पर नए लोकेल में बदला जा सकता है।
फिशर

तुम्हारा मतलब है Intent refresh = new Intent(this, ThisActivity.class); startActivity(refresh); ?
एलेक्स

2
@ एलेक्स, नहीं! नए इरादे () और startActivity () को जोड़ने से एप्लिकेशन को पुनरारंभ करने पर यह डिफ़ॉल्ट भाषा पर वापस आ सकता है। मेरा मतलब यह है कि यदि उपयोगकर्ता ऐप से बाहर निकलते हैं और ऐप को फिर से दर्ज करते हैं, तो मेनू स्ट्रिंग्स को नए लोकेल में बदला जा सकता है।
फिशर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.