2011-12-05 33 views
3

我使用的是C#3.5和Windows Forms(如果它很重要,则使用Telerik components)。如何获得一个按钮,以三种(或N ..)种不同语言使用三种不同的图片(一种用于空闲,一种用于鼠标悬停,一种用于点击)?Windows窗体中图像资源的本地化

当我添加一个资源图像(例如,一个JPEG文件)时,我可以使用资源管理器来获取它,一切都很好。我还可以添加另一个图像(,同时使用不同的名称),然后更改文件的语言并更改图片。

现在的问题: 如何将每种语言的按钮图像更改为正确的图像,如果我不能给它们相同的名称(resource.resx中的egajpg,resources-foo.resx中的a.jpg等)。

我认为在代码中检查当前的文化并且然后使用OnMouseEnter/Leaves/Down中的图片资源名称实现三张图片之间的切换并不现实。

由于平均应用程序有100多个按钮必须有一个简单易用的方式做到这一点,我只是想不出(或者找...)...

回答

3

.NET中的ResourceManager不仅执行字符串本地化。它可以提供任何种类的本地化二进制内容,包括图像。这意味着您将永远不需要编写逻辑来选择相关的本地化版本的图像,甚至不需要操作图像文件路径。您只需要让ResourceManager为您提供所需的图像,它将为您提供此图像的适当语言版本(取决于当前的UICulture)。

Visual Studio可以轻松地将图像添加到资源文件。资源编辑器在左上角有一个按钮(见下文),可让您查看resx文件中包含的不同类型的资源,这些资源可以是字符串(我们大多数人都熟悉的最常见的选择),图像和更多。

enter image description here

MSDN link解释了整个事情。下面是我从用了一个例子说明如何从资源检索本地化的形象:

rm = new ResourceManager("Images", this.GetType().Assembly); 
pictureBox1.Image = (System.Drawing.Image)rm.GetObject("flag"); 
+0

问题是,当我添加第一个图像时,让我们说Resource.resx的“flag.png”,一切都很好。然后我去另一个resx文件(例如Resource.foo-BAR.resx),并尝试添加“flag.png”文件,但我得到一个错误消息:“一个文件的名称......”\ flag .png“alreay存在。你想替换它吗?“同样的消息,如果我将它添加为现有文件或者如果我创建一个新的图像... –

+0

如果你看看你的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设置为你指定),并且你只需提供要使用的图片,它会为你完成剩下的工作。

绝对查找资源文件。

我认为资源文件的默认使用是针对字符串的。因此,而不是加载不同的图像,它们应该用于加载不同的翻译(本地化)字符串。但是,不是这样,只是提供一个不同的文件路径(文件路径到不同的图像)来代替字符串。

希望我有道理,抱歉没有提供示例。

+0

我使用的资源,问题是,我有3个图像为每种语言每个按钮。就像我说的,每种语言都有1个图像,这不是一个真正的问题。问题是3 * N(=语言)图像,以及如何使其工作,而不创建一个'if(文化= ...){图像= ...; }否则如果...'为每个按钮... –

+0

你应该可以说一些像“button_1_path = resource_button_1_path”? –

+0

如果资源文件是你不这样做(区域设置1),否则如果(区域设置2)...您给它一个资源字符串名称,并说这是区域设置,这是资源字符串名称,给我的文件路径。它用作区域设置和资源字符串之间的映射。 –