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の同期を手動で維持する必要があります。それらは同一でなければなりません。(リック・スタールはここでそれを説明しています。

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ファイルが中間ディレクトリにコピーされているのがわかりますが、実行時にリソースが見つからず、例外が発生します。Presumabyは、衛星アセンブリにコンパイルされることはありません。

プロジェクトファイルへの変更を使用してこれを達成するのを誰かが助けてくれますか?

4

2 に答える 2

0

コンパイルされた言語のdllは、そのカルチャのISOカルチャコードに従って名前が付けられたフォルダにあることが期待されます。このカルチャ名の付いたフォルダーは、親アセンブリと同じディレクトリーにあると想定されています。

したがって、いくつかのfoo.dllの場合:

(デフォルトのDLL)

bin \ foo.dll

(スペイン語(メキシコ)リソース)

bin \ es-mx \ foo.Resources.dll

このフォルダー構造とアセンブリはコンパイル時に作成されるため、ビルド後のアクションを微調整して、カルチャフォルダー内のdllをターゲットディレクトリ内の一致するフォルダーに移動する必要があります。

Visual Studioのプロジェクトプロパティを使用して、プロジェクトのビルド後の手順ボックスに必要なアクションを入力するだけで、cpまたはその他のコマンドラインツールを使用してこの移動を実行できることに注意してください。

于 2012-05-18T18:21:20.783 に答える
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ファイルのビルドアクションをCopyAsLocalizedResourcesに設定すると、カスタムビルドターゲットがビルドをだまして適切なサテライトアセンブリを作成します。

于 2012-07-10T13:53:48.343 に答える