在res/values/strings.xml
,我有
<?xml version="1.0" encoding="utf-8"?>
<resources>
<plurals name="days_amount">
<item quantity="one">%d day EN</item>
<item quantity="other">%d days EN</item>
</plurals>
</resources>
在res/values-fr/strings.xml
,我有
<?xml version="1.0" encoding="utf-8"?>
<resources>
<plurals name="days_amount">
<item quantity="one">%d jour FR</item>
<item quantity="other">%d jours FR</item>
</plurals>
</resources>
使用英语区域设置res.getQuantityString(R.plurals.days_amount, 0, 0)
返回:
&#34; 0天&#34;
根据英国规则(即零数量&lt; =&gt;几个数量),这是可以的。
但是使用法语区域设置,它会返回:
&#34; 0 jours&#34;
根据法国规则(即零数量&lt; =&gt;奇异数量)不合适。
它应该已返回"O jour"
法国规则:http://www.unicode.org/cldr/charts/25/supplemental/language_plural_rules.html#fr
那么,这是一个错误,还是我做错了什么?
答案 0 :(得分:1)
您的代码对我来说是正确的。原因如下:
zero, one, two, few, many, and other
,与Unicode language plural rules的字词完全匹配。这表明Android使用它们。one
案件处理。由于Android文档未明确提及Unicode语言复数规则,因此您应该向Android支持部门请求澄清。
在你这样做之前,你应该咨询this other question,法国的规则显然有效。
答案 1 :(得分:0)
确实你的担心是正确的,法语中的数量0应该被视为&#39; one
&#39;而不是&#39; other
&#39;。问题出在一些Android API中:API <= 16
因此,如果您仍希望支持API 16,只需为零金额添加额外的字符串键。我们假设你有:
<plurals name="label_message_reminder_text">
<item quantity="other">Vous avez %1$s nouveaux messages</item>
<item quantity="one">Vous avez %1$s nouveau message</item>
</plurals>
只需添加一个额外的字符串:
<string name="label_message_reminder_text_zero">Vous avez %1$s nouveau message</string>
然后在检索复数形式时可以执行以下操作:
String newMessagesText = getMyString(context, resourceId, amount);
messageTextView.setText(String.format(newMessagesText, amount));
你可以有一个方法来执行getMyString():
public String getMyString(Context context, int resourceId, int amount){
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.JELLY_BEAN) {
if(amount == 0) {
switch (resourceId) {
case R.plurals.label_message_reminder_text:
return context.getResources().getString(R.string.label_message_reminder_text_zero);
}
}
}
return context.getResources().getQuantityString(resourceId, amount);
}
答案 2 :(得分:-1)
你做错了什么。它正在做你正在告诉它的事情。
您的规则规定,当值为other
时,请使用“天”或“jours”。然后传入值0,即other
,因此它根据要求使用“days”和“jours”。
您可以尝试为数量“零”设置第三个值,该值具有特定于语言的规则。