【问题标题】:How can I modify my C# project file so that Resources.resx is compiled into the satellite assembly for my UICulture?如何修改我的 C# 项目文件,以便将 Resources.resx 编译到我的 UICulture 的附属程序集中?
【发布时间】:2012-05-18 18:15:56
【问题描述】:

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

我已阅读WPF Localization Guidance 的相关部分。我在 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 explains that here.)

我尝试修改我的 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 文件在构建过程中被复制到中间目录,但在运行时找不到我的资源,并且出现异常。大概它们永远不会被编译到卫星程序集中。

谁能帮助我通过修改项目文件来实现这一点?

【问题讨论】:

    标签: wpf visual-studio localization msbuild


    【解决方案1】:

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

    所以,对于一些 foo.dll:

    (默认 DLL)

    bin\foo.dll

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

    bin\es-mx\foo.Resources.dll

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

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

    【讨论】:

    • 谢谢,但我的操作旨在运行 before 构建。它应该创建一个新的源文件并将其推送到 EmbeddedResource 组。
    【解决方案2】:

    尤里卡!

      <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,自定义构建目标处理欺骗构建以生成正确的附属程序集。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多