Android复数处理"零"

Eri*_*rch 77 android

如果我的strings.xml中有以下多个ressource:

   <plurals name="item_shop">
        <item quantity="zero">No item</item>
        <item quantity="one">One item</item>
        <item quantity="other">%d items</item>
   </plurals>   
Run Code Online (Sandbox Code Playgroud)

我正在使用以下方法向用户显示结果:

textView.setText(getQuantityString(R.plurals.item_shop, quantity, quantity));
Run Code Online (Sandbox Code Playgroud)

它适用于1及以上,但如果数量为0,那么我看到"0项".是否只有阿拉伯语支持"零"值,正如文档似乎表明的那样?或者我错过了什么?

Eli*_*son 80

Android资源国际化方法非常有限.我使用该标准取得了更大的成功java.text.MessageFormat.

基本上,您所要做的就是使用标准字符串资源,如下所示:

<resources>
    <string name="item_shop">{0,choice,0#No items|1#One item|1&lt;{0} items}</string>
</resources>
Run Code Online (Sandbox Code Playgroud)

然后,从代码中您所要做的就是以下内容:

String fmt = getResources().getText(R.string.item_shop).toString();
textView.setText(MessageFormat.format(fmt, amount));
Run Code Online (Sandbox Code Playgroud)

您可以在MessageFormatjavadocs中阅读有关格式字符串的更多信息

  • 很好的解决方法.我现在可以想象翻译我的应用程序的人会把什么样的混乱放在我的文件中...... :) (7认同)
  • 哇,那很难看.像这样的逻辑应该是代码,而不是翻译.复数只能用于帮助数字的语言差异.根据"少数"的建议,您现在已成功将逻辑转换为逻辑转换和翻译. (3认同)
  • 这肯定不是一个很好的解决方法.只需为no_items添加一个字符串,然后再添加一个if子句.如果(items.count == 0){使用字符串} else {使用复数}然后让翻译人员处理strings.xml文件中的问题... (2认同)
  • @MartínMarconcini你是对的... 3年后:-) (2认同)

Byt*_*eMe 42

来自http://developer.android.com/guide/topics/resources/string-resource.html#Plurals:

请注意,选择是基于语法上的必要性.即使数量为0,也会忽略英语为零的字符串,因为0在语法上与2不同,或者除1以外的任何其他数字("零书","一本书","两本书"等等)上).不要因为两个声音只能应用于数量2而被误导:一种语言可能要求2,12,102(等等)都被视为彼此相似但与其他不同数量.依靠你的翻译来了解他们的语言实际上坚持的区别.

总之,'零'仅用于某些语言(同样适用于'两个''少数'等),因为其他语言没有特殊的共轭,因此"零"字段被认为是不必要的

  • "即使数量为0,也会忽略英语为零的字符串,因为0在语法上不同于2"......"我没有水果"与"我有苹果​​和橙子"有什么关系? (4认同)
  • 这太糟糕了.他们不应该试图做出特定于语言的假设.每个我知道用过的复数形式都被这个混淆了. (4认同)
  • 在0和2之间有许多不同的方法.但这些资源背后的想法是使用它们与数字.所以类似:我有0个苹果.我有1个苹果.我有2个苹果. (2认同)
  • @miracle2k:消息不按类别翻译,因此您使用一种语言的任何类别或消息都不会影响另一种语言.因此,如果您的英语仅为零计数的"零"类消息,而另一种语言使用"零"类计数10,100,这无关紧要,因为您没有翻译"零"类消息.另一方面:如果您为英语的0计数创建单独的消息资源,那么您正在为翻译人员创建工作流问题,因为该案例已经被他们语言中的原始"零"类消息所覆盖. (2认同)
  • 确实可以将英语中的"零"类别作为便利功能,但它不是"干净",只会鼓励不良行为.您可能会想到放置文本以鼓励用户将项添加到"零"字符串中 - 然后可能不可翻译.严格来说,OP的例子("没有项目")已经表现出这个问题,因为翻译者可能也希望使用单词来表达0个案例.如果您认为"%s项目"是"%s项目"的单数版本,而"没有项目"是完全不同的语言,那么这不是工作流程问题. (2认同)

mir*_*e2k 13

Android正在使用CLDR复数系统,这不是它的工作原理(所以不要指望这会改变).

该系统在这里描述:

http://cldr.unicode.org/index/cldr-spec/plural-rules

简而言之,理解"一个"并不意味着数字1是很重要的.相反,这些关键字是类别,属于每个类别的特定数字n由CLDR数据库中的规则定义:

http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html

虽然似乎没有语言对0以外的任何东西使用"零",但有些语言将0分配给"1".肯定有很多情况下"两个"包含其他数字而不仅仅是2.

如果Android允许您执行您的预期操作,则无法将您的应用程序正确地翻译成具有更复杂复数规则的任意数量的语言.

  • 在向多个问题发布复制和粘贴样板/逐字答案时要小心,这些问题往往被社区标记为"垃圾邮件".如果你这样做,那么通常意味着问题是重复的,所以请将它们标记为:http://stackoverflow.com/questions/8473816 (5认同)

Jus*_*ler 10

这是我用来处理此问题而不切换到MessageFormat的解决方法.

首先,我将"零"字符串提取到自己的字符串资源中.

<string name="x_items_zero">No items.</string>
<plurals name="x_items">
    <!-- NOTE: This "zero" value is never accessed but is kept here to show the intended usage of the "zero" string -->
    <item quantity="zero">@string/x_items_zero</item>
    <item quantity="one">One item.</item>
    <item quantity="other">%d items.</item>
</plurals>
Run Code Online (Sandbox Code Playgroud)

然后我在我自己的ResourcesUtil中有一些方便的方法

public static String getQuantityStringZero(Resources resources, int resId, int zeroResId, int quantity) {
    if (quantity == 0) {
        return resources.getString(zeroResId);
    } else {
        return resources.getQuantityString(resId, quantity, quantity);
    }
}

public static String getQuantityStringZero(Resources resources, int resId, int zeroResId, int quantity, Object... formatArgs) {
    if (quantity == 0) {
        return resources.getString(zeroResId);
    } else {
        return resources.getQuantityString(resId, quantity, formatArgs);
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,无论何时我想使用特定字符串作为数量零,我都会调用:

String pluralString = ResourcesUtil.getQuantityStringZero(
     getContext().getResources(),
     R.plural.x_items,
     R.string.x_items_zero,
     quantity
);
Run Code Online (Sandbox Code Playgroud)

我希望有更好的东西,但这至少可以完成工作,同时保持字符串资源XML清晰.

  • 不会使用正确的'<item quantity ="zero">'.我有它,因为我认为它有助于澄清该值的预期用途为零. (4认同)
  • 使用这个,“&lt;item amount="zero"&gt;”实际上不会被使用吗? (2认同)