更改语言按钮
Change Language Button
我正在尝试创建一个按钮来更改应用语言。
我为该语言创建了字符串文件,并尝试使用此代码更改默认语言但没有成功:
public void changeLang(Context context, String language) {
Locale locale = new Locale(language);
Locale.setDefault(locale);
Configuration config = context.getResources().getConfiguration();
config.setLocale(locale);
context.createConfigurationContext(config);
context.getResources().updateConfiguration(config, context.getResources().getDisplayMetrics());
restartActivity();
}
private void restartActivity() {
Intent intent = getIntent();
finish();
startActivity(intent);
}
我是这样称呼它的:
changeLang(getApplicationContext(),"iw");
谢谢!
有几个选项和有用的库,请阅读此线程:Change app language programmatically in Android
我过去使用过这个库 (Android 9) 并且运行良好:
https://github.com/zeugma-solutions/locale-helper-android
所以我发现这段代码在几秒钟内解决了我的问题:
我创建了一个新的 Java 文件名“MyContextWrapper”,并在其中粘贴了以下代码:
/**
* Created by hosam azzam on 07/01/2017.
* CopyRights to Bassel Mourjan
*/
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.JELLY_BEAN_MR1) {
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);
}
}
在activity中:
private String LANG_CURRENT = "en";
findViewById(R.id.change).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (LANG_CURRENT.equals("en")) {
changeLang(MainActivity.this, "iw");
} else {
changeLang(MainActivity.this, "en");
}
finish();
startActivity(new Intent(MainActivity.this, MainActivity.class));
}
});
public void changeLang(Context context, String lang) {
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
SharedPreferences.Editor editor = preferences.edit();
editor.putString("Language", lang);
editor.apply();
}
@Override
protected void attachBaseContext(Context newBase) {
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(newBase);
LANG_CURRENT = preferences.getString("Language", "en");
super.attachBaseContext(MyContextWrapper.wrap(newBase, LANG_CURRENT));
}
更改语言并保存到共享偏好。
来源 - Here
我正在尝试创建一个按钮来更改应用语言。 我为该语言创建了字符串文件,并尝试使用此代码更改默认语言但没有成功:
public void changeLang(Context context, String language) {
Locale locale = new Locale(language);
Locale.setDefault(locale);
Configuration config = context.getResources().getConfiguration();
config.setLocale(locale);
context.createConfigurationContext(config);
context.getResources().updateConfiguration(config, context.getResources().getDisplayMetrics());
restartActivity();
}
private void restartActivity() {
Intent intent = getIntent();
finish();
startActivity(intent);
}
我是这样称呼它的:
changeLang(getApplicationContext(),"iw");
谢谢!
有几个选项和有用的库,请阅读此线程:Change app language programmatically in Android
我过去使用过这个库 (Android 9) 并且运行良好: https://github.com/zeugma-solutions/locale-helper-android
所以我发现这段代码在几秒钟内解决了我的问题:
我创建了一个新的 Java 文件名“MyContextWrapper”,并在其中粘贴了以下代码:
/**
* Created by hosam azzam on 07/01/2017.
* CopyRights to Bassel Mourjan
*/
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.JELLY_BEAN_MR1) {
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);
}
}
在activity中:
private String LANG_CURRENT = "en";
findViewById(R.id.change).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (LANG_CURRENT.equals("en")) {
changeLang(MainActivity.this, "iw");
} else {
changeLang(MainActivity.this, "en");
}
finish();
startActivity(new Intent(MainActivity.this, MainActivity.class));
}
});
public void changeLang(Context context, String lang) {
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
SharedPreferences.Editor editor = preferences.edit();
editor.putString("Language", lang);
editor.apply();
}
@Override
protected void attachBaseContext(Context newBase) {
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(newBase);
LANG_CURRENT = preferences.getString("Language", "en");
super.attachBaseContext(MyContextWrapper.wrap(newBase, LANG_CURRENT));
}
更改语言并保存到共享偏好。
来源 - Here