Windows Forms中图像资源的本地化

4
我正在使用C# 3.5和Windows Forms(如果有影响,则还使用Telerik组件)。如何使一个按钮在三种(或N种)不同的语言中使用三张不同的图片(分别对应闲置状态、鼠标悬停状态和点击状态)?
当我添加资源图片(例如JPEG文件)时,我可以使用资源管理器获取它,一切都很好。我也可以添加另一张图片(使用不同的名称),然后更改文件的语言并更改图片。
现在的问题是: 如果我不能给它们相同的名称(例如,在resource.resx中的a.jpg,在resources-foo.resx中的a.jpg等),那么如何在每种语言中将按钮图像更改为正确的图像?
我认为通过检查当前文化并在OnMouseEnter/Leaves/Down中使用图片资源名称来实现三张图片之间的切换在代码中不太现实。
作为一个普通的应用程序有100多个按钮,必须有一种简单易行的方法来完成它,但我想不到(或找不到...)...
2个回答

3
.NET中的ResourceManager不仅仅用于字符串本地化,它可以提供任何类型的本地化二进制内容,包括图像。这意味着您永远不需要编写逻辑来选择相关的本地化图像版本,甚至不需要操作图像文件路径。您只需请求ResourceManager给您想要的图像,它将为您提供适当语言版本的图像(取决于当前的UICulture)。
Visual Studio使添加图像到资源文件变得容易。资源编辑器有一个位于左上角的按钮(如下所示),可让您查看resx文件中包含的不同类型的资源,可以是字符串(大多数人熟悉的最常见选择),图像等等。

enter image description here

这个MSDN链接解释了整个过程。以下是我从中提取的一个示例,展示如何从您的资源中检索本地化图像:
rm = new ResourceManager("Images", this.GetType().Assembly);
pictureBox1.Image = (System.Drawing.Image)rm.GetObject("flag");

问题是,当我将第一张图片(比如“flag.png”)添加到Resource.resx中时,一切都很好。然后我转到另一个resx文件(例如Resource.foo-BAR.resx),尝试添加“flag.png”文件,但是我收到了错误消息:“名称为'......\flag.png”的文件已经存在。您要替换它吗?”如果我将其添加为现有文件或创建新图像,则会收到相同的消息... - Nadav Ben-Gal
如果您查看Visual Studio解决方案,您会发现,除非您添加到资源的文件已经在解决方案中,否则它会创建一个副本。因此,您需要通过为每个语言版本提供唯一的名称(例如“flag.en-US.png”和“flag.fr-FR.png”)或首先将它们添加到其自己的语言子文件夹中(例如“en-US \ flag.png”和“fr-FR \ flag.png” - 确保这些文件在您的Visual Studio项目中,否则Visual Studio将尝试复制它们,并会给出您提到的错误)来防止冲突。 - Clafou

0

我会使用资源文件。它们的工作方式类似于:“如果使用这种语言,请加载'Button1A.jpg',如果使用其他语言,请加载'Button1B.jpg'”等等。我不确定语法或如何实现它们,但我相信您可以在某个地方指定语言/区域设置(或者根据Windows设置进行指定),然后只需提供要使用的图像以及何时使用它,它就会为您完成其余工作。

一定要查找资源文件。

我认为资源文件的默认用途是字符串。因此,它们不是用于加载不同的图像,而是应该用于加载不同的翻译(本地化)字符串。但是,与其如此,不如在字符串的位置提供不同的文件路径(到不同图像的文件路径)。

希望我说得清楚,很抱歉没有提供示例。


我正在使用资源,问题是每个按钮在每种语言中都有3张图片。像我说的,每种语言只有1张图片并不是真正的问题。问题是如何使3*N(=语言)张图片一起工作,而不必为每个按钮创建一个 if (culture= ...) {image= ... ; } else if ... - Nadav Ben-Gal
你应该能够说出类似于“button_1_path = resource_button_1_path”的内容。 - Andrew Rasmussen
资源文件的重点在于你不需要写 if (locale 1), else if (locale 2)... 的语句。你只需提供一个资源字符串名称,指定所需的区域设置和文件路径即可。它可以将区域设置和资源字符串之间建立映射关系。 - Andrew Rasmussen
1
您不能在资源中添加一个英文为 "hey" 的图像和另一种语言为 "hey" 的图像,例如。其中一个必须是 hey-en.jpg,另一个必须是 hey-foo.jpg,并且您不能为按钮设置鼠标悬停/单击的图像。它必须通过代码实现。 - Nadav Ben-Gal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接