核心方法:app
#define NSLocalizedStringFromTableInBundle(key, tbl, bundle, comment) \ [bundle localizedStringForKey:(key) value:@"" table:(tbl)]
原理即在工程內部創建 .String,在內部採用鍵值對方式對所須要切換語言的文字進行賦值spa
1.工程內部建立.String文件,命名爲Language.Stringcode
2.右側菜單欄點擊Localize,彈出菜單選擇English,肯定component
3.第二步結束後選擇工程,選擇PROJECT,下方Localizations菜單中點擊+號選擇添加中文orm
4.此時Language.String中會顯示兩個文件,Language.String(Chinese) 和 Language.String(English),這一步像這兩個文件中添加鍵值對blog
英文文件中:資源
"12hour" = "12-Hour Time"; "24hour" = "24-Hour Time"; "am" = "AM"; "pm" = "PM";
中文文件中字符串
"12hour" = "12小時制"; "24hour" = "24小時制"; "am" = "上午"; "pm" = "下午";
5.新建一個單例類,ChangeLanguage,.h中添加屬性方法get
#import <Foundation/Foundation.h> //app應用內切換語言 #define HLLocalizedString(key, tbl) [LocalizationManager getStringForKey:key withTable:tbl] //#define HLLocalizedString(key, tbl) NSLocalizedString(key, tbl) @interface LocalizationManager : NSObject /// 獲取當前資源文件 + (NSBundle *)bundle; /// 初始化語言文件 + (void)initUserLanguage; /// 獲取應用當前語言 + (NSString *)userLanguage; /// 設置當前語言 + (void)setUserlanguage:(NSString *)language; /// 經過Key得到對應的string + (NSString *)getStringByKey:(NSString *)key; + (NSString *)getStringForKey:(NSString *)key withTable:(NSString *)table; @end
6.在.m中實現方法string
#import "LocalizationManager.h" #import "AppDelegate.h" @implementation LocalizationManager static NSString *TableName = @"localization"; static NSBundle *bundle = nil; static NSString *UserLanguage = @"UserLanguage"; + (NSBundle *)bundle { if(!bundle) { [self initUserLanguage]; } return bundle; } + (void)initUserLanguage{ NSUserDefaults *def = [NSUserDefaults standardUserDefaults]; NSString *string = [def valueForKey:UserLanguage]; if(string.length == 0) { //獲取系統當前語言版本(中文zh-Hans,英文en) NSArray *languages = [NSLocale preferredLanguages]; NSString *current = [languages objectAtIndex:0]; string = [self languageFormat:current]; [def setValue:current forKey:UserLanguage]; [def synchronize];//持久化,不加的話不會保存 } //獲取文件路徑 NSString *path = [[NSBundle mainBundle] pathForResource:[self languageFormat:string] ofType:@"lproj"]; bundle = [NSBundle bundleWithPath:path];//生成bundle } + (void)setUserlanguage:(NSString *)language{ NSUserDefaults *def = [NSUserDefaults standardUserDefaults]; //1.第一步改變bundle的值 NSString *path = [[NSBundle mainBundle] pathForResource:[self languageFormat:language] ofType:@"lproj" ]; bundle = [NSBundle bundleWithPath:path]; //2.持久化 [def setValue:language forKey:UserLanguage]; [def synchronize]; [self resetRootViewController]; } + (NSString *)userLanguage { NSString *userLanguage = [[NSUserDefaults standardUserDefaults] objectForKey:UserLanguage]; return userLanguage; } + (NSString *)getStringByKey:(NSString *)key { return [[LocalizationManager bundle] localizedStringForKey:key value:nil table:TableName]; } ///語言和語言對應的.lproj的文件夾前綴不一致時在這裏作處理 + (NSString *)languageFormat:(NSString*)language { if([language rangeOfString:@"zh-Hans"].location != NSNotFound) { return @"zh-Hans"; } else if([language rangeOfString:@"zh-Hant"].location != NSNotFound) { return @"zh-Hant"; } else { //字符串查找 if([language rangeOfString:@"-"].location != NSNotFound) { //除了中文之外的其餘語言統一處理@"ru_RU" @"ko_KR"取前面一部分 NSArray *ary = [language componentsSeparatedByString:@"-"]; if (ary.count > 1) { NSString *str = ary[0]; return str; } } } return language; } + (NSString *)getStringForKey:(NSString *)key withTable:(NSString *)table { if ([LocalizationManager bundle]) { return NSLocalizedStringFromTableInBundle(key, table, [LocalizationManager bundle], @""); } return NSLocalizedStringFromTable(key, table, @""); } //從新設置 + (void)resetRootViewController { AppDelegate *delegate = [AppDelegate getAPPDelegate]; [delegate initTabbarCV]; } @end
7:使用
#切換時使用 if([[LocalizationManager userLanguage] isEqualToString:@"en"]) { [LocalizationManager setUserlanguage:@"zh-Hans"]; } else { [LocalizationManager setUserlanguage:@"en"]; } #注意,多語言的地方須要使用以下定義纔有效 HLLocalizedString(@"Setlang", nil)