iOS應用國際化教程(2014版)

本文最初由Sean Berry撰寫,由Ali Hafizji針對iOS 7進行了更新。php

開發一款偉大的iOS應用程序是件了不得的事情,可是還有比優秀的代碼、華麗的設計以及直觀化交互更多的事要作。躋身在App Store排行榜前列還須要正合時宜的產品營銷、擴大用戶羣的能力、實用的工具以及儘量普遍地得到用戶的技術。html

 

對不少開發者來講,國際市場是過後的想法,但因爲App Store提供了無縫的全球分享模式,任何iOS開發者均可以經過一鍵點擊把應用程序發佈至超過150個國家的市場。亞洲和歐洲表明了潛在客戶不斷增加的市場,這兩個市場中不少人都不是以英語爲母語,可是爲了讓應用充分利用市場的潛力,你至少要把應用語言國際化。ios

 

這篇教程將經過一款名爲iLikeIt的應用帶你瞭解最基礎的國際化概念,併爲你的應用添加國際化的支持。該示例應用有一個標籤和一個You Like?按鈕,用戶不管什麼時候點擊You Like?,一些樂觀的銷售數據和對應的圖片就會從按鈕下方淡入顯示。編程

 

不過如今,該應用僅僅有英語版本。瀏覽器

 注意:國際化另外一個重要的方面是使用Auto Layout改變文本的大小。不過爲了讓本教程儘量地簡單,咱們不會主要關注Auto Layout。對於Auto Layout這個話題,咱們另有其餘教程

 

