如何在Xcode 6中實現iOS應用程序本地化
譯文創建什么樣的應用
要將一款iOS應用程序翻譯成其它語言版本需要分為兩步。***,我們需要為應用程序準備面向全部用戶的不同文本、圖像以及其它需要翻譯的代碼及故事板內容。這個步驟被稱為國際化(I18N)。
在完成應用程序的國際化調整之后,大家就做好了應用程序本地化的先期準備。在這里,我們要將資源導出并發送給翻譯人員。當資源被翻譯妥當之后,我們再將其重新導入至Xcode,這時應用程序已經準備好支持其它自然語言了。
1. 設置
我們將利用一款簡單的示例應用來感受整個本地化過程。要創建一個新的Xcode項目,大家需要從Single View Application當中獲取模板,而后將新項目命名為LocalizationExcample。
接下來,我們需要創建一套簡單的用戶界面,這樣我們就能直接觀看到本地化的運行效果。在Main.storyboard當中添加一個標簽及一個圖像視圖。將該標簽的文本內容變更為“Hello, World!”。大家可以點擊此處下載圖像資源,而后將en/logo.png添加到自己的Xcode項目當中(請確保Copy items if needed項目被正確勾選),并通過將其Image字段變更為logo.png來將其顯示在圖像視圖當中。除此之外,我們還需要確保將一個Center Horizontally in Container布局規則添加到這兩類用戶界面元素當中。
大家還需要了解如何對應用中的硬編碼字符串進行本地化,因此接下來我們向AppDelegate.m當中添加一條控制臺信息。將以下日志語句添加到applicationDidFinishLaunching當中:
- - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
- NSLog(@"Hello, World!");
- return YES;
在這里,我們需要對三種資源進行本地化處理,分別為一幅圖像、一個標簽以及一條硬編碼字符串。請注意,開發一款本地化應用程序在很大程度上類似于創建普通的非本地化應用。大家可以配置視圖并定義定制化操作,而無需過多考慮本地化機制。本地化的大部分事務都要在基礎功能正常起效之后才會被擺上議事日程。
2. 國際化
現在我們已經擁有一個可以進行實驗的基礎應用程序,接下來就是對其加以國際化處理。在這里,我們準備將各項資源從整體代碼當中劃分出來進行本地化。Xcode提供了多項國際化處理功能,這將幫助大家更為輕松地實現應用成果的本地化調整。
***步:準備故事板
首先,我們需要了解如何對應用程序的用戶界面進行國際化處理。***步是告知Xcode我們希望支持的區域或者地理位置。在Project Navigator當中點擊LocalizationsExample項目,而后選擇彈出列表左上方的藍色項目圖標。
在Localizations選項當中,大家可以為應用程序添加位置。在此次示例當中,我們將把自己的示例項目翻譯成西班牙版本,因此點擊加號并選擇Spanish(es)。這時系統將開啟一個對話窗口,詢問大家要對現有資源進行何種操作。請確保如下圖所示在Main.storyboard與LaunchScreen.xib中選定Localizable Strings項目。點擊Finish以進行下一步。
這時我們將在Main.storyboard之下找到兩個新項目,其一為base故事板,其二為一個Main.strings文件。前者是我們的實際故事板文件,后者則為包含有全部面向用戶之故事板文本的字符串文件。該字符串文件正是最終需要進行翻譯的對象。
現在Main.storyboard文件已經完成了國際化處理,并準備好迎接本地化調整。
第二步:準備硬編碼字符串
面向用戶的字符串以硬編碼形式存在于Objective-C/Swift類當中,我們需要對其進行特殊處理。舉例來說,如果大家需要在故事板中對用戶界面元素進行編程化設置,那么這個步驟將必不可少。
幸運的是,硬編碼字符串的國際化處理只需要非常簡單的流程。我們要做的就是將其放置于一條NSLocalizedString宏中,如下所示:
- - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
- NSString *greeting = NSLocalizedString(@"Hello, World!", @"A friendly greeting");
- NSLog(@"%@", greeting);
- return YES;
- }
***條參數是指向我們要查找的字符串的鍵,而第二條(可選)參數則屬于將被包含在導出字符串文件中的注釋。大家可以使用抽象型、扁式鍵(例如@"greeting"),但我發現如果將需要翻譯的實際字符作為鍵、代碼內容會變得更具可讀性。
在下一節中,任何NSLocalizedString調用都會自動被從我們的代碼中提取出來、并被添加到需要翻譯的字符串列表當中。
3. 定位
一旦應用程序的國際化工作完成,我們就做好了對資源進行本地化處理的全部前期準備。本地化是一項相當簡單的任務,我們只需要將全部有待翻譯的字符串導出,將內容移交給翻譯人員,***把翻譯結果導回至項目當中即可。我們在應用程序開發過程中可以隨時進行這套導出/翻譯/導入流程,不過通常來講最理想的處理方式是在開始進行本地化處理前首先完成用戶界面的主體設置。
***步:導出字符串
Xcode能夠讓我們輕松將全部國際化字符串導出為單一XML Localization Interchange File Format(即XML本地化交換文件格式,后綴名為.xliff)文件,這也是業界所使用的標準本地化文件格式。
要生成該文件,我們需要在Project Navigator當中選擇LocalizationExample,而后依次在Xcode菜單中點擊Editor > Export For Localization…,***選擇Xcode項目之外的一條文件路徑——這是為了避免與現有文件出現混淆。
點擊Save將創建一個新的、包含有es.xliff文件的文件夾。在打開之后,大家會發現其中囊括著大量XML內容、涉及應用程序當中需要進行本地化處理的全部字符串。
這就是我們需要發送給翻譯人員的文件。他們將利用特殊工具對該XML進行編輯,但在我們的示例當中,只需要直接對相關內容進行編輯即可。打開es.xliff文件并搜索文本“Hello, World!”。這時,大家應該會找到兩個獨立的<trans-unit>元素,如下所示。
- <trans-unit id="Cns-Fc-27j.text">
- <source>Hello, World!</source>
- <target>Hola, Mundo!</target>
- <note>Class = "IBUILabel"; text = "Hello, World!"; ObjectID = "Cns-Fc-27j";</note>
- </trans-unit>
- <!-- ... -->
- <trans-unit id="Hello, World!">
- <source>Hello, World!</source>
- <target>Hola, Mundo!</target> <!-- Add a <target> element -->
- <note>A friendly greeting</note>
- </trans-unit>
如大家在<note>元素當中所見,前一個是來自我們標簽元素中的文本內容,而后一個則是我們添加到NSLocalizedString當中的硬編碼字符串。
將該<target>元素變更為“Hola, Mundo!”。大家可能需要在第二個元素中額外添加一個<target>元素。我們經過翻譯的字符串現在已經準備好被重新載入至Xcode當中了。
第二步:導入字符串
一旦我們在.xliff文件當中完成了內容翻譯工作,接下來大家需要將其重新加載到自己的Xcode項目當中。在Project Navigator當中選定LocalizationExample,而后在Xcode菜單下依次點擊Editor > Import Localizations…。導航至我們在上一章節中更新過的es.xliff文件處,點擊Import按鈕。
現在我們已經成功將西班牙語翻譯內容添加到了應用程序當中。如果各位現在打開Main.strings,就會看到其中經過翻譯的標簽文本。大家還會在Supporting Files組中發現一個新的Localizable.strings文件,其中包含有我們NSLocalizedString消息的翻譯內容。
我們將馬上對翻譯內容進行測試,不過在此之前我們還必須查看字符串之外其它需要進行本地化的資源。
第三步:圖像本地化
對圖像資源進行本地化與字符串本地化在方式上略有差別。首先選擇logo.png,而后在File Inspector當中點擊Localize…按鈕。
系統這時會顯示對話框,詢問該圖像的具體顯示位置。選擇English而后點擊Localize按鈕。Localization項目將提供為一套勾選框列表,在其中分別勾選English與Spanish兩項。
現在圖像本地化處理已經完成,不過我們仍然需要進入我們的Xcode項目并以手動方式替換該圖像的西班牙語版本。使用Finder,導航至包含有Xcode項目的文件夾后打開LocalizationExample文件夾。這時大家會在其中發現一個en.lproj文件夾和一個es.lproj文件夾。
這就是iOS應用程序內部顯示其本地化資源的方式。英語資源將被放置在en.lproj文件夾中,西班牙語資源被放置在es.lproj文件夾內,共享資源則被放置在Base.lproj文件夾處。在這里,我們要利用本文開篇處下載得到的es/logo.png替換掉es.lproj/logo.png。其它資源,包括數據、音效以及視頻文件都能夠以同樣的方式實現本地化。
4. 測試本地化效果
大家應該注意在物理設備上對自己的本地化方案效果進行測試,不過利用iOS模擬器進行測試也同樣可行。在Xcode當中導航至Product > Scheme > Edit Scheme…菜單項以啟用項目編輯器。而后在列表左側選擇Run,打開Options標簽并將Application Language變更為Spanish。
到這里我們的本地化工作就全部完成了。下一次當大家在iOS模擬器中運行應用程序時,就會看到西班牙語版本的標簽、圖像視圖以及控制臺消息等內容了。
總結
對iOS應用程序進行本地化處理需要進行一系列額外操作,不過Xcode提供的流程既易于現實且非常直觀。在今天的教程中,大家已經了解到了國際化與本地化兩類操作之間的區別,同時掌握了在iOS應用程序中如何利用Xcode內置工具完成字符串與資源本地化處理所需要的各項步驟。