ASP.NET MVC 3 Razor 多国语言参考解决方案
2011-07-26 16:24
399 查看
3月22日整理:实用示例请参考:这里
支持多国语言基本上是一个成熟产品必须支持的功能,但是直到想用这个功能时,发现居然找不到解决方案(很吃惊,真的没有提供么?),于是在网上搜索了好久,发现两种心仪的方案:
1:ASP.NETMVC多语言解决方案
2:ASP.NETMVC-LocalizationHelpers
这两种方案都是针对WebFormViewEngine的,对于想使用Razor的我来说,修改是必然的了
先说说第二种,这个方法貌似核心是使用了HttpContext.GetLocalResourceObject()方法。但是问题在于在使用GetLocalResourceObject()方法时,需要提供一个参数virtualPath,这个参数花了好久心思没有成功,关键是上面有句代码老是会抛异常:
viewsourceprint?
总是说expression不对之类的,我猜应该是在WebFormViewEngine里面绑定表达式不能在Razor里使用的原因吧,但是我偷偷的模拟了一个WebForm式的绑定表达式,依然不能执行通过。而且官方也没有提供一个完整的示例,时间关系我也不想研究了,如果有人在Razor上试验成功了,麻烦留个言。
再来说第一种,个人感觉习惯上这个除了一样,其它的啥都好,哪一样呢,就是必须使用RexGen来编译.resx文件,使其成为.resources文件,然后再去使用。在以前使用WebPage时是没有这一步的,多一步总没有少一步来的方便,因此又打开MSDN来看看,一看发现一个类型:ResXResourceReader,从这个类型的名称上看就是一个好东西,但是在写代码时居然发现找不到该类型?再仔细一看,原来这个类型居然是定义在System.Windows.Forms命名空间中的,在Web程序中加入System.Windows.Forms.dll引用总感觉是怪怪的,但是想想都是.NET的标准类库,加起来应该也没有太大的影响,再说还不知道加进来能不能用。
于是参照第一种解决方案做出一个助手类:
viewsourceprint?
这个方案应该只能算是一个参考原型,还有很多可以改进的地方,比如方法里没有使用CultureInfo之类的东西,因为我们公司通常的方案是语言随着浏览器的语言设定来的,为了测试简单点,我只是根据Request里面的UserLanguages来确定显示何种语言,另外,每次都new一个Reader是否会对性能带来较大的影响也未经测试,不过最基本的功能有了,使用该方案,可以像在WebPage里面一样方便的使用资源文件了。
对了,差点忘了很重要的内容,如何使用该方法:
@Html.Lang("Test")
即可,"Test"为资源的Key
值的一提的是,这个LocalizationHelpers类型命名空间需为System.Web.Mvc
如果大家有更好的方案,请通知我,谢谢
修改:在示例源码中LocalizatioinHelpers第16行错误,
varfilePath=htmlhelper.ViewContext.HttpContext.Server.MapPath(viewPath.Substring(0,viewPath.Length-viewPath.LastIndexOf('/')))+"App_LocalResources";
修正如下:
示例代码
支持多国语言基本上是一个成熟产品必须支持的功能,但是直到想用这个功能时,发现居然找不到解决方案(很吃惊,真的没有提供么?),于是在网上搜索了好久,发现两种心仪的方案:
1:
2:
这两种方案都是针对WebFormViewEngine的,对于想使用Razor的我来说,修改是必然的了
先说说第二种,这个方法貌似核心是使用了HttpContext.GetLocalResourceObject()方法。但是问题在于在使用GetLocalResourceObject()方法时,需要提供一个参数virtualPath,这个参数花了好久心思没有成功,关键是上面有句代码老是会抛异常:
ResourceExpressionFieldsfields=(ResourceExpressionFields)builder.ParseExpression(expression, typeof ( string ),context); |
再来说第一种,个人感觉习惯上这个除了一样,其它的啥都好,哪一样呢,就是必须使用RexGen来编译.resx文件,使其成为.resources文件,然后再去使用。在以前使用WebPage时是没有这一步的,多一步总没有少一步来的方便,因此又打开MSDN来看看,一看发现一个类型:ResXResourceReader,从这个类型的名称上看就是一个好东西,但是在写代码时居然发现找不到该类型?再仔细一看,原来这个类型居然是定义在System.Windows.Forms命名空间中的,在Web程序中加入System.Windows.Forms.dll引用总感觉是怪怪的,但是想想都是.NET的标准类库,加起来应该也没有太大的影响,再说还不知道加进来能不能用。
于是参照第一种解决方案做出一个助手类:
public static class LocalizationHelpers |
{ |
public static string Lang( this HtmlHelperhtmlhelper, string key) |
{ |
varviewPath=(htmlhelper.ViewContext.View as BuildManagerCompiledView).ViewPath; |
varviewName=viewPath.Substring(viewPath.LastIndexOf( '/' ),viewPath.Length-viewPath.LastIndexOf( '/' )).TrimStart( '/' ); |
varfilePath=htmlhelper.ViewContext.HttpContext.Server.MapPath(viewPath.Substring(0,viewPath.LastIndexOf( '/' )+1))+ "App_LocalResources" ; |
varlangs=htmlhelper.ViewContext.HttpContext.Request.UserLanguages; |
string resxPath= string .Format( @"{0}\{1}.resx" ,filePath,viewName); |
foreach (varlang in langs) |
{ |
if (File.Exists( string .Format( @"{0}\{1}.{2}.resx" ,filePath,viewName,lang))) |
{ |
resxPath= string .Format( @"{0}\{1}.{2}.resx" ,filePath,viewName,lang); |
break ; |
} |
} |
string result= "" ; |
ResXResourceReaderreader= new ResXResourceReader(resxPath); |
varentry=reader.Cast<DictionaryEntry>().FirstOrDefault<DictionaryEntry>(x=>x.Key.ToString()==key); |
if (entry.Value!= null ) |
{ |
result=( string )entry.Value; |
} |
return result; |
} |
} |
对了,差点忘了很重要的内容,如何使用该方法:
@Html.Lang("Test")
即可,"Test"为资源的Key
值的一提的是,这个LocalizationHelpers类型命名空间需为System.Web.Mvc
如果大家有更好的方案,请通知我,谢谢
修改:在示例源码中LocalizatioinHelpers第16行错误,
varfilePath=htmlhelper.ViewContext.HttpContext.Server.MapPath(viewPath.Substring(0,viewPath.Length-viewPath.LastIndexOf('/')))+"App_LocalResources";
修正如下:
varfilePath=htmlhelper.ViewContext.HttpContext.Server.MapPath(viewPath.Substring(0,viewPath.LastIndexOf( '/' )+1))+ "App_LocalResources" ; |
相关文章推荐
- [原]ASP.NET MVC 3 Razor 多国语言参考解决方案 补充三
- [原]ASP.NET MVC 3 Razor 多国语言参考解决方案 补充四
- ASP.NET MVC 3 Razor 多国语言参考解决方案
- 原]ASP.NET MVC 3 Razor 多国语言参考解决方案 补充四
- ASP.NET MVC 3 Razor 多国语言参考解决方案
- ASP.NET MVC 3 Razor 多国语言参考解决方案 补充
- [原]ASP.NET MVC 3 Razor 多国语言参考解决方案
- ASP.NET MVC 3 Razor 多国语言参考解决方案 补充二
- ASP.NET MVC 3 Razor 多国语言参考解决方案 补充三
- [原]ASP.NET MVC 3 Razor 多国语言参考解决方案 补充
- [原]ASP.NET MVC 3 Razor 多国语言参考解决方案 补充二
- ASP.NET MVC 3 Razor 多国语言参考解决方案 补充四
- (转)Asp.net MVC 多语言问题的解决方案
- ASP.NET MVC 多语言解决方案
- 在ASP.NET MVC(Razor)中使用avalon2.x,@字符冲突的不靠谱解决方案
- ASP.NET MVC中多语言的解决方案
- ASP.NET MVC 多语言解决方案
- VS2015 ASP.NET MVC项目Razor智能提示失败的解决方案
- ASP.NET MVC 多语言解决方案
- ASP.NET Core 中文文档 第四章 MVC(3.2)Razor 语法参考