你們是否是發現,在商店中看到的高大上的應用都有着多語言支持,能夠根據操做系統的語言自動適配;或者能夠經過用戶的選擇,顯示對應的語言界面,確實很高大上呢。不過這個可不是什麼難事,經過簡單的幾個步驟,讓你的應用也高大上起來,支持多語言。這樣在你之後的簡歷裏,也能夠寫上:面向國際市場開發過多語言應用。聽上去至關有底氣!git
在創建多語言支持前,首先要看一下 Manifest 文件中的默認語言選項,將它設置爲你但願的默認顯示語言。github
接下來創建存放語言字符串的文件夾。若是是Universal App,就以下圖所示,在 Shared 文件夾下創建 Strings 子文件夾,並在其中根據本身 App 但願支持的語言,再創建子文件夾,子文件夾的名稱要和語言的編碼一致。關於具體語言的編碼,能夠查詢 Language Codes 頁面:windows
http://msdn.microsoft.com/en-us/library/ms533052%28v=vs.85%29.aspxapp
若是不是 Universal App,那麼 Strings 文件夾應該放在項目的根目錄下。框架
創建好文件夾之後,在每一個文件夾中添加 "Resources File (.resw)"。微軟推薦使用默認文件名,以便在項目中進行調用。若是有特殊命名需求,請參考 How to load string resources (XAML) 頁面:ide
http://msdn.microsoft.com/en-us/library/windows/apps/xaml/hh965323.aspx字體
這些作完之後,多語言支持的框架就算是搭起來了,剩下的就是往裏填寫內容了。編碼
以 en-US 舉例,咱們打開 en-US 的 Resources.resw 文件,會發現其中分爲三列,分別是 Name,Value 和 Comment。顧名思義,分別是字符串引用的名稱,字符串的內容和字符串的備註或評論。那麼咱們就開始根據本身的需求填寫字符串。其中 Name 和 Value 較爲重要,必須填寫,Comment 主要是加強可讀性,不是必填項。spa
若是是須要對界面,也就是 XAML 語言定義的部分進行多語言支持,那麼 Name 的部分就要像 XAML 語言定義同樣,針對控件的每一個單元進行定義。例如:操作系統
須要對文本框的內容,也就是 Text 進行多語言支持,那麼 Name 部分就必須是 NameofTextbox.Text 的格式。好比下圖中,咱們要對「精華欄標題」進行多語言支持,那麼咱們首先爲精華欄標題命名爲 BestTitle,而且針對 BestTitle.Text 這一 Name 填寫內容 Best。那麼這一工做就作完了。
對於Button控件來講,其文本部分叫作Label(爲何就不能統一叫Text呢?好奇怪啊),因此要給AppButton_Zoom這個button填寫一個AppButton_Zoom.Label項。
有了這個命名,咱們如何在界面中進行調用呢?
很簡單,經過 Uid 實現。
找到 XAML 中對應的部分,添加 x:Uid="BestTitle" 這一屬性,這樣系統就會自動在多語言支持中找到對應的內容,並將 Text 的內容對應賦予該 TextBlock 的 Text 屬性。這樣,咱們就無需在 XAML 文件中將現實的內容硬編碼進去,只須要修改對應的資源文件就能夠,是否是很方便呢。
<Button Style="{StaticResource Win8TopAppBarButton}" Tag="CNBlogs.Pages.BestPostsPage" Click="NavButton_Click" Padding="30"> <Button.Content> <TextBlock> <Run Text="" FontFamily="Segoe UI Symbol"/> <Run x:Uid="BestTitle" Text=""/> </TextBlock> </Button.Content> </Button>
運行一下看看效果,若是系統語言默認是英文的話,那麼顯示的內容就已經如咱們所願,變成英文的了。若是不是英文也沒有關係,咱們能夠經過切換系統語言,或者在程序中設置應用語言來實現這一點,設置語言的方法,會在後文講述。
對應的,咱們也要添加上中文的內容,這樣才能保證兩種語言的對應性。
眼尖的讀者必定發現了,不光 Text,連 FontSize 也能夠定義麼?對的,對於 Width,字體等簡單屬性,咱們均可以根據不一樣語言的特性,對控件進行根據語言分類的設定,這樣纔可使界面更加符合不一樣語言的特性及使用習慣。
雖然前臺設計主要由 XAML 實現,可是仍是會有部分漏網的字符,是在後臺的 C# 代碼中實現的。對於這些部分的顯示,如何調用資源文件中的內容呢?答案也是很是簡單的。
首先,在資源文件中定義要調用的字符串。值得注意的是,這裏不能像定義 XAML 中使用的字符串同樣,使用相似 NameofTextbox.Text 的格式,而是要使用相似於變量命名的命名規則,不能再用」.」等分隔符隔開。不然系統調用會失敗。
填寫完成之後,咱們打開後臺 C# 代碼,首先添加這一句:
Windows.ApplicationModel.Resources.ResourceLoader loader = new Windows.ApplicationModel.Resources.ResourceLoader();
這樣就定義了一個 loader,由他負責從資源文件中找尋對應的語句。
當咱們須要字符串的時候,就將字符串的部分替換爲 loader.GetString("STRING_NAME")便可,其中 STRING_NAME對應的就是在資源文件中定義的 Name。例如,咱們須要調用 "CommentTextblockText_Status1" 和 "CommentTextblockText_Status2" 字符串,那麼咱們就使用語句:
CommentButton.Content = isCommentTemperarorilyShown ? loader.GetString("CommentTextblockText_Status2") : loader.GetString("CommentTextblockText_Status1");
就能夠了。
若是在 Windows Store App 中但願無視系統語言,強制設置程序語言,也是能夠的。咱們只須要在頁面中添加一句:
Windows.Globalization.ApplicationLanguages.PrimaryLanguageOverride = "zh-CN";
就能夠了。不過須要注意,這一句代碼執行完了之後,只會對以後打開的頁面生效,以前加載的頁面的語言並不會發生變化。若但願全局生效,最好的辦法是從新啓動一下應用程序。
一個更好的辦法是創建一個如圖的下拉菜單:
這樣能夠方便用戶本身選擇界面語言。
遺憾的是,在 Windows Phone 中並無這麼好的全局設定方案,界面語言只能跟隨系統顯示語言。若是想要重設界面語言,就只能使用另外的黑科技了。
在中文和英文資源文件之間來回切換是個很痛苦的事情,尤爲是界面字符串數目比較多的時候。筆者推薦一個插件,能夠比較方便的進行語言之間的比較和翻譯。
在 Visual Studio 中選擇 TOOLS – Extensions and Updates,搜索 ResXManager 這一插件,安裝重啓之後,在 TOOLS 菜單中就能夠打開它,界面以下圖所示:
這樣的對照界面比原來單一語言界面方便多了,若是有某種語言條目的空缺,他還會標紅提醒,實在是多語言及本地化支持的利器。
本地化及多語言支持的技術並沒有難點,困難之處每每在於多語言特色的兼顧,翻譯的準確性及維護上。本文只是萬里長征的第一步,後面的路還要開發者們一個字符串一個字符串去鋪成……
分享代碼,改變世界!
Windows Phone Store App link:
http://www.windowsphone.com/zh-cn/store/app/博客園-uap/500f08f0-5be8-4723-aff9-a397beee52fc
Windows Store App link:
http://apps.microsoft.com/windows/zh-cn/app/c76b99a0-9abd-4a4e-86f0-b29bfcc51059
GitHub open source link:
https://github.com/MS-UAP/cnblogs-UAP
MSDN Sample Code:
https://code.msdn.microsoft.com/CNBlogs-Client-Universal-477943ab