Получить CultureInfo от текущего посетителя и настроить ресурсы на основе этого? - PullRequest
29 голосов
/ 23 февраля 2012

Как я могу (в ASP .NET MVC) получить CultureInfo текущего посетителя (на основе его / ее языков браузера)?

Я не знаю, с чего начать.Я попытался просмотреть заголовок «Accept-Languages», отправленный браузером.Но разве это лучший способ сделать это?

Ответы [ 6 ]

54 голосов
/ 23 февраля 2012

Request.UserLanguages ​​ это свойство, которое вы ищете. Просто помните, что этот массив может содержать произвольные (даже не обязательные) языки, как установлено заголовками запросов.

UPDATE

Пример:

// Get Browser languages.
var userLanguages = Request.UserLanguages;
CultureInfo ci;
if (userLanguages.Count() > 0)
{
    try
    {
        ci = new CultureInfo(userLanguages[0]);
    }
    catch(CultureNotFoundException)
    {
         ci = CultureInfo.InvariantCulture;
    }
}
else
{
    ci = CultureInfo.InvariantCulture;
}
// Here CultureInfo should already be set to either user's prefereable language
// or to InvariantCulture if user transmitted invalid culture ID
7 голосов
/ 23 февраля 2012

Вы можете использовать код, подобный следующему, чтобы получить различную информацию от вашего пользователя (включая языки):

MembershipUser user = Membership.GetUser(model.UserName);
string browser = HttpContext.Request.Browser.Browser;
string version = HttpContext.Request.Browser.Version;
string type = HttpContext.Request.Browser.Type;
string platform = HttpContext.Request.Browser.Platform;
string userAgent = HttpContext.Request.UserAgent;
string[] userLang = HttpContext.Request.UserLanguages
5 голосов
/ 30 января 2013

Я отмечаю этот вопрос для себя звездочкой и делюсь здесь некоторым кодом, который по существу превращает Request.UserLanguages в массив экземпляров CultureInfo для дальнейшего использования в вашем приложении.С CultureInfo также можно работать более гибко, чем с кодами ISO, поскольку с CultureInfo вы получаете доступ ко всем свойствам культуры (таким как Имя, Имя языка из двух символов, Собственное имя, ...):

        // Create array of CultureInfo objects
        string locale = string.Empty;
        CultureInfo[] cultures = new CultureInfo[Request.UserLanguages.Length + 1];
        for (int ctr = Request.UserLanguages.GetLowerBound(0); ctr <= Request.UserLanguages.GetUpperBound(0);
                 ctr++)
        {
            locale = Request.UserLanguages[ctr];
            if (!string.IsNullOrEmpty(locale))
            {

                // Remove quality specifier, if present.
                if (locale.Contains(";"))
                    locale = locale.Substring(0, locale.IndexOf(';'));
                try
                {
                    cultures[ctr] = new CultureInfo(locale, false);
                }
                catch (Exception) { continue; }
            }
            else
            {
                cultures[ctr] = CultureInfo.CurrentCulture;
            }
        }
        cultures[Request.UserLanguages.Length] = CultureInfo.InvariantCulture;

HTH

4 голосов
/ 03 июля 2018

Похоже, 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 в конец списка, в зависимости от вашего использования.

1 голос
/ 24 апреля 2019

Asp.Net Core версия: с использованием RequestLocalization , т. Е. Культура извлекается из HTTP-запроса.

в Startup.cs - Настройка

app.UseRequestLocalization();

Затем вваш контроллер / бритва Page.cs

var locale = Request.HttpContext.Features.Get<IRequestCultureFeature>();
var BrowserCulture = locale.RequestCulture.UICulture.ToString();
0 голосов
/ 05 декабря 2014

var userLanguage = CultureInfo.CurrentUICulture;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...