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

时间:2015-04-20 08:56:08

标签: c# .net globalization

假设我有3个LCID:

  • 2057 - 英语(英国)
  • 1034 - 西班牙语(西班牙)
  • 1045 - 波兰语(波兰)

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

  • 2057 - Angielski(Wielka Brytania)
  • 1034 - Hiszpański(Hiszpania)
  • 1045 - Polski(Polska)

属性NativeName不是我问题的解决方案。

3 个答案:

答案 0 :(得分:1)

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,所以请输入英文名称。

答案 1 :(得分:1)

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

不同的框架有不同的语言包,例如4.54.5.2。您需要在下载前选择适当的语言版本。

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

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

答案 2 :(得分:0)

unicode联盟确实维护了这种数据。我相信,它不是内置于.net框架中的。

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

数据采用LDML格式,可由框架本机使用。 https://msdn.microsoft.com/en-us/library/ms404373%28v=vs.85%29.aspx