如何实现按一个按键在两种语言之间切换
一个网站要实现国际化和本地化, 往往需要在页面上放置一系列的语言选择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 语言切换所需要的代码, 希望对大家有一定的帮助
放置以后, 但如何用代码实现语言的切换, 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
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