एंड्रॉइड में एप्लिकेशन भाषा को प्रोग्रामेटिक रूप से बदलें


448

क्या एंड्रॉइड संसाधनों का उपयोग करते समय प्रोग्राम की भाषा को प्रोग्रामेटिक रूप से बदलना संभव है?

यदि नहीं, तो क्या किसी विशिष्ट भाषा में संसाधन का अनुरोध करना संभव है?

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


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

@MarcoW। क्या आप जानते हैं कि एंड्रॉइड 5.0 लॉलीपॉप के साथ एंड्रॉइड-लैंग्वेज काम करता है या नहीं?
neu242

1
@ neu242 हाँ, यह बिना किसी समस्या के Android 5.0 पर चलता है।
caw

1
आप निम्नलिखित पुस्तकालय का उपयोग कर सकते हैं: github.com/zeugma-solutions/locale-helper-android
josue.0

1
@ josue.0 कि पुस्तकालय वास्तव में इस के लिए सबसे साफ समाधान है
amitavk

जवाबों:


376

यह संभव है। आप लोकल सेट कर सकते हैं। हालाँकि, मैं यह सलाह नहीं दूंगा। हमने इसे शुरुआती चरणों में आज़माया है, यह मूल रूप से सिस्टम से लड़ रहा है।

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

Resources res = context.getResources();
// Change locale settings in the app.
DisplayMetrics dm = res.getDisplayMetrics();
android.content.res.Configuration conf = res.getConfiguration();
conf.setLocale(new Locale(language_code.toLowerCase())); // API 17+ only.
// Use conf.locale = new Locale(...) if targeting lower versions
res.updateConfiguration(conf, dm);

यदि आपके पास भाषा विशिष्ट सामग्री है - तो आप उस आधार को सेटिंग में बदल सकते हैं।


26 मार्च को अद्यतन 2020

public static void setLocale(Activitycontext) {
        Locale locale;
        Sessions session = new Sessions(context);
        //Log.e("Lan",session.getLanguage());
            locale = new Locale(langCode);
        Configuration config = new Configuration(context.getResources().getConfiguration());
        Locale.setDefault(locale);
        config.setLocale(locale);

       context.getBaseContext().getResources().updateConfiguration(config,
              context.getBaseContext().getResources().getDisplayMetrics());
    }

329
विश्वास नहीं कर सकता कि Android इसे इतना कठिन बनाता है। मैं वास्तव में नहीं देखता कि फोन के लोकेल और एप्लिकेशन के बीच एक STRICT एसोसिएशन क्यों होना चाहिए। मेरे पास हमेशा अंग्रेजी भाषा का उपयोग करने वाला मेरा फोन है, हालांकि मैं एक देशी अंग्रेजी वक्ता नहीं हूं। इसका कारण यह है कि अनुवादित अर्ध-तकनीकी शब्द मेरी अपनी भाषा में बहुत अजीब हो जाते हैं इसलिए अंग्रेजी बस इतना आसान है। इससे मुझे नेट से सलाह लेने में भी आसानी होती है। लेकिन इसका मतलब यह नहीं है कि मैं अंग्रेजी का उपयोग करने के लिए अपने फोन पर हर ऐप चाहता हूं (हालांकि पूरी तरह से ठीक है जो डिफ़ॉल्ट है)। मैं चुनने में सक्षम होना चाहता हूँ !!!
पीटर

9
ओह, शुरू की गई एपीआई स्तर 17 की तरह दिखता है Context.createConfigurationContext(), जिसका उपयोग डिफ़ॉल्ट संदर्भ को स्थानीय-विशिष्ट कॉन्फ़िगरेशन के साथ लपेटने के लिए किया जा सकता है और फिर getResourcesउस पर कॉल कर सकते हैं बिना संसाधन ऑब्जेक्ट पर कॉन्फ़िगरेशन को अपडेट किए।
JAB

8
आपको इसे प्रत्येक गतिविधि के onCreate () में डालने की आवश्यकता है। अन्यथा यह सिस्टम द्वारा ओवरराइड हो सकता है - उदाहरण के लिए जब आप अपने डिवाइस को परिदृश्य में बदलते हैं और आपकी गतिविधि नए (सिस्टम द्वारा प्रदान की गई) कॉन्फ़िगरेशन के साथ फिर से जुड़ जाती है।
Zsolt Safrany

14
यदि आप "आरएल" जैसे आरटीएल लोकेल सेट करते हैं और चाहते हैं कि आपका-आर्टर्ल संसाधन फ़ोल्डर भी काम करे, तो conf.setLayoutDirection (लोकेल) को भी कॉल करें;
Zsolt Safrany

3
@ZsoltSafrany - एक कॉल को जोड़ने के बजाय conf.setLayoutDirection(locale), आप बदल सकते हैं conf.locale = new Locale(...))के साथ conf.setLocale(new Locale(...))। यह आंतरिक रूप से कॉल करेगा setLayoutDirection
टेड होप

180

यह कोड वास्तव में काम करता है:

fa = फारसी, en = अंग्रेजी

languageToLoadचर में अपना भाषा कोड दर्ज करें :

import android.app.Activity;
import android.content.res.Configuration;
import android.os.Bundle;

public class Main extends Activity {
  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    String languageToLoad  = "fa"; // your language
    Locale locale = new Locale(languageToLoad); 
    Locale.setDefault(locale);
    Configuration config = new Configuration();
    config.locale = locale;
    getBaseContext().getResources().updateConfiguration(config, 
      getBaseContext().getResources().getDisplayMetrics());
    this.setContentView(R.layout.main);
  }
}

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

2
@ बफ़लो, यह Resources.updateConfigurationविधि के लिए सिर्फ दूसरा तर्क है । मैंने इसे और अधिक स्पष्ट करने के लिए कोड को इंडेंट किया है।
Czechnology

5
यह लॉन्चिंग गतिविधि में सेटिंग पर सभी गतिविधियों के लिए अच्छी तरह से काम कर रहा है। लेकिन, एक्शन बार शीर्षक अप्रभावित लगता है और फिर भी डिफ़ॉल्ट भाषा प्रदर्शित करता रहता है। किसी भी विचार मैं क्या याद किया हो सकता है?
AndroidMechanic - वायरल पटेल

8
Config.locale को पदावनत किया जाता है
झो

2
इसके बजाय "config.locale = locale?" "if (Build.VERSION.SDK_INT> = 17) का उपयोग करें {config.setLocale (लोकेल);} और {config.locale = locale;}
roghayeh hosseini

36

