GUI: Refactoring translation handling.

Instead of separate language name and filename lists use one
list of structs. This makes language name and filename more
connected and makes handling of them easier.
This commit is contained in:
Kimmo Varis 2011-02-06 22:00:16 +02:00
parent 7d9f8e1706
commit 64a70fa51c
2 changed files with 48 additions and 36 deletions

View File

@ -29,25 +29,15 @@ TranslationHandler::TranslationHandler(QObject *parent) :
{ {
// Add our available languages // Add our available languages
// Keep this list sorted // Keep this list sorted
mNames << QT_TRANSLATE_NOOP("MainWindow", "Dutch") AddTranslation(QT_TRANSLATE_NOOP("MainWindow", "Dutch"), "cppcheck_nl");
<< QT_TRANSLATE_NOOP("MainWindow", "English") AddTranslation(QT_TRANSLATE_NOOP("MainWindow", "English"), "cppcheck_en");
<< QT_TRANSLATE_NOOP("MainWindow", "Finnish") AddTranslation(QT_TRANSLATE_NOOP("MainWindow", "Finnish"), "cppcheck_fi");
<< QT_TRANSLATE_NOOP("MainWindow", "German") AddTranslation(QT_TRANSLATE_NOOP("MainWindow", "German"), "cppcheck_de");
<< QT_TRANSLATE_NOOP("MainWindow", "Japanese") AddTranslation(QT_TRANSLATE_NOOP("MainWindow", "Japanese"), "cppcheck_ja");
<< QT_TRANSLATE_NOOP("MainWindow", "Polish") AddTranslation(QT_TRANSLATE_NOOP("MainWindow", "Polish"), "cppcheck_pl");
<< QT_TRANSLATE_NOOP("MainWindow", "Russian") AddTranslation(QT_TRANSLATE_NOOP("MainWindow", "Russian"), "cppcheck_ru");
<< QT_TRANSLATE_NOOP("MainWindow", "Serbian") AddTranslation(QT_TRANSLATE_NOOP("MainWindow", "Serbian"), "cppcheck_sr");
<< QT_TRANSLATE_NOOP("MainWindow", "Swedish"); AddTranslation(QT_TRANSLATE_NOOP("MainWindow", "Swedish"), "cppcheck_se");
mFiles << "cppcheck_nl"
<< "cppcheck_en"
<< "cppcheck_fi"
<< "cppcheck_de"
<< "cppcheck_ja"
<< "cppcheck_pl"
<< "cppcheck_ru"
<< "cppcheck_sr"
<< "cppcheck_se";
//Load English as a fallback language //Load English as a fallback language
QTranslator *english = new QTranslator(); QTranslator *english = new QTranslator();
@ -68,18 +58,18 @@ TranslationHandler::~TranslationHandler()
const QStringList TranslationHandler::GetNames() const const QStringList TranslationHandler::GetNames() const
{ {
return mNames; QStringList names;
} foreach(TranslationInfo translation, mTranslations)
{
const QStringList TranslationHandler::GetFiles() const names.append(translation.mName);
{ }
return mFiles; return names;
} }
bool TranslationHandler::SetLanguage(const int index, QString &error) bool TranslationHandler::SetLanguage(const int index, QString &error)
{ {
//If English is the language //If English is the language
if (index == 0) if (index == 2)
{ {
//Just remove all extra translators //Just remove all extra translators
if (mTranslator) if (mTranslator)
@ -92,27 +82,27 @@ bool TranslationHandler::SetLanguage(const int index, QString &error)
} }
//Make sure the translator is otherwise valid //Make sure the translator is otherwise valid
if (index >= mNames.size()) if (index >= mTranslations.size())
{ {
error = QObject::tr("Incorrect language specified!"); error = QObject::tr("Incorrect language specified!");
return false; return false;
} }
//Load the new language //Load the new language
if (!mTranslator->load(mFiles[index])) if (!mTranslator->load(mTranslations[index].mFilename))
{ {
//If it failed, lets check if the default file exists //If it failed, lets check if the default file exists
if (!QFile::exists(mFiles[index] + ".qm")) if (!QFile::exists(mTranslations[index].mFilename + ".qm"))
{ {
error = QObject::tr("Language file %1 not found!"); error = QObject::tr("Language file %1 not found!");
error = error.arg(mFiles[index] + ".qm"); error = error.arg(mTranslations[index].mFilename + ".qm");
return false; return false;
} }
//If file exists, there's something wrong with it //If file exists, there's something wrong with it
error = QObject::tr("Failed to load translation for language %1 from file %2"); error = QObject::tr("Failed to load translation for language %1 from file %2");
error = error.arg(mNames[index]); error = error.arg(mTranslations[index].mName);
error = error.arg(mFiles[index] + ".qm"); error = error.arg(mTranslations[index].mFilename + ".qm");
return false; return false;
} }
@ -145,7 +135,15 @@ int TranslationHandler::SuggestLanguage() const
//And see if we can find it from our list of language files //And see if we can find it from our list of language files
int index = mFiles.indexOf(file); int index = 0;
for (int i = 0; i < mTranslations.size(); i++)
{
if (mTranslations[i].mFilename == file)
{
index = i;
break;
}
}
//If nothing found, return English //If nothing found, return English
if (index < 0) if (index < 0)
@ -156,3 +154,10 @@ int TranslationHandler::SuggestLanguage() const
return index; return index;
} }
void TranslationHandler::AddTranslation(const char *name, const char *filename)
{
TranslationInfo info;
info.mName = name;
info.mFilename = filename;
mTranslations.append(info);
}

View File

@ -22,10 +22,17 @@
#include <QStringList> #include <QStringList>
#include <QTranslator> #include <QTranslator>
#include <QObject> #include <QObject>
#include <QList>
/// @addtogroup GUI /// @addtogroup GUI
/// @{ /// @{
struct TranslationInfo
{
QString mName;
QString mFilename;
};
class TranslationHandler : QObject class TranslationHandler : QObject
{ {
@ -34,14 +41,14 @@ public:
TranslationHandler(QObject *parent); TranslationHandler(QObject *parent);
virtual ~TranslationHandler(); virtual ~TranslationHandler();
const QStringList GetNames() const; const QStringList GetNames() const;
const QStringList GetFiles() const;
bool SetLanguage(const int index, QString &error); bool SetLanguage(const int index, QString &error);
int GetCurrentLanguage() const; int GetCurrentLanguage() const;
int SuggestLanguage() const; int SuggestLanguage() const;
protected: protected:
void AddTranslation(const char *name, const char *filename);
int mCurrentLanguage; int mCurrentLanguage;
QStringList mNames; QList<TranslationInfo> mTranslations;
QStringList mFiles;
QTranslator *mTranslator; QTranslator *mTranslator;
private: private:
}; };