博客園客戶端UAP開發隨筆 -- 讓你自己和你的App有國際范兒


大家是不是發現,在商店中看到的高大上的應用都有着多語言支持,可以根據操作系統的語言自動適配;或者可以通過用戶的選擇,顯示對應的語言界面,確實很高大上呢。不過這個可不是什么難事,通過簡單的幾個步驟,讓你的應用也高大上起來,支持多語言。這樣在你以后的簡歷里,也可以寫上:面向國際市場開發過多語言應用。聽上去相當有底氣!

 

0. 准備工作

在建立多語言支持前,首先要看一下 Manifest 文件中的默認語言選項,將它設置為你希望的默認顯示語言。

0

 

接下來建立存放語言字符串的文件夾。如果是Universal App,就如下圖所示,在 Shared 文件夾下建立 Strings 子文件夾,並在其中根據自己 App 希望支持的語言,再建立子文件夾,子文件夾的名稱要和語言的編碼一致。關於具體語言的編碼,可以查詢 Language Codes 頁面:

http://msdn.microsoft.com/en-us/library/ms533052%28v=vs.85%29.aspx

如果不是 Universal App,那么 Strings 文件夾應該放在項目的根目錄下。

建立好文件夾以后,在每個文件夾中添加 "Resources File (.resw)"。微軟推薦使用默認文件名,以便在項目中進行調用。如果有特殊命名需求,請參考 How to load string resources (XAML) 頁面:

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 主要是增強可讀性,不是必填項。

如果是需要對界面,也就是 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM