Skip to content

Commit 1f44c47

Browse files
BLumiadeepin-bot[bot]
authored andcommitted
chore: use another QTranslator::load overload to tidy code
使用另一个 QTranslator::load 重载来使代码更简洁,并潜在的支持 QLocale::uiLanguages(). 并且添加了一个额外的接口来方便其他项目更方便的调用. Log:
1 parent 28c53f3 commit 1f44c47

2 files changed

Lines changed: 45 additions & 42 deletions

File tree

include/kernel/dguiapplicationhelper.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,7 @@ class DGuiApplicationHelper : public QObject, public DCORE_NAMESPACE::DObject
124124
static QStringList userManualPaths(const QString &appName);
125125
bool hasUserManual() const;
126126

127+
static bool loadTranslator(const QString &fileName, const QString &appName, const QList<QLocale> &localeFallback = QList<QLocale>() << QLocale::system());
127128
static bool loadTranslator(const QString &fileName, const QList<QString> &translateDirs, const QList<QLocale> &localeFallback);
128129
static bool loadTranslator(const QList<QLocale> &localeFallback = QList<QLocale>() << QLocale::system());
129130

src/kernel/dguiapplicationhelper.cpp

Lines changed: 44 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
16351657
bool 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

17161718
DGuiApplicationHelper::SizeMode DGuiApplicationHelper::sizeMode() const

0 commit comments

Comments
 (0)