मैं प्रोग्रामेटिक रूप से सिस्टम लैंग्वेज को बदलने का तरीका ढूंढ रहा था। जबकि मैं पूरी तरह से समझता हूं कि एक सामान्य अनुप्रयोग को कभी भी ऐसा नहीं करना चाहिए और इसके बजाय:

  • उपयोगकर्ता को मैन्युअल रूप से बदलने के लिए सिस्टम सेटिंग्स को इंगित (एक इरादे के माध्यम से) किया जाना चाहिए
  • आवेदन को एलेक्स के उत्तर में वर्णित के समान ही अपने स्थानीयकरण को संभालना चाहिए

वास्तव में सिस्टम की भाषा को प्रोग्रामेटिक रूप से बदलने की आवश्यकता थी।

यह अनिर्दिष्ट एपीआई है और इस प्रकार इसका उपयोग बाजार / अंतिम-उपयोगकर्ता अनुप्रयोगों के लिए नहीं किया जाना चाहिए!

वैसे भी मैंने पाया समाधान हल:

  Locale locale = new Locale(targetLocaleAsString);

  Class amnClass = Class.forName("android.app.ActivityManagerNative");
  Object amn = null;
  Configuration config = null;

  // amn = ActivityManagerNative.getDefault();
  Method methodGetDefault = amnClass.getMethod("getDefault");
  methodGetDefault.setAccessible(true);
  amn = methodGetDefault.invoke(amnClass);

  // config = amn.getConfiguration();
  Method methodGetConfiguration = amnClass.getMethod("getConfiguration");
  methodGetConfiguration.setAccessible(true);
  config = (Configuration) methodGetConfiguration.invoke(amn);

  // config.userSetLocale = true;
  Class configClass = config.getClass();
  Field f = configClass.getField("userSetLocale");
  f.setBoolean(config, true);

  // set the locale to the new value
  config.locale = locale;

  // amn.updateConfiguration(config);
  Method methodUpdateConfiguration = amnClass.getMethod("updateConfiguration", Configuration.class);
  methodUpdateConfiguration.setAccessible(true);
  methodUpdateConfiguration.invoke(amn, config);

2
इनविटेशनगार्ट अपवाद दें
रवि

1
अच्छी तरह से निर्भर करता है कि मंगलाचरण को कहां फेंका जाता है। फिर आपको उस वर्ग को जानना चाहिए जो बदल गया था।
--सिरसोर

1
@ Rat-a-tat-a-tat-Ratatouille, एंड्रॉइड 4.2 से शुरू होकर android.permission.CHANGE_CONFIGURATIONकेवल प्रदर्शन कुंजी के साथ हस्ताक्षर किए गए एप्लिकेशन द्वारा प्रदान किया जा सकता है।
युंग

3
मैंने एंड्रॉइड 6.0 समस्या के आसपास काम करने के लिए अपना ऐप / सिस्टम / प्राइवेट-ऐप डाल दिया। विवरण यहाँ है
weiyin

1
@Ravi को काम करने के लिए मुझे अपना ऐप / सिस्टम / ऐप / सिस्टम / प्राइवेट-ऐप से ले जाना
पड़ा

31

यदि आप अपने सभी ऐप पर परिवर्तित की गई भाषा को बदलना चाहते हैं तो आपको दो काम करने होंगे।

सबसे पहले, एक आधार गतिविधि बनाएं और अपनी सभी गतिविधियों को इससे बढ़ाएँ:

public class BaseActivity extends AppCompatActivity {

    private Locale mCurrentLocale;

    @Override
    protected void onStart() {
        super.onStart();

        mCurrentLocale = getResources().getConfiguration().locale;
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        Locale locale = getLocale(this);

        if (!locale.equals(mCurrentLocale)) {

            mCurrentLocale = locale;
            recreate();
        }
    }

    public static Locale getLocale(Context context){
        SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);

        String lang = sharedPreferences.getString("language", "en");
        switch (lang) {
            case "English":
                lang = "en";
                break;
            case "Spanish":
                lang = "es";
                break;
        }
        return new Locale(lang);
    }
}

ध्यान दें कि मैं एक साझाकरण में नई भाषा को बचाता हूं।

दूसरा, इस तरह से एप्लिकेशन का एक्सटेंशन बनाएं:

    public class App extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        setLocale();
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        setLocale();
    }

    private void setLocale() {

        final Resources resources = getResources();
        final Configuration configuration = resources.getConfiguration();
        final Locale locale = getLocale(this);
        if (!configuration.locale.equals(locale)) {
            configuration.setLocale(locale);
            resources.updateConfiguration(configuration, null);
        }
    }
}

ध्यान दें कि GetLocale () यह ऊपर की तरह ही है।

बस इतना ही! मुझे उम्मीद है कि यह किसी की मदद कर सकता है।


ऐप गतिविधि यह एक प्राथमिक गतिविधि है, जो मेनऐक्टिविटी की तरह है? उदाहरण के लिए मैं setLocale () में अपनी विधि onCreate () में इसे हल कर सकता हूं?
मोरोज़ोव

एप्लिकेशन अनुप्रयोग का एक विस्तार है, यह एक गतिविधि नहीं है। मुझे समझ नहीं आ रहा है कि आपको क्या चाहिए, क्षमा करें। शायद आप मुझे फिर से समझाने की कोशिश कर सकते हैं :)
डैनियल एस।

1
मेरे जैसे एंड्रॉइड नॉब्स के लिए, यहां जानें कि क्या Applicationहै और कैसे उपयोग करना है। mobomo.com/2011/05/how-to-use-application-object-of-android
Siwei शेन at

2
configuration.locateपदावनत किया जाता है, सेटलेक को एपीआई 17+ की आवश्यकता होती है और अद्यतनसंक्रमण को हटा दिया जाता है
झो

19

