语言国际化和使用代码切换语言是很多APP都有的功能, 实现起来也很简单, 没有什么技术难题, 网上有很多相关的资料, 在实现了功能后, 打算把整个过程写在这里.(例子均为中英文, 替换其他语言原理相同, 只需记录保存该语言的key值即可)
需求:
1.应用名跟随系统切换
2.应用内容跟随系统切换
3.使用代码切换应用内容的语言(含后台返回数据切换语言)
实现:
1.应用名跟随系统切换
首先在Project下选择Info, 然后在Localizations中添加程序需要使用的语言,中文.
然后创建一个InfoPlist.strings的文件, Xcode左侧选择该文件, 在Xcode点击Localize, 然后添加中文和English, 这样InfoPlist.String文件就会向下展开俩个文件 InfoPlist.strings(English), InfoPlist.strings(Chinese
(Simplified));
在 InfoPlist.strings(English)文件中输入代码: CFBundleDisplayName="English";
在InfoPlist.strings(Chinese)中输入: CFBundleDisplayName="中文";
完成, 然后运行你的程序, 当你切换语言后, 就会发现桌面上的应用名称的变化.
2.应用内容跟随系统切换
注:如果实现需求3即代码即代码切换应用内容的语言, 就会覆盖跟随系统切换的方法.
新建Localizable.strings文件, 同上点击Localize, 生成英文和中文俩个strings文件;
在英文下输入:
"Hello World" = "Hello World!";
在中文下输入:
"Hello World" = "嗨~ 世界!";
最后写一个测试的函数, 并在viewDidLoad中调用他
- (void)languageWithSystem { UILabel *testLabel = [[UILabel alloc] initWithFrame:CGRectMake(100, 100, 100, 100)]; testLabel.text = NSLocalizedString(@"Hello World", @"this String will change with system language!"); [self.view addSubview:testLabel]; }
运行程序, 你会发现, 这个Label的内容会根据系统的语言切换而切换.
3.使用代码切换应用内容的语言(含后台返回数据切换语言)
在2的基础上写个宏定义, 用来读取语言文件和返回的value值.
#define Localized(key) [[NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"%@",[[NSUserDefaults standardUserDefaults] objectForKey:@"appLanguage"]] ofType:@"lproj"]] localizedStringForKey:(key) value:nil table:@"Localizable"]
由于切换语言后, 需要刷新页面, 因此在AppDelegate.h中声明一个toMian的方法, 用来刷新界面
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { if (![[NSUserDefaults standardUserDefaults]objectForKey:@"appLanguage"]) { NSArray *languages = [NSLocale preferredLanguages]; NSString *language = [languages objectAtIndex:0]; if ([language hasPrefix:@"zh-Hans"]) {//开头匹配 [[NSUserDefaults standardUserDefaults] setObject:@"zh-Hans" forKey:@"appLanguage"]; }else{ [[NSUserDefaults standardUserDefaults] setObject:@"en" forKey:@"appLanguage"]; } } [self toMain]; return YES; } - (void)toMain { self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; ViewController *vC = [[ViewController alloc] init]; self.window.rootViewController = vC; [self.window makeKeyAndVisible]; }
在ViewController中写一个测试函数
- (void)languageWithButton { UILabel *testLabel = [[UILabel alloc] initWithFrame:CGRectMake(100, 350, 100, 100)]; testLabel.text = Localized(@"Hello World"); [self.view addSubview:testLabel]; }
再创建一个UIButton, 点击是可以切换语言
- (void)viewDidLoad { [super viewDidLoad]; self.view.backgroundColor = [UIColor whiteColor]; [self languageWithSystem]; [self languageWithButton]; UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect]; btn.frame = CGRectMake(100, 250, 150, 50); btn.backgroundColor = [UIColor redColor]; [btn setTitle:Localized(@"Change Button") forState:UIControlStateNormal]; [btn addTarget:self action:@selector(changeLanguage:) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:btn]; }
- (void)changeLanguage:(id)sender { NSString *language = [[NSUserDefaults standardUserDefaults]objectForKey:@"appLanguage"]; if ([language isEqualToString: @"en"]) { [[NSUserDefaults standardUserDefaults] setObject:@"zh-Hans" forKey:@"appLanguage"]; }else { [[NSUserDefaults standardUserDefaults] setObject:@"en" forKey:@"appLanguage"]; } [[NSUserDefaults standardUserDefaults] synchronize]; AppDelegate *delegate = (AppDelegate *)[UIApplication sharedApplication].delegate; [delegate toMain]; }
然后,运行程序吧, 当点击Button时, 语言就通过代码切换成功了.
最后讲一下后台返回数据的双语言, 用的是比较笨的方法, 实现起来比较简单, 就是在进行网络请求时, 将当前APP的语言发送给后台, 后台根据这个参数返回对应语言的数据.
Demo地址: https://github.com/Nikolilol/LXLocalizationsLanguage/tree/master