GitHub地址(完整Demo下載)
https://github.com/zhouxu88/LanguageChange
最近在做一個多語言切換的功能祠丝,類似于微信的語言切換落塑,和微信類似憾赁,在設(shè)置界面打開切換語言的界面龙考,選擇語言后重啟 HomeActivity矾睦,語言切換完成枚冗,下次重新打開 App 赁温,也是用戶設(shè)置的語言
在不同的 value 文件夾下(例如 value 、value-en股囊、values-zh-rTW 文件夾)添加不同語言的 string.xml 文件稚疹,我們的項目添加了英文祭务、簡體中文义锥、繁體中文三種語言,如下圖所示:
其中英文需要翻譯偎行,繁體如果沒有專門翻譯的話,可以找個簡繁轉(zhuǎn)換網(wǎng)站熄云,直接將簡體中文轉(zhuǎn)成繁體中文缴允,我用的這個網(wǎng)站:在線中文簡體轉(zhuǎn)繁體。
怎么改變app采用的語言矗漾?(當(dāng)然薄料,只能改變string資源下的)
Resources resources = getContext().getResources();
DisplayMetrics dm = resources.getDisplayMetrics();
Configuration config = resources.getConfiguration();
// 設(shè)置APP的語言
config.locale = Locale.ENGLISH;
resources.updateConfiguration(config, dm);
Local的值很多誊役,如下:
Locale.getDefault() //跟隨系統(tǒng)設(shè)置
Locale.ENGLISH //全球英文
Locale.TRADITIONAL_CHINESE //繁體中文
Locale.SIMPLIFIED_CHINESE //簡體中文
語言設(shè)置的Activity
public class LanguageSettingActivity extends AppCompatActivity implements RadioGroup.OnCheckedChangeListener {
private static final String TAG = "LanguageSetting";
private RadioGroup radioGroup;
private String language; //當(dāng)前設(shè)置的語言
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_language_setting);
radioGroup = (RadioGroup) findViewById(R.id.language_rg);
radioGroup.setOnCheckedChangeListener(this);
}
@Override
public void onCheckedChanged(RadioGroup radioGroup, @IdRes int i) {
switch (i) {
case R.id.auto_rb:
//跟隨系統(tǒng)
language = Locale.getDefault().toString();
break;
case R.id.zh_rb:
//簡體中文
language = Locale.SIMPLIFIED_CHINESE.toString();
break;
case R.id.multi_zh_rb:
//繁體中文
language = Locale.TRADITIONAL_CHINESE.toString();
break;
case R.id.en_rb:
//英文
language = Locale.ENGLISH.toString();
break;
}
Log.i(TAG, "language:--------->" + language);
updateActivity(language);
}
/**
* 刷新語言
*/
public void updateActivity(String language) {
//在本地SP中保存當(dāng)前選擇的語言
SharedPrefUtils.writeString(this, MainConstant.LANGUAGE_RUN, language);
Locale local = LanguageUtils.getLocal(language);
Resources res = getResources();
DisplayMetrics dm = res.getDisplayMetrics();
Configuration conf = res.getConfiguration();
conf.locale = local;
res.updateConfiguration(conf, dm);
//設(shè)置好選擇的語言以后击孩,需要清除任務(wù)棧中的所有activity巩梢,打開首頁括蝠,確保以后進(jìn)入的頁面都是當(dāng)前選擇的語言
Intent intent = new Intent(this, MainActivity.class);
//清空任務(wù)棧確保當(dāng)前打開activit為前臺任務(wù)棧棧頂
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
finish();
}
}
由于前面我們改變的語言的時候已經(jīng)選擇結(jié)果緩存到了sp∮瞩耍現(xiàn)在這個sp終于有用了慨蓝。
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
setCurrLanguageMode();
}
//設(shè)置當(dāng)前APP的語言模式
private void setCurrLanguageMode() {
String language = SharedPrefUtils.getString(this, MainConstant.LANGUAGE_RUN, "");
Locale local = LanguageUtils.getLocal(language);
Resources res = getResources();
DisplayMetrics dm = res.getDisplayMetrics();
Configuration conf = res.getConfiguration();
conf.locale = local;
res.updateConfiguration(conf, dm);
}
}
所有國家的縮寫礼烈,給個地址
http://blog.sina.com.cn/s/blog_7981f91f01012wm7.html