На Хабре полно статей, с примерами на разных языках, о том, как правильно обрабатывать числительные и склонять при этом существительные, к ним относящиеся. Посмотрим, как эта задача решается в 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() в зависимости от текущей локали и третьего параметра вернет нужную строку.
Если кому интересно, вот формулы http://doc.trolltech.com/qq/qq19-plurals.html#howdoesitworkunderthehood для некоторых языков, используемые Qt.