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