我尝试在运行时设置应用程序的CurrentUICulture。但是,我表单中的菜单项保持不变。我是否还需要做一些改变CurrentUICulture的事情?
答案 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;