如何在运行时更改CurrentCulture?

我需要根据每种文化的资源文件在运行时更改文化。

我需要根据指定.resx文件的两种文化来更改表单中控件的属性

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

我可以使用fallback资源加载页面,或者在pageload上给出UICulture = "he-IL"值,并且它可以正常加载所需的资源。

问题是我需要在运行时进行这些更改。

1 ..在我更改按钮单击事件的值后

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

它仍然返回到“en-US”的初始值

如何在运行时提交对UICulture的更改?

2 ..如果我不知道它是“en-US”,我如何引用回退资源文件?

更改当前的UI文化:

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

或者更好,检索he-IL文化的缓存只读实例:

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

在运行时,ASP.NET使用与CurrentUICulture属性的设置最匹配的资源文件。 线程的UI文化是根据页面的UI文化设置的。 例如,如果当前UI文化是西class牙语,则ASP.NET使用WebResources.es.resx文件的编译版本。 如果当前UI文化不匹配,则ASP.NET使用资源回退。 它首先搜索特定文化的资源。 如果没有这些,它会搜索中立文化的资源。 如果找不到这些,ASP.NET将加载默认资源文件。 在此示例中,默认资源文件是WebResource.resx。

我无法得到这里描述的“后备”工作。 我正在使用全局资源文件作为语言,当用户选择的文化文件中缺少标签时,它不会默认返回默认文化中的标签? 我最终创建了一个执行回退的方法。 我正在寻找更好的方法来改变文化(当没有找到标签时)并偶然发现这篇文章,所以我想我会和一些内容。

在我的实用程序类中:public String getLabelResource(String sLabelID,String 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; } } 

max让我走上了正确的道路,以前我没有遇到任何事情,但它确实帮助我对这个问题的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(); } 

列表框包含不同的文化,第一个和选定的一个也是默认文化,我保存在页面加载,在其他加载它没有效果,因为列表框已经作为值。