國際化 vs 本地化(Internationalization vs Localizationapp

在你開始學習本教程以前,很重要的一點是瞭解國際化和本地化之間的不一樣之處,不少人常常會把這兩個概念搞混。編輯器

 

簡單說,國際化是一個應用程序國際兼容性設計的過程,好比:ide

1.以用戶母語處理文本輸入和輸出;工具

2.處理不一樣的日期、時間以及數字格式;學習

3.利用適當的曆法和時區處理數據;

 

國際化是一項你和開發者經過利用系統提供的API來實現的活動,並在代碼上作一些補充和修改,從而讓應用的中文版、阿拉伯語版本和英文版同樣好。

 

相比之下,本地化僅僅是把應用的用戶界面和資源翻譯成不一樣的語言,這是你能夠也應該交給別人作的工做,除非你能精通app應該支持的每種語言。

 

如今開始(Getting Started

第一步是downloadiLikeIt項目,咱們將會在整個教程中使用它。

 

在Xcode 5中打開該項目,並在模擬器上運行,你將會看到如下界面:

從截圖中看出,你須要本地化四個項目:

UI元素: Hello  Label

UI元素:  You like?  Button

銷售數據文本: Yesterday you sold 1000000 apps  

圖片文本: I LIKE IT  

 

花一小會兒時間瀏覽文件和文件夾來熟悉下項目結構。 Main.storyboard包含單個屏幕,它是ViewController類的實例。

 

從代碼中分離文本

目前,應用展現的全部文本都是以硬編碼字符串存在於Main.storyboard和ViewController裏。爲了本地化這些字符串,你須要把它們放在一個單獨的文件中。

你將會在包中簡單地引用這些字符串,而不是在你的方法中進行硬編碼。

 

Xcode使用帶有".strings" 擴展名的文件來儲存和檢索app中使用的全部字符串,以支持每種語言。根據iOS設備當前使用的語言,代碼中一個簡單的方法調用將會查找並返回要求的字符數串。

 

試試看,打開 File>New>File,選擇Resource中Strings Fils,如圖:

點擊下一步,爲文件命名爲Localizable.strings,而後點擊save。

 注意:Localizable.strings是iOS用來本地化文本默認的文件名稱。請抑制以其餘內容給它命名的衝動,不然之後你每次引用本地化字符串的時候要一次次輸入.strings 文件名。

 

如今,你已經建立了Localizable.strings文件,你須要添加全部的文本--當前硬編碼在app中的文本。你須要聽從一個特定但簡單的格式:

"KEY" = "CONTENT";

 

這些鍵/內容對功能就像NSDictionary ,慣例是使用默認的內容翻譯做爲內容的鍵:好比You Like?,你應該寫:

"You like?" = "You like?";

 

Key/content對也能夠包含格式化字符串:

"Yesterday you sold %@ apps" = "Yesterday you sold %@ apps";

 

如今切換至ViewController.m,找到viewDidLoad方法,如今app會爲likeButton和salesCountLabel設置文本,展現以下:

_salesCountLabel.text = [NSString stringWithFormat:@"Yesterday you sold %@ apps", @(1000000)]; [_likeButton setTitle:@"You like?" forState:UIControlStateNormal];

 

取而代之的方法是,你須要今後前建立的Localizable.strings文件中讀入字符串。用一個名爲NSLocalizedString的宏修改這兩行代碼以下所示:

_salesCountLabel.text = [NSString stringWithFormat:NSLocalizedString(@"Yesterday you sold %@ apps", nil), @(1000000)]; [_likeButton setTitle:NSLocalizedString(@"You like?", nil) forState:UIControlStateNormal];

 

宏包將一個稍長的代碼片斷包裹爲一個更易於管理的長度,它使用#define指令建立。若是你想知道NSLocalizedString宏是什麼,可按住Control鍵並在NSLocalizedString點擊,能夠看到它的定義以下:

#define NSLocalizedString(key, comment)      [[NSBundle mainBundle] localizedStringForKey:(key) value:@"" table:nil]

在當前的語言中,NSLocalizedString宏使用localizedStringForKey方法查找給定鍵值的字符串。它爲table name傳遞nil,因此它使用默認的字符串文件名(Localizable.strings)。更多細節,可查看蘋果的NSBundle Class Reference

 

 注意:這個宏把註釋做爲一個參數,但彷佛沒什麼用。不像此前那樣須要手動把每一個key/value對鍵入Localizable.strings,你還可使用iOS SDK帶的一個叫作genstrings的工具來自動處理(很是適用於大型項目)。

 

若是使用這個方法,你能夠爲每一個字符串加上一個註釋,註釋會顯示在默認的字符串邊上,做爲translator的輔助。好比你能夠添加一個註釋指出字符串在哪裏使用。

 

已經有了足夠的背景信息,如今開始吧!

 

建立並運行你的項目,而且它應該像以前同樣在主屏幕上展現相同的文本,可是西班牙文在哪裏?如今你的應用已經進行了本地化設置,添加翻譯是小事一樁。

 

添加西班牙語本地化(Adding a Spanish Localization

想要添加支持另外一種語言,你能夠點擊左窗格中的iLikeIt項目文件夾,在旁邊的窗格中選擇Project(不是 Target),而後在Info標籤下你會看到一個Localizations分區。點擊點擊「+」,而後選擇Spanish (es)。

 

下個屏幕會詢問你哪些文件須要本地化。選中全部文件並點擊Finish。注意:Localizable.strings沒有展現在這個列表中,不過不用驚慌!

 

在這一點上,Xcode已經在幕後設置好了一些目錄,針對你選擇的語言,這些目錄包含不一樣版本的InfoPlist.strings和Main.storyboard。你可使用Finder打開項目文件夾看看,你會看到如圖所示:

看到en.lproj和es.lproj了嗎?它們包含文件的特定語言版本。

 

en是English的本地化代碼,es是Spanish的本地化代碼。關於其餘語言,可參看完整的語言代碼列表

 

從如今開始,當你的app想要得到某個文件的英文版,它就會去en.lproj中查找,而當它想要某個文件的西班牙語版時,它就會去es.lproj找。很是簡單!把你的資源文件放在合適的文件夾裏,剩下的事情就交給iOS負責了。

 

可是等等,Localizable.strings呢?想讓Xcode知道你想將它本地化,那你能夠在左窗格里選中文件,而後在右窗格中打開File Inspector。

 

你會看到一個Localize標籤,點擊並選擇英語(由於當前是英語),最後點擊Localize。

 

如今File Inspector面板將會展現文件所屬的語言。目前,正如你所看到的,文件只針對英文進行本地化。可經過點擊Spanish左邊的框框添加西班牙語本地化。

 

回到左窗格並點擊Localizable.strings旁邊的箭頭,它會顯示出子元素。如今文件已經有了兩個版本:一個是英文本,一個是西班牙語版。

想修改西班牙語的文本,可選擇Localizable.strings (Spanish),並用以下內容替代它的內容:

"Yesterday you sold %@ apps" = "Ayer le vendió %@ aplicaciones"; "You like?" = "~Es bueno?~";

恭喜!如今你的應用支持兩種語言了!

 

爲了測試和驗證全部事情都正常工做,你能夠在模擬器/設備上把展現語言更改成Spanish,方法是打開設置應用,而後選擇:General -> International -> Language -> Espanol.

 

若是 Xcode debugger仍在運行中,你能夠在Xcode中點擊「stop」,而後點擊「Build & Run」,你將會看到:

地區vs語言(Locale vs Language)

100萬是個至關不錯的銷售數據,咱們能夠爲它添加一些格式讓它看起來更好!

 

打開ViewController.m並將爲_salesCountLabel設置文本的代碼行替換爲:

NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init]; [numberFormatter setNumberStyle:NSNumberFormatterDecimalStyle]; NSString *numberString = [numberFormatter stringFromNumber:@(1000000)]; _salesCountLabel.text = [NSString stringWithFormat:NSLocalizedString(@"Yesterday you sold %@ apps", nil), numberString];

編譯並運行應用程序,那麼數字就會更容易辨認一些。

這對美國人來講很是棒,但在西班牙,100萬寫做「1.000.000″而不是「1,000,000″。在西班牙文環境下運行應用程序,你將會看到逗號用來隔開0。在iOS中,數字格式化是基於地區/國家,而不是語言,因此爲了瞭解某個西班牙人如何查看銷售數據,可打開Settings.ap,並經過導航改變區域:General -> International -> Region Format -> Spanish -> Spain

在此編譯和運行應用程序,如今你會看到正確的數字格式:

 

 

一點額外的前期工做,NSNumberFormatter會自動爲合適的區域格式化你的數字。可能的狀況下,請拒絕從新發明輪子,由於在iOS上,一般按照蘋果的方式作纔能有回報。

 

國際化Storyboards(Internationalizing Storyboards)

Storyboard中的元素,好比標籤、按鈕以及圖片能夠在代碼中或者直接在storyboard中設置。在設置文本編程時,你已經學會了如何支持多種語言,可是屏幕頂部的「Hello」標籤沒有IBOutlet,只能在Main.storyboard中設置它的文本。

 

你能夠添加一個IBOutlet,將其鏈接到Main.storyboard中的label上,而後使用NSLocalizedString設置其文本屬性,就像使用likeButton和  salesCountLabel那樣,可是這裏有一個本地化storyboard元素更簡單的方法,不須要任何附加代碼。

 

打開Main.storyboard左側的小三角形,你會看到Main.storyboard (Base)和Main.storyboard (Spanish)。點擊Main.storyboard (Spanish)打

 

開編輯器,你會看到storyboard中的本地化文本。你已經有了一個Hello標籤入口,以下:

/* Class = "IBUILabel"; text = "Hello"; ObjectID = "pUp-yc-27W"; */ "pUp-yc-27W.text" = "Hello";

用西班牙語翻譯的「Hola」替換兩個「Hello」:

/* Class = "IBUILabel"; text = "Hola"; ObjectID = "pUp-yc-27W"; */ "pUp-yc-27W.text" = "Hola";

 

 注意:絕對不要直接改變自動生成的ObjectID,也不要複製和粘貼上邊的代碼行,由於標籤的ObjectID可能已經跟上邊展現的不同了。

 

圖片的國際化(Internationalizing Images)

因爲應用程序使用了包含英語文本的圖片,因此你須要把圖片本地化,由於零零散散的英文文本會讓你的西班牙應用看起來很不專業,而且也有損於應用的總體易用性和市場潛力。

 

本地化圖片,首先須要下載西班牙語版本的圖片(在大多數瀏覽器上是右鍵點擊>保存爲):

打開Images.xcassets,拖放此前下載的圖片megusta.png並添加至左側的圖片列表,從而把圖片添加至資產Asset catalog。Asset catalogs不能被國際化,因此你須要有一個方法來本地化圖片。

 

打開Localizable.strings (English) ,並添加以下內容:

"imageName" = "ilike";

把如下代碼添加至Localizable.strings (Spanish)文件:

"imageName" = "megusta";

從如今開始,你將使用imageName key來檢索本地化版本的圖片。打開ViewController.m並把以下代碼添加到viewDidLoad方法中:

[_imageView setImage:[UIImage imageNamed:NSLocalizedString(@"imageName", nil)]];

若是須要,將模擬器/設備切換到西班牙語,編譯並運行,而後你會看到本地化圖片的展現。

 

如今你已經有了將應用程序針對多種不一樣語言本地化所需的全部工具。

 

 注意:這僅適用於每種語言有不一樣文件名的狀況。一個更好的方法是本地化資源文件夾,如這篇文章所描述的那樣。

額外獎勵

做爲最後的獎勵,咱們來本地化應用的名字。Info.plist有一個特殊的文件(InfoPlist.strings),你能夠在裏邊用字符串覆蓋其餘語言。爲給應用程序一個不一樣的西班牙語名字,可打開Supporting Files > InfoPlist.strings (Spanish),並插入如下代碼:

"CFBundleDisplayName" = "Me Gusta";

它改變了應用的名稱,像Springboard上展現的那樣。

 

練習:國際化音頻文件(Exercise: Internationalizing Audio files)

學習到這裏,你應該熟悉了基本的國際化知識。這是一個簡單的練習,你能夠經過兩個不一樣的音頻文件(一個是英文版,一個是西班牙語版)來測試下本身新掌握的知識,並基於用戶選擇的語言播放合適的文件。

 

如下是必要步驟的簡單描述:

1.下載示例音頻文件(sample audio files)。

2.把box-en.wav首個音頻文件拷貝到項目中。

3.打開音頻文件inspector,選擇本地化按鈕,確保你選擇了英語和西班牙語做爲支持語言。

4.重命名第二個音頻文件(box-es.wav),和第一個名字(box-en.wav)同樣,而後將其拷貝到es.Iproj文件夾。

5.確保你在Finder提示中選擇了「Replace File」。

 

何去何從

Final Project包含了你在該教程中所寫的所有代碼。

 

如今你知道了國際化一款iPhone app所需的基本技術,那就爲你現有的應用添加外語支持吧,或者在設計下一款應用時爲其添加一門外語支持。正如你所看到的那樣,這幾乎沒有花費多少時間,而它將會讓你的應用接觸到更寬廣更多樣化的受衆,而且你的非英語用戶也會感謝你!

 

對於實際的翻譯,你可使用Google的免費翻譯服務(http://www.google.com/translate),但結果可能不是絲絕不差的。若是你能夠花點錢,那麼你能夠考慮蘋果的Internationalization and Localization頁面下方列出了第三方服務提供商。

 

若是你有任何關於國際化的問題或建議,請加入論壇討論!

 

原文:Internationalization Tutorial for iOS [2014 Edition]

相關文章
相關標籤/搜索