65.9K
CodeProject 正在变化。 阅读更多。
Home

一个用于本地化字符串和消息框的 .NET 组件

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.84/5 (8投票s)

2010年3月3日

CPOL

3分钟阅读

viewsIcon

22482

downloadIcon

199

管理项目范围内资源文件中的字符串可能会非常麻烦。该组件使得将字符串与其对应的类放在一起更容易,即使它们是业务对象。

引言

本地化已成为许多现代应用程序的重要功能。在 .NET 中,资源文件和 Windows Forms 设计器使得 UI 组件的本地化变得简单,但是,也存在一些不足之处。本文包含的代码解决了其中的一些缺陷,特别是字符串值和消息框的本地化。

背景

开发人员讨厌繁琐的工作。如果遵循适当的全球化实践很麻烦,开发人员根本不会遵守该实践。他们反而会将字符串嵌入代码中,并且(如果幸运的话)在文件顶部放一个 “TODO: 本地化”,然后继续。

在源代码中声明字符串(或其他资源)是一种非常糟糕的做法。在源代码中查找资源毫无乐趣,并且明确禁止在最初构建软件后进行本地化。外部化资源是能够本地化应用程序的关键,也是本文中使用的技术。

平台

包含的代码需要 Visual Studio 2008 并针对 .NET v2.0。

用法

LocalizableContent 是一个组件,可以从 Visual Studio 工具箱拖放到任何 Component 上,例如 UserControlForm,甚至是自定义业务对象。它包含消息和消息框的集合,其内容已外部化到资源文件。

将实例拖放到组件托盘后,可以使用上下文菜单添加可本地化的消息或消息框。

新添加的内容会自动在“属性”和“文档大纲”窗格中被选中。选中后,可以修改各种可编辑的属性。

请注意,LocalizableMessageBox.TextLocalizableMessage.Value 可以是格式字符串。如果是格式字符串,则在调用 LocalizableMessageBox.Show 时提供参数,否则,可以无任何附加参数地调用 Show(除了拥有句柄)。

注意事项

就像所有组件一样,除非包含 LocalizableContent 的类的 Localizable 属性设置为 true,否则资源将被嵌入到 Designer.cs 文件中,而不是 .resx 文件中!

最初,LocalizableMessageBoxLocalizableMessage 支持预览功能。此功能目前不可用。将 [DesignTimeVisible(false)] 添加到组件会阻止此类功能。我发现由于组件托盘可能变得杂乱,将内容分组到一个组件托盘项下(因此创建了 LocalizableContent)更可取,因此预览功能目前已被抑制,因为您无法获得支持它的上下文菜单。

关注点

MessageBoxType 是必需的。System.Windows.Forms.MessageBoxIcon 在属性网格中无法正确显示(大概是因为它具有重复的底层字面值)。添加我自己的枚举,虽然起初不受欢迎,但确实具有减少开发人员必须从中选择的选项数量的优势。我从不喜欢从 MessageBoxIcon 中选择;我发现文档令人困惑,并且认为不需要超过 3 种类型,InfoWarningError。这似乎比决定是否应该使用 Stop/Error/Hand 或 Warning/Exclamation 更好。

LocalizationUtilities.Design 中的类具有一些有趣的方面。它具有将 GenerateMember 默认为 false 的代码 (LocalizableContent 不暴露有用的编程功能)。此外,还有代码遵循首选的命名约定(用“_”作为字段的前缀)。

评论

有些人可能反对像编辑 UI 元素一样编辑业务类。在包含的代码中,MyBusinessObject 代表一个业务对象,但它的可本地化内容可以在设计器中进行编辑。从 Component 派生授予了此特权。我对此并不反对——它看起来相当轻量级,并提供了各种退出功能,例如,应用 ToolboxItem 属性会禁止在 Visual Studio 工具箱中显示。

历史

  • 2010 年 2 月:初始版本
© . All rights reserved.