如何从C#中的lcid获取当前线程语言的语言名称

How to get language name in language of the current thread from lcid in C#

假设我有 3 个 LCID:

如何在当前 UI 线程的语言中检索语言的名称,例如我期望的波兰语:

属性 NativeName 无法解决我的问题。

unicode 联盟确实维护着这种数据。我相信,它没有内置到 .net 框架中。

您可以在此处找到它,以及其他数据和有关 xml 数据的信息。 http://cldr.unicode.org/index/downloads

数据在LDML中,可以被框架原生使用。 https://msdn.microsoft.com/en-us/library/ms404373%28v=vs.85%29.aspx

LCID 在 Windows 中已弃用,它现在使用您在 .NET 中熟悉的区域设置标识符,例如 "en-US"。当然最好加入那个潮流。您仍然可以调用旧函数 GetLocaleInfo() 来获取此信息,传递 LOCALE_SCOUNTRY 来获取本地化的国家/地区名称。示例程序:

using System;
using System.Text;
using System.Runtime.InteropServices;

class Program {
    static void Main(string[] args) {
        var buffer = new StringBuilder(256);
        if (GetLocaleInfo(2057, 6, buffer, buffer.Capacity) == 0) {
            throw new System.ComponentModel.Win32Exception();
        }
        Console.WriteLine(buffer.ToString());
        Console.ReadLine();
    }
    [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
    static extern int GetLocaleInfo(int LCID, int LCType, StringBuilder buffer, int buflen);
}

输出:英国

我使用的是 Windows 的 en-US 版本,所以获取英文名称。

我已经将 link 发布到此 duplicate question。简而言之,语言名称是 .NET 资源。如果您想要本地化版本,则需要安装相应的语言包。

不同的框架有不同的语言包,例如4.5, 4.5.2。下载前需要select合适的语言版本。

返回资源的语言由调用线程的Thread.CurrentUICulture属性决定。这设置为与当前 OS 用户的 UI 语言设置匹配,因此您可能不需要更改代码中的任何内容。

请注意,这会影响 所有 可本地化的框架资源,包括 File not found

等异常消息