public IEnumerable <Models.Language> GetAllLanguages()
        {
            List <Models.Language> languages = new List <Models.Language>();

            languages.AddRange(
                LocalizationContext.Languages
                .Select(o => o.CultureInfo)
                .Select(o => new Models.Language
            {
                ISOCode     = o.Name,
                DisplayName = o.DisplayName,
                NativeName  = o.NativeName
            }));

            // See if one has already been set via the event handler
            Models.Language activeLanguage = languages.FirstOrDefault(o => o.IsDefault);

            // If not try set from current thread
            if (activeLanguage == null)
            {
                activeLanguage = GetActiveLanguage(languages, Thread.CurrentThread.CurrentUICulture.Name);
            }

            // Couldn't find from the thread, so try from web.config
            if (activeLanguage == null)
            {
                activeLanguage = GetActiveLanguage(languages, LocalizationContext.DefaultCulture.Name);
            }

            // Couldn't find a good enough match, just select the first language
            if (activeLanguage == null)
            {
                activeLanguage = languages.FirstOrDefault();
            }

            // If we found any we set it as the default language for the backend
            if (activeLanguage != null)
            {
                languages.Single(o => o.ISOCode == activeLanguage.ISOCode).IsDefault = true;
            }

            return(languages);
        }
        private Models.Language GetActiveLanguage(
            List <Models.Language> languages,
            string isoCode)
        {
            // Try settings to exact match of current culture
            Models.Language language = languages.FirstOrDefault(o => o.ISOCode == isoCode);

            // Try setting to nearest match
            if (language == null)
            {
                language = languages.FirstOrDefault(o => o.ISOCode.Contains(isoCode));
            }

            // Try setting to nearest match
            if (language == null)
            {
                language = languages.FirstOrDefault(o => isoCode.Contains(o.ISOCode));
            }

            return(language);
        }