如何将标准野田时区 ID 从英语转换为本地化语言?

2024-04-15

我目前正在尝试将我的 Windows Phone 时间应用程序本地化为几个国家/地区。我使用 Noda Time,因为它对于新手来说非常容易。我面临的问题是所有时区 ID 都是标准英语,我正在寻找一种方法将这些 ID 转换为本地语言字符串。

一种方法是为每种语言的每个 ID 制作本地化字符串。但由于有 500 个时区,效率似乎非常低。请建议一种方法,让我以更省时的方式直接将时区 ID 转换为本地语言。

My code:

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)
           };

这不是 Noda Time 的当前功能,因此您需要从其他地方获取数据。

时区(和其他项目)的本地化最好在统一码CLDR http://cldr.unicode.org/项目。您可以编写代码来解析 CLDR 版本中包含的各种 XML 文件。您还需要了解数据的表示方式以及一些边缘情况。

或者,您可以使用我已经完成的实施 https://github.com/mj1856/TimeZoneNames.

安装时区名称 https://www.nuget.org/packages/TimeZoneNames努吉特包:

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");

你可以看一下项目的单元测试 https://github.com/mj1856/TimeZoneNames/blob/master/TimeZoneNames.Tests/TimeZoneNamesTest.cs获取更多示例。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将标准野田时区 ID 从英语转换为本地化语言? 的相关文章

随机推荐