繁体   English   中英

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

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

假设我有3个LCID:

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

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

  • 2057年 - Angielski(Wielka Brytania)
  • 1034年 - Hiszpański(Hiszpania)
  • 1045年 - 波兰(波兰)

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

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);
}

产出:英国

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

我已经发布了这个重复问题的链接。 简而言之,语言名称是.NET资源。 如果需要本地化版本,则需要安装相应的语言包。

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM