如何在 Qt 中翻译可变文本?

How to translate variable text in Qt?

我有一个难题,尝试了很多东西但都是徒劳的。 我有 4 种不同语言的 4 个翻译文件,每当用户更改语言时,我都需要重新翻译 UI.

固定文本可以重新翻译如下:

ui->BusinessNameHelpText->setText(tr("Enter the business name."));

但是,像按钮上的操作这样的可变文本不能以这种方式完成,因为它要么是“安装”,要么是“更新”。

我试过这个代码块:

QString action = ui->actionButton->text();
ui->retranslateUi(this);
ui->actionButton->setText(trUtf8(action.toUtf8().data()));

还有这个:

QString action = ui->actionButton->text();
ui->retranslateUi(this);
ui->actionButton->setText(tr(action.toUtf8().data()));

还有这个:

QString action = ui->actionButton->text();
ui->retranslateUi(this);
ui->actionButton->setText(tr(action.toStdString.c_str()));

这仅在我第一次更改语言时有效,但之后,它就无效了。

好的,现在我知道你的问题是什么了。

问题在于您如何处理按钮的更改文本。 仅当您将英语更改为其他语言时它才有效。发生这种情况是因为英文文本等同于您在代码中用作翻译标识的文本。

当您的应用程序调用它时:

QString action = ui->actionButton->text();

如果之前选择了英语 action 将包含与翻译标识符相同的文本。
如果之前选择了其他语言 action 将包含其他内容,则标识符和翻译器无法找到匹配的翻译。在这种情况下,翻译器将 return 原始值。

要修复,只留下 ui->retranslateUi(this); 并检查其他代码,并确保您的 UI 将所有相应的字符串标记为需要翻译。

我在 Qt 论坛上找到了一个 post 和我一样的问题,这个 answer 说无法翻译动态文本。

听起来你有这样的代码

ui->actionButton->setText(isInstall ? tr("Install") : tr("Update"));

在你的程序中。您需要再次 运行 以响应语言更改事件。