ASP.NET MVC5多语言简单实现方案

功能

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

Github download Demo

demo1.gif

具体实现方法

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

    image.png

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

    image.png

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

    image.png

  3. 前后端代码实现语言切换功能
    -选择切换语言

    image.png

    JS代码

/* multiple lang dropdown */
$('#dropdownlang-dropdown-menu').on('click', 'a', function () {
  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();
    }

  });
});
$(function () {
  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>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 我看着她, 突然觉得她的眼睛像夜里的大海,充满未知。 “我们要做很久很久的朋友,很亲近。但不可以很亲近。”她说。 ...
    唐小茴阅读 161评论 0 0
  • 六点阳光里,总会清醒过来, 夜就刚过去,抬眼还在梦里, 咖啡与糖,体温还暖,头发还乱。 闹钟定了时就是准时准分, ...
    易安阅读 135评论 0 1
  • 这不是集装箱吗?这样随随便便垒起来是要闹哪样,不怕掉下来吗? 没错这是集装箱,但可不是随随便便垒起来的哦,这是来自...
    港漂圈阅读 1,483评论 0 2
  • 你是不是觉得自己已经很努力了?每天工作加班加点,下班后拼命看书,周末报班学习,宁愿放弃跟朋友一起吃饭看电影的邀约,...
    樱漫雪超能勇士团队阅读 193评论 0 0