iOS 國際化最新最全教程+如何快速國際化一個現成APP

來源:互聯網
上載者:User

標籤: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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.