Wpf 如何修改我的C项目文件,以便将Resources.resx编译到我的UICulture的附属程序集中?

Wpf 如何修改我的C项目文件,以便将Resources.resx编译到我的UICulture的附属程序集中?,wpf,visual-studio,localization,msbuild,Wpf,Visual Studio,Localization,Msbuild,我有一个C语言的WPF应用程序,将来可能需要本地化。我想支持XAML/BAML本地化和传统的resx本地化。前者对于大多数代码都很有用,但是一些本地化的内容来自视图模型,在视图模型中使用resx文件更简单 我已经阅读了报告的相关部分。我已在msbuild文件中设置UICulture属性。我已将以下行添加到AssemblyInfo.cs: [assembly: NeutralResourcesLanguage("en", UltimateResourceFallbackLocation.Satel

我有一个C语言的WPF应用程序,将来可能需要本地化。我想支持XAML/BAML本地化和传统的resx本地化。前者对于大多数代码都很有用,但是一些本地化的内容来自视图模型,在视图模型中使用resx文件更简单

我已经阅读了报告的相关部分。我已在msbuild文件中设置UICulture属性。我已将以下行添加到AssemblyInfo.cs:

[assembly: NeutralResourcesLanguage("en", UltimateResourceFallbackLocation.Satellite)]
我知道我需要将Resources.resx复制为Resources.en.resx,以便将本地化资源写入附属程序集

我已将Resources.resx上的构建目标设置为无,并将Resources.en.resx上的构建目标设置为EmbeddedResource。Resources.resx上的自定义工具是PublicResXFileCodeGenerator,用于生成强类型资源类。我知道生成器只适用于没有区域性特定后缀的文件

目前,我必须手动使Resources.resx和Resources.en.resx保持同步。它们必须相同

我试图修改我的C项目文件以自动复制该文件。然而,我不能让它工作。我不是msbuild专家!我添加了以下构建目标:

<Target Name="BeforeResGen">
    <Copy SourceFiles="@(CopyAsLocalizedResources)" DestinationFiles="$(IntermediateOutputPath)Resources.$(UICulture).resx">
        <Output ItemName="EmbeddedResource" TaskParameter="DestinationFiles"/>
    </Copy>
</Target>
我将Resources.resx的生成操作从None更改为CopyAsLocalizedResources

我看到我的Resources.en.resx文件在生成过程中被复制到中间目录,但在运行时找不到我的资源,因此出现异常。可能它们从未被编译到卫星组件中


有人能帮我通过修改项目文件来实现这一点吗?

编译语言dll应位于根据该区域性的ISO区域性代码命名的文件夹中。此区域性命名文件夹应与父程序集位于同一目录中

因此,对于某些foo.dll:

默认DLL

bin\foo.dll

西班牙墨西哥资源

bin\es mx\foo.Resources.dll

此文件夹结构和程序集将在编译时生成,因此您只需调整生成后操作即可将区域性文件夹中的dll移动到目标目录中的匹配文件夹中

请注意,您可以通过cp或其他命令行工具执行此移动,只需在Visual Studio中的项目属性的项目生成后步骤框中键入所需的操作。

Eureka

  <Target Name="CreateLocalizedResources" BeforeTargets="AssignTargetPaths">
    <Copy SourceFiles="@(CopyAsLocalizedResources)" DestinationFiles="$(IntermediateOutputPath)Resources.$(UICulture).resx" SkipUnchangedFiles="true" UseHardlinksIfPossible="true">
      <Output TaskParameter="DestinationFiles" ItemName="GeneratedLocalizedResources" />
    </Copy>
    <ItemGroup>
      <EmbeddedResource Include="@(GeneratedLocalizedResources)">
        <ManifestResourceName>$(RootNamespace).Properties.Resources.$(UICulture)</ManifestResourceName>
      </EmbeddedResource>
    </ItemGroup>
    <Message Text="Generated resources are: @(GeneratedLocalizedResources)" Importance="high" />
  </Target>

我将Resources.resx文件上的生成操作设置为CopyAsLocalizedResources,自定义生成目标将处理欺骗生成以生成正确的附属程序集的操作。

谢谢,但我的操作设计为在生成之前运行。它应该创建一个新的源文件并将其推入EmbeddedResource组。