----------------旧代码----------------------------- ----------------- 我创建了一个用户控件,它是一个主菜单,必须进行本地化。所以我在App_LocalResources中创建了3个资源文件,我有一个下拉列表来更改所选的语言。
主菜单如下所示: -
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="MainMenu.ascx.cs" Inherits="GGX4._2.MainMenu" %>
<div>
<asp:DropDownList ID="ddlLangs" runat="server"
onselectedindexchanged="ddlLangs_SelectedIndexChanged" AutoPostBack="True" meta:resourcekey="ddlLangsResource1">
<asp:ListItem Text="English" Value="en-US" meta:resourcekey="ListItemResource1"></asp:ListItem>
<asp:ListItem Text="German" Value="de-DE" meta:resourcekey="ListItemResource2"></asp:ListItem>
<asp:ListItem Text="Spanish" Value="es-ES" meta:resourcekey="ListItemResource3"></asp:ListItem>
</asp:DropDownList>
</div>
<div>
<table>
<tr>
<td width="100%" nowrap height="16">
<img border="0" src="Images/GREENSQUARE.gif" width="16" height="16"><b><font size="2" face="Arial">
<asp:HyperLink ID="hypIntroduction" runat="server" NavigateUrl="Overview.htm"
meta:resourcekey="hypIntroductionResource1" >[hypIntroduction]</asp:HyperLink>
</tr>
<tr>
<td width="100%" nowrap height="16">
<img border="0" src="Images/GREENSQUARE.gif" width="16" height="16"><b><font size="2" face="Arial">
<asp:HyperLink ID="hypGlobalGradingMethodology" runat="server" NavigateUrl="GGMethodology.htm"
meta:resourcekey="hypGlobalGradingMethodologyResource1" >[hypGlobalGradingMethodology]</asp:HyperLink>
</td>
</tr>
<tr>
<td width="100%" nowrap height="16">
<img border="0" src="Images/Redsquare.gif" width="16" height="16"><b><font size="2" face="Arial">
<asp:HyperLink ID="hypDeterminingBusiness" runat="server"
NavigateUrl="ScopematrixGeneral.htm"
meta:resourcekey="hypDeterminingBusinessResource1">[hypDeterminingBusiness]</asp:HyperLink>
</td>
</tr>
<tr>
<td width="100%" nowrap height="16"><font size="2" face="Arial">
<img border="0" src="Images/BLUEBULLET.gif" width="16" height="16">
<asp:HyperLink ID="hypMethodology" runat="server"
NavigateUrl="methodology.htm"
meta:resourcekey="hypMethodologyResource1">[hypMethodology]</asp:HyperLink>
</font>
</td>
</tr>
</table>
</div>
在后面的代码中我有以下内容: -
string defaultLanguage = Thread.CurrentThread.CurrentUICulture.ToString();
protected void Page_Load(object sender, EventArgs e)
{
this.InitializeCulture();
}
protected void InitializeCulture()
{
if (String.IsNullOrEmpty(CurrentCulture))
{
CurrentCulture = defaultLanguage;
}
if (!String.IsNullOrEmpty(CurrentCulture))
{
try
{
Thread.CurrentThread.CurrentCulture = new CultureInfo(CurrentCulture);
Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;
}
catch
{
throw;
}
}
}
public String CurrentCulture
{
get
{
if (null != Session["PreferedCulture"])
return Session["PreferedCulture"].ToString();
else
return "en-US";
}
set
{
Session["PreferedCulture"] = value;
}
}
protected void ddlLangs_SelectedIndexChanged(object sender, EventArgs e)
{
Session["PreferedCulture"] = ddlLangs.SelectedValue;
InitializeCulture();
}
然而,当我在下拉列表中进行更改时,Culture会进行同样的修改。通常,当应用于System.Web.UI.Page时,我会覆盖InitializeCulture(),但是我找不到在ascx中执行此操作的方法。
我怎样才能做到这一点?
感谢您的帮助和时间
-------------新代码-------------------------------- ---------------
我决定让事情变得更简单,我已经设法实现了我想要的东西,但是我完全不喜欢页面刷新,并且希望不用。
所以基本上我已经创建了一个现在正在运行的简单示例: -
Site.Master只有下拉列表作为额外代码: -
<div>
<asp:DropDownList ID="ddlLangs" runat="server" onselectedindexchanged="ddlLangs_SelectedIndexChanged" AutoPostBack="True"
meta:resourcekey="ddlLangsResource1">
<asp:ListItem Text="English" Value="en-US"
meta:resourcekey="ListItemResource1" ></asp:ListItem>
<asp:ListItem Text="German" Value="fr-FR" meta:resourcekey="ListItemResource2" ></asp:ListItem>
<asp:ListItem Text="Spanish" Value="it-IT"
meta:resourcekey="ListItemResource3" ></asp:ListItem>
</asp:DropDownList>
</div>
后面的代码如下: -
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
if (Session["PreferredCulture"]!= null)
ddlLangs.SelectedValue = Session["PreferredCulture"].ToString();
}
}
protected void ddlLangs_SelectedIndexChanged(object sender, EventArgs e)
{
Session["PreferredCulture"] = ddlLangs.SelectedValue;
Server.Transfer(Request.Path);
}
Default.aspx有MainMenu UC和样本标签,但是它继承自BasePage: -
<asp:Content ID="MenuContent" runat="server" ContentPlaceHolderID="MainMenuContent">
<uc:MainMenu runat="server" ID="ucMainMenu" />
</asp:Content>
BasePage有初始化文化的代码
我希望摆脱Server.Transfer(Request.Path),并避免刷新页面,但我还没有找到方法。
非常感谢任何帮助/想法!
由于
答案 0 :(得分:0)
InitializeCulture()方法在页面生命周期的早期执行,因此您在此方法中设置的文化是旧的...不是用户选择的文件。因此您必须再次请求页面以设置文化用户具有select.that是你在做什么Server.Transfer(Request.Path)..
如果你想避免&#39; Server.transfer&#39; ..你需要在InitializeCulture()方法执行期间获得文化的新值并分配该新值。 here is the link这将向您展示如何在InitializeCulture()方法执行期间检索新值。
希望这会有所帮助..
答案 1 :(得分:0)
这是一篇很老的文章,但是由于本地化可能有些棘手,所以我有一些技巧。 对于每个页面,您都需要使用以下代码覆盖web.ui.page。因此,我要做的是创建一个继承自web.ui.page的新类,并使aspx页面继承自该新类:在这种情况下,是 PortalPage。
public class PortalPage:System.Web.UI.Page
{
protected override void InitializeCulture()
{
string _language = (string)Session["Language"];
if (_language == null)
{
_language = ConfigurationManager.AppSettings["DefaultLanguage"];
Session["Language"] = _language;
}
Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.CreateSpecificCulture(_language);
Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(_language);
base.InitializeCulture();
}
}
接下来,而不是从System.Web.UI.Page继承您的网页,而是从新类继承。在此示例中:PortalPage
public partial class pages_Databases : PortalPage
{
protected void Page_Load(object sender, EventArgs e)
{
}
}
然后将所有资源文件(.resx)放在适当的子文件夹(App_LocalResources)中,并确保您的resx文件名与Web控件匹配。
最后:重新编译!或重建!您的Web控件将不会刷新/不显示结果。