I use dynamic translation extensively in my application.
The way I solved the problem is by inheriting QApplication to MyApp.
In the header of MyApp I have a list of QTranslator members for each language/locale. In MyApp I also have a ChangeLang(LangEnum LANG) function.
This will load the chosen language.
In MyApp I have some strings that are application wide specific (eg: translation of the days of the week or the months) Open windows get an event as described in the helpfile at Trolltech.
MyApp is accessed as
MyApp* locApp= (MyApp*)qApp;
locApp->LoadLanguage(ENG);//loads english
locApp->LoadLanguage(NLD);//loads Dutch
locApp->LoadLanguage(ZHO);//loads Mandarin
MyApp* locApp= (MyApp*)qApp;
locApp->LoadLanguage(ENG);//loads english
locApp->LoadLanguage(NLD);//loads Dutch
locApp->LoadLanguage(ZHO);//loads Mandarin
To copy to clipboard, switch view to plain text mode
void MyApp::ChangeLang(LangEnum LANG)
{
if(lang!=CurLang)
{
CurLang=lang;
//Ensure that we have no translation loaded
removeTranslator(&SPAtran);
removeTranslator(&ENG_AUtran);
removeTranslator(&DEUtran);
removeTranslator(&FRAtran);
removeTranslator(&NLDtran);
removeTranslator(&ZHOtran);
removeTranslator(&PORtran);
removeTranslator(&ENG_UStran);
removeTranslator(&ENGtran);
switch(lang)
{
case ENGLISH:
#ifdef VER_US
installTranslator(&ENG_UStran);
#elif defined(VER_AU)
installTranslator(&ENG_AUtran);
#elif defined(VER_UK)
installTranslator(&ENGtran);
#else
installTranslator(&ENGtran);
#endif
break;
case GERMAN:
installTranslator(&DEUtran);
break;
case DUTCH:
installTranslator(&NLDtran);
break;
case SPANISH:
installTranslator(&SPAtran);
break;
case FRENCH:
installTranslator(&FRAtran);
break;
case MANDARIN:
installTranslator(&ZHOtran);
break;
case ITALIAN:
//Not defined
break;
case GREEK:
//Not defined
break;
case PORTUGESE:
installTranslator(&PORtran);
break;
case UNINITIALISED:
default:
break;
}
if(MANDARIN==lang)
{
CentralFont.setFamily( "mandarin" );
}
else
{
CentralFont.setFamily( "Freesans" );
}
MyCurSet.LoadPresentations();
langInit();
FillEditLists();
emit newLang();
}
}
void MyApp::ChangeLang(LangEnum LANG)
{
if(lang!=CurLang)
{
CurLang=lang;
//Ensure that we have no translation loaded
removeTranslator(&SPAtran);
removeTranslator(&ENG_AUtran);
removeTranslator(&DEUtran);
removeTranslator(&FRAtran);
removeTranslator(&NLDtran);
removeTranslator(&ZHOtran);
removeTranslator(&PORtran);
removeTranslator(&ENG_UStran);
removeTranslator(&ENGtran);
switch(lang)
{
case ENGLISH:
#ifdef VER_US
installTranslator(&ENG_UStran);
#elif defined(VER_AU)
installTranslator(&ENG_AUtran);
#elif defined(VER_UK)
installTranslator(&ENGtran);
#else
installTranslator(&ENGtran);
#endif
break;
case GERMAN:
installTranslator(&DEUtran);
break;
case DUTCH:
installTranslator(&NLDtran);
break;
case SPANISH:
installTranslator(&SPAtran);
break;
case FRENCH:
installTranslator(&FRAtran);
break;
case MANDARIN:
installTranslator(&ZHOtran);
break;
case ITALIAN:
//Not defined
break;
case GREEK:
//Not defined
break;
case PORTUGESE:
installTranslator(&PORtran);
break;
case UNINITIALISED:
default:
break;
}
if(MANDARIN==lang)
{
CentralFont.setFamily( "mandarin" );
}
else
{
CentralFont.setFamily( "Freesans" );
}
MyCurSet.LoadPresentations();
langInit();
FillEditLists();
emit newLang();
}
}
To copy to clipboard, switch view to plain text mode
The translations are removed before loading a new one. The documentation has nothing about reloading an already loaded translation, so out of memory paranoia I simply remove all that is not used and load the one I use.
The header looks something like
typedef enum _LangEnum
{//This enum must match the enum in the SGCP document
UNINITIALISED=-1,
ENGLISH=0,
GERMAN,
DUTCH,
SPANISH,
FRENCH,
MANDARIN,
ITALIAN,
GREEK,
PORTUGESE
} LangEnum;
{
Q_OBJECT
public:
LangEnum CurLang;
void ChangeLang(LangEnum lang);
signals:
void newLang();
}
typedef enum _LangEnum
{//This enum must match the enum in the SGCP document
UNINITIALISED=-1,
ENGLISH=0,
GERMAN,
DUTCH,
SPANISH,
FRENCH,
MANDARIN,
ITALIAN,
GREEK,
PORTUGESE
} LangEnum;
class MyApp : public QApplication
{
Q_OBJECT
public:
QFont CentralFont;
LangEnum CurLang;
QTranslator SPAtran;
QTranslator ENGtran;
QTranslator ENG_AUtran;
QTranslator DEUtran;
QTranslator FRAtran;
QTranslator NLDtran;
QTranslator ZHOtran;
QTranslator PORtran;
QTranslator ENG_UStran;
void ChangeLang(LangEnum lang);
signals:
void newLang();
}
To copy to clipboard, switch view to plain text mode
As you can see this version also switches fonts for writing mandarin. Looks really neat! Our customers are very impressed! The planning of the competition also took a speedbump with this nice little extra.
Bookmarks