首页 > 编程语言 > ASP.NET MVC5多语言切换快速实现方案

ASP.NET MVC5多语言切换快速实现方案

时间:2023-09-16 20:15:21浏览次数:42  
标签:lang MVC5 ASP zh CultureInfo break culture new NET

实现动态切换语言,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>
复制代码

 

标签:lang,MVC5,ASP,zh,CultureInfo,break,culture,new,NET
From: https://www.cnblogs.com/stry/p/17707216.html

相关文章

  • NetCore 国际化最佳实践
    NetCore国际化最佳实践ASP.NETCore中提供了一些本地化服务和中间件,可将网站本地化为不同的语言文化。ASP.NETCore中我们可以使用Microsoft.AspNetCore.Localization库来实现本地化。但是默认只支持使用资源文件方式做多语言存储,很难在实际场景中使用。有没有可能支持官方资源......
  • 使用Jenkins自动部署.NET站点
    Jenkins安装:参考文章【Jenkins安装】部署.NET站点1、新建项目1,1、Dashboard页面菜单>点击新建Item>输入名称"TestWebServiceDeploy",并且选择【Freestyleproject】风格  2、配置 2.1、描述和日志确定后可以配置要自动化发布的项目。首先可以填写描述,描述可以根......
  • Net6+Consul的简单使用
    先下载Consul打开cmdconsul.exeagent-dev运行可以在环境变量PATH下添加当前Consul.exe路径全局使用下面试启动ok界面,然后通过localhost:8500看到界面了 然后创建两个api程序,添加如下代码,[HttpGet("start")]publicvoidStart(){......
  • 《安富莱嵌入式周报》第308期:开源带软硬件安全认证的PLC设计,开源功率计,可靠PID实现,PR2
     视频版:https://www.bilibili.com/video/BV1F24y157QE1、ST发布安全认证版PLC设计套件https://www.st.com/en/evaluation-tools/steval-silplc01.html含原理图(新的手册里面把原理图撤掉了):steval-silplc01+(2).pdf(502.71KB)硬件方面的安全认证正进行中,满足SIL2等级。随机故障......
  • .net native aot dll 库函数导出和调用
    .net程序aot后,就是原生程序了,如果是aot的dll,是可以导出为等价于c语言的native的dll的。导出函数声明如下:[UnmanagedCallersOnly(EntryPoint="OutPut")]publicstaticintOutPut(){return1;}导出后,可以作为原生的dll调用了,在.net程序中,也可以通过pinvoke的方式调......
  • 【Kubernets】K8s群集安装部署详细教程-(3)安装过程中的错误解决
    k8s常用命令集合k8s常用命令集合:#查看当前集群的所有的节点kubectlgetnode#显示Node的详细信息(一般用不着)kubectldescribenodenode1#查看所有的podkubectlgetpod--all-namespaces#查看pod的详细信息kubectlgetpods-owide--all-namespaces#查看所有创......
  • VB.net报错未在本地计算机上注册“icrosoft.ACE.OLEDB.12.0”提供程序
    1、问题:通过EXCEL上传数据报错:未在本地计算机上注册“icrosoft.ACE.OLEDB.12.0”提供程序原因是电脑office版本和VB.net程序选择的运行有关系处理:先查看office是X86还是64位如果是64位,在VB.NET中更改编译CPU选择X64 方法2:如果是X86,把office重新安装32位版本注意:安装office......
  • Kubernetes部署MySQL5.7单机---NFS存储
    实验目的:将MySQL5.7使用nfs持久化存储部署到Kubernetes集群中复制nfs存储地址:nfs.myit.icu复制nfs存储配置:临时测试---100G安装nfsyuminstall-ynfs-utilsrpcbind创建nfs存储目录[root@nfs~]#mkdir/data/nfsData-p格式化磁盘[root@nfs~]#mkfs.ext4/dev......
  • Kubernetes日志查看工具
    K8SFilebeat+ElasticSearch+Kibana虽然该组合可以满足我们对于服务监控的要求,但是如果只是部署一个内部单服务用的话,未免显得大材小用,而且部署服务还会带来大量的资源消耗。那么有没有简单查看 K8S 中多个 Pod 中的日志工具呢?咳咳咳,那么今天就介绍两款超好用的多容器实时......
  • .NET 8 RC1
    .NET8发布了首个RC。据称RC阶段会发布两个版本,正式版将于 2023年11月14日至16日在.NETConf2023上推出。.NET8是长期支持(LTS)版本,将会获得3年技术支持。公告写道,此版本为Android和WASM引入了全新的AOT模式、改进System.Text.Json,以及为容器添加Az......