如何在设置CurrentUICulture后更新Window窗体UI?

时间:2011-07-12 08:54:01

标签: c# .net winforms localization

我尝试在运行时设置应用程序的CurrentUICulture。但是,我表单中的菜单项保持不变。我是否还需要做一些改变CurrentUICulture的事情?

5 个答案:

答案 0 :(得分:9)

再来一次晚会。但这是我提出的解决方案:

public partial class MainForm : Form {

    public MainForm() {
        InitializeComponent();
    }

    private void mnuCultureEnglish_Click( object sender, EventArgs e ) {
        Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo( "en-US" );
        Controls.Clear();
        InitializeComponent();
    }

    private void mnuCultureGerman_Click( object sender, EventArgs e ) {
        Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo( "de-DE" );
        Controls.Clear();
        InitializeComponent();
    }
}

答案 1 :(得分:7)

从谷歌搜索结果中删除:http://bytes.com/topic/net/answers/468556-change-currentuiculture-controls-doesnt-refresh

  

更改“CurrentUICulture”不会自动在所有UI控件中生效。

     

更改“CurrentUICulture”只会影响一些与本地化相关的API。例如,“System.Resources.ResourceManager.GetString(..。)”,然后它将使用当前的“CurrentUICulture”来加载合适的字符串资源。

     

对于Windows.Form UI控件,您需要在更改“CurrentUICulture”后重新加载所有资源字符串。

假设您的资源实际上是本地化的(请注意您必须手动执行此操作 - 没有任何内容可以自动执行此操作),您可以在显示第一个窗口之前设置UI文化。例如。在Main

修改

另外,请确保在UI线程上设置CurrentUICulture

以下是一些有关如何刷新UI的示例代码(再次,从此答案顶部的链接中窃取):

System.Threading.Thread.CurrentThread.CurrentUICulture = new 
System.Globalization.CultureInfo(lang); //my selected lang from menu

ReloadControlString();

//...

private void ReloadControlString()
{
    System.Resources.ResourceManager resources = new 
    System.Resources.ResourceManager(typeof(FormMain));

    this.menuApp.Text = resources.GetString("menuApp.Text");
}

您可以从InitializeComponent()获取部分内容。

答案 2 :(得分:1)

假设您已使用VS或兼容的实用程序来创建.resx文件:

var crm = new ComponentResourceManager(typeof(My_Form));
crm.ApplyResources(this.my_button, "my_button");
//    etc ... 

这可能会为您手动设置所有可本地化的属性以及必须使用GetXXX(字符串)重载节省一些手工劳动。

答案 3 :(得分:1)

至少可以在更改CurrentUICulture后尝试此循环:

foreach (Control ctl in this.Controls)
        {
            resources.ApplyResources(ctl, ctl.Name);
        }

答案 4 :(得分:-1)

请你试试下面提到的代码,我想这会帮助你摆脱它。

CultureInfo _cinfo = new CultureInfo("fr-FR");

Thread.CurrentThread.CurrentCulture = _cinfo;
Thread.CurrentThread.CurrentUICulture = _cinfo;

//After changing the Culture just access the value of relevant culture through resource file
label1.text = CommonResource.Ready;