如果公司的iOS應(yīng)用需要支持歪果仁,那么多語(yǔ)言是必不可少的,至少要支持一門(mén)英語(yǔ)吧,要不然還不如不做,關(guān)于iOS本地化網(wǎng)上也看了不少文章,總是感覺(jué)離工程實(shí)戰(zhàn)少了點(diǎn)感覺(jué),我們先簡(jiǎn)單看一下Demo效果:
Language.gif
App中多語(yǔ)言設(shè)置起始很簡(jiǎn)單,主要步驟如下:
1.項(xiàng)目設(shè)置需要支持的語(yǔ)言:
Snip20160601_1.png
2.UIStoryBoard,xib及strings多語(yǔ)言設(shè)置:
UIStoryBoard多語(yǔ)言設(shè)置:
Paste_Image.png
strings文件設(shè)置:
Snip20160601_5.png
3.iOS本地化默認(rèn)支持的是Localizable.strings文件:
self.localizedLabel.text=NSLocalizedString(@"Hello", nil);
當(dāng)然我們也可以自定義一個(gè)FlyElephant.strings的文件:
self.localizedLabel.text=NSLocalizedStringFromTable(@"Hello", @"FlyElephant", nil);
4.語(yǔ)言切換:
NSString *code;
if ([[[NSUserDefaults standardUserDefaults] valueForKey:@"AppleLanguages"][0] isEqual:@"en"]) {
code=@"zh-Hans";
}else{
code=@"en";
}
[[NSUserDefaults standardUserDefaults] setObject:@[code] forKey:@"AppleLanguages"];
[[NSUserDefaults standardUserDefaults] synchronize];
AppDelegate *appDelegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
[appDelegate reloadRootContoller:code];
5.AppDelegate設(shè)置:
#pragma mark - RootViewController
-(void)loadRootViewController{
ViewController *rootController=[[UIStoryboard storyboardWithName:@"Main" bundle:nil] instantiateViewControllerWithIdentifier:@"ViewController"];
self.window.rootViewController=rootController;
}
#pragma mark - Public
-(void)reloadRootContoller:(NSString *)code{
[NSBundle setLanguage:code];
[self loadRootViewController];
}
6.NSBundle擴(kuò)展:
@interface NSBundle (Language)
+ (void)setLanguage:(NSString *)language;
@end
#import "NSBundle+Language.h"
#import <objc/runtime.h>
static const char kBundleKey = 0;
@interface BundleEx : NSBundle
@end
@implementation BundleEx
- (NSString *)localizedStringForKey:(NSString *)key value:(NSString *)value table:(NSString *)tableName
{
NSBundle *bundle = objc_getAssociatedObject(self, &kBundleKey);
if (bundle) {
return [bundle localizedStringForKey:key value:value table:tableName];
}
else {
return [super localizedStringForKey:key value:value table:tableName];
}
}
@end
@implementation NSBundle (Language)
+ (void)setLanguage:(NSString *)language
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
object_setClass([NSBundle mainBundle],[BundleEx class]);
});
id value = language ? [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:language ofType:@"lproj"]] : nil;
objc_setAssociatedObject([NSBundle mainBundle], &kBundleKey, value, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
@end
基本的應(yīng)用內(nèi)語(yǔ)言切換功能可以實(shí)現(xiàn)了,如果對(duì)于App多語(yǔ)言有什么問(wèn)題,歡迎評(píng)論區(qū)共同探討~