QObject :: tr()的复数重载是否将%n转换为本地数字?

时间:2012-02-14 16:24:45

标签: qt localization translation pluralize

有两种形式的QObject::tr()函数用于翻译包含数字的字符串:

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

除了您希望在同一字符串中进行本地化复数之外,这些帐户适用于您希望字符串中包含数字的大多数情况。当然你可以打破翻译,但是你必须猜测这个字符串是否会在所有语言的相同位置中断(我决定大部分时间没有资格)。

QLocale documentation表示......

  

QString :: arg()使用默认语言环境来格式化数字,当格式字符串中的位置说明符包含“L”时,例如“%L1”

...所以第二种形式可以改写为......

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

...这表明你可以将第一个表格重写为......

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

这将编译并在Linguist中显示为多元化,但有人知道这是否也会将数字本地化?我在任何文档中都找不到任何说法。

2 个答案:

答案 0 :(得分:7)

是的,它会起作用:

#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 :(得分:1)

(Qt 4.x) documentation here似乎意味着它会复数化和本地化,因为它是在“处理复数”一节下提出的。

后来的Qt 5.x documentation here似乎是一个逐字副本,这似乎很遗憾,因为这不是QObject::tr(...)特别好记录的用法。