SharePoint 2010多語言UI,以及開發人員需要注意的

SharePoint 2010支持同一個網站呈現出不同語言的UI。比如,一箇中文版的SharePoint 2010系統,管理員可以在服務器上安裝SharePoint 2010英文語言包,然後在網站設置的“語言設置”中,選擇“英語”爲備用語言。

image

然後用戶就可以隨時使用頁面右上角的用戶菜單,將當前網站的顯示UI,在多個語言之間進行切換。

image

如果你嘗試一下這個功能,就會發現一個有趣的現象。對於SharePoint 2010的內置列表和文檔庫,它們的名稱,以及所有字段的名稱,都會根據當前的UI語言,顯示成不同的語言文字。比如,這是“共享文檔”在中文UI語言下所顯示的樣子:

image

如果這時將UI切換成英文,那麼它就會變成:

image

嗯,就如你所見,無論是文檔庫的名稱(“共享文檔”->“Shared Documents”),還是字段的名稱(“類型”->“Type”),它們都可以很好的適應當前的語言UI,自動顯示成不同語言的文本。

那麼,對於自定義的列表和文檔庫,它們也會具備這種能力嗎?不用試就知道,除非我們進行額外的處理,SharePoint 2010不可能知道應該如何將自定義列表的名稱和字段名稱,顯示成不同語言的文本。

假設我們有一個自定義列表,“公司客戶”,它包含有一個自定義字段,“客戶地址”,此列表在中文UI下顯示成這樣:

image

如果希望“公司客戶”列表具備多語言顯示能力,可以通過如下的代碼實現:

image

上面代碼的作用,就是將列表名稱的英文版本(en-US),設置爲“Company Customers”,並且將“客戶地址”字段的英文版本,設置爲“Customer’s Address”。下面的截圖就是運行了上面的代碼後,這個列表在英文UI下的顯示:

image

通過代碼你應該看出來了,SPList和SPField都有一個TitleResource屬性,通過這個屬性,我們可以獲取或設置在不同語言中,列表或字段的Title值。那麼如果在代碼中直接獲取或設置SPList和SPField的Title屬性,會怎麼樣呢?答案就是,這時SharePoint對象模型會根據當前代碼所在線程的UI Culture,來自動獲取不同語言版本的Title值。下面的代碼就示範了這個用法:

image

兩次調用SPList.Title屬性,由於分別爲當前線程設置了不同的UI Culture,Title屬性就會返回不同的值。

由於這個特性的存在,在某些事情,如果沒有考慮周全,就會在你的自定義代碼中產生一些bug。讓我們想象這樣的一個場景:你的SharePoint 2010是中文版,但是SharePoint服務器上的Windows Server是英文版本。你需要寫一些代碼,爲某個列表添加一個字段:“QQ號碼”。你非常清楚字段的顯示名稱(Title)和內部名稱(InternalName)的區別,你不想SharePoint 2010自動爲你的新字段生成一個稀奇古怪的內部名稱,於是聰明的你決定這樣來創建這個字段:

image

在你的設想中,這個新字段的顯示名稱將是“QQ號碼”,它的內部名稱將是“QQNumber”。於是,你興高采烈的在一個Console程序中加上了如上代碼,運行了它,然後驚奇的發現這個新字段的顯示名稱居然仍然顯示爲“QQNumber”:

image

發生錯誤的原因在於,代碼運行在一個Console程序中,也就是說,它運行在SharePoint Context之外。在運行代碼的線程中,UI Culture是英文(因爲Windows Server是英文版),所以雖然代碼通過SPField.Title屬性將字段顯示名稱設置爲“QQ號碼”,但實際上它設置的是這個字段的英文版本顯示名稱。於是,在中文版本的SharePoint 2010網站上,這個字段的顯示名稱仍然保持爲“QQNumber”。同時由於你的代碼的作用,如果以後有人將UI切換成英文,會驚奇的發現這個字段居然在英文UI下顯示成“QQ號碼”。

正確的創建這個字段的代碼應該是:

image

在第一行,代碼將當前線程的UI Culture設置爲了網站的UI Culture(SPWeb.UICulture),這樣無論這個代碼是在什麼語言版本的Windows Server中運行,都會得到我們想要的結果。如果你的代碼會運行在SharePoint Context之外,這一點非常重要。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章