Obtenga CultureInfo del visitante actual y establezca recursos basados ​​en eso?

¿Cómo puedo (en ASP .NET MVC) obtener el CultureInfo del visitante actual (basado en los idiomas de su navegador)?

No tengo idea de por dónde empezar. Intenté buscar en el encabezado “Aceptar idiomas” enviado por el navegador. ¿Pero es esa la mejor manera de hacerlo?

Request.UserLanguages es la propiedad que está buscando. Solo tenga en cuenta que esta matriz puede contener idiomas arbitrarios (incluso no exsitentes) configurados por encabezados de solicitud.

ACTUALIZAR

Ejemplo:

// Get Browser languages. var userLanguages = Request.UserLanguages; CultureInfo ci; if (userLanguages.Count() > 0) { try { ci = new CultureInfo(userLanguages[0]); } catch(CultureNotFoundException) { ci = CultureInfo.InvariantCulture; } } else { ci = CultureInfo.InvariantCulture; } // Here CultureInfo should already be set to either user's prefereable language // or to InvariantCulture if user transmitted invalid culture ID 

Puede usar un código similar al siguiente para obtener diversos detalles de su usuario (incluidos los idiomas):

 MembershipUser user = Membership.GetUser(model.UserName); string browser = HttpContext.Request.Browser.Browser; string version = HttpContext.Request.Browser.Version; string type = HttpContext.Request.Browser.Type; string platform = HttpContext.Request.Browser.Platform; string userAgent = HttpContext.Request.UserAgent; string[] userLang = HttpContext.Request.UserLanguages 

Estoy marcando esta pregunta para mí con una estrella y compartiendo aquí un código que esencialmente convierte Request.UserLanguages en una matriz de instancias CultureInfo para su uso posterior en su aplicación. También es más flexible trabajar con CultureInfo que solo con los códigos ISO, porque con CultureInfo puede acceder a todas las propiedades de una cultura (como Nombre, Nombre de idioma de dos caracteres, Nombre nativo, …):

  // Create array of CultureInfo objects string locale = string.Empty; CultureInfo[] cultures = new CultureInfo[Request.UserLanguages.Length + 1]; for (int ctr = Request.UserLanguages.GetLowerBound(0); ctr <= Request.UserLanguages.GetUpperBound(0); ctr++) { locale = Request.UserLanguages[ctr]; if (!string.IsNullOrEmpty(locale)) { // Remove quality specifier, if present. if (locale.Contains(";")) locale = locale.Substring(0, locale.IndexOf(';')); try { cultures[ctr] = new CultureInfo(locale, false); } catch (Exception) { continue; } } else { cultures[ctr] = CultureInfo.CurrentCulture; } } cultures[Request.UserLanguages.Length] = CultureInfo.InvariantCulture; 

HTH

Parece que Request.UserLanguages no está disponible en versiones posteriores de mvc (Asp.net core mvc 2.0.2 no lo tenía).

El siguiente código le dará las culturas del encabezado Accept-Language en orden de preferencia.

Es similar a la respuesta de @mare, pero un poco más actualizada y la calidad no se ignora. Simplemente lo preparé, por lo que puede haber algún margen de mejora.

Probado con ASP.NET Core MVC 2.0.2

 public IEnumerable GetUserPreferredCultures() { var requestedLanguages = Request.Headers["Accept-Language"]; if (StringValues.IsNullOrEmpty(requestedLanguages) || requestedLanguages.Count == 0) { return null; } var preferredCultures = requestedLanguages.ToString().Split(',') .Select(s => new StringSegment(s)) .Select(StringWithQualityHeaderValue.Parse) .Where(sv => sv.Value != AnyLanguageIdentifier) // Remove duplicates with a lower value .GroupBy(sv => sv.Value).Select(svg => svg.OrderByDescending(sv => sv.Quality.GetValueOrDefault(1)).First()) .OrderByDescending(sv => sv.Quality.GetValueOrDefault(1)) .Select(sv => new CultureInfo(sv.Value.ToString())); return preferredCultures; } 

var userLanguage = CultureInfo.CurrentUICulture;