本文轉(zhuǎn)載至?http://www.cocoachina.com/industry/20140526/8554.html 這篇教程將通過一款名為iLikeIt的應(yīng)用帶你了解最基礎(chǔ)的國際化概念,并為你的應(yīng)用添加國際化的支持。該示例應(yīng)用有一個(gè)標(biāo)簽和一個(gè)You Like?按鈕,用戶無論何時(shí)點(diǎn)擊You Like?,一些樂觀的銷售數(shù)
“” 閱讀器
應(yīng)用國際化
本文最初由Sean Berry撰寫,由Ali Hafizji針對iOS 7進(jìn)行了更新。
開發(fā)一款偉大的iOS應(yīng)用程序是件了不起的事情,但是還有比優(yōu)秀的代碼、華麗的設(shè)計(jì)以及直觀化交互更多的事要做。躋身在App Store排行榜前列還需要正合時(shí)宜的產(chǎn)品營銷、擴(kuò)大用戶群的能力、實(shí)用的工具以及盡可能廣泛地獲得用戶的技術(shù)。 對很多開發(fā)者來說,國際市場是事后的想法,但由于App Store提供了無縫的全球分享模式,任何iOS開發(fā)者都可以通過一鍵點(diǎn)擊把應(yīng)用程序發(fā)布至超過150個(gè)國家的市場。亞洲和歐洲代表了潛在客戶不斷增長的市場,這兩個(gè)市場中很多人都不是以英語為母語,但是為了讓應(yīng)用充分利用市場的潛力,你至少要把應(yīng)用語言國際化。 這篇教程將通過一款名為iLikeIt的應(yīng)用帶你了解最基礎(chǔ)的國際化概念,并為你的應(yīng)用添加國際化的支持。該示例應(yīng)用有一個(gè)標(biāo)簽和一個(gè)You Like?按鈕,用戶無論何時(shí)點(diǎn)擊You Like?,一些樂觀的銷售數(shù)據(jù)和對應(yīng)的圖片就會(huì)從按鈕下方淡入顯示。 不過現(xiàn)在,該應(yīng)用僅僅有英語版本。
? 注意:國際化另一個(gè)重要的方面是使用Auto Layout改變文本的大小。不過為了讓本教程盡可能地簡單,我們不會(huì)主要關(guān)注Auto Layout。對于Auto Layout這個(gè)話題,我們另有其他教程。
國際化 vs 本地化( Internationalization vs Localization ) 在你開始學(xué)習(xí)本教程之前,很重要的一點(diǎn)是了解國際化和本地化之間的不同之處,很多人經(jīng)常會(huì)把這兩個(gè)概念搞混。 簡單說,國際化是一個(gè)應(yīng)用程序國際兼容性設(shè)計(jì)的過程,比如: 1.以用戶母語處理文本輸入和輸出; 2.處理不同的日期、時(shí)間以及數(shù)字格式; 3.利用適當(dāng)?shù)臍v法和時(shí)區(qū)處理數(shù)據(jù); 國際化是一項(xiàng)你和開發(fā)者通過利用系統(tǒng)提供的API來實(shí)現(xiàn)的活動(dòng),并在代碼上做一些補(bǔ)充和修改,從而讓應(yīng)用的中文版、阿拉伯語版本和英文版一樣好。 相比之下,本地化僅僅是把應(yīng)用的用戶界面和資源翻譯成不同的語言,這是你可以也應(yīng)該交給別人做的工作,除非你能精通app應(yīng)該支持的每種語言。
現(xiàn)在開始( Getting Started ) 第一步是downloadiLikeIt項(xiàng)目,我們將會(huì)在整個(gè)教程中使用它。 在Xcode 5中打開該項(xiàng)目,并在模擬器上運(yùn)行,你將會(huì)看到以下界面: 從截圖中看出,你需要本地化四個(gè)項(xiàng)目: UI元素: Hello ?Label UI元素: ?You like? ?Button 銷售數(shù)據(jù)文本: Yesterday you sold 1000000 apps ? 圖片文本: I LIKE IT ? 花一小會(huì)兒時(shí)間瀏覽文件和文件夾來熟悉下項(xiàng)目結(jié)構(gòu)。 Main.storyboard包含單個(gè)屏幕,它是ViewController類的實(shí)例。
從代碼中分離文本 目前,應(yīng)用展示的所有文本都是以硬編碼字符串存在于Main.storyboard和ViewController里。為了本地化這些字符串,你需要把它們放在一個(gè)單獨(dú)的文件中。 你將會(huì)在包中簡單地引用這些字符串,而不是在你的方法中進(jìn)行硬編碼。 Xcode使用帶有".strings" 擴(kuò)展名的文件來儲(chǔ)存和檢索app中使用的所有字符串,以支持每種語言。根據(jù)iOS設(shè)備當(dāng)前使用的語言,代碼中一個(gè)簡單的方法調(diào)用將會(huì)查找并返回要求的字符數(shù)串。 試試看,打開 File>New>File,選擇Resource中Strings Fils,如圖: 點(diǎn)擊下一步,為文件命名為Localizable.strings,然后點(diǎn)擊save。
? 注意:Localizable.strings是iOS用來本地化文本默認(rèn)的文件名稱。請抑制以其他內(nèi)容給它命名的沖動(dòng),否則以后你每次引用本地化字符串的時(shí)候要一次次輸入.strings 文件名。
現(xiàn)在,你已經(jīng)創(chuàng)建了Localizable.strings文件,你需要添加所有的文本--當(dāng)前硬編碼在app中的文本。你需要遵從一個(gè)特定但簡單的格式:
"KEY"?=?"CONTENT";? 這些鍵/內(nèi)容對功能就像NSDictionary ,慣例是使用默認(rèn)的內(nèi)容翻譯作為內(nèi)容的鍵:比如You Like?,你應(yīng)該寫:
"You?like?"?=?"You?like?";? Key/content對也可以包含格式化字符串:
"Yesterday?you?sold?%@?apps"?=?"Yesterday?you?sold?%@?apps";? 現(xiàn)在切換至ViewController.m,找到viewDidLoad方法,現(xiàn)在app會(huì)為likeButton和salesCountLabel設(shè)置文本,展示如下:
_salesCountLabel.text?=?[NSString?stringWithFormat:@"Yesterday?you?sold?%@?apps",?@(1000000)];? [_likeButton?setTitle:@"You?like?"?forState:UIControlStateNormal];? 取而代之的方法是,你需要從此前創(chuàng)建的Localizable.strings文件中讀入字符串。用一個(gè)名為NSLocalizedString的宏修改這兩行代碼如下所示:
_salesCountLabel.text?=?[NSString?stringWithFormat:NSLocalizedString(@"Yesterday?you?sold?%@?apps",?nil),?@(1000000)];? [_likeButton?setTitle:NSLocalizedString(@"You?like?",?nil)?forState:UIControlStateNormal];? 宏包將一個(gè)稍長的代碼片段包裹為一個(gè)更易于管理的長度,它使用#define指令創(chuàng)建。如果你想知道NSLocalizedString宏是什么,可按住Control鍵并在NSLocalizedString點(diǎn)擊,可以看到它的定義如下:
#define?NSLocalizedString(key,?comment)?? ????[[NSBundle?mainBundle]?localizedStringForKey:(key)?value:@""?table:nil]? 在當(dāng)前的語言中,NSLocalizedString宏使用localizedStringForKey方法查找給定鍵值的字符串。它為table name傳遞nil,所以它使用默認(rèn)的字符串文件名(Localizable.strings)。更多細(xì)節(jié),可查看蘋果的NSBundle Class Reference。
? 注意:這個(gè)宏把注釋作為一個(gè)參數(shù),但似乎沒什么用。不像此前那樣需要手動(dòng)把每個(gè)key/value對鍵入Localizable.strings,你還可以使用iOS?SDK帶的一個(gè)叫做genstrings的工具來自動(dòng)處理(非常適用于大型項(xiàng)目)。
如果使用這個(gè)方法,你可以為每個(gè)字符串加上一個(gè)注釋,注釋會(huì)顯示在默認(rèn)的字符串邊上,作為translator的輔助。比如你可以添加一個(gè)注釋指出字符串在哪里使用。 已經(jīng)有了足夠的背景信息,現(xiàn)在開始吧! 創(chuàng)建并運(yùn)行你的項(xiàng)目,并且它應(yīng)該像之前一樣在主屏幕上展示相同的文本,但是西班牙文在哪里?現(xiàn)在你的應(yīng)用已經(jīng)進(jìn)行了本地化設(shè)置,添加翻譯是小事一樁。
添加西班牙語本地化( Adding a Spanish Localization ) 想要添加支持另一種語言,你可以點(diǎn)擊左窗格中的iLikeIt項(xiàng)目文件夾,在旁邊的窗格中選擇Project(不是 Target),然后在Info標(biāo)簽下你會(huì)看到一個(gè)Localizations分區(qū)。點(diǎn)擊點(diǎn)擊“+”,然后選擇Spanish (es)。 下個(gè)屏幕會(huì)詢問你哪些文件需要本地化。選中所有文件并點(diǎn)擊Finish。注意:Localizable.strings沒有展示在這個(gè)列表中,不過不用驚慌! 在這一點(diǎn)上,Xcode已經(jīng)在幕后設(shè)置好了一些目錄,針對你選擇的語言,這些目錄包含不同版本的InfoPlist.strings和Main.storyboard。你可以使用Finder打開項(xiàng)目文件夾看看,你會(huì)看到如圖所示: 看到en.lproj和es.lproj了嗎?它們包含文件的特定語言版本。 en是English的本地化代碼,es是Spanish的本地化代碼。關(guān)于其他語言,可參看完整的語言代碼列表。 從現(xiàn)在開始,當(dāng)你的app想要獲得某個(gè)文件的英文版,它就會(huì)去en.lproj中查找,而當(dāng)它想要某個(gè)文件的西班牙語版時(shí),它就會(huì)去es.lproj找。非常簡單!把你的資源文件放在合適的文件夾里,剩下的事情就交給iOS負(fù)責(zé)了。 但是等等,Localizable.strings呢?想讓Xcode知道你想將它本地化,那你可以在左窗格里選中文件,然后在右窗格中打開File Inspector。 你會(huì)看到一個(gè)Localize標(biāo)簽,點(diǎn)擊并選擇英語(因?yàn)楫?dāng)前是英語),最后點(diǎn)擊Localize。 現(xiàn)在File Inspector面板將會(huì)展示文件所屬的語言。目前,正如你所看到的,文件只針對英文進(jìn)行本地化。可通過點(diǎn)擊Spanish左邊的框框添加西班牙語本地化。 回到左窗格并點(diǎn)擊Localizable.strings旁邊的箭頭,它會(huì)顯示出子元素。現(xiàn)在文件已經(jīng)有了兩個(gè)版本:一個(gè)是英文本,一個(gè)是西班牙語版。 想修改西班牙語的文本,可選擇Localizable.strings (Spanish),并用如下內(nèi)容替代它的內(nèi)容:
"Yesterday?you?sold?%@?apps"?=?"Ayer?le?vendió?%@?aplicaciones";? "You?like?"?=?"~Es?bueno?~";? 恭喜!現(xiàn)在你的應(yīng)用支持兩種語言了! 為了測試和驗(yàn)證所有事情都正常工作,你可以在模擬器/設(shè)備上把展示語言更改為Spanish,方法是打開設(shè)置應(yīng)用,然后選擇:General -> International -> Language -> Espanol. 如果 Xcode debugger仍在運(yùn)行中,你可以在Xcode中點(diǎn)擊“stop”,然后點(diǎn)擊“Build & Run”,你將會(huì)看到:
地區(qū)vs語言(Locale vs Language) 100萬是個(gè)相當(dāng)不錯(cuò)的銷售數(shù)據(jù),我們可以為它添加一些格式讓它看起來更好! 打開ViewController.m并將為_salesCountLabel設(shè)置文本的代碼行替換為:
NSNumberFormatter?*numberFormatter?=?[[NSNumberFormatter?alloc]?init];? [numberFormatter?setNumberStyle:NSNumberFormatterDecimalStyle];? NSString?*numberString?=?[numberFormatter?stringFromNumber:@(1000000)];? _salesCountLabel.text?=?[NSString?stringWithFormat:NSLocalizedString(@"Yesterday?you?sold?%@?apps",?nil),?numberString];? 編譯并運(yùn)行應(yīng)用程序,那么數(shù)字就會(huì)更容易辨認(rèn)一些。 這對美國人來說非常棒,但在西班牙,100萬寫作“1.000.000″而不是“1,000,000″。在西班牙文環(huán)境下運(yùn)行應(yīng)用程序,你將會(huì)看到逗號用來隔開0。在iOS中,數(shù)字格式化是基于地區(qū)/國家,而不是語言,所以為了了解某個(gè)西班牙人如何查看銷售數(shù)據(jù),可打開Settings.ap,并通過導(dǎo)航改變區(qū)域:General -> International -> Region Format -> Spanish -> Spain 在此編譯和運(yùn)行應(yīng)用程序,現(xiàn)在你會(huì)看到正確的數(shù)字格式: 一點(diǎn)額外的前期工作,NSNumberFormatter會(huì)自動(dòng)為合適的區(qū)域格式化你的數(shù)字。可能的情況下,請拒絕重新發(fā)明輪子,因?yàn)樵趇OS上,通常按照蘋果的方式做才能有回報(bào)。
國際化Storyboards(Internationalizing Storyboards) Storyboard中的元素,比如標(biāo)簽、按鈕以及圖片可以在代碼中或者直接在storyboard中設(shè)置。在設(shè)置文本編程時(shí),你已經(jīng)學(xué)會(huì)了如何支持多種語言,但是屏幕頂部的“Hello”標(biāo)簽沒有IBOutlet,只能在Main.storyboard中設(shè)置它的文本。 你可以添加一個(gè)IBOutlet,將其連接到Main.storyboard中的label上,然后使用NSLocalizedString設(shè)置其文本屬性,就像使用likeButton和 ?salesCountLabel那樣,但是這里有一個(gè)本地化storyboard元素更簡單的方法,不需要任何附加代碼。 打開Main.storyboard左側(cè)的小三角形,你會(huì)看到Main.storyboard (Base)和Main.storyboard (Spanish)。點(diǎn)擊Main.storyboard (Spanish)打 開編輯器,你會(huì)看到storyboard中的本地化文本。你已經(jīng)有了一個(gè)Hello標(biāo)簽入口,如下:
"pUp-yc-27W.text"?=?"Hello";? 用西班牙語翻譯的“Hola”替換兩個(gè)“Hello”:
"pUp-yc-27W.text"?=?"Hola";? ? 注意:絕對不要直接改變自動(dòng)生成的ObjectID,也不要復(fù)制和粘貼上邊的代碼行,因?yàn)闃?biāo)簽的ObjectID可能已經(jīng)跟上邊展示的不一樣了。
圖片的國際化(Internationalizing Images) 由于應(yīng)用程序使用了包含英語文本的圖片,所以你需要把圖片本地化,因?yàn)榱懔闵⑸⒌挠⑽奈谋緯?huì)讓你的西班牙應(yīng)用看起來很不專業(yè),并且也有損于應(yīng)用的整體易用性和市場潛力。 本地化圖片,首先需要下載西班牙語版本的圖片(在大多數(shù)瀏覽器上是右鍵點(diǎn)擊>保存為): 打開Images.xcassets,拖放此前下載的圖片megusta.png并添加至左側(cè)的圖片列表,從而把圖片添加至資產(chǎn)Asset catalog。Asset catalogs不能被國際化,所以你需要有一個(gè)方法來本地化圖片。 打開Localizable.strings (English) ,并添加如下內(nèi)容:
"imageName"?=?"ilike";? 把以下代碼添加至Localizable.strings (Spanish)文件:
"imageName"?=?"megusta";? 從現(xiàn)在開始,你將使用imageName key來檢索本地化版本的圖片。打開ViewController.m并把如下代碼添加到viewDidLoad方法中:
[_imageView?setImage:[UIImage?imageNamed:NSLocalizedString(@"imageName",?nil)]];? 如果需要,將模擬器/設(shè)備切換到西班牙語,編譯并運(yùn)行,然后你會(huì)看到本地化圖片的展示。 現(xiàn)在你已經(jīng)有了將應(yīng)用程序針對多種不同語言本地化所需的所有工具。
? 注意:這僅適用于每種語言有不同文件名的情況。一個(gè)更好的方法是本地化資源文件夾,如這篇文章所描述的那樣。
額外獎(jiǎng)勵(lì) 作為最后的獎(jiǎng)勵(lì),我們來本地化應(yīng)用的名字。Info.plist有一個(gè)特殊的文件(InfoPlist.strings),你可以在里邊用字符串覆蓋其他語言。為給應(yīng)用程序一個(gè)不同的西班牙語名字,可打開Supporting Files > InfoPlist.strings (Spanish),并插入以下代碼:
"CFBundleDisplayName"?=?"Me?Gusta";? 它改變了應(yīng)用的名稱,像Springboard上展示的那樣。
練習(xí):國際化音頻文件(Exercise: Internationalizing Audio files) 學(xué)習(xí)到這里,你應(yīng)該熟悉了基本的國際化知識(shí)。這是一個(gè)簡單的練習(xí),你可以通過兩個(gè)不同的音頻文件(一個(gè)是英文版,一個(gè)是西班牙語版)來測試下自己新掌握的知識(shí),并基于用戶選擇的語言播放合適的文件。 以下是必要步驟的簡單描述: 1.下載示例音頻文件(sample audio files)。 2.把box-en.wav首個(gè)音頻文件拷貝到項(xiàng)目中。 3.打開音頻文件inspector,選擇本地化按鈕,確保你選擇了英語和西班牙語作為支持語言。 4.重命名第二個(gè)音頻文件(box-es.wav),和第一個(gè)名字(box-en.wav)一樣,然后將其拷貝到es.Iproj文件夾。 5.確保你在Finder提示中選擇了“Replace File”。
何去何從 Final Project包含了你在該教程中所寫的全部代碼。 現(xiàn)在你知道了國際化一款iPhone app所需的基本技術(shù),那就為你現(xiàn)有的應(yīng)用添加外語支持吧,或者在設(shè)計(jì)下一款應(yīng)用時(shí)為其添加一門外語支持。正如你所看到的那樣,這幾乎沒有花費(fèi)多少時(shí)間,而它將會(huì)讓你的應(yīng)用接觸到更寬廣更多樣化的受眾,并且你的非英語用戶也會(huì)感謝你! 對于實(shí)際的翻譯,你可以使用Google的免費(fèi)翻譯服務(wù)(http://www.google.com/translate),但結(jié)果可能不是絲毫不差的。如果你可以花點(diǎn)錢,那么你可以考慮蘋果的Internationalization and Localization頁面下方列出了第三方服務(wù)提供商。 如果你有任何關(guān)于國際化的問題或建議,請加入論壇討論! 原文:Internationalization Tutorial for iOS [2014 Edition]
總結(jié)
以上是生活随笔 為你收集整理的iOS应用国际化教程(2014版) 的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔 推薦給好友。