關於iOS APP的國際化適配,主要有以下幾點:
該文件主要用於字符串的多語言版本,包括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 = 發送;//發送
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)]];
即可.
對於圖片的命名,可采用[email protected]之類的規則。
通常涉及到國際化,我們會先判斷當前使用的語言類型。
獲取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];
NSString *text = NSLocalizedString(@GUI_TEXT_BACK, @返回);
比如,按鈕的標題在多語言的布局下可能導致布局出現問題。最簡單的做法通常是
btn.titleLabel.adjustsFontSizeToFitWidth = YES;