前言
最近在做一个app,要求有中文模式与英文模式,其实就是国际化适配了,这个不难但是感觉非常麻烦呀,先看下我写的简单例子,这样比较直观点:
接下来我介绍下如何去实现它:
- 布局文件中的Textview的文本需要去引用values中的strings.xml中的字符串
- strings.xml默认的是中文,适配英文的话就需要再创建一个values-en的文件夹,并且其中也是strings.xml文件
对比一下values和values-en中的strings.xml
<resources>
<string name="app_name">语言切换</string>
<!--content-->
<string name="title">这是标题</string>
<string name="settings">设置</string>
<!--dialog-->
<string name="dialog_title">语言切换</string>
<string name="dialog_msg">请选择你要切换的语言</string>
<string name="dialog_positive">中文</string>
<string name="dialog_negative">英文</string>
<string name="toast_set_ch">设置成中文</string>
<string name="toast_set_en">设置成英文</string>
</resources>
<-----------------------分割线------------------------------->
<resources>
<string name="app_name">languageMore</string>
<!--content-->
<string name="title">title</string>
<string name="settings">settings</string>
<!--dialog-->
<string name="dialog_title">language switch</string>
<string name="dialog_msg">choose your language,please</string>
<string name="dialog_positive">Chinese</string>
<string name="dialog_negative">English</string>
<string name="toast_set_en">has change to English</string>
<string name="toast_set_ch">has change to Chinese</string>
</resources>
可以看出来name的名称都是一样的,只是内容中文与英文的区别
- 接下来就是代码中的实现了,其实一个方法就可以切换了,资源字符串文件配置好了,就可以自动去适配了。设置语言切换的代码如下:
/**
* 设置语言
*
* @param lauType
*/
private void set(String lauType) {
// 本地语言设置
Locale myLocale = new Locale(lauType);
Resources res = getResources();
DisplayMetrics dm = res.getDisplayMetrics();
Configuration conf = res.getConfiguration();
conf.locale = myLocale;
res.updateConfiguration(conf, dm);
}
传人的lauType的值可以为”zh_CN”, “en”, “ja”, “de” ,分别表示中文、英文、日语、德语的意思。比如点击弹出框确认切换成英文,则调用set(“en”);即可 。下面展示MainActivity的全部代码:
public class MainActivity extends AppCompatActivity {
private Button mButton;
private Context mContext = this;
// 中文 英文 日语 德语
private static final String[] language = {"zh_CN", "en", "ja", "de"};
public static final String CHINESE = language[0];
public static final String ENGLISH = language[1];
private String type;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mButton = findViewById(R.id.btn_setting);
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
AlertDialog dialog = new AlertDialog.Builder(mContext)
.setTitle(getString(R.string.title))
.setMessage(getResources().getString(R.string.dialog_title))
.setNegativeButton(getResources().getString(R.string.dialog_negative), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
type = ENGLISH;
set(type);
Toast.makeText(mContext, getResources().getString(R.string.toast_set_en), Toast.LENGTH_SHORT).show();
recreate();
}
})
.setPositiveButton(getResources().getString(R.string.dialog_positive), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
type = CHINESE;
set(type);
Toast.makeText(mContext, getResources().getString(R.string.toast_set_ch), Toast.LENGTH_SHORT).show();
recreate();
}
})
.create();
dialog.show();
}
});
}
/**
* 设置语言
*
* @param lauType
*/
private void set(String lauType) {
// 本地语言设置
Locale myLocale = new Locale(lauType);
Resources res = getResources();
DisplayMetrics dm = res.getDisplayMetrics();
Configuration conf = res.getConfiguration();
conf.locale = myLocale;
res.updateConfiguration(conf, dm);
}
}
这只是个简单例子,真实开发中最好把这个切换语言的状态保存在Shareprefences中,并且通过广播等的方式去通知其他页面语言改变,这个最好封装在基类Activity中来处理