小清新版多语言功能实践 么么哒

创业项目中涉及到多语言切换的需求,对比了一些关于ASP.Net下多语言的解决方案一般分为以下三种方式:

1.数据库方式 - 建立相应的语言表,可以从后台配置语言数据。

2.XML方式 - 不同的语言配置不同的xml文件,比较灵活但是xml比较厚重。

3.Resources 感觉不够灵活,技术操作容易些,要是其他人搭配就比较麻烦。

以上三种方式网上有很多介绍,不做过多探讨。

我的方式是结合js文件来统一前后端语言配置,并更容易让技术和翻译进行搭配工作。

建立语言文件,可以任意添加语言文件

zh_CN.js文件内容:

var lan = {
    "Size": "大小",
    "Close": "关闭"
};

ru.js文件内容:

var lan = {
    "Size":"Размер",
    "Close":"Закрыть"
};

 前台js使用方式

<script type="text/javascript" src="/i18n/ru.js"></script> //语言文件可以根据后台参数动态切换
<script type="text/javascript">
        $(function () {
            alert(lan.Close);
        });
</script>

后台读取js文件并解析到Hashtable

 public static class Localization
    {
        /// <summary>
        /// 加载语言文件
        /// </summary>
        /// <param name="code">语言code</param>
        /// <returns></returns>
        public static Hashtable Loadi18n(string code)
        {
            if (string.IsNullOrEmpty(code))
            {
                throw new ArgumentNullException("语言代码为空...");
            }

            string filePath = HttpContext.Current.Server.MapPath("~/i18n/" + code + ".js");
            if (!File.Exists(filePath))
            {
                throw new FileNotFoundException("语言文件不存在...");
            }

            string cacheName = "cache_lan_" + code;
            Hashtable i18nHashtable = new Hashtable();

            if (HttpRuntime.Cache[cacheName] != null)
            {
                i18nHashtable = HttpRuntime.Cache[cacheName] as Hashtable;
            }
            else
            {

                string lanText = "";

                //获取文件内容
                using (StreamReader reader = new StreamReader(filePath, System.Text.Encoding.UTF8))
                {
                    lanText = reader.ReadToEnd();
                }

                //去掉干扰字符
                lanText = Regex.Replace(lanText, "[\f\n\r\t\v]", "");

                //匹配文本内容
                Regex regex = new Regex(@"\{.*\}", RegexOptions.IgnoreCase | RegexOptions.Multiline);
                Match match = regex.Match(lanText);

                i18nHashtable = JsonConvert.DeserializeObject<Hashtable>(match.Value);

                //缓存信息
                CacheDependency fileDepends = new CacheDependency(filePath);
                HttpRuntime.Cache.Insert(cacheName, i18nHashtable, fileDepends);
            }

            return i18nHashtable;
        }

        /// <summary>
        /// 获取语言值
        /// </summary>
        /// <param name="code">语言code</param>
        /// <param name="key">语言key</param>
        /// <returns></returns>
        public static string M(string code, string key)
        {
            Hashtable i18nHashtable = Loadi18n(code);

            if (i18nHashtable.ContainsKey(key))
            {
                return i18nHashtable[key].ToString();
            }

            return string.Empty;
        }

        /// <summary>
        /// 获取语言值
        /// </summary>
        /// <param name="i18nHashtable">语言集合</param>
        /// <param name="key">语言key</param>
        /// <returns></returns>
        public static string M(this Hashtable i18nHashtable, string key)
        {
            if (i18nHashtable.ContainsKey(key))
            {
                return i18nHashtable[key].ToString();
            }

            return string.Empty;
        }
    }

调用方式:

//语言部分可以根据参数自由切换
Localization.M("ru", "Size")

//如果页面中调用多次可以使用如下方式
Hashtable lan = Localization.Loadi18n("ru");
lan.M("Size")
lan.M("Close")

欢迎有多语言开发经验的进行交流。

小清新版多语言功能实践 么么哒,布布扣,bubuko.com

时间: 2024-12-23 01:56:24

小清新版多语言功能实践 么么哒的相关文章

分享《自然语言处理理论与实战》PDF及代码+唐聃+《深入浅出Python机器学习》PDF及代码+段小手+《深度学习实践:计算机视觉》PDF+缪鹏+《最优化理论与算法第2版》高清PDF+习题解答PDF+《推荐系统与深度学习》PDF及代码学习

<自然语言处理理论与实战>高清PDF,362页,带书签目录,文字可以复制:配套源代码.唐聃等著. <大数据智能互联网时代的机器学习和自然语言处理技术>PDF,293页,带书签目录,文字可以复制,彩色配图.刘知远等著.  下载: https://pan.baidu.com/s/1waP6C086-32_Lv0Du3BbNw 提取码: 1ctr <自然语言处理理论与实战>讲述自然语言处理相关学科知识和理论基础,并介绍使用这些知识的应用和工具,以及如何在实际环境中使用它们.由

