C#,Localization,Resources和MonoDevelop

我的问题是 :使用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不是有效的资源文件。”

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

另外,作为一个旁边 – 国际化项目中资源的“首选”目录结构是什么?

我不熟悉.NET本地化(我使用gettext),但据我所知,.resources文件是一种二进制格式 ,实际上嵌入到你的dll中。 您可以使用resgen将resx(XML)或文本资源编译为二进制格式。 文本文件更易读,但只能用于字符串资源。 XML更冗长,但可以表示二进制资源可以包含的所有内容。

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

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

有没有使用Gettext的原因?

(例如,你想与VS兼容吗?如果没有,这对我有用 : http : //monodevelop.com/Documentation/Localizing_Applications )