在Visual Studio中将翻译后的resx文件放入不同的文件夹?

3
我有一个包含14个翻译和12个文件的解决方案,但是“资源”文件夹已经有点混乱了。有没有一种方法可以将翻译文件放入不同的文件夹中,以便更轻松地访问主英语文件?
我注意到您可以通过设置自定义工具命名空间来更改设计文件生成的命名空间,但我还没有想出如何从不同的文件夹中获取翻译。我考虑使用链接来创建“快捷方式”文件夹和“实际”文件夹,但是您不能链接到项目结构中的文件,并且您不能在项目结构之外两次链接到同一文件。我考虑根据语言更改ResourceManager使用的命名空间,但这会破坏回退行为。
是否有任何方法可以管理此内容,以便在“解决方案资源管理器”中不会显示大量的文件?
3个回答

7
假设您想将所有翻译好的 .resx 文件放在一个名为 Translations 的文件夹中,像这样(请注意,我已在根目录中留下了 defaulten 版本):

enter image description here

然后您只需要编辑 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 文件放置在根文件夹中相同。

虽然这是一条非常有用的信息,但我不确定它是否完全解决了原帖作者的问题。我认为他的问题在于资源文件夹中的混乱,而不是输出二进制目录。不过我可能错了。对于这个提示,我给出+1的评价。 - user844705
这不会改变输出二进制目录的布局或内容,只是改变了文件在Visual Studio项目中的组织方式,据我所知,这对应于问题标题。 - Simon Mourier
是的,我错了! - user844705
这看起来非常方便!如果您最初将资源保存在“Resources”文件夹中,那么您可以将其设置为<ManifestResourceName>$(TargetName).Resources.%(Filename)</ManifestResourceName>。我认为我可能会坚持我的答案,因为在添加翻译或资源文件时不需要做任何额外的工作。虽然我相信您可以编写一个脚本来为您完成这项工作... - RandomEngy
2
哦,甚至更好,您只需说<EmbeddedResource Include="Translations\*.resx">,它就会抓取所有的资源文件! - RandomEngy

1

实现此目标的一种方法是编写自定义资源提供程序。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

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

有趣...但我还没有找到让VS在生成的文件中使用我的自定义ResourceManager的方法。看起来你还不能做到这一点?https://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/3873228-provide-a-resourcemanager-abstraction-mechanism. - RandomEngy

0
< p > Simon MourierRandomEngy 的答案帮助我在 Visual Studio 2022 中使其工作。我将以下文本插入到 *.csproj 文件中第一个 EmbeddedResource 标签之前。

<EmbeddedResource Update="Translations\*.resx">
    <ManifestResourceName>$(TargetName).%(Filename)</ManifestResourceName>
    <!-- add this for all .resx files in a custom folder -->
</EmbeddedResource>

这将会拉取 Translations 文件夹中的所有 resx 文件。 我不得不使用 "Update" 而不是使用 "Include"。每次我使用 include,都会出现构建错误。


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