Похоже, Request.UserLanguages
недоступно в более поздних версиях mvc (в ядре Asp.net mvc 2.0.2 его не было.)
Я сделал метод расширения для HTTPRequest
. Используйте его следующим образом:
var requestedLanguages = Request.GetAcceptLanguageCultures();
Метод даст вам культуры из заголовка Accept-Language
в порядке предпочтения (a.k.a. «качество»).
public static class HttpRequestExtensions
{
public static IList<CultureInfo> GetAcceptLanguageCultures(this HttpRequest request)
{
var requestedLanguages = request.Headers["Accept-Language"];
if (StringValues.IsNullOrEmpty(requestedLanguages) || requestedLanguages.Count == 0)
{
return null;
}
var preferredCultures = requestedLanguages.ToString().Split(',')
// Parse the header values
.Select(s => new StringSegment(s))
.Select(StringWithQualityHeaderValue.Parse)
// Ignore the "any language" rule
.Where(sv => sv.Value != "*")
// Remove duplicate rules with a lower value
.GroupBy(sv => sv.Value).Select(svg => svg.OrderByDescending(sv => sv.Quality.GetValueOrDefault(1)).First())
// Sort by preference level
.OrderByDescending(sv => sv.Quality.GetValueOrDefault(1))
.Select(sv => new CultureInfo(sv.Value.ToString()))
.ToList();
return preferredCultures;
}
}
Протестировано с ASP.NET Core MVC 2.0.2
Это похоже на ответ @ mare, но немного более актуально, и q (качество) не игнорируется. Кроме того, вы можете добавить CultureInfo.InvariantCulture
в конец списка, в зависимости от вашего использования.