Как стать автором
Обновить

Локализация и числительные

Время на прочтение 2 мин
Количество просмотров 3.1K
На Хабре полно статей, с примерами на разных языках, о том, как правильно обрабатывать числительные и склонять при этом существительные, к ним относящиеся. Посмотрим, как эта задача решается в Qt.

В предыдущей статье о локализации в Qt упомянута функция QObject::tr() и даже рассказано о том, что в строку можно вставлять плейсхолдеры %1, %2 и т.д.

Однако, к сожалению, не упомянут особенный плейсхолдер — %n. Если внимательно посмотреть на сигнатуру функции QObject::tr
QString QObject::tr ( const char * sourceText, const char * comment = 0, int n = -1 )
можно заметить, что у неё есть третий параметр — некое целое n, что же это такое?

Возьмем пример из предыдущей статьи и немного его упростим, будем показывать только количество скопированных файлов:
void FileCopier::showProgress(int done)
{
label.setText(tr("%1 files copied.").arg(done));
}
Как видим, в зависимости от условия done == 1, мы должны писать либо file либо files. При переводе на русский язык всё становится ещё сложнее — формы становится 3 (1 файл, 2 файла, 5 файлов скопировано) и условие усложняется.

И тут нам на помощь приходит плейсхолдер %n и третий аргумент функции tr().
Чтобы всё было как надо, запишем фунцию showProgress следующим образом:
void FileCopier::showProgress(int done)
{
label.setText(tr("%n files copied.", "", done));
}
А при переводе, в лингвисте, у нас будет возможность задать несколько вариантов перевода этой строки для разных значений %n.

Для английского языка будет два варианта — Singular и Plural. Singular будет выглядеть так: "%n file copied.", а Plural так: "%n files copied."

Для русского три — Singular, Dual и Plural.
Singular: «Скопирован %n файл.»
Dual: «Скопировано %n файла.»
Plural: «Скопировано %n файлов.»

На этом работа переводчика и программиста заканчивается. Qt сама знает, для каких числительных какую форму использовать в данном конкретном языке. При выполнении программы, функция tr() в зависимости от текущей локали и третьего параметра вернет нужную строку.

Если кому интересно, вот формулы для некоторых языков, используемые Qt.
Теги:
Хабы:
+21
Комментарии 22
Комментарии Комментарии 22

Публикации

Истории

Работа

QT разработчик
13 вакансий

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн
Геймтон «DatsEdenSpace» от DatsTeam
Дата 5 – 6 апреля
Время 17:00 – 20:00
Место
Онлайн