博客園客戶端UAP開發隨筆 -- 讓你本身和你的App有國際範兒

你們是否是發現,在商店中看到的高大上的應用都有着多語言支持,能夠根據操做系統的語言自動適配;或者能夠經過用戶的選擇,顯示對應的語言界面,確實很高大上呢。不過這個可不是什麼難事,經過簡單的幾個步驟,讓你的應用也高大上起來,支持多語言。這樣在你之後的簡歷裏,也能夠寫上:面向國際市場開發過多語言應用。聽上去至關有底氣!git

 

0. 準備工做

在創建多語言支持前,首先要看一下 Manifest 文件中的默認語言選項,將它設置爲你但願的默認顯示語言。github

0

 

接下來創建存放語言字符串的文件夾。若是是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字體

 

1

這些作完之後,多語言支持的框架就算是搭起來了,剩下的就是往裏填寫內容了。編碼

 

1. 填寫字符串

以 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項。

2

 

2. 界面引用字符串

有了這個命名,咱們如何在界面中進行調用呢?

很簡單,經過 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>

運行一下看看效果,若是系統語言默認是英文的話,那麼顯示的內容就已經如咱們所願,變成英文的了。若是不是英文也沒有關係,咱們能夠經過切換系統語言,或者在程序中設置應用語言來實現這一點,設置語言的方法,會在後文講述。

5

 

對應的,咱們也要添加上中文的內容,這樣才能保證兩種語言的對應性。

4

眼尖的讀者必定發現了,不光 Text,連 FontSize 也能夠定義麼?對的,對於 Width,字體等簡單屬性,咱們均可以根據不一樣語言的特性,對控件進行根據語言分類的設定,這樣纔可使界面更加符合不一樣語言的特性及使用習慣。

 

3. 後臺代碼引用字符串

雖然前臺設計主要由 XAML 實現,可是仍是會有部分漏網的字符,是在後臺的 C# 代碼中實現的。對於這些部分的顯示,如何調用資源文件中的內容呢?答案也是很是簡單的。

首先,在資源文件中定義要調用的字符串。值得注意的是,這裏不能像定義 XAML 中使用的字符串同樣,使用相似 NameofTextbox.Text 的格式,而是要使用相似於變量命名的命名規則,不能再用」.」等分隔符隔開。不然系統調用會失敗。

3

 

填寫完成之後,咱們打開後臺 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");

就能夠了。

 

4. 設置程序語言

若是在 Windows Store App 中但願無視系統語言,強制設置程序語言,也是能夠的。咱們只須要在頁面中添加一句:

Windows.Globalization.ApplicationLanguages.PrimaryLanguageOverride = "zh-CN";

就能夠了。不過須要注意,這一句代碼執行完了之後,只會對以後打開的頁面生效,以前加載的頁面的語言並不會發生變化。若但願全局生效,最好的辦法是從新啓動一下應用程序。

 

一個更好的辦法是創建一個如圖的下拉菜單:

image

這樣能夠方便用戶本身選擇界面語言。

遺憾的是,在 Windows Phone 中並無這麼好的全局設定方案,界面語言只能跟隨系統顯示語言。若是想要重設界面語言,就只能使用另外的黑科技了。

 

5. 其餘

在中文和英文資源文件之間來回切換是個很痛苦的事情,尤爲是界面字符串數目比較多的時候。筆者推薦一個插件,能夠比較方便的進行語言之間的比較和翻譯。

在 Visual Studio 中選擇 TOOLS – Extensions and Updates,搜索 ResXManager 這一插件,安裝重啓之後,在 TOOLS 菜單中就能夠打開它,界面以下圖所示:

image

 

這樣的對照界面比原來單一語言界面方便多了,若是有某種語言條目的空缺,他還會標紅提醒,實在是多語言及本地化支持的利器。

 

小結

本地化及多語言支持的技術並沒有難點,困難之處每每在於多語言特色的兼顧,翻譯的準確性及維護上。本文只是萬里長征的第一步,後面的路還要開發者們一個字符串一個字符串去鋪成……

 

分享代碼,改變世界!

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

相關文章
相關標籤/搜索