时区信息 -- 根据文化翻译标准名称

3

TimeZoneInfo.StandardName仅返回英文值,有没有一种方法可以根据设置的文化获取翻译后的名称?

谢谢。


简短回答是:不可能。它基于本地化的Windows。就这样。正如Peter建议的那样,看看DisplayName是否适合你。 - Paweł Dyda
4个回答

4

TimeZoneInfo是从注册表中提取的...

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Time Zones

因此它受操作系统语言的影响。

更改区域设置对时区DisplayName没有影响。当然,您可以利用资源文件来实现所需的效果。


1

你可以创建一个名为“TimeZoneInfoExtension”的类,其中包含名为ToLocalizedString的静态方法:

public static class TimeZoneInfoExtensions
{
    public static string ToLocalizedString(this TimeZoneInfo timeZone)
    {
        switch (timeZone.Id)
        {
            case "Dateline Standard Time":
                return i18n.DatelineStandardTime;

            case "UTC-11":
                return i18n.UTC11;

            case "Hawaiian Standard Time":
                return i18n.HawaiianStandardTime;

            case "Alaskan Standard Time":
                return i18n.AlaskanStandardTime;

            ....

            default:
                throw new NotImplementedException();
        }
    }
}

i18n 是一个包含资源的类。是的,你需要手动填写翻译。但我在不同的系统语言中使用了类似于这样的方法来生成翻译:

Regex rgx = new Regex("[ +-]");
foreach (var timeZone in TimeZoneInfo.GetSystemTimeZones())
{
    Console.WriteLine("  <data name=\"{0}\" xml:space=\"preserve\">", rgx.Replace(timeZone.Id, string.Empty));
    Console.WriteLine("    <value>{0}</value>", timeZone.DisplayName);
    Console.WriteLine("  </data>");
}

然后,您可以根据您的CurrentCulture使用它,如下所示:

foreach (var timeZoneInfo in TimeZoneInfo.GetSystemTimeZones())
{
    Console.WriteLine(timeZoneInfo.ToLocalizedString());
}

0

我认为这是不可能的,因为它从注册表中获取信息:@"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones"


-1

4
这是错误的,因为对于英语文化,我得到的是“Prague”,这没问题,但对于捷克文化,我仍然得到同样的“Prague”,但在捷克本土化中应该是“Praha”。 - psulek
此链接说明:“备注 - 显示名称基于安装在 Windows 操作系统中的区域设置进行本地化。” - Leo von Barbarosa

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