相關(guān)問題
- Infoplist.strings為什么可以替換info.plist的名稱?什么時機替換的叁丧?為什么必須叫InfoPlist.strings?
- 導出本地化時卷中,Xcode包含一個InfoPlist.strings用于轉(zhuǎn)換的文件磨取。但是,此文件包含有關(guān)您的應(yīng)用和公司的屬性鸭蛙,因此您可能需要自己驗證或翻譯此文件较屿。此字符串文件允許您可選地本地化信息屬性列表中的某些屬性值隧魄,例如應(yīng)用程序名稱(包顯示名稱)和版權(quán)聲明。
- Xcode會自動將這些鍵添加到
InfoPlist.strings
文件中:
CFBundleDisplayName
CFBundleName
CFBundleShortVersionString
NSHumanReadableCopyright
有關(guān)信息屬性列表的完整說明隘蝎,請參閱信息屬性列表鍵參考购啄。
- 多target國際化添加說明
- 工程包含多個target的時候需要創(chuàng)建對應(yīng)target名字的文件(方便區(qū)分),然后在每個文件中分別生成
InfoPlist.strings
文件末贾,再一一對應(yīng)勾選相關(guān)target
皆可以實現(xiàn)不同的target
讀取其唯一對應(yīng)的InfoPlist.strings
文件了闸溃,具體看展示圖.
- Localizable.strings == 匹配系統(tǒng)宏
- 在運行時,NSLocalizedString 會確定首選的語言拱撵,并在應(yīng)用程序包中找到相應(yīng)的 Localizable.strings 文件辉川。例如赋兵,如果用戶首選法語侣姆,文件 fr.lproj/Localizable.strings 將來用作參考慌烧。
- Localizable.strings 文件最初將由 genstrings 產(chǎn)生庐冯。genstrings 程序用給定的參數(shù)從 C 或 Objective-C(.c 或 .m)的源代碼文件生成一個 .strings 文件。一個 .strings 文件用于為應(yīng)用程序的不同語言作本地化局嘁,正如 Cocoa 開發(fā)者文檔下的 “Internationalization” 描述的那樣川无。
- 自定義文字國際化喇喉,方法參數(shù)說明
參數(shù)
key
指定表中字符串的鍵。
tableName
包含鍵值對的表的名稱妆距。此外穷遂,字符串文件的后綴(具有.strings擴展名的文件)用于存儲本地化字符串。
comment
注釋放在字符串文件中的鍵值對之上娱据。
#define NSLocalizedStringFromTable(key, tbl, comment)
- 從OS X 10.11和iOS 9開始蚪黑,它
NSBundle
是線程安全的。因此中剩,可以安全地從任何執(zhí)行上下文中調(diào)用忌穿。
-
兩種啟動圖國際化,各有各的問題结啼,啟動圖緩存問題
緩存圖片需要刪除APP再安裝
黑屏問題
- iOS 8.0之前,系統(tǒng)優(yōu)先選用 Launch Image 作為啟動圖.
- iOS 8.0以后,系統(tǒng)優(yōu)先選用 Launch Screen 作為啟動圖 (注意, Info.plist文件中,Launch screen interface file base name 需要填寫對應(yīng)的storyboard名稱).
- 如果你 LauncScreen 和 LaunchImage 同時都使用了,就有可能出現(xiàn)啟動圖黑屏 (建議只使用一種).
- 使用 LaunchImage 時出現(xiàn)黑屏,需要檢查以下幾個地方: (在LaunchScreen 將Info.plist中的 Launch screen interface file base name 刪除,可解決黑屏).
- Xib存在的問題:不能時時變換掠剑;&& 我們的工程不能用
- xib的國際化,如果把xib放在
framework
或者bundle
中郊愧,xib的國際化文件中不能切換對應(yīng)語言環(huán)境的xib
與.strings
文件朴译。
- 不同系統(tǒng)適配問題
做指定語言切換開發(fā)與測試過程中最好使用真機代替模擬器,避免同語言在模擬器讀取語言不準確糕珊。比如簡體中文環(huán)境下动分,模擬器11.4版本iPhone8:“zh-Hans-US”毅糟,真機11.2.1版本iPhoneX:“zh-Hans-CN”红选。
由外到內(nèi)的順序進行國際化配置,文章最后會有demo與語言切換的簡單工具類。
- 1.APP名稱國際化姆另。
- 2.系統(tǒng)權(quán)限提示語國際化喇肋。
- 3.語言與圖片國際化。
- 4.啟動圖國際化迹辐。
- 5.xib國際化蝶防。
- 6.獲取本地語言與語言切換。
1.APP名稱國際化
在InfoPlist.strings
文件中明吩,定義key和value.
-
1.1 設(shè)置支持的語言间学,點“?”添加,點擊
finish
確定印荔。
-
1.2 生成
InfoPlist.strings
文件低葫,名字必須寫成InfoPlist
里面才能支持名稱國際化。
-
1.3 選中創(chuàng)建好的
InfoPlist.strings
文件仍律,點擊右側(cè)Localize
1.4 添加文件點確定嘿悬。
這里涉及一點問題,添加文件時默認的是English
語言環(huán)境水泉,因為是在此項目中默認的環(huán)境是English
所以少了Base文件
的選項善涨。修改方法---直接在info.plist
文件添加此key就可以窒盐,把en
改成zh-Hans
就是默認語言為簡體中文。在其他語言的情況下都使用此語言(非strings配置過的語言環(huán)境下).
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
關(guān)于CFBundleDevelopmentRegion
官網(wǎng): CFBundleDevelopmentRegion (String - iOS, OS X) specifies the default language and region for the bundle, as a language ID. For example, English for the United Kingdom has the language ID en-UK. The system uses this value if it cannot locate a resource for the user’s preferred language.
翻譯:CFBundleDevelopmentRegion(String - iOS,OS X)指定的默認語言和區(qū)域包,作為一種語言ID钢拧。例如,英國英語語言ID en-UK蟹漓。系統(tǒng)使用這個值如果不能找到一個資源用戶的首選語言。
關(guān)于Base文件
Base多語言默認文件源内,被其它多語言 (Chinese, English, ...) 繼承和覆蓋牧牢,不會被iOS直接使用,只有當對應(yīng)的多語言文件中沒有找到相應(yīng)條目時才會到Base中查找姿锭,作用跟函數(shù)參數(shù)的默認值差不多塔鳍。
查找原理App啟動時,iOS會遍歷用戶設(shè)定的語言優(yōu)先級去和App的多語言文件匹配如果匹配呻此,會使用對應(yīng)的語言如果不匹配轮纫,會使用plist中開發(fā)地區(qū)所對應(yīng)的語言。
-
1.5 勾選需要環(huán)境語言文件焚鲜,把需要的語言選項勾選上掌唾。
-
1.6 這時候右邊文件列表會出現(xiàn)
infoPlist.strings文件列表
,選中指定語言環(huán)境的strings
文件忿磅,配置國際化APP名稱糯彬。
-
1.7 設(shè)置名稱需要在
strings
文件中對應(yīng)設(shè)置"CFBundleDisplayName" = "xxxxx";
,APP就會在對應(yīng)的系統(tǒng)語言環(huán)境下顯示不同strings
里設(shè)置的名稱了。
2.系統(tǒng)權(quán)限提示語國際化
在
InfoPlist.strings
文件中葱她,定義key和value.
關(guān)于系統(tǒng)權(quán)限提示語的國際化撩扒,和設(shè)置APP名稱一樣需要在InfoPlist.strings
文件里配置。
-
InfoPlist.strings文件里
-
當然也可以在
info.plist
文件下配置默認提示語(沒有配置過的其他語言環(huán)境下)
配置好系統(tǒng)在不同語言環(huán)境下的權(quán)限提示就會顯示所對應(yīng)的提示語吨些。一批訪問權(quán)限的對應(yīng)字段搓谆。
NSBluetoothPeripheralUsageDescription 訪問藍牙
NSCalendarsUsageDescription 訪問日歷
NSCameraUsageDescription 相機
NSPhotoLibraryUsageDescription 相冊
NSContactsUsageDescription 通訊錄
NSLocationAlwaysUsageDescription 始終訪問位置
NSLocationUsageDescription 位置
NSLocationWhenInUseUsageDescription 在使用期間訪問位置
NSMicrophoneUsageDescription 麥克風
NSAppleMusicUsageDescription 訪問媒體資料庫
NSHealthShareUsageDescription 訪問健康分享
NSHealthUpdateUsageDescription 訪問健康更新
NSMotionUsageDescription 訪問運動與健身
NSRemindersUsageDescription 訪問提醒事項
- 切換
info.plist
key/value展示列表的方法
3.語言與圖片國際化
簡單情況(APP初期開發(fā)或個人開發(fā)是國際化處理)
-
3.1 和建立APP名稱國際化
InfoPlist.strings
文件一樣,建立Localizable.strings
文件豪墅,定義key和value.
-
3.2 分別在不同的
Localizable.strings
文件設(shè)置相應(yīng)的key與value:
3.3 使用系統(tǒng)宏定義設(shè)置文字
NSLocalizedString傳遞的第一個參數(shù)是當前國際化文字的key泉手,第二個參數(shù)是注釋comment,這個參數(shù)可有可為nil偶器;當國際化文件某一語言中沒有對應(yīng)的指定國際化信息的時候斩萌,默認會以key的值來顯示。
- (void)viewDidLoad {
[super viewDidLoad];
self.titleLabel.text = NSLocalizedString(@"title", nil);
}
-
3.4 切換系統(tǒng)可以看到不同的文字展示
簡單的圖片國際化與上述文字國際化是一樣的屏轰,就是根據(jù)一樣的圖片key
對應(yīng)展示不同的圖片value
颊郎,就不上圖片了 比如這樣:
// Localizable.strings文件中
"title" = "中文簡體標題";
"imageKey" = "image_simplified";
// Localizable.strings文件中
"title" = "香港繁體標題";
"imageKey" = "image_traditional";
// 控制器里設(shè)置控件
UIImage * iamge = [UIImage imageNamed:NSLocalizedString(@"imageKey", nil)];
多人開發(fā)/后期國際化
生成不同的.strings
文件,使用系統(tǒng)的宏定義從不同文件中獲取國際化文本
#define NSLocalizedStringFromTable(key, tbl, comment) \
[NSBundle.mainBundle localizedStringForKey:(key) value:@"" table:(tbl)]
使用NSLocalizedStringFromTable
定義國際化文本亭枷。
NSString *nameStr = NSLocalizedStringFromTable(@"name", @"XesA", nil);
self.titleLabel.text = nameStr;
4.啟動圖國際化
(啟動圖國際化如果切換語言后無法達到顯示結(jié)果袭艺,需要刪除APP再次運行)
LaunchScreen啟動圖國際化
-
4.1 配置好使用
LaunchScreen
作為啟動圖的配置文件
-
4.2 創(chuàng)建不同語言環(huán)境下的
LaunchScreen.storyboard
啟動頁。
-
4.3 分別畫好不同LaunchScreen的啟動效果叨粘,然后在
InfoPlist.strings
文件下配置不同語言環(huán)境下的指定LaunchScreen
文件猾编,如圖
strings文件里的啟動圖配置
"UILaunchStoryboardName" = "LaunchS_Chine";
"UILaunchStoryboardName" = "LaunchS_HKHK";
5.xib國際化
xib國際化比較麻煩瘤睹,因為生成xib對應(yīng)的
.strings
文件后,再更改時不能動態(tài)修改對應(yīng)的.strings
文件答倡,還需要重置此文件轰传,笨方法就是先制作好了xib 最后再對應(yīng)生成不同環(huán)境下的.strings
文件,還有就是使用腳本動態(tài)生成國際化內(nèi)容瘪撇。(待研究學習...)
-
5.1 創(chuàng)建帶xib的控制器获茬,設(shè)置其Label的布局與文字后,點擊右側(cè)
Localizable
添加多語言strings
文本倔既。(建議變動的xib文本可以把控件與控制器關(guān)聯(lián)恕曲,在控制器中再進行國際化處理)
-
5.2 和上面添加對應(yīng)
Localizable.strings
文件一樣,xib里的文本會自動生成下圖這樣: 5.3 分別在
xib下不同的.strings文件
設(shè)置對應(yīng)文本渤涌,切換系統(tǒng)后就會變更佩谣,顯示國際化對應(yīng)文本。
也可以把xib里的控件與其控制器關(guān)聯(lián)实蓬,在控制器中再進行國際化文本處理茸俭。
6.獲取本地語言與語言切換
在做獲取本地語言與語言切換功能時,最好使用真機測試比較準確安皱,比如同樣系統(tǒng)下的模擬器與真機獲取簡體中文就會有偏差调鬓,模擬器的簡體中文為
zh-Hans-US
,真機為zh-Hans-CN
,雖然都可以表示簡體中文 但會有偏差酌伊。
// 獲取當前語言環(huán)境
// 方法一
NSArray *languageArry = [NSLocale preferredLanguages];
NSString *currentLanguage = [languageArry objectAtIndex:0];
// 方法二
NSArray * languageArry = [[NSUserDefaults standardUserDefaults] objectForKey:@"AppleLanguages"];
NSString * currentLanguage = [allLanguages objectAtIndex:0];
// 獲取當前設(shè)備支持語言數(shù)組
NSArray *languageArr = [NSLocale availableLocaleIdentifiers];
更改當前APP所屬語言環(huán)境(語言切換)只需要在NSUserDefaults
下的keyAppleLanguages
賦相應(yīng)的語言代碼就好腾窝。
比如把當前app語言環(huán)境改成英文。
[[NSUserDefaults standardUserDefaults] setObject:@"en-US" forKey:@"AppleLanguages"];
[[NSUserDefaults standardUserDefaults] synchronize];
切換語言時的常見思路
1.發(fā)送通知NSNotification(類似微博)腺晾,切換語言的時候發(fā)送通知刷新所有涉及的頁面燕锥,當然每個頁面的每個控件都需要有自己的一套更新機制辜贵,比較繁瑣悯蝉。
2.刷新重置keyWindow的rootViewController(類似微信)最簡單實用。當然也需要根據(jù)需求定一個適合的方案托慨。
國際化語言適配問題筆記
iOS8
簡體中文:zh-Hans
繁體中文香港:zh-HK
iOS9
簡體中文: zh-Hans-CN
香港繁體 : zh-HK
iOS10及以上
簡體中文 zh-Hans-CN
香港繁體: zh-Hant-HK