using System.Globalization;
using System.Net.Http.Headers;
using System.Collections.Generic;
public static class AcceptLanguageHandler
private static readonly CultureInfo[] SupportedCultures = {
CultureInfo.CreateSpecificCulture("en-GB"),
CultureInfo.CreateSpecificCulture("nl-BE"),
CultureInfo.CreateSpecificCulture("fr-BE"),
CultureInfo.CreateSpecificCulture("fr-LU"),
CultureInfo.CreateSpecificCulture("nl-NL"),
CultureInfo.CreateSpecificCulture("de-DE"),
CultureInfo.CreateSpecificCulture("fi-FI"),
CultureInfo.CreateSpecificCulture("fr-FR"),
CultureInfo.CreateSpecificCulture("da-DK"),
CultureInfo.CreateSpecificCulture("nb-NO"),
CultureInfo.CreateSpecificCulture("sv-SE"),
CultureInfo.CreateSpecificCulture("es-ES"),
CultureInfo.CreateSpecificCulture("ga-IE"),
CultureInfo.CreateSpecificCulture("en-IE"),
CultureInfo.CreateSpecificCulture("en-INT"),
CultureInfo.CreateSpecificCulture("pl-PL"),
CultureInfo.CreateSpecificCulture("hr-HR")
private static readonly IReadOnlyDictionary<string, CultureInfo> s_cultures = new string[] {
}.ToDictionary(x => x, x => CultureInfo.CreateSpecificCulture(x));
private static readonly ILookup<string, CultureInfo> s_twoletters = s_cultures.ToLookup(x => x.Value.TwoLetterISOLanguageName, x => x.Value);
public static CultureInfo Get(System.Net.Http.Headers.StringWithQualityHeaderValue[] AcceptLanguage)
var culture = AcceptLanguage
.Where(headerValue => SupportedCultures.Any(c => c.Name == headerValue.Value || c.TwoLetterISOLanguageName == headerValue.Value))
.OrderByDescending(headerValue => headerValue.Quality ?? 1)
.Select(headerValue => SupportedCultures.Single(c => c.Name == headerValue.Value || c.TwoLetterISOLanguageName == headerValue.Value))
.FirstOrDefault() ?? SupportedCultures.First();
public static CultureInfo Get2(System.Net.Http.Headers.StringWithQualityHeaderValue[] AcceptLanguage)
foreach (var acceptedLanguage in AcceptLanguage.OrderByDescending(x => x.Quality ?? 1).Select(x => x.Value))
if (s_cultures.TryGetValue(acceptedLanguage, out var culture))
foreach (var acceptedLanguage in AcceptLanguage.OrderByDescending(x => x.Quality ?? 1).Select(x => x.Value))
var twoletter = s_twoletters[acceptedLanguage].FirstOrDefault();
return SupportedCultures.First();
public static void Main()
var nlBe = new StringWithQualityHeaderValue("nl-BE");
var enGB = new StringWithQualityHeaderValue("en-GB");
var enIE = new StringWithQualityHeaderValue("en-IE");
var enRandom = new StringWithQualityHeaderValue("en-RANDOM");
var en = new StringWithQualityHeaderValue("en");
var random = new StringWithQualityHeaderValue("random");
Console.WriteLine(AcceptLanguageHandler.Get([nlBe]));
Console.WriteLine(AcceptLanguageHandler.Get([nlBe, enGB]));
Console.WriteLine(AcceptLanguageHandler.Get([enGB]));
Console.WriteLine(AcceptLanguageHandler.Get([nlBe, enGB, en]));
Console.WriteLine(AcceptLanguageHandler.Get([random]));
Console.WriteLine(AcceptLanguageHandler.Get([enIE]));
Console.WriteLine(AcceptLanguageHandler.Get([enRandom]));
Console.WriteLine(AcceptLanguageHandler.Get([en]));
catch (InvalidOperationException ex)
Console.WriteLine("Sequence contains more than one matching element");
Console.WriteLine(AcceptLanguageHandler.Get2([nlBe]));
Console.WriteLine(AcceptLanguageHandler.Get2([nlBe, enGB]));
Console.WriteLine(AcceptLanguageHandler.Get2([enGB]));
Console.WriteLine(AcceptLanguageHandler.Get2([nlBe, enGB, en]));
Console.WriteLine(AcceptLanguageHandler.Get2([random]));
Console.WriteLine(AcceptLanguageHandler.Get2([enIE]));
Console.WriteLine(AcceptLanguageHandler.Get2([enRandom]));
Console.WriteLine(AcceptLanguageHandler.Get2([en]));