3

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 中显示为复数形式,但有谁知道这是否也会将数字本地化?我在任何文档中都找不到任何说明。

4

2 回答 2

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 位置标记”的复数形式。这是一个错误。
于 2012-03-01T02:06:07.233 回答
1

这里的(Qt 4.x)文档似乎暗示它将同时进行复数和本地化,因为它出现在“处理复数”部分下。

此处后来的Qt 5.x 文档似乎是逐字复制的,这似乎是一种耻辱,因为这不是一个特别有据可查的QObject::tr(...).

于 2012-02-14T16:44:24.557 回答