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

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

从谷歌搜索结果中删除: 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()获取一些。

迟到了派对。 但这是我提出的解决方案:

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

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

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

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

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

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

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

 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;