इस लेख के अनुसार । आपको LocaleHelper.javaउस लेख में संदर्भित डाउनलोड करना होगा ।

  1. MyApplicationक्लास बनाएँ जो फैली होगीApplication
  2. attachBaseContext()भाषा अपडेट करने के लिए ओवरराइड करें ।
  3. इस वर्ग को प्रकट में पंजीकृत करें।

    public class MyApplication extends Application {
       @Override
       protected void attachBaseContext(Context base) {
        super.attachBaseContext(LocaleHelper.onAttach(base, "en"));
       }
    }
    
    <application
         android:name="com.package.MyApplication"
         .../>
  4. भाषा अपडेट करने के लिए बनाएं BaseActivityऔर ओवरराइड onAttach()करें। Android 6+ के लिए आवश्यक है

    public class BaseActivity extends Activity {
      @Override
      protected void attachBaseContext(Context base) {
        super.attachBaseContext(LocaleHelper.onAttach(base));
      }
    }
  5. अपने ऐप पर सभी गतिविधियाँ बढ़ाएँ BaseActivity

    public class LocaleHelper {
    
    private static final String SELECTED_LANGUAGE = "Locale.Helper.Selected.Language";
    
    public static Context onAttach(Context context) {
        String lang = getPersistedData(context, Locale.getDefault().getLanguage());
        return setLocale(context, lang);
    }
    
    public static Context onAttach(Context context, String defaultLanguage) {
        String lang = getPersistedData(context, defaultLanguage);
        return setLocale(context, lang);
    }
    
    public static String getLanguage(Context context) {
        return getPersistedData(context, Locale.getDefault().getLanguage());
    }
    
    public static Context setLocale(Context context, String language) {
        persist(context, language);
    
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            return updateResources(context, language);
        }
    
        return updateResourcesLegacy(context, language);
    }
    
    private static String getPersistedData(Context context, String defaultLanguage) {
        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
        return preferences.getString(SELECTED_LANGUAGE, defaultLanguage);
    }
    
    private static void persist(Context context, String language) {
        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
        SharedPreferences.Editor editor = preferences.edit();
    
        editor.putString(SELECTED_LANGUAGE, language);
        editor.apply();
    }
    
    @TargetApi(Build.VERSION_CODES.N)
    private static Context updateResources(Context context, String language) {
        Locale locale = new Locale(language);
        Locale.setDefault(locale);
    
        Configuration configuration = context.getResources().getConfiguration();
        configuration.setLocale(locale);
        configuration.setLayoutDirection(locale);
    
        return context.createConfigurationContext(configuration);
    }
    
    @SuppressWarnings("deprecation")
    private static Context updateResourcesLegacy(Context context, String language) {
        Locale locale = new Locale(language);
        Locale.setDefault(locale);
    
        Resources resources = context.getResources();
    
        Configuration configuration = resources.getConfiguration();
        configuration.locale = locale;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
            configuration.setLayoutDirection(locale);
        }
    
        resources.updateConfiguration(configuration, resources.getDisplayMetrics());
    
        return context;
    }
    }

Super.attachBaseContext (LocaleHelper.onAttach (newBase)) का उपयोग नहीं कर सकता क्योंकि मैं पहले से ही super.attachBaseContext (CalligraphyContextWrapper .wrap (newBase)) का उपयोग कर रहा हूँ
Rasel

1
आप एक दूसरे के साथ लपेट सकते हैं। Super.attachBaseContext (CalligraphyContextWrapper.wrap (LocaleHelper.onAttach (newBase)))
Yesia2508

15

बस एक अतिरिक्त टुकड़ा जोड़कर जिसने मुझे उलझा दिया।

जबकि अन्य उत्तर उदाहरण के लिए "डी" के साथ ठीक काम करते हैं

String lang = "de";
Locale locale = new Locale(lang); 
Locale.setDefault(locale);
Configuration config = new Configuration();
config.locale = locale;
getBaseContext().getResources().updateConfiguration(config, 
    getBaseContext().getResources().getDisplayMetrics());

उपरोक्त अभ्यस्त उदाहरण "fr_BE"लोकेल के साथ काम करते हैं इसलिए यह values-fr-rBEफ़ोल्डर या समान का उपयोग करेगा ।

काम करने के लिए निम्न थोड़े बदलाव की जरूरत है "fr_BE"

String lang = "fr";

//create a string for country
String country = "BE";
//use constructor with country
Locale locale = new Locale(lang, country);

Locale.setDefault(locale);
Configuration config = new Configuration();
config.locale = locale;
getBaseContext().getResources().updateConfiguration(config, 
    getBaseContext().getResources().getDisplayMetrics());

1
यदि आप वर्तमान ओपन एक्टिविटी कॉल में लोकेल परिवर्तन लागू करना चाहते हैंactivity.recreate()
To Kra

मुझे पता है कि मुझे पार्टी में देर हो रही है, लेकिन नए लोकेल (लैंग, देश) की मुझे ज़रूरत थी!
जैकब होलोवे

activity.recreate () यह कैसे काम करता है या यदि हम इसे शांत करते हैं तो स्ट्रिंग lang = "fr"; स्ट्रिंग देश = "BE"; कभी भी ओवरराइड नहीं करेगा कि यह कैसे चलेगा
अमितशर्मा

android.content.res.Configuration conf = res.getConfiguration();एक नया Configurationउदाहरण बनाने के बजाय उपयोग करने के बारे में क्या ? क्या एक ताजा उपयोग करने के लिए कोई लाभ है?
बजे बियांका डेनिक्यूक

14

मैं अपने ऐप के प्रारंभ के लिए जर्मन भाषा के लिए बदल गया हूं।

यहाँ मेरा सही कोड है किसी को भी मेरे लिए इसी का उपयोग करना चाहते हैं .. (कैसे प्रोग्राम में भाषा बदलने के लिए)

मेरा कोड:

Configuration config ; // variable declaration in globally

// this part is given inside onCreate Method starting and before setContentView()

public void onCreate(Bundle icic) 
{
    super.onCreate(icic);
    config = new Configuration(getResources().getConfiguration());
    config.locale = Locale.GERMAN ;
    getResources().updateConfiguration(config,getResources().getDisplayMetrics());

    setContentView(R.layout.newdesign);
}

1
@harikrishnan यह मेरे लिए काम नहीं कर रहा है और कीबोर्ड निर्दिष्ट भाषा में नहीं बदल रहा है .. आपने घोषणा में गतिविधि कैसे घोषित की है?
अवधनी वाई

13

मुझे पता है कि उत्तर देने में देर हो चुकी है लेकिन मुझे यह लेख यहाँ मिला है । जो पूरी प्रक्रिया को बहुत अच्छी तरह से समझाता है और आपको एक अच्छी तरह से संरचित कोड प्रदान करता है।

लोकेल हेल्पर वर्ग:

import android.annotation.TargetApi;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.os.Build;
import android.preference.PreferenceManager;

import java.util.Locale;

/**
 * This class is used to change your application locale and persist this change for the next time
 * that your app is going to be used.
 * <p/>
 * You can also change the locale of your application on the fly by using the setLocale method.
 * <p/>
 * Created by gunhansancar on 07/10/15.
 */
public class LocaleHelper {

    private static final String SELECTED_LANGUAGE = "Locale.Helper.Selected.Language";

    public static Context onAttach(Context context) {
        String lang = getPersistedData(context, Locale.getDefault().getLanguage());
        return setLocale(context, lang);
    }

    public static Context onAttach(Context context, String defaultLanguage) {
        String lang = getPersistedData(context, defaultLanguage);
        return setLocale(context, lang);
    }

