首先,新建一个空的MVC项目,增加一个名叫Language的文件夹用于存放资源文件,如下图所示:
在Language文件夹中,增加两个资源文件,分别用于存储中文和英文,如下图所示:
如何添加资源文件?右击Home文件夹,先选择“添加” ,再选择“类”,如下图所示:
然后找到资源文件一栏,点击选择即可,如下图所示:
编辑资源文件,输入对应对应字段对照表,在“访问修饰符”一栏,选择“public”,不然无法在其他地方引用资源文件,如下图所示:
在前端页面增加语言选择功能,并将需要多语言切换的字段用资源文件替换,HTML代码如下:
<div class="navbar-collapse collapse"><ul class="nav navbar-nav"><li>@Html.ActionLink(Language.index, "Index", "Home")</li>@*替换Index*@<li>@Html.ActionLink(Language.about, "About", "Home")</li>@*替换About*@<li>@Html.ActionLink(Language.contact, "Contact", "Home")</li>@*替换Contact*@</ul><ul class="nav navbar-nav navbar-right"><li class="dropdown"><a data-toggle="dropdown" class="dropdown-toggle" href="#"><i class="fa fa-globe fa-lg fa-fw"></i><span>简体中文</span><b class="caret"></b></a><ul role="menu" class="dropdown-menu language-list" style="width:100px;"><li><a href="#" lang="zh-CN">简体中文</a></li><li class="divider"></li><li><a href="#" lang="en">English</a></li></ul></li></ul>
</div>
当用户切换时,触发Action,JS代码如下:
<script type="text/javascript">$(document).ready(function () {//切换语言时设置MVC语言环境、设置语言全局变量$(".language-list a").click(function () {alert("hello")setLanguage($(this).attr("lang"));})function setLanguage(language) {$.ajax({url: "/Home/setGlobalLanguage?lan=" + language,type: "GET",cache: false,success: function () {location.reload();}})}})
</script>
触发Action后将语言设置存入session,Control中的代码如下:
public class HomeController : Controller{public void setGlobalLanguage(){string language = Request.QueryString["lan"];HttpContext.Session["language_id"] = language;}}
增加过滤器,用于检测和切换多语言的设置,代码如下:
public class LocalizationAttribute: ActionFilterAttribute{public override void OnActionExecuting(ActionExecutingContext filterContext){string browserLanguage = filterContext.HttpContext.Request.Headers["Accept-Language"].Split(',')[0];if (browserLanguage.ToLower().Contains("en")){browserLanguage = "en";}else if (browserLanguage.ToLower().Contains("cn")){browserLanguage = "zh-CN";}else{browserLanguage = "zh-CN";}string sessionLanguage = filterContext.HttpContext.Session["language_id"] != null ? filterContext.HttpContext.Session["language_id"].ToString() : string.Empty;//如果浏览器语言与session中语言不一致,以session语言为基准,设置语言环境if (browserLanguage != sessionLanguage){string language = string.Empty;//第一次访问,session中无语言全局变量时,用览器语言设置语言环境if (filterContext.HttpContext.Session["language_id"] == null){language = browserLanguage;filterContext.HttpContext.Session["language_id"] = browserLanguage;}//session中有语言全局变量时,用session中语言全局变量设置语言环境else{language = filterContext.HttpContext.Session["language_id"].ToString();}//当前线程的语言采用哪种语言(比如zh,en等)Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(language);//决定各种数据类型是何组织,如数字与日期Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.CreateSpecificCulture(language);}}}
最后一步,在App_Start的FilterConfig文件中注册此过滤器,如下图所示:
运行程序,默认是中文设置,如下图所示:
点击选择英文,查看是否切换语言成功:
至此为止,一个简单的多语言开发就好了,我还是菜鸟,如果有更好的方法或者建议,请赐教 。