正在生成MVC的Resx文件
本文关键字:Resx 文件 MVC | 更新日期: 2023-09-27 18:13:31
我们使用resx文件进行全球化,同时使用数据库查找我们的CS员工可以配置的东西(例如选项卡名称,不同产品可能会有所不同(,因此在设计时是未知的。
我创建了一个自定义工具,可以读取resx文件,并将键/值对智能地转储到关系数据库中(匹配值,这样我们就不会有重复的值(。
这对我们的业务有很大帮助——我们不必发送每个resx进行翻译(并为共享单词的重复翻译付费(,而且我们的所有翻译都有一个"黄金标准"(在数据库中(。
我创建的工具还读取数据库,获取键/值对和每个值的翻译,为每个resx文件创建文本文件(以及文本文件的每种语言的翻译(,并自动运行resgen.exe(Visual Studio附带的命令行工具(,从生成的文本文件编译resx文件。
我没有任何源代码管理集成,所以在使用该工具时,我们必须手动签出resx文件并手动签入生成的文件,但这并不是一个大问题。
我的问题是,这种方法在我们的新MVC项目中失败了:MVC项目要求resx文件是Access修饰符为"public"的嵌入资源。
Thusfar,我们一直在手工修复,这引入了人为错误的可能性,并增加了大量的工作。
有没有一种方法可以让resgen.exe创建嵌入的公共资源文件?如果没有,是否有其他方法可以创建resx文件?
更新,附加问题:我们用这种方法生成的resx文件也会引发警告:
A custom tool 'PublicResXFileCodeGenerator' is associated with file '(resxname)',
but the output of the custom tool was not found in the project.
You may try re-running the custom tool by right-clicking on the file in the
Solution Explorer and choosing Run Custom Tool.
提到的工具是我们最初用来创建resx文件的工具。有什么办法可以防止这种警告吗?
首先,您可以使用/publicClass
命令行选项将资源生成为公共资源。另请参阅:Resgen.exe-资源文件生成器@msdn
第二,我不认为resgen可以默认地使资源文件嵌入资源,因为它不是资源的属性,而是项目的设置。
例如:当您使用向导添加新资源"Resource1"时,将向项目文件中添加一个新的项目组:
<ItemGroup>
<EmbeddedResource Include="Resource1.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resource1.Designer.cs</LastGenOutput>
</EmbeddedResource>
</ItemGroup>
也许有一些库可以通过编程方式修改项目文件,但据我所知并不是这样。
我要做的只是尝试自己序列化和反序列化项目文件,并为生成的每个资源添加该部分。
编辑:
它还将添加一个不同的项目组:
<ItemGroup>
<Compile Include="Resource1.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Resource1.resx</DependentUpon>
<DesignTime>True</DesignTime>
</Compile>
</ItemGroup>
因此,除非您有一个好的第三方程序来序列化、编辑和反序列化项目文件。让向导来做可能更好。
我以前也遇到过这种情况,但资源配置很好。这可能会有所帮助,尽管我不确定。它总是值得复习一下基础知识,因为有时它是非常简单的东西,而.NET资源可能是不可行的。
我会解释我对资源的使用,希望你能把它应用到你的场景中(我无法根据你的问题真正弄清楚他们的确切问题是什么。(
设置资源的步骤1.将ASP.NET文件夹添加到web解决方案右键单击解决方案,选择"添加">"添加ASP.NET文件夹">"App_GlobalResources ">
-
将资源文件添加到文件夹中,称之为MyResourceFile.resx
-
打开文件的属性并选择
- 构建操作:嵌入式资源
- 自定义工具:PublicResXFileCodeGenerator
-
然后为不同的语言等添加不同的资源文件(为所有资源文件等指定相同的属性构建操作和自定义工具(
- 我的资源文件.en-GB.resx
- 我的资源文件.fr-fr.resx
- MyResourceFile.ja-JP.resx
这应该会自动生成您的资源管理器,可以通过调用来访问
MyResourceFile.MyResourceText
值得注意的是,如果您没有安装区域性或其定义不正确,它将无法工作,并且会出现各种错误。
EtcMyResourceFile.en-JP.resx将不起作用(除非您创建了此自定义区域性(,并导致各种其他问题。此区域性将从应用程序中的CultureInfo映射,以确定要使用的资源文件,因此它必须是有效的CultureInformation。
我们最终找到了这个问题的解决方案。
对于MVC项目,我们更改了该工具,使用ResXResourceWriter类来更新resx文件,匹配现有密钥并根据需要添加新密钥。
这将保留"嵌入式资源"状态以及所需的所有其他详细信息。
我们仍然需要在第一次创建文件时正确设置它,但这是一个更容易管理的问题。