MyTetra Share
Делитесь знаниями!
Локализация и числительные
Время создания: 20.03.2016 22:41
Раздел: Компьютер - Программирование - Язык C++ (Си++) - Библиотека Qt - Локализация
Запись: xintrea/mytetra_syncro/master/base/0000000767/text.html на raw.github.com

На Хабре полно статей, с примерами на разных языках, о том, как правильно обрабатывать числительные и склонять при этом существительные, к ним относящиеся. Посмотрим, как эта задача решается в 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.

 
MyTetra Share v.0.65
Яндекс индекс цитирования