Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/keepassxreboot/keepassxc.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/Translator.cpp')
-rw-r--r--src/core/Translator.cpp105
1 files changed, 59 insertions, 46 deletions
diff --git a/src/core/Translator.cpp b/src/core/Translator.cpp
index 95de3ce91..4e3f568cb 100644
--- a/src/core/Translator.cpp
+++ b/src/core/Translator.cpp
@@ -34,16 +34,21 @@
*/
void Translator::installTranslators()
{
- QLocale locale;
- QString language = config()->get("GUI/Language").toString();
- if (!language.isEmpty() && language != "system") {
- // use actual English translation instead of the English locale source language
- if (language == "en") {
- language = "en_US";
- }
- locale = QLocale(language);
+ QStringList languages;
+ QString languageSetting = config()->get("GUI/Language").toString();
+ if (languageSetting.isEmpty() || languageSetting == "system") {
+ // NOTE: this is a workaround for the terrible way Qt loads languages
+ // using the QLocale::uiLanguages() approach. Instead, we search each
+ // language and all country variants in order before moving to the next.
+ QLocale locale;
+ languages = locale.uiLanguages();
+ } else {
+ languages << languageSetting;
}
+ // Always try to load english last
+ languages << "en_US";
+
const QStringList paths = {
#ifdef QT_DEBUG
QString("%1/share/translations").arg(KEEPASSX_BINARY_DIR),
@@ -52,9 +57,10 @@ void Translator::installTranslators()
bool translationsLoaded = false;
for (const QString& path : paths) {
- translationsLoaded |= installTranslator(locale, path) || installTranslator(QLocale("en_US"), path);
- if (!installQtTranslator(language, path)) {
- installQtTranslator(QLocale("en"), path);
+ installQtTranslator(languages, path);
+ if (installTranslator(languages, path)) {
+ translationsLoaded = true;
+ break;
}
}
@@ -65,6 +71,48 @@ void Translator::installTranslators()
}
/**
+ * Install KeePassXC translator.
+ *
+ * @param languages priority-ordered list of languages
+ * @param path absolute search path
+ * @return true on success
+ */
+bool Translator::installTranslator(const QStringList& languages, const QString& path)
+{
+ for (const auto& language : languages) {
+ QLocale locale(language);
+ QScopedPointer<QTranslator> translator(new QTranslator(qApp));
+ if (translator->load(locale, "keepassx_", "", path)) {
+ return QCoreApplication::installTranslator(translator.take());
+ }
+ }
+
+ return false;
+}
+
+/**
+ * Install Qt5 base translator from the specified local search path or the default system path
+ * if no qtbase_* translations were found at the local path.
+ *
+ * @param languages priority-ordered list of languages
+ * @param path absolute search path
+ * @return true on success
+ */
+bool Translator::installQtTranslator(const QStringList& languages, const QString& path)
+{
+ for (const auto& language : languages) {
+ QLocale locale(language);
+ QScopedPointer<QTranslator> qtTranslator(new QTranslator(qApp));
+ if (qtTranslator->load(locale, "qtbase_", "", path)) {
+ return QCoreApplication::installTranslator(qtTranslator.take());
+ } else if (qtTranslator->load(locale, "qtbase_", "", QLibraryInfo::location(QLibraryInfo::TranslationsPath))) {
+ return QCoreApplication::installTranslator(qtTranslator.take());
+ }
+ }
+ return false;
+}
+
+/**
* @return list of pairs of available language codes and names
*/
QList<QPair<QString, QString>> Translator::availableLanguages()
@@ -108,38 +156,3 @@ QList<QPair<QString, QString>> Translator::availableLanguages()
return languages;
}
-
-/**
- * Install KeePassXC translator.
- *
- * @param language translator language
- * @param path local search path
- * @return true on success
- */
-bool Translator::installTranslator(const QLocale& locale, const QString& path)
-{
- QScopedPointer<QTranslator> translator(new QTranslator(qApp));
- if (translator->load(locale, "keepassx_", "", path)) {
- return QCoreApplication::installTranslator(translator.take());
- }
- return false;
-}
-
-/**
- * Install Qt5 base translator from the specified local search path or the default system path
- * if no qtbase_* translations were found at the local path.
- *
- * @param language translator language
- * @param path local search path
- * @return true on success
- */
-bool Translator::installQtTranslator(const QLocale& locale, const QString& path)
-{
- QScopedPointer<QTranslator> qtTranslator(new QTranslator(qApp));
- if (qtTranslator->load(locale, "qtbase_", "", path)) {
- return QCoreApplication::installTranslator(qtTranslator.take());
- } else if (qtTranslator->load(locale, "qtbase_", "", QLibraryInfo::location(QLibraryInfo::TranslationsPath))) {
- return QCoreApplication::installTranslator(qtTranslator.take());
- }
- return false;
-}