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);