[英]QLocale detects system language incorrectly on Windows with language pack installed
我试图用QLocale
检测当前的系统语言:
QLocale::Language sysLangId = QLocale::system().language();
但是,它无法正常工作。 我使用的是应用了英语语言包的俄语Windows 7,但是language()
返回的是俄语而不是英语。 有没有解决方法?
当我在Qt中进行本地化时,我使用了
QString locale = QLocale::system().name();
当我测试获取区域设置时,我发现它依赖于区域和语言设置中的格式:
控制面板>区域和语言>格式
希望有所帮助。
我找到了两种方法来解决我的问题。 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);
我有同样的问题,我解决了这个代码。
QString local = QLocale::languageToString(QLocale::system().language());
要获取语言名称,您只需使用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);
}
希望这可以帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.