ASP.NET系统国际化总结
引言
系统要求同时支持中英文,以前对国际化这块只是听说过,从来没有自己动手过,提到国际化那么首先肯定想到的就是资源文件,也确实是这样,于是乎我从开始着手系统国际化功能时前前后后共投入了4次时间段,每次大概都在1-2个小时左右,从而让我觉的不能轻视他,否则会乱套。
国际化都需要做那些工作呢?
1、当然是资源文件。它是系统国际化工作的第一道关口,资源文件需要准备中文和英文两种,也就是Resource.resx和Resource-en.resx文件,我使用的全局资源文件。
2、系统菜单。 正常的业务逻辑,我们的系统菜单数据都是存在数据库中的,那么如何决定从数据库读取中文字段还是英文字段呢,就需要有一个标识到决定,这个标识就是Session,用Session来记录当前系统用户选择的何种语言。
3、aspx页面中的文字。
4、js文件中的汉字。
5、如果你在使用HTML控件之外还用了服务器控件呢?
准备工作
1、资源文件。分别对应中文和英文资源文件
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的值来选择相应语种。
服务器控件文字国际化
这点我就奇怪了,也是今天才发现的,为毛我在服务器控件的Text也直接写<%%>时就报错呢? 没办法的情况下,用了个笨方法,只能在Page_Init函数中根据Session["Language"]来翻译了。
总结
首先,国际化总体情况是个纯体力活,需要分别考虑资源文件、aspx页面、js文件。 起初我没在意,认为把资源文件准备好就行了,经过前前后后4次大改后我发现这些细节性问题还是要认真对待,在我第二次大改时我在后台是Session也用,Cookie也用,切换语种后发现Cookie存放的值跨页面后就找不到了,要知道Cookie跨页面是肯定存在的,又一次郁闷,于是又有了第三次和第四次的大改才基本完成。
ASP.NET系统国际化总结的更多相关文章
- 简约的ASP.NET 系统框架,提供源码。
好东西,好东西就要分享. 其实谈不上什么好东西,但很实用,应用起来也很简单,我自己用它构建了多套ASP .NET系统,原理也很简单: 1.用XML文件编辑系统的菜单和Toolbar: 2.读取XML节 ...
- ASP.NET系统对象
一.ASP.NET 系统对象 Request:用来获取客户端在Web请求期间发送的值,如URL参数,表单参数 Response:用来负者返回到客户端的HTTP输出 ...
- [转]【转】大型高性能ASP.NET系统架构设计
大型高性能ASP.NET系统架构设计 大型动态应用系统平台主要是针对于大流量.高并发网站建立的底层系统架构.大型网站的运行需要一个可靠.安全.可扩展.易维护的应用系统平台做为支撑,以保证网站应用的平稳 ...
- asp.net系统过滤器、自定义过滤器
原文地址:http://www.cnblogs.com/kissdodog/archive/2013/05/21/3090513.html 一.系统过滤器使用说明 1.OutputCache过滤器 O ...
- asp.net2.0 国际化
公司业务需要在国外开展了, 因此以前的系统要做多国语言了, 从网上搜集了好多资料, 最后选择了一个比较简单的方案 1. 打开vs2005, 新建网站, 首先在配置文件中添加配置: <syste ...
- C# ASP.NET系统缓存全解析
原文:http://blog.csdn.net/wyxhd2008/article/details/8076105 目录(?)[-] 系统缓存的概述 页面输出缓存 页面局部缓存 文件缓存依赖 数据库缓 ...
- 大型高性能ASP.NET系统架构设计
大型动态应用系统平台主要是针对于大流量.高并发网站建立的底层系统架构.大型网站的运行需要一个可靠.安全.可扩展.易维护的应用系统平台做为支撑,以保证网站应用的平稳运行. 大型动态应用系统又可分为几个子 ...
- [Asp.net mvc]国际化
摘要 在实际项目中,经常遇到,开发的项目要提供给不同的国家使用,如果根据国家来开发不同的站点,肯定是非常耗时又耗成本的.asp.net中,提供了一种比较方便的方式,可以使用资源文件的方式,使我们的站点 ...
- web系统国际化思路
需求:php开发多个中文系统支持国际化 思路: 提炼各个系统中的中文字符,替换为资源key. 多媒体文件中的中文定位(图片中的中文,中文录音,中文视频,中文模板等). 统一翻译文字.准备资源文件. 各 ...
随机推荐
- Devexpress Ribbon
http://www.cnblogs.com/liwei81730/archive/2011/12/21/2296203.html 可查看此处.
- 【转】Polya定理
转自:http://endlesscount.blog.163.com/blog/static/82119787201221324524202/ Polya定理 首先记Sn为有前n个正整数组成的集合, ...
- web预设模块化
- 一图搞定【实战Java高并发程序设计】
来了解下java并发的技术点吧.这里面包括了并发级别.算法.定律,还有开发包.在过去单核CPU时代,单任务在一个时间点只能执行单一程序,随着多核CPU的发展,并行程序开发就显得尤为重要.这本书主要介绍 ...
- Powershell 开启远程桌面
function Set-RemoteDesktop { while($InNumber -ne 6) { Write-Host " ###################### ...
- Hadoop学习笔记—15.HBase框架学习(基础实践篇)
一.HBase的安装配置 1.1 伪分布模式安装 伪分布模式安装即在一台计算机上部署HBase的各个角色,HMaster.HRegionServer以及ZooKeeper都在一台计算机上来模拟. 首先 ...
- iOS开发系列--视图切换
概述 在iOS开发中视图的切换是很频繁的,独立的视图应用在实际开发过程中并不常见,除非你的应用足够简单.在iOS开发中常用的视图切换有三种,今天我们将一一介绍: UITabBarController ...
- 迷你MVVM框架avalon在兼容旧式IE做的努力
很多时候,写代码就像砌砖头,只要我们不关心盖楼的原因.建筑的原理.土木工程基础和工程经验,就算我们砌了100栋高楼,我们也就只是一个砌砖工人,永远也成为不了一个工程师,更别说建筑师了.而那些包工头也只 ...
- ASP.NET MVC 控制器激活(一)
ASP.NET MVC 控制器激活(一) 前言 在路由的篇章中讲解了路由的作用,讲着讲着就到了控制器部分了,从本篇开始来讲解MVC中的控制器,控制器是怎么来的?MVC框架对它做了什么?以及前面有的篇幅 ...
- 深圳本土web前端经验交流
群号:125776555 深圳本土web前端技术交流群 baidu tencent前端拒绝垃圾广告.吹水,欢迎讨论技术.跳槽经验期待您的加入