none
多言語に対応したページをResourceファイルを使用して作成したいのですが RRS feed

  • 質問

  • 具体的には、Login.aspxというページを作り、ドロップダウンにEnglish, Japaneseを入れ、

    ユーザーの選択でページ全体の言語を変更するロジックを作成します。

    ソースページでLabel1のTextに<%$Resouces: ui_message001 %>を入れます。

    App_LocalResourcesフォルダにLogin.aspx.resxとLogin.aspx.en.resxを作りstringとvalueを

    入れます。

    ビジネスロジックはドロップダウンが変更時のイベントで、下記になります。

     

     protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
        {
            string language = "";
            int langNo = DropDownList1.SelectedIndex;
            if (langNo == 0)
            {
                language = "ja";

            }
            else
            {
                language = "en";

            }
            Thread.CurrentThread.CurrentUICulture = new CultureInfo(language);

            string value = GetLocalResourceObject("ui_message002").ToString();
                   
        }

     

    最後のコードのGetLocalResourceObjectで実際に値が変わっているか確認したところ

    言語が変わっている事を確認しました。

    このGetLocalResourceObjectの値をLabel1に代入してもいいのですが、<%$ Resources: xxxxx %>

    で実現したいのですが、この方法ではどうしても日本語のままなのです。

     

     

    よろしくお願いします。

    2008年6月9日 17:55

回答

  • アドバイスありがとうございます。

    アドバイスも踏まえていろいろ試しましたが、今回は

    Label1.Text = GetLocalResources("ui_message001").ToString();

    で取得する事にしました。

    ありがとうございました。

    2008年6月10日 18:02

すべての返信

  • 処理順序の問題ですね。ポストバックが発生するには、対象のコントロールが必要で、
     
    ・ページが生成される
    ・ページ上のコントロールが生成される
    ・リクエストが解析される
    ・生成されたコントロールに対してポストバックの対象イベントが発生する
     
    というような順序ですが、aspx で記載された <%$ Resources: %> の記述は、このうちのコントロールの生成段階で実行されています。
    このため、ポストバックが発生した時点では、すでに Label1.Text などは設定済みになっていて、変更先の言語の値で再設定しなければならないことになります。
     
    リソースは読み込み機能は、ユーザのブラウザの言語設定にあわせて自動的に切り替わるように設計・想定されているので、通常は手動で切り替えることを想定されていないと思います。
     
     
    あまり汎用的な解決策はないと思います。
    おそらくテスト用に Label を使用されているだけで、実際には様々なコントロールやプロパティに影響があるでしょう。
     
    方法の1つとしては、DropDownList のポストバックでは、セッション情報などに言語設定を記録するのみにとどめておいて、自分自身へリダイレクトしてページそのものを生成しなおしてしまうという手が考えられますが、PreInit などのイベントでカルチャを設定するのは遅すぎるので、そのあたりの調整も難しいかもしれません。
    2008年6月9日 23:01
  • アドバイスありがとうございます。

    アドバイスも踏まえていろいろ試しましたが、今回は

    Label1.Text = GetLocalResources("ui_message001").ToString();

    で取得する事にしました。

    ありがとうございました。

    2008年6月10日 18:02