gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 18:34:25 28 4
gpt4 key购买 nike

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() uses the default locale to format a number when its position specifier in the format string contains an 'L', e.g. "%L1"

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

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

...这表明您可以将第一个表单重写为...

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

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

最佳答案

是的,它会起作用的:

#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 位置标记”的复数形式。这是一个错误。

关于qt - QObject::tr() 的复数重载是否将 %n 转换为本地数字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9280430/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com