Пример #1
0
        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;
        }
Пример #2
0
 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);
     }
 }
Пример #3
0
        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))
Пример #4
0
        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);
        }
Пример #5
0
        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;
        }
Пример #6
0
        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);
        }