diff --git a/CMakeLists.txt b/CMakeLists.txt index c9d091e73..6fd6003d3 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -370,6 +370,7 @@ set(APP_HEADERS # CORE headers. src/core/settings.h + src/core/localization.h src/core/basenetworkaccessmanager.h src/core/webbrowsernetworkaccessmanager.h src/core/silentnetworkaccessmanager.h @@ -395,17 +396,17 @@ set(APP_FORMS # Add translations. set(APP_TRANSLATIONS - localization/rssguard_en.ts - localization/rssguard_cs.ts - localization/rssguard_nl.ts - localization/qt_cs.ts - localization/qt_nl.ts + localization/rssguard-en_GB.ts + localization/rssguard-cs_CZ.ts + localization/rssguard-nl_NL.ts + localization/qt-cs_CZ.ts + localization/qt-nl_NL.ts ) set(APP_TRANSLATIONS_WO_QT - localization/rssguard_en.ts - localization/rssguard_cs.ts - localization/rssguard_nl.ts + localization/rssguard-en_GB.ts + localization/rssguard-cs_CZ.ts + localization/rssguard-nl_NL.ts ) set(APP_TEXT diff --git a/localization/qt_cs.ts b/localization/qt-cs_CZ.ts similarity index 100% rename from localization/qt_cs.ts rename to localization/qt-cs_CZ.ts diff --git a/localization/qt_nl.ts b/localization/qt-nl_NL.ts similarity index 100% rename from localization/qt_nl.ts rename to localization/qt-nl_NL.ts diff --git a/localization/rssguard_cs.ts b/localization/rssguard-cs_CZ.ts similarity index 99% rename from localization/rssguard_cs.ts rename to localization/rssguard-cs_CZ.ts index 256b4bad6..129c6e163 100644 --- a/localization/rssguard_cs.ts +++ b/localization/rssguard-cs_CZ.ts @@ -1553,8 +1553,8 @@ Autoři této aplikace nenesou žádnou odpovědnost za ztrátu Vašich dat. LANG_ABBREV - Abbreviation of language, e.g. en. Use ISO 639-1 code here. They may be combined with ISO 3166-1 (alpha-2) codes. Examples: "cs", "nl", "en", "cs_CZ", "en_GB", "en_US". - cs + Abbreviation of language, e.g. en. Use ISO 639-1 code here combined with ISO 3166-1 (alpha-2) code. Examples: "cs_CZ", "en_GB", "en_US". + cs_CZ LANG_VERSION diff --git a/localization/rssguard_en.ts b/localization/rssguard-en_GB.ts similarity index 99% rename from localization/rssguard_en.ts rename to localization/rssguard-en_GB.ts index b3e7bb36f..520a16f81 100644 --- a/localization/rssguard_en.ts +++ b/localization/rssguard-en_GB.ts @@ -1535,8 +1535,8 @@ Authors of this application are NOT responsible for lost data. LANG_ABBREV - Abbreviation of language, e.g. en. Use ISO 639-1 code here. They may be combined with ISO 3166-1 (alpha-2) codes. Examples: "cs", "nl", "en", "cs_CZ", "en_GB", "en_US". - en + Abbreviation of language, e.g. en. Use ISO 639-1 code here combined with ISO 3166-1 (alpha-2) code. Examples: "cs_CZ", "en_GB", "en_US". + en_GB LANG_VERSION diff --git a/localization/rssguard_nl.ts b/localization/rssguard-nl_NL.ts similarity index 99% rename from localization/rssguard_nl.ts rename to localization/rssguard-nl_NL.ts index d2eaa5c0c..79becb16b 100644 --- a/localization/rssguard_nl.ts +++ b/localization/rssguard-nl_NL.ts @@ -1553,8 +1553,8 @@ Auteurs van Rssguard zijn NIET verantwoordelijk voor verlies van gegevens. LANG_ABBREV - Abbreviation of language, e.g. en. Use ISO 639-1 code here. They may be combined with ISO 3166-1 (alpha-2) codes. Examples: "cs", "nl", "en", "cs_CZ", "en_GB", "en_US". - nl + Abbreviation of language, e.g. en. Use ISO 639-1 code here combined with ISO 3166-1 (alpha-2) code. Examples: "cs_CZ", "en_GB", "en_US". + nl_NL LANG_VERSION diff --git a/resources/graphics/icons/mini-kfaenza/cs.png b/resources/graphics/icons/mini-kfaenza/cs_CZ.png similarity index 100% rename from resources/graphics/icons/mini-kfaenza/cs.png rename to resources/graphics/icons/mini-kfaenza/cs_CZ.png diff --git a/resources/graphics/icons/mini-kfaenza/en.png b/resources/graphics/icons/mini-kfaenza/en_GB.png similarity index 100% rename from resources/graphics/icons/mini-kfaenza/en.png rename to resources/graphics/icons/mini-kfaenza/en_GB.png diff --git a/resources/graphics/icons/mini-kfaenza/nl.png b/resources/graphics/icons/mini-kfaenza/nl_NL.png similarity index 100% rename from resources/graphics/icons/mini-kfaenza/nl.png rename to resources/graphics/icons/mini-kfaenza/nl_NL.png diff --git a/src/core/defs.h.in b/src/core/defs.h.in index 9423110e2..2878eab6f 100755 --- a/src/core/defs.h.in +++ b/src/core/defs.h.in @@ -23,6 +23,7 @@ #define APP_VERSION "@APP_VERSION@" #define APP_USERAGENT QString("@APP_NAME@/@APP_VERSION@ (@APP_URL@) on @CMAKE_SYSTEM@; Webkit/") + qWebKitVersion() +#define DEFAULT_LOCALE "en_GB" #define DEFAULT_FEED_ENCODING "UTF-8" #define URL_REGEXP "^(http|https|feed|ftp):\\/\\/[\\w\\-_]+(\\.[\\w\\-_]+)+([\\w\\-\\.,@?^=%&:/~\\+#]*[\\w\\-\\@?^=%&/~\\+#])?$" #define USER_AGENT_HTTP_HEADER "User-Agent" diff --git a/src/core/localization.cpp b/src/core/localization.cpp index 70ab54dbe..1b9d7ae45 100644 --- a/src/core/localization.cpp +++ b/src/core/localization.cpp @@ -12,43 +12,62 @@ #include -Localization::Localization() { +QPointer Localization::s_instance; + +Localization::Localization(QObject *parent) + : QObject(parent) { +} + +Localization::~Localization() { + qDebug("Destroying Localization instance."); +} + +Localization *Localization::instance() { + if (s_instance.isNull()) { + s_instance = new Localization(qApp); + } + + return s_instance; +} + +QString Localization::desiredLanguage() { + return Settings::instance()->value(APP_CFG_GEN, + "language", + QLocale::system().name()).toString(); } void Localization::load() { QTranslator *qt_translator = new QTranslator(qApp); QTranslator *app_translator = new QTranslator(qApp); - QString locale_system = QLocale::system().name(); - QString locale_name = Settings::instance()->value(APP_CFG_GEN, - "language", - locale_system).toString(); + QString desired_localization = desiredLanguage(); - qDebug("Try to load application localization. " - "System locale was detected as '%s'. " - "Trying to load localization for '%s'.", - qPrintable(locale_system), - qPrintable(locale_name)); - - if (app_translator->load(QString("rssguard_%1.qm").arg(locale_name), - APP_LANG_PATH)) { + if (app_translator->load(QString("rssguard-%1.qm").arg(desired_localization), + APP_LANG_PATH, + "-")) { QApplication::installTranslator(app_translator); qDebug("Application localization '%s' loaded successfully.", - qPrintable(locale_name)); + qPrintable(desired_localization)); } else { - qWarning("Application localization '%s' was not loaded.", qPrintable(locale_name)); - } - if (qt_translator->load(QString("qt_%1.qm").arg(locale_name), - APP_LANG_PATH)) { - QApplication::installTranslator(qt_translator); - qDebug("Qt localization '%s' loaded successfully.", - qPrintable(locale_name)); - } - else { - qWarning("Qt localization '%s' was not loaded.", qPrintable(locale_name)); + qWarning("Application localization '%s' was not loaded.", qPrintable(desired_localization)); + + m_loadedLanguage = DEFAULT_LOCALE; + return; } - QLocale::setDefault(QLocale(locale_name)); + if (qt_translator->load(QString("qt-%1.qm").arg(desired_localization), + APP_LANG_PATH, + "-")) { + QApplication::installTranslator(qt_translator); + qDebug("Qt localization '%s' loaded successfully.", + qPrintable(desired_localization)); + } + else { + qWarning("Qt localization '%s' was not loaded.", qPrintable(desired_localization)); + } + + m_loadedLanguage = desired_localization; + QLocale::setDefault(QLocale(desired_localization)); } QList Localization::installedLanguages() { @@ -57,7 +76,7 @@ QList Localization::installedLanguages() { QTranslator translator; // Iterate all found language files. - foreach (const QFileInfo &file, file_dir.entryInfoList(QStringList() << "rssguard_*.qm", + foreach (const QFileInfo &file, file_dir.entryInfoList(QStringList() << "rssguard-*.qm", QDir::Files, QDir::Name)) { if (translator.load(file.absoluteFilePath())) { @@ -73,3 +92,4 @@ QList Localization::installedLanguages() { } return languages; } + diff --git a/src/core/localization.h b/src/core/localization.h index 7a09bc507..44f241381 100644 --- a/src/core/localization.h +++ b/src/core/localization.h @@ -2,6 +2,8 @@ #define LOCALIZATION_H #include +#include +#include struct Language { @@ -12,18 +14,43 @@ struct Language { QString m_email; }; -class Localization { +class Localization : public QObject { + Q_OBJECT + private: // Constructor. - explicit Localization(); + explicit Localization(QObject *parent = 0); public: + // Destructor. + virtual ~Localization(); + + // Singleton getter. + static Localization *instance(); + + // Returns code of language that should + // be loaded according to settings. + QString desiredLanguage(); + // Loads currently active language. - static void load(); + void load(); // Returns list of installed application localizations. // This list is used ie. in settings dialog. - static QList installedLanguages(); + QList installedLanguages(); + + // Returns empty string or loaded language + // name if it is really loaded. + inline QString loadedLanguage() const { + return m_loadedLanguage; + } + + private: + // Code of loaded language. + QString m_loadedLanguage; + + // Singleton. + static QPointer s_instance; }; #endif // LOCALIZATION_H diff --git a/src/gui/formsettings.cpp b/src/gui/formsettings.cpp index ee9e0f62e..a5197b98a 100755 --- a/src/gui/formsettings.cpp +++ b/src/gui/formsettings.cpp @@ -391,7 +391,7 @@ void FormSettings::saveProxy() { } void FormSettings::loadLanguage() { - foreach (const Language &language, Localization::installedLanguages()) { + foreach (const Language &language, Localization::instance()->installedLanguages()) { QTreeWidgetItem *item = new QTreeWidgetItem(m_ui->m_treeLanguages); item->setText(0, language.m_name); item->setText(1, language.m_code); @@ -401,10 +401,8 @@ void FormSettings::loadLanguage() { item->setIcon(0, IconThemeFactory::instance()->fromTheme(language.m_code)); } - QList matching_items = m_ui->m_treeLanguages->findItems(Settings::instance()->value(APP_CFG_GEN, - "language", - "en").toString(), - Qt::MatchExactly, + QList matching_items = m_ui->m_treeLanguages->findItems(Localization::instance()->loadedLanguage(), + Qt::MatchContains, 1); if (!matching_items.isEmpty()) { m_ui->m_treeLanguages->setCurrentItem(matching_items[0]); @@ -418,9 +416,7 @@ void FormSettings::saveLanguage() { } Settings *settings = Settings::instance(); - QString actual_lang = settings->value(APP_CFG_GEN, - "language", - "en").toString(); + QString actual_lang = Localization::instance()->loadedLanguage(); QString new_lang = m_ui->m_treeLanguages->currentItem()->text(1); // Save prompt for restart if language has changed. diff --git a/src/main.cpp b/src/main.cpp index f8011c6b1..2de3c3b1f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -27,8 +27,8 @@ int main(int argc, char *argv[]) { //: Name of language, e.g. English. QObject::tr("LANG_NAME"); //: Abbreviation of language, e.g. en. - //: Use ISO 639-1 code here. They may be combined with ISO 3166-1 (alpha-2) codes. - //: Examples: "cs", "nl", "en", "cs_CZ", "en_GB", "en_US". + //: Use ISO 639-1 code here combined with ISO 3166-1 (alpha-2) code. + //: Examples: "cs_CZ", "en_GB", "en_US". QObject::tr("LANG_ABBREV"); //: Version of your translation, e.g. 1.0. QObject::tr("LANG_VERSION"); @@ -67,7 +67,7 @@ int main(int argc, char *argv[]) { // Load localization and setup locale before any widget is constructed. //LoadLocalization(); - Localization::load(); + Localization::instance()->load(); // These settings needs to be set before any QSettings object. QtSingleApplication::setApplicationName(APP_NAME);