ASP.NET应用程序的国际化基本上有两种方案,一种是在数据库中建立语言映射表,从数据库中取出国际化后的资源;第二种是在应用程序中建议资源文件,根据语言进行切换。在这里我想说的是第二种方法。
1.我们先建立一个BasePage类,然后让我们的所有页面全都继承这个BasePage类,在这个类里完成国际化操作,我们在这里只以英文和中文的切换为例子。BasePage类如下:
using System;
using System.Web;
using System.Threading;
using System.Globalization;</span><p><span style="font-family:Microsoft YaHei;">public class BasePage : System.Web.UI.Page
{
protected override void InitializeCulture()
{
this.AcquireRequestState(Page, "");
base.InitializeCulture();
}</span></p><p><span style="font-family:Microsoft YaHei;"> //根据语言选择国际化页面 此方法建议写到其它公共类
public void AcquireRequestState(System.Web.UI.Page page, string language)
{
if (page.Session["language"] == null)
{
language = "";
}
else
{
language = page.Session["language"].ToString();
}
page.UICulture = language;
page.Culture = language;
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(language);
Thread.CurrentThread.CurrentUICulture = new CultureInfo(language);</span></p><p><span style="font-family:Microsoft YaHei;"> }</span></p><p><span style="font-family:Microsoft YaHei;"> //通过Key获取资源文件中对应的值
public string GetLocalResourceByKey(string keyID)
{
string strReturn = "";
if (!string.IsNullOrEmpty(keyID))
{
try
{
strReturn = GetLocalResourceObject(keyID).ToString();
}
catch
{</span></p><p><span style="font-family:Microsoft YaHei;"> }
}
return strReturn;
}</span></p><p><span style="font-family:Microsoft YaHei;"> //Ajax后台处理程序国际化 此方法建议写到其它公共类
public string AjaxInternation(HttpContext context, string pagePath, string key)
{
CultureInfo currentCulture;
if (context.Session["language"] != null)
{
if (context.Session["language"].ToString() == "en-us")
{
currentCulture = new CultureInfo("en-us");
}
else
{
currentCulture = new CultureInfo("");
}
}
else
{
currentCulture = new CultureInfo("");
}
return HttpContext.GetLocalResourceObject(pagePath, key, currentCulture).ToString();
}
}
2.建立一个示例页面,名字为NationalWeb.aspx,在这里我们讲演示文本,下拉框,JS验证,后台脚本弹窗等格式化方法。代码如下:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="NationalWeb.aspx.cs" Inherits="Study.NationalWeb"
Culture="auto" meta:resourcekey="PageResource1" UICulture="auto" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<script src="Scripts/jquery-1.4.1.js" type="text/javascript"></script>
<script type="text/javascript">
$(function () {
$("#txtBox").focus(function () {
var tip = '<%=GetLocalResourceByKey("JSTip.Text")%>';
$("#Tip").text(tip);
})
})
function GetAlert() {
var alertTip = '<%=GetLocalResourceByKey("AlertTip.Text")%>';
if (confirm(alertTip))
{ return true; } else { return false; }
}
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:LinkButton ID="lbLang" runat="server" meta:resourcekey="lbLangResource1" OnClick="lbLang_Click"></asp:LinkButton><br />
<br />
<asp:Label ID="lbText" runat="server" meta:resourcekey="lbTextResource1"></asp:Label><br />
<br />
<asp:DropDownList ID="dopCountry" runat="server" meta:resourcekey="dopCountryResource1">
<asp:ListItem Value="0" meta:resourcekey="ListItemResource1"></asp:ListItem>
<asp:ListItem Value="1" meta:resourcekey="ListItemResource2"></asp:ListItem>
<asp:ListItem Value="2" meta:resourcekey="ListItemResource3"></asp:ListItem>
</asp:DropDownList>
<br />
<br />
<asp:Label ID="lbTip" runat="server" meta:resourcekey="lbTip"></asp:Label>
<asp:TextBox ID="txtBox" runat="server"></asp:TextBox><span id="Tip"></span><br />
<br />
<asp:LinkButton ID="lbPop" runat="server" OnClientClick="return GetAlert()" meta:resourcekey="lbPopResource1"
OnClick="lbPop_Click"></asp:LinkButton>
</div>
</form>
</body>
</html>
我们可以看到整个代码没有任何的文本内容,反而多了很多的meta:resourcekey属性,这是因为我已经将这个页面国际化了,meta:resourcekey属性对应的值就是资源文件中的值。
3.我们在VS中将页面切换到“设计”视图,然后点击 工具——生成本地资源,我们就可以在App_LocalResources文件夹下看到NationalWeb.aspx.resx这个资源文件,打开看一下里面就有页面上每一个ID对应的Text属性。我们也可以自己新建一些键/值对,对一些脚本提示内容等等进行国际化。下面我们把它拷贝一份,重新命名为NationalWeb.aspx.en-us.resx这一个文件作为英文的资源文件,我们将对应的Text修改为英文,修改完后大体如下:
特别注意一下黄色标记的那个值,那个是页面上切换中英文的超链接,在英文资源文件中这个值应该是中文,在中文资源文件中他应该是English,这样才能切换正常。
4.下面我们看一下NationalWeb.aspx的后台代码,基本上没有什么代码,主要说一下后台弹窗文本的国际化,代码如下:
using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace Study
{
public partial class NationalWeb : BasePage
{
protected void Page_Load(object sender, EventArgs e)
{
}
//语言切换
protected void lbLang_Click(object sender, EventArgs e)
{
string language = string.Empty;
if (lbLang.Text == "English")
{
language = "en-us";
}
else
{
language = "";
}
Session["language"] = language;
Server.Transfer(Request.Path);
}
//后台弹窗国际化
protected void lbPop_Click(object sender, EventArgs e)
{
string message = GetLocalResourceObject("Operation.Text").ToString();//获取国际化后的文本
ClientScript.RegisterStartupScript(Page.GetType(), "", "<script>alert('" + message + "');</script>");
}
}
}
5.这样就国际化完了,其实也是很简单的,还有一个地方没有说到,就是Ajax处理程序中返回的文本应该如何国际化呢?其实原理也差不多,首先先在资源文件建立对应的key/Value,然后可以通过BasePage类写的那个AjaxEnglish方法完成国际化,示例代码如下:
string name = BasePage.AjaxEnglish(context, "/Customer/PackageBid.aspx", "ProductName.Text");
本文作者:佩窈 来源:CSDN博客
CIO之家 www.ciozj.com 微信公众号:imciow