如何实现按一个按键在两种语言之间切换
一个网站要实现国际化和本地化, 往往需要在页面上放置一系列的语言选择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
/// <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 buttoon24
if (string.IsNullOrEmpty(System.Web.HttpContext.Current.Request.Form [LanguageButtuonIds[indexer]]) == false)25
return RequestLanguagNames[indexer];26
// for imageButton27
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



浙公网安备 33010602011771号