C# 适用于前后端的多语言架构二

之前做了一个多语言架构一,就是根据业务需要,自己去弄的一个架构,但是实现方式其实比较生硬,今天在这就是根据微软的一些好的api从新把之前的框架优化一下。

优化修改内容如下:

1、资源文件的添加(资源文件的名称添加一个语言类别的扩展名)

Language的资源文件,存储中文字符,Language.en-US存储英文,这里的".en-US"就是扩展名,如果在需要添加其它的语言资源文件可以以相同格式添加。这一点很重要

2、添加一个特性,用于检测用户的语言设置,来设置资源文件的语言类型

public class LocalizationAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            //获取客户端语言
            string CLstr = filterContext.HttpContext.Request.UserLanguages[0];
            //查询是否存在客户端语言缓存
            if (filterContext.HttpContext.Request.Cookies["CurLanguageType"] != null) {
                CLstr = filterContext.HttpContext.Request.Cookies["CurLanguageType"].Value;
                HttpCookie _cookie = new HttpCookie("CurLanguageType", CLstr);
                _cookie.Expires = DateTime.Now.AddYears(1);
                filterContext.HttpContext.Response.SetCookie(_cookie);
            }
            Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(CLstr);
        }
    }

这里先判断客户端语言,然后在判断用户是否有设置语言缓存,如果有把缓存添加到用户客户端,同时设置当前线程的语言特征

3、后台数据的使用

[Localization]
    public class HomeController : Controller
    {
        // GET: Home
        public ActionResult Index()
        {
            string test1 = Resours.Language.Test1;
            //Stopwatch watch = new Stopwatch();
            //watch.Start();
            //for (int i = 0; i < 1000000; i++) {
            //    test1 = Resours.Language.Test1;
            //}
            //watch.Stop();
            //string time = watch.ElapsedMilliseconds.ToString();
            return View();
        }
    }

这里直接使用使用Language资源文件,因为这里的Home控制器添加了特性,在执行Home控制器下面的方法都会先执行localization特性,而在此特性中设置了对当前线程的语言资源特性进行了设置。而在语言资源类型中,获取属性数据,都是使用ResourceManager来获取,而ResourceManager会通过判断当前线程特性来从对应的资源文件中找到数据

 public static string Test1 {
            get {
                return ResourceManager.GetString("Test1", resourceCulture);
            }
        }

所以在这里,如果我们想要Resours.Language.Test1显示未中文,只需要把CurrentUICulture设置为“zh-CN”,为英文则是“en-US”

4、前端显示方式不变


@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Index</title>
</head>
<body>
    <div id="Content">
        <span>语言切换:</span>
        <select id="Language_change">
            <option value="zh-CN">中文</option>
            <option value="en-US">英文</option>
        </select>
        <br />
        <p id="p_Test"></p>
        <p>@Multi_L_Two.Resours.Language.Test1</p>
    </div>

    <!--全局js-->
    <script src="~/scripts/jquery-2.1.3-min.js"></script>
    <script src="~/scripts/utils.js"></script>
    <!--语言-->
    <script type="text/javascript" src="@Url.Action("Language","Common")"></script>

    <script>
        $(document).ready(function () {
            loadInit();
            $("#p_Test").text(Base.Language["Test1"]);
        });

        function loadInit() {
            //设置当前语言版本
            var cltFlag = $.utilfn.checkCookie("CurLanguageType");
            if (cltFlag) {
                //存在
                var getclt = $.utilfn.getCookie("CurLanguageType");
                $("#Language_change").find("option[value='" + getclt + "']").attr("selected", true);
            }
        }

        //语言切换
        $("#Language_change").change(function () {
            var value = $(this).find("option:selected").attr("value");
            console.log(value);
            $.utilfn.setCookie("CurLanguageType", value);
            setTimeout(function () {
                window.location.reload();
            }, 300);
        });
    </script>
</body>
</html>

在这里和之前不同的是,我直接在前台执行了后台代码,这个是razor带给我们的便利。

和多语言架构一相比,无论是获取资源内容的速度和方便上都有很大的提高。后期如果有了更好的方法我会在继续分享给大家。同时这个多语言架构也是我一次搭建,有不足欢迎大家留言指正,沟通讨论才会有进步。后面我会把代码上传上来,大家可以下载查看源代码。

最后在推荐一下资源文件管理工具"ResX Manager",直接在微软官方工具可以找到,可以在工具页面添加不同语言的文字,不需要页面切来切去,而且提供外部翻译,很方便很实用

地址:https://marketplace.visualstudio.com/items?itemName=TomEnglert.ResXManager#overview

多语言架构Demo

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

勿芮介

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值