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>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM