summaryrefslogtreecommitdiffstats
path: root/kpersonalizer/kfindlanguage.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kpersonalizer/kfindlanguage.cpp')
-rw-r--r--kpersonalizer/kfindlanguage.cpp151
1 files changed, 151 insertions, 0 deletions
diff --git a/kpersonalizer/kfindlanguage.cpp b/kpersonalizer/kfindlanguage.cpp
new file mode 100644
index 000000000..b1ebb419b
--- /dev/null
+++ b/kpersonalizer/kfindlanguage.cpp
@@ -0,0 +1,151 @@
+/***************************************************************************
+ kfindlanguage.cpp - description
+ -------------------
+ begin : Tue May 22 2001
+ copyright : (C) 2002 by Carsten Wolff
+ email : wolff@kde.org
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include <stdlib.h>
+
+#include <qstring.h>
+#include <qstringlist.h>
+#include <qmap.h>
+
+#include <ksimpleconfig.h>
+#include <kglobal.h>
+#include <kstandarddirs.h>
+#include <klocale.h>
+
+#include "kfindlanguage.h"
+
+KFindLanguage::KFindLanguage() {
+ KConfig *config = KGlobal::config();
+ config->setGroup("Locale");
+
+ m_oldlang = config->readEntry("Language");
+ m_oldlang = m_oldlang.lower();
+ m_oldlang = m_oldlang.left(m_oldlang.find(':')); // only use the first lang
+
+ m_country = config->readEntry("Country", "C");
+ if (m_country == "C") {
+ m_country = QString::fromLatin1(getenv("LANG"));
+ if(m_country.left(5) == "nn_NO") // glibc's nn_NO is KDE's no_NY
+ m_country = "no";
+ if(m_country.contains("_"))
+ m_country = m_country.mid(m_country.find("_")+1);
+ if(m_country.contains("."))
+ m_country = m_country.left(m_country.find("."));
+ if(m_country.contains("@"))
+ m_country = m_country.left(m_country.find("@"));
+ if(m_country != "C")
+ m_country = m_country.lower();
+ if(m_country == "en") // special-case "en" - should be "en_GB" or "en_US", but plain "en" is in use quite often
+ m_country = "C";
+ }
+
+ // get the users primary Languages
+ KSimpleConfig ent(locate("locale", QString::fromLatin1("l10n/%1/entry.desktop").arg(m_country)), true);
+ ent.setGroup("KCM Locale");
+ QStringList langs = ent.readListEntry("Languages");
+ if (langs.isEmpty())
+ langs.append("en_US");
+
+ // add the primary languages for the country to the list
+ QStringList prilang;
+ for ( QStringList::ConstIterator it = langs.begin(); it != langs.end(); ++it ) {
+ QString str = locate("locale", *it + "/entry.desktop");
+ if (!str.isNull())
+ prilang << str;
+ }
+
+ // add all languages to the list
+ QStringList alllang = KGlobal::dirs()->findAllResources("locale", "*/entry.desktop", false, true);
+ alllang.sort();
+ QStringList langlist = prilang;
+ if (langlist.count() > 0)
+ langlist << QString::null; // separator
+ langlist += alllang;
+
+ for ( QStringList::ConstIterator it = langlist.begin(); it != langlist.end(); ++it ) {
+ KSimpleConfig entry(*it);
+ entry.setGroup("KCM Locale");
+ QString name = entry.readEntry("Name", i18n("without name"));
+
+ QString tag = *it;
+ int index = tag.findRev('/');
+ tag = tag.left(index);
+ index = tag.findRev('/');
+ tag = tag.mid(index+1);
+
+ m_langlist << tag;
+ m_langmap.insert(tag, name);
+ }
+
+ // now find the best language for the user
+ QString compare = m_oldlang;
+ if (m_oldlang.isEmpty()) {
+ compare = langs.first();
+ for(QStringList::Iterator it = langs.begin(); it != langs.end(); ++it) {
+ if (*it == QString::fromLatin1(getenv("LANG")).mid(3, 2).lower())
+ compare = *it;
+ }
+ }
+ if(compare == "c")
+ compare = "C";
+
+ // Find the users's language
+ int bestmatch = -1;
+
+ QStringList::ConstIterator it;
+ for( it = m_langlist.begin(); it != m_langlist.end(); ++it) {
+ int match=0;
+ QString l = (*it).left((*it).find(";"));
+ if (l == "C")
+ match++;
+ if(l.contains(compare))
+ match+=2;
+ if(l.left(compare.length()) == compare)
+ match+=10;
+ if(compare == "en_US" && l == "C")
+ match+=50;
+ if (l == compare)
+ match+=100;
+ if(match > bestmatch) {
+ bestmatch=match;
+ m_bestlang=l;
+ }
+ }
+}
+
+KFindLanguage::~KFindLanguage() {
+}
+
+QStringList KFindLanguage::getLangList() const {
+ return m_langlist;
+}
+
+QMap<QString,QString> KFindLanguage::getLangMap() const {
+ return m_langmap;
+}
+
+QString KFindLanguage::getBestLang() const {
+ return m_bestlang;
+}
+
+QString KFindLanguage::getOldLang() const {
+ return m_oldlang;
+}
+
+QString KFindLanguage::getCountry() const {
+ return m_country;
+}