R.plurals
public static final class R.plurals
extends Object
java.lang.Object | |
↳ | android.R.plurals |
Summary
Public constructors | |
---|---|
R.plurals() |
Inherited methods | |
---|---|
|
不同的语言对数量进行描述的语法规则也不同。比如在英语里,数量1是个特殊情况,我们写成“1 book”,但其他任何数量都要写成“n books”。这种单复数之间的区别是很普遍的,不过其他语言会有更好的区分方式。Android支持的全集包括zero、one、 two、few、many和other。
决定选择和使用某种语言和复数的规则是非常复杂的,所以Android提供了诸如getQuantityString()的方法来选择合适的资源。
注意,要按照语法规则来建立可选项。在英语里,即使数量为0,字符串零(zero)也不需要建立。因为0在英语语法表达上和2没有区别,和其他除1以外的任何数字都没有差别("zero books", "one book", "two books",等等)。 不要被“two听起来似乎只能用于数量2” 样的事误导。某语言可能需要2、12、102(等等)和1一样形式表示,而又与其他数的形式都不同。请依靠翻译人员来了解一下实际语言中的差别。
如果和应用程序的风格一致,常可以用诸如“Books: 1”的模糊数量形式来避免使用数量字符串。这会让你和翻译人员都轻松些。
注意:复数字符串是简单类型资源,是用名称(name)(而不是XML文件名)来直接引用的。因此,在一个XML文件里,可以把复数字符串资源和其他简单类型资源一起放在一个<resources>元素下。
文件位置
res/values/filename.xml
文件名可随意指定。<plurals>元素的名字name将被用作资源ID。
资源引用
Java代码::R.plurals.plural_name
语法
<?xml version="1.0" encoding="utf-8"?> <resources> name="plural_name"> <item_plurals quantity=["zero" | "one" | "two" | "few" | "many" | "other"] >text_string</item> </plurals> </resources> |
元素
<resources>
必填项。必须是根元素。
无属性。
<plurals>
一个字符串集,每个数量表示提供一个字符串。包含一个或多个<item>元素。
属性:
name
String类型。字符串对的名称。此名称将作为资源ID。
<item>
一个单数或复数形式的字符串。可以是对其他字符串资源的引用。必须作为<plurals>元素的子元素存在。注意须对单引号和双引号进行转义。有关如何正确地样式化及格式化字符串,请参阅下文格式化和样式化。
属性:
quantity
关键字。 表示要使用此字符串的数量值。以下是合法的值(括号内列出部分语言要求):
值 | 描述 |
zero | 语言需要对数字0进行特殊处理。(比如阿拉伯语) |
one | 语言需要对类似1的数字进行特殊处理。(比如英语和其它大多数语言里的1;在俄语里,任何以1结尾但不以11结尾的数也属于此类型。) |
two | 语言需要对类似2的数字进行特殊处理。(比如威尔士语) |
few | 语言需要对较小数字进行特殊处理(比如捷克语里的2、3、4;或者波兰语里以2、3、4结尾但不是12、13、14的数。) |
many | 语言需要对较大数字进行特殊处理(比如马耳他语里以11-99结尾的数) |
other | 语言不需要对数字进行特殊处理。 |
例子:
xml文件在strings.xml文件中
<?xml version="1.0" encoding="utf-8"?>
<resources>
<plurals name="test_plurals">
<item quantity="one">There is 1 egg.</item>
<item quantity="other">There are %s egg.</item>
</plurals>
</resources>
<span style="white-space:pre"> </span>// res.getQuantityString(),第一个参数为plurals的ID,第二参数为0,对应quantity的选择,由于有效的只有1和其他,则对应other,因此s1为There
// are %d eggs.
String s1 = getResources().getQuantityString(R.plurals.test_plurals, 0);
Log.i("TAG", "s1:" + s1);
// 第二个参数为1,对应one,即为There is 1 egg.
s1 = getResources().getQuantityString(R.plurals.test_plurals, 1);
Log.i("TAG", "s1:" + s1);
s1 = getResources().getQuantityString(R.plurals.test_plurals, 2);
Log.i("TAG", "s1:" + s1);
// 第二个参数为0,对应other,第三个参数为2,是根据format对%d的填充,即为There are 0 eggs.
s1 = getResources().getQuantityString(R.plurals.test_plurals, 0, "3");
Log.i("TAG", "s1:" + s1);
// 第二个参数为1,对应one,由于format没有需要填入,为There is 1 egg.
s1 = getResources().getQuantityString(R.plurals.test_plurals, 1, 1);
Log.i("TAG", "s1:" + s1);
// 第二个参数为2,对应other,由于format有input,为There are 6 eggs.
s1 = getResources().getQuantityString(R.plurals.test_plurals, 2, 6);
Log.i("TAG", "s1:" + s1);
运行结果:
06-21 14:04:38.970: I/TAG(12010): s1:There are %s egg.
06-21 14:04:38.970: I/TAG(12010): s1:There are %s egg.
06-21 14:04:38.970: I/TAG(12010): s1:There are %s egg.
06-21 14:04:38.970: I/TAG(12010): s1:There are 3 egg.
06-21 14:04:38.970: I/TAG(12010): s1:There are 1 egg.
06-21 14:04:38.970: I/TAG(12010): s1:There are 6 egg.
在这里很奇葩,运行效果跟一般网上帖子不一样。这个是我亲自测。不知道为什么带一个参数的 一直输出是other的内容。