如何强制QLocale :: system进行更改

时间:2014-01-28 13:50:02

标签: c++ qt localization qt4

我需要经常测试我的应用程序翻译成非英语语言,这对于更改整个操作系统语言只是为了进行这种简单的检查非常不舒服。 如何使用环境变量更改Qt检测到的系统语言? 或者使用命令行参数。

我尝试更改LANGLANGUAGE环境变量,但它没有效果。 但是,在GNOME下它有!

UPD:代码我正在使用这样的代码来确定系统区域设置并加载适当的翻译:

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。我的操作系统是Kubuntu 13.10,Qt版本是4.8。

3 个答案:

答案 0 :(得分:4)

您始终可以通过QLocale :: setDefault()方法更改区域设置。这是一个项目的例子:

void Language::setCurrentLanguage(Language::Languages language)
{
    if (language == Language::Arabic) {
        QLocale l(QLocale::Arabic, QLocale::SaudiArabia);
        QLocale::setDefault(l);
        dynamic_cast<MangoApp*>(qApp)->setLayoutDirection(Qt::RightToLeft);
        dynamic_cast<MangoApp*>(qApp)->removeAllTranslator();
        dynamic_cast<MangoApp*>(qApp)->loadQtTranslator();
        dynamic_cast<MangoApp*>(qApp)->loadMangoTranslator();

    } else {
        QLocale l(QLocale::English, QLocale::UnitedStates);
        QLocale::setDefault(l);
        dynamic_cast<MangoApp*>(qApp)->setLayoutDirection(Qt::LeftToRight);
        dynamic_cast<MangoApp*>(qApp)->removeAllTranslator();
    }
}

答案 1 :(得分:2)

对于测试,你可以使用类似的东西(只是正确的主要功能):

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

然后当你运行app时,你可以使用额外的参数运行它:./yourAppName -locale:nl。有关可能的值,请参阅documentation of QLocale

<小时/> 编辑:我发现更好的方法,有一个method QLocale::setDefault,所以这应该更好:

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);

答案 2 :(得分:0)

肯定要使用LANGUAGE不是 LANG)环境变量来更改QLocale::system().name()返回的值,因为此环境变量优先于所有其他方式定义应用程序消息语言环境(details)。

我在Lubuntu 19.10下使用Qt 5.12(意味着,使用LXQt桌面)对此进行了测试,并且可以正常工作。命令是:

LANGUAGE=de ./application

如果在Kubuntu下这确实不起作用,则应将其报告为错误,因为Kubuntu会干扰如何告知应用程序其语言环境。