微信小程序开发入门与实践

基础知识---- MINA 框架 为方便微信小程序开发,微信为小程序提供了 MINA 框架,这套框架集成了大量的原生组件以及 API.通过这套框架,我们可以方便快捷的完成相关的小程序开发工作. MINA 框架提供了自己的视图层描述语言 WXML 和 WXSS,以及基于 JavaScript 的逻辑层框架,并在视图层与逻辑层间提供了数据传输和事件系统,因此我们主要聚焦于数据与逻辑上. 响应的数据绑定 框架的核心是一个响应的数据绑定系统. 整个系统分为两块:视图层(View)和逻辑层(App Ser

微信小程序“信用卡还款”项目实践

小程序概述 11月3日晚,微信团队对外宣布,微信小程序开放公测.开发者可登陆微信公众平台申请,开发完成后可以提交审核,公测期间暂不能发布. 我们前一段时间也进行了小程序开发,现在来对之前的开发体验做一个总结. 1. 小程序是什么? 微信小程序是一种介于原生app.和web app的hybrid.通过微信进行加载,实现类似原生app的流畅.相对原生app来说,小程序更加轻量.更新实时.跨平台:相对web app来说,小程序资源离线,体验更流畅. 微信小程序的设计目标是通过尽可能简单.高效的方式让开

酷客多小程序新版发布:与微信卡券、小票打印等无缝对接

酷客多小程序商城系统更新了!酷客多小程序商城系统更新了!酷客多小程序商城系统更新了!重要的事情说3遍!这一次我们对原有版本做了全方位体验优化,从UI UE等方面对商家后台进行了体验式改善,使商家后台变得更加美观和易用.除此之外,还推出了"微信优惠券"和"小票打印"两个重要功能 ,已实现与微信卡券和小票打印机无缝对接,更便于品牌传播.具体的功能说明请见下文. 一.左侧导航菜单优化 1,调整了左侧栏目的显示顺序,显示顺序改为"店铺管理"-"

海量小文件存储与Ceph实践

海量小文件存储(简称LOSF,lots of small files)出现后,就一直是业界的难题,众多博文(如[1])对此问题进行了阐述与分析,许多互联网公司也针对自己的具体场景研发了自己的存储方案(如taobao开源的TFS,facebook自主研发的Haystack),还有一些公司在现有开源项目(如hbase,fastdfs,mfs等)基础上做针对性改造优化以满足业务存储需求: 一. 通过对若干分布式存储系统的调研.测试与使用,与其它分布式系统相比,海量小文件存储更侧重于解决两个问题: 1.

小程序数据埋点实践之曝光量

什么是数据埋点 所谓数据埋点就是应用在规定流程中 对特定行为或事件进行数据采集 .使用采集的数据做用户分析和页面分析,可以获得应用的总体使用情况,为后续优化产品和运营提供数据支撑.常见数据埋点内容包括:访问量.停留时长.曝光量.点击量.跳出率等等. 微信小程序也为我们提供了自定义分析统计,其中包括 API 上报(代码埋点),填写配置(无埋点,只需在公众后台配置).而第三方统计平台比较有名的就是阿拉丁统计,只需引入集成的 SDK,开发成本低,能够满足大部分的需求. 数据埋点需要分析页面流程,确定埋

这些年帮过我的前端框架(实用篇)

前端其实就好像建房子一样,建设的方式也是多种多样的. 例如你可以什么都不用,单靠双手去把房子砌起来.这样实在,稳健,房子的每一个角落你都知道得清楚楚楚,但是效率偏低. 你也可以使用各种工具,提交你建房子的效率.例如你可以用搅拌机,帮你和水泥.你可以不需要知道搅拌机的运行原理,你只要按它的指示按下开关,它就很快地帮你完成任务. 前端的框架,就是我们前端建房子的工具,繁多好用. 接下来我就要说一下这些年对我很有帮助的前端框架. 1.基础型框架 1.1jQuery--前端不懂jQuery,学得更多也枉

【后缀数组】

1 #include <iostream> 2 #include <cstring> 3 #include <cstddef> 4 #include <cstdio> 5 #include <string> 6 #include <algorithm> 7 const int maxn = 100001; 8 int wa[maxn],wb[maxn],wv[maxn],ws[maxn]; 9 int cmp(int *rank, i

rest_framework-序列化-总结完结篇

#rest_framework 序列化 from rest_framework import serializers #serilizers.Serializer serializers.ModelSerializer 两种序列化方式 class RolesSerializer(serializers.Serializer): id = serializers.IntegerField() title = serializers.CharField() class RolesView(APIVi