6

我遇到了数量字符串(复数)的问题。

手册上说,我可能会为每个本地化提供特定的数量字符串,并且有几种常见的情况:“零”、“一”、“二”、“少”、“多”和“其他”。我不知道是否涵盖了世界上所有语言的所有可能案例;无论如何,对于我正在尝试进行本地化的俄语来说,这已经绰绰有余了。

在俄语中,从 2 到 4 的数字应该被视为“少数”(规则实际上更复杂,但我只需要 10 以下的数字)。

但是,当我请求 2 的数量字符串时,系统会采用“其他”字符串。它既不需要“两个”字符串,也不需要“很少”一个(我在我的资源中提供了它们)。如果我删除了“其他”字符串,我会得到异常:

android.content.res.Resources$NotFoundException: 
    Plural resource ID #0x7f080000 quantity=2 item=other

我在模拟器(Android 2.1)和真实设备(Android 2.3)上都试过了,这两种情况下的行为都是错误的。显然,某处存在错误 - 系统无法识别我的语言的特定于区域设置的数量。难道Android在这里有一些错误?

4

3 回答 3

3

我相信这目前在Android中被打破了。

http://code.google.com/p/android/issues/detail?id=8287

具体来说,PluralRules.java 中的以下代码表明大多数语言只使用oneorother字符串,但捷克语将使用few字符串:

static final PluralRules ruleForLocale(Locale locale) {
    String lang = locale.getLanguage();
    if ("cs".equals(lang)) {
        if (cs == null) cs = new cs();
        return cs;
    }
    else {
        if (en == null) en = new en();
        return en;
    }
}

private static PluralRules cs;
private static class cs extends PluralRules {
    int quantityForNumber(int n) {
        if (n == 1) {
            return QUANTITY_ONE;
        }
        else if (n >= 2 && n <= 4) {
            return QUANTITY_FEW;
        }
        else {
            return QUANTITY_OTHER;
        }
    }
}

private static PluralRules en;
private static class en extends PluralRules {
    int quantityForNumber(int n) {
        if (n == 1) {
            return QUANTITY_ONE;
        }
        else {
            return QUANTITY_OTHER;
        }
    }
}
于 2012-10-05T18:03:33.453 回答
2

感谢Brigham指出了问题所在的问题;这种解释首先引发了更多问题,但现在它们似乎得到了解决。确实,数量字符串不能正常工作(至少在 API 11 之前,即 Android 3.x 之前),因此您必须使用替代方法。

注释 15中提到了版本 11 之前的 API 解决方案,其中包含指向项目的链接,用于替代处理数量字符串。该项目是一个程序,它只是做系统应该做的事情。它可以轻松转换为库,因此您只需将其添加到项目中,导入类即可。

于 2012-10-06T07:05:10.030 回答
0
  1. 在values-ru/strings.xml中定义您的复数字符串,而不是在values/strings.xml中
  2. 将您的移动设备语言设置为俄语(从设置->语言和输入->语言->选择俄语)

如果您的语言不是俄语,它将从 values/strings.xml 中获取复数字符串

于 2015-08-25T13:10:40.893 回答