要实现网站的多语言,最关键的就是所有与用户界面有关的东西都要从动态地读取.实现的技术不难,但却有很多细节要考虑,比如英文比较长,中文比较短的显示问题.这些先不谈,这里介绍一下实现方法,虽然实在没什么技术含量.
首先建立四个资源文件,ERR_EN_US.resx(英文的用户交互),ERR_ZH_CN.resx(中文的用户交互),UI_EN_US.resx(英文的界面显示),UI_ZH_CN.resx(中文的界面显示)内容自己填,但是ERR_EN_US.resx,ERR_ZH_CN.resx这两个文件要有相同的KEY,例子中写了一个ERROR_DB。UI_EN_US.resx,UI_ZH_CN.resx这两个文件要有相同的KEY,例子中写了一个BUTTON_SHOWMSG。
然后新建一个类WebHelper,继承于Page,用于让所有的页面都继承于这个类,这样的好处就是方便调用.里面定义了两个ResourceManager,一个是关于界面显示的,另一个用于与用户交互的一些信息.
public static ResourceManager RMUI;
public static ResourceManager RMERR;
public static ResourceManager RMERR;
这两个变量在程序首次运行时就要赋值,所以在Global.asax中写Application_Start方法为其赋值
protected void Application_Start(object sender, EventArgs e)
{
string lang = ConfigurationManager.AppSettings["lang"];
switch (lang.ToUpper())
{
case "ZH_CN":
WebHelper.RMUI = new ResourceManager(typeof(UI_ZH_CN));
WebHelper.RMERR = new ResourceManager(typeof(ERR_ZH_CN));
break;
case "EN_US":
WebHelper.RMUI = new ResourceManager(typeof(UI_EN_US));
WebHelper.RMERR = new ResourceManager(typeof(ERR_EN_US));
break;
default:
break;
}
}
{
string lang = ConfigurationManager.AppSettings["lang"];
switch (lang.ToUpper())
{
case "ZH_CN":
WebHelper.RMUI = new ResourceManager(typeof(UI_ZH_CN));
WebHelper.RMERR = new ResourceManager(typeof(ERR_ZH_CN));
break;
case "EN_US":
WebHelper.RMUI = new ResourceManager(typeof(UI_EN_US));
WebHelper.RMERR = new ResourceManager(typeof(ERR_EN_US));
break;
default:
break;
}
}
我们希望根据Web.config的Appsetting设置语言.所以在Web.config中新增一个设置
<appSettings>
<!--切换语言,可以使用"ZH_CN"或"EN_US"-->
<add key="lang" value="EN_US"/>
</appSettings>
<!--切换语言,可以使用"ZH_CN"或"EN_US"-->
<add key="lang" value="EN_US"/>
</appSettings>
然后把这两个资源写成枚举,方便调用.另一个好处就是,在重命名的时候,可以利用VS的重命名功能,非常地方便.这里只定义了一项.
public enum UILang
{
BUTTON_SHOWMSG
}
public enum ERRLang
{
ERROR_DB
}
{
BUTTON_SHOWMSG
}
public enum ERRLang
{
ERROR_DB
}
下面是用于页面中调用的两个方法:
public string GetUI(UILang uiLang)
{
return RMUI.GetString(uiLang.ToString());
}
public string GetERR(ERRLang errLang)
{
return RMERR.GetString(errLang.ToString());
}
{
return RMUI.GetString(uiLang.ToString());
}
public string GetERR(ERRLang errLang)
{
return RMERR.GetString(errLang.ToString());
}
其它页面继承于WebHelper,直接调用GetERR和GetUI即可.
protected void Page_Load(object sender, EventArgs e)
{
Button1.Text = GetUI(UILang.BUTTON_SHOWMSG);
}
protected void Button1_Click(object sender, EventArgs e)
{
Button btn = sender as Button;
if (btn != null)
{
ClientScript.RegisterStartupScript(this.GetType(),
"showMsg",
string.Format("alert('{0}')",GetERR(ERRLang.ERROR_DB)),
true);
}
}
{
Button1.Text = GetUI(UILang.BUTTON_SHOWMSG);
}
protected void Button1_Click(object sender, EventArgs e)
{
Button btn = sender as Button;
if (btn != null)
{
ClientScript.RegisterStartupScript(this.GetType(),
"showMsg",
string.Format("alert('{0}')",GetERR(ERRLang.ERROR_DB)),
true);
}
}