private static bool PopulateDirectValues(string langKey, TimeZoneValues values, string timeZoneId, string metaZone, bool abbreviations) { if (!Data.CldrLanguageData.ContainsKey(langKey)) return false; var langData = Data.CldrLanguageData[langKey]; var langNames = abbreviations ? langData.ShortNames : langData.LongNames; bool found = false; if (langNames.ContainsKey(timeZoneId)) { found = true; var names = langNames[timeZoneId]; values.Generic = values.Generic ?? names.Generic; values.Standard = values.Standard ?? names.Standard; values.Daylight = values.Daylight ?? names.Daylight; } if (metaZone != null && langNames.ContainsKey(metaZone)) { found = true; var names = langNames[metaZone]; values.Generic = values.Generic ?? names.Generic; values.Standard = values.Standard ?? names.Standard; values.Daylight = values.Daylight ?? names.Daylight; } return found; }
private static void SearchLanguages(string languageKey, TimeZoneValues values, Action <string> action) { while (languageKey != null && (values.Generic == null || values.Standard == null || values.Daylight == null)) { action(languageKey); languageKey = GetLanguageSubkey(languageKey); } }
private static TimeZoneValues GetNames(string timeZoneId, string languageKey, bool abbreviations) { if (TZConvert.KnownWindowsTimeZoneIds.Contains(timeZoneId, StringComparer.OrdinalIgnoreCase)) { timeZoneId = TZConvert.WindowsToIana(timeZoneId); } timeZoneId = GetCldrCanonicalId(timeZoneId); if (timeZoneId == null) { throw new ArgumentException("Invalid Time Zone", nameof(timeZoneId)); } if (abbreviations && timeZoneId == "Etc/GMT") { return new TimeZoneValues { Generic = "UTC", Standard = "UTC", Daylight = "UTC" } } ; string metaZone = GetMetazone(timeZoneId); var values = new TimeZoneValues(); // First try for direct values var found = false; SearchLanguages(languageKey, values, langKey => { bool b = PopulateDirectValues(langKey, values, timeZoneId, metaZone, abbreviations); if (b) { found = true; } }); var countries = new List <string>(); if (Data.CldrZoneCountries.TryGetValue(timeZoneId, out string[] c))
private static TimeZoneValues GetNames(string timeZoneId, string languageKey, bool abbreviations) { if (!timeZoneId.Contains("/")) { timeZoneId = ConvertWindowsToIana(timeZoneId); } timeZoneId = GetCldrCanonicalId(timeZoneId); if (timeZoneId == null) { throw new ArgumentException("Invalid Time Zone", nameof(timeZoneId)); } if (abbreviations && timeZoneId == "Etc/GMT") { return(new TimeZoneValues { Generic = "UTC", Standard = "UTC", Daylight = "UTC" }); } var metaZone = GetMetazone(timeZoneId); var values = new TimeZoneValues(); // First try for direct values bool found = false; SearchLanguages(languageKey, values, langKey => { var b = PopulateDirectValues(langKey, values, timeZoneId, metaZone, abbreviations); if (b) { found = true; } }); var countries = new List <string>(); string[] c; if (Data.CldrZoneCountries.TryGetValue(timeZoneId, out c)) { countries.AddRange(c); } if (Data.TzdbZoneCountries.TryGetValue(timeZoneId, out c)) { countries.AddRange(c); } foreach (var alias in Data.CldrAliases.Where(x => x.Value == timeZoneId)) { foreach (var item in Data.TzdbZoneCountries .Where(item => string.Equals(item.Key, alias.Key, StringComparison.OrdinalIgnoreCase))) { countries.AddRange(item.Value); } } var country = countries.FirstOrDefault(x => x != "001"); if (abbreviations && country != null) { // try using the specific locale for the zone var lang = languageKey.Split('_', '-')[0] + "_" + country.ToLowerInvariant(); var b = PopulateDirectValues(lang, values, timeZoneId, metaZone, true); if (b) { found = true; } // try english as a last resort if (values.Generic == null || values.Standard == null || values.Daylight == null) { b = PopulateDirectValues("en_" + country.ToLowerInvariant(), values, timeZoneId, metaZone, true); if (b) { found = true; } } } if (country == "RU") { // special case for Russia to force city names in all time zones found = false; } if (found) { // apply type fallback rules values.Generic = values.Generic ?? (values.Daylight == null ? values.Standard : null); values.Daylight = values.Daylight ?? values.Generic; // return whatever we have for abbreviations if (abbreviations) { return(values); } // return names if everything is complete if (values.Generic != null && values.Standard != null && values.Daylight != null) { return(values); } } string regionName = null; if (country != null) { SearchLanguages(languageKey, values, key => { if (regionName != null) { return; } var langData = Data.CldrLanguageData[key]; if (langData != null && langData.CountryNames.ContainsKey(country)) { regionName = langData.CountryNames[country]; } }); } if (country == "RU") { // special case for Russia to force city names in all time zones regionName = null; values = new TimeZoneValues(); } if (regionName == null) { SearchLanguages(languageKey, values, key => { if (regionName != null) { return; } var langData = Data.CldrLanguageData[key]; if (langData != null && langData.CityNames.ContainsKey(timeZoneId)) { regionName = langData.CityNames[timeZoneId]; } }); } if (regionName == null) { regionName = timeZoneId.Split('/').Last().Replace("_", " "); } if (timeZoneId.StartsWith("Etc/GMT+") || timeZoneId.StartsWith("Etc/GMT-")) { values = GetNames("UTC", languageKey, abbreviations); var sign = timeZoneId[7] == '+' ? '-' : '+'; var num = timeZoneId.Substring(8); var s = (abbreviations ? "" : " ") + sign + num; values.Generic += s; values.Standard += s; values.Daylight += s; return(values); } SearchLanguages(languageKey, values, key => { var langData = Data.CldrLanguageData[key]; if (langData == null) { return; } var genericFormat = langData.Formats?.Generic; if (genericFormat != null) { values.Generic = values.Generic ?? genericFormat.Replace("{0}", regionName); } var standardFormat = langData.Formats?.Standard; if (standardFormat != null) { values.Standard = values.Standard ?? standardFormat.Replace("{0}", regionName); } var daylightFormat = langData.Formats?.Daylight; if (daylightFormat != null) { values.Daylight = values.Daylight ?? daylightFormat.Replace("{0}", regionName); } }); if (values.Generic == null && values.Standard == null && languageKey != "en") { // when all else fails, return the English values return(GetNames(timeZoneId, "en", abbreviations)); } return(values); }
private static TimeZoneValues GetNames(string timeZoneId, string languageKey, bool abbreviations) { if (!timeZoneId.Contains("/")) timeZoneId = ConvertWindowsToIana(timeZoneId); timeZoneId = GetCldrCanonicalId(timeZoneId); if (timeZoneId == null) throw new ArgumentException("Invalid Time Zone", "timeZoneId"); var metaZone = GetMetazone(timeZoneId); var values = new TimeZoneValues(); var key = languageKey; while (key != null && (values.Generic == null || values.Standard == null || values.Daylight == null)) { var langData = Data.CldrLanguageData[key]; if (langData != null) { var langNames = abbreviations ? langData.ShortNames : langData.LongNames; if (langNames.ContainsKey(timeZoneId)) { var names = langNames[timeZoneId]; values.Generic = values.Generic ?? names.Generic; values.Standard = values.Standard ?? names.Standard; values.Daylight = values.Daylight ?? names.Daylight; } if (metaZone != null && langNames.ContainsKey(metaZone)) { var names = langNames[metaZone]; values.Generic = values.Generic ?? names.Generic; values.Standard = values.Standard ?? names.Standard; values.Daylight = values.Daylight ?? names.Daylight; } } key = GetLanguageSubkey(key); } if (values.Generic != null && values.Standard != null && values.Daylight != null) return values; if (abbreviations) { if (values.Generic == null) { values.Generic = Data.CldrLanguageData.Where(x=> x.Key.StartsWith("en")) .Select(x => x.Value.ShortNames.ContainsKey(timeZoneId) ? x.Value.ShortNames[timeZoneId].Generic : metaZone != null && x.Value.ShortNames.ContainsKey(metaZone) ? x.Value.ShortNames[metaZone].Generic : null) .FirstOrDefault(x => x != null); } if (values.Standard == null) { values.Standard = Data.CldrLanguageData.Where(x => x.Key.StartsWith("en")) .Select(x => x.Value.ShortNames.ContainsKey(timeZoneId) ? x.Value.ShortNames[timeZoneId].Standard : metaZone != null && x.Value.ShortNames.ContainsKey(metaZone) ? x.Value.ShortNames[metaZone].Standard : null) .FirstOrDefault(x => x != null); } if (values.Daylight == null) { values.Daylight = Data.CldrLanguageData.Where(x => x.Key.StartsWith("en")) .Select(x => x.Value.ShortNames.ContainsKey(timeZoneId) ? x.Value.ShortNames[timeZoneId].Daylight : metaZone != null && x.Value.ShortNames.ContainsKey(metaZone) ? x.Value.ShortNames[metaZone].Daylight : null) .FirstOrDefault(x => x != null); } if (values.Generic == null && values.Daylight == null) values.Generic = values.Standard; return values; } string country; if (Data.CldrZoneCountries.TryGetValue(timeZoneId, out country)) { string countryName = null; key = languageKey; while (key != null) { var langData = Data.CldrLanguageData[key]; if (langData != null) { if (langData.CountryNames.ContainsKey(country)) { countryName = langData.CountryNames[country]; break; } } key = GetLanguageSubkey(key); } if (countryName == null) return values; key = languageKey; while (key != null && (values.Generic == null || values.Standard == null || values.Daylight == null)) { var langData = Data.CldrLanguageData[key]; if (langData != null) { var genericFormat = langData.Formats.Generic; if (genericFormat != null) values.Generic = values.Generic ?? genericFormat.Replace("{0}", countryName); var standardFormat = langData.Formats.Standard; if (standardFormat != null) values.Standard = values.Standard ?? standardFormat.Replace("{0}", countryName); var daylightFormat = langData.Formats.Daylight; if (daylightFormat != null) values.Daylight = values.Daylight ?? daylightFormat.Replace("{0}", countryName); } key = GetLanguageSubkey(key); } } if (values.Generic == null && values.Daylight == null) values.Generic = values.Standard; return values; }
private static TimeZoneValues GetNames(string timeZoneId, string languageKey, bool abbreviations) { if (!timeZoneId.Contains("/")) { timeZoneId = ConvertWindowsToIana(timeZoneId); } timeZoneId = GetCldrCanonicalId(timeZoneId); if (timeZoneId == null) { throw new ArgumentException("Invalid Time Zone", "timeZoneId"); } var metaZone = GetMetazone(timeZoneId); var values = new TimeZoneValues(); var key = languageKey; while (key != null && (values.Generic == null || values.Standard == null || values.Daylight == null)) { var langData = Data.CldrLanguageData[key]; if (langData != null) { var langNames = abbreviations ? langData.ShortNames : langData.LongNames; if (langNames.ContainsKey(timeZoneId)) { var names = langNames[timeZoneId]; values.Generic = values.Generic ?? names.Generic; values.Standard = values.Standard ?? names.Standard; values.Daylight = values.Daylight ?? names.Daylight; } if (metaZone != null && langNames.ContainsKey(metaZone)) { var names = langNames[metaZone]; values.Generic = values.Generic ?? names.Generic; values.Standard = values.Standard ?? names.Standard; values.Daylight = values.Daylight ?? names.Daylight; } } key = GetLanguageSubkey(key); } if (values.Generic != null && values.Standard != null && values.Daylight != null) { return(values); } if (abbreviations) { if (values.Generic == null) { values.Generic = Data.CldrLanguageData.Where(x => x.Key.StartsWith("en")) .Select(x => x.Value.ShortNames.ContainsKey(timeZoneId) ? x.Value.ShortNames[timeZoneId].Generic : metaZone != null && x.Value.ShortNames.ContainsKey(metaZone) ? x.Value.ShortNames[metaZone].Generic : null) .FirstOrDefault(x => x != null); } if (values.Standard == null) { values.Standard = Data.CldrLanguageData.Where(x => x.Key.StartsWith("en")) .Select(x => x.Value.ShortNames.ContainsKey(timeZoneId) ? x.Value.ShortNames[timeZoneId].Standard : metaZone != null && x.Value.ShortNames.ContainsKey(metaZone) ? x.Value.ShortNames[metaZone].Standard : null) .FirstOrDefault(x => x != null); } if (values.Daylight == null) { values.Daylight = Data.CldrLanguageData.Where(x => x.Key.StartsWith("en")) .Select(x => x.Value.ShortNames.ContainsKey(timeZoneId) ? x.Value.ShortNames[timeZoneId].Daylight : metaZone != null && x.Value.ShortNames.ContainsKey(metaZone) ? x.Value.ShortNames[metaZone].Daylight : null) .FirstOrDefault(x => x != null); } if (values.Generic == null && values.Daylight == null) { values.Generic = values.Standard; } return(values); } string country; if (Data.CldrZoneCountries.TryGetValue(timeZoneId, out country)) { string countryName = null; key = languageKey; while (key != null) { var langData = Data.CldrLanguageData[key]; if (langData != null) { if (langData.CountryNames.ContainsKey(country)) { countryName = langData.CountryNames[country]; break; } } key = GetLanguageSubkey(key); } if (countryName == null) { return(values); } key = languageKey; while (key != null && (values.Generic == null || values.Standard == null || values.Daylight == null)) { var langData = Data.CldrLanguageData[key]; if (langData != null) { var genericFormat = langData.Formats.Generic; if (genericFormat != null) { values.Generic = values.Generic ?? genericFormat.Replace("{0}", countryName); } var standardFormat = langData.Formats.Standard; if (standardFormat != null) { values.Standard = values.Standard ?? standardFormat.Replace("{0}", countryName); } var daylightFormat = langData.Formats.Daylight; if (daylightFormat != null) { values.Daylight = values.Daylight ?? daylightFormat.Replace("{0}", countryName); } } key = GetLanguageSubkey(key); } } if (values.Generic == null && values.Daylight == null) { values.Generic = values.Standard; } return(values); }