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 には、Culture を初期化するコードがあります。

Server.Transfer(Request.Path) を取り除き、ページの更新を避けたいのですが、まだ方法が見つかりません。

どんな助け/アイデアも大歓迎です!

ありがとう

4

2 に答える 2

0

InitializeCulture()メソッドはページのライフサイクルの早い段階で実行されるため、このメソッドで設定するカルチャは古いものです。1人のユーザーが選択したものではありません。したがって、ページを再度リクエストして、ユーザーが選択したカルチャを設定する必要があります。 Server.Transfer(Request.Path)によって何をしているのか。

'Server.transfer'を回避したい場合は、InitializeCulture()メソッドの実行中にカルチャの新しい値を取得し、その新しい値を割り当てる必要があります。これは、 InitializeCulture()メソッドの実行中に新しい値を取得する方法を示すリンクです。

お役に立てれば..

于 2012-09-10T14:23:14.640 に答える