0

----------------旧代码-------------------------------- -------------- 我创建了一个用户控件,它是一个必须本地化的主菜单。所以我在 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">&nbsp;&nbsp;&nbsp;
        <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();
    }

但是,当我在下拉列表中进行更改时,文化仍然相同。通常,当应用于 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.NET!

</asp:Content>

BasePage 有初始化文化的代码

我希望摆脱 Server.Transfer(Request.Path),避免刷新页面,但是我还没有找到方法。

任何帮助/想法将不胜感激!

谢谢

4

2 回答 2

0

InitializeCulture() 方法在页面生命周期的早期执行,因此您在此方法中设置的文化是旧的..不是用户选择的那个..所以您必须再次请求页面以设置用户选择的文化。那就是你通过 Server.Transfer(Request.Path) 做什么..

如果您想避免“Server.transfer”.. 您需要在 InitializeCulture() 方法执行期间获取文化的新值并分配该新值。这是向您展示如何在 InitializeCulture() 方法执行期间检索新值的链接。

希望这可以帮助..

于 2012-09-10T14:23:14.640 回答
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 控件将不会被刷新/显示结果。

于 2018-11-02T13:13:48.567 回答