2014-12-21 3 views
4

В настоящее время я пытаюсь локализовать свое приложение Windows Time Time для нескольких стран. Я использую Noda Time, потому что это было очень легко для новичка. Проблема, с которой я сталкиваюсь, что все идентификаторы Timezone находятся на стандартном английском языке, и я ищу способ получить эти идентификаторы, преобразованные в строки локального языка.Как конвертировать стандартные идентификаторы Noda Timezone с английского языка на локализованный?

Одним из способов было бы сделать локализованные строки для каждого идентификатора на каждом языке. Но кажется, что он очень неэффективен, так как существует 500 часовых поясов. Пожалуйста, предложите мне способ получить непосредственно идентификаторы TimeZone, преобразованные в локальный язык, менее трудоемким способом.

Мой код:

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

Просто короткое замечание, что я надеюсь добавить данные CLDR в Noda Time в какой-то момент. Это было бы полезно не только для имен часовых поясов. Пока еще не ясно, следует ли нам принять только биты часового пояса на данный момент, а затем вернуться к остальным позже или подождать, чтобы все за один раз ... –

+0

спасибо @JonSkeet за то, что вы изучили этот вопрос. Как по моему мнению, все в одном направлении, по-видимому, является лучшим вариантом, чем бит, поскольку каждый программист имеет свои собственные потребности. Так что помогать одному и удерживать другое ожидание кажется немного несправедливым, и у нас уже есть библиотека TimeZoneNames, чтобы помочь нам в получении работы сделанный. –

ответ

3

Это не текущая особенность Нода времени, так что вам нужно будет получить данные в другом месте.

Локализации для часовых поясов (и других предметов) лучше всего найти в рамках проекта Unicode CLDR. Вы можете написать код для анализа различных XML-файлов, включенных в выпуски CLDR. Вам также нужно будет понять, как представлены данные, и несколько краевых случаев.

Или вы можете использовать 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.

Эта же библиотека также может быть использована для получения списка идентификаторов часовых поясов для конкретной страны. Это можно использовать для реализации списка выбора с двумя выпадающими списками, где сначала вы выбираете страну, а затем выбираете часовой пояс внутри страны.

var zones = TZNames.GetTimeZoneIdsForCountry("US"); 

Дополнительную информацию вы можете найти на странице the project's unit tests.

+0

Большое спасибо @Matt за то, что представил меня в эту замечательную библиотеку. U решил все мои проблемы. Большое вам спасибо –

+0

Привет, @Matt Johnson, теперь, когда я запускаю комплект сертификации по моим пакетам, я получаю TimeZoneNames.dll, встроенный в режим отладки. Я старался изо всех сил, но не смог его освободить. –

+0

Спасибо. Исправлено в последней версии. [Подробнее см. Здесь] (https://github.com/mj1856/TimeZoneNames/issues/1). Также, пожалуйста, в будущем сообщайте о проблемах непосредственно на GitHub. Благодарю. –

 Смежные вопросы

  • Нет связанных вопросов^_^