SharePoint 2010中的資源文件
通常,在我們的自定義解決方案中,資源文件主要用於實現本地化。
同樣在 SharePoint 2010中, 我們的定制開發過程也會涉及類似的本地化過程,因此開發人員不可避免的需要和各種特定語言的resx文件打交道。在開發SharePoint解決方案時,resx文件可以通過名為“Resources”SharePoint映射文件夾來實現。在此路徑下存放的資源文件可以通過SPUtility.GetLocalizedString 方法來訪問。但畢竟,我們會遇到很多和特定用戶界面相關的定制化工作。而SharePoint 2010本身是基於ASP.NET 技術實現的。所以任何包含了資源引用的標記都會從App_GlobalResources文件夾下搜索.resx文件。對於SharePoint來說,該文件夾位於 intepub\wwroot\wss\<<Web應用程序目錄>> 這個路徑下。
這一點就給需要要使用傳統ASP.NET UI資源本地化方式進行開發的SharePoint開發人員帶來了額外的部署上的開銷。我們需要確保一個resx文件必須同時被部署在經典的14目錄和App_GlobalResources下。
有很多辦法可以部署資源文件。比如:
• 編寫一個事件接收器程序(event handler)來復制 resx 文件
• 自定義timer job
• 在部署用到的PowerShell 腳本中實現
• 手工復制粘貼,等等....
但是,當我們的解決方案需要卸載,更新時該怎么辦?更慘的是,如果我們的SharePoint環境還是多服務器的場環境。這時,手工部署resx 文件的工作就會變得繁瑣且十分容易出錯。
SharePoint 2010類型的項目支持稱為“元素(Elements)”的功能(Feature)。通過元素我們可以部署一系列的文件到指定的位置。下面,我們就看一下如何使用元素來部署resx 文件,使其能夠放在 App_GlobalResources 文件夾下。這么做至少有以下幾點好處:
• 不需要為了部署單獨寫自定義的代碼
• Resx 文件被統一打包到了WSP文件中
• 不需要擔心升級和卸載,因為SharePoint 自動為我們處理
• 非常適合多服務器的SharePoint場環境下部署
• 無手工步驟
步驟
• 新建一個 空白SharePoint 2010 項目。名為 ResxDeployment
• 選擇一個本地站點進行調試,部署類型選擇 部署為場解決方案

• 在解決方案資源管理器里,右擊 ResxDeployment 項目,添加一個 SharePoint 映射文件夾
• 在 添加 SharePoint 映射文件夾 對話框中, 選擇Resources 並點確定

• 在解決方案資源管理器里,右擊 ResxDeployment 項目,添加一個新建項...
• 在Resources文件下添加一些示例 resx 文件

• 在解決方案資源管理器里,右擊 ResxDeployment 項目,添加一個新建項。添加一個 空元素 並將其命名。這里我們叫做 App_GlobalResources

• 在解決方案資源管理器里,點擊顯示所有文件圖標,來查看所有的文件。打開SharePointProjectItem.spdata 文件,該文件位於 App_GlobalResources 結點下。

• 在xml文件中添加資源文件的相關信息,包括Source和Type 。Type 指定成AppGlobalResource 。Source 指定 resx 文件的相對路徑。 如下面的例子所示:
<?xml version="1.0" encoding="utf-8"?> <ProjectItem Type="Microsoft.VisualStudio.SharePoint.GenericElement" DefaultFile="Elements.xml" SupportedTrustLevels="All" SupportedDeploymentScopes="Web, Site, WebApplication, Farm, Package" xmlns="http://schemas.microsoft.com/VisualStudio/2010/SharePointTools/SharePointProjectItemModel"> <Files> <ProjectItemFile Source="Elements.xml" Target="App_GlobalResources\" Type="ElementManifest" /> <ProjectItemFile Source="..\Resources\Contoso.resx" Type="AppGlobalResource"/> <ProjectItemFile Source="..\Resources\Contoso.zh-CN.resx" Type="AppGlobalResource"/> <ProjectItemFile Source="..\Resources\Contoso.ko-KR.resx" Type="AppGlobalResource"/> <ProjectItemFile Source="..\Resources\Contoso.en-US.resx" Type="AppGlobalResource"/> <ProjectItemFile Source="..\Resources\Contoso.ja-JP.resx" Type="AppGlobalResource"/> </Files> </ProjectItem>
• 在解決方案資源管理器里,雙擊默認的Feature1,打開Feature設計器。將我們剛剛創建的元素加到右側。使其包含到Feature中。

• 在解決方案資源管理器里,右擊 ResxDeployment 項目,選擇部署
• 如果一切正常,該解決方案將被部署到指定的web 應用程序。同時,通過檢查,我們看到resx 文件同時部署到了 App_GlobalResources 和14\Resources 文件夾下面。


需要注意的要點
資源文件被部署到了兩個不同的位置。當然你也可以直接在元素的文件夾中添加resx文件。
1. 在這個例子中,我們不需要在Visual Studio里把文件從Resources 映射文件夾拷貝到 App_GlobalResources 元素文件夾。實際上只有一份resx 文件, 所以我們不需要擔心同時修改多個位置的問題。
2. 每添加一個 resx 文件, SharePointProjectItem.spdata 文件中都應該做相應的更新。否則該文件不會被復制到web應用程序的App_GlobalResources 文件夾下。
3. 請為該項目對應的功能設置適當的范圍(Scope)。 通常我們設置成web應用程序這一級別。
通過以上的方法,我們就可以利用SharePoint自帶的功能框架來部署resx 文件到 App_GlobalResources。
參考資料
Easy way to deploy .resx (resource) files under App_GlobalResources folder in SharePoint 2010
