2012-05-18 24 views
1

我在C#中有一個WPF應用程序,可能需要在未來進行本地化。我想支持XAML/BAML本地化傳統的resx本地化。 (前者對於大多數代碼很有用,但是某些本地化內容來自視圖模型,使用resx文件更直接。)如何修改我的C#項目文件,以便將Resources.resx編譯到我的UICulture的衛星程序集中?

我已閱讀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的構建操作從None更改爲CopyAsLocalizedResources。

我看到我的Resources.en.resx文件在構建過程中被複制到中間目錄,但是我的資源在運行時沒有找到,並且出現異常。他們從未被編入衛星組件。

任何人都可以幫助我實現這個使用項目文件的修改?

回答

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生成操作,和自定義生成目標處理欺騙建成作出適當的附屬程序集。

0

編譯後的語言dll預計位於根據該文化的ISO文化代碼命名的文件夾中。這個文化名稱的文件夾應該與父程序集位於同一個目錄中。

所以,對於一些foo.dll:

(默認DLL)

斌\ foo.dll

(西班牙語(墨西哥)參考資料)

斌\ ES-MX \ foo.Resources.dll

此文件夾結構和程序集將在編譯時生成,因此您只需調整後生成操作即可將文化文件夾中的dll移至匹配目標目錄中的文件夾。

請注意,您可以通過cp或其他命令行工具執行此操作,只需在Visual Studio中使用項目屬性在項目後期構建步驟框中鍵入所需的操作即可。

+0

謝謝,但我的行動旨在運行_before_構建。它應該創建一個新的源文件並將其推送到EmbeddedResource組中。 – Olly

相關問題