相關問題
- Infoplist.strings為什么可以替換info.plist的名稱?什么時機替換的?為什么必須叫InfoPlist.strings?
- 導出本地化時,Xcode包含一個InfoPlist.strings用于轉換的文件。但是,此文件包含有關您的應用和公司的屬性,因此您可能需要自己驗證或翻譯此文件。此字符串文件允許您可選地本地化信息屬性列表中的某些屬性值,例如應用程序名稱(包顯示名稱)和版權聲明。
- Xcode會自動將這些鍵添加到
InfoPlist.strings
文件中:
CFBundleDisplayName
CFBundleName
CFBundleShortVersionString
NSHumanReadableCopyright
有關信息屬性列表的完整說明,請參閱信息屬性列表鍵參考。
- 多target國際化添加說明
- 工程包含多個target的時候需要創建對應target名字的文件(方便區分),然后在每個文件中分別生成
InfoPlist.strings
文件,再一一對應勾選相關target
皆可以實現不同的target
讀取其唯一對應的InfoPlist.strings
文件了,具體看展示圖.
生成多個文件多個.strings文件
- Localizable.strings == 匹配系統宏
- 在運行時,NSLocalizedString 會確定首選的語言,并在應用程序包中找到相應的 Localizable.strings 文件。例如,如果用戶首選法語,文件 fr.lproj/Localizable.strings 將來用作參考。
- Localizable.strings 文件最初將由 genstrings 產生。genstrings 程序用給定的參數從 C 或 Objective-C(.c 或 .m)的源代碼文件生成一個 .strings 文件。一個 .strings 文件用于為應用程序的不同語言作本地化,正如 Cocoa 開發者文檔下的 “Internationalization” 描述的那樣。
- 自定義文字國際化,方法參數說明
參數
key
指定表中字符串的鍵。
tableName
包含鍵值對的表的名稱。此外,字符串文件的后綴(具有.strings擴展名的文件)用于存儲本地化字符串。
comment
注釋放在字符串文件中的鍵值對之上。
#define NSLocalizedStringFromTable(key, tbl, comment)
- 從OS X 10.11和iOS 9開始,它
NSBundle
是線程安全的。因此,可以安全地從任何執行上下文中調用。
-
兩種啟動圖國際化,各有各的問題,啟動圖緩存問題
緩存圖片需要刪除APP再安裝
黑屏問題
- iOS 8.0之前,系統優先選用 Launch Image 作為啟動圖.
- iOS 8.0以后,系統優先選用 Launch Screen 作為啟動圖 (注意, Info.plist文件中,Launch screen interface file base name 需要填寫對應的storyboard名稱).
- 如果你 LauncScreen 和 LaunchImage 同時都使用了,就有可能出現啟動圖黑屏 (建議只使用一種).
- 使用 LaunchImage 時出現黑屏,需要檢查以下幾個地方: (在LaunchScreen 將Info.plist中的 Launch screen interface file base name 刪除,可解決黑屏).
- Xib存在的問題:不能時時變換;&& 我們的工程不能用
- xib的國際化,如果把xib放在
framework
或者bundle
中,xib的國際化文件中不能切換對應語言環境的xib
與.strings
文件。
- 不同系統適配問題
做指定語言切換開發與測試過程中最好使用真機代替模擬器,避免同語言在模擬器讀取語言不準確。比如簡體中文環境下,模擬器11.4版本iPhone8:“zh-Hans-US”,真機11.2.1版本iPhoneX:“zh-Hans-CN”。
由外到內的順序進行國際化配置,文章最后會有demo與語言切換的簡單工具類。
- 1.APP名稱國際化。
- 2.系統權限提示語國際化。
- 3.語言與圖片國際化。
- 4.啟動圖國際化。
- 5.xib國際化。
- 6.獲取本地語言與語言切換。
1.APP名稱國際化
在InfoPlist.strings
文件中,定義key和value.
-
1.1 設置支持的語言,點“?”添加,點擊
finish
確定。
APP名稱-1.png -
1.2 生成
InfoPlist.strings
文件,名字必須寫成InfoPlist
里面才能支持名稱國際化。
國際化名稱-2.png -
1.3 選中創建好的
InfoPlist.strings
文件,點擊右側Localize
名稱國際化-3.png 1.4 添加文件點確定。
這里涉及一點問題,添加文件時默認的是English
語言環境,因為是在此項目中默認的環境是English
所以少了Base文件
的選項。修改方法---直接在info.plist
文件添加此key就可以,把en
改成zh-Hans
就是默認語言為簡體中文。在其他語言的情況下都使用此語言(非strings配置過的語言環境下).
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
關于CFBundleDevelopmentRegion
官網: 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)指定的默認語言和區域包,作為一種語言ID。例如,英國英語語言ID en-UK。系統使用這個值如果不能找到一個資源用戶的首選語言。
關于Base文件
Base多語言默認文件,被其它多語言 (Chinese, English, ...) 繼承和覆蓋,不會被iOS直接使用,只有當對應的多語言文件中沒有找到相應條目時才會到Base中查找,作用跟函數參數的默認值差不多。
查找原理App啟動時,iOS會遍歷用戶設定的語言優先級去和App的多語言文件匹配如果匹配,會使用對應的語言如果不匹配,會使用plist中開發地區所對應的語言。
-
1.5 勾選需要環境語言文件,把需要的語言選項勾選上。
名稱-5.png -
1.6 這時候右邊文件列表會出現
infoPlist.strings文件列表
,選中指定語言環境的strings
文件,配置國際化APP名稱。
名稱-6.png -
1.7 設置名稱需要在
strings
文件中對應設置"CFBundleDisplayName" = "xxxxx";
,APP就會在對應的系統語言環境下顯示不同strings
里設置的名稱了。
2.系統權限提示語國際化
在
InfoPlist.strings
文件中,定義key和value.
關于系統權限提示語的國際化,和設置APP名稱一樣需要在InfoPlist.strings
文件里配置。
-
InfoPlist.strings文件里
-
當然也可以在
info.plist
文件下配置默認提示語(沒有配置過的其他語言環境下)
配置好系統在不同語言環境下的權限提示就會顯示所對應的提示語。一批訪問權限的對應字段。
NSBluetoothPeripheralUsageDescription 訪問藍牙
NSCalendarsUsageDescription 訪問日歷
NSCameraUsageDescription 相機
NSPhotoLibraryUsageDescription 相冊
NSContactsUsageDescription 通訊錄
NSLocationAlwaysUsageDescription 始終訪問位置
NSLocationUsageDescription 位置
NSLocationWhenInUseUsageDescription 在使用期間訪問位置
NSMicrophoneUsageDescription 麥克風
NSAppleMusicUsageDescription 訪問媒體資料庫
NSHealthShareUsageDescription 訪問健康分享
NSHealthUpdateUsageDescription 訪問健康更新
NSMotionUsageDescription 訪問運動與健身
NSRemindersUsageDescription 訪問提醒事項
- 切換
info.plist
key/value展示列表的方法
info.plist-show
3.語言與圖片國際化
簡單情況(APP初期開發或個人開發是國際化處理)
-
3.1 和建立APP名稱國際化
InfoPlist.strings
文件一樣,建立Localizable.strings
文件,定義key和value.
Localizable.strings -
3.2 分別在不同的
Localizable.strings
文件設置相應的key與value:
設置相應key-value 3.3 使用系統宏定義設置文字
NSLocalizedString傳遞的第一個參數是當前國際化文字的key,第二個參數是注釋comment,這個參數可有可為nil;當國際化文件某一語言中沒有對應的指定國際化信息的時候,默認會以key的值來顯示。
- (void)viewDidLoad {
[super viewDidLoad];
self.titleLabel.text = NSLocalizedString(@"title", nil);
}
-
3.4 切換系統可以看到不同的文字展示
香港繁體語言環境下
簡體中文語言環境下
簡單的圖片國際化與上述文字國際化是一樣的,就是根據一樣的圖片key
對應展示不同的圖片value
,就不上圖片了 比如這樣:
// Localizable.strings文件中
"title" = "中文簡體標題";
"imageKey" = "image_simplified";
// Localizable.strings文件中
"title" = "香港繁體標題";
"imageKey" = "image_traditional";
// 控制器里設置控件
UIImage * iamge = [UIImage imageNamed:NSLocalizedString(@"imageKey", nil)];
多人開發/后期國際化
生成不同的.strings
文件,使用系統的宏定義從不同文件中獲取國際化文本
#define NSLocalizedStringFromTable(key, tbl, comment) \
[NSBundle.mainBundle localizedStringForKey:(key) value:@"" table:(tbl)]
使用NSLocalizedStringFromTable
定義國際化文本。
NSString *nameStr = NSLocalizedStringFromTable(@"name", @"XesA", nil);
self.titleLabel.text = nameStr;
4.啟動圖國際化
(啟動圖國際化如果切換語言后無法達到顯示結果,需要刪除APP再次運行)
LaunchScreen啟動圖國際化
-
4.1 配置好使用
LaunchScreen
作為啟動圖的配置文件
-
4.2 創建不同語言環境下的
LaunchScreen.storyboard
啟動頁。
-
4.3 分別畫好不同LaunchScreen的啟動效果,然后在
InfoPlist.strings
文件下配置不同語言環境下的指定LaunchScreen
文件,如圖
strings文件里的啟動圖配置
"UILaunchStoryboardName" = "LaunchS_Chine";
"UILaunchStoryboardName" = "LaunchS_HKHK";
5.xib國際化
xib國際化比較麻煩,因為生成xib對應的
.strings
文件后,再更改時不能動態修改對應的.strings
文件,還需要重置此文件,笨方法就是先制作好了xib 最后再對應生成不同環境下的.strings
文件,還有就是使用腳本動態生成國際化內容。(待研究學習...)
-
5.1 創建帶xib的控制器,設置其Label的布局與文字后,點擊右側
Localizable
添加多語言strings
文本。(建議變動的xib文本可以把控件與控制器關聯,在控制器中再進行國際化處理)
xib-1.png -
5.2 和上面添加對應
Localizable.strings
文件一樣,xib里的文本會自動生成下圖這樣:xib-4.png 5.3 分別在
xib下不同的.strings文件
設置對應文本,切換系統后就會變更,顯示國際化對應文本。
也可以把xib里的控件與其控制器關聯,在控制器中再進行國際化文本處理。
6.獲取本地語言與語言切換
在做獲取本地語言與語言切換功能時,最好使用真機測試比較準確,比如同樣系統下的模擬器與真機獲取簡體中文就會有偏差,模擬器的簡體中文為
zh-Hans-US
,真機為zh-Hans-CN
,雖然都可以表示簡體中文 但會有偏差。
// 獲取當前語言環境
// 方法一
NSArray *languageArry = [NSLocale preferredLanguages];
NSString *currentLanguage = [languageArry objectAtIndex:0];
// 方法二
NSArray * languageArry = [[NSUserDefaults standardUserDefaults] objectForKey:@"AppleLanguages"];
NSString * currentLanguage = [allLanguages objectAtIndex:0];
// 獲取當前設備支持語言數組
NSArray *languageArr = [NSLocale availableLocaleIdentifiers];
更改當前APP所屬語言環境(語言切換)只需要在NSUserDefaults
下的keyAppleLanguages
賦相應的語言代碼就好。
比如把當前app語言環境改成英文。
[[NSUserDefaults standardUserDefaults] setObject:@"en-US" forKey:@"AppleLanguages"];
[[NSUserDefaults standardUserDefaults] synchronize];
切換語言時的常見思路
1.發送通知NSNotification(類似微博),切換語言的時候發送通知刷新所有涉及的頁面,當然每個頁面的每個控件都需要有自己的一套更新機制,比較繁瑣。
2.刷新重置keyWindow的rootViewController(類似微信)最簡單實用。當然也需要根據需求定一個適合的方案。
國際化語言適配問題筆記
iOS8
簡體中文:zh-Hans
繁體中文香港:zh-HK
iOS9
簡體中文: zh-Hans-CN
香港繁體 : zh-HK
iOS10及以上
簡體中文 zh-Hans-CN
香港繁體: zh-Hant-HK