微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

共享布局或共享控制器中进行本地化?

如何解决共享布局或共享控制器中进行本地化?

允许用户从网站顶部的下拉菜单中更改显示语言。

我将本地化菜单放置在共享布局(_Layout.cshtml)中,以允许菜单显示在每个网页中。

_Layout.cshtml

 <div class="form-inline RightMenuBar">
            <div>@*@ViewBag.Language&nbsp&nbsp&nbsP*@</div>
            <form action="@Url.Action("Index","Home")" method="get" id="ChangeLangForm">
                <select class="ChangeLanguage">
                    <option Value="zh-HK">繁體中文</option>
                    <option Value="en-US">English</option>
                </select>
                <input type="hidden" name="L" class="Lang" />
            </form>
        </div>

表单将在更改时提交并触发终点

$('.ChangeLanguage').on('change',function () {
        console.log($('.Lang').val($('.ChangeLanguage option:selected').val()));
        $('#ChangeLangForm').submit();
        });

在控制器中,它将使用通过表单传递的值并创建cultureinfo,最后将合适的文本从本地化资源放入ViewBag,然后返回View

 public class HomeController : Controller
{
    UserMenuDBService UserMenuService = new UserMenuDBService();


    // GET: Home
    
    public ActionResult Index(string L)
    {
        if (! this.Request.IsAuthenticated)
        {
            return this.RedirectToAction("Login","User");
        }

        UserMenu Data = new UserMenu();
        string Userid = (string)Session["Userid"];
        Data.DataList = UserMenuService.GetDataList(Userid);

        if (L == null)
        {
            if (Request.Cookies["Language"] == null)
            {
                L = "zh-HK";
            }
            else {
                if (Request.Cookies["Language"].Value == "")
                    L = "zh-HK";
                else
                    L = Request.Cookies["Language"].Value;
            }
            Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(L);
            Thread.CurrentThread.CurrentUICulture = new CultureInfo(L);
            ViewBag.Lang = L;
        }
        else
        {
            Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(L);
            Thread.CurrentThread.CurrentUICulture = new CultureInfo(L);
            ViewBag.Lang = L;
            Response.Cookies.Remove("Language");
            HttpCookie myCookie = new HttpCookie("Language");
            myCookie.Value = L;
            myCookie.Expires = DateTime.Now.AddDays(9999d);
            Response.Cookies.Add(myCookie);
        }

        ViewBag.Lang = L;
        ViewBag.title = Localization.Resource.title;
        ViewBag.news = Localization.Resource.news;

        return View(Data);
    }
}

/HOME/index.cshtml

 <h2>@ViewBag.title</h2>

 @ViewBag.news

现在,它可以成功显示基于所选值的相应语言。

但是,如果我尝试将_Layout.cshtml应用于其他网站,则当我更改人工时,它将自动将网站重定向到HOME / index.cshtml 就像我在SETTING / index.cshtml中更改人工费一样,它将重定向到HOME / index.cshtml

我知道是由于_Layout.cshtml中的表单始终调用HOMECONTROLLER来处理本地化所致,所以即使我在home / index.cshtml页面之外触发它,它也始终会将用户重定向到它。

所以我的问题是,我可以设计一个共享控制器吗?

我的想法是,设计一个返回ViewBag的控制器,该控制器包含整个本地化资源字符串,并且前端将使用他们想要的字符串(另一方面,它将传递许多多余的字符串,这似乎不好)

我正在考虑创建一个对象,该对象存储本地化资源文件中的所有字符串,控制器将从中获取所需的字符串并将其存储到ViewBag中,然后将其返回到前端。

但是,我关心的是,当前我是通过使用表单调用控制器来触发本地化的,这意味着我只能创建一个共享控制器来做到这一点?还是我可以设计一个动态共享布局页面,它可以根据哪个页面用户调用不同的控制器?

就像在Home / index中将调用home控制器,在Setting / index中将调用设置控制器等。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。