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

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

时间: 2024-10-26 05:18:46

iOS开发-进阶:语言国际化及代码切换语言的相关文章

iOS开发进阶

博客专栏>移动开发专栏>IOS开发进阶 分享到:新浪微博腾讯微博IOS开发进阶 iPhone开发进阶,如果你已经基本熟悉了Objective-c基本语法,你已经熟悉iOS程序开发的基础,那么我们再进一步的学习iOS开发的知识.比如多任务编程,网络,系统方面的原理,内存管理,debug或查找crash的技巧等. 收藏 订阅 最新更新文章 [移动开发] iOS界面-仿网易新闻左侧抽屉式交互 续(添加新闻内容页和评论页手势) 1.介绍有的博友看了上篇博文 iOS界面-仿网易新闻左侧抽屉式交互 ,在微

<iOS开发进阶> 干货汇总

之前看完了<iOS开发进阶>, 也做了相应的总结, 详见:读<iOS开发进阶>有感 今天花点时间, 把一些干货汇总下, 然后就可以和这本书say goodbye了. 包括: p85 10.1.3 p96 使用GCD后 p99 后台运行 p131 使用Safari进行调试 p184 收起键盘 p185 设置应用内的系统控制语言 p193 忽略编译警告 p198 给模拟器相册增加图片 10.1.3 不要向已经释放的对象发送消息 有些读者想测试当对象释放时, 其retainCount 是

读&lt;iOS开发进阶&gt;有感

花了两天时间, 零零散散看完了这本书.总的来说, 比较失望吧. 花点时间记录下. 第一次看到这本书, 是在看唐巧大神博客的时候看到的  ---------->  <iOS开发进阶>即将出版 那时候, 就被吸引住了.原因不外乎如下三点: 作者: 唐巧大神写的书, 怎么能错过 内容: 开发进阶, 学习了iOS有一段时间, 确实比较期待这类的书籍 封面: 简约大气, 很喜欢. 然后就一直等出版, 本来说12月底就能出版, 然后一直拖, 当当要到1月20号左右才正式出售, 现在都是预售阶段..

ios开发UI篇—使用纯代码自定义UItableviewcell实现一个简单的微博界面布局

本文转自 :http://www.cnblogs.com/wendingding/p/3761730.html ios开发UI篇—使用纯代码自定义UItableviewcell实现一个简单的微博界面布局 一.实现效果 二.使用纯代码自定义一个tableview的步骤 1.新建一个继承自UITableViewCell的类 2.重写initWithStyle:reuseIdentifier:方法 添加所有需要显示的子控件(不需要设置子控件的数据和frame,  子控件要添加到contentView中

iOS开发UI基础—使用纯代码自定义UItableviewcell实现一个简单的微博界面布局

ios开发UI基础-使用纯代码自定义UItableviewcell实现一个简单的微博界面布局 一.实现效果 二.使用纯代码自定义一个tableview的步骤 1.新建一个继承自UITableViewCell的类 2.重写initWithStyle:reuseIdentifier:方法 添加所有需要显示的子控件(不需要设置子控件的数据和frame,  子控件要添加到contentView中) 进行子控件一次性的属性设置(有些属性只需要设置一次, 比如字体\固定的图片) 3.提供2个模型 数据模型:

iOS开发之多表视图滑动切换示例(仿&quot;头条&quot;客户端)

好长时间没为大家带来iOS开发干货的东西了,今天给大家分享一个头条新闻客户端各个类别进行切换的一个示例.在Demo中对所需的组件进行的简单封装,在封装的组件中使用的是纯代码的形式,如果想要在项目中进行使用,稍微进行修改即可. 废话少说,先介绍一下功能点,下图是整个Demo的功能点,最上面左边的TabBarButtonItem是用来减少条目的,比如下图有三个按钮,点击减号会减少一个条目.右边的为增加一个条目.点击相应的按钮是切换到对应的表视图上,下方红色的是滑动的指示器,同时支持手势滑动.运行具体

iOS开发------程序实现国际化Localizable

研究AssertsLibaray.framework以及Photos.framework这两个原生静态库的时候,相册的组名需要用到国际化来标示一下,虽然系统提供了组名的国际化,但是稍微的了解了一下国际化还是有必要的.就在这里就稍作记录作为参考.语言国际化就是为不同的语言做的适配,就像iPhone一样,根据不同的语言会将文字变成相应的语言.以下的操作的编译器为Xcode 7.3 内容国际化 1.创建字符串国际化文件(Strings File) 2.将文件的名字改为Localizable,这里需要注

《iOS开发进阶》书籍目录

第一部分:iOS开发工具 第二部分:iOS开发实践 第10章 理解内存管理 10.1 引用计数 10.1.1 什么是引用计数,原理是什么 10.1.2 我们为什么需要引用计数 10.1.3 不要向已经释放的对象发送消息 10.1.4 循环引用(reference cycles)问题 10.1.5 使用Xcode检测循环引用 10.2 使用ARC 10.2.1 Automatic Reference Count 10.2.2 Core Foundation对象的内存管理 第11章 掌握GCD 11

IOS开发 arc与非Arc代码的区别

是属于ios开发中的内存管理问题:在这我简要概述一下,详细讲的话内容挺多,而且是作为一个ios开发人员,或ios开发爱好者,这是必须了解的:Objective-c中提供了两种内存管理机制MRC(MannulReference Counting)和ARC(Automatic Reference Counting),分别提供对内存的手动和自动管理,来满足不同的需求.其实arc 内部机制原理也是来源于mrc ,arc 是在 iOS 5/ Mac OS X 10.7 开始导入,利用 Xcode4.2 可