zoukankan      html  css  js  c++  java
  • ASP.NET MVC5多语言切换快速实现方案

    功能

    实现动态切换语言,Demo 做了三种语言库可以切换,包括资源文件的定义,实体对象属性设置,后台代码Controller,IAuthorizationFilter,HtmlHelper的实现,做法比较简单易学易用,配合我之前发布的# MVC Scaffolding SmartCode-Engine 更新 模板中新增了多语言资源文件的生成功能,发现我的这个框架和目前很流行的ABP框架是类似更有点像收费版的Asp.net Zero,只是我做的更加轻量级,更方便,更快速,可惜Asp.net Core 下的Scaffolding这块扩展不想MVC5那么容易.这块还需要研究,下一步就准备升级到asp.net core.

    演示

    Github download Demo

    具体实现方法

    定义实体类
    通过Display属性定义Name ResourceType,需要读取的语言库资源文件

    演示

    生成资源文件
    通过mvc scaffolding扩展工具会自动生成对应实体对象的3个资源文件默认中文,繁体,英文
    繁体需要自己翻译,英文内容根据字段名定义后已大写字母分割 DateTime 现实 Date Time

    image.png

    页面功能按钮语言资源文件库

    演示

    前后端代码实现语言切换功能

    -选择切换语言

    image.png


    Js代码

    /* multiple lang dropdown */
    $('#dropdownlang-dropdown-menu').on('click', 'a', ()=> {
      const lang = this.text;
      const flag = this.firstElementChild.className;
      const culture = this.firstElementChild.getAttribute("culture");
      $('#dropdownlang').children()[0].className = flag;
      $('#dropdownlang').children()[1].innerHTML = lang;
      localStorage.setItem('lang-text', lang);
      localStorage.setItem('lang-css', flag);
      localStorage.setItem('lang-culture', culture);
      $.get('/Account/SetCulture?lang=' + culture).then(res => {
        if (res.success) {
          location.reload();
        }
    
      });
    });
    $(()=> {
      const lang = localStorage.getItem('lang-text');
      const css = localStorage.getItem('lang-css');
      const culture = localStorage.getItem('lang-culture');
    //这段代码也多余根本没有效果 //scripttag
    = document.createElement("script"); //scripttag.type = "text/javascript"; //scripttag.src = src; //document.body.appendChild(scripttag); //$.parser.parse(); }; if (lang && css && culture) { $('#dropdownlang').children()[0].className = css; $('#dropdownlang').children()[1].innerHTML = lang; } });

    后端代码

    [HttpGet]
        public ActionResult SetCulture(string lang) {
          //这里设置CultureInfo是多余的
          switch (lang.Trim())
          {
            case "en":
              CultureInfo.CurrentCulture = new CultureInfo("en-US");
              CultureInfo.CurrentUICulture = new CultureInfo("en-US");
              break;
            case "cn":
              CultureInfo.CurrentCulture = new CultureInfo("zh-CN");
              CultureInfo.CurrentUICulture = new CultureInfo("zh-CN");
              break;
            case "tw":
              CultureInfo.CurrentCulture = new CultureInfo("zh-TW");
              CultureInfo.CurrentUICulture = new CultureInfo("zh-TW");
              break;
          }
         //这里设置CultureInfo是多余的
          var cookie = new HttpCookie("culture", lang)
          {
            Expires = DateTime.Now.AddYears(1)
          };
          Response.Cookies.Add(cookie);
          return Json(new { success = true }, JsonRequestBehavior.AllowGet);
    
        }

    CultureFilter 这是关键 这是没有使用RouteData,通过修改url来保存当前语言要改的地方很多还要修改路由规则,所以我就用Cookies来保存

    public class CultureFilter : IAuthorizationFilter
      {
        private readonly string defaultCulture;
    
        public CultureFilter()
        {
          this.defaultCulture = "cn";
        }
    
        public void OnAuthorization(AuthorizationContext filterContext)
        {
          var culture = filterContext.HttpContext.Request.Cookies["culture"];
          var lang = defaultCulture;
          if (culture != null && culture.Value != null)
          {
            lang = culture.Value;
            filterContext.HttpContext.Response.Cookies.Set(culture);
          }
          switch (lang.Trim())
          {
            case "en":
              CultureInfo.CurrentCulture = new CultureInfo("en-US");
              CultureInfo.CurrentUICulture = new CultureInfo("en-US");
              //Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");
              //Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
              break;
            case "cn":
              CultureInfo.CurrentCulture = new CultureInfo("zh-CN");
              CultureInfo.CurrentUICulture = new CultureInfo("zh-CN");
              //Thread.CurrentThread.CurrentUICulture = new CultureInfo("zh-CN");
              //Thread.CurrentThread.CurrentCulture = new CultureInfo("zh-CN");
              break;
            case "tw":
              CultureInfo.CurrentCulture = new CultureInfo("zh-TW");
              CultureInfo.CurrentUICulture = new CultureInfo("zh-TW");
              //Thread.CurrentThread.CurrentUICulture = new CultureInfo("zh-TW");
              //Thread.CurrentThread.CurrentCulture = new CultureInfo("zh-TW");
              break;
          }
        }
      }

    HtmlHelper 代码实现语言的输出

    /// <summary>
        /// 多语言切换
        /// </summary>
        /// <param name="helper"></param>
        /// <param name="name"></param>
        /// <returns></returns>
        public static HtmlString L(this HtmlHelper helper, string name) {
    
          var resource = new System.Resources.ResourceManager(typeof(WebApp.resource.Global));
          var text = resource.GetString(name);
          return new HtmlString(text ?? name);
        }
        /// <summary>
        /// 前端easyui或是其它js相关的比如提示信息也需要转换必须在这里加载不同的语言文件
        /// </summary>
        public static HtmlString LangScriptTag(this HtmlHelper helper,string defaultsrc) {
          var src = defaultsrc;
          var lang = CultureInfo.CurrentCulture.Name;
          switch (lang)
          {
            case "en-US":
              src = "/Scripts/easyui/locale/easyui-lang-en.js";
              break;
            case "zh-CN":
              src = "/Scripts/easyui/locale/easyui-lang-zh_CN.js";
              break;
            case "zh-TW":
              src = "/Scripts/easyui/locale/easyui-lang-zh_TW.js";
              break;
            default:
              src = defaultsrc;
              break;
          }
          return new HtmlString($"<script src="{ src }"></script>");
        }
    
    //html代码
    <div class="btn-group btn-group-sm">
    <button onclick="append()" class="btn btn-default"> <i class="fa fa-plus"></i> @Html.L("Add") </button>
    </div>
    <div class="btn-group btn-group-sm">
    <button onclick="removeit()" class="btn btn-default"> <i class="fa fa-trash-o"></i> @Html.L("Delete") </button>
    </div>
    <div class="btn-group btn-group-sm">
    <button onclick="accept()" class="btn btn-default"> <i class="fa fa-floppy-o"></i> @Html.L("Save") </button>
    </div>
  • 相关阅读:
    gain 基尼系数
    luogu P5826 【模板】子序列自动机 主席树 vector 二分
    牛客挑战赛39 树与异或 离线 树上莫队 树状数组 约数
    4.22 省选模拟赛 三元组 manacher 回文自动机
    4.22 省选模拟赛 最优价值 网络流 最大权闭合子图
    4.18 省选模拟赛 消息传递 树剖 倍增 线段树维护等比数列
    luogu P4008 [NOI2003]文本编辑器 splay 块状链表
    牛客挑战赛39 密码系统 后缀数组
    luogu P1526 [NOI2003]智破连环阵 搜索+最大匹配+剪枝
    luogu P4095 [HEOI2013]Eden 的新背包问题 多重背包 背包的合并
  • 原文地址:https://www.cnblogs.com/neozhu/p/10285874.html
Copyright © 2011-2022 走看看