Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Windows窗体中图像资源的本地化_C#_Winforms_Image_Button_Localization - Fatal编程技术网

C# Windows窗体中图像资源的本地化

C# Windows窗体中图像资源的本地化,c#,winforms,image,button,localization,C#,Winforms,Image,Button,Localization,我正在使用C#3.5和(如果有关系的话)。我怎样才能得到一个按钮来使用三种(或N…)不同语言的三种不同图片(一种用于空闲,一种用于鼠标悬停,一种用于单击时) 当我添加一个资源图像(例如,一个JPEG文件)时,我可以使用资源管理器来获取它,一切都很好。我还可以添加另一个图像(同时使用不同的名称),然后更改文件的语言和图片 现在的问题是: 如果不能为每种语言的按钮图像赋予相同的名称(例如resource.resx中的a.jpg、resources-foo.resx中的a.jpg等),如何将它们更改为

我正在使用C#3.5和(如果有关系的话)。我怎样才能得到一个按钮来使用三种(或N…)不同语言的三种不同图片(一种用于空闲,一种用于鼠标悬停,一种用于单击时)

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

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

我认为在代码中签入当前区域性,然后使用onmouseinter/Leaves/Down中的图片资源名称实现三个图片之间的切换是不现实的


因为一个普通的应用程序有100多个按钮,所以必须有一种简单易行的方法来实现它,这是我想不出(或找不到…)的。

我会使用资源文件。它们的工作原理是这样的:“如果使用这种语言,请加载'Button1A.jpg',如果使用其他语言,请加载'Button1B.jpg',等等。我不确定语法或如何实现它们,但我非常确定您可以在某处指定语言/区域设置(或者根据Windows设置为您指定),您只需提供在何时使用哪个图像,它就会为您完成其余的工作

一定要查找资源文件

我认为资源文件的默认用途是字符串。因此,与其加载不同的图像,不如使用它们加载不同的翻译(本地化)字符串。但是,与其这样,不如提供一个不同的文件路径(不同图像的文件路径)来代替字符串


希望我讲得有道理,很抱歉没有提供一个示例。

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

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

这就解释了整个事情。下面是我从中选取的一个示例,它显示了如何从您的资源中检索本地化图像:

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

我在使用资源,问题是我有3个按钮的图像,每种语言。就像我说的,每个语言对应一张图片,这不是一个真正的问题。问题是3*N(=lanuguages)图像以及如何使其协同工作而不创建
if(culture=…){image=…}else if…
对于每个按钮…您应该能够说“button_1_path=resource_button_1_path”?如果资源文件的要点是您不做if(locale 1),else if(locale 2)。。。给它一个资源字符串名,然后说这是区域设置,这是资源字符串名,给我文件路径。它充当区域设置和资源字符串之间的映射。例如,在资源中不能同时输入一个英文名为“hey”的图像和另一种语言名为“hey”的图像作为hey.jpg。一个必须是hey-en.jpg,另一个必须是hey-foo.jpg,并且不能为按钮设置onmousehave/onclick的图像。问题是,当我将第一幅图片添加到Resource.resx时,让我们说“flag.png”,一切都很好。然后我转到另一个resx文件(例如Resource.foo BAR.resx),并尝试添加“flag.png”文件,但收到一条错误消息:“名称为“…\flag.png”的文件确实存在。你想更换它吗?“同样的消息,如果我将其添加为现有文件或创建新图像……如果您查看Visual Studio解决方案,您将看到,除非您添加到资源中的文件已在解决方案中,否则它将创建其副本。因此,您需要防止冲突,或者为每个语言版本指定一个唯一的名称,例如“flag.en US.png”和“flag.fr-fr.png”,或者首先将它们添加到自己的语言子文件夹中(例如“en US\flag.png”和“fr fr\flag.png”)--确保这些都在您的Visual Studio项目中,否则Visual Studio将尝试复制它们,并给出您提到的错误)