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

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

  1. joomla多语言建站之默认前台语言设置

    joomla多语言建站后,如果想设置其中一种语言为默认前台语言,即: 从后台点击“Site Name”跳转时: 访问域名时: 页面自动切换至某一种语言,可以在后台通过“语言管理”模块来实现,将“网站前 ...

  2. [转]ASP.NET MVC4中@model使用多个类型实例的方法

    本文转自:http://blog.csdn.net/hulihui/article/details/48199897 有时需要在ASP.NET MVC4的视图的@model中使用多个类型的实例,.NE ...

  3. Nodejs电影建站开发实例(下)

    作为一个真正的网站,不能没有数据的支持,下面使用的数据库为mongodb,电影可能有的数据:电影名称.导演.国家.语言.上映时间.图片.简介.视频 4.使用路由 app.js var express ...

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

    网站环境:使用express框架.bootstrap样式.jade模板.mongoose数据库 npm insatll express -g npm insatll jada -g npm insat ...

  5. mvc4中使用部分视图局部刷新实例

    如上效果图,网页中有主视图(上)和部分视图(下),点击提交会把文本框中的值发送到服务器,再返回所有添加的信息,在下方局部更新(只更新部分视图),实现如下: 1.网页主视图代码: @model MvcA ...

  6. ASP.NET MVC4中@model使用多个类型实例的方法

    转http://blog.csdn.net/hulihui/article/details/48199897

  7. (转) 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.XHT ...

  8. 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.X ...

  9. 如何在一个项目中同时包含mvc建站、webapi接口

    项目做得多了..就会发现有些小项目不想建太多的项目..现在思明在这里和大家分享一下如果再一个项目中同时包含mvc建站以及实现webapi接口 1.新建项目 aps.net web 应用程序 2 新建模 ...

随机推荐

  1. 私有IP地址共有三个范围段

    在现在的网络中,IP地址分为公网IP和私有IP地址.公网IP是在Internet使用的IP地址,而私有IP地址是在局域网中使用的IP地址. 由于我们目前使用的IP V4协议的限制,现在IP地址的数量是 ...

  2. drupal8 管理入门

    https://www.drupal.org/node/1896670 本节将介绍新的Drupal8用户,网站管理.它涵盖了使用管理员帐户,并提供从哪里开始的建议. 了解管理员帐户 在安装过程结束时, ...

  3. jQuery(二):jQuery选择器

    jQuery选择器类似于CSS选择器,用来选取网页中的元素.例如: $("h3").css("background-color","red" ...

  4. windows 中 到底是用的哪个java.exe??? 删除了PATH变量的Java设置还是可以运行java.exe windows/system32

    到底是用的哪个java.exe??? 删除了PATH变量的Java设置还是可以运行java.exe JavaWindowsCC++C#  当电脑里面有多个jdk或是jre时,在cmd里面到底是用的哪个 ...

  5. PHP 共享内存使用与信号控制

    共享内存 共享内存的使用主要是为了能够在同一台机器不同的进程中共享一些数据,比如在多个 php-fpm 进程中共享当前进程的使用情况.这种通信也称为进程间通信(Inter-Process Commun ...

  6. C++ StringBuilder类

    #ifndef __GTL_STRINGBUILDER_H_ #define __GTL_STRINGBUILDER_H_ #include <list> #include <str ...

  7. java中String new和直接赋值的区别

        Java中String new和直接赋值的区别     对于字符串:其对象的引用都是存储在栈中的,如果是编译期已经创建好(直接用双引号定义的)的就存储在常量池中,如果是运行期(new出来的)才 ...

  8. c 变量的存储类型auto等(基础知识)和c函数变量

    总结 1).在c语言中每一个变量和函数有两个属性:数据类型和数据的存储类别. 2). 对数据型(如整型.字符型等).存储类别指的是数据在内存中存储的方式. 存储方式分为两大类: 静态存储类和动态存储类 ...

  9. 【WPF】创建文本字符串的路径PathGeometry

    /// <summary> /// 创建文本路径 /// </summary> /// <param name="word">文本字符串< ...

  10. 第三百七十节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现搜索结果分页

    第三百七十节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现搜索结果分页 逻辑处理函数 计算搜索耗时 在开始搜索前:start_time ...