3分鐘實現iOS語言本地化/國際化(圖文教程)
前言
語言本地化,又叫做語言國際化。是指根據使用者作業系統的語言設定,自動將應用程式的語言設定為和使用者作業系統語言一致的語言。往往一些應用程式需要提供給多個國家的人群使用,或者一個國家有多種語言,這就要求應用程式所展示的文字、圖片等資訊,能夠讓講不同語言的使用者讀懂、看懂。進而提出為同一個應用程式適配多種語言,也即是國際化。語言國際化之所以又叫做語言本地化,這是站在每個使用者的角度而言的,是指能夠讓使用者本地、本土人群能夠看懂的語言資訊,顧名思義,語言本地化。其實語言本地化 == 語言國際化!
本文將分如下7個主要章節一步一步講解如何完全本地化一個App。
- 配置需要國際化的語言(國際化的準備工作)
- App名稱本地化
- 程式碼中字串本地化
- 多人開發情況下的字串本地化
- 圖片本地化(兩種方式兩種方式)
- 檢視/切換本地語言
- storyboard/xib本地化
配置需要國際化的語言
配置需要國際化的語言,這也是國際化之前的準備工作,無論我們是國際化App名稱、程式碼中的字串、圖片、還是storyboard和xib,都需要進行這一步的準備工作(一個專案中需要且僅需要配置一次)。
選中project->Info->Localizations,然後點選"+",新增需要國際化/本地化的語言,如下圖(預設需要勾選Use Base Internationalization):
此處以新增法語為例,如下圖:
彈出如下對話方塊,直接點選finish,如下圖:
同理,新增簡體中文、繁體中文、韓語,最終結果如下圖:
備註:
“zh-Hans”和“zh-Hant”是簡體中文和繁體中文的縮寫。這是標準的縮寫。H可大寫也可小寫。"en"是英語的縮寫。ko是韓語的縮寫,fr是法語的縮寫。其他語言請百度各國語言縮寫即可查詢。
(一)應用名稱本地化/國際化
應用名稱本地化,是指同一個App的名稱,在不同的語言環境下(也就是手機裝置的語言設定)顯示不同的名稱。比如,微信在簡體中文環境下App名稱顯示為“ 微信 ”,在英語環境下顯示為“ weChat ”。下面就開始進行應用名稱本地化。
選中Info.plist,按下鍵盤上的command + N,選擇 Strings File (iOS->Resource->Strings File)
檔名字命名為 InfoPlist ,且 必須是這個名字 (因每個人電腦設定差異,此處本人電腦沒有顯示strings字尾名):
點選create後,Xcode左側導航列表就會出現名為InfoPlist.strings的檔案,如下圖:
選中InfoPlist.strings,在Xcode的File inspection(Xcode右側檔案檢查器)中點選Localize,目的是選擇我們需要本地化的語言,如下圖:
注意:
在點選Localize之前,一定要保證我們已經添加了需要本地化的語言,也就是上面 配置需要國際化的語言 那一步(步驟:project->Info->Localizations,然後點選"+",新增需要國際化/本地化的語言)。
點選Localize後,會彈出一個對話方塊,展開對話方塊列表,發現下拉列表所展示的語言正是我們在上面配置的需要國際化的語言,選擇我們需要本地化的語言,然後點選對話方塊的Localize按鈕,如下圖:
注意:
如果我們沒有在 PROJECT 中配置需要國際化的語言(project->Info->Localizations,然後點選"+"),上圖下拉列表中將只會出現"Base"和"English"選項,English語言是系統預設的語言,其他需要國際化的語言(例如中文簡體、法語)必須通過上面的 配置本地化語言 那一步手動新增。
然後我們發現Xcode右側的File inspection變成了下圖的樣式:
接下來,勾選French、Chinese(zh-Hans)、Chinese(zh-Hant)、Korean,如下圖:
此時,Xcode左側的InfoPlist.stirings左側多了一個箭頭,點選箭頭可以展開,如下圖所示:
從上圖可以看出,InfoPlist.strings檔案下包含了English、French、Chinese(Simplified)、Chinese(Traditional)、Korean這五種語言的檔案。
原理:程式啟動時,會根據作業系統設定的語言,自動載入InfoPlist.strings檔案下對應的語言檔案,然後顯示應用程式的名字。
接下來,我們分別用不同的語言給InfoPlist.strings下的檔案設定對應的名字。
(1)在InfoPlist.strings(english)中加入如下程式碼:
// Localizable App Name是App在英語環境環境下顯示的名稱 CFBundleDisplayName = "Localizable App Name";
備註:
CFBundleDisplayName可以使用雙引號,也可以不使用雙引號!
(2)在InfoPlist.strings(French)中加入如下程式碼:
CFBundleDisplayName = "Le nom de la localisation de l'App";
(3)在InfoPlist.strings(Chinese(Simplified))中加入如下程式碼:
CFBundleDisplayName = "國際化App名稱";
(4)在InfoPlist.strings(Chinese(Traditional))中加入如下程式碼:
CFBundleDisplayName = "國際化App名稱";
(5)在InfoPlist.strings(Korean)中加入如下程式碼:
CFBundleDisplayName = "현지화 앱 명칭";
修改模擬器語言環境為English。App名稱如下圖:
修改模擬器語言環境為Chinese(Simplified)。App名稱如下圖:
修改模擬器語言環境為Chinese(Traditional)。App名稱如下圖:
修改模擬器語言環境為Franch。App名稱如下圖:
修改模擬器語言環境為Korean。App名稱如下圖:
備註:
過去本地化App名稱,需要在Info.plist檔案中增加一個名為“Application has localized display name”的BOOL型別的Key,並且需要將其值設定為YES(如下圖)。目的是讓App支援本地化App名稱。 但現在可以忽略這一步 。
至此,本地化App名稱已經演示完畢,其步驟就是:
在Project的設定中通過點選"+"新增需要本地化的語言。 然後在Xcode右側的File inspection中點選Localize,選中需要本地化App名稱的語言。 最後在每個語言對應的檔案中以key = value(CFBundleDisplayName = "App名稱";);的形式設定App的名稱。
(二)程式碼中字串的本地化
所謂字串本地化,就是指App內的字串在不同的語言環境下顯示不同的內容。比如,"主頁"這個字串在中文語言環境下顯示“主頁”,在英語環境下顯示“home”。下面就開始進行字串本地化。
其實字元本地化和App名稱本地化過程如出一轍,只是建立的檔名成不一樣(連同字尾一起,檔名必須是Localizable.strings),其他步驟完全相同。為了能夠讓大家徹底瞭解,此處還是會把步驟一一貼出來。
和應用名稱本地化一樣,首先需要command + N,選擇iOS -> Resource -> Strings File
檔名必須命名為 Localizable
備註
:因本人電腦取消隱藏檔案字尾名,所以會自動補全.strings字尾名。
檔案建立成功,檢視Xcode左側導航列表,發現多了一個名為Localizable.strings的檔案,如下圖:
選中Localizable.strings檔案,在Xcode的File inspection中點選Localize,目的是選擇我們需要本地化的語言(和本地化App名稱同理),如下圖:
依次選擇English->Localize,如下圖:
然後我們發現Xcode右側的File inspection變成了下圖的樣式:
然後勾選French、Chinese(zh-Hans)、Chinese(zh-Hant)、Korean,如下圖:
此時,Xcode左側的Localizable.stirings左側多了一個箭頭,展開後,如下圖所示:
然後我們只需要在Localizable.strings下對應的檔案中,分別以Key-Value的形式,為程式碼中每一個需要本地化的字串賦值,如下圖:
本地化程式碼中的字串,如下圖:
我們只需要使用Foundation框架自帶的NSLocalizedString(key,comment)這個巨集根據Key獲取對應的字串,然後賦值給程式碼中的字串。
// NSLocalizedString(key,comment) 本質 // NSlocalizeString 第一個引數是內容,根據第一個引數去對應語言的檔案中取對應的字串,第二個引數將會轉化為字串檔案裡的註釋,可以傳nil,也可以傳空字串@""。 #define NSLocalizedString(key,comment) [[NSBundle mainBundle] localizedStringForKey:(key) value:@"" table:nil]
不同語言環境下
執行效果,如下圖: 英語環境下:
法語環境下:
簡體中文環境下:
繁體中文環境下:
韓語環境下:
如此一來,我們就實現了程式碼中字串的本地化。
技巧
其實,我們不需要給Localizable.strings(English)檔案新增Key-Value。原因如下:系統根據某個key去獲取對應的字串時,如果沒有找到,那麼就會以key作為value返回。所以如果我們在Localizable.strings(English)檔案中沒有新增 click = "hit";那麼在english環境下btn最終顯示的title會是click. 切換語言無需在模擬器中設定,只需要在Xcode中進行如下設定: Edit->Scheme->Run->Arguments Passed On Launch ->-AppleLanguages (語言程式碼)。例如,我們模擬器此時雖然是韓語,如果通過上述步驟設定為zh-Hans,那麼語言環境將會變為漢語,如下圖:
執行效果:
如此一來,切換語言變得更加簡單,無需在模擬器的設定中進行繁瑣的語言切換。
(三)多人開發情況下的字串本地化
專案開發中,獨立開發的還是少數。經常會有多人開發的情況,這種情況,如果多人同時操作本地化檔案,極有可能會存在衝突。另一方面,我們又不希望自己的本地化檔案受到對方的汙染,也就是說,我們不希望對方操作我們的本地化檔案。但是上面介紹的程式碼中字串的本地化是使用的是預設的檔名"Localizable",因為啟動程式時,系統將根據語言載入相應的檔案得到其對應的字串檔案,這個字串可以通過系統將NSLocalizedString中的巨集生成名為“Localizable.strings”的檔案。那麼如何讓系統載入我們自己命名的本地化檔案而非系統預設的Localizable.strings呢?這就是 NSLocalizedStringFromTable(<#key#>,<#tbl#>,<#comment#>)的用處。
也就是說,如果你的strings檔名字不是Localizable而是自定義的話,如VVS.strings,那麼你就得使用NSLocalizedStringFromTable這個巨集來讀取本地化字串。
// key:系統根據key取字串 // tbl:自定義strings檔案的名字 // comment:可以不傳 NSLocalizedStringFromTable(<#key#>,<#comment#>)
#import "ViewController.h" @interface ViewController () @property (weak,nonatomic) IBOutlet UIButton *btn; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; NSString *title = NSLocalizedStringFromTable(@"click",@"VVS",nil); [self.btn setTitle:title forState:UIControlStateNormal]; } @end
執行效果,如下圖:
如此一來,我們就可以掙脫別人的strings檔案和系統預設的Localizable.strings檔案,自己另起爐灶。
(四)圖片本地化
本地化圖片,有兩種方式,第一種方式和本地化程式碼中的字串一樣,通過NSLocalizedString(key,comment)來獲取相應的字串,然後根據這個字串再獲取圖片。
方式一
NSString *imageName = NSLocalizedString(@"icon",nil); UIImage *image = [UIImage imageNamed:imageName]; self.imageView.image = image;
方式二
首先需要新增需要本地化的語言,具體步驟參考第一章 配置需要國際化的語言 。因為我演示的demo中在本地化App名稱時已經添加了需要國際化的語言。所以不需要再設定。
將圖片拖入工程中,例如“icon.png”,然後選中icon.png,展開Xcode右側的file Inspection,點選Localize,如下圖:
然後,右擊icon.png->show in Finder,我們發現在en.Iproj檔案中多了一個名為icon.png的圖片,如下圖:
當然,zh-Hans.Iproj資料夾下並沒有圖片,如下圖:
我們只需給zh-Hans.Iproj新增一個名字也為icon.png的圖片。如下圖:
然後把zh-Hans.Iproj中的icon.png拖到Xcode中,如下圖:
然後發現,icon.png左邊出現了一個可以展開的三角形。如下圖:
展開後發現裡面包含兩張圖片,如下圖:
然後控制器中新增如下程式碼:
#import "ViewController.h" @interface ViewController () @property (weak,nonatomic) IBOutlet UIImageView *imageView; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; NSString *imageName = NSLocalizedString(@"icon",nil); UIImage *image = [UIImage imageNamed:imageName]; self.imageView.image = image; } @end
english環境下執行效果如下:
中文環境改下執行效果如下:
其他語言環境,例如法語、中文繁體、韓語,操作步驟完全和上面相同。都是在對應的.Iproj資料夾下新增同名的圖片,然後把圖片拖放到Xcode中,不再贅述。
(五)檢視/切換本地語言
原理:應用啟動時,首先會讀取NSUserDefaults中的key為AppleLanguages對應的value,該value是一個String陣列,也就是說,我們訪問這個名為AppleLanguages的key可以返回一個string陣列,該陣列儲存著APP支援的語言列表,陣列的第一項為APP當前預設的語言。
#import "ViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; NSArray *languages = [[NSUserDefaults standardUserDefaults] valueForKey:@"AppleLanguages"]; NSString *currentLanguage = languages.firstObject; NSLog(@"模擬器當前語言:%@",currentLanguage); } @end
-控制檯列印結果:
同理,既然我們可以通過AppleLanguages這個key從NSUserDefaults中取出語言陣列,那麼我們也可以給AppleLanguages這個key賦值來達到切換本地語言的效果,從此以後,我們就無需頻繁的去模擬器的設定->通用->語言與地區 中切換語言。
#import "ViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // 切換語言前 NSArray *langArr1 = [[NSUserDefaults standardUserDefaults] valueForKey:@"AppleLanguages"]; NSString *language1 = langArr1.firstObject; NSLog(@"模擬器語言切換之前:%@",language1); // 切換語言 NSArray *lans = @[@"en"]; [[NSUserDefaults standardUserDefaults] setObject:lans forKey:@"AppleLanguages"]; // 切換語言後 NSArray *langArr2 = [[NSUserDefaults standardUserDefaults] valueForKey:@"AppleLanguages"]; NSString *language2 = langArr2.firstObject; NSLog(@"模擬器語言切換之後:%@",language2); } @end
回想一下,我在上面的 技巧 一節中提過:切換語言無需在模擬器中設定,只需要在Xcode中進行如下設定: Edit->Scheme->Run->Arguments Passed On Launch ->-AppleLanguages (語言程式碼)。其實本質上就是給NSUserDefaults中名為AppleLanguages的key賦值。 未完待續...
到此這篇關於3分鐘實現iOS語言本地化/國際化的文章就介紹到這了,更多相關iOS 本地化/國際化內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!