正在生成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文件的工具。有什么办法可以防止这种警告吗?

正在生成MVC的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 ">

  1. 将资源文件添加到文件夹中,称之为MyResourceFile.resx

  2. 打开文件的属性并选择

    • 构建操作:嵌入式资源
    • 自定义工具:PublicResXFileCodeGenerator
  3. 然后为不同的语言等添加不同的资源文件(为所有资源文件等指定相同的属性构建操作和自定义工具(

    • 我的资源文件.en-GB.resx
    • 我的资源文件.fr-fr.resx
    • MyResourceFile.ja-JP.resx

这应该会自动生成您的资源管理器,可以通过调用来访问

MyResourceFile.MyResourceText

值得注意的是,如果您没有安装区域性或其定义不正确,它将无法工作,并且会出现各种错误。

EtcMyResourceFile.en-JP.resx将不起作用(除非您创建了此自定义区域性(,并导致各种其他问题。此区域性将从应用程序中的CultureInfo映射,以确定要使用的资源文件,因此它必须是有效的CultureInformation。

我们最终找到了这个问题的解决方案。

对于MVC项目,我们更改了该工具,使用ResXResourceWriter类来更新resx文件,匹配现有密钥并根据需要添加新密钥。

这将保留"嵌入式资源"状态以及所需的所有其他详细信息。

我们仍然需要在第一次创建文件时正确设置它,但这是一个更容易管理的问题。