2015-10-06 113 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底部的行。似乎奇怪的是,微軟會決定翻譯所有的字符串,特別是因爲結構不會被用戶界面看到。謝謝你的幫助。 –