chore: use another QTranslator::load overload to tidy code

使用另一个 QTranslator::load 重载来使代码更简洁,并潜在的支持
QLocale::uiLanguages().

并且添加了一个额外的接口来方便其他项目更方便的调用.

Log:
This commit is contained in:
Wang Zichong 2025-06-04 15:20:51 +08:00 committed by deepin-bot[bot]
parent 28c53f37e7
commit 1f44c47e55
2 changed files with 45 additions and 42 deletions

View File

@ -124,6 +124,7 @@ public:
static QStringList userManualPaths(const QString &appName);
bool hasUserManual() const;
static bool loadTranslator(const QString &fileName, const QString &appName, const QList<QLocale> &localeFallback = QList<QLocale>() << QLocale::system());
static bool loadTranslator(const QString &fileName, const QList<QString> &translateDirs, const QList<QLocale> &localeFallback);
static bool loadTranslator(const QList<QLocale> &localeFallback = QList<QLocale>() << QLocale::system());

View File

@ -1632,6 +1632,28 @@ bool DGuiApplicationHelper::hasUserManual() const
return userManualPaths(qApp->applicationName()).size() > 0;
}
static inline QStringList translateDirs(const QString &appName)
{
Q_ASSERT(!appName.isEmpty());
QStringList dirs;
DCORE_USE_NAMESPACE
//("/home/user/.local/share", "/usr/local/share", "/usr/share")
auto dataDirs = DStandardPaths::standardLocations(QStandardPaths::GenericDataLocation);
for (const auto &path : dataDirs) {
DPathBuf pathBuf(path);
dirs << (pathBuf / appName / "translations").toString();
}
return dirs;
}
bool DGuiApplicationHelper::loadTranslator(const QString &fileName, const QString &appName, const QList<QLocale> &localeFallback)
{
return loadTranslator(fileName, translateDirs(appName), localeFallback);
}
bool DGuiApplicationHelper::loadTranslator(const QString &fileName, const QList<QString> &translateDirs, const QList<QLocale> &localeFallback)
{
DCORE_USE_NAMESPACE;
@ -1644,40 +1666,30 @@ bool DGuiApplicationHelper::loadTranslator(const QString &fileName, const QList<
for (auto item : defaultDirPrefix)
dirs << item.join("translations").toString();
QStringList missingQmfiles;
for (const auto &locale : localeFallback) {
QStringList translateFilenames {QString("%1_%2").arg(fileName).arg(locale.name())};
#if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0)
auto behavior = Qt::SkipEmptyParts;
#else
auto behavior = QString::SkipEmptyParts;
#endif
const QStringList parseLocalNameList = locale.name().split("_", behavior);
if (parseLocalNameList.length() > 0)
translateFilenames << QString("%1_%2").arg(fileName).arg(parseLocalNameList.at(0));
for (const auto &translateFilename : translateFilenames) {
for (const auto &dir : dirs) {
DPathBuf path(dir);
QString translatePath = (path / translateFilename).toString();
if (QFile::exists(translatePath + ".qm")) {
qCDebug(dgAppHelper) << "load translate" << translatePath;
auto translator = new QTranslator(qApp);
translator->load(translatePath);
qApp->installTranslator(translator);
qApp->setProperty("dapp_locale", locale.name());
return true;
}
for (const auto &dir : dirs) {
auto translator = new QTranslator(qApp);
// QTranslator::load(locale, filename, prefix, directory, suffix) automatically handles
// locale fallback (e.g., zh_CN -> zh -> C) and file existence checking
if (translator->load(locale, fileName, QString(), dir)) {
qCDebug(dgAppHelper) << "load translate" << fileName << "for locale" << locale.name() << "from" << dir;
qApp->installTranslator(translator);
qApp->setProperty("dapp_locale", locale.name());
return true;
}
// fix english does not need to translation.
if (locale.language() != QLocale::English)
missingQmfiles << translateFilename + ".qm";
delete translator; // Clean up if loading failed
}
}
if (missingQmfiles.size() > 0) {
qWarning() << fileName << "can not find qm files" << missingQmfiles;
// Collect locale names for warning message
QStringList localeNames;
for (const auto &locale : localeFallback) {
if (locale.language() != QLocale::English) // English does not need translation
localeNames << locale.name();
}
if (!localeNames.isEmpty()) {
qWarning() << fileName << "can not find qm files for locales" << localeNames;
}
return false;
}
@ -1692,25 +1704,15 @@ bool DGuiApplicationHelper::loadTranslator(const QList<QLocale> &localeFallback)
DCORE_USE_NAMESPACE
//("/home/user/.local/share", "/usr/local/share", "/usr/share")
auto dataDirs = DStandardPaths::standardLocations(QStandardPaths::GenericDataLocation);
QList<QString> qtranslateDirs = { qTranslationsPath };
for (const auto &path : dataDirs) {
DPathBuf pathBuf(path);
qtranslateDirs << (pathBuf / "qt" QT_STRINGIFY(QT_VERSION_MAJOR) / "translations").toString();
}
auto qtranslateDirs = translateDirs("qt" QT_STRINGIFY(QT_VERSION_MAJOR));
qtranslateDirs.prepend(qTranslationsPath);
loadTranslator("qt", qtranslateDirs, localeFallback);
loadTranslator("qtbase", qtranslateDirs, localeFallback);
QList<QString> translateDirs;
auto appName = qApp->applicationName();
for (const auto &path : dataDirs) {
DPathBuf pathBuf(path);
translateDirs << (pathBuf / appName / "translations").toString();
}
// ${translateDir}/${appName}_${localeName}.qm
return loadTranslator(appName, translateDirs, localeFallback);
return loadTranslator(appName, appName, localeFallback);
}
DGuiApplicationHelper::SizeMode DGuiApplicationHelper::sizeMode() const