ascx用户控件内的本地化

时间:2012-09-10 07:24:07

标签: c# c#-4.0 localization ascx

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

然而,当我在下拉列表中进行更改时,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.NET!     

    

</asp:Content>

BasePage有初始化文化的代码

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

非常感谢任何帮助/想法!

由于

2 个答案:

答案 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控件将不会刷新/不显示​​结果。