最近再做一款其他國家也能通用的app,所以涉及到語言國際化,本來感覺挺簡單的,直接獲取手機系統語言,然後app根據使用者系統語言變化而變化,但是這邊還要求要加使用者可以手動切換語言的功能,及涉及到退出應用肯定要儲存使用者之前設定好的語言偏好,在費勁了一下午終於搞定了,直接來看完整程式碼吧,實現過程也相對其他的比較簡單:
宣告 我這裡設定使用者可切換的語言為簡體中文,英語和繁體中文
效果圖:
程式碼實現:
MainActivity.class
class MainActivity : Activity() {
override fun onCreate(savedInstanceState: Bundle?) {
//初始化語言
LanguageUtil.checkLanguage(this)
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
initData()
}
private fun initData() {
nihao.setOnClickListener {
startActivity(Intent(this,LanguageChangeActivity::class.java))
}
}
}
MainActivity 裡面就是 一個文字,點選文字跳轉到語言選擇介面
public class LanguageUtil {
//預設跟隨系統語言,使用者上一次切換過,顯示使用者設定的語言
public static void checkLanguage(Context context) {
SharedPreferences sharedPreferences = context.getSharedPreferences(Contast.TABLE_TABLE, MODE_PRIVATE);
String language = sharedPreferences.getString(Contast.TABLE_LANGUAGE, "");
//獲取系統語言
String lablelang =context.getResources().getString(R.string.lable_lang).trim();
Log.i("BaseApplicationaa","current language is"+lablelang);
Log.i("BaseApplicationaa","save language is"+language);
String localObject1="";
DisplayMetrics localDisplayMetrics;
//本地儲存的和獲取系統的不一樣時
if(!language.equals(lablelang)){
if(!"".equals(language)){
localObject1=language;
}else {
localObject1=lablelang;
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString(Contast.TABLE_LANGUAGE, lablelang);
editor.commit();
}
}
Configuration localConfiguration;
Resources resources = context.getResources();
localConfiguration = resources.getConfiguration();
localDisplayMetrics = resources.getDisplayMetrics();
if ("EN".equals(localObject1)) {
localConfiguration.locale = Locale.ENGLISH;
}
if ("CN".equals(localObject1)) {
localConfiguration.locale = Locale.CHINESE;
}
if ("TW".equals(localObject1)) {
localConfiguration.locale = Locale.TAIWAN;
}
resources.updateConfiguration(localConfiguration, localDisplayMetrics);
}
}
這裡我用sp來儲存使用者手動切換的語言,在登入app時我進行判斷從而決定要顯示的語言
這裡的獲取語言我是在我的string資源裡面設定的,不同系統語言下獲取的值是不一樣的
這裡分別對應的語言是 英語,中文,繁體,繁體
LanguageChangeActivity 切換語言
public class LanguageChangeActivity extends Activity{
String flag = null;
private RadioGroup radioGroup_Language;
private RadioButton radio_cn;
private RadioButton radio_en;
private RadioButton radio_fa;
private SharedPreferences rememberUser;
private SharedPreferences.Editor edit;
@Override
public int onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_language_change);
initData();
initListener();
}
@Override
protected void initData() {
flag = getResources().getString(lable_lang).trim();
radioGroup_Language = findViewById(R.id.radioGroup_Language);
radio_cn = findViewById(R.id.radio_cn);
radio_en = findViewById(R.id.radio_en);
radio_fa = findViewById(R.id.radio_fa);
if ("CN".equals(flag)) {
radio_cn.setChecked(true);
}
if ("EN".equals(flag)) {
radio_en.setChecked(true);
}
if("TW".equals(flag)){
radio_fa.setChecked(true);
}
}
@Override
protected void initListener() {
radioGroup_Language.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
switch (checkedId){
case R.id.radio_cn:
flag = "CN";
break;
case R.id.radio_en:
flag = "EN";
break;
case R.id.radio_fa:
flag = "TW";
break;
}
Configuration localConfiguration;
DisplayMetrics localDisplayMetrics;
Resources resources = getResources();
localConfiguration = resources.getConfiguration();
localDisplayMetrics = resources.getDisplayMetrics();
if ("EN".equals(flag)) {
localConfiguration.locale = Locale.ENGLISH;
}
if ("CN".equals(flag)) {
localConfiguration.locale = Locale.CHINESE;
}
if("TW".equals(flag)){
localConfiguration.locale = Locale.TAIWAN;
}
//獲取模式
rememberUser = getSharedPreferences(Contast.TABLE_TABLE, MODE_PRIVATE);
edit = rememberUser.edit();
edit.putString(Contast.TABLE_LANGUAGE, flag);
edit.commit();
resources.updateConfiguration(localConfiguration, localDisplayMetrics);
finish();
//清空任務棧
Intent intent = new Intent(LanguageChangeActivity.this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
}
});
}
}
這裡用sp來儲存使用者手動設定的語言
activity_language_change.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:background="@color/grayWhite"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".activity.LanguageChangeActivity">
<RadioGroup android:id="@+id/radioGroup_Language"
android:layout_width="match_parent"
android:layout_marginLeft="5dp"
android:layout_height="wrap_content">
<RadioButton android:id="@+id/radio_cn"
android:textSize="16sp"
android:background="@color/white"
android:layout_width="match_parent"
android:layout_height="50dp"
android:checked="true"
android:text="@string/lable_china" />
<View android:background="@color/item_boderLine"
android:layout_width="match_parent"
android:layout_height="1dp" />
<RadioButton android:id="@+id/radio_en"
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="@color/white"
android:textSize="16sp"
android:text="@string/lable_english" />
<View android:background="@color/item_boderLine"
android:layout_width="match_parent"
android:layout_height="1dp" />
<RadioButton android:id="@+id/radio_fa"
android:layout_width="match_parent"
android:textSize="16sp"
android:layout_height="50dp"
android:background="@color/white"
android:text="@string/lable_fanti" />
</RadioGroup>
</LinearLayout>
歐克,這就結束了 是不是很簡單 ,