2011-08-09 142 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年前回答:) –