ASP.NET 2.0: 如何实现按一个按键在两种语言之间切换

asp.net

我要实现这样一个功能,就是按一个按键在两种语言(比如中文和英文)之间切换。

注:我用的是ASP.NET Beta 2。参考文章列在最后。

参考第一篇文章,"Implicit Localization Expressions"一节。一个页面(Page)的本地化内容是在FrameworkInitlize()中创建所有的控件时决定的。比如

   button1.Text = ((string)
      base.GetLocalResourceObject("LinkButtonResource1.Text"));

所以要在FrameworkInitlize()之前设置好你所需要的页面的文化(Culture).

第二篇文章"Page Lifecycle"一节列出了页面的生命周期(Lifecycle)涉及的方法。下面列出了从页面的构造函数(Constructor)开始与我的问题相关的一些方法。

    Constructor
    Construct
    TestDeviceFilter
    AddParsedSubObject
    DeterminePostBackMode
    OnPreInit
    LoadPersonalizationData
    InitializeThemes
    OnInit

在第三篇文章"The Page Lifecycle"的开头写道:

Once the HTTP page handler class is fully identified, the ASP.NET run time calls the handler's ProcessRequest method to process the request. ... (it) begins by calling the method FrameworkInitialize, which builds the controls tree for the page. The method is a protected and virtual member of the TemplateControl class - the class from which Page itself derives. Any dynamically generated handler for an .aspx resource overrides FrameworkInitialize. In this method, the whole control tree for the page is built.

Next, ProcessRequest makes the page transit various phases: initialization, loading of view state information and postback data, loading of the page's user code and execution of postback server-side events. After that, the page enters in rendering mode: the updated view state is collected; the HTML code is generated and then sent to the output console. Finally, the page is unloaded and the request is considered completely served.

从这里,我推断FrameworkInitlize()至少是在OnPreInit()之前被调用的。但是仍然看不出来FrameworkInitlize的准确位置。

绕过上面所说的这些。有两种方法可以实现上述的要求。

方法一。在某页面的InitializeCulture方法中设置你所需要的文化。比如

public partial class _Default : System.Web.UI.Page
{
    protected override void InitializeCulture()
    {
        string cul = Session["UICulture"];
        if (!String.IsNullOrEmpty(cul))
        {
            Thread.CurrentThread.CurrentUICulture =
                new CultureInfo(cul);
        }
    }
}

但这是针对某一个页面的。要应用到整个网站,就要多一点儿麻烦。要把这个InitializeCulture方法写在一个System.Web.UI.Page的子类中,然后让所有页面的类继承于这个子类而不是直接继承System.Web.UI.Page。

方法二。在PreRequestHandlerExecute中设置你所需要的文化。参见HttpApplication类的在线帮助:
An application executes events that are handled by modules or user code that is defined in the Global.asax file in the following sequence:
   1. BeginRequest
   2. AuthenticateRequest
   3. PostAuthenticateRequest
   4. AuthorizeRequest
   5. PostAuthorizeRequest
   6. ResolveRequestCache
      An event handler (a page corresponding to the request URL) is created at this point.
   7. PostResolveRequestCache
   8. PostMapRequestHandler
   9. AcquireRequestState
  10. PostAcquireRequestState
  11. PreRequestHandlerExecute
      The event handler is executed.
  12. PostRequestHandlerExecute
  13. ...

我试过 BeginRequest, 但是不行。我想原因是因为Page.Request在此之后才被创建或赋值,所以在BeginRequest中设置的文化会被覆盖了。直到 10. PostAcquireRequestState,才被准备好,只有在此之后我们才可以设置所需要的文化。
11和12之间的 "The event handler is executed."就应该是整个页面的生命周期的处理了。方法一使用InitializeCulture就是在这里。

这样就能够达到最初的目的了。但是还有一个小问题。按键的事件处理函数只会在设置了线程的文化之后才会被执行(不论是用PreRequestHandlerExecute,抑或InitializeCulture)。结果就是在页面的HTML传到浏览器时,所要设的文化与线程的文化不一样。而在其他的事件发生时,由于所要设的文化没有改变,就会和线程的文化一样。这样程序的行为就不一致了,容易使用户产生混淆。有一个不太完善的结局方法,就是在按键的事件处理函数最后加上下面这句,这样用户就能立刻看到改变了的语言了。

Response.Redirect(Request.Path);

缺憾是由于当前页面要重新生成,原先的状态(比如用户已经输入的东西)就不会保留了。

另外还有一个与此相关的问题,就是如何本地化sitemap(网页导航?)。请参考下面这篇文章。
ASP.NET 2.0: 在使用web.sitemap时,如何本地化网页导航(sitemap)

时间: 2025-01-19 18:27:37

ASP.NET 2.0: 如何实现按一个按键在两种语言之间切换的相关文章

textview-Android中一个TextView显示两种字体

