有这样一种情形,不知道你是否遇到过。
我们要将 android 资源国际化,但是有时候还需要动态的改变字符串的内容,你不可能把所有的情况都写到 string.xml
里面,那怎么办?
假设,现在我们做了一款 app,但是检测到有些设备不支持我们 app 的某些功能,这个时候你需要提示用户:
您的手机暂时没有 ×× ,暂时您无法使用我们的该项功能!
解决这个问题,android 为我们提供了方便的方式:可以使用 xliff 或者不使用 xliff.
Xliff 是 XML Localization Interchange File Format 的缩写,中文名为 XML 本地化数据交换格式。
还是举几个例子吧,直接简单的说明问题。
1. 不使用 xliff
在 res/values/string.xml:
<string name="info">i am is %1$d ,and myname is %2$s</string>
在代码中:
Context mContext;
String info = mContext.getResources().getString(R.string.info, 10, "mark");
输出信息:i am is 10 ,and myname is mark
可以看出,%1$d 被 10 替代,%2$s 被 mark 替代。此时你会问,为什么要标注1、2,如果都写 1,会怎么样?
测试发现,写 1 那麽输出信息为:i am is 10 ,and myname is 10.
想更加深入的了解这个问题,可以参考 getString 源码。
public String getString(int id, Object... formatArgs) throws NotFoundException {
String raw = getString(id);
return String.format(mConfiguration.locale, raw, formatArgs);
}
其中,Object... formatArgs 表示一种数据类型形式,可以参考:
http://blog.csdn.net/androidbluetooth/article/details/6593632
2. 使用 xliff
在 res/values/string.xml:
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="info">i am is <xliff:g>%1$d</xliff:g> ,and myname is <xliff:g>%2$s</xliff:g></string>
</resources>
注意:xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" 要声明。
然后在代码中,可以像上面那样去使用了。效果一样的。
如果想更加人性化一点,可以这样写:
<string name="info">i am is <xliff:g id="age" example="20">%1$d</xliff:g>, and myname is <xliff:g id="name", example="jhon">%2$s</xliff:g></string>
id、example 只是表示说明。
那么,% 默认是格式化字符串的,如果想在 string.xml 里面使用 % 怎么办?
解决办法
1. 用%%来表示 1 个%,不要使用转意符号 \ ,没有作用!
<string name="value_perc">30%%</string>
2. 增加属性:formatted="false"
<string name="value_perc" formatted="false">30%</string>