ASP.NET MVC 多语言方案

简介:

前言:

好多年没写文章了,工作很忙,天天加班, 每天都相信不用多久就会升职加薪当上总经理出任CEO迎娶白富美,走上人生巅峰,想想还有点小激动~~~~

直到后来发生了邮箱事件,我竟然忘了给邮箱密码赋值,导致遇到“邮箱不可用。 服务器响应为: 5.7.1 Unable to relay for”的问题,网上一查后,让Boss去设置IIS里的SMTP。

结果Boss力证不用设置也可以发,还给我发了N多Demo代码,让我蛋碎一地, 最后那点小激动,就在这小事件上栽没了~~~

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


引子:

关于系统的多语言,我在之前的文章都写过不少,包括秋色园QBlog的开源博客里,也有相应的实现方案,不过随着项目环境的不同,往往实现的方案也不尽相同。

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


1:数据的多语言:

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

A:多条数据,文章数据,用一个语言字段来标识该条数据为何种语言。

B:对于其它数据,标题,公告等,用一个[#LangSplit]标识来分隔前后两种语言。

不过现在的方案有点不同,看如下图:

141019253450.jpg

看到大量的Xml字段了吧,这就是上一个项目继承而来的精华,在项目里动不了事实存在。

关于表名和字段命名方式,走的是国际范,大伙不要学。

针对Xml,需要有一小套处理方案:

数据库以Xml字段存档多语言,格式为:
< ML  V ="1.0" >
< L ="zh-cn" >中文 </ M >
< L ="en" >English </ 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"]') 
排序:用取值后的字段名进行排序


处理流程大体如下:

141025012053.jpg


2:UI多语言

2.1:MVC View的多语言流程:

141029035330.jpg

经过对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脚本的多语言流程:

141034418144.jpg


具体的实现,看下面的语法定义。


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< stringstring> 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< stringstring> GetLanguageDic( string lang)
       {
           Dictionary< stringstring> dic =  new Dictionary< stringstring>();
           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)即可。


总结:

以上的多语言方案,有特定的项目环境背景,仅供参考,讨论,借鉴,反省,请勿轻易模仿。

谢谢观赏。






     本文转自cyq1162 51CTO博客,原文链接:http://blog.51cto.com/cyq1162/1351430,如需转载请自行联系原作者





相关文章
|
4月前
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
56 7
|
4月前
|
存储 开发框架 前端开发
ASP.NET MVC 迅速集成 SignalR
ASP.NET MVC 迅速集成 SignalR
100 0
|
5月前
|
开发框架 前端开发 .NET
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
75 0
|
5月前
|
开发框架 .NET API
分享一个 ASP.NET Web Api 上传和读取 Excel的方案
分享一个 ASP.NET Web Api 上传和读取 Excel的方案
158 0
|
5月前
|
开发框架 前端开发 安全
ASP.NET MVC 如何使用 Form Authentication?
ASP.NET MVC 如何使用 Form Authentication?
|
5月前
|
开发框架 .NET
Asp.Net Core 使用X.PagedList.Mvc.Core分页 & 搜索
Asp.Net Core 使用X.PagedList.Mvc.Core分页 & 搜索
177 0
|
5月前
|
自然语言处理
.Net Core 多语言
.Net Core 多语言
42 0
|
6月前
|
人工智能 开发框架 Devops
.NET技术概览:** 本文探讨了.NET的核心特性,包括多语言支持、Common Language Runtime、丰富的类库和跨平台能力,强调其在企业级、Web、移动及游戏开发中的应用。
【7月更文挑战第4天】.NET技术概览:** 本文探讨了.NET的核心特性,包括多语言支持、Common Language Runtime、丰富的类库和跨平台能力,强调其在企业级、Web、移动及游戏开发中的应用。此外,讨论了.NET如何通过性能优化、DevOps集成、AI与ML支持以及开源策略应对未来挑战,为开发者提供强大工具,共创软件开发新篇章。
71 3
|
6月前
|
人工智能 前端开发 Devops
NET技术在现代开发中的影响力日益增强,本文聚焦其核心价值,如多语言支持、强大的Visual Studio工具、丰富的类库和跨平台能力。
【7月更文挑战第4天】**.NET技术在现代开发中的影响力日益增强,本文聚焦其核心价值,如多语言支持、强大的Visual Studio工具、丰富的类库和跨平台能力。实际应用涵盖企业系统、Web、移动和游戏开发,以及云服务。面对性能挑战、容器化、AI集成及跨平台竞争,.NET持续创新,开发者应关注技术趋势,提升技能,并参与社区,共同推进技术发展。**
56 1
|
8月前
|
开发框架 前端开发 JavaScript
JavaScript云LIS系统源码ASP.NET CORE 3.1 MVC + SQLserver + Redis医院实验室信息系统源码 医院云LIS系统源码
实验室信息系统(Laboratory Information System,缩写LIS)是一类用来处理实验室过程信息的软件,云LIS系统围绕临床,云LIS系统将与云HIS系统建立起高度的业务整合,以体现“以病人为中心”的设计理念,优化就诊流程,方便患者就医。
93 0