我希望有人能告诉我我在这里做错了什么,但我有一个示例项目,我尝试使用 qsTrIds 进行翻译,并且我在弄清楚为什么我的翻译无法正确加载时遇到问题- QML 对话框元素仅显示 qsTrId,例如“press-me”和“hello-world”,而不是翻译后的文本。
来源:https://github.com/StumpDragon/QtExampleApp
使用 Visual Studio 2022 社区和 Qt 6.7
我已经在项目上运行了配置,并编辑了翻译文件,然后运行:
cmake --build ..\build-QtExampleApp-Desktop_Qt_6_7_0_MSVC2019_64bit-Debug\ --target update_translations
和
cmake --build ..\build-QtExampleApp-Desktop_Qt_6_7_0_MSVC2019_64bit-Debug\ --target release_translations
知道我哪里可能出错吗?
在这里,我对我已经完成的一个翻译进行硬编码 - _en(如果我使用注释掉的 foreach 循环,我的系统默认使用 en-US。我没有这样的翻译 - Qt 默认是重新映射 _en 吗?
int main(int argc, char *argv[])
{
set_qt_environment();
QGuiApplication app(argc, argv);
QTranslator translator;
if ( translator.load(":/i18n/QtExampleApp_en") ) {
QCoreApplication::installTranslator(&translator);
}
/*const QStringList uiLanguages = QLocale::system().uiLanguages();
for (const QString &locale : uiLanguages) {
const QString baseName = "QtExampleApp_" + QLocale(locale).name();
if (translator.load(":/i18n/" + baseName)) {
app.installTranslator(&translator);
break;
}
}*/
QQmlApplicationEngine engine;
const QUrl url(u"qrc:/qt/qml/Main/main.qml"_qs);
QObject::connect(
&engine,
&QQmlApplicationEngine::objectCreated,
&app,
[url](QObject *obj, const QUrl &objUrl) {
if (!obj && url == objUrl)
QCoreApplication::exit(-1);
},
Qt::QueuedConnection);
engine.addImportPath(QCoreApplication::applicationDirPath() + "/qml");
engine.addImportPath(":/");
engine.load(url);
if (engine.rootObjects().isEmpty()) {
return -1;
}
return app.exec();
}
CMakeLists.txt 位:
qt_add_translations(TARGETS QtExampleApp
TS_FILE_DIR i18n
)
您的加载翻译器应该如下所示:
QTranslator translator;
if ( translator.load(QLocale(), "QtExampleApp", QLatin1String("_"), QLatin1String(":/i18n")) ) {
QCoreApplication::installTranslator(&translator);
}
Qt 将考虑
QLocale()
所反映的系统区域设置并确定要加载哪个翻译。
您还没有做的另一件事是使用带有 lupdate
和
lrelease
的 Qt 语言学家将“.ts”编译为“.qm”。您需要签入
qrc
的文件是 *.qm
文件,而不是源 *.ts
文件。
请熟悉 Qt linguist 以及
QTranslator::load()
的工作原理。
参考资料: