我的问题是:我正在使用MonoDevelop(这是我正在处理的一些项目的首选环境),我想弄清楚如何使用资源文件来本地化消息,以及如何将它们作为嵌入式资源正确地包含在项目中。
我的目标是拥有一个资源文件,其中包含消息键和值的简单名称 - 值对,并且有用于它们本地化字符串的单独文件,例如:
Messages.resources
Hello.World = Hello World
Goodbye.Cruel.World = Goodbye, Cruel World
Messages.de.resources
Hello.World = Hallo Welt
Goodbye.Cruel.World = Auf Wiedersehen, grausame Welt
我遇到了一些问题。
首先,MonoDevelop的.resources文件和Visual Studio的资源概念有什么区别(如果有的话)?据我所知,MonoDevelop(和SharpDevelop)允许您创建.resources文件,而Visual Studio则使用.resx文件并通过resgen实用程序将它们编译成二进制文件类型的.resources文件。在MonoDevelop中使用资源时,是否需要使用resgen编译资源(例如Messages.resources)?当我尝试使用MonoDevelop通过向导创建的直接.resources文件时,会出现以下错误:
"Stream is not a valid resource file."
其次,一旦我生成了适当的资源文件,我可以将它们嵌入到我的项目中,这样如果我理解正确的话,资源就成为程序集的一部分。但是,如果我有两个文件Messages.resources和Messages.de.resources,至少在MonoDevelop中,它们被分配相同的ID值。我需要将默认语言环境包含在项目中,然后为每个支持的语言环境创建一个单独的项目吗?接下来,C#如何区分我的Messages.resources和Messages.de.resources文件(或任何其他文件)?
我目前正在尝试使用以下代码解决我的消息资源:
...
public string Translate(string messageKey, CultureInfo cultureInfo) {
ResourceManager resourceManager = new ResourceManager("My.Project.Messages", Assembly.GetExecutingAssembly());
string message = resourceManager.GetString(messageKey, cultureInfo);
return message;
}
...
我觉得在使用C#进行国际化/本地化/全球化等方面,我似乎错过了一些基本要点。我以前在Java中曾经做过国际化项目,但出于某种原因,我无法完全理解如何在C#中实现。
另外,作为一个旁注,国际化项目中资源的“首选”目录结构是什么?