Kaligrafiden ilham alarak bir bağlam sarmalayıcı oluşturdum. Benim durumumda, uygulama kullanıcılarıma uygulama dilini değiştirme seçeneği sağlamak için sistem dilinin üzerine yazmam gerekiyor, ancak bu, uygulamanız gereken herhangi bir mantıkla özelleştirilebilir.
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);
}
}
ve sarmalayıcınızı enjekte etmek için, her aktivitede aşağıdaki kodu ekleyin:
@Override
protected void attachBaseContext(Context newBase) {
super.attachBaseContext(MyContextWrapper.wrap(newBase,"fr"));
}
GÜNCELLEME 22/12/2020
Karanlık modu desteklemek için ContextThemeWrapper'ın android Materyal kitaplığı uygulamasından sonra, dil ayarı bozulur ve dil ayarı kaybolur. Aylarca süren kafa tırmalamasından sonra, aşağıdaki kod Activity ve Fragment onCreate yöntemine eklenerek sorun çözüldü.
Context context = MyContextWrapper.wrap(this, "fr");
getResources().updateConfiguration(context.getResources().getConfiguration(), context.getResources().getDisplayMetrics());
GÜNCELLEME 10/19/2018
Bazen oryantasyon değişikliğinden veya etkinlik duraklatıldıktan / sürdürüldükten sonra Yapılandırma nesnesi varsayılan sistem Yapılandırmasına sıfırlanır ve sonuç olarak, içeriği Fransızca "fr" yerel ayarıyla sarmalamış olsak bile uygulamanın İngilizce "en" metnini görüntülediğini göreceğiz . Bu nedenle ve iyi bir uygulama olarak, Context / Activity nesnesini asla etkinliklerdeki veya parçalardaki genel bir değişkende tutmayın.
ayrıca, bir MyBaseFragment veya MyBaseActivity'de aşağıdakileri oluşturun ve kullanın:
public Context getMyContext(){
return MyContextWrapper.wrap(getContext(),"fr");
}
Bu uygulama size% 100 hatasız çözüm sağlayacaktır.