@@ -1632,6 +1632,28 @@ bool DGuiApplicationHelper::hasUserManual() const
16321632 return userManualPaths (qApp->applicationName ()).size () > 0 ;
16331633}
16341634
1635+ static inline QStringList translateDirs (const QString &appName)
1636+ {
1637+ Q_ASSERT (!appName.isEmpty ());
1638+
1639+ QStringList dirs;
1640+
1641+ DCORE_USE_NAMESPACE
1642+ // ("/home/user/.local/share", "/usr/local/share", "/usr/share")
1643+ auto dataDirs = DStandardPaths::standardLocations (QStandardPaths::GenericDataLocation);
1644+ for (const auto &path : dataDirs) {
1645+ DPathBuf pathBuf (path);
1646+ dirs << (pathBuf / appName / " translations" ).toString ();
1647+ }
1648+
1649+ return dirs;
1650+ }
1651+
1652+ bool DGuiApplicationHelper::loadTranslator (const QString &fileName, const QString &appName, const QList<QLocale> &localeFallback)
1653+ {
1654+ return loadTranslator (fileName, translateDirs (appName), localeFallback);
1655+ }
1656+
16351657bool DGuiApplicationHelper::loadTranslator (const QString &fileName, const QList<QString> &translateDirs, const QList<QLocale> &localeFallback)
16361658{
16371659 DCORE_USE_NAMESPACE;
@@ -1644,40 +1666,30 @@ bool DGuiApplicationHelper::loadTranslator(const QString &fileName, const QList<
16441666 for (auto item : defaultDirPrefix)
16451667 dirs << item.join (" translations" ).toString ();
16461668
1647- QStringList missingQmfiles;
16481669 for (const auto &locale : localeFallback) {
1649- QStringList translateFilenames {QString (" %1_%2" ).arg (fileName).arg (locale.name ())};
1650- #if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0)
1651- auto behavior = Qt::SkipEmptyParts;
1652- #else
1653- auto behavior = QString::SkipEmptyParts;
1654- #endif
1655- const QStringList parseLocalNameList = locale.name ().split (" _" , behavior);
1656- if (parseLocalNameList.length () > 0 )
1657- translateFilenames << QString (" %1_%2" ).arg (fileName).arg (parseLocalNameList.at (0 ));
1658-
1659- for (const auto &translateFilename : translateFilenames) {
1660- for (const auto &dir : dirs) {
1661- DPathBuf path (dir);
1662- QString translatePath = (path / translateFilename).toString ();
1663- if (QFile::exists (translatePath + " .qm" )) {
1664- qCDebug (dgAppHelper) << " load translate" << translatePath;
1665- auto translator = new QTranslator (qApp);
1666- translator->load (translatePath);
1667- qApp->installTranslator (translator);
1668- qApp->setProperty (" dapp_locale" , locale.name ());
1669- return true ;
1670- }
1670+ for (const auto &dir : dirs) {
1671+ auto translator = new QTranslator (qApp);
1672+ // QTranslator::load(locale, filename, prefix, directory, suffix) automatically handles
1673+ // locale fallback (e.g., zh_CN -> zh -> C) and file existence checking
1674+ if (translator->load (locale, fileName, QString (), dir)) {
1675+ qCDebug (dgAppHelper) << " load translate" << fileName << " for locale" << locale.name () << " from" << dir;
1676+ qApp->installTranslator (translator);
1677+ qApp->setProperty (" dapp_locale" , locale.name ());
1678+ return true ;
16711679 }
1672-
1673- // fix english does not need to translation.
1674- if (locale.language () != QLocale::English)
1675- missingQmfiles << translateFilename + " .qm" ;
1680+ delete translator; // Clean up if loading failed
16761681 }
16771682 }
16781683
1679- if (missingQmfiles.size () > 0 ) {
1680- qWarning () << fileName << " can not find qm files" << missingQmfiles;
1684+ // Collect locale names for warning message
1685+ QStringList localeNames;
1686+ for (const auto &locale : localeFallback) {
1687+ if (locale.language () != QLocale::English) // English does not need translation
1688+ localeNames << locale.name ();
1689+ }
1690+
1691+ if (!localeNames.isEmpty ()) {
1692+ qWarning () << fileName << " can not find qm files for locales" << localeNames;
16811693 }
16821694 return false ;
16831695}
@@ -1692,25 +1704,15 @@ bool DGuiApplicationHelper::loadTranslator(const QList<QLocale> &localeFallback)
16921704
16931705 DCORE_USE_NAMESPACE
16941706 // ("/home/user/.local/share", "/usr/local/share", "/usr/share")
1695- auto dataDirs = DStandardPaths::standardLocations (QStandardPaths::GenericDataLocation);
1696- QList<QString> qtranslateDirs = { qTranslationsPath };
1697- for (const auto &path : dataDirs) {
1698- DPathBuf pathBuf (path);
1699- qtranslateDirs << (pathBuf / " qt" QT_STRINGIFY (QT_VERSION_MAJOR) / " translations" ).toString ();
1700- }
1707+ auto qtranslateDirs = translateDirs (" qt" QT_STRINGIFY (QT_VERSION_MAJOR));
1708+ qtranslateDirs.prepend (qTranslationsPath);
17011709
17021710 loadTranslator (" qt" , qtranslateDirs, localeFallback);
17031711 loadTranslator (" qtbase" , qtranslateDirs, localeFallback);
17041712
1705- QList<QString> translateDirs;
17061713 auto appName = qApp->applicationName ();
1707- for (const auto &path : dataDirs) {
1708- DPathBuf pathBuf (path);
1709- translateDirs << (pathBuf / appName / " translations" ).toString ();
1710- }
17111714
1712- // ${translateDir}/${appName}_${localeName}.qm
1713- return loadTranslator (appName, translateDirs, localeFallback);
1715+ return loadTranslator (appName, appName, localeFallback);
17141716}
17151717
17161718DGuiApplicationHelper::SizeMode DGuiApplicationHelper::sizeMode () const
0 commit comments