3

我正在尝试使用以下方法检测当前系统语言QLocale

QLocale::Language sysLangId = QLocale::system().language();

但是,它无法正常工作。我在使用英语语言包的俄语 Windows 7 上,但language()返回俄语而不是英语。有什么解决方法吗?

4

4 回答 4

6

当我在 Qt 中进行本地化时,我使用了

QString locale = QLocale::system().name();

当我测试获取语言环境时,我发现它依赖于区域和语言设置中的格式:

控制面板 > 区域和语言 > 格式

Windows 区域和语言格式设置(德语)

希望有帮助。

于 2013-09-04T05:33:47.377 回答
2

我找到了两种方法来解决我的问题。Qt 方式是使用QLocale::system().uiLanguages(). 在我的系统上,它返回一个包含单个项目“en-US”的列表。问题是我需要一个语言名称,比如“english”,所以我必须添加一个映射来将语言代码转换为语言名称。没什么大不了的,但我决定使用 WinAPI:

QString sysLangName;
const LANGID langId = GetUserDefaultUILanguage();
WCHAR langName[1000] = {0};
if (GetLocaleInfoW(MAKELCID(langId, SORT_DEFAULT), LOCALE_SENGLANGUAGE, langName, sizeof langName / sizeof langName[0] - 1) != 0)
    sysLangName = QString::fromWcharArray(langName);
于 2013-09-05T08:11:11.780 回答
2

我有同样的问题,我用这段代码解决了。

QString local =  QLocale::languageToString(QLocale::system().language());
于 2017-08-29T19:47:50.570 回答
1

要获得语言名称,您可以简单地使用QLocale::languageToString(QLocale::system().language());或者可能,QLocale::system().nativeLanguageName();但真正的问题是正如您所提到的 QLocale::system() 并不总是与 Windows 上的实际系统区域设置匹配。如果您在程序执行期间更改语言环境,则可以观察到这一点。在这种情况下, QLocale::system() 不会更新并返回旧值。这是我在 Qt5 中使用的解决方法:

class WinEventFilter : public QAbstractNativeEventFilter
{
public:     
    bool nativeEventFilter(const QByteArray &eventType, void *message, long *result)
    {
        if (((MSG*)message)->message == WM_WININICHANGE )
        {
            // Workaround - in Qt5 the system locale is not up to date and we have to manually update it.
#ifdef _DEBUG
            QLibrary lib("Qt5Cored.dll");
#else
            QLibrary lib("Qt5Core.dll");
#endif
            void (* func)() = lib.resolve("?updateSystemPrivate@QLocalePrivate@@SAXXZ");
            if (func)
                func();
            else
                qDebug()<<"! Unable to resolve updateSystemPrivate()";
            // Workaround end

            qDebug()<<"WM_WININICHANGE"<<QLocale::languageToString(QLocale::system().language());
        }

        return false;
    }    
};

我的应用程序类构造函数如下所示:

MyApplication::MyApplication( int & argc, char ** argv ) 
: QApplication(argc, argv)
{
    WinEventFilter *pFilter = new WinEventFilter(this);
    installNativeEventFilter(m_pEventFilter);
}

希望这可以帮助。

于 2014-01-22T20:46:04.917 回答