yavsc/Yavsc/Filters/LanguageActionFilter.cs

62 lines
2.3 KiB
C#

using System.Globalization;
namespace Yavsc
{
using Microsoft.AspNet.Mvc.Filters;
using Microsoft.Extensions.Logging;
public class LanguageActionFilter : ActionFilterAttribute
{
private readonly ILogger _logger;
public LanguageActionFilter(ILoggerFactory loggerFactory)
{
_logger = loggerFactory.CreateLogger("LanguageActionFilter");
}
public override void OnActionExecuting(ActionExecutingContext context)
{
string culture = null;
var routedCulture = context.RouteData.Values["culture"];
if (routedCulture != null) {
culture = routedCulture.ToString();
_logger.LogInformation($"Setting the culture from the URL: {culture}");
}
else {
if (context.HttpContext.Request.Headers.ContainsKey("accept-language"))
{
// fr,en-US;q=0.7,en;q=0.3
string spec = context.HttpContext.Request.Headers["accept-language"];
_logger.LogInformation($"Setting the culture from language header spec: {spec}");
string firstpart = spec.Split(';')[0];
foreach (string lang in firstpart.Split(','))
{
// TODO do it from the given options ...
// just take the main part :-)
string mainlang = lang.Split('-')[0];
if (mainlang=="fr"||mainlang=="en") {
culture = mainlang;
_logger.LogInformation($"Setting the culture from header: {culture}");
break;
}
}
}
}
if (culture != null) {
#if DNX451
System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo(culture);
System.Threading.Thread.CurrentThread.CurrentUICulture = new CultureInfo(culture);
#else
CultureInfo.CurrentCulture = new CultureInfo(culture);
CultureInfo.CurrentUICulture = new CultureInfo(culture);
#endif
}
base.OnActionExecuting(context);
}
}
}