В браузере обнаружено неверное имя языка - PullRequest
0 голосов
/ 10 октября 2011

Я получил этот код для извлечения языка браузера, который был установлен пользователем:

string cultureName = string.Empty;

try
{
    string[] languages = HttpContext.Current.Request.UserLanguages;
    cultureName = languages[0].ToLowerInvariant().Trim();
}
catch
{
    cultureName = "en-US";
}

System.Globalization.CultureInfo browserCulture = CultureInfo.CreateSpecificCulture(cultureName);
System.Threading.Thread.CurrentThread.CurrentCulture = browserCulture;
System.Threading.Thread.CurrentThread.CurrentUICulture = browserCulture;

Я получил эти ошибки:

  1. Culture name 'name' is not supported: снаши журналы ошибок обнаружили, что это имя x-ns1xs4m8wixnxg, x-ns1dfk__jmpnx0 и т. д. Я не знаю, откуда эти языки или какие они есть, но я думаю, что эти языки извлекаются при просмотре с мобильного телефона.

  2. The name 'name' contains characters that are not valid for a Culture or Region: Также выяснилось, что имя fr; q=1.0, en;q=1.0, en_us, en;q=0.9 и т. Д. ... Я думаю, что я должен разобрать его по символам, чтобыпосмотрите, действительно ли это

Я уже изменил свой код для обработки этих ошибок:

CultureInfo cultureInfo;

try
{
    string[] languages = HttpContext.Current.Request.UserLanguages;
    string cultureName = languages[0].ToLowerInvariant().Trim();
    cultureInfo = CultureInfo.CreateSpecificCulture(cultureName);
}
catch
{
    cultureInfo = CultureInfo.CreateSpecificCulture("en-US");
}

System.Globalization.CultureInfo browserCulture = cultureInfo;
System.Threading.Thread.CurrentThread.CurrentCulture = browserCulture;
System.Threading.Thread.CurrentThread.CurrentUICulture = browserCulture;

, но я хотел бы знать, откуда появились эти языки,или как их тиражировать?Это для проверки правильности работы моего кода.Спасибо.

1 Ответ

2 голосов
/ 10 октября 2011

Единственное, что вам следует знать, что UserLanguages просто вернет соответствующий HTTP-заголовок.Значения заголовка могут иметь дополнительные атрибуты, разделенные ;.Таким образом, вы должны разделить это значение на ; и получить первый бит.

Что касается x-ns1dfk__jmpnx0 Я бы сказал, игнорировать это.Возвращение к языку по умолчанию в этом случае является полностью допустимым.

edit: я возвращаю первую часть назад.Согласно этот параметр q является значением языкового предпочтения.Итак, что вам действительно нужно сделать, это разделить точку с запятой, затем проанализировать значение атрибута q (предположим, 1, если его нет), затем отсортировать его и взять первое.

...