【问题标题】:Generating Resx files for MVC为 MVC 生成 Resx 文件
【发布时间】:2011-12-21 07:48:23
【问题描述】:

我们使用 resx 文件进行全球化,并使用数据库查找可以由我们的 CS 人员配置的内容(例如选项卡名称,可能因产品而异),因此在设计时不知道。

我创建了一个自定义工具,它可以读取 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 文件的工具。有什么办法可以阻止这个警告吗?

【问题讨论】:

    标签: c# model-view-controller globalization embedded-resource resx


    【解决方案1】:

    首先,您可以使用/publicClass 命令行选项将资源生成为公共资源。另见:Resgen.exe - Resource File Generator @ 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>
    

    所以,除非你有一个好的第 3 方程序来序列化、编辑、反序列化项目文件。让向导来做可能会更好。

    【讨论】:

      【解决方案2】:

      我以前曾为此苦苦挣扎,但资源运作良好。尽管我不确定,但这可能会有所帮助。复习基础知识总是值得的,因为有时它非常简单,而 .NET 资源可能难以理解。

      我将解释我对资源的使用,希望您可以将其应用到您的场景中(根据您的问题,我真的无法弄清楚他们的确切问题是什么。)

      设置资源的步骤 1. 将 ASP.NET 文件夹添加到您的 Web 解决方案中,右键单击解决方案选择添加 > 添加 ASP.NET 文件夹 > App_GlobalResources

      1. 将资源文件添加到名为 MyResourceFile.resx 的文件夹中

      2. 打开文件属性并选择

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

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

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

      MyResourceFile.MyResourceText
      

      值得注意的是,如果您没有安装文化或其定义不正确,它将无法正常工作,并且您会遇到各种错误。

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

      【讨论】:

      • [笑话警报:] 什么? “日本说的英语”不是有效的 CultureInfo 名称?微软在想什么?
      • 我在 stakoverflow 上看到的第一个笑话,书呆子们认真对待自己,认真的!
      【解决方案3】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-04-13
        • 1970-01-01
        • 1970-01-01
        • 2020-03-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多