如何在C#中通过LCID获取当前线程语言名称

5
假设我有3个LCID:
  • 2057 - 英语(英国)
  • 1034 - 西班牙语(西班牙)
  • 1045 - 波兰语(波兰)
如何在当前UI线程的语言中检索语言名称,例如在波兰语中我期望看到:
  • 2057 - Angielski (Wielka Brytania)
  • 1034 - Hiszpański (Hiszpania)
  • 1045 - Polski (Polska)
属性NativeName不是解决我的问题的方法。

1
"NativeName 不是解决我的问题的方案,知道原因会很有帮助。" - Tim Schmelter
@TimSchmelter 因为作为“NativeName”,我得到的是:英语(英国),西班牙语(西班牙),波兰语(波兰)。我需要将所有这些名称都翻译成同一种语言,例如波兰语。 - rgb
2
我非常确定你需要建立自己的查找表。每种语言存储两个名称与将每种语言的名称存储在其他每种语言中之间存在一些差异,拥有额外百万字符串是否真的有益于.NET框架呢? :) - Luaan
2
没有内置的方法将文化名称翻译成不同文化的语言。这里有一个相关的问题(我认为是重复的):https://dev59.com/M3E95IYBdhLWcg3wKqok - Tim Schmelter
@PanagiotisKanavos:但如果没有需要自定义编码,您如何在波兰语中获取英语文化(new CultureInfo(2057))的语言名称?因此:““2057- Angielski(Wielka Brytania)””。我还没有检查过Hans的方法,但您在答案中没有提到它,对吗? OP不想要当前文化的语言,而是另一种文化的语言。 - Tim Schmelter
显示剩余8条评论
3个回答

1

Windows中已经弃用了LCIDs,现在使用.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,因此获取英文名称。


不完全正确。自从Vista以来,操作系统版本已经不重要了,因为您可以安装多种语言。返回的文本和消息取决于当前用户的UI语言。 - Panagiotis Kanavos
它们理论上可以提供。这并不重要,波兰用户很可能运行波兰语版本的Windows,并期望看到波兰国家名称。 - Hans Passant
不再有波兰语版本,自从Vista开始就没有了。您看到的本地化版本实际上是在设置答案文件中定义的不同默认语言。我认为Vista Home 不允许安装语言包,但Win7+已经预装了大多数语言。 - Panagiotis Kanavos
嗯,我从我的MSDN账户上下载波兰语版的Windows没有遇到任何问题。你说的是旗舰版吧。 - Hans Passant

1
我已经发布了重复问题的链接。简而言之,语言名称是.NET资源。如果您想要本地化版本,则需要安装适当的语言包。
不同的框架有不同的语言包,例如4.5, 4.5.2。您需要在下载之前选择适当的语言版本。
返回资源的语言由调用线程的Thread.CurrentUICulture属性确定。这被设置为与当前操作系统用户的UI语言设置相匹配,因此您可能不需要在代码中更改任何内容。
请注意,这会影响所有可本地化的框架资源,包括异常消息,如File not found

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接