为何QApplication::tr未翻译"Open"?与translate函数差异解析
为什么QApplication::tr("Open")未被翻译?
先看你提供的代码:
int main(int argc, char *argv[]) { QApplication app(argc, argv); QTranslator translator; const QString dir = "/usr/share/qt6/translations"; if (translator.load("qt_ru", dir)) { QApplication::installTranslator(&translator); qDebug() << QApplication::translate("QShortcut", "Open"); qDebug() << QApplication::tr("Open"); } ... }
输出结果:
"Открыть" "Open"
原因很明确:Qt的翻译系统靠上下文(Context)+ 源字符串的组合匹配翻译条目,二者必须完全对应才能生效。
QApplication::translate("QShortcut", "Open")明确指定了上下文为"QShortcut",而你加载的qt_ru.qm翻译文件里,正好存在QShortcut上下文对应的"Open"俄语翻译条目,因此能正确输出翻译结果。QApplication::tr("Open")未指定上下文,会使用默认上下文(在main这类全局函数中,默认上下文通常是当前函数名或全局上下文),但qt_ru.qm里没有这个默认上下文对应的"Open"翻译条目,所以直接返回原字符串。
如果想用tr函数实现同样的翻译效果,需要显式指定上下文,比如写成QApplication::tr("Open", "QShortcut"),或者调用QShortcut::tr("Open")(QShortcut作为QObject子类,它的tr函数默认上下文就是QShortcut)。
内容的提问来源于stack exchange,提问作者AvidCoder
相关产品推荐
相关产品推荐

