Search code examples
c++qtlocalizationqt4

How to force QLocale::system to change


I need to test my application translation to non-English language very often, and this is very uncomfortable to change the whole operating system language just to do this simple check. How can i change Qt-detected system language using environment variables for example? or with command-line parameter.

I try to change LANG, LANGUAGE environment variables, but it has no effect. However, under GNOME it has!

UPD: code i'm using such code to determine the system locale and load appropriate translation:

QTranslator app_translator;
if (!app_translator.load ("app_" + QLocale::system ().name (), app_tr_dir))
    qWarning ("Can't load app translator file for locale %s from %s", qPrintable (QLocale::system ().name ()), app_tr_dir.toLocal8Bit().data());
else
    app.installTranslator (&app_translator);

P.S. My OS is Kubuntu 13.10, Qt version is 4.8.


Solution

  • For testing you can use something like that (just correct main function):

    int main(int argc, char **argv) {
        QApplication app(argc, argv);
    
        QLocale localeUsedToDeterminateTranslators = QLocale::system();
        Q_FOREACH(QString a, app.arguments()) {
            const static localeParam = "-locale:";
            if (a.startsWith(localeParam)) {
               localeUsedToDeterminateTranslators = QLocale(a.mid(sizeof(localeParam)-1));
               break;
            }
        }
        ... // your normal code
    

    Then when you run you app you can just run it with extra parameter: ./yourAppName -locale:nl. See documentation of QLocale for possible values.


    Edit: I've found even better approach, there is a method QLocale::setDefault, so this should work even better:

    int main(int argc, char **argv) {
        QApplication app(argc, argv);
    
        Q_FOREACH(QString a, app.arguments()) {
            const static localeParam = "-locale:";
            if (a.startsWith(localeParam)) {
               QLocale::setDefault(QLocale(a.mid(sizeof(localeParam)-1)));
               break;
            }
        }
        ...
        QTranslator app_translator;
        if (!app_translator.load ("app_" + QLocale().name (), app_tr_dir))
             qWarning ("Can't load app translator file for locale %s from %s", qPrintable (QLocale().name()), app_tr_dir.toLocal8Bit().data());
        else
             app.installTranslator (&app_translator);