在
ASP.NET 2.0 本地化技术之研究的回复中提到了以下两点:
1.这只是单个页面的切换,如何做整个站点的切换呢?(
hjh )
2.关于如何将资源直接显示……既然控件能够将嵌入dll的资源直接显示,不知道网站能否也将嵌入资源直接调用WebResource显示呢?(
Cat Chen )
由于不是一两句可以说清,所以再开一篇仔细讲一下。
内容列表:
1.整站本地化资源的切换
2.使用ProFile保存用户选择的语言
3.关于WebResource的使用
4.代码下载
1.整站本地化资源的切换在上一篇里我们讲到,可以通过重载页面的InitializeCulture函数,在其中切换当前线程的CurrentUICulture和CurrentCulture来实现本页的资源切换。那么整站呢?总不能在每个页面里都写上这几句吧。。。
首先,我想到的是使用MasterPage,如果在MasterPage里加上资源切换的代码,那么所有使用该母板的页面都具备这种能力了吧,呵呵(想得不错)。但如意算盘打破了,MasterPage是使用@Master来声明的,根本和Page是两个继承路线,所以MasterPage里没有InitializeCulture这个虚函数!
没办法,想到了另一个解决方案,创建一个从System.Web.UI.Page继承下来的基类,在其中实现资源切换,而站内所有页面的实现类都从该类继承。OK,就这么办!
打开上一篇完成的网站,选中网站,右键在弹出菜单中点击[添加ASP.NET文件夹]-[App_Code]。
选中该文件夹,右键点击[添加新项],在弹出式窗口中选择“类”,命名为LocalizedPage.cs,点击[添加]完成,如图所示:
编辑LocalizedPage.cs,代码如下:
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->usingSystem;
usingSystem.Data;
usingSystem.Configuration;
usingSystem.Web;
usingSystem.Web.Security;
usingSystem.Web.UI;
usingSystem.Web.UI.WebControls;
usingSystem.Web.UI.WebControls.WebParts;
usingSystem.Web.UI.HtmlControls;
usingSystem.Threading;
usingSystem.Globalization;
///<summary>
///所有需要本地化资源切换的页面基类
///</summary>
publicclassLocalizedPage:System.Web.UI.Page
{
protectedoverridevoidInitializeCulture()
{
Strings=Request.QueryString["currentculture"];
if(!String.IsNullOrEmpty(s))
{
//UICulture-决定了采用哪一种本地化资源,也就是使用哪种语言
//Culture-决定各种数据类型是如何组织,如数字与日期
Thread.CurrentThread.CurrentUICulture=newCultureInfo(s);
Thread.CurrentThread.CurrentCulture=CultureInfo.CreateSpecificCulture(s);
}
}
}
编辑Image.aspx.cs,去除其重载的InitialzeCulture()函数,将其基类改为LocalizedPage,代码如下:
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->usingSystem;
usingSystem.Data;
usingSystem.Configuration;
usingSystem.Collections;
usingSystem.Web;
usingSystem.Web.Security;
usingSystem.Web.UI;
usingSystem.Web.UI.WebControls;
usingSystem.Web.UI.WebControls.WebParts;
usingSystem.Web.UI.HtmlControls;
usingSystem.Threading;
usingSystem.Globalization;
publicpartialclassImage:LocalizedPage
{
protectedvoidPage_Load(objectsender,EventArgse)
{
System.Drawing.Bitmapimg=(System.Drawing.Bitmap)GetGlobalResourceObject(
"LocalizedText",
CultureInfo.CurrentCulture.Name.ToLower().Replace("-","_")+"_flag");
System.IO.MemoryStreamms=newSystem.IO.MemoryStream();
img.Save(ms,System.Drawing.Imaging.ImageFormat.Jpeg);
Response.ClearContent();
Response.ContentType="image/jpeg";
Response.BinaryWrite(ms.ToArray());
img.Dispose();
ms.Dispose();
ms.Flush();
}
}
运行网站,可以看到由Image页面负责输出的图片,可以按选中的语言正常切换。
再编辑Default.aspx.cs,调整代码如下:
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->usingSystem;
usingSystem.Data;
usingSystem.Configuration;
usingSystem.Web;
usingSystem.Web.Security;
usingSystem.Web.UI;
usingSystem.Web.UI.WebControls;
usingSystem.Web.UI.WebControls.WebParts;
usingSystem.Web.UI.HtmlControls;
usingSystem.Globalization;
usingSystem.Threading;
publicpartialclass_Default:LocalizedPage
{
protectedvoidPage_Load(objectsender,EventArgse)
{
Strings=Request.QueryString["currentculture"];
Image1.ImageUrl="~/Image.aspx?currentculture="+s;
}
protectedvoidButton1_Click(objectsender,EventArgse)
{
Localize1.Text=(String)GetLocalResourceObject("Label1Resource1.Text")+""+
(String)GetGlobalResourceObject("LocalizedText","Msg1");
}
}
运行程序,一切正常。
总结:利用这种方式,新建页面时只需修改其继承的基类为LocalizedPage即可。对于已经建好的站点,同理,也可以很方便的加入资源切换的支持。
2.使用ProFile保存用户选择的语言
前面我们是通过URL传参的方式将用户选择的语言传递到各个页面,感觉不爽。那么使用Session呢?听上去不错,但是你没听过ProFile吗?这可是ASP.NET 2.0的新特性之一呀!与Session一样ProFile是针对一个特定用户的,但ProFile更好用,因为它有以下特点:
1)可存储,默认是保存在SQL Server Express中,但通过实现Provider可以将它存储到任何地方
2)支持匿名使用,在用户认证后还可以迁移到认证用户中(具体实现方法据说是非常的“巧妙”)
3)支持生成和管理报告
不错吧,那么我们就用ProFile来保存用户选择的语言信息吧。
注意:由于ProFile默认是由SQL Server Express来存储的,所以要保证你的VS2005已经安装该模块。编辑Web.Config,在system.web节点下增加以下配置
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><configuration>
<system.web>
<anonymousIdentificationenabled="true"/>
<profile>
<properties>
<addname="LanguagePreference"type="string"
defaultValue="Auto"allowAnonymous="true"/>
</properties>
</profile>
</system.web>
</configuration>
同时加入的anonymousIdentification节,是为了让系统自动为匿名用户生成唯一标识。另外的allowAnonymous="true"表明LanguagePreference属性可以被匿名用户访问。
编辑Default.aspx,切换到[设计]视图,删除原来用于切换语言的两个链接“中文(中国)”和“English(USA)”。从工具箱中拖一个DropDownList控件到页面上,设置其AutoPostBack属性为True(
切记!),然后编辑它的Items属性,如图所示:
中文(中国)的Value为zh-cn,英文(美国)的Value为en-us。
编辑Default.aspx.cs,为DropDownList编写SelectedIndexChanged事件的实现,代码如下:
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->protectedvoidDropDownList1_SelectedIndexChanged(objectsender,EventArgse)
{
Profile.LanguagePreference=DropDownList1.SelectedValue;
Response.Redirect(Request.Url.AbsolutePath);
}
修改Page_Load的实现,代码如下:
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->protectedvoidPage_Load(objectsender,EventArgse)
{
Strings=Profile.LanguagePreference;
Image1.ImageUrl="~/Image.aspx";
}
然后再编辑LocalizedPage.cs,代码如下:
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->protectedoverridevoidInitializeCulture()
{
Strings=(String)Context.Profile.GetPropertyValue("LanguagePreference");
if(!String.IsNullOrEmpty(s)&&(s!="Auto"))
{
//UICulture-决定了采用哪一种本地化资源,也就是使用哪种语言
//Culture-决定各种数据类型是如何组织,如数字与日期
Thread.CurrentThread.CurrentUICulture=newCultureInfo(s);
Thread.CurrentThread.CurrentCulture=CultureInfo.CreateSpecificCulture(s);
}
}
注意:我们在Default.aspx.cs之所以可以直接使用Profile来访问用户个人信息,是因为ASP.NET在页面运行时自动为我们生成了一个继承自System.Web.Profile.ProfileBase的ProfileCommon类。而在App_Code目录的代码开始执行时,ProfileCommon还没有生成,更别提Profile了。所幸的是,我们可以通过上面代码的方式访问到用户个人信息(真的研究了好长时间。。。)
运行程序,切换语言,运行效果如图所示:
中文(中国)
英文(美国)
注意哟,退出程序后,再次运行,所有页面将按你上次设置的语言显示,Profile真的很不错。
3.关于WebResource的使用ASP.NET是在运行时将全局资源和本地资源进行编译,象.aspx文件一样,所以我们只需要将.resx文件xcopy到正在运行的WEB服务器上,即可为新语言提供本地化的支持。但如果我们开发了一个WEB控件,其中使用到了一些资源(如图片),那就要求我们必须将DLL和资源文件一起部署到WEB服务器上,比较麻烦。
ASP.NET开发团队考虑到了这一点,现在我们可以在网站里使用资源DLL,这样在发布DLL时资源也同时被分配了。该技术是通过在控件代码里调用GetWebResourceUrl方法,这个方法指向一个名为WebResource.axd的内置HTTP处理程序的URL。通过加载一个名为AssemblyResourceLoader的HttpHandler类,ASP.NET运行时响应WebResource.axd的请求,返回指定资源的URL。
该技术有以下缺点:
1)只能在面向 ASP.NET 2.0 网站的 DLL 项目内使用该技术,而无法网站内直接使用该技术
2)该技术实际上并不支持任何形式的本地化(说到这,感觉把这家伙写到本随笔里不太合适。。。管它呢,先写完再说!
)
选中网解决方案,右键在弹出式菜单里点击[添加]->[新建项目],在弹出窗口选中Visual C#项目下的类库,并设好保存路径,如图所示:
点击确定,删除Class1.cs。选中ClassLibrary1项目,右键在弹出菜单里点击[添加]->[新建项],在弹出窗口选择“WEB 自定义控件”,如图所示:
点击[添加],现在解决方案里已经包含两个项目了,如图所示:
右键ClassLibrary1项目,选择[添加]->[现有项],随便找一张图片(我使的是园子的logo,嘿嘿),如图所示:
点击[添加],右键刚添加的图片点击[属性],将“生成操作”设为“嵌入的资源”,如图所示:
编辑WebCustomControl1.cs,代码如下:
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->usingSystem;
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
usingSystem.Text;
usingSystem.Web;
usingSystem.Web.UI;
usingSystem.Web.UI.WebControls;
[assembly:WebResource("ClassLibrary1.logo.gif","image/gif")]
namespaceClassLibrary1
{
[ToolboxData("<{0}:WebCustomControl1runat=server></{0}:WebCustomControl1>")]
publicclassWebCustomControl1:WebControl
{
protectedoverridevoidRenderContents(HtmlTextWriteroutput)
{
output.WriteBeginTag("image");
Stringurl=Page.ClientScript.GetWebResourceUrl(GetType(),"ClassLibrary1.logo.gif");
output.WriteAttribute("src",url);
output.WriteEndTag("image");
}
}
}
编辑网站的Default.aspx文件,切换到[设计]视图,将工具箱的ClassLibrary1面板里的WebCustomControl1控件拖到页面上,运行程序,效果如图所示:
4.代码下载
下载地址:
http://www.cnblogs.com/Files/reonlyrun/WebLocalizationTaste2.rar
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1920837
相关推荐
ASP.NET 2.0本地化技术入门:如何使用工具自动生成本地化资源(LocalResources)
Asp.net2.0 提供了一种可以让网站在多种语言版本之间切换的方法。通过本课的学习,听众可以了解到如何使自己的网站资源自由变幻,并快速国际化。 • 开始时间: 2005-12-5 14:30:00 • 技术等级: Level 200 • 系列: ...
示例描述:本章演示ASP.NET 2.0网站的预编译以及学习ASP.NET 2.0的前置知识。 WebSite文件夹 创建的ASP.NET 2.0 Web站点。 www文件夹 第一个用C#开发的Web应用程序。 bianyi.bat 编译网站的批处理文件。 ...
本书介绍了ASP.NET 2.0中的每个新增特性和功能,以便读者把这些新技术应用于实践。.. 本书主要内容 ● 服务器控件的概念及其在ASP.NET开发中的主导作用 ● 使用新的Master页面特性创建模板化的ASP.NET页面 ● ...
ASP.NET2.0支持多语言示例源码 例子中可以实现中英文双语,其他的可以自己扩展 1.使用工具自动生成本地化资源(LocalResources) 2.原来Localizable AttributeProperty是这么回事呀 3.手工添加本地化资源 4.显示...
课程简介:ASP.NET 2.0 除了编译模型的改进之外,针对页面生命周期也公开了新的事件来支持新功能,例如母版页、个性化以及集成的设备支持等。增强的缓存功能,以及扩展性支持,本课程主要对以上几个方面进行阐述。...
本书全面介绍了ASP.NET各种编程技能和2.0版中的巨大变化,并详细阐述了2.0版中的每个新特性。书中提供了大量的实例,可帮助读者快速掌握如何在.NET平台下开发功能强大的ASP.NET应用程序。本书适合有一些基础的ASP...
课程简介:ASP.NET 2.0 除了编译模型的改进之外,针对页面生命周期也公开了新的事件来支持新功能,例如母版页、个性化以及集成的设备支持等。增强的缓存功能,以及扩展性支持,本课程主要对以上几个方面进行阐述。...
示例描述:本章演示ASP.NET 2.0网站的预编译以及学习ASP.NET 2.0的前置知识。 WebSite文件夹 创建的ASP.NET 2.0 Web站点。 www文件夹 第一个用C#开发的Web应用程序。 bianyi.bat 编译网站的批处理文件。 form...
学习使用ASP.NET 2.0的本地化
- 本地化: (Localization)应用; - 论坛(Forum)模块; - 电子商店(Store)模块; - 新闻文章(Article)模块; - 民意调查(PollBox)模块; - 邮件列表(Newsletter)模块; ☆ 管理员账号:☆ - 用户名:Acer - 密 ...
asp.net2.0:扩展ImageButton控件定制自己需要的功能 ASP.NET 2.0 正式版中无刷新页面的开发(示例代码的补充) ASP.NET2.0中themes、Skins轻松实现网站换肤! ASP.NET 2.0 中的代码隐藏和编译 ASP.NET 2.0 Language ...
5.10 Localize控件显示本地化文本 98 5.11 Literal控件以编程方式控制文本 99 5.12 常见问题 100 5.12.1 如何以编程的方式操作TextBox控件 101 5.12.2 TextBox控件的AutoPostBack属性有什么作用 101 5.12.3 如何让一...
它提供了很多方面的功能,比如依赖注入、面向方面编程(AOP)、数据访问抽象及ASP.NET扩展等等。Spring.NET以Java版的Spring框架为基础,将Spring.Java的核心概念与思想移植到了.NET平台上。 第一章 序言 第二章 ...
asp.net 2.0中的App_GlobalResources可以用来解决本地化的问题,程序会根据浏览器的语言首选项自动判断显示出本地化的界面。
采用ASP.NET 2.0开发语言,利用ASP.NET中的三层结构、B/S模式结构以及ASP.NET网页资源的设计思路,实现了包括文件夹的操作、文件的操作、网页的多语种化三个功能模块;通过文件夹功能模块,可以添加、删除、更改名字...
采用ASP.NET 2.0开发语言,利用ASP.NET中的三层结构、B/S模式结构以及ASP.NET网页资源的设计思路,实现了包括文件夹的操作、文件的操作、网页的多语种化三个功能模块;通过文件夹功能模块,可以添加、删除、更改名字...
采用ASP.NET 2.0开发语言,利用ASP.NET中的三层结构、B/S模式结构以及ASP.NET网页资源的设计思路,实现了包括文件夹的操作、文件的操作、网页的多语种化三个功能模块;通过文件夹功能模块,可以添加、删除、更改名字...
主要使用技术:Microsoft .NET Framework 4.5.2、Asp.Net MVC 5、EntityFramework、PostgreSql。 本论坛也非个人原创,本论坛基于MVCForum二次开发。新增了一些本地化特色以及号称世界上功能最强大的开源数据库...