C#、本地化、资源和单一开发

C#、本地化、资源和单一开发,c#,resources,internationalization,monodevelop,globalization,C#,Resources,Internationalization,Monodevelop,Globalization,我的问题在于:使用MonoDevelop(这是我正在处理的许多项目的首选环境),我试图找出如何使用本地化消息的资源文件,以及如何将它们作为嵌入式资源正确地包含在项目中 我的目标是创建一个资源文件,其中包含消息键及其值的简单名称-值对,并为其本地化字符串创建单独的文件,例如 消息。资源 Hello.World = Hello World Goodbye.Cruel.World = Goodbye, Cruel World Hello.World = Hallo Welt Goodbye.Crue

我的问题在于:使用MonoDevelop(这是我正在处理的许多项目的首选环境),我试图找出如何使用本地化消息的资源文件,以及如何将它们作为嵌入式资源正确地包含在项目中

我的目标是创建一个资源文件,其中包含消息键及其值的简单名称-值对,并为其本地化字符串创建单独的文件,例如

消息。资源

Hello.World = Hello World
Goodbye.Cruel.World = Goodbye, Cruel World
Hello.World = Hallo Welt
Goodbye.Cruel.World = Auf Wiedersehen, grausame Welt
Messages.de.resources

Hello.World = Hello World
Goodbye.Cruel.World = Goodbye, Cruel World
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文件时,出现以下错误:

“流不是有效的资源文件。”

其次,一旦我有了一个适当生成的资源文件,我就可以将它们嵌入到我的项目中,如果我理解正确,这将使资源成为程序集的一部分。如果我有两个文件,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#完全理解它


另外,顺便问一下——国际化项目中资源的“首选”目录结构是什么?

有没有不使用Gettext的原因


(例如,您希望与VS兼容?如果不兼容,这对我来说很有效:)

我不熟悉.NET本地化(我使用gettext),但据我所知,.resources文件是一个实际嵌入到dll中的文件。您可以使用resgen将或编译为二进制格式。文本文件更具可读性,但只能用于字符串资源。XML更详细,但可以表示二进制资源所能表示的一切

通常的做法是在项目中以.resx格式存储资源,MonoDevelop在构建项目时会自动将它们编译成.resources文件(您必须手动编译.txt文件)。不幸的是,MD没有针对resx文件的特殊编辑工具,因此您必须直接编辑XML


MD确实有很好的gettext本地化工具,但目前Windows不支持这些工具。

据我所知,MonoDevelop自己承认,gettext在Windows环境中有一些限制。或者,至少,编辑翻译和更新翻译的工具只能从Linux访问。这些限制还存在吗?它们有多真实?在阅读之后,Gettext似乎足以满足我的需要,但我需要深入挖掘。是的,msgmerge和msgformat工具通常在Windows上找不到,因此MD不包括Windows上的Gettext插件。但是,这些工具的Windows版本确实存在,因此如果您将它们放在路径中并复制加载项,它应该可以工作。@mhutch我正在运行MonoDevelop 2.6 beta 3,并且似乎翻译项目在我的Windows环境中对我可用。从2.2开始它似乎不受支持,从2.6开始它现在受支持了吗?@mhutch。。。另外,我是否正确地假设用于本地化的Gettext实现中的“回退”文本也充当源代码中的.po文件中的标识符?这种方法不是将实际文本与源代码紧密地结合在一起吗?在我所从事的Java项目中,我们有非常简单的键值对文本文件,它们仅通过它们的键标识符耦合到应用程序,所有文本和翻译都在这些文本文件中(从不在实际的源代码中);允许译者远离原文。它看起来不像Gettext通常是这样工作的。我不认为它得到官方支持,但它可能是偶然被包括在内的。您可能需要从某个地方获取msgfmt和msgmerge二进制文件。因此,听起来如果我不想使用gettext(这听起来确实是解决此问题的最简单和最直接的解决方案),我可以使用.resx文件,类似于Visual Studio使用它们的方式,MonoDevelop将负责将这些文件编译成.resources文件。您能谈谈MonoDevelop允许您通过New File>Misc>Empty Resource File选项创建的.resources文件之间的关系吗?并且.txt、.resx或.resources(二进制)都是Visual Studio类似命名的文件类型?我假设MonoDevelop的空资源文件更接近于.txt文件,而不是.resx(我知道,最终还是一个文本文件)或binary.resources文件。谢谢你给我的任何洞察力,它确实给我带来了很多困惑。空白。资源文件看起来像是从SalpDebug继承的,它有一个二进制资源的编辑器。如果它在文本编辑器中打开,那可能是一个bug。听起来它可能是一个bug,那么它将在MonoDevelop的文本编辑器中打开.resources文件。很高兴知道SharpDevelop支持binary.r