ASP.NET系统国际化总结

时间:2023-12-28 17:50:50

引言

系统要求同时支持中英文,以前对国际化这块只是听说过,从来没有自己动手过,提到国际化那么首先肯定想到的就是资源文件,也确实是这样,于是乎我从开始着手系统国际化功能时前前后后共投入了4次时间段,每次大概都在1-2个小时左右,从而让我觉的不能轻视他,否则会乱套。

国际化都需要做那些工作呢?

1、当然是资源文件。它是系统国际化工作的第一道关口,资源文件需要准备中文和英文两种,也就是Resource.resx和Resource-en.resx文件,我使用的全局资源文件。

2、系统菜单。 正常的业务逻辑,我们的系统菜单数据都是存在数据库中的,那么如何决定从数据库读取中文字段还是英文字段呢,就需要有一个标识到决定,这个标识就是Session,用Session来记录当前系统用户选择的何种语言。

3、aspx页面中的文字。

4、js文件中的汉字。

5、如果你在使用HTML控件之外还用了服务器控件呢?

准备工作

1、资源文件。分别对应中文和英文资源文件

ASP.NET系统国际化总结

ASP.NET系统国际化总结

2、BasePage页面,依赖资源文件的页面都需要继承BasePage页面,这个页面应该众所周知。

 public partial class BasePage : System.Web.UI.Page
{
#region 变量 protected ResourceManager rmCommon = new ResourceManager("Resources.Resource.zh-cn", Assembly.GetExecutingAssembly());
#endregion #region Page_Load protected void Page_Load(object sender, EventArgs e)
{ }
#endregion #region 系统语种 protected SysLanguage JrscLanguage
{
get
{
if (Session["Language"] != null)
{
if (Session["Language"].ToString() == "zh-CN")
{
return SysLanguage.Chinese;
}
else
{
return SysLanguage.English;
}
}
else
{
//如果当前无法获取系统语种则默认为汉语
return SysLanguage.Chinese;
}
} }
#endregion #region 初始化多语言环境 /// <summary>
/// 初始化多语言环境
/// </summary>
protected override void InitializeCulture()
{
try
{ string language = Request.Form["__EventTarget"]; if (!string.IsNullOrEmpty(language))
{
string LanguageId = Request.Form[language];
if (!String.IsNullOrEmpty(LanguageId))
{
SetCulture(LanguageId);
}
}
else
{
if (Session["Language"] != null)
{
string curL = Session["Language"].ToString();
}
} if (Session["Language"] != null)
{
string curL = Session["Language"].ToString();
if (string.IsNullOrEmpty(curL))
curL = "zh-CN";
else if (curL.ToLower().Contains("zh"))
curL = "zh-CN";
else
curL = "en-US"; CultureInfo ci = Thread.CurrentThread.CurrentCulture;
string cur = ci.TwoLetterISOLanguageName;
string curName = ci.Name; if (curName.ToLower() != curL.ToLower())
SetCulture(curL);
} base.InitializeCulture();
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
protected bool IsLogin = true;
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
} protected void SetCulture(string languageId)
{
try
{
//Session["Language"] = languageId; CultureInfo ci = CultureInfo.CreateSpecificCulture(languageId);
Thread.CurrentThread.CurrentCulture = ci;
ci = new CultureInfo(languageId);
Thread.CurrentThread.CurrentUICulture = ci; }
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
languageId = "en-US";
CultureInfo ci = CultureInfo.CreateSpecificCulture(languageId);
Thread.CurrentThread.CurrentCulture = ci;
ci = new CultureInfo(languageId);
Thread.CurrentThread.CurrentUICulture = ci; }
} #endregion }

3、存放在js中需要国际化的文字

var js_language = "";

js_language = $.cookie('js_language');

var Logout = new Array();
Logout["zh-CN"] = "您是否确认退出系统吗?";
Logout["en-US"] = "Are you sure to exit?";

aspx页面国际化

页面继承BasePage后,就可以使用<%=this.GetGlobalResourceObject("Resource","Home_Page")%> 获取对应文字

系统菜单国际化

当页面经登录页面选择语种后,将语种选项存入Session中, 在首页加载菜单时根据该选项读取相应菜单显示文字,其他页面需要的文字同理解决。   有时首页也需要添加国际化切换功能,当在首页中切换时需要更新该Session标识,也就是我在BasePage中定义的Session["Language"]。

js文件内文字国际化

提到js文件内的文字国际化可就是一个不小的体力活了,把js脚本写在aspx页面中,那么可以按照页面的访问方式来访问即可,如果是单独的js文件,则就需要民工时的劳动了。于是用到准备工作中提到的js文件,每个需要翻译的词组定义一个数组,数组放对应的语种和对应的翻译文字, 这里还要用到一个Cookie, 在你使用时根据Cookie的值来选择相应语种。

ASP.NET系统国际化总结

服务器控件文字国际化

这点我就奇怪了,也是今天才发现的,为毛我在服务器控件的Text也直接写<%%>时就报错呢?  没办法的情况下,用了个笨方法,只能在Page_Init函数中根据Session["Language"]来翻译了。

ASP.NET系统国际化总结

总结

首先,国际化总体情况是个纯体力活,需要分别考虑资源文件、aspx页面、js文件。 起初我没在意,认为把资源文件准备好就行了,经过前前后后4次大改后我发现这些细节性问题还是要认真对待,在我第二次大改时我在后台是Session也用,Cookie也用,切换语种后发现Cookie存放的值跨页面后就找不到了,要知道Cookie跨页面是肯定存在的,又一次郁闷,于是又有了第三次和第四次的大改才基本完成。