QQmlApplicationEngineの翻訳関連のバグを修正しました

というノリで、修正をしました。

パッチは Fix for loading translations automatically from resources です。

--- src/qml/qml/qqmlapplicationengine.cpp
+++ src/qml/qml/qqmlapplicationengine.cpp
@@ -76,7 +76,7 @@
                &QCoreApplication::exit, Qt::QueuedConnection);
 #if QT_CONFIG(translation)
     QTranslator* qtTranslator = new QTranslator;
-    if (qtTranslator->load(QLocale(), QLatin1String("qt"), QLatin1String("_"), QLibraryInfo::location(QLibraryInfo::TranslationsPath)))
+    if (qtTranslator->load(QLocale(), QLatin1String("qt"), QLatin1String("_"), QLibraryInfo::location(QLibraryInfo::TranslationsPath), QLatin1String(".qm")))
         QCoreApplication::installTranslator(qtTranslator);
     translators << qtTranslator;
 #endif
@@ -90,10 +90,10 @@
     if (rootFile.scheme() != QLatin1String("file") && rootFile.scheme() != QLatin1String("qrc"))
         return;
 
-    QFileInfo fi(rootFile.toLocalFile());
+    QFileInfo fi(QQmlFile::urlToLocalFileOrQrc(rootFile));
 
     QTranslator *translator = new QTranslator;
-    if (translator->load(QLocale(), QLatin1String("qml"), QLatin1String("_"), fi.path() + QLatin1String("/i18n"))) {
+    if (translator->load(QLocale(), QLatin1String("qml"), QLatin1String("_"), fi.path() + QLatin1String("/i18n"), QLatin1String(".qm"))) {
         QCoreApplication::installTranslator(translator);
         translators << translator;
     } else {
@@ -180,6 +180,9 @@
   \list
   \li Connecting Qt.quit() to QCoreApplication::quit()
   \li Automatically loads translation files from an i18n directory adjacent to the main QML file.
+      \list
+          \li Translation files must have "qml_" prefix e.g. qml_ja_JP.qm.
+      \endlist
   \li Automatically sets an incubation controller if the scene contains a QQuickWindow.
   \li Automatically sets a \c QQmlFileSelector as the url interceptor, applying file selectors to all
   QML files and assets.

修正自体は瞬殺でしたが、そのあと、「そもそもこれなんのバグ直してるの?」的なツッコミが入って translation files are not loaded automatically when main qml is in resource というバグレポート をちゃんと書いたり、「いい機会だからテストも書いてよ」と言われて書かされたり、ドキュメントも直したり。

ついでに気になったところ 1 2 を直したら、「それはバグの修正じゃないから 5.12 じゃなくて dev ブランチでやってくれ」と言われて手こずっていたりしますが、まぁそれはいつものことということで。

おすすめ