这是我第一次尝试本地化,所以请耐心等待。我已经阅读了它,但我仍在处理该主题的有限经验。
我已经通过了一个演示并让它工作正常,我觉得我理解幕后发生的事情。我将相同的概念移到我的实际应用程序中,它将无法工作。我已将Localizable属性设置为true并创建了英语和法语资源文件。
我已经确认我的应用程序仍然是从常规.resx文件而不是en-US.resx或法语文件中提取的。
我在InitializeComponent调用之前尝试过设置这些:
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");
我甚至试图明确地打电话给几个特定的人:
resources.ApplyResources(this, "$this", new CultureInfo("en-US"));
资源声明为:
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(myForm));
它仍然来自.resx文件。与我的测试项目有一点不同之处在于此表单继承自另一个表单,但我确保也设置了该表单的Localizable属性和资源文件。任何想法都将不胜感激。
编辑:我一直在努力解决这个问题。我有一个可行的测试项目,而我的主要应用程序没有。如果我将在测试中工作的表单复制到main,它就不起作用。如果我在测试中添加对主应用程序的引用,则主应用程序中的表单也不起作用,即使它是从有效的测试中直接复制的。有什么想法吗? 编辑:似乎主要的区别/问题是,当我的主应用程序调用具有此本地化表单的程序集时,正在运行的基本项目本身就是可执行文件。仍然不知道出了什么问题。我看到的很多教程都使用System.Resources.ResourceManager,但是当我将表单更改为localizable时,它会自动使用System.ComponentModel.ComponentResourceManager。编辑:我可以直截了当地说
resources.ApplyResources(this, "$this", new CultureInfo("fr-CA"));
它将忽略.fr-CA.resx文件中的$ this.Text并使用默认的.resx文件。我不明白。这就是我试图强迫它发挥作用。我仍然需要像平常一样设置文化。有没有人有任何想法?
答案 0 :(得分:0)
对线程CurrentCulture使用CreateSpecificCulture而不是新的CultureInfo()。
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(languageCode);
Thread.CurrentThread.CurrentUICulture = new CultureInfo(languageCode);
作为旁注,如果您的默认文化是英语,那么您不需要创建labels.en-US.rex。您可以将它放在labels.resx中,这将在前面加载并成为后备。为您提供少量文件,以保持同步。
答案 1 :(得分:0)
如果您将下面的相关行添加到Program.cs中的main方法(为上下文添加了其他行)
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
// THIS LINE - Only need to set UI culture the other one is for currency etc
Thread.CurrentThread.CurrentUICulture = new CultureInfo("fr-FR");
// Or whatever your form is called.
Application.Run(new Form1());
这可以保证您在任何InitialiseComponent方法调用之前设置文化。 我已经开始研究这项工作了。
答案 2 :(得分:0)
当您对表单进行本地化时,它会在构建的输出路径中为每种语言创建一个文件夹,其中包含资源文件projectname.resources.dll。
我有一个post build命令,将我们的.dll放在别处。我需要更改命令以同时推出资源文件,以便它们位于同一目录中。一旦我这样做,我就能让它发挥作用。