如何强制Qlocale ::系统更改

How to force QLocale::system to change

本文关键字:系统 Qlocale 何强制      更新时间:2023-10-16

我需要经常测试我的应用程序翻译到非英语语言,这对于更改整个操作系统语言而只是为了进行此简单检查是非常不舒服的。例如,如何使用环境变量更改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。

您始终可以通过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();
    }
}

用于测试您可以使用类似的东西(仅正确的主函数):

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

然后,当您运行应用程序时,您可以使用额外的参数运行它:./yourAppName -locale:nl。有关可能的值,请参见Qlocale的文档。


编辑:我找到了更好的方法,有一种方法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);

使用 LANGUAGE LANG)环境变量绝对应更改 QLocale::system().name()返回的值,因为此环境变量比所有其他方法都优先于定义应用程序消息区域(详细信息)。

我在lubuntu 19.10下用QT 5.12(表示使用LXQT桌面)对其进行了测试,并且可以使用。命令是:

LANGUAGE=de ./application

如果在kubuntu下确实不起作用,则应将其报告为错误,因为那时Kubuntu正在干扰应用程序的方式。