【问题标题】:Put translated resx files in a different folder in Visual Studio?将翻译后的 resx 文件放在 Visual Studio 的不同文件夹中?
【发布时间】:2015-10-08 06:16:53
【问题描述】:

我有一个包含 14 个翻译和 12 个文件的解决方案,并且“资源”文件夹有点失控。有没有办法将翻译后的文件放到不同的文件夹中,这样我就可以更轻松地访问主英文文件?

我注意到您可以通过设置自定义工具命名空间来更改生成设计器文件的命名空间,但我还没有弄清楚如何从不同的文件夹中获取翻译。我玩弄了使用链接创建“快捷方式”文件夹和“真实”文件夹的想法,但是您不能链接到项目结构内的文件,也不能在项目结构之外链接到同一个文件两次.我考虑过根据语言更改 ResourceManager 使用的命名空间,但这会破坏回退行为。

有什么方法可以管理它,使它不是解决方案资源管理器中的一个巨大的文件列表吗?

【问题讨论】:

    标签: .net visual-studio globalization resx


    【解决方案1】:

    假设您想将所有翻译后的 .resx 文件放在 Translations 文件夹中,如下所示(注意我将 defaulten 版本保留在根文件夹):

    然后您需要做的就是编辑 MSBuild 项目文件(在 Visual Studio 中,右键单击项目节点,“卸载项目”,然后“编辑 xxx.csproj”),并重新配置此文件夹中的每个 Resx 文件像这样:

    之前:

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

    之后:

      <ItemGroup>
        ...
        <EmbeddedResource Include="Resource1.en.resx" />
        <EmbeddedResource Include="Translations\Resource1.fr.resx">
          <ManifestResourceName>$(TargetName).%(Filename)</ManifestResourceName> <!-- add this for all .resx files in a custom folder -->
        </EmbeddedResource>
        <EmbeddedResource Include="Resource1.resx">
          <Generator>ResXFileCodeGenerator</Generator>
          <LastGenOutput>Resource1.Designer.cs</LastGenOutput>
        </EmbeddedResource>
        ...
      </ItemGroup>
    

    它的作用是指示底层 MSBuild 任务使用您指定的清单名称,而不是自动生成一个。自动生成的总是使用RESX所在的文件夹布局,这不是我们想要的。

    编译完成后,最终的卫星ConsoleApplication1.resources.dll文件将照常放在fr文件夹中,但其内容将与resx文件放在根文件夹中一样。

    【讨论】:

    • 虽然信息非常有用,但我不确定它是否完全解决了 OP 的原始问题。我认为他的问题是资源文件夹中的混乱,而不是输出 bin 目录。不过我可能弄错了。 +1 给我的小费。
    • 这不会改变输出bin目录布局和内容,只是文件在Visual Studio项目中的组织方式,与问题标题相对应,据我了解。
    • 确实如此。我错了!
    • 这看起来很方便!如果您最初将资源保留在 Resources 文件夹中,则可以使用 &lt;ManifestResourceName&gt;$(TargetName).Resources.%(Filename)&lt;/ManifestResourceName&gt; 我想我可能会坚持我的答案,因为在添加翻译或资源文件时我不需要做任何额外的工作。虽然我确信你可以编写一个脚本来为你做这件事..
    • 哦,更好的是,你可以说&lt;EmbeddedResource Include="Translations\*.resx"&gt;,它会抓住所有的人!
    【解决方案2】:

    实现此目的的一种方法是编写自定义资源提供程序。 Rick Strahl 编写了一个从数据库而不是 RESX 文件提供资源的工具。他继承的类是 mscorlib 中的 System.Resources.ResourceManager。这是他的实现。

    https://github.com/RickStrahl/Westwind.Globalization/blob/master/Westwind.Globalization/DbResourceManager/DbResourceManager.cs

    这是文章的链接,他提供了代码。

    http://weblog.west-wind.com/posts/2014/Mar/31/Updated-ASPNET-Database-Resource-Provider

    我知道你不想从数据库中存储资源,但原则应该适用

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-10
    • 1970-01-01
    • 2011-10-15
    • 1970-01-01
    • 1970-01-01
    • 2011-07-03
    相关资源
    最近更新 更多