TimeZoneInfo.StandardName仅返回英文值,有没有一种方法可以根据设置的文化获取翻译后的名称?
谢谢。
TimeZoneInfo.StandardName仅返回英文值,有没有一种方法可以根据设置的文化获取翻译后的名称?
谢谢。
TimeZoneInfo是从注册表中提取的...
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Time Zones
因此它受操作系统语言的影响。
更改区域设置对时区DisplayName没有影响。当然,您可以利用资源文件来实现所需的效果。
你可以创建一个名为“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());
}
我认为这是不可能的,因为它从注册表中获取信息:@"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones"
您可以使用 TimeZoneInfo.DisplayName
获取本地化的时区名称。
http://msdn.microsoft.com/en-us/library/system.timezoneinfo.displayname.aspx