Преобразует ли перегрузка множественного числа QObject :: tr ()% n в локальное число? - PullRequest
3 голосов
/ 14 февраля 2012

Существует две формы функции QObject::tr(), которую я использовал для перевода строк, содержащих числа:

tr("There are %n foo(s)", 0, foo.size());
tr("%1: %2").arg(QLocale().toString(bar.size())).arg(bar.name());

Они учитывают большинство случаев, когда вам нужно число в строке, за исключением случаев, когда вы хотите выполнить локализацию и в нескольких рядах. Конечно, вы можете разбить перевод на части, но вы должны сделать предположение о том, будет ли эта строка ломаться в одних и тех же местах на всех языках (решение, которое я не имею права принимать большую часть времени).

Документация QLocale гласит, что ...

QString :: arg () использует языковой стандарт по умолчанию для форматирования числа, когда его спецификатор позиции в строке формата содержит «L», например, "% L1"

... так что вторая форма может быть переписана как ...

tr("%L1: %2").arg(bar.size()).arg(bar.name());

... и это говорит о том, что вы можете переписать первую форму как ...

tr("There are %Ln foo(s)", 0, foo.size());

Это скомпилируется и будет отображаться в Linguist как множественное число, но знает ли кто-нибудь, локализует ли это число? Я не могу найти ничего, что бы говорило так или иначе в любой документации.

Ответы [ 2 ]

7 голосов
/ 01 марта 2012

Да, это будет работать:

#include <QtCore>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

//    QLocale::setDefault(QLocale(QLocale::German));
    QLocale::setDefault(QLocale(QLocale::English));

    QTranslator qtTranslator;
//    qtTranslator.load("foo_de", qApp->applicationDirPath());
    qtTranslator.load("foo_en", qApp->applicationDirPath());
    a.installTranslator(&qtTranslator);

    int foo_count = 123456;

    QString str1 = QObject::tr("There are %n foo(s)", "foo", foo_count);
    QString str2 = QObject::tr("There are %Ln foo(s)", "foo", foo_count);

    qDebug() << str1;
    qDebug() << str2;

    return a.exec();
}

Вывод на английском языке:

"There are 123456 foos"
"There are 123,456 foos"

Вывод, если вы работаете на немецком языке (с извинениями перед любыми носителями немецкого языка):

"Es gibt 123456 fooen"
"Es gibt 123.456 fooen"

Единственные странные вещи:

  • Переводчик должен хранить %Ln как в единственном, так и во множественном числе, а не только в обычном %n.
  • Лингвист будет жаловаться на форму множественного числа, что «Перевод не содержит необходимый% n маркер места». Это ошибка.
1 голос
/ 14 февраля 2012

Документация (Qt 4.x) здесь , по-видимому, подразумевает, что он будет как во множественном, так и в локализованном виде, поскольку он представлен под заголовком раздела "Обработка множественного числа".

Позже Документация по Qt 5.x здесь представляется дословной копией, которая выглядит позорной, поскольку это не особенно хорошо документированное использование QObject::tr(...).

...