博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
在mvc4中多语言建站的实例
阅读量:7137 次
发布时间:2019-06-28

本文共 4510 字,大约阅读时间需要 15 分钟。

环境:vs2012 asp.net mvc4.

实现方式:resource 资源文件,根据路由规则中Lang参数来判断载入哪种语言方式

在网上找到了相关资料,顺便自己做了个练习,新建工程之类的步骤就免了,该注意的地方说明下,记着方便下次使用。

1:添加资源文件,记得设置资源文件的访问模式为public,不然默认是Internal,外面会访问不到:

 

 2:添加路由规则,记得加在Default路由规则的前面,否则新规则没用,详细原因请参考

1 routes.Add(new Route( 2                 "{lang}/{controller}/{action}/{id}", 3 new RouteValueDictionary(new { 4 lang = "en-US",//默认为E文 5 controller = "Account", 6 action = "Logon", 7 id = UrlParameter.Optional 8 }), 9 new MultiLangRouteHandler()//这个类主要是通过GetHttpHandler来取得当前Lang的值 10 ));

 

1 public class MultiLangRouteHandler : MvcRouteHandler { 2         protected override IHttpHandler GetHttpHandler(RequestContext requestContext) { 3 string lang = requestContext.RouteData.Values["lang"].ToString(); 4 5 //Thread.CurrentThread.CurrentCulture = new CultureInfo(lang); 6 Thread.CurrentThread.CurrentUICulture = new CultureInfo(lang); 7 8 //return new MvcHandler(requestContext); 9 return base.GetHttpHandler(requestContext); 10 } 11 }

有关代码中的CurrentUICulture可以参考我文章,里面有详细解释。

 3:中英文切换入口。

1  
2 @{ 3 string controller = ViewContext.Controller.ValueProvider.GetValue("controller").RawValue.ToString(); 4 string action = ViewContext.Controller.ValueProvider.GetValue("action").RawValue.ToString(); 5 //string lang = ViewContext.Controller.ValueProvider.GetValue("lang").RawValue.ToString(); 6 } 7 @Html.ActionLink("中文", action, new { Controller = controller, lang = "zh-CN" }, new {@class="btn-a" }) 8 @Html.ActionLink("English", action, new { Controller = controller, lang = "en-US" }, new {@class="btn-a" }) 9

4:界面上普通文字的多语言

其实我有按照上面的那篇文章写测试程序,但是写死的资源文件并没有根据中英文来切换,我都不知道是不是哪里有问题,闷~,后来mvc群里面的朋友(无情水)介绍,我参照着改写了下,在此说声ths...

public static class LangHelper {        //界面普通文字的多语言        public static string GetLangbyKey(this HtmlHelper htmlhelper, string key) {            Type resourceType = (Thread.CurrentThread.CurrentUICulture.Name == "en-US") ? typeof(Resources.en_US) : typeof(Resources.zh_CN);            PropertyInfo p = resourceType.GetProperty(key);            if (p != null)                return p.GetValue(null, null).ToString();            else                return "undefined";        }        //js定义多语言弹出框        public static string LangOutJsVar(this HtmlHelper htmlhelper, string key) {            Type resourceType = (Thread.CurrentThread.CurrentUICulture.Name == "en-US") ? typeof(Resources.en_US) : typeof(Resources.zh_CN);            PropertyInfo p = resourceType.GetProperty(key);            if (p != null)                return string.Format("var {0} = '{1}'", key, p.GetValue(null, null).ToString());            else                return string.Format("var {0} = '{1}'", key, "undefined");        }    }

View页面调用直接用函数的方式。如:<h2>@Html.GetLangbyKey("LogonDisplay")</h2>

5:DisplayName 的多语言化

重新定义一LocalDisplayName属性,他继承自DisplayNameAttribute

public class LocalDisplayName : DisplayNameAttribute {        private string _defaultName = "";        public Type ResourceType {            get { return (Thread.CurrentThread.CurrentUICulture.Name == "en-US") ? typeof(Resources.en_US) : typeof(Resources.zh_CN); }        }        public string ResourceName {            get;            set;        }        public LocalDisplayName(string defaultName) {            _defaultName = defaultName;        }        public override string DisplayName {            get {                PropertyInfo p = ResourceType.GetProperty(ResourceName);                if (p != null)                    return p.GetValue(null, null).ToString();                else                    return _defaultName;            }        }    }

在Model类上就把Display属性换为LocalDisplayName

public class Account {        [Required]        [LocalDisplayName("user name", ResourceName = "UserDisplay")]        public string UserName { get; set; }        [Required]        [LocalDisplayName("password", ResourceName = "PwdDisplay")]        public string Pwd { get; set; }        [Required]        [Compare("Pwd",ErrorMessageResourceName="ConfirmPwdErrorDisplay")]        [LocalDisplayName("confirm password", ResourceName = "ConfirmPwdDisplay")]        public string ConfirmPwd { get; set; }                [Required]        [LocalDisplayName("remember", ResourceName = "RemDisplay")]        public bool Rememberme { get; set; }    }

调用方式:<div>@Html.LabelFor(m => m.UserName)</div>

 

实现效果:

 

大概这样基本的就实现了, 有个Errormessage的还没整好,有空再来写。有不对的地方大家给予指正,谢谢!

参考文档:

http://www.cnblogs.com/lionking/articles/1894277.html

如果是要写数据库的文字,应该怎么实现多语言呢?有什么好的方式,请教下。

下载链接:

 

來源:http://www.cnblogs.com/Joans/archive/2012/08/16/2640473.html

你可能感兴趣的文章
安装部署LNMP/大并发nginx优化/php性能加速 实战
查看>>
rsync 和 配置及个人理解
查看>>
决心书
查看>>
访问控制列表acl权限
查看>>
sed工具的用法
查看>>
我的设计模式--------------责任链模式
查看>>
Java——循环应用
查看>>
云计算网络基础部分案列和必备知识点
查看>>
python之Linux基础(四)
查看>>
文本处理工具之sed的用法
查看>>
HTML.CSS,JS
查看>>
三个例子 —JAVA发送http get/post请求,调用http接口、方法
查看>>
Java - 集合框架完全解析
查看>>
从linux源码看epoll
查看>>
Struts2 注解
查看>>
加强网站安全、重构公司的门户网站项目(C# VS2003)
查看>>
开发一个完整android app 需要掌握哪些知识?
查看>>
Android 九宫格
查看>>
BZOJ2440:[中山市选2011]完全平方数(莫比乌斯函数)
查看>>
有关xerosploit运行报错问题的有效解决方案
查看>>