在mvc4中多语言建站的实例

环境: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  <div>
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     </div>

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/codehunter008/archive/2008/09/01/1281565.html

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

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

下载链接: 点击下载

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

时间: 2024-10-14 21:08:46

在mvc4中多语言建站的实例的相关文章

Nodejs电影建站开发实例(上)

网站环境:使用express框架.bootstrap样式.jade模板.mongoose数据库 npm insatll express -g npm insatll jada -g npm insatll mongoose -g 1.创建express工程:myMovie 进入工程执行npm install,npm start 后 访问很正常,可以往下继续了 2.创建路由 初拟可能浏览的入口================ 网站跟目录:localhost:3000/ 某个电影详情页:localh

友点建站系统经过几年的发展通过和客户的交流中发现很多客户现在对程序开发,程序语言这块都非常了解了,都

友点建站系统经过几年的发展通过和客户的交流中发现很多客户现在对程序开发,程序语言这块都非常了解了,都会问一下我们开发网站用的什么语言或者框架? 在此说明一下:我们YouDianCMS建站系统使用的是PHP+MySQL架构 为什么选择PHP+MySQL架构?那就得说说PHP+MySQL架构的优点了. 良好的安全性PHP天生拥有防注入功能,目前***主要来源于***工具,当前的***工具基本上都是针对asp和windows漏洞扫描,针对php和Linux的工具基本不存在.Linux一直是以稳定.高效

#前端杂谈 【Web 建站技术中,HTML、HTML5、XHTML、CSS、SQL、JavaScript、PHP、ASP.NET、Web Services 是什么?via知乎 张秋怡】

先附上链接:Web 建站技术中,HTML.HTML5.XHTML.CSS.SQL.JavaScript.PHP.ASP.NET.Web Services 是什么? 这是分享自知乎用户张秋怡的一个回答,用通俗形象的语言解释了关于前端的一些基本概念,比较适合像我这种刚入门的小白阅读.

Web 建站技术中,HTML、HTML5、XHTML、CSS、SQL、JavaScript、PHP、ASP.NET、Web Services 是什么?

建站有很多技术,如 HTML.HTML5.XHTML.CSS.SQL.JavaScript.PHP.http://ASP.NET.Web Services.浏览器脚本.服务器脚本等.它们的区别是什么?新手一点不懂,想理清所有这些技术之间的关系和应用范围. 一个学期前我也和楼主差不多不知道这些都是啥,一个学期之后差不多都弄懂了,来讲讲自己的理解吧! 大概是什么个过程:假设你在浏览器地址栏输入这个问题的地址http://www.zhihu.com/question/22689579访问过程和下图差不

黄聪:WordPress 多站点建站教程(六):使用WP_Query、switch_to_blog函数实现获取子站点分类中的文章

首先在你使用主题的funtions.php里面添加下代码: //根据时间显示最新的分类文章内容,每个站点显示一篇内容 //$blog_id 子站点ID //$catid 分类ID wp_reset_query(); switch_to_blog($blog_id); global $post;?> $my_query2 = new WP_Query('showposts=1&order=desc&orderby=date&cat='.$catid); while ($my_q

Drupal建站过程思考——不识庐山真面目,只缘身在此山中

使用drupal与没有使用drupal,在网站的设计过程上本质是一样的!所以,我们在使用drupal建一个新网站时,要时刻联想自己在没有drupal时是如何设计开发的. 不使用drupal时,我们通常按如下步骤设计开发一个网站: 1.静态页面设计.主要包括主页.二级列表页.二级内容页三类页面,制作过程一般是:PS效果图->切图->HTML/CSS/JS静态页.通常一个优秀的美工/前端工程师,可以搞定这一切,比如我们的XiaoLu童鞋. 2.静态页面整理/页面布局整理——对代码进行切块.拆分.在

【从0开始Tornado建站】0.9版本python网站代码开源--持续更新中

从5月份开始[从0开始Tornado建站]这个专栏,开始一点一点把这个分类兴趣网站弄起来,从无到有的过程也是令人兴奋的:-) 国庆的时候等待备案然后上线,现在网站域名为ustchacker.com, 欢迎加入,一起分享代码和点子,可以提问题共同进步- 现在的代码版本是0.9(我自己定的...因为还在完善中),希望能依靠开源的力量打造出一个分类兴趣网站的模板式框架!托管在GitHub上: https://github.com/littlethunder/ustchacker.com ,希望大家对p

建站过程中要避免的四大问题

无论是企业还是个人,在建站过程中都会出现各种各样的问题.如何尽量避免错误?如何做出bug更少的网站,一直都是困扰着大家的的难题.针对这个现象,上海网站建设公司的小刘就为您详细解答一下. 保持网站模板风格 毫无疑问,现在越来越多的网站是通过cms等程序模板做出来的.优势不言而喻,操作简单,便捷,易于维护等等.不过,随着时间的发展,不少人在中途会因为各种原因想要更换网站风格,主题基调.最直接的方法当然就是直接换掉模板.对站长和用户来说,这也许无伤大雅,但对搜索引擎来说却是极大的弊端.网站频繁的更换架

【从0開始Tornado建站】0.9版本号python站点代码开源--持续更新中

? ? ? ? 从5月份開始[从0開始Tornado建站]这个专栏,開始一点一点把这个分类兴趣站点弄起来,从无到有的过程也是令人兴奋的:-) 国庆的时候等待备案然后上线,如今站点域名为ustchacker.com, 欢迎增加,一起分享代码和点子,能够提问题共同进步- 如今的代码版本号是0.9(我自己定的.. .由于还在完好中),希望能依靠开源的力量打造出一个分类兴趣站点的模板式框架! 托管在GitHub上:?https://github.com/littlethunder/ustchacker.