【发布时间】:2011-04-08 17:40:35
【问题描述】:
TimeZoneInfo.StandardName 仅返回英文值,有没有办法根据设置的文化获取翻译后的名称?
谢谢。
【问题讨论】:
-
简短的回答是:不可能。它在本地化的 Windows 上本地化。时期。正如彼得建议的那样,看看 DisplayName 看看这是否适合您。
标签: c# .net localization globalization
TimeZoneInfo.StandardName 仅返回英文值,有没有办法根据设置的文化获取翻译后的名称?
谢谢。
【问题讨论】:
标签: c# .net localization globalization
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
【讨论】: