2016-04-30 2 views
3

Я вижу, что есть похожие вопросы к этому, но я не нашел ответа на свой вопрос там, и поэтому я решил задать вопрос самому.Как правильно определить культуру пользовательского браузера в asp.net mvc

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

Мой вопрос: Все, кажется, работает очень хорошо в теории, но ...

Это мои предпочтения языка браузера Я знаю, что они установлены на определенном порядке

1

Это заказ отправляется на сервер точно так же, как независимо от того, что мой язык отображения на экране установлен на болгарский, мое предпочтение по-прежнему остается en-US

2

Это образец фрагмент код, чтобы показать, что мой Dev инструментов консоль говорит о моем браузере языке отображения

3

И в моем коде я не могу знать, что это язык браузера, я только могу получить предпочтительный язык для пользователя, то я получаю Языки [0]

4

есть ли способ, чтобы получить этот язык дисплея. Я не могу использовать JS для отправки, потому что у меня есть проблема, что мой первый запрос всегда отображает страницу на английском языке, чем когда установлен сеанс, она отображает ее локализованную. Вероятно, есть обходной путь для проверки и установки определенного заголовка из JS, но я думаю о более галантном способе делать это только с C#.

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

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

+2

Лучший способ [поместить выбор культуры в URL-адрес] (http://stackoverflow.com/questions/32764989/asp-net-mvc-5-culture-in-route-and-url#32839796) и полностью игнорировать заголовки (которые BTW могут быть изменены брандмауэрами). Это дало бы ПОЛЬЗОВАТЕЛЬскому контролю над отображаемым языком, а не предполагать браузер, и любые брандмауэры, которые пользователь сидит сзади, запросят правильный язык. Он также обеспечит индексирование вашего сайта на всех поддерживаемых вами языках, чтобы его можно было искать с помощью поисковых систем на родном языке пользователя. – NightOwl888

+0

Когда кто-то говорит «Лучший способ ...», я всегда добавляю «... для всех случаев использования, о которых я сейчас думаю ...», на мой взгляд, поскольку я узнал, что никогда не будет глобального «наилучшего способа» буквально _anything_. –

+1

Это также не поможет с первым запросом, но обычно рекомендуется, чтобы пользователь мог впоследствии переключиться либо в URL-адресе, либо в пользовательском заголовке, либо в файле cookie. –

ответ

0

вы можете использовать CultureHelper:

public static class CultureHelper 
{ 

// Valid cultures 
    private static readonly List<string> _validCultures = new List<string> {   "af", "af-ZA", "sq", "sq-AL", "gsw-FR", "am-ET", "ar", "ar-DZ", "ar-BH", "ar- EG", "ar-IQ", "ar-JO", "ar-KW", "ar-LB", "ar-LY", "ar-MA", "ar-OM", "ar-QA", "ar-SA", "ar-SY", "ar-TN", "ar-AE", "ar-YE", "hy", "hy-AM", "as-IN", "az", "az-Cyrl-AZ", "az-Latn-AZ", "ba-RU", "eu", "eu-ES", "be", "be-BY", "bn-BD", "bn-IN", "bs-Cyrl-BA", "bs-Latn-BA", "br-FR", "bg", "bg-BG", "ca", "ca-ES", "zh-HK", "zh-MO", "zh-CN", "zh-Hans", "zh-SG", "zh-TW", "zh-Hant", "co-FR", "hr", "hr-HR", "hr-BA", "cs", "cs-CZ", "da", "da-DK", "prs-AF", "div", "div-MV", "nl", "nl-BE", "nl-NL", "en", "en-AU", "en-BZ", "en-CA", "en-029", "en-IN", "en-IE", "en-JM", "en-MY", "en-NZ", "en-PH", "en-SG", "en-ZA", "en-TT", "en-GB", "en-US", "en-ZW", "et", "et-EE", "fo", "fo-FO", "fil-PH", "fi", "fi-FI", "fr", "fr-BE", "fr-CA", "fr-FR", "fr-LU", "fr-MC", "fr-CH", "fy-NL", "gl", "gl-ES", "ka", "ka-GE", "de", "de-AT", "de-DE", "de-LI", "de-LU", "de-CH", "el", "el-GR", "kl-GL", "gu", "gu-IN", "ha-Latn-NG", "he", "he-IL", "hi", "hi-IN", "hu", "hu-HU", "is", "is-IS", "ig-NG", "id", "id-ID", "iu-Latn-CA", "iu-Cans-CA", "ga-IE", "xh-ZA", "zu-ZA", "it", "it-IT", "it-CH", "ja", "ja-JP", "kn", "kn-IN", "kk", "kk-KZ", "km-KH", "qut-GT", "rw-RW", "sw", "sw-KE", "kok", "kok-IN", "ko", "ko-KR", "ky", "ky-KG", "lo-LA", "lv", "lv-LV", "lt", "lt-LT", "wee-DE", "lb-LU", "mk", "mk-MK", "ms", "ms-BN", "ms-MY", "ml-IN", "mt-MT", "mi-NZ", "arn-CL", "mr", "mr-IN", "moh-CA", "mn", "mn-MN", "mn-Mong-CN", "ne-NP", "no", "nb-NO", "nn-NO", "oc-FR", "or-IN", "ps-AF", "fa", "fa-IR", "pl", "pl-PL", "pt", "pt-BR", "pt-PT", "pa", "pa-IN", "quz-BO", "quz-EC", "quz-PE", "ro", "ro-RO", "rm-CH", "ru", "ru-RU", "smn-FI", "smj-NO", "smj-SE", "se-FI", "se-NO", "se-SE", "sms-FI", "sma-NO", "sma-SE", "sa", "sa-IN", "sr", "sr-Cyrl-BA", "sr-Cyrl-SP", "sr-Latn-BA", "sr-Latn-SP", "nso-ZA", "tn-ZA", "si-LK", "sk", "sk-SK", "sl", "sl-SI", "es", "es-AR", "es-BO", "es-CL", "es-CO", "es-CR", "es-DO", "es-EC", "es-SV", "es-GT", "es-HN", "es-MX", "es-NI", "es-PA", "es-PY", "es-PE", "es-PR", "es-ES", "es-US", "es-UY", "es-VE", "sv", "sv-FI", "sv-SE", "syr", "syr-SY", "tg-Cyrl-TJ", "tzm-Latn-DZ", "ta", "ta-IN", "tt", "tt-RU", "te", "te-IN", "th", "th-TH", "bo-CN", "tr", "tr-TR", "tk-TM", "ug-CN", "uk", "uk-UA", "wen-DE", "ur", "ur-PK", "uz", "uz-Cyrl- UZ", "uz-Latn-UZ", "vi", "vi-VN", "cy-GB", "wo-SN", "sah-RU", "ii-CN", "yo-NG" }; 
    // Include ONLY cultures you are implementing 
    private static readonly List<string> _cultures = new List<string> { 
    "fr",// first culture is the DEFAULT 
    "ar", 
    "en" 

    }; 
    /// <summary> 
    /// Returns true if the language is a right-to-left language. Otherwise, false. 
    /// </summary> 
    public static bool IsRighToLeft() 
    { 
     return System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.IsRightToLeft; 

    } 
    /// <summary> 
    /// Returns a valid culture name based on "name" parameter. If "name" is not valid, it returns the default culture "en-US" 
    /// </summary> 
    /// <param name="name" />Culture's name (e.g. en-US)</param> 
    public static string GetImplementedCulture(string name) 
    { 
     // make sure it's not null 
     if (string.IsNullOrEmpty(name)) 
      return GetDefaultCulture(); // return Default culture 
     // make sure it is a valid culture first 
     if (_validCultures.Where(c => c.Equals(name, StringComparison.InvariantCultureIgnoreCase)).Count() == 0) 
      return GetDefaultCulture(); // return Default culture if it is invalid 
     // if it is implemented, accept it 
     if (_cultures.Where(c => c.Equals(name, StringComparison.InvariantCultureIgnoreCase)).Count() > 0) 
      return name; // accept it 
     // Find a close match. For example, if you have "en-US" defined and the user requests "en-GB", 
     // the function will return closes match that is "en-US" because at least the language is the same (ie English) 
     var n = GetNeutralCulture(name); 
     foreach (var c in _cultures) 
      if (c.StartsWith(n)) 
       return c; 
     // else 
     // It is not implemented 
     return GetDefaultCulture(); // return Default culture as no match found 
    } 
    /// <summary> 
    /// Returns default culture name which is the first name decalared (e.g. en-US) 
    /// </summary> 
    /// <returns></returns> 
    public static string GetDefaultCulture() 
    { 
     return _cultures[0]; // return Default culture 
    } 
    public static List<string> GetCultures() 
    { 
     return _cultures; 
    } 
    public static string GetCurrentCulture() 
    { 
     return Thread.CurrentThread.CurrentCulture.Name; 
    } 
    public static string GetCurrentNeutralCulture() 
    { 
     return GetNeutralCulture(Thread.CurrentThread.CurrentCulture.Name); 
    } 
    public static string GetNeutralCulture(string name) 
    { 
     if (!name.Contains("-")) return name; 

     return name.Split('-')[0]; // Read first part only. E.g. "en", "es" 
    } 
} 

Затем в использовании вид:

<script> 
    var currentLang = '@CultureHelper.GetCurrentCulture()'; 
</script> 
0

Язык дисплея является не то, что вам нужно знать, на сервере, так как только внедрение в Chrome, который работает таким образом, не обязательно должен быть какой-либо язык отображения в любом другом браузере (хотя это может быть). Все, что вы получаете, это список языков в предпочтительном порядке (если вы хотите, чтобы болгарский был первым, вам просто нужно перетащить & в Chrome за ним).

Большинство пользователей будут иметь язык отображения = самый верхний язык, и это также будет единственным языком.

Смежные вопросы