对于个数,中文在单复数是没有区别的,所以我们平时开发中也不会注意到这个问题,但是别的语言中常常单复数有不同的表示。当App实现国际化功能后字符串的单复数问题越来越明显。以英文为例,在处理个数的时候单复数是不同形的,例如:
中文:1分钟,2分钟,…, n分钟
英文:1 minute,2 minutes,…,n minutes
面对这个问题,最初我想到的解决办法是minute(s),用这个(s)来笼统的代替,但是看起来还是怪别扭的,并且有些特殊的名词的复数形式不是简单加个s。
第二个方法是在代码逻辑里判断
if(英语){
if(单数){
...
}else{
...
}
}
但是不觉得这种方法实在太蠢了吗,我们难道要在代码中根据不同国家的语言使用if语句来进行各种判断,适配相应的字符串,可想而知这些工作都是极其枯燥。
幸好android系统提供了getQuantityString()
为我们解决这类问题,通过getQuantityString()
自动选择合适的资源,无需在代码层做选择和使用某种语言和复数规则的复杂判断,只需要在资源文件string.xml中定义好相应的字符串。下面具体介绍其使用方法。
中文的字符串集
在res/values/string.xml
中
<?xml version="1.0" encoding="utf-8"?>
<resources>
<plurals name="wastetime">
<item quantity="other">%d 分钟</item>
</plurals>
</resources>
英文的字符串集
在res/values-en/string.xml
中
<?xml version="1.0" encoding="utf-8"?>
<resources>
<plurals name="wastetime">
<item quantity="one">%d minute</item>
<item quantity="other">%d minutes</item>
</plurals>
</resources>
<resources>
是定义资源的所在根。<plurals>
字符串的集合,包含用来修饰不同数量的字符串。它可以包含一个或多个元素。name
是资源的名称,name在代码中以reousrce id方式被引用。<item>
表示单一或多个 数量的字符串。其中的值可以是其它字符串的引用。
- 属性:
quantity
数量表征的值,由此确定引用哪个字符串。(括号内列出部分语言要求):
- 属性:
值 | 描述 |
---|---|
zero | 语言需要对数字0进行特殊处理。(比如阿拉伯语) |
one | 语言需要对类似1的数字进行特殊处理。(比如英语和其它大多数语言里的1;在俄语里,任何以1结尾但不以11结尾的数也属于此类型。) |
two | 语言需要对类似2的数字进行特殊处理。(比如威尔士语) |
few | 语言需要对较小数字进行特殊处理(比如捷克语里的2、3、4;或者波兰语里以2、3、4结尾但不是12、13、14的数。) |
many | 语言需要对较大数字进行特殊处理(比如马耳他语里以11-99结尾的数) |
other | 语言不需要对数字进行特殊处理。 |
Java代码:
int count = getCount();
Resources res = getResources();
String songsFound = res.getQuantityString(R.plurals.wastetime, count,count);
注意:在使用
getQuantityString()
方法时,如果引用的字符串包含%d的字符串格式,需要向方法内传输两次count。在上面例子中,第一次传入的参数count是为plural提供数量quantity作判断的,你第二次传入的count是插入到%d的占位符。