2011-08-09 92 views
12

我需要根據每種文化的資源文件在運行時更改文化。如何在運行時更改CurrentCulture?

我需要改變我的形式控件的屬性,根據兩種文化 已指定.resx文件

resorces1.aspx.resx // default 
resorces1.aspx.he-IL.resx // hebrew culture 

我可以加載頁面或者與後備資源,或者在頁面加載給予UICulture = "he-IL"價值,並與所需的資源加載罰款。

問題是我需要在運行時進行這些更改。

1 ..我改變值上的一個按鈕點擊事件發生後

btn_change_Click(....) 
    { 
     UICulture = "he-IL" ; 
    } 

它仍然返回到「EN-US」的初始值

我如何提交修改到的UICulture在運行時?

2 ..如果我不知道它是否是「en-US」,我該如何引用備用資源文件?

回答

36

改變當前的UI文化:

System.Threading.Thread.CurrentThread.CurrentUICulture = new CultureInfo("he-IL"); 

或更好,取回他-IL文化的緩存只讀實例:

System.Threading.Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("he-IL"); 

在運行時,ASP.NET使用與CurrentUICulture屬性的設置最匹配的資源文件。線程的UI文化根據頁面的UI文化進行設置。例如,如果當前的UI文化是西班牙語,則ASP.NET將使用WebResources.es.resx文件的編譯版本。 如果當前UI文化不匹配,則ASP.NET使用資源後備。它首先搜索特定文化的資源。如果這些不可用,它會搜索中性文化的資源。如果沒有找到,ASP.NET會加載默認資源文件。在這個例子中,默認資源文件是WebResource.resx。

+0

確定,所以可以說,我改變了的CurrentUICulture 如何將我改回了默認的文化 假設我不知道它是什麼? –

+0

默認文化是後備文化的權利?它在編譯時是正確的嗎?這是resorces1.aspx.resx的文化,可能的en-US。除非我誤解,似乎很容易做到考慮到你現在知道如何改變這種文化在運行時你的第二個問題:) – maxbeaudoin

+0

的確是這樣, 生病只是保存它的名稱當我加載頁面。 我沒想到 感謝之前。 –

0

最大設置我在正確的道路上,沒有什麼我還沒有遇到過的,但它確實幫助我做一個小的調整就此事MSDN文檔:

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

string defaultLanguage = Thread.CurrentThread.CurrentUICulture.ToString();       
    protected void Page_Load(object sender, EventArgs e) 
    { 

    } 

    protected override void InitializeCulture() 
    { 
     if (Request.Form["ListBox1"] != null) 
     { 
      String selectedLanguage = Request.Form["ListBox1"]; 
      UICulture = selectedLanguage; 
      Culture = selectedLanguage; 

      Thread.CurrentThread.CurrentCulture = new CultureInfo(selectedLanguage); 
      Thread.CurrentThread.CurrentUICulture = new CultureInfo(selectedLanguage); 
     } 
     else 
     { 
      Thread.CurrentThread.CurrentCulture = new CultureInfo(defaultLanguage); 
      Thread.CurrentThread.CurrentUICulture = new CultureInfo(defaultLanguage); 
     }    
     base.InitializeCulture(); 
    } 

列表框包含不同的文化,第一個和選定的一個也是默認文化,我保存在頁面加載,在其他加載它沒有效果,因爲列表框已經作爲一個值。

0

我沒有能夠得到這裏描述的「後備」工作。我正在使用語言的全局資源文件,並且當用戶選擇的文化文件中缺少標籤時,它不會默認返回默認文化中的標籤? 我最終創建了一個方法來執行回退。我正在尋找更好的方法來臨時改變文化(當標籤沒有找到),並偶然發現這篇文章,所以我想我會和一些內容。

在一個實用工具類礦井: 公共字符串getLabelResource(字符串sLabelID,字符串sLangCd) {

 cLogger oLogger = new cLogger(); 

     try 
     { 
      Object sLabel; 
      sLabel = HttpContext.GetGlobalResourceObject("{filename}", sLabelID); 
      if (sLabel.ToString() == "") //label was not found in selected lang 
      { 
       //default to US language resource label 
       Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("en-US"); 
       sLabel = HttpContext.GetGlobalResourceObject("{filename}", sLabelID); 
       //switch global lang back to selected 
       Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(sLangCd); 
      } 
      return sLabel.ToString(); 

     } 
     catch (Exception ex) 
     { 
      oLogger.LogWrite("cUtils.cs", "getLabelResource", ex.Message, false); 
      return String.Empty; 
     } 
    } 
+0

克...感謝這在2年前回答:) –