首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何强制QLocale::system进行更改

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

Stack Overflow用户
提问于 2014-01-28 13:50:02
回答 3查看 4.3K关注 0票数 4

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

我试图更改LANGLANGUAGE环境变量,但它没有任何影响。然而,在GNOME下,它有!

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

代码语言:javascript
复制
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);

我的操作系统是Kubuntu 13.10,Qt版本是4.8。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-01-28 18:18:11

为了进行测试,您可以使用类似的内容(只需更正主函数):

代码语言:javascript
复制
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,所以这应该更好:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2014-01-28 14:00:11

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

代码语言:javascript
复制
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();
    }
}
票数 4
EN

Stack Overflow用户

发布于 2020-07-26 17:45:06

使用LANGUAGE (而不是LANG)环境变量肯定会更改QLocale::system().name()返回的值,因为该环境变量优先于定义应用程序消息区域设置(详细信息)的所有其他方法。

我用QT5.12在Lubuntu19.10(即,使用LXQt桌面)下测试了它,它可以工作。该命令是:

代码语言:javascript
复制
LANGUAGE=de ./application

如果这在Kubuntu下真的不起作用,那么应该将其报告为bug,因为Kubuntu正在干扰应用程序如何告诉它的地区。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21407377

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档