1、介紹
國際化(Internationalization)是指應(yīng)用程序在運(yùn)行的時候岭辣,可以根據(jù)客戶端請求來自的國家/地區(qū)吱晒,語言的不同而顯示不同的界面。根據(jù)用戶的語言設(shè)置沦童,展示不同的應(yīng)用程序名稱仑濒,不同的圖片,應(yīng)用的描繪語言搞动。
1.1躏精、iOS本地化的思路
把程序的標(biāo)簽,提示信息鹦肿,圖片等(所有的包含文字的內(nèi)容)放在一個資源文件夾中矗烛,程序需要支持哪些國家,語言環(huán)境,就提供對應(yīng)的資源文件瞭吃。
NSLocale:特定的國家區(qū)域的語言環(huán)境碌嘀。
NSLocale *local = [NSLocale currentLocale];//獲取當(dāng)前的語言環(huán)境
NSString *string = local.localeIdentifier; // 獲取當(dāng)前的應(yīng)用程序的語言
NSLocalizedString(<#key#>, <#comment#>):根據(jù)key來獲取國際化的語言設(shè)置信息。
為了實(shí)現(xiàn)本地化歪架,必須提供程序所需要的資源文件股冗。資源文件的內(nèi)容是很多的鍵值對(key-value),其中key是程序編寫時需要使用到的,value是應(yīng)用程序界面展示時便顯出的內(nèi)容和蚪。
資源文件的名稱通常是localizable.strings.
1.2止状、本地化文件夾
本地化文件夾的命名有著嚴(yán)格的規(guī)范,本地化文件夾一般有兩種形式攒霹。(創(chuàng)建項目之后怯疤,打開項目工程在finder中顯示,都會有一個Base.lproj文件 里面包含launch 和main的故事板)催束。在iOS系統(tǒng)中集峦,簡體中文的代號是zh-Hans。繁體中文的代號為zh-Hant抠刺。英文的代號為en塔淤。
1、langauge-country.lproj
2速妖、langauge.lproj
語言和國家/區(qū)域都是不可變的高蜂,必須是iOS支持的語言。
注意:Base.lproj是一個典型的本地化文件夾买优,只不過它為所有的語言提供環(huán)境提供服務(wù)妨马,所以它是所有的語言環(huán)境最后的選擇挺举。Base.lproj文件夾下默認(rèn)保存了Main.storyBoard文件杀赢。主故事板可以為所有語言環(huán)境提供界面。
查看國際上不同國家和語言的編碼網(wǎng)址
獲取iOS支持的所有語言和國家湘纵,需要通過NSLocale的availableLocaleIdentifiers類方法獲取脂崔。這個方法返回一個NSArray集合,然后遍歷這個集合來獲取iOS支持的NSLocale的標(biāo)識字符串梧喷。
//獲取所有的本地化標(biāo)識字符串
NSArray *locale = [NSLocale availableLocaleIdentifiers];
for (NSString *locl in locale) {
NSLog(@"%@",locl);
}
運(yùn)行結(jié)果(部分打印結(jié)果):
2砌左、應(yīng)用程序的本地化主要包括應(yīng)程序名稱本地化,storyBoard本地化铺敌,圖片本地化汇歹,字符串本地化。
2.1應(yīng)用程序名稱本地化
Bundle name 簡單來說就是 App 安裝到 iOS 機(jī)子里的 App 文件夾名偿凭。
Executable name – 執(zhí)行程序名产弹,默認(rèn)與 PRODUCT_NAME 一致。
Bundle display name – 真正顯示到用戶屏幕上的 App 名稱弯囊。
在模擬器/真機(jī)上顯示的名字是由Bundle Display Name決定的痰哨。默認(rèn)情況下Bundle Display Name就等同于Product Name胶果。
Bundle name – is folder name, where your app (including executable file and all resources) will be stored (Cool Program.app). Executable name – is a program binary name, i.e. Cool Program.app/CoolProgram Bundle display name – is what will be shown on iPhone screen, for example Cool Prog (since Cool Program probably will not fit on Springboard). And, Apple claims, that Bundle Display name must correspond to Bundle name, i.e. you cannot use bundle name TheApplication, and bundle display name Something Other
在部分情況下如果Product Name為中文字符,會導(dǎo)致編譯運(yùn)行在真機(jī)時斤斧,第一次必報 Could not inspect the application package. 錯誤早抠,這個可以參考《使用 Xcode6 在 iOS8 設(shè)備上調(diào)試報錯 Could not inspect the application package》。
2.2注意:
遇到了這種情況撬讽,將Product Name設(shè)置成為了英文名蕊连,而將Bundle Display Name設(shè)置為中文名。
參考stackOverFlow:Bundle Name, Executable Name, Product Name…anything else?
2.3實(shí)現(xiàn)步驟游昼。
2.3.1咪奖、打開Xcode, 選中項目文件夾下的project圖標(biāo)酱床,再選中文件Dock目錄中的project圖標(biāo)羊赵。
2.3.2、選中project面板上的info選項
2.3.3扇谣、選擇簡體中文Chinese(Simplified,China)(zh-Hans-CN)
2.3.4昧捷、在Xcode界面上使用快捷鍵 Command + N 新建文件 Resource中選擇 Strings File
2.3.5、命名為 InfoPlist.strings罐寨,然后創(chuàng)建靡挥。(即為項目添加一份本地化資源文件)
2.3.6、選中InfoPlist.strings文件鸯绿,打開Xcode家岔氣面板跋破,找到其中的Localization選項。
2.3.7瓶蝴、選中Chinese(Simplified,China)添加中文的本地化(選中English添加英文的本地化)
2.3.8毒返、選中檢查面板的Localization,勾選??Base既可以添加Base的本地化文件。(勾選??English既可以添加English的本地化文件舷手。)
2.3.9拧簸、選擇Xcode的info.plist ,顯示原始鍵值對(Show Raw Keys/Values)
2.3.10男窟、在English的InfoPlist.strings文件中盆赤,配置 CFBundleDisplayName
CFBundleDisplayName = "locale"; // 一定要設(shè)置分號 并且不要在字符串前面添加@符號
2.3.11、在Chinese(Simplified,China)的InfoPlist.strings中配置CFBundleDisplayName
CFBundleDisplayName = "本地化"; // 一定要設(shè)置分號 并且不要在字符串前面添加@符號
如果模擬器的語言設(shè)置是英文歉眷,將會看到應(yīng)用的顯示名稱為“Locale”牺六。語言設(shè)置為簡體中文是,將會看到應(yīng)用的顯示名稱為@"本地化"汗捡∈缂剩【模擬器的Home鍵--->command + shift + H返回到應(yīng)用程序列表。設(shè)置(Settings)----》通用(Gneral)------》語言和區(qū)域(Langauge and Rigion)--------》區(qū)域(Rigion) -------》對應(yīng)的語言------》Done(確定)】。模擬器在運(yùn)行時可能看不到最新的應(yīng)用名稱庸追,這是因?yàn)槟M器有時候會緩存一些信息霍骄。這就需要我們把模擬器上已經(jīng)運(yùn)行的應(yīng)用程序卸掉【選中模擬器中應(yīng)用程序圖標(biāo),長按淡溯,點(diǎn)擊應(yīng)用程序圖標(biāo)左上角的?】读整,重新運(yùn)行一次。
3咱娶、圖片的本地化
3.1米间、拖入一張照片到iOS項目中。(需要??Copy items if needed 和 Create groups 還有Add To Targets)
3.2膘侮、在項目中選中圖片屈糊,打開Xcode右側(cè)的文件檢查面板,找到其中的Localization選項琼了。
3.3逻锐、在對應(yīng)的對話框中選擇Chinese(Simplified,China),那么圖片會被添加到zh-Hans-CN.lproj文件夾中雕薪。
3.4昧诱、同理把對應(yīng)的圖片(英語語言的圖片、基礎(chǔ)語言的圖片(中文的應(yīng)用程序就選擇中文的圖片))添加到對應(yīng)的本地化文件夾中所袁。(XXXX.lproj文件夾)
需要注意的是圖片的名稱需要時相同的盏档。
4、文本的本地化(字符串的本地化操作)
4.1燥爷、和之前創(chuàng)建InfoPlist.strings文件相同蜈亩,不同的是文件名稱為Localizable.strings。
補(bǔ)充:也可以通過genstrings命令來生成資源文件前翎,這種方式創(chuàng)建的資源文件會自動包含應(yīng)用程序需要用到的所有的key【啟動OS X系統(tǒng)的終端窗口稚配,使用cd命令進(jìn)入到iOS項目所在目錄執(zhí)行這個命令∮闾睿】
Objective-C語言使用 genstrings *.m
命令
swift語言使用 genstrings *.swift
命令
4.2药有、分別對應(yīng)的文件夾中寫入對應(yīng)的文本內(nèi)容。注意苹丸,zh-Hans-CN.lproj和en.lproj兩個文件中的key需要保持一致。
/*
Localizable.strings
名稱本地化
Localizable.strings(Chinese(Simplified))
*/
"loacl" = "我們 我們都是好孩子";
/*
Localizable.strings
名稱本地化
Localizable.strings(English)
*/
"loacl" = "Hello苇经! we are good boys";
4.3赘理、獲取key所對應(yīng)的內(nèi)容∩鹊ィ【在這里key最好定義成一個宏商模,避免在書寫的時候出現(xiàn)錯誤】
self.iconView.image = [UIImage imageNamed:@"1.png"];
self.nameLabel.text = NSLocalizedString(@"loacl", @"這是一個注釋的內(nèi)容");
注意:當(dāng)故事板是以Main.strings的樣式展示的時候需要選擇Main.storyBoard的格式才會正常顯示。
解決辦法