专栏首页ASP.NET MVC5 后台权限管理系统ASP.NET MVC5+EF6+EasyUI 后台管理系统(30)-本地化(多语言)

ASP.NET MVC5+EF6+EasyUI 后台管理系统(30)-本地化(多语言)

我们的系统有时要扩展到其他国家,或者地区,需要更多的语言环境,微软提供了一些解决方案,原始我们是用js来控制的,现在不需要了。

我们只要创建简单的资源文件,通过MVC的路由设置就可以轻松的进行语言中的切换。

本节受益于:Asp.net MVC3 高级编程第121页。大家可以自行百度这本书,这应该是国内第一本中文版的MVC3.0教程

现在从项目入手吧(本节也适合其他MVC程序),新建一个语言项目来放资源文件。

一、新建App.Lang,同时新建BaseRes.resx和BaseRes.en.resx或者其他国语言

分别是中文,英文。并引用System.Web类库i

二、处理通讯,配置App.Admin web.config,让这个类生效

在App.Admin中的Core文件夹添加CultureAwareHttpModule文件并继承IHttpModule

using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Web;
using System.Web.Routing;

namespace App.Admin
{
    public class CultureAwareHttpModule : IHttpModule
    {
        private CultureInfo currentCulture;
        private CultureInfo currentUICulture;

        public void Dispose() { }
        public void Init(HttpApplication context)
        {
            context.BeginRequest += SetCurrentCulture;
            context.EndRequest += RecoverCulture;
        }
        private void SetCurrentCulture(object sender, EventArgs args)
        {
            currentCulture = Thread.CurrentThread.CurrentCulture;
            currentUICulture = Thread.CurrentThread.CurrentUICulture;
            HttpContextBase contextWrapper = new HttpContextWrapper(HttpContext.Current);
            RouteData routeData = RouteTable.Routes.GetRouteData(contextWrapper);
            if (routeData == null)
            {
                return;
            }
            object culture;
            if (routeData.Values.TryGetValue("lang", out culture))
            {
                try
                {
                    Thread.CurrentThread.CurrentCulture = new CultureInfo(culture.ToString());
                    Thread.CurrentThread.CurrentUICulture = new CultureInfo(culture.ToString());
                }
                catch
                { }
            }
        }
        private void RecoverCulture(object sender, EventArgs args)
        {
            Thread.CurrentThread.CurrentCulture = currentCulture;
            Thread.CurrentThread.CurrentUICulture = currentUICulture;
        }
    }
}

这里必须做个声明:下面2段第一段支持MVC3,第二段支持MVC4

-----------------------MVC3.0

<system.web>

<httpModules> <add name="CultureAwareHttpModule" type=" App.Admin.CultureAwareHttpModule,App.Admin"/> </httpModules> </system.web>

-----------------------MVC4.0 (VS2012 版本配置以下, VS2010的MVC4版本配置同MVC3.0)

<system.webServer> <modules> <add name="CultureAwareHttpModule" type="App.Admin.CultureAwareHttpModule,App.Admin"/> </modules>

</system.webServer>

红色部分在system.web节点内,type包含的是命名空间

三、注册路由

打开RouteConfig.cs,注册为

   public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                "Globalization", // 路由名称
                "{lang}/{controller}/{action}/{id}", // 带有参数的 URL
                new { lang = "zh", controller = "Home", action = "Index", id = UrlParameter.Optional }, // 参数默认值
                new { lang = "^[a-zA-Z]{2}(-[a-zA-Z]{2})?$" }    //参数约束
            );

            routes.MapRoute(
                "Default", // 路由名称
                "{controller}/{action}/{id}", // 带有参数的 URL
                new { controller = "Home", action = "Index", id = UrlParameter.Optional } // 参数默认值
            );

        }

路由执行有先后大家都懂的。可以看出最后我们的访问会是这样的

http://localhost:1201/(http://localhost:1201/zh),http://localhost:1201/等

四、将要本地化的项目引用App.Lang

回到Resx文件,打开Resx设置代码为的访问修饰符为public,并添加如下属性,可以看出是键值对应

这里我们以SysSample的index视图为例,回到index上修改如下代码

