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

C# 如何从C中的lcid获取当前线程的语言名称,c#,.net,globalization,C#,.net,Globalization,假设我有3个LCID: 2057年-英国 1034年的今天,西班牙 1045年的今天,波兰 如何以当前UI线程的语言检索语言名称,例如我期望的波兰语: 2057年的今天,安吉尔斯基·维尔卡·布莱塔尼亚 1034年的今天,伊斯兰堡-伊斯兰堡 1045年的今天,波尔斯基·波尔斯卡 属性NativeName并不能解决我的问题。unicode联盟确实维护此类数据。我相信,它不是内置在.net框架中的 您可以在这里找到它,以及其他数据和有关xml数据的信息。 数据是LDML格式的,框架可以在本地使用LD

假设我有3个LCID:

2057年-英国 1034年的今天,西班牙 1045年的今天,波兰 如何以当前UI线程的语言检索语言名称,例如我期望的波兰语:

2057年的今天,安吉尔斯基·维尔卡·布莱塔尼亚 1034年的今天,伊斯兰堡-伊斯兰堡 1045年的今天,波尔斯基·波尔斯卡
属性NativeName并不能解决我的问题。

unicode联盟确实维护此类数据。我相信,它不是内置在.net框架中的

您可以在这里找到它,以及其他数据和有关xml数据的信息。


数据是LDML格式的,框架可以在本地使用LDML

LCID在Windows中不受欢迎,它现在使用您在.NET中熟悉的区域设置标识符,如en US。当然,最好还是加入这股潮流。您仍然可以使用pinvoke遗留函数获取此信息,通过LOCALE\u Scontry获取本地化的国家/地区名称。示例程序:

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版本,所以请获取英文名称。

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

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

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


请注意,这会影响所有可本地化的框架资源,包括异常消息(如未找到文件)

NativeName并不能解决我的问题。了解原因会很有帮助。@TimSchmelter,因为作为一个NativeName,我得到了:English United Kingdom、espanol Espana、polski Polska。我需要所有这些名字用一种语言,比如波兰语。我很确定你必须建立自己的查找表。为每种语言存储两个名称与以其他语言存储每种语言的名称之间有一点不同-拥有额外的一百万字符串真的会使.NET framework受益吗没有内置的方法将文化名称翻译为不同文化的语言。这里有一个与此相关的问题:不完全的可能重复。由于Vista的操作系统版本并不重要,因为您可以安装多种语言。返回的文本、消息取决于当前用户的UI语言。理论上它们是可用的。这没什么大不了的,波兰用户可能会运行波兰版本的Windows,并希望看到波兰国家的名称。现在已经没有波兰版本了,从Vista开始就没有了。您所看到的本地化版本是安装应答文件中定义的另一种默认语言。我认为Vista Home不允许安装语言包,但Win 7+已经提供了大多数语言。嗯,我从我的MSDN帐户下载波兰语版本的Windows没有问题。你说的是终极版。