Множественное число на Android

В амазонских джунглях живет племя, в языке которого есть всего три слова для обозначения чисел — «один», «два» и «много»

Фактрум

В нашей жизни (а особенно — в интерфейсе наших программ!) очень часто встречаются числительные. Цена чего-либо? Число. Количество записей или комментариев к ним? Всё числа. Продолжительность какого-либо периода? Это зачастую даже несколько чисел: например, дни, часы и минуты. В общем, без чисел — никуда.

И чем важнее представленная числом информация, тем неприятнее человеку видеть на экране что-нибудь такое:

21 комментариев
21 комментариев. Без комментариев.

Бросается в глаза, согласитесь? Сразу видно: текст «механический». Взгляд спотыкается на такой строчке, мозг фиксирует грубую грамматическую ошибку. Вот сравните, например, со скриншотом из популярной социальной сети:

21 комментарий
А вот тут глазу цепляться не за что

Осознавая эти тонкости, многие пытаются выводить числа просто в скобочках или после двоеточия («комментарии: 21»). Это не самый плохой компромисс: текст хоть и веет всё той же механистичностью, но по крайней мере остаётся согласованным при любом числе. Однако же — зачем нам компромиссы? Правильное склонение — одно из требований к современному приложению, и больших усилий его реализация не потребует — всё уже написано до нас!

Собственно, нужный нам механизм лежит на самой поверхности, да и называется без особых изысков — Quantity Strings (plurals). Появился он ещё в самых первых версиях Android, но не пользовался у наших разработчиков большой популярностью, поскольку реализован был с ошибками. Однако же теперь, начиная с Honeycomb, ошибки исправлены, а для более старых версий — написана и свободно доступна исправляющая ошибки библиотечка.

Читать далее

Сборка iconv под Android NDK

Недавно встала передо мной в полный рост проблема перевода различных кодировок на платформе Android.

Казалось бы, любой java-разработчик тут должен усмехнуться и молча ткнуть пальцем в обычнейший String, — мол, всё уже украдено до нас, знай только Charset передай, или просто имя кодировки. И здесь бы я с ним согласился, набил нужный код и закрыл тему, но только вот задачу эту потребовалось решить в рамках NDK, на C++. И хотя форумы пестрят пикантными советами использовать всё те же вызовы Java через JNIEnv, очевидно, что метод сей сильно паршив по производительности, надёжности, да и просто по красоте, потому годится далеко не всегда и не везде.

В голову сразу же приходят (ну или: гуглом сразу же находятся) два очевидных решения: ICU и libiconv. Читать далее