2010-06-28 2 views
8

Я пытаюсь получить страну моих клиентов, поэтому я использую CultureInfo.CurrentCulture. Проблема в том, что когда мои канадские клиенты используют мой сайт, они появляются как американцы.CultureInfo.CurrentCulture дает мне неправильную культуру

Похоже, CultureInfo.CurrentCulture возвращает страну моего сервера вместо своей страны. Итак, как мне получить страну моих клиентов?

ответ

2

Я считаю, что вам нужно написать код , чтобы прочитать культуру пользователя из входящего запроса браузера и установить из этого CultureInfo.

This fellow describes how they do it: Установите культуру отображения текущей нити на наиболее подходящую культуру из входящего в запрос объекта Http-запроса.

Он имеет отличную дискуссию там, но это в основном, как он это делает:

В Page_Load, они делают этот призыв: UIUtilities.setCulture(Request);

Где это то, что можно назвать:

/// Set the display culture for the current thread to the most 
/// appropriate culture from the user's incoming Http "request" object. 
internal static void setCulture(HttpRequest request) 
{ 
    if (request != null) 
    { 
     if (request.UserLanguages != null) 
     { 
     if (request.UserLanguages.Length > -1) 
     { 
      string cultureName = request.UserLanguages[0]; 
      UIUtilities.setCulture(cultureName); 
     } 
     } 
     // TODO: Set to a (system-wide, or possibly user-specified) default 
     // culture if the browser didn't give us any clues. 
    } 
} 

/// Set the display culture for the current thread to a particular named culture. 
/// <param name="cultureName">The name of the culture to be set 
/// for the thread</param> 
private static void setCulture(string cultureName) 
{ 
    Thread.CurrentThread.CurrentCulture = 
     CultureInfo.CreateSpecificCulture(cultureName); 
    Thread.CurrentThread.CurrentUICulture = new 
     CultureInfo(cultureName); 
} 
+0

На правильных строках, но обратите внимание, что заголовок Accept-Language, отправленный браузером, необязательно является предпочтительным языком пользователя. Я в Европе и имею американскую версию Windows, поэтому мой IE8 отправляет в США. Также обратите внимание, что имя в заголовке accept-language не может быть допустимым именем .NET-культуры, поэтому вызов CreateSpecificCulture должен быть заключен в try/catch. – Joe

+0

нет удача. Я все еще получаю en-us в тестировании – thchaver

+0

Что вы получаете от Request.UserLanguages? То есть, вы уверены, на каком языке ваш браузер запрашивает? – DOK

18

Вам просто нужно установить атрибут culture в auto в файле вашего web.config:

<system.web> 
    <globalization culture="auto" /> 
<system.web> 

Это автоматически установит CurrentCulture на культуру клиента.

Вы также можете установить uiCulture в auto, если вы используете локальные ресурсы.

+1

Мне жаль, что я не мог это возвысить более одного раза, спасибо. Принял мне 3 часа, чтобы получить эту работу :) – Thousand

1

В моем случае у моей машины первоначально был английский - Великобритания. Я добавил англо-американский язык и установил его как значение по умолчанию. Я также подтвердил, что США правильно установлены в реестре. К сожалению, System.Threading.Thread.CurrentThread.CurrentCulture все еще отображает неправильную культуру, Великобритания. Я обнаружил, что вам нужно установить языковые параметры. Загрузите языковой пакет, почерк и речь.

Даже тогда культура была неправильной. Великобритания будет отображаться по всей машине, и после того, как я установил языковой пакет в США, меню запуска полностью исчезло. Я сдал и переустановил ОС с использованием англо-американской версии.