`
cuijiemin
  • 浏览: 255507 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

ASP.NET 2.0 本地化技术之研究(二)

阅读更多
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
分享到:
评论

相关推荐

    ASP.NET 2.0本地化技术入门:实例教程

    ASP.NET 2.0本地化技术入门:如何使用工具自动生成本地化资源(LocalResources)

    ASP.NET 2.0快速入门 下载列表 微软

    Asp.net2.0 提供了一种可以让网站在多种语言版本之间切换的方法。通过本课的学习,听众可以了解到如何使自己的网站资源自由变幻,并快速国际化。 • 开始时间: 2005-12-5 14:30:00 • 技术等级: Level 200 • 系列: ...

    零基础学ASP.NET 2.0电子书&源代码绝对完整版1

    示例描述:本章演示ASP.NET 2.0网站的预编译以及学习ASP.NET 2.0的前置知识。 WebSite文件夹 创建的ASP.NET 2.0 Web站点。 www文件夹 第一个用C#开发的Web应用程序。 bianyi.bat 编译网站的批处理文件。 ...

    2.ASP.NET.2.0.高级编程(第4版) [1/7]

    本书介绍了ASP.NET 2.0中的每个新增特性和功能,以便读者把这些新技术应用于实践。.. 本书主要内容 ● 服务器控件的概念及其在ASP.NET开发中的主导作用 ● 使用新的Master页面特性创建模板化的ASP.NET页面 ● ...

    ASP.NET2.0支持多语言示例源码

    ASP.NET2.0支持多语言示例源码 例子中可以实现中英文双语,其他的可以自己扩展 1.使用工具自动生成本地化资源(LocalResources) 2.原来Localizable AttributeProperty是这么回事呀 3.手工添加本地化资源 4.显示...

    ASP.NET 2.0 跟我一起学Visual.Studio2005 2/9

    课程简介:ASP.NET 2.0 除了编译模型的改进之外,针对页面生命周期也公开了新的事件来支持新功能,例如母版页、个性化以及集成的设备支持等。增强的缓存功能,以及扩展性支持,本课程主要对以上几个方面进行阐述。...

    ASP.NET2.0高级编程(第4版)1/6

    本书全面介绍了ASP.NET各种编程技能和2.0版中的巨大变化,并详细阐述了2.0版中的每个新特性。书中提供了大量的实例,可帮助读者快速掌握如何在.NET平台下开发功能强大的ASP.NET应用程序。本书适合有一些基础的ASP...

    ASP.NET 2.0 跟我一起学Visual.Studio2005 1/9

    课程简介:ASP.NET 2.0 除了编译模型的改进之外,针对页面生命周期也公开了新的事件来支持新功能,例如母版页、个性化以及集成的设备支持等。增强的缓存功能,以及扩展性支持,本课程主要对以上几个方面进行阐述。...

    零基础学ASP.NET 2.0&源代码绝对完整版1

    示例描述:本章演示ASP.NET 2.0网站的预编译以及学习ASP.NET 2.0的前置知识。 WebSite文件夹 创建的ASP.NET 2.0 Web站点。 www文件夹 第一个用C#开发的Web应用程序。 bianyi.bat 编译网站的批处理文件。 form...

    学习使用ASP.NET 2.0的本地化

    学习使用ASP.NET 2.0的本地化

    [源代码] ASP.NET 2.0 网站开发全程解析 (源代码)

    - 本地化: (Localization)应用; - 论坛(Forum)模块; - 电子商店(Store)模块; - 新闻文章(Article)模块; - 民意调查(PollBox)模块; - 邮件列表(Newsletter)模块; ☆ 管理员账号:☆ - 用户名:Acer - 密 ...

    asp.net知识库

    asp.net2.0:扩展ImageButton控件定制自己需要的功能 ASP.NET 2.0 正式版中无刷新页面的开发(示例代码的补充) ASP.NET2.0中themes、Skins轻松实现网站换肤! ASP.NET 2.0 中的代码隐藏和编译 ASP.NET 2.0 Language ...

    《零基础学ASP.NET 2.0》第5章 创建智能表单

    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 如何让一...

    spring.net中文手册在线版

    它提供了很多方面的功能,比如依赖注入、面向方面编程(AOP)、数据访问抽象及ASP.NET扩展等等。Spring.NET以Java版的Spring框架为基础,将Spring.Java的核心概念与思想移植到了.NET平台上。 第一章 序言 第二章 ...

    asp.net 2.0多语言网站解决方法

    asp.net 2.0中的App_GlobalResources可以用来解决本地化的问题,程序会根据浏览器的语言首选项自动判断显示出本地化的界面。

    基于ASP.NET的多语种网络硬盘系统设计与实现毕业设计(源代码+项目报告)

    采用ASP.NET 2.0开发语言,利用ASP.NET中的三层结构、B/S模式结构以及ASP.NET网页资源的设计思路,实现了包括文件夹的操作、文件的操作、网页的多语种化三个功能模块;通过文件夹功能模块,可以添加、删除、更改名字...

    依据ASP.NET多语种网络硬盘系统的设计(毕业设计源代码+论文)

    采用ASP.NET 2.0开发语言,利用ASP.NET中的三层结构、B/S模式结构以及ASP.NET网页资源的设计思路,实现了包括文件夹的操作、文件的操作、网页的多语种化三个功能模块;通过文件夹功能模块,可以添加、删除、更改名字...

    [计算机毕设]基于asp.net的多语种网络硬盘系统设计与实现(源代码+项目报告).zip

    采用ASP.NET 2.0开发语言,利用ASP.NET中的三层结构、B/S模式结构以及ASP.NET网页资源的设计思路,实现了包括文件夹的操作、文件的操作、网页的多语种化三个功能模块;通过文件夹功能模块,可以添加、删除、更改名字...

    Asp.Net MVC+PostgreSql论坛源码(yjx.in)

    主要使用技术:Microsoft .NET Framework 4.5.2、Asp.Net MVC 5、EntityFramework、PostgreSql。 本论坛也非个人原创,本论坛基于MVCForum二次开发。新增了一些本地化特色以及号称世界上功能最强大的开源数据库...

Global site tag (gtag.js) - Google Analytics