Количество "два" не работает в Android Strings-Resources Plural

Android позволяет переводчикам определять Plurals. Следующий пример работает для меня с locale 'en':

<plurals name="numberOfSongsAvailable">
    <item quantity="one">One song found.</item>
    <item quantity="other">%d songs found.</item>
</plurals>

Но добавление специального значения для two не работает, сохраняется версия other. Является ли использование two зависимым от языкового стандарта? Так что Android только принимает версию two, если локаль явно указывает, что должна быть версия two?

SO Question Множественное обращение с множественными номерами Android "нуль" обнаруживает ту же ошибку при использовании zero на английском языке, который также не поддерживается. В этом вопросе нет решений, кроме как избежать множественных чисел, которые я хочу избежать.

Ответ 1

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 "одному". Есть, конечно, много случаев, когда "два" содержат другие числа, кроме двух.

Если Android, где вы можете делать то, что вы намеревались, ваши приложения не могут быть надлежащим образом переведены на любое количество языков с более сложными множественными правилами.

Ответ 2

Это старая ошибка. В разделе соответствующего кода класса PluralRules есть несколько отсутствующих if-предложений.

Как сказал ответ в связанном вами вопросе, вам лучше использовать MessageFormat или что-то еще. Об ошибках сообщалось в мае 2010 года, я бы не ожидал, что это будет исправлено в ближайшем будущем (и в этом случае у вас все еще есть неисправная версия на устройствах старой версии). Забастовкa >

Полностью false, см. комментарии.

Ответ 3

Да, использование двух специфично для локали. Просто потому, что вы его даете, номер 2 не означает, что он будет использовать количество = "два". Он будет использовать это количество только для языков, имеющих особые случаи для числа 2

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

Обратите внимание, что выбор производится на основе грамматической необходимости. Строка для нуля на английском языке будет проигнорирована, даже если количество равно 0, потому что 0 не является грамматически отличным от 2 или любым другим числом, кроме 1 ( "нулевые книги", "одна книга", "две книги" и т.д. на). Не следует вводить в заблуждение тот факт, что, скажем, два звуковых сигнала, которые могут быть применимы только к количеству 2: язык может требовать, чтобы 2, 12, 102 (и т.д.) Обрабатывались как друг друга, но по-другому величины. Полагайтесь на своего переводчика, чтобы узнать, какие различия их язык на самом деле настаивает.