如何在运行时更改 CurrentCulture?

Posted

技术标签:

【中文标题】如何在运行时更改 CurrentCulture?【英文标题】:How to change CurrentCulture at runtime? 【发布时间】:2011-08-09 17:49:45 【问题描述】:

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

我需要根据两种文化更改表单中控件的属性 已指定 .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”,我如何引用回退资源文件?

【问题讨论】:

【参考方案1】:

改变当前的 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 文化是西班牙语,则 ASP.NET 使用 WebResources.es.resx 文件的编译版本。 如果当前 UI 文化不匹配,ASP.NET 使用资源回退。它首先搜索特定文化的资源。如果这些不可用,它会寻找中立文化的资源。如果未找到这些,ASP.NET 将加载默认资源文件。在本例中,默认资源文件为 WebResource.resx。

【讨论】:

好吧,可以说我更改了 CurrentUICulture 假设我不知道它是什么,我将如何将其更改回默认文化? 默认文化是后备文化对吧?它在编译时是已知的,对吗?这是 resorces1.aspx.resx 的文化,可能是美国。除非我误解了你的第二个问题,考虑到你现在知道如何在运行时改变文化,这似乎相当容易:) 是的,只是在我加载页面时保存它的名称。我以前没想过谢谢。 嗨,我有一个疑问。如果我在每个新线程上更改文化,如下所示:------ Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(culture);它是否每次都重新加载资源文件? 也适用于WinForms【参考方案2】:

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();
       

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

【讨论】:

【参考方案3】:

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

在我的实用程序类中: 公共字符串 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;
        
    

【讨论】:

以上是关于如何在运行时更改 CurrentCulture?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 jquery 更改 CurrentCulture

用于设置 CurrentCulture 的线程创建事件

运行时十进制符号更改

WPF XAML 绑定和 CurrentCulture 显示

String.format 根据 CurrentCulture 更改十进制变量

CurrentCulture 与 async/await,自定义同步上下文