我有一个带有语言选择器下拉列表的母版页
它有多个使用母版页的子页面,但是在子页面中(我创建了一个basePage类,然后让页面继承)我覆盖了initializeCulture。 像这样:
protected override void InitializeCulture()
{
String selectedLanguage = Common.SessionManager.Language;
if (selectedLanguage == "")
{
selectedLanguage = ConfigurationManager.AppSettings.Get("defaultLanguage");
}
if (selectedLanguage == "")
{
selectedLanguage = "nl-BE";
}
UICulture = selectedLanguage;
Culture = selectedLanguage;
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(selectedLanguage);
Thread.CurrentThread.CurrentUICulture = new CultureInfo(selectedLanguage);
base.InitializeCulture();
}
在下拉列表的SelectedIndexChanged事件中,我在会话中设置了新语言 像这样:
protected void LanguageSelectorSelectedIndexChanged(object sender, EventArgs e)
{
string sCulture = LanguageSelector.SelectedValue;
Common.SessionManager.Language = sCulture;
}
但是initializeCulture已经被解雇了。
所以我有一种延迟效果,页面加载以前的语言,并在下一次回发中正确翻译。
我无法再次调用initializeCulture,因为我在主页上,而且我无法访问子页面的basePage类。
任何人都知道如何解决这个问题?
答案 0 :(得分:1)
您可以尝试按表单发布值获取所选语言:
protected override void InitializeCulture()
{
String selectedLanguage = Common.SessionManager.Language;
if (Request.Form.ContainsKey(myLanguageDropDown.ClientID)
selectedLanguage = Request.Form[myLanguageDropDown.ClientID];
if (selectedLanguage == "")
{
...
答案 1 :(得分:1)
您不能将事件处理程序用于下拉列表,因为这发生在InitializeCulture()
之后。
InitializeCulture()
在请求值加载到表单控件之前发生。
因此,从下拉列表中获取值的正确方法是不使用事件处理程序,并使用Request.Form["yourddlid"]
中的InitializeCulture()
来获取所选值。
答案 2 :(得分:0)
我的解决方案是在更改语言后将页面重定向到自身。
答案 3 :(得分:0)
与“重定向到自身”的答案相同,您可以使用Server.Transfer()而不是Redirect,避免往返客户端。像这样的东西(考虑它在Default.aspx页面中):
protected override void InitializeCulture()
{
if (Session["LCID"] != null)
{
int lcid = (int)Session["LCID"];
CultureInfo c = new CultureInfo(lcid);
Thread.CurrentThread.CurrentCulture = c;
}
base.InitializeCulture();
}
protected void comboCultures_SelectedIndexChanged(object sender, EventArgs e)
{
CultureInfo c = new CultureInfo(Thread.CurrentThread.CurrentCulture.LCID);
if (comboCultures.SelectedItem != null)
c = CultureInfo.GetCultureInfo(Convert.ToInt32(comboCultures.SelectedItem.Value));
Session["LCID"] = c.LCID;
Server.Transfer("Default.aspx");
}
我已将文化的LCID存储在组合框值中,但这并不重要。该技术的核心是用户Server.Transer(pagename),以便重新启动页面工作流,并且Page.InitializeCulture有机会从Session获取“当前”值。
答案 4 :(得分:0)
protected override void InitializeCulture(){
Page.UICulture = Request.Form["ddlLanguage"];
}