8

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)返回:

“0天”

根据英语规则这是可以的(又名零数量<=>几个数量)。


但是对于法语语言环境,它会返回:

“0 次”

根据法国规则(又名零数量 <=> 奇异数量),这是不行的。

它应该已经返回"O jour"

法国规则:http ://www.unicode.org/cldr/charts/25/supplemental/language_plural_rules.html#fr


那么,这是一个错误,还是我做错了什么?

4

3 回答 3

3

你的代码对我来说看起来是正确的。原因如下:

  1. Android 文档包含的文本与Unicode 语言复数规则zero, one, two, few, many, and other的措辞完全匹配。这表明 Android 使用它们。
  2. 这些复数规则规定,法国的0 书案件由one案件处理。

由于 Android 文档没有明确提及 Unicode 语言复数规则,您应该向 Android 支持请求澄清。

在你这样做之前,你应该咨询这个其他问题,法国规则显然有效。

于 2017-03-05T22:03:09.783 回答
1

确实,您的担忧是正确的,在法语中,数量 0 应该被视为 ' one' 而不是 ' other'。问题出在某些 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);

}
于 2018-01-18T13:03:04.827 回答
-1

你做错了什么。它正在做你告诉它的事情。

您的规则说,当值为 时other,使用“days”或“jours”。然后传入值 0,即other,因此它按照要求使用“days”和“jours”。

您可以尝试为具有特定语言规则的数量“零”设置第三个值。

于 2015-01-07T16:45:05.317 回答