1

我有一个 C# 中的 WPF 应用程序,将来可能需要本地化。我想支持 XAML/BAML 本地化传统的 resx 本地化。(前者对大部分代码都很有用,但一些本地化内容来自视图模型,使用 resx 文件更直接。)

我已阅读WPF 本地化指南的相关部分。我在 msbuild 文件中设置了 UICulture 属性。我在 AssemblyInfo.cs 中添加了以下行:

[assembly: NeutralResourcesLanguage("en", UltimateResourceFallbackLocation.Satellite)]

我知道我需要将 Resources.resx复制为 Resources.en.resx,以便将我的本地化资源写入附属程序集。

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

目前我必须手动保持 Resources.resx 和 Resources.en.resx 同步。它们必须相同。(Rick Stahl 在这里解释了这一点。

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

<Target Name="BeforeResGen">
    <Copy SourceFiles="@(CopyAsLocalizedResources)" DestinationFiles="$(IntermediateOutputPath)Resources.$(UICulture).resx">
        <Output ItemName="EmbeddedResource" TaskParameter="DestinationFiles"/>
    </Copy>
</Target>

我将 Resources.resx 的 Build Action 从 None 更改为 CopyAsLocalizedResources。

我看到我的 Resources.en.resx 文件在构建过程中被复制到中间目录,但在运行时找不到我的资源,并且出现异常。据推测,它们永远不会被编译到卫星程序集中。

任何人都可以通过修改项目文件来帮助我实现这一目标吗?

4

2 回答 2

0

尤里卡!

  <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 文件上的 Build Action 设置为 CopyAsLocalizedResources,并且自定义构建目标处理欺骗构建以生成正确的附属程序集。

于 2012-07-10T13:53:48.343 回答
0

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

所以,对于一些 foo.dll:

(默认 DLL)

bin\foo.dll

(西班牙语(墨西哥)资源)

bin\es-mx\foo.Resources.dll

此文件夹结构和程序集将在编译时进行,因此您只需调整构建后操作,将文化文件夹中的 dll 移动到目标目录中的匹配文件夹。

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

于 2012-05-18T18:21:20.783 回答