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






3.84/5 (8投票s)
管理项目范围内资源文件中的字符串可能会非常麻烦。该组件使得将字符串与其对应的类放在一起更容易,即使它们是业务对象。
引言
本地化已成为许多现代应用程序的重要功能。在 .NET 中,资源文件和 Windows Forms 设计器使得 UI 组件的本地化变得简单,但是,也存在一些不足之处。本文包含的代码解决了其中的一些缺陷,特别是字符串值和消息框的本地化。
背景
开发人员讨厌繁琐的工作。如果遵循适当的全球化实践很麻烦,开发人员根本不会遵守该实践。他们反而会将字符串嵌入代码中,并且(如果幸运的话)在文件顶部放一个 “TODO: 本地化”,然后继续。
在源代码中声明字符串(或其他资源)是一种非常糟糕的做法。在源代码中查找资源毫无乐趣,并且明确禁止在最初构建软件后进行本地化。外部化资源是能够本地化应用程序的关键,也是本文中使用的技术。
平台
包含的代码需要 Visual Studio 2008 并针对 .NET v2.0。
用法
LocalizableContent
是一个组件,可以从 Visual Studio 工具箱拖放到任何 Component
上,例如 UserControl
、Form
,甚至是自定义业务对象。它包含消息和消息框的集合,其内容已外部化到资源文件。

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

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

请注意,LocalizableMessageBox.Text
或 LocalizableMessage.Value
可以是格式字符串。如果是格式字符串,则在调用 LocalizableMessageBox.Show
时提供参数,否则,可以无任何附加参数地调用 Show
(除了拥有句柄)。
注意事项
就像所有组件一样,除非包含 LocalizableContent
的类的 Localizable
属性设置为 true
,否则资源将被嵌入到 Designer.cs 文件中,而不是 .resx 文件中!
最初,LocalizableMessageBox
和 LocalizableMessage
支持预览功能。此功能目前不可用。将 [DesignTimeVisible(false)]
添加到组件会阻止此类功能。我发现由于组件托盘可能变得杂乱,将内容分组到一个组件托盘项下(因此创建了 LocalizableContent
)更可取,因此预览功能目前已被抑制,因为您无法获得支持它的上下文菜单。
关注点
MessageBoxType
是必需的。System.Windows.Forms.MessageBoxIcon
在属性网格中无法正确显示(大概是因为它具有重复的底层字面值)。添加我自己的枚举,虽然起初不受欢迎,但确实具有减少开发人员必须从中选择的选项数量的优势。我从不喜欢从 MessageBoxIcon
中选择;我发现文档令人困惑,并且认为不需要超过 3 种类型,Info
、Warning
和 Error
。这似乎比决定是否应该使用 Stop/Error/Hand 或 Warning/Exclamation 更好。
LocalizationUtilities.Design
中的类具有一些有趣的方面。它具有将 GenerateMember
默认为 false
的代码 (LocalizableContent
不暴露有用的编程功能)。此外,还有代码遵循首选的命名约定(用“_”作为字段的前缀)。
评论
有些人可能反对像编辑 UI 元素一样编辑业务类。在包含的代码中,MyBusinessObject
代表一个业务对象,但它的可本地化内容可以在设计器中进行编辑。从 Component
派生授予了此特权。我对此并不反对——它看起来相当轻量级,并提供了各种退出功能,例如,应用 ToolboxItem
属性会禁止在 Visual Studio 工具箱中显示。
历史
- 2010 年 2 月:初始版本