標籤:tabbar tle 圖片 ring boa 選中 phone key image
同學面試時遇到一個問題,面試官問他,有一個現成的APP馬上要上線了,怎麼在不改原來代碼,也不改xib、storyboard的情況下快速實現國際化。這裡應同學請求寫下此教程。反正國際化的步驟都要搞一遍,乾脆寫一個詳細、全面的教程。
一、配置國際化語言
點擊progect->info->localizations下的‘+’,選擇你要支援的語言,預設支援英文,如
二、應用程式名稱國際化
建立一個Strings File類型的檔案,且名稱必須為InfoPlist。
選中剛剛建立的檔案,在Xcode的右側檔案檢查器中點擊Localize,點擊Localize後,會彈出一個對話方塊,展開對話方塊列表,選擇我們需要本地化的語言如English,然後點擊對話方塊的Localize按鈕。
再看Xcode右側的File inspection變成了的樣式,勾選需要支援的中文、英文,如
你剛剛建立的InfoPlist.stirings左側多了一個箭頭,點擊箭頭可以展開,可以看到中文、英文兩個檔案。在英文檔案中加一句代碼
CFBundleDisplayName = "LFInternationalizationDemo";
在中文檔案中加一句代碼
CFBundleDisplayName = "峰哥國際化樣本";
運行你的APP,查看APP名稱,切換手機語言,再運行你的APP,查看APP名稱。
三、APP中文字國際化
和應用程式名稱國際化一樣,建立一個Strings File類型的檔案,不一樣的是名稱必須為Localizable。在Xcode的右側檔案檢查器中點擊Localize,然後跟上面步驟一樣直到可以展開中、英文兩個Localizable.strings。
英文檔案中加代碼
"帳號" = "Account";"登入" = "Login";
中文檔案中加代碼
"帳號" = "帳號";"登入" = "登入";
然後給label、button設定文字代碼如下
self.lbAccount.text = NSLocalizedString(@"帳號", nil);[self.btLogin setTitle:NSLocalizedString(@"登入", nil) forState:UIControlStateNormal];
四、Storyboard或XIB國際化
先將中文版或英文版中一個做好後,再進行國際化,這樣會省事很多,我這裡先做好了中文版。
選中storyboard,跟上面步驟一樣,在Xcode的右側檔案檢查器中勾選支援的語言,如
展開storyboard檔案如
開啟Main.strings(English),或Main.strings(Chiness),發現都是中文的。這時候你需要將Main.strings(English)中的中文改成英文。
如果你覺得密密麻麻都是文字,分不清對應哪個控制項上的文字。你可以將.strings檔案變成.storyboard檔案,像這樣
這時候你就可以在.storyboard檔案檔案上直觀的改你需要改的語言。
五、圖片、音效檔國際化1.方式1
搞兩套圖片,一套英文命名,一套中文命名。然後跟文字國際化一樣擷取當前語言圖片名字
NSString *imageName = NSLocalizedString(@"icon", nil);UIImage *image = [UIImage imageNamed:imageName];self.imageView.image = image;
2.方式2
兩套圖片一樣的名字,將其中一套圖片拖到工程。選中一張圖片,跟前面InfoPlist.stirings檔案一樣,在Xcode的右側檔案檢查器中點擊Localize,勾選需要支援的語言。然後,右擊[email protected]>show in Finder,我們發現在en.Iproj和zh-Hans.lproj檔案中多了一個名為[email protected]的圖片。將這個圖片換成對應語言的圖片即可。
音效檔跟圖片一樣、不說了。
六、應用內切換語言
到手機設定裡切換語言太麻煩,我們可以做成應用內切換語言。
//自動跟隨系統- (IBAction)autoLanguage:(id)sender { NSString *phoneLanguage = [[NSLocale currentLocale] objectForKey:NSLocaleLanguageCode]; [self changeLanguage:phoneLanguage];}- (IBAction)chiness:(id)sender { [self changeLanguage:@"zh-Hans"];}- (IBAction)english:(id)sender { [self changeLanguage:@"en"];} - (void)changeLanguage:(NSString *)language { [[NSUserDefaults standardUserDefaults] setObject:@[language] forKey:@"AppleLanguages"]; [NSBundle setMainBundelLanguage:language]; NSBundle * currentMainBundel = [NSBundle getCurrentMainBundel]; UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:currentMainBundel]; MainTabBarController *tabbar = [storyboard instantiateViewControllerWithIdentifier:@"MainTabBarController"]; [UIApplication sharedApplication].keyWindow.rootViewController = tabbar; [[UIApplication sharedApplication].keyWindow makeKeyAndVisible];}
這裡setMainBundelLanguage和getCurrentMainBundel兩個方法是封裝在 NSBundle 的 category中,代碼如下
#import "NSBundle+LF.h"#import <objc/runtime.h>static const NSString *_bundlekey = @"_bundlekey";@interface BundleEx : NSBundle@end@implementation BundleEx- (NSString *)localizedStringForKey:(NSString *)key value:(NSString *)value table:(NSString *)tableName { NSBundle *bundle = objc_getAssociatedObject(self, &_bundlekey); return bundle ? [bundle localizedStringForKey:key value:value table:tableName] : [super localizedStringForKey:key value:value table:tableName];}@end@implementation NSBundle (LF) + (void)setMainBundelLanguage:(NSString *)language { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ object_setClass([NSBundle mainBundle], [BundleEx class]); }); objc_setAssociatedObject([NSBundle mainBundle], &_bundlekey, language ? [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:language ofType:@"lproj"]] : nil, OBJC_ASSOCIATION_RETAIN_NONATOMIC);}+ (NSBundle *)getCurrentMainBundel { NSString * currentLanguage = [[NSUserDefaults standardUserDefaults] objectForKey:@"AppleLanguages"][0]; NSString *path = [[ NSBundle mainBundle ] pathForResource:currentLanguage ofType:@"lproj" ]; NSBundle * current = [NSBundle bundleWithPath:path]; return current;}@end
七、如何快速國際化一個現成APP
不知不覺寫到天亮了,未完待續
iOS 國際化最新最全教程+如何快速國際化一個現成APP