在ASP.Net MVC应用程序中设置文化

 2023-02-17    331  

问题描述

在ASP.NET MVC APP中设置文化/UI文化的最佳地点

目前我有一个看起来像这样的文化托洛尔类:

在ASP.Net MVC应用程序中设置文化

public class CultureController : Controller
{
    public ActionResult SetSpanishCulture()
    {
        HttpContext.Session["culture"] = "es-ES";
        return RedirectToAction("Index", "Home");
    }

    public ActionResult SetFrenchCulture()
    {
        HttpContext.Session["culture"] = "fr-FR";
        return RedirectToAction("Index", "Home");
    }
}

和主页上的每种语言的超链接,其中链接如下:

<li><%= Html.ActionLink("French", "SetFrenchCulture", "Culture")%></li>
<li><%= Html.ActionLink("Spanish", "SetSpanishCulture", "Culture")%></li>

哪个工作,但我认为有更合适的方法来做这件事.

我正在使用以下ActionFilter阅读文化
http://www.iansuttle.com/blog/post/aspnet-mvcoaction-filter-for-localized-sites.aspx .我有点一个mvc noob,所以我不自信我在正确的地方设定这个.我不想在web.config级别这样做,它必须基于用户的选择.我也不想检查他们的http-headers从他们的浏览器设置中获取文化.

编辑:

只是为了清楚 – 我不是试图决定是否使用会话.我很满意这一点.我正在尝试解决的是,如果最好在具有要设置的每个文化的动作方法的文化控制器中最好这样做,或者在MVC管道中有一个更好的地方,请执行此操作?

推荐答案

我正在使用这个 localization方法并添加了一个路由参数,每当用户访问example.com/xx-xx/

时,可以设置文化和语言

示例:

routes.MapRoute("DefaultLocalized",
            "{language}-{culture}/{controller}/{action}/{id}",
            new
            {
                controller = "Home",
                action = "Index",
                id = "",
                language = "nl",
                culture = "NL"
            });

我有一个筛选器,它是实际的文化/语言设置:

using System.Globalization;
using System.Threading;
using System.Web.Mvc;

public class InternationalizationAttribute : ActionFilterAttribute {

    public override void OnActionExecuting(ActionExecutingContext filterContext) {

        string language = (string)filterContext.RouteData.Values["language"] ?? "nl";
        string culture = (string)filterContext.RouteData.Values["culture"] ?? "NL";

        Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo(string.Format("{0}-{1}", language, culture));
        Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(string.Format("{0}-{1}", language, culture));

    }
}

要激活Internationalization属性,只需将其添加到您的类:

[Internationalization]
public class HomeController : Controller {
...

现在,只要访问者进入 http://example.com/de-de/home/索引德国站点显示.

我希望这个答案在正确的方向上指向你.

我还制作了一个小mvc 5示例项目,你可以找到这里

只转到http://{yourhost}:{port}/en-us/home/索引,以查看英文(美国)的当前日期,或将其更改为http://{yourhost}:{port }/de-de/home/index for德国等级.

其他推荐答案

我知道这是一个古老的问题,但如果你真的想把它与你的modelbinder合作(关于DefaultModelBinder.ResourceClassKey = “MyResource”;以及ViewModel类的数据注释中指示的资源), 控制器甚至是一个ActionFilter为时已晚,无法设置文化.

可以在Application_AcquireRequestState中设置培养,例如:

protected void Application_AcquireRequestState(object sender, EventArgs e)
    {
        // For example a cookie, but better extract it from the url
        string culture = HttpContext.Current.Request.Cookies["culture"].Value;

        Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo(culture);
        Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(culture);
    }

编辑

实际上,使用一个更好的方法使用自定义ruthandler ,它根据URL设置文化,完全由 alex adamyan在他的博客上.

所有有要做的是覆盖 GetHttpHandler 方法并将文化设置在那里.

public class MultiCultureMvcRouteHandler : MvcRouteHandler
{
    protected override IHttpHandler GetHttpHandler(RequestContext requestContext)
    {
        // get culture from route data
        var culture = requestContext.RouteData.Values["culture"].ToString();
        var ci = new CultureInfo(culture);
        Thread.CurrentThread.CurrentUICulture = ci;
        Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(ci.Name);
        return base.GetHttpHandler(requestContext);
    }
}

其他推荐答案

我会在控制器的初始化事件中这样做…

protected override void Initialize(System.Web.Routing.RequestContext requestContext)
    {
        base.Initialize(requestContext);

        const string culture = "en-US";
        CultureInfo ci = CultureInfo.GetCultureInfo(culture);

        Thread.CurrentThread.CurrentCulture = ci;
        Thread.CurrentThread.CurrentUICulture = ci;
    }

以上所述是小编给大家介绍的在ASP.Net MVC应用程序中设置文化,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!

原文链接:https://77isp.com/post/34220.html

=========================================

https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。