在法语中,复数系统将0视为"其他"而不是"一个"

时间:2015-01-07 16:38:56

标签: android localization plural

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


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

3 个答案:

答案 0 :(得分:1)

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

  1. Android documentation包含文字zero, one, two, few, many, and other,与Unicode language plural rules的字词完全匹配。这表明Android使用它们。
  2. 这些复数规则规定 0本书的法国案例由one案件处理。
  3. 由于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”。

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