internationalization (国际化)简称 i18n。在Android开发中,如果我们需要支持多个国家的语言,要该怎么办呢?这里我们就讨论下如何在Android studio中使用string.xml来支持i18n。
Android 对i18n和L10n提供了非常好的支持。android没有专门的API来提供国际化,而是通过对不同resource的命名来达到国际化。
在Android studio项目中,res -> values -> strings.xml
Android studio配置string.xml
strings.xml用来配置字符串
<resources>
<string name="键名">字符串内容</string>
<string name="app_name">我的app名称</string>
</resources>
点击编辑器上的【Open editor】可以打开字符串可视化编辑窗口
java代码中使用strings.xml资源
在java代码中,使用etResources().getString()方法获取对应的字符串。
String s = getResources().getString(R.string.app_name);
如果使用了多种语言的strings.xml支持,在不同手机环境下,则会显示对应语言环境的strings.xml内容。
String格式化
很多情况下,我们需要实现固定字符串和变量拼接,类似C语言中printf函数,我们可以用占位符,很好的输出字符串内容。 在java中,也能使用字符串格式化来达到相同的效果
String s = String.formate("My name is %s","lizhijun");
同样,如果我们在strings.xml设置的内容为包含占位符的字符串,我们也能这样来格式化字符串,比如:
String s = String.formate("getResources().getString(R.string.app_name)","lizhijun");
异常
格式化异常
Type error: Multiple substitutions specified in non-positional format; did you mean to add the formatted="false" attribute? 问题分析:异常定位的异常位置,正是有占位符的字符串这一行。
解决方案
增加formatted="false"属性
<string name="app_name" formatted="false">我的名字%s</string>
如果字符串中的确有特殊符号%,则可用%%或\%,这种方法会使得字符串丧失格式化的能力
<string name="app_name" formatted="false">增长率%d %%</string>