Лучший способ определить локаль пользователя в браузере

У меня есть сайт (Flash), локализованный на дюжину языков, и я хочу автоматически определить значение по умолчанию в зависимости от настроек браузера пользователя, чтобы минимизировать количество шагов для доступа к контенту.

К вашему сведению, я не могу использовать серверные сценарии из-за ограничений прокси, поэтому я думаю, что для решения проблемы подойдет JavaScript или ActionScript.

Вопросы:

  1. Какой лучший способ "угадать" локаль пользователя?

  2. Существуют ли какие-либо простые классы / функции, которые могут мне помочь (без сложных пакетов локализации)? Специально, чтобы разбить все возможные языки на меньшее количество (у меня есть переводы) умным способом.

  3. До какой степени я могу доверять такому решению?

  4. Любые другие обходные пути или предложения?

11 ответов

Решение

Надлежащим способом является поиск HTTP - заголовка Accept-Language, отправленного на сервер. Он содержит упорядоченный, взвешенный список языков, которые пользователь настроил для своего браузера.

К сожалению, этот заголовок недоступен для чтения внутри JavaScript; все, что вы получаете, это navigator.language, который говорит вам, какая локализованная версия веб-браузера была установлена. Это не обязательно то же самое, что предпочтительный язык (и) пользователя. На IE вы вместо этого получаете systemLanguage (Установленный язык ОС), browserLanguage (такой же как language) а также userLanguage (конфигурируемый пользователем регион ОС), которые все также бесполезны.

Если бы мне пришлось выбирать между этими свойствами, я бы понюхал userLanguage во-первых, отступая к language и только после этого (если они не соответствуют ни одному из доступных языков), глядя на browserLanguage и наконец systemLanguage,

Если вы можете поместить серверный скрипт где-нибудь еще в сети, который просто читает заголовок Accept-Language и выплевывает его обратно в виде файла JavaScript со значением заголовка в строке, например:

var acceptLanguage= 'en-gb,en;q=0.7,de;q=0.3';

тогда вы могли бы включить