Как изменить браузер accept-language

Если у пользователя установлен браузер fr-CA, например, но мой сайт имеет возможность просматривать страницу на другом доступном языке (например, английском). Как переопределить заголовок accept-language, чтобы перезагрузить его с помощью указанного языка?

Я пытался просто изменить заголовок Accept-Language, а затем перезагрузить страницу, но я не уверен, как это сделать. Есть мысли?

обновление: Итак, я получаю людей, объясняющих мне, что такое локализация Должно быть, я неправильно спросил.

мой сайт в настоящее время глобализация установлен на авто в интернете.config, поэтому он автоматически установит культуру потока на тот язык, который был согласован при запуске приложения. По умолчанию браузер пользователя отправляет заголовок accept-language на основе языковых настроек браузера, которые, как кто-то указал ниже, средние пользователи понятия не имеют, что это такое, где они находятся или как их изменить. В любом случае, назовем это default поведение, которое браузер будет обрабатывать заголовки языка в первую очередь. Однако в качестве функции я хочу разрешить пользователю изменять этот заголовок accept-language со страницы. Например, в приложении языковые настройки обычно определяются cookie или предпочтениями пользователя (через настройки профиля), но на странице посадки/входа в систему (особенно, если это ваш первый вход в систему на определенном компьютере), я понятия не имею, кто вы, поэтому у меня есть только настройки Вашего браузера, чтобы уйти. Но давайте скажите, что вы путешествуете по бизнесу и получаете доступ к этому сайту с американского компьютера, страница загружается на английском языке, и вы не можете ее прочитать, и вы понятия не имеете, как изменить язык браузера. Было бы неплохо иметь возможность выбрать язык из выпадающего меню или значок или что-то? Думаю, так и будет.

поэтому для этого мне нужно изменить заголовок accept-language и перезагрузить страницу. Здесь я не уверен, как ... приступать.

Я пробовал navigator.language = <selected language> и xhr.setRequestHeader но они, похоже, не работают.

2 ответов


Я могу ошибаться, но настройки локали-это не то, что вы меняете в своем коде. Это определяется пользовательской конфигурацией браузера. Если вы используете HttpClient, вы определенно отправляете на сервер значение, которое хотите для заголовка Accept-Language, но не ожидайте, что это изменится из вашего кода и сделает его эффективным во всех запросах, созданных в браузере.

обычной практикой является установка пользовательского файла cookie с предпочтениями вашего пользователя. По умолчанию вы должны заполните этот файл cookie значением заголовка Accept-Language. В ASP.NET MVC есть настройка, поэтому оба нить.CurrentThread.Свойства currentculture и резьбы.CurrentThread.CurrentUICulture get устанавливается в соответствии с конфигурацией браузера пользователя:

<system.web>
    <globalization enableClientBasedCulture="true" uiCulture="auto" culture="auto" />
</system.web>

затем вы можете создать ActionFilter, который проверит пользовательский язык cookie и установит нить.CurrentThread.Currentuiculture выполняющегося соответственно.

нить.CurrentThread.CurrentUICulture используется для определения ресурсов, которые должен использовать код. В То Время Как Поток.CurrentThread.CurrentCulture используется для обработки всех чисел и дат.

вот как может выглядеть этот фильтр действий:

public class LanguageActionFilter : IActionFilter
{
    public void OnActionExecuted(ActionExecutedContext filterContext)
    {
    }

    public void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var langCookie = GetOrSetLanguageCookie(filterContext.HttpContext);
        var culture = new CultureInfo(langCookie.Value);

        Thread.CurrentThread.CurrentUICulture = culture;
    }

    private HttpCookie GetOrSetLanguageCookie(HttpContextBase context)
    {
        var cookie = context.Request.Cookies[Constants.LanguageCookieName];
        if (cookie == null)
        {
            //set the cookie for first time
            cookie = new HttpCookie(Constants.LanguageCookieName, Thread.CurrentThread.CurrentUICulture.Name)
            {
                Expires = DateTime.Now.AddYears(1),
                Path = "/"
            };
            context.Response.Cookies.Add(cookie);
        }
        return cookie;
    }
}

Пожалуйста, Обратите Внимание:

  • даже когда ваш пользователь выбирает, скажем, "es-Ar" в вашем интерфейсе, и вы устанавливаете свою UICulture соответственно для этого пользователя, если пользователь браузер настроен с en-US датами, размещенными для этого пользователя, будет разбираться с использованием английского соглашения, поэтому номер float будет.

IE: если пользователь в США с браузером, установленным на en_US, выбирает использовать испанский интерфейс вашего приложения, когда этот пользователь публикует информацию на сервере, например:

1/5/2015 будет разобрать, как 5 января на сервере, а не 1 мая.

числа, такие как 1,900, будут проанализированы как 1900 на сервере, а не 1.900.

я узнал это на собственном горьком опыте. У меня вопрос здесь на это никто не ответил.

пожалуйста, дайте мне знать если вы имеете любые вопросы.


на Accept-Language заголовок-это заголовок запроса, поэтому он отправляется браузером (или другим клиентским программным обеспечением). На вашем сервере, вы можете игнорировать его, ничего не делая. То есть это не имеет никакого эффекта как такового; все зависит от того, распознает ли ваш серверный код его и предпринимает ли какие-либо действия. Таким образом, вы не можете и не должны изменять заголовок, отправленный браузером.

пользователь может изменить Accept-Language заголовок, отправленный браузером, используя настройки предпочтений браузера. Например, в Chrome, go чтобы "Настройки", нажмите "Показать дополнительные настройки"...", прокрутите вниз до "Languages", нажмите " Language and input settings...", а затем добавьте языки и перетащите, чтобы заказать их.

Это не то, что люди делают часто, и большинство людей даже не догадываются о существовании таких настроек. Таким образом, браузер отправляет обычно некоторые заводские значения по умолчанию. Они могут быть довольно странными, например Accept-Language: fr-CA будет означать, по протоколу, " если у вас, дорогой сервер, есть разные языковые версии ресурса, я попросите, пожалуйста, дайте мне канадский французский; если у вас его нет, мне все равно, какую версию вы даете". Это означает, что если ресурс существует на родовом французском (французского языка) или на английском языке, они не будут иметь предпочтения, скажем, суахили или волапюк версии. Таким образом, более разумный заголовок обычно будет Accept-Language: fr-CA, fr, en, а это на практике, как вы должны иметь дело с Accept-Language: fr-CA.