先引入@using App.Lang;然后修改以下代码

<div class="mvctool">
    <input id="txtQuery" type="text" class="searchText" />
    @Html.ToolButton("btnQuery", "icon-search",BaseRes.Query, perm, "Query", true)
    @Html.ToolButton("btnCreate", "icon-add", BaseRes.Create, perm, "Create", true)
    @Html.ToolButton("btnEdit", "icon-edit", BaseRes.Edit, perm, "Edit", true)
    @Html.ToolButton("btnDetails", "icon-details", BaseRes.Details, perm, "Details", true)
    @Html.ToolButton("btnDelete", "icon-remove", BaseRes.Delete, perm, "Delete", true)
    @Html.ToolButton("btnExport", "icon-export", BaseRes.Export, perm, "Export", true)
</div>

其中的BaseRes.Query就是国际化属性了

预览一下例子(请注意我的URL地址变化)

 现在你可以本地化您的项目了。最后一个声明,如果你要获取当然选中的是什么语言你必须在页面引用

 CultureInfo info = Thread.CurrentThread.CurrentCulture;

通过info.Name可以获取到URL上选择的zh或en

例: 

src='/@info.Name/SysSample/Create'

结果

src='/en/SysSample/Create'

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • ASP.NET MVC5+EF6+EasyUI 后台管理系统(63)-WebApi与Unity注入

    前言: 有时候我们系统需要开放数据给手机App端或其他移动设备,不得不说Asp.net WebApi是目前首选 本节记录Asp.net MVC WebApi怎么...

    用户1149182
  • ASP.NET MVC5+EF6+EasyUI 后台管理系统(62)-EF链接串加密

    前言:   这一节提供一个简单的功能,这个功能看似简单,找了一下没找到EF链接数据库串的加密帮助文档,只能自己写了,这样也更加符合自己的加密要求 有时候我们发...

    用户1149182
  • 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(11)-系统日志和异常的处理①

    系统需要越来越自动化,我们需要引入日志记录和异常捕获 管理员的操作记录需要被记录,看出哪些模块是频繁操作,分析哪些是不必要的功能,哪些是需要被优化的。 系统的异...

    用户1149182
  • PostgreSQL MySQL 行版本管理 PK SQL SERVER timestamp 行版本管理

    事情的发生时这样的,在很久很久以前,SQL SERVER 有一个字段类型叫timestamp, 对比其他数据库都没有的 row version 自动化管理的东西...

    AustinDatabases
  • 使用Faster R-CNN、ResNet诊断皮肤病,深度学习再次超越人类专家

    选自IEEE 作者:Jeremy Hsu 机器之心编译 由于在特征识别任务上具有优势,医疗图像诊断一直是人工智能技术应用的重要方向。近日,韩国研究人员应用深度学...

    朱晓霞
  • 使用Faster R-CNN、ResNet诊断皮肤病,深度学习再次超越人类专家

    选自IEEE 作者:Jeremy Hsu 机器之心编译 由于在特征识别任务上具有优势,医疗图像诊断一直是人工智能技术应用的重要方向。近日,韩国研究人员应用深度学...

    机器之心
  • 【Rust日报】2019-09-05:hyper 0.13 alpha 版本发布,支持 async/await

    hyper 0.13 alpha 版本发布,它是一个使用 Rust 编写的成熟 HTTP 库,并且是速度最快的 HTTP 库之一,同时因其正确性得到了许多人的认...

    MikeLoveRust
  • 前端面试题(HTML和CSS)

    我会推出前端面试题的专栏,每一期我会推出10个经典面试题,面试题一部分由小伙伴提供,一部分从面试真题中选出,最后会来一个大汇总。主要目的是帮助那些还没有前端开...

    用户1093975
  • SAP不同的产品是如何支持用户创建自定义字段的

    我们从SAP CRM,Cloud for Customer(简称C4C)和S/4HANA这三个产品分别来看看。

    Jerry Wang
  • Web安全之BurpSuite抓取HTTPS请求

    https://portswigger.net/burp/help/proxy_options_installingCAcert.html

    Jetpropelledsnake21

扫码关注云+社区

领取腾讯云代金券