https://blog.csdn.net/teagreen_red/article/details/78269950?utm_source=blogxgwz7
对于个数,中文在单复数是没有区别的,所以我们平时开发中也不会注意到这个问题,但是别的语言中常常单复数有不同的表示。当App实现国际化功能后字符串的单复数问题越来越明显。以英文为例,在处理个数的时候单复数是不同形的,例如:
中文:1分钟,2分钟,…, n分钟
英文:1 minute,2 minutes,…,n minutes
面对这个问题,最初我想到的解决办法是minute(s),用这个(s)来笼统的代替,但是看起来还是怪别扭的,并且有些特殊的名词的复数形式不是简单加个s。
第二个方法是在代码逻辑里判断
if(英语){
if(单数){
...
}else{
...
}
}
1
2
3
4
5
6
7
但是不觉得这种方法实在太蠢了吗,我们难道要在代码中根据不同国家的语言使用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>
1
2
3
4
5
6
英文的字符串集
在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>
1
2
3
4
5
6
7
<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);
1
2
3
注意:在使用getQuantityString()方法时,如果引用的字符串包含%d的字符串格式,需要向方法内传输两次count。在上面例子中,第一次传入的参数count是为plural提供数量quantity作判断的,你第二次传入的count是插入到%d的占位符。