    public static String getLanguage(Context context) {
        return getPersistedData(context, Locale.getDefault().getLanguage());
    }

    public static Context setLocale(Context context, String language) {
        persist(context, language);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            return updateResources(context, language);
        }

        return updateResourcesLegacy(context, language);
    }

    private static String getPersistedData(Context context, String defaultLanguage) {
        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
        return preferences.getString(SELECTED_LANGUAGE, defaultLanguage);
    }

    private static void persist(Context context, String language) {
        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
        SharedPreferences.Editor editor = preferences.edit();

        editor.putString(SELECTED_LANGUAGE, language);
        editor.apply();
    }

    @TargetApi(Build.VERSION_CODES.N)
    private static Context updateResources(Context context, String language) {
        Locale locale = new Locale(language);
        Locale.setDefault(locale);

        Configuration configuration = context.getResources().getConfiguration();
        configuration.setLocale(locale);
        configuration.setLayoutDirection(locale);

        return context.createConfigurationContext(configuration);
    }

    @SuppressWarnings("deprecation")
    private static Context updateResourcesLegacy(Context context, String language) {
        Locale locale = new Locale(language);
        Locale.setDefault(locale);

        Resources resources = context.getResources();

        Configuration configuration = resources.getConfiguration();
        configuration.locale = locale;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
            configuration.setLayoutDirection(locale);
        }

        resources.updateConfiguration(configuration, resources.getDisplayMetrics());

        return context;
    }
}

आपको अपने आवेदन में लोकेल सेटिंग को इनिशियलाइज़ करने के लिए AttBaseContext को ओवरराइड करना होगा और LocaleHelper.onAttach () को कॉल करना होगा।

import android.app.Application;
import android.content.Context;

import com.gunhansancar.changelanguageexample.helper.LocaleHelper;

public class MainApplication extends Application {
    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(LocaleHelper.onAttach(base, "en"));
    }
}

आपको बस इतना करना है कि आपको जोड़ना है

LocaleHelper.onCreate(this, "en");

आप जहां भी स्थान परिवर्तन करना चाहते हैं।


LocaleHelper लेख से एक वर्ग है। किसी भी लिंक को नीचे ले जाने का जोखिम है। कृपया अपने उत्तर में कोड जोड़ें।
झो

मैं अपने ऐप को पुनः आरंभ नहीं करना चाहता हूँ क्योंकि एप्लिकेशन रिकॉर्डिंग स्क्रीन की तरह कुछ कार्य कर रहा है। तो ऐप को फिर से शुरू किए बिना एंड्रॉइड 7.0 के लिए कोई समाधान नहीं है
प्रियंकाचौहान

1
@PriyankaChauhan मुझे लगता है कि लेख इस मामले को कवर करता है: वर्तमान में दृश्यमान लेआउट को अपडेट करने के लिए आपके पास दो विकल्प हैं: पहला , आप केवल एक-एक करके टेक्स्ट या किसी अन्य भाषा पर निर्भर संसाधनों को अपडेट कर सकते हैं।
मक्सिम तुराएव

नए को जोड़ने के लिए धन्यवाद createConfigurationContext, यह मददगार था
जेकॉबेलनवुड

1
onCreate या onAttach कॉल करने के लिए?
vanste25

12

एक क्लास बढ़ाएँ Applicationऔर एक स्टैटिक तरीका बनाएँ। फिर आप पहले सभी गतिविधियों में इस पद्धति को कॉल कर सकते हैं setContentView()

public class MyApp extends Application {

@Override
public void onCreate() {
    super.onCreate();
}

public static void setLocaleFa (Context context){
    Locale locale = new Locale("fa"); 
    Locale.setDefault(locale);
    Configuration config = new Configuration();
    config.locale = locale;
    context.getApplicationContext().getResources().updateConfiguration(config, null);
}

public static void setLocaleEn (Context context){
    Locale locale = new Locale("en_US"); 
    Locale.setDefault(locale);
    Configuration config = new Configuration();
    config.locale = locale;
    context.getApplicationContext().getResources().updateConfiguration(config, null);
}

}

गतिविधियों में उपयोग:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    MyApp.setLocaleFa(MainActivity.this);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.activity_main);
}

10

Android 7.0 नूगट (और निम्न) के लिए इस लेख का अनुसरण करें:

एंड्रॉइड में प्रोग्राम को भाषा में बदलें

पुराना उत्तर
इसमें RTL / LTR समर्थन शामिल है:

public static void changeLocale(Context context, Locale locale) {
    Configuration conf = context.getResources().getConfiguration();
    conf.locale = locale;
    Locale.setDefault(locale);

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
       conf.setLayoutDirection(conf.locale);
    }

    context.getResources().updateConfiguration(conf, context.getResources().getDisplayMetrics());
}

1
updateConfiguration को हटा दिया गया है। लिंक उपयोगी है, कृपया इसे अपने उत्तर में जोड़ें। (लिंक केवल उत्तर अच्छे नहीं हैं, क्योंकि लिंक को नीचे ले जाया जा सकता है। यदि ऐसा होता है, तो यह उत्तर बेकार है)
झो

8

एकमात्र समाधान जो मेरे लिए पूरी तरह से काम करता है, वह एप्लीकेशन पुनरारंभ तंत्र के साथ एलेक्स वोलोवॉय के कोड का एक संयोजन है:

void restartApplication() {
    Intent i = new Intent(MainTabActivity.context, MagicAppRestart.class);
    i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    MainTabActivity.context.startActivity(i);
}


/** This activity shows nothing; instead, it restarts the android process */
public class MagicAppRestart extends Activity {
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        finish();
    }

    protected void onResume() {
        super.onResume();
        startActivityForResult(new Intent(this, MainTabActivity.class), 0);         
    }
}

2
लोकल चेंज के बाद आप कॉल भी कर सकते हैंactivity.recreate()
To Kra

1
मैं अपने ऐप को पुनः आरंभ नहीं करना चाहता हूँ क्योंकि एप्लिकेशन रिकॉर्डिंग स्क्रीन की तरह कुछ कार्य कर रहा है। तो ऐप को फिर से शुरू किए बिना एंड्रॉइड 7.0 के लिए कोई समाधान नहीं है
प्रियंकाचौहान

7

मैं उसी मुद्दे का सामना कर रहा था। GitHub पर मुझे Android-LocalizationActivity लाइब्रेरी मिली

यह लाइब्रेरी रनटाइम पर आपके ऐप की भाषा को बदलने के लिए बहुत सरल बनाता है, जैसा कि आप नीचे दिए गए कोड नमूने में देख सकते हैं। नीचे नमूना कोड सहित एक नमूना परियोजना और अधिक जानकारी जीथब पृष्ठ पर पाई जा सकती है।

