iOS --- 多語言適配的注意事項
關於iOS APP的國際化適配,主要有以下幾點:
Localizable.strings檔案
該檔案主要用於字串的多語言版本,包括Localizable.string(English), Localizable.strings(Chinese(Simplified)), Localizable.strings(Chinese(Traditional))等多個版本。內容格式如下:
// Localizable.string(English)GUI_TEXT_CANCEL = Cancel;//取消GUI_TEXT_BACK = Back;//返回GUI_TEXT_SEND = Send;//發送
// Localizable.strings(Chinese(Simplified))GUI_TEXT_CANCEL = 取消;//取消GUI_TEXT_BACK = 返回;//返回GUI_TEXT_SEND = 發送;//發送
storyboard和xib檔案
Main.storyboard也會有多個版本,最重要的就是Base版本,即當前開發人員使用語言的版本(如簡體中文)。Main.storyboard(Base)檔案與常見的Main.storyboard檔案無異,其相應文字已在Main.storyboard中標記。
另外,會有Main.strings(English), Main.strings(Chinese(Traditional))版本的兩個檔案。格式如下:
// Main.strings(English)/* Class = UITextField; placeholder = 新密碼; ObjectID = G9J-mp-XNR; */G9J-mp-XNR.placeholder = New password;/* Class = UITextField; placeholder = 原密碼; ObjectID = LbQ-a8-5ly; */LbQ-a8-5ly.placeholder = Old password;/* Class = UITextField; placeholder = 手機號碼; ObjectID = LrI-zH-3OD; */LrI-zH-3OD.placeholder = Phone number;
// Main.strings(Chinese(Traditional))/* Class = UITextField; placeholder = 新密碼; ObjectID = G9J-mp-XNR; */G9J-mp-XNR.placeholder = 新密碼;/* Class = UITextField; placeholder = 原密碼; ObjectID = LbQ-a8-5ly; */LbQ-a8-5ly.placeholder = 原密碼;/* Class = UITextField; placeholder = 手機號碼; ObjectID = LrI-zH-3OD; */LrI-zH-3OD.placeholder = 手機號碼;
這兩個Main.strings檔案的格式是自動產生的,我們僅需對應調整其中的placeholder文字即可,步驟請參考Main.storyboard的國際化。其中的OjbectID是唯一對應於一個UI控制項的。
xib檔案的國際化同Main.storyboard,不再贅述。
圖片等資源
最直接的方法,可以準備三個圖片, 在Localizable.strings中指定.:
imageName = ilike_en;
然後代碼中使用
[_imageView setImage:[UIImage imageNamed: NSLocalizedString(@“imageName”, nil)]];
即可.
對於圖片的命名,可採用hello_en@2x.png之類的規則。
擷取當前語言類型
通常涉及到國際化,我們會先判斷當前使用的語言類型。
擷取iOS系統的語言類型可使用:
NSArray *languages = [NSLocale preferredLanguages]; // 擷取語言欄位NSString *curLanguage = [languages firstObject]; // 擷取當前使用語言
對於curLanguage的值,iOS9在其中增加了地區代碼。如簡體中文,在iOS9之前為@”zh-Hans”,而在iOS9中為@”zh-Hans-CN”。所以iOS9之前的一些判斷如
[curLanguage isEqualToString:@zh-Hans]
在iOS9之後就會有問題,可使用
[curLanguage hasPrefix:@zh-Hans]
來代替。如下:
// 當前語言是否中文簡體-#define isZhHans [[[NSLocale preferredLanguages] firstObject] isEqualToString:@zh-Hans]+#define isZhHans [[[NSLocale preferredLanguages] firstObject] hasPrefix:@zh-Hans] // 當前語言是否為中文繁體-#define isZhHant [[[NSLocale preferredLanguages] firstObject] isEqualToString:@zh-Hant]+#define isZhHant [[[NSLocale preferredLanguages] firstObject] hasPrefix:@zh-Hant] // 當前語言是否為中文繁體香港-#define isZhHK [[[NSLocale preferredLanguages] firstObject] isEqualToString:@zh-HK]+#define isZhHK [[[NSLocale preferredLanguages] firstObject] hasPrefix:@zh-HK]
擷取地區代碼
NSLocale *locale = [NSLocale currentLocale];[locale localeIdentifier];
擷取Localizable.strings中內容
NSString *text = NSLocalizedString(@GUI_TEXT_BACK, @返回);
多語言的布局適配
比如,按鈕的標題在多語言的布局下可能導致布局出現問題。最簡單的做法通常是
btn.titleLabel.adjustsFontSizeToFitWidth = YES;