如何使俄罗斯数量字符串正常工作?

时间:2012-10-05 17:59:30

标签: android

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

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

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

但是,当我请求数量字符串为2时,系统将获取“其他”字符串。它既不是“两个”字符串也不是“少数”字符串(我已经在我的资源中提供了它们)。如果我删除了“其他”字符串,我会得到例外:

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

我在模拟器(Android 2.1)和真实设备(Android 2.3)上都尝试过这种方法,两种情况下的行为都是一样的错误。显然,某处存在错误 - 系统无法识别我语言的特定于语言环境的数量。这可能是Android有一些错误吗?

3 个答案:

答案 0 :(得分:3)

我相信Android目前已经破了。

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

具体来说,PluralRules.java中的以下代码显示大多数语言仅使用oneother字符串,但捷克语将使用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;
        }
    }
}

答案 1 :(得分:2)

感谢Brigham指出问题被解释的issue;这个解释首先提出了更多问题,但现在它们似乎已经解决了。实际上,数量字符串不能正常工作(至少在API 11之前,即Android 3.x),因此您必须使用替代方案。

comment 15中提到了版本11之前的API解决方案,其中包含指向project for alternative handling of quantity strings的链接。该项目是一个简单完成系统应该做的程序。它可以很容易地转换为库,所以你只需将它添加到你的项目中,导入类就可以了。

答案 2 :(得分:0)

  1. values-ru / strings.xml 中定义复数字符串,而不是 values / strings.xml
  2. 将您的移动设备语言设置为俄语(来自设置 - &gt;语言和输入 - &gt;语言 - &gt;选择俄语)
  3. 如果您的语言不是俄语,则需要使用values / strings.xml中的复数字符串