How to check exists culture in .NET

前端 未结 4 1744
生来不讨喜
生来不讨喜 2021-01-17 08:39

I have this code, when I try to get not existed culture I get exception.
Is there exists method like TryGetCultureInfo, which return bool val

相关标签:
4条回答
  • 2021-01-17 09:26

    If you want it to be fast you can use:

    internal static class Culture
    {
        private static readonly HashSet<string> CultureNames = CreateCultureNames();
    
        internal static bool Exists(string name)
        {
            return CultureNames.Contains(name);
        }
    
        private static HashSet<string> CreateCultureNames()
        {
            var cultureInfos = CultureInfo.GetCultures(CultureTypes.AllCultures)
                                          .Where(x => !string.IsNullOrEmpty(x.Name))
                                          .ToArray();
            var allNames = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
            allNames.UnionWith(cultureInfos.Select(x => x.TwoLetterISOLanguageName));
            allNames.UnionWith(cultureInfos.Select(x => x.Name));
            return allNames;
        }
    }
    
    0 讨论(0)
  • 2021-01-17 09:31

    I think there's no such method. So you could just try-catch or check all installed cultures:

    string cultureCode = "de-DE";
    CultureInfo[] cultures = CultureInfo.GetCultures(CultureTypes.AllCultures & ~CultureTypes.NeutralCultures);
    var culture = cultures.FirstOrDefault(c => c.Name.Equals(cultureCode, StringComparison.OrdinalIgnoreCase));
    if (culture == null)
    {
        culture = cultures.FirstOrDefault(c => c.Name.Equals(DefaultCultureCode, StringComparison.OrdinalIgnoreCase));
        if (culture == null)
            culture = CultureInfo.CurrentCulture;
    }
    

    But i would prefer the try-catch, i'm sure it is more efficient.

    public bool TryGetCultureInfo(string cultureCode, string DefaultCultureCode, out CultureInfo culture)
    {
        try
        {
            culture = CultureInfo.GetCultureInfo(cultureCode);
            return true;
        } catch(CultureNotFoundException)
        {
            if (DefaultCultureCode == null)
                culture = CultureInfo.CurrentCulture;
            else
            {
                try
                {
                    culture = CultureInfo.GetCultureInfo(DefaultCultureCode);
                } catch (CultureNotFoundException)
                {
                    culture = CultureInfo.CurrentCulture;
                }
            }
        }
        return false;
    }
    
    0 讨论(0)
  • 2021-01-17 09:31

    You could write a DoesCultureExist method returning a boolean value just like this:

    private static bool DoesCultureExist(string cultureName)
    {
        return CultureInfo.GetCultures(CultureTypes.AllCultures).Any(culture => string.Equals(culture.Name, cultureName, StringComparison.CurrentCultureIgnoreCase));
    }
    
    0 讨论(0)
  • 2021-01-17 09:35

    No, AFAIK is not possible. You can check first if the culture exists and in that case get it.

    The following code shows how to do it:

        private static CultureInfo GetCulture(string name)
        {
            if (!CultureExists(name)) return null;
    
            return CultureInfo.GetCultureInfo(name);
        }
    
        private static bool CultureExists(string name)
        {
            CultureInfo[] availableCultures =
                CultureInfo.GetCultures(CultureTypes.AllCultures);
    
            foreach (CultureInfo culture in availableCultures)
            {
                if (culture.Name.Equals(name))
                    return true;
            }
    
            return false;
        }
    

    Hope it helps

    0 讨论(0)
提交回复
热议问题