将 LCID 转换为语言字符串

发布于 2024-12-09 11:17:17 字数 779 浏览 1 评论 0原文

在我的应用程序中,我必须查询系统和用户区域设置并将它们作为字符串返回(例如 en-US 而不是语言代码)。我可以从 GetSystemDefaultLCID() 和 GetUserDefaultLCID() 函数获取这些语言的 LCID,但我遇到的问题是从 LCID 到语言字符串的转换。

我的应用程序也必须在 Windows XP 上运行,因此我无法使用 LCIDToLocaleName() Win API。到目前为止,我唯一能够获取区域设置名称的方法是使用 GetLocaleInfo() Win API,将 LOCALE_SYSTEM_DEFAULT 和 LOCALE_USER_DEFAULT 作为 LCID 传递,将 LOCALE_SISO639LANGNAME 作为 LCType 传递。我的代码看起来有点像查询系统区域设置,

int localeBufferSize = GetLocaleInfo(LOCALE_SYSTEM_DEFAULT, LOCALE_SISO639LANGNAME, NULL, 0);
char *sysLocale = new char[localeBufferSize];
GetLocaleInfo(LOCALE_SYSTEM_DEFAULT, LOCALE_SISO639LANGNAME, sysLocale,localeBufferSize);

但我得到的值只是语言名称(仅 en 或 en-US)。为了获得完整的区域设置,我必须调用 GetLocaleInfo() 两次,第二次将 LOCALE_SISO3166CTRYNAME 作为 LCType 传递,然后附加两个值。有没有更好的方法来做到这一点?

In my application I have to query for System and User Locale and return them as strings(like en-US instead of language codes). I can get the LCID for these Languages from GetSystemDefaultLCID() and GetUserDefaultLCID() functions, but what I am struggling with is the conversion from LCID to Language strings.

My app has to run on Windows XP as well so I can't use the LCIDToLocaleName() Win API. The only I have been able to Get the locale name so far is to use the GetLocaleInfo() Win API by passing LOCALE_SYSTEM_DEFAULT and LOCALE_USER_DEFAULT as LCID and LOCALE_SISO639LANGNAME as LCType. My code looks somewhat like this to Query for System Locale

int localeBufferSize = GetLocaleInfo(LOCALE_SYSTEM_DEFAULT, LOCALE_SISO639LANGNAME, NULL, 0);
char *sysLocale = new char[localeBufferSize];
GetLocaleInfo(LOCALE_SYSTEM_DEFAULT, LOCALE_SISO639LANGNAME, sysLocale,localeBufferSize);

But the value I get is only the language name(only en of en-US). To get the full locale I have to call GetLocaleInfo() twice passing LOCALE_SISO3166CTRYNAME as the LCType the second time and then append the two values. Is there any better way to do this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

芯好空 2024-12-16 11:17:17

很抱歉这么说,但是没有。只有两个(或更多)字母代码是标准化的,它们的串联不是标准化的。但!不需要动态缓冲区分配。引自MSDN:

该字符串允许的最大字符数为 9,
包括终止空字符。

读到这里,动态分配所需的缓冲区听起来有点矫枉过正,所以如果你真的想让它保持额外的干净,你可以这样做:

char buf[19];
int ccBuf = GetLocaleInfo(LOCALE_SYSTEM_DEFAULT, LOCALE_SISO639LANGNAME, buf, 9);
buf[ccBuf++] = '-';
ccBuf += GetLocaleInfo(LOCALE_SYSTEM_DEFAULT, LOCALE_SISO3166CTRYNAME, buf+ccBuf, 9);

Sorry to say that, but no. Only the two (or more) letter codes are standardized, the concatenation of them are not. But! There is no need for the dynamic buffer allocation. Quoted from MSDN:

The maximum number of characters allowed for this string is nine,
including a terminating null character.

Reading this, it sounds overkill to dynamically allocate the required buffer, so if you really want to keep it extra-clean, you can do something like this:

char buf[19];
int ccBuf = GetLocaleInfo(LOCALE_SYSTEM_DEFAULT, LOCALE_SISO639LANGNAME, buf, 9);
buf[ccBuf++] = '-';
ccBuf += GetLocaleInfo(LOCALE_SYSTEM_DEFAULT, LOCALE_SISO3166CTRYNAME, buf+ccBuf, 9);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文