【问题标题】:Is there any API in Linux to get the full language name from the locale?Linux 中是否有任何 API 可以从语言环境中获取完整的语言名称?
【发布时间】:2020-09-09 06:11:24
【问题描述】:

我想从 Linux 的语言环境中获取完整的语言名称。例如,在 Windows 中,我们可以使用一个 API GetLocaleInfoEx,它会针对区域设置“en-US”返回“English”。

wchar_t buffer[LOCALE_NAME_MAX_LENGTH];
GetLocaleInfoEx(L"en-US", LOCALE_SENGLISHLANGUAGENAME,
            (LPWSTR)buffer, LOCALE_NAME_MAX_LENGTH)

这将用“英语”填充 缓冲区。 Linux中是否有类似的东西?

【问题讨论】:

  • 你应该只通过buffer 而不是&buffer

标签: c linux windows locale


【解决方案1】:

你可以使用

nl_langinfo(_NL_IDENTIFICATION_LANGUAGE)

来自

#include <langinfo.h>

如果没有设置语言环境,你可以用

来设置
s = getenv("LANG");
setlocale(LC_ALL, s);

【讨论】:

  • 通常通过setlocale(LC_ALL, "") 将语言环境初始化为默认值。问题中线程安全的GetLocaleInfoEx 调用的等效项将使用新的locale_t,例如:loc = newlocale(LC_ALL_MASK, "en_US.UTF-8", NULL);if (loc) {language = strdup(nl_langinfo_l(_NL_IDENTIFICATION_LANGUAGE, loc)); freelocale(loc);}。我将其更改为使用 UTF-8,因为“en_US”不是常用的语言环境别名。这与 Windows "-
【解决方案2】:

在玩弄了其他答案之后,我想在这里总结一下。

   #include <langinfo.h>
   #include <locale.h> // for LC_ALL_MASK flag, freelocale(), and newlocale() functions.

从系统区域设置访问区域设置信息。

   char *nl_langinfo(nl_item item); 

从作为参数给出的locale访问区域信息。

   char *nl_langinfo_l(nl_item item, locale_t locale);

在给定示例中使用 GetLocaleInfoEx 等效于 Linux 上的以下内容。

locale_t loc = newlocale(LC_ALL_MASK, "en_US.UTF-8", NULL); 
if (loc) {
    language = strdup(nl_langinfo_l(_NL_IDENTIFICATION_LANGUAGE, loc));
    freelocale(loc);
   }

详情请参阅nl_langinfo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-24
    • 1970-01-01
    • 2010-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多