00001 #include <qapplication.h> 00002 #include <qsqldatabase.h> 00003 00004 using namespace std; 00005 00006 #include "langsettings.h" 00007 #include "settings.h" 00008 #include "mythcontext.h" 00009 00010 00011 // LangEditor provides the GUI for the prompt() routine. 00012 00013 class LangEditorSetting : public ListBoxSetting, public Storage 00014 { 00015 public: 00016 LangEditorSetting() : ListBoxSetting(this) 00017 { 00018 setLabel(QObject::tr("Select your preferred language")); 00019 }; 00020 00021 virtual void load() { 00022 LanguageSettings::fillSelections(this); 00023 }; 00024 00025 virtual void save() { 00026 gContext->SetSetting("Language", getValue()); 00027 gContext->SaveSetting("Language", getValue()); 00028 LanguageSettings::reload(); 00029 }; 00030 00031 virtual void save(QString /*destination*/) { } 00032 }; 00033 00034 // LanguageSettingsPrivate holds our persistent data. 00035 // It's a singleton class, instantiated in the static 00036 // member variable d of LanguageSettings. 00037 00038 typedef QMap<QString, QTranslator*> TransMap; 00039 00040 class LanguageSettingsPrivate { 00041 public: 00042 LanguageSettingsPrivate(): 00043 m_loaded(false), 00044 m_language("") { }; 00045 00046 void Init(void) { 00047 if (!m_loaded) 00048 { 00049 m_loaded = "loaded"; 00050 m_language = gContext->GetSetting("Language"); 00051 } 00052 }; 00053 00054 bool LanguageChanged(void) { 00055 QString cur_language = gContext->GetSetting("Language"); 00056 bool ret = false; 00057 if (!cur_language.isEmpty() && 00058 cur_language.compare(m_language)) 00059 ret = true; 00060 m_language = cur_language; 00061 return ret; 00062 }; 00063 00064 bool m_loaded; 00065 QString m_language; 00066 TransMap m_translators; 00067 }; 00068 00069 LanguageSettingsPrivate LanguageSettings::d; 00070 00071 void LanguageSettings::load(QString module_name) 00072 { 00073 d.Init(); 00074 if (!d.m_language.isEmpty()) 00075 { 00076 // unload any previous version 00077 unload(module_name); 00078 00079 // install translator 00080 QTranslator *trans = new QTranslator(0); 00081 trans->load(gContext->GetTranslationsDir() + 00082 module_name + QString("_") + 00083 d.m_language.lower() + QString(".qm"), "."); 00084 qApp->installTranslator(trans); 00085 d.m_translators[module_name] = trans; 00086 } 00087 } 00088 00089 void LanguageSettings::unload(QString module_name) 00090 { 00091 TransMap::Iterator it = d.m_translators.find(module_name); 00092 if (it != d.m_translators.end()) 00093 { 00094 // found translator, remove it from qApp and our map 00095 qApp->removeTranslator(it.data()); 00096 delete it.data(); 00097 d.m_translators.remove(it); 00098 } 00099 } 00100 00101 void LanguageSettings::prompt(bool force) 00102 { 00103 d.Init(); 00104 // Ask for language if we don't already know. 00105 if (force || d.m_language.isEmpty()) 00106 { 00107 ConfigurationDialog langEdit; 00108 langEdit.addChild(new LangEditorSetting()); 00109 langEdit.exec(); 00110 } 00111 // Always update the database, even if there's 00112 // no change -- during bootstrapping, we don't 00113 // actually get to write to the database until 00114 // a later run, so do it every time. 00115 gContext->SaveSetting("Language", d.m_language); 00116 } 00117 00118 void LanguageSettings::reload(void) 00119 { 00120 // Update our translators if necessary. 00121 // We need two loops, as the QMap wasn't happy with 00122 // me changing its contents during my iteration. 00123 if (d.LanguageChanged()) 00124 { 00125 QStringList keys; 00126 for (TransMap::Iterator it = d.m_translators.begin(); 00127 it != d.m_translators.end(); 00128 ++it) 00129 keys.append(it.key()); 00130 00131 for (QStringList::Iterator it = keys.begin(); 00132 it != keys.end(); 00133 ++it) 00134 load(*it); 00135 } 00136 } 00137 00138 QStringList LanguageSettings::getLanguages(void) 00139 { 00140 QStringList langs; 00141 langs << QString::fromUtf8("English (US)")<< "EN" // English 00142 << QString::fromUtf8("Italiano") << "IT" // Italian 00143 << QString::fromUtf8("Català") 00144 << "CA" // Catalan 00145 << QString::fromUtf8("Español") 00146 << "ES" // Spanish 00147 << QString::fromUtf8("Nederlands") << "NL" // Dutch 00148 << QString::fromUtf8("Français") 00149 << "FR" // French 00150 << QString::fromUtf8("Deutsch") << "DE" // German 00151 << QString::fromUtf8("Dansk") << "DK" // Danish 00152 << QString::fromUtf8("Islenska") << "IS" // Icelandic 00153 << QString::fromUtf8("Norsk (bokmål)") 00154 << "NB" // Norwegian (bokmal) 00155 << QString::fromUtf8("Svenska") << "SV" // Swedish 00156 << QString::fromUtf8("Polski") << "PL" // Polish 00157 << QString::fromUtf8("Português") 00158 << "PT" // Portuguese 00159 << QString::fromUtf8("Nihongo") << "JA" // Japanese 00160 << QString::fromUtf8("Slovenski") << "SI" // Slovenian 00161 << QString::fromUtf8("Suomi") << "FI" // Finnish 00162 << QString::fromUtf8("Hanzi (Traditional)") 00163 << "ZH_TW" // Traditional Chinese 00164 << QString::fromUtf8("Eesti") << "ET" // Estonian 00165 << QString::fromUtf8("Português Brasileiro") 00166 << "PT_BR" // Brazilian Portuguese 00167 << QString::fromUtf8("English (British)") 00168 << "EN_GB" // British English 00169 << QString::fromUtf8("Česky") 00170 << "CZ" // Czech 00171 << QString::fromUtf8("Türkçe") 00172 << "TR" // Turkish 00173 << QString::fromUtf8("Русский") 00174 << "RU" // Russian 00175 << QString::fromUtf8("עברית") 00176 << "HE" // Hebrew 00177 << QString::fromUtf8("العربية") 00178 << "AR"; // Arabic 00179 ; 00180 return langs; 00181 } 00182 00183 void LanguageSettings::fillSelections(SelectSetting *widget) 00184 { 00185 QStringList langs = LanguageSettings::getLanguages(); 00186 widget->clearSelections(); 00187 for (QStringList::Iterator it = langs.begin(); it != langs.end(); ++it) 00188 { 00189 QString label = *it; 00190 QString value = *(++it); 00191 widget->addSelection(label, value); 00192 } 00193 } 00194
1.5.5