获取复数错误/警告: "数量'one'匹配超过一个特定数字..."

13

背景

我正在开发的应用内部拥有许多翻译。

以下是我拥有的英文复数字符串:

<plurals name="something">
    <item quantity="one">added photo</item>
    <item quantity="other">added %d photos</item>
</plurals>

以及法语翻译:

<plurals name="something">
    <item quantity="one">a ajouté une photo</item>
    <item quantity="other">a ajouté %d photos</item>
</plurals>

问题

我在使用法语和俄语时都遇到了以下警告:

该地区设置下“one”对应多个具体数字,但消息未包含格式化参数(例如 %d)。这通常是国际化错误。有关更多信息,请参见完整的问题说明。

在选择显示详细信息时,它会显示: enter image description here

事实上,我不知道应该如何解决此问题,甚至是否存在问题...

问题

我应该如何处理这些字符串?我应该告诉翻译者什么?


这是一个老问题,但@PedroOliveira的评论需要更正:a ajouté 101 photo绝对不是法语;我们说a ajouté 101 photos(注意s - 如果您不确定,请参见http://www.unicode.org/cldr/charts/latest/supplemental/language_plural_rules.html#fr-comp)。因此,Android是**错误的**:在法语环境中,数量“one”仅匹配单个特定数字:1,并且linter _不应_在此处指示问题。 - tchap
@tchap 确实是一个古老的问题,但自那时以来,Android Studio 更加精确地指出了问题,并告诉我们 在这种语言环境中,“one” 与多个特定数字(0、1等)匹配[...];这是正确的,在法语中,您可以说 a ajouté 0 photoa ajouté 1 photo。无论如何,我只是想评论一下,尽管 Android Studio 抱怨,但这并没有阻止我编译和运行我的应用程序。 - Unda
1
@Unda 不,这不正确,“one”数量只匹配1!0应该与“zero”数量匹配(请参见https://developer.android.com/guide/topics/resources/string-resource.html#Plurals)。我知道它仍然可以工作,因为这只是一个警告,但Android Studio不应该抱怨:) - tchap
@tchap 我理解“one”匹配1,“zero”匹配0,我完全同意你的看法。我只是想说,在法语中,在复数方面,1和0之间没有区别(至少我想不出来......),所以在我看来,Android Studio正确地将它们处理成相同的方式。但是,将它们都归为“one”数量(如Android Studio从错误消息中显示的那样),这样做是否“正确”,我认为不是......但事情就是这样...... - Unda
1
到最后,有人是正确的吗?每个人都说不一样的话。 - David
显示剩余2条评论
2个回答

5

由于这是一个相当困难的解释,因此我将写下一个答案。

在各种语言中,如果名词以1结尾,则使用单数形式。请参考:http://www.unicode.org/cldr/charts/latest/supplemental/language_plural_rules.html

用英语解释,有些语言中,“added 1 photo”和“added 101 photo”都是正确的。注意“photo”。这意味着您也应该在一个字符串上始终添加“%d”。Android会选择最佳使用方案。这意味着在英语中,它将选择大于1的数字的“other”,而在其他语言中,它将选择以1结尾的数字的“one”。

总之,在一个字符串中添加%d并且应该没问题。还要确保翻译人员遵守其语言的复数规则。


我现在已经和一个认识俄语的人交谈过了,他说这样说没问题,所以我仍然不明白哪里出了问题。 - android developer
检查一下那个网站。正如你在俄语中所看到的,基数词“one”用于所有以1结尾的数字。 - Pedro Oliveira
但他说这样说也没关系。 - android developer
2
仅仅因为可以这样说并不意味着这是正确的方式。其他语言也是如此。我建议您阅读http://cldr.unicode.org/index/cldr-spec/plural-rules - Pedro Oliveira
1
“基数“一”用于所有以1结尾的数字,但不包括11。” - Anton Malyshev
@androiddeveloper,我认为使用某种形式是否“可以”或“不可以”是无关紧要的 - 你只需要了解系统当前的工作方式即可。这个答案很好。如果您想省略单个项目的数量数字,您可以始终定义其他字符串并在请求“复数化”的字符串资源之前执行手动检查:if (someQuantity == 1) {...} - Vasiliy

5

当计数为0或1时,法语使用单数形式。而英语仅在计数为1时使用单数形式,0则使用复数形式。

这就是为什么你需要在法语单数模式中插入占位符(%d)的原因。


我明白了。谢谢。 - android developer
2
我知道这是一个老问题,但为什么我需要在字符串中添加占位符?我不需要它们出现在其他语言环境中,也没有在代码中使用。我不想因为一个(或多个)语言而改变其他语言环境和代码。如果我理解正确,为什么我不能只在法语环境中添加零件数量为零的项目?添加占位符到字符串中是否有一些逻辑上的原因,还是只是Android Studio的限制? - kycera
因为如果在法语模式中没有占位符,您将无法区分0和1。原始示例没有占位符,因此在0和1的情况下都会显示“a ajouté une photo”。 - Jaska

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接