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

Var*_*jan 9 .net c# localization winforms

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

Dun*_*can 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();
    }
}
Run Code Online (Sandbox Code Playgroud)


Mer*_*ham 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.

编辑:

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

以下是一些如何刷新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");
}
Run Code Online (Sandbox Code Playgroud)

你可以从中获取一些InitializeComponent().