5

アラビア語と英語から始まる 2 つの言語を使用した多言語 Web サイトに取り組んでいます

IE と FireFox で言語をアラビア語 (ar-ae) に設定しましたが、常に英語版が表示されます。この問題をトラブルシューティングすることはできません。

サイト構造

Default.aspx
 en/Default.aspx
 ar/Default.aspx

問題は、URL を次のように使用すると、アラビア語が言語として選択されている場合はhttp://localhost:49831/site/Defualt.aspx正常に動作し、アラビア語版にリダイレクトされることです。ar/Default.aspx

しかし、URLを使用するhttp://localhost:49831/site/ と、常に英語版にリダイレクトされます en/Default.aspx

何が間違っているのかわかりません。

Default.aspx を使用して、既定のブラウザー言語を検出し、それに応じてリダイレクトします

Default.aspx.cs ファイルのコード

    // Localization and Globalization code
    protected override void InitializeCulture()
    {
        String lang = Request["Language"];

        Session["lang"] = Helper.DetectLanguage(lang);
        //Set Direction of page LTR/RTL
        if (Session["lang"] == "ar-AE")
        {
            Session["PageDIR"] = "rtl";
        }
        else
        {
            Session["PageDIR"] = "ltr";
        }

        base.InitializeCulture();
    }

   public static String DetectLanguage(String lang)
    {
        String LangCode = lang;

        if (!string.IsNullOrEmpty(lang))
        {
            lang =  lang.ToLower();
        }

        String Lang2Char;
       CultureInfo ci = System.Threading.Thread.CurrentThread.CurrentUICulture;
        String LangName = ci.Name.ToString().ToLower();
        //check leng & if length is less than 2 then set english as default language.
        if (LangName.Length > 1)
        {
             Lang2Char = LangName.Substring(0, 2);
        }
        else
        {
             Lang2Char = "en";
        }

        // if QueryString is not null then execute foollowinf if block
        //If Language is present in Querystring then excute if part else, else part
        if (lang != null)
        {
            switch (lang)
            {
                case "en-us":
                    Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
                    Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");
                    LangCode = "en-US";
                    break;
                case "ar-ae":
                    Thread.CurrentThread.CurrentCulture = new CultureInfo("ar-AE");
                    Thread.CurrentThread.CurrentUICulture = new CultureInfo("ar-AE");
                    LangCode = "ar-AE";
                    break;
                default:
                    Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
                    Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");
                    LangCode = "en-US";
                    break;
            }
        }
        // if lang query string is null then set the language based on following logic
        else
        {
            switch (Lang2Char)
            {
                case "en":
                        Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
                        Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");
                        LangCode = "en-US";
                        break;
                case "ar":
                        Thread.CurrentThread.CurrentCulture = new CultureInfo("ar-AE");
                        Thread.CurrentThread.CurrentUICulture = new CultureInfo("ar-AE");
                        LangCode = "ar-AE";
                        break;
                default:
                        Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
                        Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");
                        LangCode = "en-US";
                        break;
            }

        }
        return LangCode;
    }

このコードが機能するように定義するにはどうすればよいですか。Global.asx ファイルで CurrentUICulture を定義する方が良いですか?

4

2 に答える 2

7

多言語サイトを扱う場合は、少し異なるアプローチを取ることをお勧めします。まず、複数のデフォルト ページを使用する必要はありません。必要なのは 1 つだけです。

それでは、これを行う方法を説明しましょう。

まず、デフォルトのサイト グローバリゼーションを web.config 内で設定できます。

  <system.web>
    <globalization uiCulture="sl-SI" culture="sl-SI" enableClientBasedCulture="false"/>
  </system.web>

enableClientBasedCulture="true"可能であれば、クライアント サイトのグローバリゼーションを強制するように設定できます。そうでない場合は、デフォルトのカルチャが行われます。

次に、asp.net ページ内でグローバリゼーションを設定する方法 (強制、ユーザーが必要とする場合):

    internal static void ChangeLanguage(string languageCode, System.Web.UI.Page page)
    {
        CultureInfo ci = new CultureInfo(languageCode);
        page.Session[cLanguageSessionKey] = ci;
        //save to user profile is required (just a sample)...
        if (HttpContext.Current.User.Identity.IsAuthenticated)
        {
            Entities.MembershipUserFull user = Services.MembershipUserManager.GetMembershipUserFull(HttpContext.Current.User.Identity.Name);
            user.LanguageId = Services.LanguageManager.GetLanguageIdFromLanguageCode(languageCode);

            //save profile... 
            user.SaveProfile();
        }

        //reload page. New culture will take efect...
        page.Response.Redirect(page.Request.Url.AbsoluteUri);
    }

ページのオンロードは次のとおりです。

        //set language if required...
        if (User.Identity.IsAuthenticated)
        {
            Entities.MembershipUserFull user = Services.MembershipUserManager.GetMembershipUserFull(HttpContext.Current.User.Identity.Name);
            if (user != null && user.LanguageId != null)
            {
                GP.Solutions.Entities.Language language = Services.LanguageManager.GetLanguage((int)user.LanguageId);
                if (Thread.CurrentThread.CurrentUICulture.Name != language.Code)
                {
                    ChangeLanguage(language.Code, this);
                }
            }
        }

そして最後に、Web コントロールでの多言語サポートの処理方法:

2 つのグローバル リソースがあることに注意してください (サポートされている言語ごとに 1 つ。言語コードのないものがデフォルトです)。

ここに画像の説明を入力

ラベルにテキストを表示する必要があるとしましょう:

<asp:Label ID="Label1" runat="server" CssClass="AdvertPreTitle" Text='<% $resources:AppResource,MostPopularService %>'></asp:Label>

MostPopularService は、現在の UI カルチャに従って特定の言語リソースから読み取られることに注意してください。リソースファイルからのスニップは次のとおりです。

ここに画像の説明を入力

最終的に、すべての言語を処理するデフォルト ページは 1 つしかありません。

于 2012-12-17T13:54:20.880 に答える
2

このMSDNリンクによると、enableClientBasedCulture="true"もう機能しません。代わりに、次の操作を行います。

  <system.web>    
     <globalization culture="auto" uiCulture="auto"/>
  </system.web>
于 2014-02-05T21:40:40.557 に答える