生成MVC的Resx文件

4
我们在全球化方面使用resx文件,以及数据库查找可配置的内容(例如选项卡名称,可以根据产品不同而不同),这些内容由我们的客户支持人员配置,并因此在设计时未知。
我创建了一个自定义工具,它会读取resx文件并智能地将键/值对转储到关系型数据库中(匹配值以避免重复)。
这对我们的业务非常有帮助 - 我们不必为每个resx发送翻译(并支付共享单词的重复翻译费用),并且我们拥有所有翻译的“黄金标准”(在数据库中)。
我创建的工具还会读取数据库,获取键/值对和每个值的翻译,并为每个resx文件(以及每种语言的文本文件的翻译)创建文本文件,并自动运行resgen.exe,这是一款随Visual Studio一起提供的命令行工具,以从生成的文本文件编译resx文件。
我没有任何源代码控制集成,因此在使用该工具时,我们必须手动签出resx文件并手动签入生成的文件,但这并不是一个大问题。
我的问题是,这种方法在我们的新MVC项目中失败了:MVC项目要求resx文件是具有“public”访问修饰符的嵌入式资源。
到目前为止,我们一直在手动修复这个问题,这可能会引入人为错误,并增加相当数量的工作量。
有没有办法让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文件的工具。有没有办法可以避免这个警告?

3个回答

2

首先,您可以使用/publicClass命令行选项将资源生成为公共资源。另请参见:Resgen.exe - Resource File Generator @ msdn

其次,我认为您不能让resgen默认将资源文件嵌入到程序集中,因为这不是资源的属性,而是项目的设置。

例如:当您使用向导添加新的资源“Resource1”时,项目文件将添加一个新的项目组:

<ItemGroup>
  <EmbeddedResource Include="Resource1.resx">
    <Generator>ResXFileCodeGenerator</Generator>
    <LastGenOutput>Resource1.Designer.cs</LastGenOutput>
  </EmbeddedResource>
</ItemGroup>

也许有库可以编程方式修改项目文件,但我并不知道。
我所做的就是尝试自己序列化和反序列化项目文件,并为生成的每个资源添加该部分。
编辑:
它还会添加到另一个Item Group中:
<ItemGroup>
  <Compile Include="Resource1.Designer.cs">
    <AutoGen>True</AutoGen>
    <DependentUpon>Resource1.resx</DependentUpon>
    <DesignTime>True</DesignTime>
  </Compile>
</ItemGroup>

所以,除非你有一个很好的第三方程序来序列化、编辑、反序列化项目文件。最好还是让向导来完成。

0

我以前也曾经遇到过这个问题,但现在资源管理已经很好了。虽然我不确定这是否有帮助,但回顾基础知识总是值得的,因为有时候问题非常简单,而.NET资源管理可能不够灵活。

我将解释我的资源管理使用方法,希望您可以将其应用到您的场景中(根据您的问题,我无法确定确切的问题所在)。

设置资源管理的步骤如下:

  1. 在您的Web解决方案中添加一个ASP.NET文件夹,右键单击解决方案,选择添加 > 添加ASP.NET文件夹 > App_GlobalResources

  2. 向该文件夹添加一个资源文件,命名为MyResourceFile.resx

  3. 打开文件属性并选择

    • 生成操作:嵌入式资源
    • 自定义工具:PublicResXFileCodeGenerator
  4. 然后添加不同语言的不同资源文件(对所有资源文件指定相同的属性,例如生成操作和自定义工具)

    • MyResourceFile.en-GB.resx
    • MyResourceFile.fr-FR.resx
    • MyResourceFile.ja-JP.resx

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

MyResourceFile.MyResourceText

值得注意的是,如果您尚未安装文化或其定义不正确,则无法正常工作,并且会出现各种错误。
例如,MyResourceFile.en-JP.resx 将无法工作(除非您创建此自定义文化),并导致各种其他问题。此文化将从应用程序中的 CultureInfo 进行映射,以确定要使用哪个资源文件,因此它必须是有效的 CultureInfo。

1
[笑话警报:] 什么?“日本人说的英语”不是有效的CultureInfo名称吗?微软当时在想什么呢? - Jesse Chisholm
我在Stack Overflow上看到的第一个笑话,书呆子们太认真了,严肃点! - Jonathan

0

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

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

这样可以保留“嵌入式资源”状态以及所有其他所需的详细信息。

我们仍然必须在第一次创建文件时正确设置文件,但这是一个更可管理的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接