前言:

重重年没写文章了,工作很忙,每日加班, 天天都相信不用多短期,就会升职加薪,当上海市中华全国总工会COO,出任COO,迎娶白富美,走上人生巅峰,想想还有点小震动~~~~

直至后来发出了邮箱事件,作者照旧忘了给邮箱密码赋值,导致遭逢“邮箱不可用。 服务器响应为: 5.7.1 Unable
to relay for”的难点,网上一查后,让Boss去设置IIS里的SMTP。

结果Boss力证不用安装也得以发,还给笔者发了N多德姆o代码,让作者蛋碎一地,
最终那一点小感动,就在那小事变上栽没了~~~

好了,不多扯了,回正文吧~~~

引子:

有关系统的多语言,笔者在事先的稿子都写过许多,包涵秋色园QBlog的开源博客里,也有照应的贯彻方案,然则随着项目条件的不比,往往达成的方案也不相同。

后天就来扯扯,ASP.NET MVC下的方案。 

1:数据的多语言:

在QBlog里,数据的多语言,笔者是分成三种方案一起处理:

A:多条数据,小说多少,用三个语言字段来标识该条数据为什么种语言。

B:对于别的数据,标题,布告等,用1个[#LangSplit]标识来分隔前后三种语言。

但是今后的方案有点差异,看如下图:

 json 1

探望多量的Xml字段了吗,那正是上三个门类连续而来的精髓,在项目里动不了事实存在。

有关表名和字段命名格局,走的是范爷(Fan Bingbing),大伙不要学。 

本着Xml,要求有一小套处理方案:

数据库以Xml字段存档多语言,格式为:
<ML V=”1.0″>
  <M L=”zh-cn”>中文</M>
  <M L=”en”>English</M>
  <M L=”..”>其它语言</M>
</ML>

接下来针对那种存档,要求有对应的处理:

SQL:查询语法为:

取值:字段名.value(‘(/ML/M[@L=”zh-cn”])[1]’,’nvarchar(max)’) 
取节点:字段名.query(‘/ML/M[@L=”en”]’) 
判断:字段名.exists(‘/ML/M[@L=”zh-cn”]’) 
排序:用取值后的字段名展开排序

处理流程大体如下:

json 2

 

2:UI多语言

 2.1:MVC View的多语言流程:

 json 3

因此对MVC的源码调节和测试,发今后Control基类(自身定义)统一处理即可。

Demo代码:

        protected override void OnResultExecuted(ResultExecutedContext filterContext)
        {
            if (filterContext.Result is ViewResult)
            {
                string html = RenderViewToString(this, ((ViewResult)filterContext.Result).View);
                html = LanguageMgr.Replace(html,”zh”);
                Response.Clear();
                Response.Write(html);
            }
        }
        protected static string RenderViewToString(Controller controller, IView view)
        {
            //IView view = ViewEngines.Engines.FindView(controller.ControllerContext, viewName, masterName).View;
            using (System.IO.StringWriter writer = new System.IO.StringWriter())
            {
                ViewContext viewContext = new ViewContext(controller.ControllerContext, view, controller.ViewData, controller.TempData, writer);
                viewContext.View.Render(viewContext, writer);
                return writer.ToString();
            }
        }

一初步的想法是处理完后写回去,后来调节和测试了半天源码发现找不到写回去的,灵光一闪,发现数目在Response.OutPut流里,直接清空,输出新的Html即可。

2.2:JS脚本的多语言流程:

json 4

 

切实的完成,看下面包车型大巴语法定义。

3:UI多语言的语法方案

界面标签定义:[#对象名称-字段名#],标签内不允许带有空格。

依然直接:[#字段名#](由Controller自动取得对象名称处理)

例如:[#UserID#] 或者[#Login-UserID#]

汉语时将被替换到:登陆名,英文便是Login了。

配套的Demo实现:

 public class LanguageMgr
    {
        /// <summary>
        /// 替换多语言。
        /// </summary>
        /// <param name=”html”></param>
        /// <param name=”lang”></param>
        /// <returns></returns>
        public static string Replace(string html, string lang)
        {
            MatchCollection matchs = Regex.Matches(html, @”\[#([\S\s]*?)#\]”, RegexOptions.Compiled | RegexOptions.IgnoreCase);
            if (matchs != null && matchs.Count > 0)
            {
                List<string> keys = new List<string>(matchs.Count);//记录已合作过的

                Dictionary<string, string> dic = GetLanguageDic(lang);
                foreach (Match match in matchs)
                {
                    string text = match.Groups[0].Value;
                    string key = match.Groups[1].Value.Trim();
                    if (!keys.Contains(key))
                    {
                        keys.Add(key);
                        if (dic.ContainsKey(key))
                        {
                            html = html.Replace(text, dic[key]);
                        }
                    }
                }
                keys = null;
                matchs = null;
            }
            return html;
        }
        internal static Dictionary<string, string> GetLanguageDic(string lang)
        {
            Dictionary<string, string> dic = new Dictionary<string, string>();
            dic.Add(“aaa”, “中文”);
            dic.Add(“bbb”, “英文”);
            return dic;
        }

  

4: JavaScript 多语言定义

对此JavaScript必要在客户端调用的多语言,能够在View中展开如下定义语言json:

<script>
var lang={loginID:”[#LoginID#]”,userName:”[#UserName#]”};
<script>

 

该View会在Controller端提前会替换成相应语言的文字。

事后的引用调用alert(lang.loginID)即可。

 

总结: 

如上的多语言方案,有一定的档次条件背景,仅供参考,研究,借鉴,反省,请勿轻易模仿。

多谢观赏。

相关文章

网站地图xml地图