सुलेख से प्रेरित होकर , मैंने एक संदर्भ आवरण तैयार किया। मेरे मामले में, मुझे अपने ऐप उपयोगकर्ताओं को ऐप भाषा बदलने के विकल्प के साथ प्रदान करने के लिए सिस्टम भाषा को अधिलेखित करने की आवश्यकता है लेकिन इसे किसी भी तर्क के साथ अनुकूलित किया जा सकता है जिसे आपको लागू करने की आवश्यकता है।
import android.annotation.TargetApi;
import android.content.Context;
import android.content.ContextWrapper;
import android.content.res.Configuration;
import android.os.Build;
import java.util.Locale;
public class MyContextWrapper extends ContextWrapper {
public MyContextWrapper(Context base) {
super(base);
}
@SuppressWarnings("deprecation")
public static ContextWrapper wrap(Context context, String language) {
Configuration config = context.getResources().getConfiguration();
Locale sysLocale = null;
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.N) {
sysLocale = getSystemLocale(config);
} else {
sysLocale = getSystemLocaleLegacy(config);
}
if (!language.equals("") && !sysLocale.getLanguage().equals(language)) {
Locale locale = new Locale(language);
Locale.setDefault(locale);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
setSystemLocale(config, locale);
} else {
setSystemLocaleLegacy(config, locale);
}
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
context = context.createConfigurationContext(config);
} else {
context.getResources().updateConfiguration(config, context.getResources().getDisplayMetrics());
}
return new MyContextWrapper(context);
}
@SuppressWarnings("deprecation")
public static Locale getSystemLocaleLegacy(Configuration config){
return config.locale;
}
@TargetApi(Build.VERSION_CODES.N)
public static Locale getSystemLocale(Configuration config){
return config.getLocales().get(0);
}
@SuppressWarnings("deprecation")
public static void setSystemLocaleLegacy(Configuration config, Locale locale){
config.locale = locale;
}
@TargetApi(Build.VERSION_CODES.N)
public static void setSystemLocale(Configuration config, Locale locale){
config.setLocale(locale);
}
}
और अपने रैपर को इंजेक्ट करने के लिए, प्रत्येक गतिविधि में निम्नलिखित कोड जोड़ें:
@Override
protected void attachBaseContext(Context newBase) {
super.attachBaseContext(MyContextWrapper.wrap(newBase,"fr"));
}
UPDATE 23/09/2020
उदाहरण के लिए डार्क मोड लागू करने के लिए ऐप थीम को ओवरराइड करने के मामले में, ContextThemeWrapper भाषा सेटिंग को तोड़ देगा इसलिए वांछित लोकेशन को रीसेट करने के लिए अपनी गतिविधि में निम्न कोड जोड़ें
@Override
public void applyOverrideConfiguration(Configuration overrideConfiguration) {
Locale locale = new Locale("fr");
overrideConfiguration.setLocale(locale);
super.applyOverrideConfiguration(overrideConfiguration);
}
अद्यतन 10/19/2018
कभी-कभी उन्मुखीकरण परिवर्तन के बाद, या डिफ़ॉल्ट सिस्टम कॉन्फ़िगरेशन के लिए कॉन्फ़िगरेशन ऑब्जेक्ट रीसेट करें / फिर से शुरू करें और परिणाम में हम एप्लिकेशन को अंग्रेजी "एन" टेक्स्ट प्रदर्शित करते हुए देखेंगे, भले ही हमने फ्रेंच "fr" लोकेल के साथ संदर्भ को लपेटा हो। । इसलिए और एक अच्छे अभ्यास के रूप में, गतिविधियों या टुकड़ों में एक वैश्विक चर में प्रसंग / गतिविधि वस्तु को कभी भी बनाए न रखें।
इसके अलावा, MyBaseFragment या MyBaseActivity में निम्नलिखित बनाएं और उपयोग करें:
public Context getMyContext(){
return MyContextWrapper.wrap(getContext(),"fr");
}
यह अभ्यास आपको 100% बग नि: शुल्क समाधान प्रदान करेगा।