0

6 つの異なる言語をサポートする Web サイトを作成しました。そして、言語システム全体が狂ってしまいました。要求された言語で開くか、要求された言語の半分と別の言語の半分で開くか、完全に別の言語で開きます。

ここでは、システムの構築方法について説明します。

global.asax でこれを行いました。

protected void Application_AcquireRequestState(object sender,EventArgs e)

{
    //just to show my point
    if(RouteData.Values["language"] =! null){
    switch(RouteData.Values["language"].toString())
    {
       case "en-us":
             // at this point i'm changing the value of static enum that i've already defined in another class ,
          // just to reach it from other pages. You'll see what i mean in a second.
            Statics.Language = LanguageEnum.EN;
             break;
    }
    // Here is the culture changing codes. ConvertToCulture method is a custom method to get ISO code for language from LanguageEnum
    System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.CreateSpecificCulture(ConvertToCulture(Statics.Language));

    System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(ConvertToCulture(Statics.Language));
}

これは global.asax ファイルです。そして、特定の言語の文字列を取得するために、すべてのエンティティ(ちなみに、Entity Frameworkを使用しています)に拡張メソッドがあります。

もちろん、エンティティに拡張メソッドを記述した理由を不思議に思うかもしれません。私のデータベースでは、どの文字列も同じテーブルにありません。私はこのように意味します;

「製品」テーブルの場合、[ ID(int),Name(int) ] 列があります。

「LanguageStrings」テーブルの場合、[ ID(int) 、 EN(string) 、 FR(string)] 列があります。

また、製品の「名前」列は、LanguageStrings テーブルの ID 列を参照しています。

以下は拡張メソッドのサンプルです。

            public static string GetName(this Product pr)
    {

            try
            {
                return pr.LanguageStrings.GetType().
                    GetProperty(Statics.Language.ToString()).
                    GetValue(pr.LanguageStrings, null).ToString();
            }
            catch (Exception ex)
            {
                return "null";
            }


    }

私のウェブサイトのすべてのページで、これらの拡張機能を使用して、名前、説明、技術情報にアクセスしています。また、「.resx」ファイルから文字列を取得する方法もあります。これは次のとおりです。

     public static string ResGet(string key)
    {
        return Resources.Strings.ResourceManager.GetString(key);
    }

ポイントへ ;

たとえば、デフォルトのページがリクエストされた場合、すべて英語で表示されることがあります。ページのホールが英語で、ページの半分がフランス語である場合があります。時々それはすべてフランス語です。

リクエストした言語でページ全体を開くか、リクエストした言語の半分と別の言語の半分、または完全に別の言語で開きます。つまり、2つまたは1つの言語が表示されます...

それは本当に私を夢中にさせています。そして、それはランダムに起こります。私はそれを理解できませんでした。

あなたたちが私を助けてくれたら本当に素晴らしいことです!

4

2 に答える 2

0

スレッドセーフな操作を探しました (Nicole Calinoiu に感謝します)。そして、以下で説明するように、 Statics.Language プロパティを [ThreadStatic] 属性でマークしました

http://msdn.microsoft.com/en-us/library/system.threadstaticattribute.aspx

これを解決するために属性を使用するようにこのメモがありました、

「 ThreadStaticAttributeでマークされた静的フィールドは、スレッド間で共有されません。実行中の各スレッドには、フィールドの個別のインスタンスがあり、そのフィールドの値を個別に設定および取得します。フィールドが別のスレッドでアクセスされると、別の値が含まれます。 ."

システムは今のところ問題なく動作しています...

于 2013-10-30T08:53:25.543 に答える