Sea*_*inn 10 c# globalization resources internationalization monodevelop
我的问题是:使用MonoDevelop(这是我正在处理的许多项目的首选环境)我正在试图弄清楚如何使用资源文件来处理本地化消息以及如何将它们正确地包含在项目中作为嵌入式资源.
我的目标是为消息键及其值创建一个具有简单名称 - 值对的资源文件,并为其本地化字符串提供单独的文件,例如
Messages.resources
Hello.World = Hello World
Goodbye.Cruel.World = Goodbye, Cruel World
Run Code Online (Sandbox Code Playgroud)
Messages.de.resources
Hello.World = Hallo Welt
Goodbye.Cruel.World = Auf Wiedersehen, grausame Welt
Run Code Online (Sandbox Code Playgroud)
我有几个问题.
首先,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;
}
...
Run Code Online (Sandbox Code Playgroud)
我觉得我在C#的国际化/本地化/全球化等方面缺少一些基本要点.我之前曾在Java上从事过国际化项目,但出于某种原因,我无法用C#来解决它.
另外,作为一个旁边 - 国际化项目中资源的"首选"目录结构是什么?
我不熟悉 .NET 本地化(我使用 gettext),但据我了解,.resources 文件是一种二进制格式,实际上嵌入到您的 dll 中。您可以使用 resgen 将resx (XML)或文本资源编译为二进制格式。文本文件更具可读性,但只能用于字符串资源。XML 更详细,但可以表示二进制资源可以表示的所有内容。
通常的做法是将资源以 .resx 形式存储在项目中,MonoDevelop 在构建项目时会自动将它们编译为 .resources 文件(您必须手动编译 .txt 文件)。不幸的是,MD 没有针对 resx 文件的特殊编辑工具,因此您必须直接编辑 XML。
MD 确实有很好的 gettext 本地化工具,但 Windows 目前不支持这些工具。
归档时间: |
|
查看次数: |
4920 次 |
最近记录: |