首页 文章

如何在运行时更改CurrentCulture?

提问于
浏览
16

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

我需要根据指定.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”,我如何引用回退资源文件?

3 回答

  • 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 .

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

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

  • 43

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

    在我的实用程序类中: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;
            }
        }
    

相关问题