我目前正在尝试将我的Windows Phone Time App本地化为少数几个国家/地区。我正在使用Noda Time,因为这对新手来说非常容易。我面临的问题是所有时区ID都是标准英语,我正在寻找一种方法来将这些ID转换为本地语言字符串。
一种方法是为每种语言制作每个ID的本地化字符串。但由于有500个时区,它似乎非常低效。请建议一种让我直接将TimeZone ID转换为本地语言的方法,而且耗时较少。
我的代码:
var now = Instant.FromDateTimeUtc(DateTime.UtcNow);
var tzdb = DateTimeZoneProviders.Tzdb;
var list = from id in tzdb.Ids
where id.Contains("/") && !id.StartsWith("etc", StringComparison.OrdinalIgnoreCase)
let tz = tzdb[id]
let offset = tz.GetUtcOffset(now)
orderby offset, id
select new
{
DisplayValue = string.Format("(UTC{0}) {1} {2} ", offset.ToString("+HH:mm", null), now.WithOffset(offset).TimeOfDay.ToString("hh:mm tt",null),id)
};
答案 0 :(得分:4)
这不是Noda Time的当前功能,因此您需要在其他地方获取数据。
时区(和其他项目)的本地化最好在Unicode CLDR项目中找到。您可以编写代码来解析CLDR版本中包含的各种XML文件。您还需要了解数据的表示方式以及几个边缘情况。
或者,您可以使用the implementation that I've already completed。
安装TimeZoneNames Nuget包:
PM> Install-Package TimeZoneNames
然后,您可以轻松地将时区名称解析为本地化的显示值:
// example input values
var names = TZNames.GetNamesForTimeZone("America/Los_Angeles", "en-US");
// example output values
Assert.Equal("Pacific Time", names.Generic);
Assert.Equal("Pacific Standard Time", names.Standard);
Assert.Equal("Pacific Daylight Time", names.Daylight);
这适用于非英语语言环境。它将生成任何语言的有效文本,前提是数据存在于CLDR中。
同一个库也可用于获取特定国家/地区的时区ID列表。这可用于实现双下拉选择列表,首先选择国家/地区,然后选择国家/地区内的时区。
var zones = TZNames.GetTimeZoneIdsForCountry("US");
您可以查看the project's unit tests以获取更多示例。