LocalizationActivity AppCompatActivity का विस्तार करती है, इसलिए आप इसका उपयोग तब भी कर सकते हैं जब आप Fragments का उपयोग कर रहे हों।

public class MainActivity extends LocalizationActivity implements View.OnClickListener {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_simple);

        findViewById(R.id.btn_th).setOnClickListener(this);
        findViewById(R.id.btn_en).setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        int id = v.getId();
        if (id == R.id.btn_en) {
            setLanguage("en");
        } else if (id == R.id.btn_th) {
            setLanguage("th");
        }
    }
}

7

नियत अद्यतन के लिए समय।

सबसे पहले, एपीआई के साथ पदावनत सूची जिसमें यह पदावनत किया गया था:

  • configuration.locale (एपीआई 17)
  • updateConfiguration(configuration, displaymetrics) (एपीआई 17)

हाल ही में उत्तर दिया गया कोई भी प्रश्न सही नहीं है, नई विधि का उपयोग है

createConfigurationContext अपडेटकॉन्फिगरेशन के लिए नई विधि है।

कुछ ने इसे इस तरह से प्रयोग किया है:

Configuration overrideConfiguration = ctx.getResources().getConfiguration();
Locale locale = new Locale("en_US");
overrideConfiguration.setLocale(locale);
createConfigurationContext(overrideConfiguration);

... लेकिन वह काम नहीं करता है। क्यों? विधि एक संदर्भ देती है, जो तब स्ट्रिंग्स.एक्सएमएल अनुवाद और अन्य स्थानीय संसाधनों (चित्र, लेआउट, जो भी हो) को संभालने के लिए उपयोग किया जाता है।

उचित उपयोग इस तरह है:

Configuration overrideConfiguration = ctx.getResources().getConfiguration();
Locale locale = new Locale("en_US");
overrideConfiguration.setLocale(locale);
//the configuration can be used for other stuff as well
Context context  = createConfigurationContext(overrideConfiguration);
Resources resources = context.getResources();

यदि आप अपने IDE में केवल कॉपी-पेस्ट करते हैं, तो आपको एक चेतावनी दिखाई दे सकती है कि API को आपको API 17 या उससे ऊपर के लक्ष्यीकरण की आवश्यकता है। इसे एक विधि में रखकर और एनोटेशन को जोड़कर काम किया जा सकता है@TargetApi(17)

लेकिन रुकें। पुराने एपीआई के बारे में क्या?

आपको TargetApi एनोटेशन के बिना updateConfiguration का उपयोग करके एक और विधि बनाने की आवश्यकता है।

Resources res = YourApplication.getInstance().getResources();
// Change locale settings in the app.
DisplayMetrics dm = res.getDisplayMetrics();
android.content.res.Configuration conf = res.getConfiguration();
conf.locale = new Locale("th");
res.updateConfiguration(conf, dm);

आपको यहां एक संदर्भ वापस करने की आवश्यकता नहीं है।

अब, इनका प्रबंधन करना मुश्किल हो सकता है। एपीआई 17+ में आपको स्थानीयकरण के आधार पर उपयुक्त संसाधन प्राप्त करने के लिए बनाए गए संदर्भ (या बनाए गए संदर्भ से संसाधन) की आवश्यकता है। तुमने इसे कैसे संभाला?

खैर, यह तरीका है मैं इसे कर:

/**
 * Full locale list: /programming/7973023/what-is-the-list-of-supported-languages-locales-on-android
 * @param lang language code (e.g. en_US)
 * @return the context
 * PLEASE READ: This method can be changed for usage outside an Activity. Simply add a COntext to the arguments
 */
public Context setLanguage(String lang/*, Context c*/){
    Context c = AndroidLauncher.this;//remove if the context argument is passed. This is a utility line, can be removed totally by replacing calls to c with the activity (if argument Context isn't passed)
    int API = Build.VERSION.SDK_INT;
    if(API >= 17){
        return setLanguage17(lang, c);
    }else{
        return setLanguageLegacy(lang, c);
    }
}

/**
 * Set language for API 17
 * @param lang
 * @param c
 * @return
 */
@TargetApi(17)
public Context setLanguage17(String lang, Context c){
    Configuration overrideConfiguration = c.getResources().getConfiguration();
    Locale locale = new Locale(lang);
    Locale.setDefault(locale);
    overrideConfiguration.setLocale(locale);
    //the configuration can be used for other stuff as well
    Context context  = createConfigurationContext(overrideConfiguration);//"local variable is redundant" if the below line is uncommented, it is needed
    //Resources resources = context.getResources();//If you want to pass the resources instead of a Context, uncomment this line and put it somewhere useful
    return context;
}

public Context setLanguageLegacy(String lang, Context c){
    Resources res = c.getResources();
    // Change locale settings in the app.
    DisplayMetrics dm = res.getDisplayMetrics();//Utility line
    android.content.res.Configuration conf = res.getConfiguration();

    conf.locale = new Locale(lang);//setLocale requires API 17+ - just like createConfigurationContext
    Locale.setDefault(conf.locale);
    res.updateConfiguration(conf, dm);

    //Using this method you don't need to modify the Context itself. Setting it at the start of the app is enough. As you
    //target both API's though, you want to return the context as you have no clue what is called. Now you can use the Context
    //supplied for both things
    return c;
}

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

कृपया इसे उपयोग करने से पहले पढ़ें

संसाधन मिलने पर आपको दिए गए संदर्भ का उपयोग करने की आवश्यकता है। क्यों? मैंने यहाँ अन्य उत्तर देखे हैं जो createConfigurationContext का उपयोग करते हैं और यह उस संदर्भ का उपयोग नहीं करता है जो यह देता है। इसे उस तरह से काम करने के लिए, अपडेटऑनफिगरेशन को कॉल करना होगा। जो पदावनत है। संसाधनों को प्राप्त करने के लिए विधि द्वारा लौटाए गए संदर्भ का उपयोग करें।

उदाहरण उपयोग :

कंस्ट्रक्टर या कहीं समान:

ctx = getLanguage(lang);//lang is loaded or generated. How you get the String lang is not something this answer handles (nor will handle in the future)

और फिर, जहाँ भी आप संसाधनों को प्राप्त करना चाहते हैं:

String fromResources = ctx.getString(R.string.helloworld);

किसी अन्य संदर्भ का उपयोग करना (सिद्धांत में) इसे तोड़ देगा।

AFAIK आपको अभी भी संवाद या टोस्ट दिखाने के लिए एक गतिविधि संदर्भ का उपयोग करना है। उसके लिए आप किसी गतिविधि का उपयोग कर सकते हैं (यदि आप बाहर हैं)


