asp.net mvc 多语言_ASPNET程序开发招聘

asp.net mvc 多语言_ASPNET程序开发招聘ASPNETMVC多语言方案前言:好多年没写文章了,工作很忙,天天加班,每天都相信不用多久,就会升职加薪,当上总经理,出任CEO,迎娶白富美,走上人生巅峰,想想还有点小激动~~~~直到后来发生了邮箱事件,我竟然忘了给邮箱密码赋值,导致遇到“邮箱不可用。服务器响应为:5.7.1Unabletorelayfor”的问题,网上一查后,让Boss去设置IIS里的SMTP。结果Boss力证不用…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

ASPNETMVC多语言方案

前言:

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

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

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

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

引子:

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

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

1:数据的多语言:

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

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

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

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

 asp.net mvc 多语言_ASPNET程序开发招聘

看到大量的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”]’) 

排序:用取值后的字段名进行排序

处理流程大体如下:

asp.net mvc 多语言_ASPNET程序开发招聘

 

2:UI多语言

 2.1:MVC View的多语言流程:

 asp.net mvc 多语言_ASPNET程序开发招聘

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

asp.net mvc 多语言_ASPNET程序开发招聘

 

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

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)即可。

 

总结: 

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

谢谢观赏。

转载于:https://www.cnblogs.com/xchsp/p/4286312.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/187883.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • iphone4s必装AppSync补丁教程使iOS5完全越狱[通俗易懂]

    iphone4s必装AppSync补丁教程使iOS5完全越狱[通俗易懂]iphone4s必装AppSync补丁教程使iOS5完全越狱2012-06-1719:44来源:未知一念之间我要评论大中小iPhone4等设备完美越狱终于发布,不过完美越狱完成后如果给iPhone上安装从iPhone中文网或者其他网站上下载ipa后缀格式的软件和游戏,还有一项重要的工作就是在CYIDIA上安装ipa补丁AppSync5.0+,下面就教大家怎样安装…

  • SIP入门(二):建立SIPserver

    SIP入门(二):建立SIPserver

    2021年11月15日
  • VS2012序列号,激活码,【旗舰版】

    VS2012序列号,激活码,【旗舰版】YKCW6-BPFPF-BT8C9-7DCTH-QXGWC

  • noip2014普及组初赛答案_csp提高组一等奖

    noip2014普及组初赛答案_csp提高组一等奖题目背景NOIP2011提高组DAY2试题3。题目描述风景迷人的小城Y市,拥有n个美丽的景点。由于慕名而来的游客越来越多,Y市特意安排了一辆观光公交车,为游客提供更便捷的交通服务。观光公交车在第0分钟出现在1号景点,随后依次前往2、3、4……n号景点。从第i号景点开到第i+1号景点需要Di分钟。任意时刻,公交车只能往前开,或在景点处等待。设…

  • 观察者模式observer不适用于_观察者模式是什么

    观察者模式observer不适用于_观察者模式是什么观察者模式Obeserver动机模式定义实例结构图要点总结笔记动机在软件构建过程中,我们需要为某些对象建立 一种“通知依赖关系” —-一个对象发(目标对象)的状态发生改变,所有依赖的对象(观察者对象)都将很好的得到通知。如果这样的依赖关系过于紧密。将使软件不能很好的抵御变化使用面向对象技术 可以将这种依赖关系弱化,并形成一种稳定的依赖关系。从而实现软件体系结构的松耦合。模式定义定义对象间的一种一对多(变化)的依赖关系,以便当一个对象(subject)的状态发生改变时,所有依赖于它的对象都得到通

  • 深度学习小白实现残差网络resnet18 ——pytorch「建议收藏」

    深度学习小白实现残差网络resnet18 ——pytorch「建议收藏」深度学习小白实现残差网络resnet18——pytorch利用闲暇时间写了resnet18的实现代码,可能存在错误,看官可以给与指正。pytorch中给与了resnet的实现模型,可以供小白调用,这里不赘述方法。下面所有代码的实现都是使用pytorch框架书写,采用python语言。网络上搜索到的resne18的网络结构图如下。resnet18只看图中左侧网络结构就可以。(ps:使用的是简书上一个博主的图,如有冒犯,请谅解)接下来,根据如图的网络结构进行搭建网络。通过观察网络结构,发现在网络结

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号