现在ASPNET MVC 已经出了第四版了现在多了很多特性但是如何在 ASPNET MVC 下方便的实现多语言特性呢?
就一个网站的多语言特性来说我认为分为两个方面
HTML界面上显示的文字需要多语言
HTML界面上JS输出的文字需要多语言
原来在HTML部分直接写的文字都不能直接写要输出的文字而是要采用标记的方法来替换JS也是同理
那么在MVC下怎么能透明的实现多语言呢?所谓透明的实现是指程序员在开发程序当中不需要过多的考虑多语言的问题直接调用一个方法就能实现多语言而且所要用到的语言文件每个语言一个文件就够了集中翻译这个语言就完成了多语言的功能
例如
<html>
<head>
</head>
<body>
多语言输出的文字 //这里就不能直接写中文了一个好方法是 直接用 <%= HtmlLang(string) %> 来进行输出
</body>
</html>
这里<%= HtmlLang(clickme) %> 是对 HTMLHelper 进行了扩展增加了一个 Lang 的方法参数是需要翻译的资源字符串的Name
怎么为 HTMLHelper 进行扩展?下面这个类就是增加了的扩展类
Code
using System;
using SystemData;
using SystemConfiguration;
using SystemLinq;
using SystemWeb;
using SystemWebSecurity;
using SystemWebUI;
using SystemWebUIHtmlControls;
using SystemWebUIWebControls;
using SystemWebUIWebControlsWebParts;
using SystemXmlLinq;
using SystemGlobalization;
using SystemWebCompilation;
using SystemWebMvc;
using SystemWebRouting;
namespace SystemWebMvc {
public static class LocalizationHelpers {
/// <summary>
/// 在外边的 Html 中直接使用
/// </summary>
/// <param name=htmlhelper></param>
/// <param name=key></param>
/// <returns></returns>
public static string Lang(this HtmlHelper htmlhelper string key) {
string FilePath = htmlhelperViewContextHttpContextServerMapPath(/) + Resource\\;
return GetLangString(htmlhelperViewContextHttpContext key FilePath);
}
/// <summary>
/// 在外边的 Html 中直接使用对 JS 进行输出字符串
/// </summary>
/// <param name=htmlhelper></param>
/// <param name=key></param>
/// <returns></returns>
public static string LangOutJsVar(this HtmlHelper htmlhelper string key) {
string FilePath = htmlhelperViewContextHttpContextServerMapPath(/) + Resource\\;
string langstr = GetLangString(htmlhelperViewContextHttpContext key FilePath);
return stringFormat(var {} = {} keylangstr);
}
/// <summary>
/// 在 C# 中使用
/// </summary>
/// <param name=httpContext></param>
/// <param name=key></param>
/// <returns></returns>
public static string InnerLang(HttpContextBase httpContext string key) {
string FilePath = (/) + Resource\\;
return GetLangString(httpContext key FilePath);
}
private static string GetLangString(HttpContextBase httpContext string key string FilePath) {
LangType langtype = ;
if ([Lang] != null) {
langtype = (LangType)[Lang];
}
return LangResourceFileProviderGetLangString(key langtype FilePath);
}
}
public static class LangResourceFileProvider {
public static string GetLangString(string Key LangType langtype string FilePath) {
string filename;
switch (langtype) {
case : filename = zhcnresources; break;
case LangTypeen: filename = enusresources; break;
default: filename = zhcnresources; break;
}
SystemResourcesResourceReader reader = new SystemResourcesResourceReader(FilePath + filename);
string resourcetype;
byte[] resourcedata;
string result = stringEmpty;
try {
readerGetResourceData(Key out resourcetype out resourcedata);
//去掉第一个字节无用
byte[] arr = new byte[resourcedataLength ];
for (int i = ; i < arrLength; i++) {
arr[i] = resourcedata[i + ];
}
result = SystemTextEncodingUTFGetString(arr);
}
catch (Exception ex) {
}
finally {
readerClose();
}
return result;
}
}
public enum LangType {
cn
en
}
}
这个类叫 LocalizationHelpers 公开了 LangLangOutJsVarInnerLang 三个方法其中 LangLangOutJsVar 可以在 Html 界面中直接调用InnerLang 可以在C#后台使用
这里使用了 resx 资源文件注意这里这个文件需要被编译后才能使用否则找不到已经增加的项编译这个可以使用NET 自带的 ResGenexe
上面这个类很简单就是根据传入的 Session[Lang] 中的语言类型来做判断该读那个资源文件(资源文件必须在 Resource 目录下)然后读取所需要的NAME返回对应的字符串VALUEVALUE中就是最后要输出的文字了
在前台的 aspx 中就可以直接用 <%= HtmlLang(String) %>来输出了至于JS的输出看下面例子
<script language=javascript type=text/javascript>
<%= HtmlLangOutJsVar(msg)%>
function show()
{
alert(msg);
}
</script>
这样就OK了
如果有的需要在C#中取资源字符串那么可以使用
ViewData[Message] = LocalizationHelpersInnerLang(thisControllerContextHttpContext Welcome);来输出
我根据ASPNET MVC 做了个DEMO截图如下