और अंत में, recreate()सामग्री को ताज़ा करने के लिए गतिविधि पर उपयोग करें। रिफ्रेश करने के लिए शॉर्टकट नहीं बनाना है।


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

7

अगर आप लिखेंगे

android:configChanges="locale"

हर गतिविधि में (मैनिफ़ेस्ट फ़ाइल में) तब हर बार आपके द्वारा दर्ज करने की आवश्यकता नहीं होती है Activity


11
यदि यह प्रकट होता है, तो यह रनटाइम में परिवर्तन का गठन कैसे करता है, जो ओपी चाहता था कि ऐसा प्रतीत होता है?
user316117

1
@ user316117 यह एंड्रॉइड को इंगित करता है कि ऐप लोकल कॉन्फ़िगरेशन से संबंधित सभी मामलों को आंतरिक रूप से हैंडल करेगा, न कि यह कि लोकल स्थिर है। मुझे यकीन नहीं है कि अगर गतिविधियों के बीच बदलते समय एंड्रॉइड को लोकेल को सेट करने से रोका जाएगा, हालांकि, जैसा कि मैंने केवल configChangesहैक के लिए उपयोग किया है, जो घुमावों / गतिविधि पर गतिविधि राज्य को संरक्षित करने के लिए उपयोग किया जाता है।
JAB

केवल विशिष्ट अंग्रेजी में भाषा कैसे सेट करें?
केवेश कंवल

1
... जब तक एंड्रॉइड आपकी गतिविधि को नहीं मारता, क्योंकि उसे अधिक रैम की आवश्यकता होती है
लुई सीएडी

@ बृजेश अगर हमने ऐप की भाषा बदल दी है, तो अगर हमारे पास ऐप के भीतर कुछ खोज विकल्प है, और यदि हम उस में खोज करते हैं, तो ऐप कैसे डेटा दिखाएगा, क्या हमें प्रत्येक भाषा के लिए कुछ अलग डेटाबेस विकसित करना चाहिए या कुछ एंड्रॉइड कोड सेटिंग है वह ऐप खोज के अनुसार डेटा दिखा सकता है?
विश्व प्रताप

5
Locale locale = new Locale("en");
Locale.setDefault(locale);

Configuration config = context.getResources().getConfiguration();
config.setLocale(locale);
context.createConfigurationContext(config);

महत्वपूर्ण अपडेट:

context.getResources().updateConfiguration(config, context.getResources().getDisplayMetrics());

ध्यान दें, कि SDK> = 21 पर, आपको 'Resources.updateConfiguration ()' को कॉल करना होगा, अन्यथा संसाधनों को अपडेट नहीं किया जाएगा।


updateConfiguration को हटा दिया गया है। AFAIK आप createConfigurationContext का उपयोग करते हैं और उस संदर्भ को लागू करते हैं जिसे आपको करना है ( Context ctx = createConfigurationContext(args);और उससे संसाधन प्राप्त करें
Zoe

मुझे पता है कि यह पदावनत है। लेकिन वैसे भी मैं किसी भी समाधान को नहीं जानता जो एंड्रॉइड 5 और उच्चतर पर काम कर सकता है।
Максим Петлюк

तो फिर आप स्पष्ट रूप से javadoc की जाँच नहीं की। आप createConfigurationContext
Zoe

ठीक है, लेकिन वैसे भी हमें कॉल करना चाहिए अद्यतन (), सही?
Максим Петлюк

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

4
/*change language at Run-time*/
//use method like that:
//setLocale("en");
 public void setLocale(String lang) { 
  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); 
 }

5
नई गतिविधि शुरू करने की कोई आवश्यकता नहीं है, बस वास्तविक activity.recreate()
को

4

Locale configurationactivityसामग्री सेट करने से पहले प्रत्येक में सेट किया जाना चाहिए -this.setContentView(R.layout.main);


लेकिन क्या होगा अगर आप इसे सेट पर कांटेक्ट व्यू () के बाद फ्लाई पर टॉगल करना चाहते हैं?
इगोरगानपोलस्की

2
लोकल चेंज के बाद आप कॉल भी कर सकते हैंactivity.recreate()
To Kra

4

सबसे पहले विभिन्न भाषाओं के लिए मल्टी स्ट्रिंग.एक्सएमएल बनाएं; तब onCreate()विधि के कोड के इस ब्लॉक का उपयोग करें :

super.onCreate(savedInstanceState);
String languageToLoad  = "fr"; // change your language here
Locale locale = new Locale(languageToLoad); 
Locale.setDefault(locale);
Configuration config = new Configuration();
config.locale = locale;
getBaseContext().getResources().updateConfiguration(config, 
  getBaseContext().getResources().getDisplayMetrics());
this.setContentView(R.layout.main);

धन्यवाद, यह कोड बहुत अच्छा काम करता है, मैंने एंड्रॉइड पर परीक्षण किया 5.x और 6.x बिना किसी समस्या के
innovaciones

4

यहाँ कुछ कोड है जो मेरे लिए काम करता है:

public class  MainActivity extends AppCompatActivity {
    public static String storeLang;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        SharedPreferences shp = PreferenceManager.getDefaultSharedPreferences(this);
        storeLang = shp.getString(getString(R.string.key_lang), "");

        // Create a new Locale object
        Locale locale = new Locale(storeLang);

        // Create a new configuration object
        Configuration config = new Configuration();
        // Set the locale of the new configuration
        config.locale = locale;
        // Update the configuration of the Accplication context
        getResources().updateConfiguration(
                config,
                getResources().getDisplayMetrics()
        );

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}

स्रोत: यहाँ


3

यहां सूचीबद्ध किसी भी समाधान ने मेरी मदद नहीं की।

एंड्रॉइड> = 7.0 पर भाषा स्विच नहीं की गई तो यदि AppCompatDelegate.setDefaultNightMode (AppCompatDelegate.MODE_NIGHT_YES)

यह LocaleUtils ठीक काम करता है: https://gist.github.com/GigigoGreenLabs/7d555c762ba2d3a810fe

LocaleUtils

public class LocaleUtils {

public static final String LAN_SPANISH      = "es";
public static final String LAN_PORTUGUESE   = "pt";
public static final String LAN_ENGLISH      = "en";

private static Locale sLocale;

public static void setLocale(Locale locale) {
    sLocale = locale;
    if(sLocale != null) {
        Locale.setDefault(sLocale);
    }
}

public static void updateConfig(ContextThemeWrapper wrapper) {
    if(sLocale != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
        Configuration configuration = new Configuration();
        configuration.setLocale(sLocale);
        wrapper.applyOverrideConfiguration(configuration);
    }
}

public static void updateConfig(Application app, Configuration configuration) {
    if(sLocale != null && Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) {
        //Wrapping the configuration to avoid Activity endless loop
        Configuration config = new Configuration(configuration);
        config.locale = sLocale;
        Resources res = app.getBaseContext().getResources();
        res.updateConfiguration(config, res.getDisplayMetrics());
    }
}
}

