【问题标题】:Localization of image resources in Windows FormsWindows 窗体中图像资源的本地化
【发布时间】:2012-01-13 08:01:13
【问题描述】:

我正在使用 C# 3.5 和 Windows Forms(如果重要,还有 Telerik components)。如何让一个按钮以三种(或 N..)不同的语言使用三张不同的图片(一张用于空闲,一张用于鼠标悬停,一张用于单击时)?

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

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

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

作为一个平均应用程序有 100 多个按钮,必须有一种简单易行的方法来做到这一点,这是我想不到(或找不到...)...

【问题讨论】:

    标签: c# winforms image button localization


    【解决方案1】:

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

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

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

    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" 已经存在。你想替换它吗?”同样的消息,如果我将它添加为现有文件或者我创建一个新图像......
    • 如果您查看您的 Visual Studio 解决方案,您会发现除非您添加到资源的文件已经在解决方案中,否则它会创建它的副本。因此,您需要通过为每个语言版本指定一个唯一名称(例如“flag.en-US.png”和“flag.fr-FR.png”)来防止冲突,或者首先将它们添加到您的解决方案中在他们自己的语言子文件夹中(例如“en-US\flag.png”和“fr-FR\flag.png”——确保它们在您的 Visual Studio 项目中,否则 Visual Studio 将尝试复制它们并为您提供你提到的错误)
    【解决方案2】:

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

    一定要查找资源文件。

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

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

    【讨论】:

    • 我正在使用资源,问题是每种语言的每个按钮都有 3 个图像。就像我说的,每种语言一张图片,这不是一个真正的问题。问题是 3*N (=lanuguages) 图像以及如何在不为每个按钮创建 if (culture= ...) {image= ... ; } else if ... 的情况下使其协同工作...
    • 您应该可以说“button_1_path = resource_button_1_path”之类的话?
    • 如果资源文件的要点是你不这样做 if (locale 1), else if (locale 2)... 你给它一个资源字符串名称并说这是语言环境,这个是资源字符串名称,给我文件路径。它用作语言环境和资源字符串之间的映射。
    • 例如,您不能有一张用英语说“嘿”的图片和一张用另一种语言说“嘿”的图片都以 hey.jpg 的形式输入资源。一个必须是 hey-en.jpg 和另一个 hey-foo.jpg,并且您不能为按钮设置 onmousehover/onclick 的图像。它必须由代码完成。
    猜你喜欢
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多