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.cpp114
1 files changed, 63 insertions, 51 deletions
diff --git a/src/core/Translator.cpp b/src/core/Translator.cpp
index 713727ea1..94aed3adf 100644
--- a/src/core/Translator.cpp
+++ b/src/core/Translator.cpp
@@ -1,4 +1,5 @@
/*
+ * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org>
* Copyright (C) 2014 Felix Geyer <debfx@fobos.de>
*
* This program is free software: you can redistribute it and/or modify
@@ -21,33 +22,48 @@
#include <QDir>
#include <QLibraryInfo>
#include <QLocale>
-#include <QRegExp>
#include <QTranslator>
+#include <QRegularExpression>
#include "config-keepassx.h"
#include "core/Config.h"
#include "core/FilePath.h"
-void Translator::installTranslator()
+/**
+ * Install all KeePassXC and Qt translators.
+ */
+void Translator::installTranslators()
{
QString language = config()->get("GUI/Language").toString();
if (language == "system" || language.isEmpty()) {
language = QLocale::system().name();
}
-
- if (!installTranslator(language)) {
- // English fallback still needs translations for plurals
- if (!installTranslator("en_plurals")) {
- qWarning("Couldn't load translations.");
- }
+ if (language == "en") {
+ // use actual English translation instead of the English locale source language
+ language = "en_US";
}
- installQtTranslator(language);
+ const QStringList paths = {
+#ifdef QT_DEBUG
+ QString("%1/share/translations").arg(KEEPASSX_BINARY_DIR),
+#endif
+ filePath()->dataPath("translations")
+ };
- availableLanguages();
+ bool translationsLoaded = false;
+ for (const QString& path : paths) {
+ translationsLoaded |= installTranslator(language, path) || installTranslator("en_US", path);
+ }
+ if (!translationsLoaded) {
+ // couldn't load configured language or fallback
+ qWarning("Couldn't load translations.");
+ }
}
-QList<QPair<QString, QString> > Translator::availableLanguages()
+/**
+ * @return list of pairs of available language codes and names
+ */
+QList<QPair<QString, QString>> Translator::availableLanguages()
{
const QStringList paths = {
#ifdef QT_DEBUG
@@ -59,18 +75,23 @@ QList<QPair<QString, QString> > Translator::availableLanguages()
QList<QPair<QString, QString> > languages;
languages.append(QPair<QString, QString>("system", "System default"));
- QRegExp regExp("keepassx_([a-zA-Z_]+)\\.qm", Qt::CaseInsensitive, QRegExp::RegExp2);
+ QRegularExpression regExp("^keepassx_([a-zA-Z_]+)\\.qm$", QRegularExpression::CaseInsensitiveOption);
for (const QString& path : paths) {
const QStringList fileList = QDir(path).entryList();
for (const QString& filename : fileList) {
- if (regExp.exactMatch(filename)) {
- QString langcode = regExp.cap(1);
- if (langcode == "en_plurals") {
- langcode = "en";
+ QRegularExpressionMatch match = regExp.match(filename);
+ if (match.hasMatch()) {
+ QString langcode = match.captured(1);
+ if (langcode == "en") {
+ continue;
}
QLocale locale(langcode);
QString languageStr = QLocale::languageToString(locale.language());
+ if (langcode == "la") {
+ // langcode "la" (Latin) is translated into "C" by QLocale::languageToString()
+ languageStr = "Latin";
+ }
QString countryStr;
if (langcode.contains("_")) {
countryStr = QString(" (%1)").arg(QLocale::countryToString(locale.country()));
@@ -85,46 +106,37 @@ QList<QPair<QString, QString> > Translator::availableLanguages()
return languages;
}
-bool Translator::installTranslator(const QString& language)
-{
- const QStringList paths = {
-#ifdef QT_DEBUG
- QString("%1/share/translations").arg(KEEPASSX_BINARY_DIR),
-#endif
- filePath()->dataPath("translations")
- };
-
- for (const QString& path : paths) {
- if (installTranslator(language, path)) {
- return true;
- }
- }
-
- return false;
-}
-
+/**
+ * Install KeePassXC translator.
+ *
+ * @param language translator language
+ * @param path local search path
+ * @return true on success
+ */
bool Translator::installTranslator(const QString& language, const QString& path)
{
- QTranslator* translator = new QTranslator(qApp);
- if (translator->load(QString("keepassx_").append(language), path)) {
- QCoreApplication::installTranslator(translator);
- return true;
- }
- else {
- delete translator;
- return false;
+ QScopedPointer<QTranslator> translator(new QTranslator(qApp));
+ if (translator->load(QString("keepassx_%1").arg(language), path)) {
+ return QCoreApplication::installTranslator(translator.take());
}
+ return false;
}
-bool Translator::installQtTranslator(const QString& language)
+/**
+ * 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 QString& language, const QString& path)
{
- QTranslator* qtTranslator = new QTranslator(qApp);
- if (qtTranslator->load(QString("%1/qtbase_%2").arg(QLibraryInfo::location(QLibraryInfo::TranslationsPath), language))) {
- QCoreApplication::installTranslator(qtTranslator);
- return true;
- }
- else {
- delete qtTranslator;
- return false;
+ QScopedPointer<QTranslator> qtTranslator(new QTranslator(qApp));
+ if (qtTranslator->load(QString("qtbase_%1").arg(language), path)) {
+ return QCoreApplication::installTranslator(qtTranslator.take());
+ } else if (qtTranslator->load(QString("qtbase_%1").arg(language), QLibraryInfo::location(QLibraryInfo::TranslationsPath))) {
+ return QCoreApplication::installTranslator(qtTranslator.take());
}
+ return false;
}