码迷,mamicode.com
首页 > 移动开发 > 详细

iOS开发-进阶:语言国际化及代码切换语言

时间:2016-05-07 09:30:48      阅读:261      评论:0      收藏:0      [点我收藏+]

标签:

语言国际化和使用代码切换语言是很多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











iOS开发-进阶:语言国际化及代码切换语言

标签:

原文地址:http://blog.csdn.net/sinat_31872425/article/details/51313312

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!