问题描述 Android中一个TextView显示两种字体 我用了Spannable,实现了两种字体的显示前面是标题,后面是时间,但是,我想让标题在很短的时候,时间就自动换到第二行这个怎么去实现呢?如何进行判断(屏幕大小不一),求解!! 解决方案 SpannableString ss=new SpannableString(str); ss.setSpan( new StyleSpan(android.graphics.Typeface.BOLD_ITALIC), 0 , str.length(

html一个业务系统要求两种语言怎么实现比较好

问题描述 html一个业务系统要求两种语言怎么实现比较好 比如登录 中文显示 用户名 密码 英文显示 user pass 还有提示信息比如"用户名不能为空" 解决方案 jsp的做法http://my.oschina.net/songxinqiang/blog/192531http://blog.163.com/red_chenxi/blog/static/25027209200911152297499/ asp.net的做法http://blog.csdn.net/gxiangzi/a

vc60-VC(MFC)串口调试界面添加一个按钮控制两种颜色变换的指示灯。谢谢!!!

问题描述 VC(MFC)串口调试界面添加一个按钮控制两种颜色变换的指示灯.谢谢!!! 用MFC做出来一个只能发送和接受的界面之后,需要添加一个或两个按钮控制两种颜色变换.请问是指示灯吗?代码怎么写?谢谢. 解决方案 直接放一个static控件,准备两个图片,一个红灯一个绿灯 直接画http://blog.csdn.net/lujianfeiccie2009/article/details/7281996 当然,也可以不用先准备图片,而直接通过画圆.填充绘制出灯.

一个困惑,两种干货,三种能力

现在最火的电商模式莫非O2O,似乎人们已经渐渐将最早的盈利模式B2B淡忘.事实上,B2B网站仅仅是被遗忘,而没有被灭亡.很多有眼光的人依然奔波于B2B网站之间. 现在大家谈论最多的就是火得一塌糊涂的O2O,很多人已经忘记了作为最初电子商务盈利模式的B2B.其实作为元老,B2B还有它的活力和存在的价值,眼光独到的人依然在经营者B2B新站.从笔者接触到的大大小小B2B网站中,有的已经小有所成,有的却还是一片空白.对于新站的成长,笔者有经验要分享,不能说是电子商务解决方案,但是总结起来总会有帮助,它们

关于asp.net 1.0升级到asp.net 2.0时发现的一个有趣的问题

asp.net|问题     今天终于把原来的asp.net 1.0程序升级到asp.net 2.0了,vs 2005带有转换向导,一切自动化,操作比较方便.等它自动转换后,突然发现在App_Code文件夹里多了几个比较奇怪的文件都是stub开头的,并在一个mi开头的文件夹中(具体名称因为删除了,忘记了),因为原来根本就没有这些.cs文件,打开一看,原来都是抽象类,有几个还有抽象方法和共有字段.经过查看,才发现,原来在asp.net 1.0中有几个页面后置文件即.aspx.cs文件,里面有pub

“一个网络”,两种口味:响应性对适应性

来源:GBin1.com 编者的话:这是Mobify的CEO,Igor Faletski发表的一篇博文,Mobify,电子商务优化平台,为智能手机和平板电脑提供了适应网站的工具. 你可能听人说过,"我们生活在后电脑时代".这对网络开发者而言意味什么?它意味着你的网站,有30%到50%的流量来自于移动电子设备.它同时意味着,不久之后,桌面用户或者笔记本电脑用户将会成为网络的少数派. 面对这样用户模式构建的转变,我们又要如何应对呢?我们已经跨越了m-dot或是t-dot时代,步入了一个由响

ASP.NET Core 1.0中实现文件上传的两种方式(提交表单和采用AJAX)

Bipin Joshi (http://www.binaryintellect.net/articles/f1cee257-378a-42c1-9f2f-075a3aed1d98.aspx) Uploading files is a common requirement in web applications. In ASP.NET Core 1.0 uploading files and saving them on the server is quite easy. To that end

asp.net中url地址传送中文参数时的两种解决方案_实用技巧

在Web.comfig中配置 是一样的: <globalization requestEncoding="gb2312" responseEncoding="gb2312"/> 页面Header部分也都有 <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> 真是奇怪, 只好用了笨办法: 写参数: 复制代码 代码如下

我现在要用C#写一个程序实现两个数据库之间的定时查询和insert

问题描述 求如果用c#应该怎么写定时的时间是每天的19:00:00,求Demo 解决方案 解决方案二:我抛个砖,如果要求不严格可以使用定时器.每1分钟30秒啥的取一次时间,是这个时间久执行最今本的有3种计时器和一种基本计时方法,他们的用途不一样,不知道你用的什么方式,所以不给你推荐.你可以查找计时器或计时方式进行学习.这种情况我一般用计划任务,好处是不用维护程序,到点自己就跑了解决方案三:while(true){try{if(DateTime.Now.ToString("HH:mm:ss&quo