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

Put translated resx files in a different folder in Visual Studio?

我有一个包含 14 个翻译和 12 个文件的解决方案,"Resources" 文件夹有点失控了。有没有办法把翻译后的文件放在不同的文件夹里,这样我就可以更方便地访问母版英文文件?

我注意到您可以通过设置自定义工具命名空间来更改生成设计器文件的命名空间,但我还不知道如何从不同的文件夹中获取翻译。我玩弄了使用 links 来制作一个 "shortcuts" 文件夹和一个 "real" 文件夹的想法,但是你不能 link 到项目结构中的文件,你可以't link 在项目结构之外对同一个文件两次。我考虑过根据语言更改 ResourceManager 使用的命名空间,但这会破坏回退行为。

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

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

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

这里给文章一个link,他提供了代码

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

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

假设您想将所有已翻译的 .resx 文件放在 Translations 文件夹中,就像这样(注意我已经保留了 defaulten 根文件夹中的版本):

然后您需要做的就是编辑 MSBuild 项目文件(从 Visual Studio,右键单击项目节点,'Unload project',然后 'Edit 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文件放在根文件夹中一样。