Android开发经验总结篇

国际化(多语言切换)

2018-04-26  本文已影响4人  zhengLH

【效果图】
(A)国家化(多语言选择)

国际化.png

(1)切换到中文

中文.png

(2)切换到英文

英文.png

【总结】做N套xml, 切换不同xml来实现N多语言切换。(注意:命名规则)
【步骤】
(1) 右击res目录,打开对应的对话框:

目录1.png

(2) 选择local选项,然后点击右推的按钮,创建和选择新的语言资源文件,注意以下这几个地方需要正确填写:

图片2.png 图片3.png

此时,你会发现在开发项目目录中多了一个文件夹和文件:

图片4.png

(3) 接着把默认的values/strings.xml中的内容全部复制到values-en/strings.xml中,然后把内容中的文字顺便翻译成对应的语言:(百度翻译,谷歌翻译都行)

中文翻译.png
英文翻译.png

【注】来到这里,资源文件就配置好了,以下是更改系统的语言设置。

Resources resources = context.getResources();
Configuration configuration = resources.getConfiguration();
configuration.locale = newLocale;
resources.updateConfiguration(configuration,                                                                                                                       
resources.getDisplayMetrics());//更新配置

【注】
一般的更改语言的选项都在App的设置里面,改变系统的Locale以后并不会马上生效,需要重启App以后才会有效。如果要及时生效,就需要重启MainActivity,方法如下:

 //重启MainActivity
Intent intent = new Intent(SettingActivity.this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK |           
   Intent.FLAG_ACTIVITY_NEW_TASK);                           
startActivity(intent);

【完整源代码】

【1】 使用

  /**
  * @Author Lee
  * @Time 2018/4/26
  * @Theme   多语言切换(国际化)
  */

public class MultilingualSwitchActivity extends AppCompatActivity implements View.OnClickListener {

private Dialog mDialod;
private Window window;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activit_multilingual);
    initView();

}

private void initView() {

    findViewById(R.id.tv_language).setOnClickListener(this);
}

private void showDialogLanguage() {

            mDialod = new Dialog(MultilingualSwitchActivity.this, R.style.dialog);
            mDialod.requestWindowFeature(Window.FEATURE_NO_TITLE);
            window = mDialod.getWindow();
            window.setGravity(Gravity.TOP | Gravity.RIGHT);
            window.setContentView(R.layout.dialog_language);

            TextView tvSingle = window.findViewById(R.id.tv_simple);
            TextView tvTradition = window.findViewById(R.id.tv_tradition);


            tvSingle.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {

                    mDialod.dismiss();
                    switchLanguage("zh");

                    Intent i = MultilingualSwitchActivity.this.getPackageManager().getLaunchIntentForPackage(MultilingualSwitchActivity.
                                 this.getPackageName());
                    i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                    startActivity(i);
                    MultilingualSwitchActivity.this.overridePendingTransition(0, 0);
                }
            });

            tvTradition.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {

                    mDialod.dismiss();
                    switchLanguage("hk");

                    Intent i = MultilingualSwitchActivity.this.getPackageManager().getLaunchIntentForPackage(MultilingualSwitchActivity.this.getPackageName());
                    i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                    startActivity(i);
                    MultilingualSwitchActivity.this.overridePendingTransition(0, 0);
                }
            });
                  mDialod.show();

        }


//核心设置的代码
protected void switchLanguage(String language) {

    Resources resources = getResources();
    Configuration config = resources.getConfiguration();
    DisplayMetrics dm = resources.getDisplayMetrics();
    switch (language) {
        case "zh":
            config.locale = Locale.CHINESE;
            resources.updateConfiguration(config, dm);
            break;
        case "hk":
            config.locale = Locale.ENGLISH;
            resources.updateConfiguration(config, dm);
            break;
        default:
            config.locale = Locale.US;
            resources.updateConfiguration(config, dm);
            break;
    }
}

@Override
public void onClick(View view) {

    showDialogLanguage();
    }
 }

【2】activit_multilingual 布局文件
【注意】 text 里面的文本 要用软引用 @string/... 这种格式,方能实现多语言切换。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="@dimen/margin_10dp">

<TextView
    android:id="@+id/tv_language"
    android:background="@color/colorOrange"
    android:layout_marginRight="8dp"
    android:layout_alignParentRight="true"
    android:padding="@dimen/padding_10dp"
    android:layout_gravity="right"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/change_language"
    android:textColor="@color/black"
    android:drawableRight="@mipmap/down"/>

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:layout_centerInParent="true"
    android:text="@string/content"/>

 </RelativeLayout>

【3】dialog_language 对话框布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/select_frame"
android:layout_marginTop="40dp"
android:layout_marginRight="@dimen/margin_10dp"
android:orientation="vertical">

<TextView
    android:id="@+id/tv_tradition"
    android:layout_width="wrap_content"
    android:paddingTop="@dimen/padding_10dp"
    android:paddingRight="@dimen/padding_20dp"
    android:paddingLeft="@dimen/padding_20dp"
    android:paddingBottom="@dimen/padding_10dp"
    android:layout_height="wrap_content"
    android:textColor="@color/main_color"
    android:text="繁体中文"/>

<View
    android:layout_width="match_parent"
    android:layout_height="0.5dp"
    android:paddingLeft="@dimen/padding_5dp"
    android:paddingRight="@dimen/padding_5dp"
    android:background="@color/colorD5D5D5"/>

<TextView
    android:id="@+id/tv_simple"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:paddingRight="@dimen/padding_20dp"
    android:paddingLeft="@dimen/padding_20dp"
    android:textColor="@color/main_color"
    android:paddingBottom="@dimen/padding_10dp"
    android:paddingTop="@dimen/padding_10dp"
    android:text="简体中文"/>

</LinearLayout>

【4】 style 文件 对话框样式

 <style name="dialog" parent="@android:style/Theme.Dialog">
    <item name="android:windowFrame">@null</item>
    <item name="android:windowIsFloating">true</item>
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:background">@android:color/transparent</item>
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:backgroundDimEnabled">true</item>
    <item name="android:backgroundDimAmount">0.6</item>
</style>

【参考】
(1) https://blog.csdn.net/qq_21983189/article/details/73735278
(2) https://blog.csdn.net/myth13141314/article/details/6203719

上一篇下一篇

猜你喜欢

热点阅读