इस कोड को एप्लिकेशन में जोड़ा गया

public class App extends Application {
public void onCreate(){
    super.onCreate();

    LocaleUtils.setLocale(new Locale("iw"));
    LocaleUtils.updateConfig(this, getBaseContext().getResources().getConfiguration());
}

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    LocaleUtils.updateConfig(this, newConfig);
}
}

गतिविधि में कोड

public class BaseActivity extends AppCompatActivity {
    public BaseActivity() {
        LocaleUtils.updateConfig(this);
    }
}

2

एलेक्स Volovoy जवाब केवल मेरे लिए काम करता है अगर यह गतिविधि के onCreate विधि में है।

सभी तरीकों में काम करने वाला उत्तर दूसरे धागे में है

एंड्रॉइड में प्रोग्राम को भाषा में बदलें

यहाँ कोड का अनुकूलन है



    Resources standardResources = getBaseContext().getResources();

    AssetManager assets = standardResources.getAssets();

    DisplayMetrics metrics = standardResources.getDisplayMetrics();

    Configuration config = new Configuration(standardResources.getConfiguration());

    config.locale = new Locale(languageToLoad);

    Resources defaultResources = new Resources(assets, metrics, config);

आशा है कि यह मदद करता है।


19
आपने कहा "सभी तरीकों में काम करने वाला उत्तर एक और धागे में है" लेकिन आपका लिंक इस धागे की ओर
इशारा करता है

1
config.locale को पदावनत कर दिया जाता है
Zoe

2
पुनरावर्ती उत्तर,
स्टैकऑवरफ्लो

2

ध्यान दें कि उपयोग करने वाला यह समाधान updateConfiguration अब कुछ हफ्तों में Android M रिलीज़ के साथ काम नहीं करेगा । ऐसा करने का नया तरीका अब एपीआई एपीआईapplyOverrideConfiguration से विधि का उपयोग कर रहा हैContextThemeWrapper

जब से मैंने स्वयं समस्या का सामना किया है, आप यहां अपना पूरा समाधान पा सकते हैं: https://stackoverflow.com/a/31787201/2776572


मैं एंड्रॉइड 6.0.1 पर अपडेटकॉन्फ़िगरेशन कोड की कोशिश करता हूं और यह ठीक काम कर रहा है, मुझे नहीं पता कि Google ने इसे ठीक किया है लेकिन मैं इसे बिना किसी समस्या के उपयोग कर सकता हूं
innovaciones

1
@innovaciones पदावनत विधियां थोड़ी देर के लिए आसपास हैं। आखिरकार, इसे हटा दिया जाएगा। यह एक लंबा समय लगता है, लेकिन नए एपीआई के लिए कदम उठाना सबसे अच्छा है जितनी जल्दी हो सके मुद्दों को रोकने के लिए
ज़ो

1

कुछ कदम हैं जिन्हें आपको लागू करना चाहिए

सबसे पहले, आपको अपने कॉन्फ़िगरेशन के स्थान को बदलने की आवश्यकता है

Resources resources = context.getResources();

Configuration configuration = resources.getConfiguration();
configuration.locale = new Locale(language);

resources.updateConfiguration(configuration, resources.getDisplayMetrics());

दूसरा, यदि आप चाहते हैं कि आपका परिवर्तन दिखाई देने वाले लेआउट पर सीधे लागू हो, तो आप या तो सीधे विचारों को अपडेट कर सकते हैं या आप वर्तमान गतिविधि को पुनः आरंभ करने के लिए activity.recreate () को कॉल कर सकते हैं।

और आपको अपने परिवर्तन भी जारी रखने होंगे क्योंकि उपयोगकर्ता द्वारा आपका आवेदन बंद करने के बाद आप भाषा परिवर्तन को खो देंगे।

मैंने एंड्रॉइड में अपने ब्लॉग पोस्ट चेंज भाषा प्रोग्राम पर अधिक विस्तृत समाधान समझाया

असल में, आप बस अपने आवेदन वर्ग पर LocaleHelper.onCreate () कॉल करें और यदि आप मक्खी पर लोकेल बदलना चाहते हैं तो आप LocaleHelper.setLocale () कह सकते हैं।


@LunarWatcher हाँ यदि आप वास्तव में जीथब या जिस्ट पर कोड की जांच करते हैं, तो यह पहले से ही संभाला हुआ है।
गुनहान

1

यह तब काम कर रहा है जब मैं अपने TextView की टेक्स्ट भाषा बदलने के लिए बटन दबाता हूं। (strings.xml in values-de folder)

String languageToLoad = "de"; // your language
Configuration config = getBaseContext().getResources().getConfiguration();
Locale locale = new Locale(languageToLoad);
Locale.setDefault(locale);
config.locale = locale;
getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());
recreate();

1

LocaleHelper वर्ग जोड़ें

public class LocaleHelper{ 
private static final String SELECTED_LANGUAGE = "Locale.Helper.Selected.Language";
public static Context onAttach(Context context) {
    String lang = getPersistedData(context, Locale.getDefault().getLanguage());
    return setLocale(context, lang);
}

public static Context onAttach(Context context, String defaultLanguage) {
    String lang = getPersistedData(context, defaultLanguage);
    return setLocale(context, lang);
}

public static String getLanguage(Context context) {
    return getPersistedData(context, Locale.getDefault().getLanguage());
}
public static Context setLocale(Context context, String language) {
    persist(context, language);

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        return updateResources(context, language);
    }

    return updateResourcesLegacy(context, language);
}

private static String getPersistedData(Context context, String defaultLanguage) {
    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
    return preferences.getString(SELECTED_LANGUAGE, defaultLanguage);
}

private static void persist(Context context, String language) {
    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
    SharedPreferences.Editor editor = preferences.edit();

    editor.putString(SELECTED_LANGUAGE, language);
    editor.apply();
}

@TargetApi(Build.VERSION_CODES.N)
private static Context updateResources(Context context, String language) {
    Locale locale = new Locale(language);
    Locale.setDefault(locale);

    Configuration configuration = context.getResources().getConfiguration();
    configuration.setLocale(locale);
    configuration.setLayoutDirection(locale);

    return context.createConfigurationContext(configuration);
}

