2013-10-29 148 views
0

我建立了一個擁有6種不同語言支持的網站。整個語言系統變得瘋狂。它可以用請求的語言打開,也可以打開一半,另一半打開另一個。Asp.net全球化瘋狂

這是我如何構建系統的描述。

在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文件。我對每個實體都有擴展方法(順便說一句,我使用實體框架)來獲取給定語言的字符串。

當然你可能想知道爲什麼我在實體上寫了擴展方法。在我的數據庫中,沒有任何字符串在同一個表中。我的意思是這樣;

for「Products」表我有[ID(int),Name(int)]列。

for「LanguageStrings」表我有[ID(INT),EN(字符串),FR(字符串)]列。

並且產品上的「名稱」列被引用到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語言出現...

這真的是讓我瘋狂。它隨機發生。我無法弄清楚。

如果你們幫助我,那真的很棒!

回答

2

Is Statics.Language是一個靜態屬性嗎?如果是這樣,你可能會有多個請求修改它的值,而不是線程安全的方式。如果您覺得在Thread.CurrentUICulture之外您需要額外的商店來獲取此信息,則可能需要考慮使用ThreadLocal<LanguageEnum>值。

+0

謝謝你這麼多的評論。我已經能夠弄清楚了(我想)謝謝你... – paroxit

0

我在尋找線程安全操作(感謝Nicole Calinoiu在這裏)。我標記了我的靜力學。與[ThreadStatic]語言特性如下

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

屬性作爲解釋有本說明讓我使用屬性來解決這個問題,

「打上ThreadStaticAttribute靜態字段不共享每個正在執行的線程都有一個單獨的字段實例,並獨立地設置和獲取該字段的值,如果字段在不同的線程上訪問,它將包含不同的值。

系統工作正常,現在...