CSharp - 在 C# winform中,.NET 在运行时更改语言

  显示原文与译文双语对照的内容
89 1

我想改变语言,但是当我编译这个异常时,会出现一个异常。上面写着

"找不到适合于指定区域性或者非特定区域性的任何资源。确保" system.type.resources"在编译时正确嵌入或者链接到程序集"mscorlib",或者者所需的所有卫星程序集都被加载并完全签名。"

 private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
 {
 if (comboBox1.SelectedItem.ToString() =="English")
 {
 Thread.CurrentThread.CurrentUICulture = new CultureInfo("En");
 ChangeLanguage("En");
 }
 else if (comboBox1.SelectedItem.ToString() =="German")
 {
 Thread.CurrentThread.CurrentUICulture = new CultureInfo("De");
 ChangeLanguage("De");
 }
 }
 private void ChangeLanguage(string lang)
 {
 foreach (Control c in this.Controls)
 {
 ComponentResourceManager resources = new ComponentResourceManager(typeof(Type));
 resources.ApplyResources(c, c.Name, new CultureInfo(lang));
 }
 }

任何建议?

时间:原作者:0个回答

75 4
 ComponentResourceManager resources = new ComponentResourceManager(typeof(Type));

构造函数的参数是错误的,你要告诉它为 System.Type. 找到资源,这就是为什么它不能找到" system.type.resources"。它永远不会找到那些。

你需要传递你想要本地化的表单的类型。使用 this.GetType() 尽管这可以能只是本地化你的选项表单,而不是应用程序中的它的他 Windows 。你可以迭代 Application.OpenForms() 。也有必要把本地化应用到所有的控件。不仅仅是表格上的那些,也不仅仅是在容器里面,像面板那样。因此:

 private static void ChangeLanguage(string lang) {
 foreach (Form frm in Application.OpenForms) {
 localizeForm(frm);
 }
 }
 private static void localizeForm(Form frm) {
 var manager = new ComponentResourceManager(frm.GetType());
 manager.ApplyResources(frm,"$this");
 applyResources(manager, frm.Controls);
 }
 private static void applyResources(ComponentResourceManager manager, Control.ControlCollection ctls) {
 foreach (Control ctl in ctls) {
 manager.ApplyResources(ctl, ctl.Name);
 applyResources(manager, ctl.Controls);
 }
 }

要小心 wiz-bang像这样。在使用你的程序时,没有人真正改变他们的母语。

原作者:
120 5
private void ChangeLanguage(CultureInfo culture)
{
 Application.CurrentCulture = culture;
 CultureInfo.DefaultThreadCurrentCulture = culture;
 CultureInfo.DefaultThreadCurrentUICulture = culture;
 Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(culture.Name);
 Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(culture.Name);
}

你需要为所有语言提供适当的资源,尽管。

原作者:
...