【发布时间】:2017-02-19 13:29:16
【问题描述】:
我有这样的事情:
void FooWidget:showSomeDialog(bool is_translatable)
{
QMessageBox mbox(this);
if (is_translatable)
{
mbox.setWindowsTitle(tr("Title"));
mbox.setText(tr("Text"));
mbox.setInformativeText(tr("InformativeText"));
mbox.addButton(tr("Button1"), QMessageBox::YesRole);
mbox.addButton(tr("Button2"), QMessageBox::NoRole);
...
} else {
mbox.setWindowsTitle(QLatin1String("Title"));
mbox.setText(QLatin1String("Text"));
mbox.setInformativeText(QLatin1String("InformativeText"));
mbox.addButton(QLatin1String("Button1"), QMessageBox::YesRole);
mbox.addButton(QLatin1String("Button2"), QMessageBox::NoRole);
...
}
mbox.exec();
}
避免重复的更好方法是什么?
我尝试过像这样使用 lambda 函数:
auto func = is_translatable
? [](const char *str) -> QString { return tr(str); }
: [](const char *str) -> QString { return QLatin1String(str); };
但它不起作用。而且它看起来不太好。
【问题讨论】:
-
接受 is_translatable 参数并返回字符串的函数怎么样?这样你就摆脱了代码重复,if 条件(你只在“翻译函数”中使用它,并且相同的函数可以用于其他情况。
-
我认为您误用了翻译系统。在已翻译的应用程序中,UI 字符串应始终通过
tr()。选择所需的语言使其显示为“未翻译”。
标签: c++ qt translation