Qt QObject::tr()的多元化重载是否将%n转换为本地数?

Qt QObject::tr()的多元化重载是否将%n转换为本地数?,qt,localization,translation,pluralize,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()); 除了在同一个字符串中进行本地化和多元化之外,在大多数情况下,都需要在字符串中输入数字。当然,你可以分解翻译,但是你必须猜测字符串是否会在所有语言中的相同位置分解(大多数情况下我没有资格做出这个决定) 这些

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

tr("There are %n foo(s)", 0, foo.size());
tr("%1: %2").arg(QLocale().toString(bar.size())).arg(bar.name());
除了在同一个字符串中进行本地化多元化之外,在大多数情况下,都需要在字符串中输入数字。当然,你可以分解翻译,但是你必须猜测字符串是否会在所有语言中的相同位置分解(大多数情况下我没有资格做出这个决定)

这些国家

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

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

tr("%L1: %2").arg(bar.size()).arg(bar.name());
。。。这表明你可以将第一个表单改写为

tr("There are %Ln foo(s)", 0, foo.size());
这将被编译,并在语言学家中显示为一种多元化,但有人知道这是否也会使数字本地化吗?我在任何文档中都找不到任何表示这两种方式的内容。

这似乎意味着它将同时进行复数化和本地化,因为它是在标题为“处理复数”的部分下显示的

后者似乎是一个逐字复制,这似乎是一个耻辱,因为这不是一个特别好的使用
QObject::tr(…)
是的,它将工作:

#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();
}
如果运行德语,则输出(向所有实际讲德语的人道歉):

唯一奇怪的是:

  • 翻译人员必须在单数和复数翻译中保留
    %Ln
    ,而不仅仅是通常的
    %n
  • 语言学家会抱怨复数形式“翻译没有包含必要的%n位置标记。”这是一个错误

非常感谢您的回答,但我正在寻找证据。唯一符合证据条件的是源代码,它是可用的:)或者我们都没有找到的文档,或者一个测试用例。
"There are 123456 foos"
"There are 123,456 foos"
"Es gibt 123456 fooen"
"Es gibt 123.456 fooen"