在安装了语言包的Windows上,QLocale会错误地检测到系统语言

我试图用QLocale检测当前的系统语言:

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

但是,它不能正常工作。 我在使用英文语言包的俄语Windows 7上,但language()返回俄语而不是英语。 有没有解决办法?

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

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

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

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

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

希望有所帮助。

我找到了两种方法来解决我的问题。 Qt的方式是使用QLocale::system().uiLanguages() 。 在我的系统上,它返回一个单一的项目“en-US”列表。 问题是我需要一个语言名称,如“英语”,所以我不得不添加一个地图转换语言代码的语言名称。 这没什么大不了的,但我决定使用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); 

要获得语言名称,您可以简单地使用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); } 

希望这可以帮助。

我有同样的问题,我解决这个代码。

 QString local = QLocale::languageToString(QLocale::system().language());