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软件是常遇到的问题.下面亿合科技小编来为大家分享下: ...
随机推荐
- 8.不绑定(ngNonBindable)
转自:https://www.cnblogs.com/best/tag/Angular/ ngNonBindable指令告诉Angular编译或绑定当前DOM元素的内容.这对于要求Angular忽略那 ...
- 2.AngularJS-验证
转自:https://www.cnblogs.com/best/p/6225621.html 一.验证 angularJS中提供了许多的验证指令,可以轻松的实现验证,只需要在表单元素上添加相应的ng属 ...
- 21. 【intellij idea】Project Structure 讲解
转自:.https://www.cnblogs.com/zadomn0920/p/6196962.html 项目的左侧面板 项目设置->Project Project Settings -> ...
- vuex 快速入门( 基于vue2.0,vue1.0未知可否)
1.原理概述 2.用户登录例子解析: 由上图可以看到: 1.组件的数据是username,我们把它以name放在state中: 2.更改name发生在mutations的回调里,事件名字是showUs ...
- 【Linux下权限控制之chmod与chown命令】
chmod 用于配置文件/目录权限 命名格式:chmod [选项] 文件/目录名 . 权限类别: r 读取 可用数字4表示 w 写入 可用数字2表示 x 执行 可用数字1表示 . 归属类别: u 属主 ...
- 详解如何在vue项目中引入饿了么elementUI组件
在开发的过程之中,我们也经常会使用到很多组件库:vue 常用ui组件库:https://blog.csdn.net/qq_36538012/article/details/82146649 今天具体说 ...
- 03015_DBUtils
1.概述 (1)如果只使用JDBC进行开发,我们会发现冗余代码过多,为了简化JDBC开发,本案例我们讲采用apache commons组件一个成员:DBUtils : (2)DBUtils就是JDBC ...
- 洛谷 P2684 搞清洁
P2684 搞清洁 题目描述 FJ准备分配它的N只奶牛(1 <= N <= 25,000) 做清洁工作,他把一天分成T(1 <= T <= 1,000,000)个时间段,他希望 ...
- 菜鸟之路——Java并发(二)ThreadLocal
一.什么是ThreadLocal ThreadLocal,非常多地方叫做线程本地变量,也有些地方叫做线程本地存储.事实上意思几乎相同.非常多博客都这样说:ThreadLocal为解决多线程程序 ...
- java架构解密——实时动态aop
在上篇博客中个.咱们一起组建了一个容器,里面封装了业务,这样,咱们就将业务和服务的组装放到了client,而client就相当于咱们的开发中使用到的配置文件.大家发现问题了吗?就是我不能动态修改了?业 ...