@SuppressWarnings("deprecation")
private static Context updateResourcesLegacy(Context context, String language) {
    Locale locale = new Locale(language);
    Locale.setDefault(locale);

    Resources resources = context.getResources();

    Configuration configuration = resources.getConfiguration();
    configuration.locale = locale;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
        configuration.setLayoutDirection(locale);
    }

    resources.updateConfiguration(configuration, resources.getDisplayMetrics());

    return context;
}
}

गतिविधि या विखंडन में

Context context = LocaleHelper.setLocale(this, App.getSharedPre().getLanguage());
Resource resources = context.getResources();

अब हर टेक्स्ट पर सेटटेक्स्ट

TextView tv = findViewById(R.id.tv);
tv.setText(resources.getString(R.string.tv));

0

स्वीकृत उत्तर के समान लेकिन 2017 संस्करण और जोड़ा गया पुनरारंभ (पुनः आरंभ किए बिना, कभी-कभी अगली गतिविधि अभी भी अंग्रेजी प्रदान करती है):

// Inside some activity...
private void changeDisplayLanguage(String langCode) {
// Step 1. Change the locale in the app's configuration
    Resources res = getResources();
    android.content.res.Configuration conf = res.getConfiguration();
    conf.setLocale(currentLocale);
    createConfigurationContext(conf);
// Step 2. IMPORTANT! you must restart the app to make sure it works 100%
    restart();
}
private void restart() {
    PackageManager packageManager = getPackageManager();
    Intent intent = packageManager.getLaunchIntentForPackage(getPackageName());
    ComponentName componentName = intent.getComponent();
    Intent mainIntent = IntentCompat.makeRestartActivityTask(componentName);
    mainIntent.putExtra("app_restarting", true);
    PrefUtils.putBoolean("app_restarting", true);
    startActivity(mainIntent);
    System.exit(0);
}

1) उपयोग खत्म () के बजाय 2) आप जिस एप्लिकेशन का उपयोग कर सकते हैं उसे पुनः आरंभ करने के लिए activity.recreate()3) संदर्भ को वापस कर दिया गया है मुझे लगता है कि संसाधनों को प्राप्त करने के लिए उपयोग किया जाना है
ज़ो

मैं अपने ऐप को पुनः आरंभ नहीं करना चाहता हूँ क्योंकि एप्लिकेशन रिकॉर्डिंग स्क्रीन की तरह कुछ कार्य कर रहा है। तो ऐप को फिर से शुरू किए बिना एंड्रॉइड 7.0 के लिए कोई समाधान नहीं है
प्रियंकाचौहान

0

सबसे पहले आप डायरेक्टरी नेम वैल्यूज़ बनाते हैं- "लैंग्वेज नेम" जैसे हिंदी में "हाय" लिखना और उसी स्ट्रिप फाइल का नाम इस डायरेक्टरी में कॉपी करना और वैल्यू में बदलाव नहीं करना जैसे कि बटन आदि जैसे आपके एक्शन में कोड के नीचे सेट होने के बाद पैरामीटर नहीं बदलते ...।

Locale myLocale = new Locale("hi");
Resources res = getResources();
DisplayMetrics dm = res.getDisplayMetrics();
Configuration conf = res.getConfiguration();
conf.locale = myLocale;
res.updateConfiguration(conf, dm);
Intent refresh = new Intent(Home.this, Home.class);
startActivity(refresh);
finish(); 

1
conf.localeपदावनत किया जाता है
ज़ो

0
private void setLanguage(String language) {
    Locale locale = new Locale(language);
    Locale.setDefault(locale);
    Configuration config = new Configuration();
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
        config.setLocale(locale);
    } else {
        config.locale = locale;
    }
    getResources().updateConfiguration(config,
            getResources().getDisplayMetrics());

}

1
मैं अपने ऐप को पुनः आरंभ नहीं करना चाहता हूँ क्योंकि एप्लिकेशन रिकॉर्डिंग स्क्रीन की तरह कुछ कार्य कर रहा है। तो ऐप को फिर से शुरू किए बिना एंड्रॉइड 7.0 के लिए कोई समाधान नहीं है
प्रियंकाचौहान

हाँ 6.0 पर यह मेरे लिए ठीक काम करता है, ऐप को फिर से शुरू किए बिना, भाषा बदल गई, लेकिन मैंने 7.0 पर परीक्षण नहीं किया
Adeeb karim

0

उदाहरण के लिए, हम अंग्रेजी भाषा सेट करते हैं:

 Configuration config = GetBaseContext().getResources().getConfiguration();
 Locale locale = new Locale("en");
 Locale.setDefault(locale);
 config.locale = locale;
 GetBaseContext().getResources().updateConfiguration(config, 
            GetBaseContext().getResources().getDisplayMetrics());

कृपया याद रखें, यह केवल तभी काम करता है जब भाषा डिवाइस सिस्टम में पाई जाती है, न केवल एप्लिकेशन में


0

अरबी / RTL समर्थन के लिए

  1. आपको अपनी भाषा सेटिंग को अपडेट करना होगा - अनुलग्नक के साथ संलग्न करें ()
  2. Android संस्करण N और उससे ऊपर के लिए आपको createConfigurationContext () और updateConfiguration () का उपयोग करना चाहिए - अन्यथा RTL लेआउट ठीक से काम नहीं कर रहा है

 @Override
    protected void attachBaseContext(Context newBase) {
        super.attachBaseContext(updateBaseContextLocale(newBase));
    }

    public Context updateBaseContextLocale(Context context) {
        String language = SharedPreference.getInstance().getValue(context, "lan");//it return "en", "ar" like this
        if (language == null || language.isEmpty()) {
            //when first time enter into app (get the device language and set it
            language = Locale.getDefault().getLanguage();
            if (language.equals("ar")) {
                SharedPreference.getInstance().save(mContext, "lan", "ar");
            }
        }
        Locale locale = new Locale(language);
        Locale.setDefault(locale);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            updateResourcesLocale(context, locale);
            return  updateResourcesLocaleLegacy(context, locale);
        }

        return updateResourcesLocaleLegacy(context, locale);
    }

    @TargetApi(Build.VERSION_CODES.N)
    private Context updateResourcesLocale(Context context, Locale locale) {
        Configuration configuration = context.getResources().getConfiguration();
        configuration.setLocale(locale);
        return context.createConfigurationContext(configuration);
    }

    @SuppressWarnings("deprecation")
    private Context updateResourcesLocaleLegacy(Context context, Locale locale) {
        Resources resources = context.getResources();
        Configuration configuration = resources.getConfiguration();
        configuration.locale = locale;
        resources.updateConfiguration(configuration, resources.getDisplayMetrics());
        return context;
    }

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