iOS多语言(国际化)开发(尾随系统 + APP内手动设置)
一:尾随系统切换语言
1>创建好项目project后, 新建一个多语言文件:
2>加入要设置的语言类型:
3>加入成功
细心的朋友可能会发如今English
后面写的是3 Files Localized
,这是由于英语是系统默认加入的,并且同一时候为Main.storyboard
和 LaunchScreen.storyboard
设置了多语言,我在自己加入的时候没有勾选这两项.
3>使用多语言文件在应用内设置相应语言
"label"="label";
"label"="标签";
"label"="ラベル";
4>在类中为控件赋值
NSLocalizedString
的使用,有一个必要的条件,就是:多语言文件名称字必须是Localizable
,否则到最后显示的仅仅能是key;者中设置完之后仅仅能让应用尾随系统的语言版本号进行切换,而用户不能手动进行切换
label.text = NSLocalizedString("label", nil)
相关宏说明
//尾随系统切换, 多语言文件名称必须是Localizable
NSLocalizedString("label", nil);
//以下三个都能够手动设置多语言
//第一个參数:是多语言中的key
//第二个參数:是多语言文件的名字
//第三个參数:是对key的凝视说明,一般传nil
NSLocalizedStringFromTable(@"label", @"STLocalizable", nil);
//指定多语言文件名称和bundle
NSLocalizedStringFromTableInBundle(@"label", @"STLocalizable", bundle, nil);
//在上面的基础上添加一个默认值的參数
NSLocalizedStringWithDefaultValue(@"label", @"STLocalizable", bundle, @"label", nil);
也能够使用NSLocalizedStringFromTable
label.text = NSLocalizedStringFromTable(@"label", @"STLocalizable", nil);
这样在切换系统语言之后,启动应用后APP内部的语言也就跟着切换了
二:APP内手动切换语言
1>项目projectShow in Finder
后,发现每一种语言都相应一个目录,后缀是.lproj
,
在APP内切换语言的时候,实际上就是取这些目录中的STLocalizable.strings
文件
2>获取STLocalizable.strings
获取
文件的value
值,相应的想要切换语言的话,直接切换pathForResource
后面的參数就可以
NSString *path = [[NSBundle mainBundle] pathForResource:@"zh-Hans" ofType:@"lproj"];
NSString *labelString = [[NSBundle bundleWithPath:path] localizedStringForKey:@"label" value:nil table:@"STLocalizable"];
NSLog(@"result: %@", labelString);
//输出:MultiLanguage[1887:72599] result: 标签
3>在应用内切换语言,用NSUserDefaults
存储当前语言
- (IBAction)changeLanguage:(UIButton *)sender {
switch (sender.tag) {
case 10: { //中文
[[NSUserDefaults standardUserDefaults] setObject:@"zh-Hans" forKey:appLanguage];
} break;
case 11: { //日文
[[NSUserDefaults standardUserDefaults] setObject:@"ja" forKey:appLanguage];
} break;
case 12: { //英文
[[NSUserDefaults standardUserDefaults] setObject:@"en" forKey:appLanguage];
} break;
default:
break;
}
}
4>程序退出去后,下次进入继续使用上次关闭程序的语言
//依据NSUserDefaults的key去取多语言类型
NSString *laguageType =[NSString stringWithFormat:@"%@", [[NSUserDefaults standardUserDefaults] objectForKey:@"appLanguage"]];
//在文件目录中确认多语言类型相应的路径
NSString *path = [[NSBundle mainBundle] pathForResource:laguageType ofType:@"lproj"];
//在多语言文件里查找label相应的值
NSString *labelText = [[NSBundle bundleWithPath:path] localizedStringForKey:@"label" value:nil table:@"ASLocalized"];
self.label.text = labelText;
扩展
用户第一次启动APP的时候显示什么语言
1>默认设置一种语言,比方英文,在APPDelegate
的didFinishLaunchingWithOptions
中:
if (![[NSUserDefaults standardUserDefaults] objectForKey:appLanguage]) {
//默认设为英文
[[NSUserDefaults standardUserDefaults] setObject:@"en" forKey:appLanguage];
}
2>尾随系统语言
须要获取系统的首选语言顺序,然后取第一个首选语言
//获取第一个首选语言
NSString *language = [NSLocale preferredLanguages][0];
或者推断做好的语言版本号,在首选语言数组中是否存在
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 if ([language hasPrefix:@"ja"] ) {
[[NSUserDefaults standardUserDefaults] setObject:@"ja" forKey:appLanguage];
} else {
[[NSUserDefaults standardUserDefaults] setObject:@"en" forKey:appLanguage];
}
}
改动系统默认开发语言(默认英语)
多语言开发可能用到的方法
#define LanguageKey @"appLanguage"
//获取当前语言
[[NSUserDefaults standardUserDefaults] objectForKey:LanguageKey];
//获取首选语言顺序
[NSLocale preferredLanguages];
//获取首选语言第一语言
[[NSLocale preferredLanguages] objectAtIndex:0];
//获取系统全部语言
[NSLocale availableLocaleIdentifiers];
//获取当前语言文件路径
NSString *currentLanguage = [[NSUserDefaults standardUserDefaults] ;objectForKey:LanguageKey];
NSString *path = [[NSBundle mainBundle] pathForResource:currentLanguage ofType:@"lproj"];
//依据key获取当前语言相应的本地字符串(參数value:假设key是nil或key在表中找不到本地化字符串,则返回的值。)
NSString *value = [[NSBundle bundleWithPath:path] localizedStringForKey:@"label" value:nil table:@"TiLocalizable"];
iOS多语言(国际化)开发(尾随系统 + APP内手动设置)的更多相关文章
- iOS OC语言原生开发的IM模块--RChat
iOS OC语言原生开发的IM模块,用于项目中需要原生开发IM的情况,具备发送文字.表情.语音.图片.视频等完整功能,包含图片预览视频播放等功能,此项目将会长期更新如有问题可以提出,我的邮箱:fshm ...
- 在Eclipse+ADT中开发Android系统的内置应用
转自: http://www.iteye.com/topic/1050439 在Eclipse+ADT中开发Android系统的内置应用 Android系统内置有:Browser(浏览器).Mms( ...
- 消费创富会开发模式系统App
消费创富会系统定制开发,消费创富会网页开发模式,消费创富会开发软件,消费创富会系统APP开发,消费创富会平台模式开发,专业开发微信商城分销.公排.全返.分红.互助等模式定制开发,APP.网页版.微信端 ...
- iOS开发——iOS国际化 APP内语言切换
最近一个一直在迭代的老项目收到一份新的开发需求,项目需要做国际化适配,简体中文+英文.由于项目中采用了storyboard和纯代码两种布局方式,所以国际化也要同时实现.上网查了些资料,实现了更改系统语 ...
- iOS - 跳到系统App内部设置
从App中跳转到手机设置中此App内的设置授权界面: NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString]; if ...
- iOS App程序内多语言国际化实现 By HL
iOS 多语言设置有很多方式可以实现,之前在做手机思埠1.0时,就对app进行了多语言设置,当时看到很多方法,比如用plist等方式保存键值对的,不过还是用Localisator来国际化最方便 1.添 ...
- iOS APP语言国际化之应用内切换语言环境
最近接了一个项目,需求是要做一款应用的英文版本,客户并不清楚,以为要另做一个APP.沟通后告诉他们在之前应用基础上加个国际化功能就好,把之前的语言国际化重新梳理记录一下. 一般设置更改本地语言环境后, ...
- iOS - 实现语言本地化/国际化
实现iOS语言本地化/国际化(图文详解) 前言 语言本地化,又叫做语言国际化.是指根据用户操作系统的语言设置,自动将应用程序的语言设置为和用户操作系统语言一致的语言.往往一些应用程序需要提供给多个 ...
- APP定制开发:APP软件开发的语言和开发环境
APP软件开发是移动互联网开发公司常开发的一种手机应用系统,对于刚刚进入APP软件开发领域的新手来说,选择什么编程语言和需要什么开发环境来开发APP软件是常遇到的问题.下面亿合科技小编来为大家分享下: ...
随机推荐
- 3.菜鸟教你一步一步开发 web service 之 axis 服务端创建
转自:https://blog.csdn.net/shfqbluestone/article/details/37610601 第一步,新建一个工程,如图: 选 Java 写一个工程名,选择好工程路径 ...
- Redis封装之List
/// <summary> /// Redis list的实现为一个双向链表,即可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销, /// Redis内部的很多实现,包括发 ...
- 初识activiti
Activity工作流学习要点 1. 1个插件 在Eclipse中安装Activity插件,让你可以在Eclipse中绘制Activity工作流图 2. 1个引擎 ProcessEngine对象,Ac ...
- PasswordHelper 对user对象的password进行加密重设
public class PasswordHelper { private RandomNumberGenerator randomNumberGenerator = new SecureRandom ...
- 打印机共享为什么老是出现“操作无法完成(错误 0X00000709)。再次检查打印机名称、并确保打印机连接网络
这个情况应该是访问IP连接打印机才会出现的.解决办法:不使用IP访问,使用网上邻居找计算机名称再连接打印机即可. ------------------------------------------- ...
- javaScript 对象学习笔记
javaScript 对象学习笔记 关于对象,这对我们软件工程到学生来说是不陌生的. 因为这个内容是在过年学到,事儿多,断断续续,总感觉有一丝不顺畅,但总结还是要写一下的 JavaScript 对象 ...
- U-BOOT启动流程分析--start_armboot函数(二)
第二阶段的功能: 初始化本阶段所需的硬件设备(主要设置系统时钟.初始化串口.Flash.网卡.USB) 检测系统内存映射(memory map) 将内核映像和根文件系统映象从Flash上读到RAM空间 ...
- Android基于XMPP Smack及Openfire学习笔记(1)
之前开发的项目中实用到IM聊天功能.可是这块功能公司有专门的IM团队来开发,由他们开发好后.直接接入到我们APP中.我參与写IM相关功能非常地少,所以也一直想学习相关知识 . 眼下Android主要用 ...
- androidclient和站点数据交互的实现(基于Http协议获取数据方法)
androidclient一般不直接訪问站点数据库,而是像浏览器一样发送get或者post请求.然后站点返回client能理解的数据格式,client解析这些数据.显示在界面上.经常使用的数据格式是x ...
- 【LeetCode-面试算法经典-Java实现】【008-String to Integer (atoi) (字符串转成整数)】
[008-String to Integer (atoi) (字符串转成整数)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 Implement atoi to co ...