.Net 资源文件的“接口”

Posted

技术标签:

【中文标题】.Net 资源文件的“接口”【英文标题】:"Interface" for .Net Resource files 【发布时间】:2015-11-18 01:32:14 【问题描述】:

我正在构建一个多语言 MVC 应用程序,并拥有一系列资源文件,其中包含将显示给用户的消息的翻译字符串。

有什么方法可以确保以后添加的任何资源文件都具有所有必需的键并且拼写正确?

打个比方,如果资源文件是一个常规类,您可以提供一个接口来确保所有必需的方法和属性都存在于实现类中。资源文件有类似的概念吗?

【问题讨论】:

我相信资源文件有一个默认的后备值。例如,如果您在Resources.resx 中定义值,那么Resources.es.resx 中缺少的任何键都将退回到第一个文件。这并不能保证它们会被实施,但可以确保会有一些东西。 .NET 资源文件的一个更好的类比是具有虚拟方法的基类,它可以(不是必须)在派生类中被覆盖 @MaxHampton 是的,但如果可能的话,我仍然希望进行一些验证。 @ThomasLevesque 这更有意义,但问题仍然存在。 ReSharper 等一些工具会验证所有资源是否在所有语言中都被覆盖(如果您在 XML 中打开 resx 文件,而不是在设计器中) 【参考方案1】:

我一直无法找到一种受支持的方式来对 .resx 文件强制执行显式合同。由于您的最终目标是在执行错误出现在运行时之前捕获它们(并且编译时检查是不可能的),我建议退回到静态代码分析。幸运的是,.NET 让这变得非常简单:

使用 System.Resources.ResXResourceReader 类读取要验证的 resx 文件的内容。 实施一个测试,针对您要在 resx 上强制执行的“合同”中的所有必需键进行断言。 测试应该作为现有测试套件的一部分运行,失败会在运行时遇到问题之前警告开发人员隐式合同。 由于您的资源文件将存在于已知位置,因此您可以轻松确保针对该目录中的所有 resx 文件运行测试。这样,您甚至不需要在添加新资源文件时更新测试,只要合同发生变化即可。

我使用了类似的方法来帮助维护保存在(大量)resx 文件中的存储过程名称。由于资源文件分布在数十个项目中,因此手动维护既繁琐又容易出错——换句话说,它无法完成。静态代码分析方法几乎没有缺点,我认为它也适用于您的情况。

Landing page for resource files on MSDN ResXResourceReader on MSDN

System.Resources.ResXResourceReader 需要引用 System.Windows.Forms。它在 .NET 和 Mono 上都可用。

【讨论】:

这就是我所倾向于的。那个,或者有一些代码可以根据“主”列表检查每个键,或者检查 XML 本身。如果没有人提出另一个答案,我会将其标记为已接受。

以上是关于.Net 资源文件的“接口”的主要内容,如果未能解决你的问题,请参考以下文章

.Net 多语言 与资源文件

VB.NET中的资源文件

ASP.Net 资源文件

第04篇:Resources资源文件处理,再也不怕找不到文件了。

如何对 . .NET 中的 resx(资源文件)

防止资源 [.resx] 文件预编译。 .NET 核心 2.0