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

Sam*_*mer 3 qt translation localization pluralize

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

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

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

QLocale文档指出...

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

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

tr("%L1: %2").arg(bar.size()).arg(bar.name());
Run Code Online (Sandbox Code Playgroud)

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

tr("There are %Ln foo(s)", 0, foo.size());
Run Code Online (Sandbox Code Playgroud)

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

Dav*_*eer 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();
}
Run Code Online (Sandbox Code Playgroud)

如果运行英语则输出:

"There are 123456 foos"
"There are 123,456 foos"
Run Code Online (Sandbox Code Playgroud)

如果运行德语输出(向任何实际的德语人士道歉):

"Es gibt 123456 fooen"
"Es gibt 123.456 fooen"
Run Code Online (Sandbox Code Playgroud)

唯一奇怪的事情是:

  • 译者必须保留%Ln单数和复数翻译,而不仅仅是通常的翻译%n.
  • 语言学家会抱怨"翻译不包含必要的%n位置标记"的复数形式.这是一个错误.