2015-10-06 26 views
2

答案似乎是否定的,但是我看到一个客户跟踪显示西班牙语中的本地时区名称。信息来源来自GetTimeZoneInformation。该文件说,结构中的这些名称将始终为英文,用户可见名称来自资源文件。无论采用哪种方式都很确定。要清楚,它是这样的结构:是否翻译过TIME_ZONE_INFORMATION结构中的Microsoft时区名称?

typedef struct _TIME_ZONE_INFORMATION { 
    LONG  Bias; 
    WCHAR  StandardName[32]; 
    SYSTEMTIME StandardDate; 
    LONG  StandardBias; 
    WCHAR  DaylightName[32]; 
    SYSTEMTIME DaylightDate; 
    LONG  DaylightBias; 
} TIME_ZONE_INFORMATION, *PTIME_ZONE_INFORMATION; 

标准名称和日光名称是不是非英语?

回答

2

我不确定你在哪里阅读他们只是英文。从MSDN Documentation

两个StandardNameDaylightName根据当前用户的默认UI语言本地化。

此外,在现代的Windows,你应该大多使用的DYNAMIC_TIME_ZONE_INFORMATION结构,API,如GetDynamicTimeZoneInformation,而不是经典GetTimeZoneInformation功能。这个结构包含相同的标准和日光名称,也是本地化的。

按照预期使用时,这些结构充满来自Windows注册表的信息,在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones之下。每个条目都有四根弦是中肯:

  • Std值是在标准时间是在效果上要使用的本地化名称。这被映射到结构中的StandardName字段。

  • Dlt值是在夏令时生效时使用的本地化名称。这被映射到结构中的DaylightName字段。

  • Display值用于本地化名称一般地表示的时区的条目,并且显示时间区的列表时使用 - 如在Windows控制面板,或与tzutil.exe在命令行上,或者用.NET中的TimeZoneInfo.DisplayName。它不是Win32结构的一部分。

  • 该注册表项的密钥从未本地化。它始终是英文的,并且是时区的唯一标识符。在DYNAMIC_TIME_ZONE_INFORMATION结构中,它对应于TimeZoneKeyName字段。在.NET中它对应于TimeZoneInfo.Id。同时请记住,尽管密钥通常是与标准名称的英文形式相匹配,但有一些例外情况不适用。此外,特定键的名称保证不会改变,而理论上它的本地化值可能会改变。

在这里,您可以看到显示名称在Windows控制面板中的英文和中文显示方式。类似的定位与标准和日光发生名称:

Windows Time Zone Control Panels

最后一点 - 恕我直言,这些名称在很多情况下很垃圾。例如,没有“GMT Daylight Time”这样的事实 - 它实际上被称为“英国夏令时”。本地化时区名称的唯一良好来源是CLDR,您可以直接使用该库,也可以通过库(例如C和Java中的ICU)或.NET的TimeZoneNames库。

+0

很好的回答。错过了GetTimeZoneInformation底部的行。似乎奇怪的是,微软会决定翻译所有的字符串,特别是因为结构不会被用户界面看到。谢谢你的帮助。 –