软件的工业化生产

导航

如何实现按一个按键在两种语言之间切换

           一个网站要实现国际化和本地化, 往往需要在页面上放置一系列的语言选择Button,如果支持的语言比较多的话, 可能需要放置一个语言选择的下列框 。

           放置以后, 但如何用代码实现语言的切换,    Asp.Net没有 Session级别Culture设置的支持, 但有Application 和 Page级别的语言文化设置。 但切换是需要Session或者Profile级别的语言文化设置的支持。
           
             当然我们可以通过override每个页面的InitializeCulture函数或者增加Page的继承层次来实现。 如果每个Page都Override InitializeCulture function, 肯定不是一个很好的办法。通过增加Page的继承层次关系虽然可以将逻辑集中写在一处, 但还是需要更改每个Asp Page的Class。需要为此改动的文件肯定不少。 我们是不是有办法只在一处编码就可以实现语言切换呢。
          我从网上找了一些资料, 有人建议在HttpApplication类上想办法,因为对于一个Web Site只有一个HttpApplication的实例。 即在Global.asap文件里。 但是这个办法是不行的,虽然Page的不少事件都曝露在HttpApplication类的实例里, 
 但HttpApplication只提供了很少的几个Event,事件的粒度太大,并没有办法通过HttpApplication来改写Page基本特别是InitializeCulture的实现逻辑 , 此办法是行不同的。

            我们知道InitializeCulture是根据用户IE的语言文化设置老工作的,这个信息是通过Request对象来获取的, 但Request对象这时是值读的。
从现在来看, 要想实现语言的切换, 只能Overrride InitializeCulture 函数了。

            解决了在何处编写语言切换的代码后,那么我们如何获取和保存用户请求的语言要求呢。 首先, 我想大部分人都会想到在语言切换Button的Click事件里获取。这样做是有问题的, 因为Button Click事件发生在InitializeCulture 调用之后, 如果这时将用户请求的语言保存在Session或Ptofile里, 用户需要再次访问才能切换到所选语言。 有人提出,这时, 将页面Redirect, 但这会带来另外的一些问题, 比较多了一次访问, 用户未保存的的数据会丢失。
        其实这个问题的解决很简单, 通过对Asp.Net的机制的分析, 我们可以在系统调用InitializeCulture 的时候,直接访问Form变量就可以读出用户请求的用户选择。
 
          下面是有关asp.net2.0 语言切换所需要的代码, 希望对大家有一定的帮助
 1    /// <summary>
 2        /// Please put language switch button in asp page and set button name not id  according to configuration.
 3        /// please do not write any code for click event of language button.
 4        /// button can html sumbit or imageBttuon type.
 5        /// </summary>

 6        private string[] LanguageButtuonIds = new string[] "ChineseButton""EnglishButton""JapaneseButton" };
 7        private string[] RequestLanguagNames = new string[] "zh-CN""en"  ,"ja"};
 8        
 9        /// <summary>
10        /// Please put language switch combox in asp page and set combox name not id  according to configuration.
11        /// Please do not write any code for  event of  selectedIndexChanged of LanguageCultureSelectCombox also.
12        /// </summary>

13        const string LanguageCultureSelectCombox = "LanguageCultureSelectCombox";
14
15        /// <summary>
16        /// Get Request Language by user through query form variants..   
17        /// </summary>
18        /// <returns></returns>

19        private string GetRequestLanguage()
20        {
21            for (int indexer = 0; indexer <= LanguageButtuonIds.Length - 1; indexer++)
22            {
23                //for submit buttoon
24                if (string.IsNullOrEmpty(System.Web.HttpContext.Current.Request.Form [LanguageButtuonIds[indexer]]) == false)
25                    return RequestLanguagNames[indexer];
26                // for imageButton
27                if (string.IsNullOrEmpty(System.Web.HttpContext.Current.Request.Form[LanguageButtuonIds[indexer]]+".x"== false)
28                    return RequestLanguagNames[indexer];
29            }

30            return string.Empty;
31        }

32
33        /// <summary>
34        /// Reset culture of page and request language  will apply immediately without redirect. 
35        /// You  need override InitializeCulture function for all pages in whole web site.
36        /// You can use an inherit page class which only override InitializeCulture function once in base page also.
37        /// </summary>

38        protected override void InitializeCulture()
39        {
40            base.InitializeCulture();
41
42            string requestLanguageName = GetRequestLanguage();
43            if (string.IsNullOrEmpty(requestLanguageName) == false)
44                Session["CurrentRequestLanguage"= requestLanguageName;
45            else if (System.Web.HttpContext.Current.Session != null)
46                requestLanguageName = (string)Session["CurrentRequestLanguage"];
47
48            if (string.IsNullOrEmpty(requestLanguageName) == false)
49            {
50                System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.CreateSpecificCulture(requestLanguageName);
51                System.Threading.Thread.CurrentThread.CurrentUICulture = System.Globalization.CultureInfo.CreateSpecificCulture(requestLanguageName);
52            }

53        }

54

posted on 2008-06-05 11:33  堂吉柯德  阅读(746)  评论(0编辑  收藏  举报