在查阅修改Android源码的过程中经常能在字符串资源中看到类似下面的标签:
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="xliff_string">
今天是<xliff:g id="WEEK">%1$s</xliff:g>,<xliff:g id="DAY">%2$d</xliff:g>号
</string>
</resources>
今天我们就从是什么、怎么用、为什么三个方面来学习一下。
是什么:
通过查看相关资料后得知xliff是一个缩写,全称XML Localization Interchange File Format ,即XML本地化数据交换格式。
怎么用:
用法其实也很简单,可简单分为三步:
- 修改xml文件中的resources标签,指定xliff格式的命名空间。
- 在字符串标签中引入
- 在java文件中通过Resources类的的getString(@StringRes int id, Object… formatArgs)方法给占位符提供值,并获取对应的字符串。
下面是一个例子:
一:首先在xml中定义字符串以及指定命名空间。
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="xliff_string">
今天是<xliff:g id="WEEK">%1$s</xliff:g>,<xliff:g id="DAY">%2$d</xliff:g>号
</string>
</resources>
二:在java代码中引用并提供参数。
String s = getResources().getString(R.string.xliff_string,"星期一",13);
最终s的内容是:今天是星期一,13号。
现在我们来对用法进行分析:
在id=”WEEK”的xliff标签中的格式是%1$s,其中1代表的是它的位置,s代表了传入的应该是个字符串,因此getString中传入的值“星期一”作为了第一个参数进行了替换,同理,id=”DAY”的xliff标签数字为2,最后一个字母为d,代表传入的应该是一个整形,因此13作为第二个参数进行了替换。
为什么:
为什么通过xliff标签能够做到这一点呢?其实稍微查看一下源码就可以理解:
@NonNull
public String getString(@StringRes int id, Object... formatArgs) throws NotFoundException {
final String raw = getString(id);
return String.format(mResourcesImpl.getConfiguration().getLocales().get(0), raw,
formatArgs);
}
可以看到getString方法其实是调用了String.format方法来进行解析。相信很多人在学习xliff的用法的时候也会觉得xliff的参数格式很熟悉,这就是因为在Java层用的就是我们熟悉的String.format去进行解析的。
因此xliff的参数格式肯定也不只有上面这么少这么简单,具体的参数可参考String.format方法。
本篇博客到此为止,欢迎拍砖指教。