gpt4 book ai didi

C#、本地化、资源和 MonoDevelop

转载 作者:可可西里 更新时间:2023-11-01 09:14:35 26 4
gpt4 key购买 nike

我的问题是这样的:使用 MonoDevelop(这是我正在进行的许多项目的首选环境)如何将它们作为嵌入式资源正确地包含在项目中。

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

消息.资源

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 文件时,我收到以下错误:

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

其次,一旦我有了适当生成的资源文件,我就可以将它们嵌入到我的项目中,如果我理解正确的话,这会使资源成为程序集的一部分。如果我有两个文件,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 文件是 binary format这实际上嵌入到您的 dll 中。你可以编译resx (XML)text resources使用 resgen 转换为二进制格式。文本文件更具可读性但只能用于字符串资源。 XML 更冗长,但可以表示二进制资源可以表示的所有内容。

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

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

关于C#、本地化、资源和 MonoDevelop,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6567964/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com