一:尾随系统切换语言

1>创建好项目project后, 新建一个多语言文件:

2>加入要设置的语言类型:

3>加入成功

细心的朋友可能会发如今English后面写的是3 Files Localized,这是由于英语是系统默认加入的,并且同一时候为Main.storyboardLaunchScreen.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>默认设置一种语言,比方英文,在APPDelegatedidFinishLaunchingWithOptions中:

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内手动设置)的更多相关文章

  1. iOS OC语言原生开发的IM模块--RChat

    iOS OC语言原生开发的IM模块,用于项目中需要原生开发IM的情况,具备发送文字.表情.语音.图片.视频等完整功能,包含图片预览视频播放等功能,此项目将会长期更新如有问题可以提出,我的邮箱:fshm ...

  2. 在Eclipse+ADT中开发Android系统的内置应用

    转自:  http://www.iteye.com/topic/1050439 在Eclipse+ADT中开发Android系统的内置应用 Android系统内置有:Browser(浏览器).Mms( ...

  3. 消费创富会开发模式系统App

    消费创富会系统定制开发,消费创富会网页开发模式,消费创富会开发软件,消费创富会系统APP开发,消费创富会平台模式开发,专业开发微信商城分销.公排.全返.分红.互助等模式定制开发,APP.网页版.微信端 ...

  4. iOS开发——iOS国际化 APP内语言切换

    最近一个一直在迭代的老项目收到一份新的开发需求,项目需要做国际化适配,简体中文+英文.由于项目中采用了storyboard和纯代码两种布局方式,所以国际化也要同时实现.上网查了些资料,实现了更改系统语 ...

  5. iOS - 跳到系统App内部设置

    从App中跳转到手机设置中此App内的设置授权界面: NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString]; if ...

  6. iOS App程序内多语言国际化实现 By HL

    iOS 多语言设置有很多方式可以实现,之前在做手机思埠1.0时,就对app进行了多语言设置,当时看到很多方法,比如用plist等方式保存键值对的,不过还是用Localisator来国际化最方便 1.添 ...

  7. iOS APP语言国际化之应用内切换语言环境

    最近接了一个项目,需求是要做一款应用的英文版本,客户并不清楚,以为要另做一个APP.沟通后告诉他们在之前应用基础上加个国际化功能就好,把之前的语言国际化重新梳理记录一下. 一般设置更改本地语言环境后, ...

  8. iOS - 实现语言本地化/国际化

      实现iOS语言本地化/国际化(图文详解) 前言 语言本地化,又叫做语言国际化.是指根据用户操作系统的语言设置,自动将应用程序的语言设置为和用户操作系统语言一致的语言.往往一些应用程序需要提供给多个 ...

  9. APP定制开发:APP软件开发的语言和开发环境

    APP软件开发是移动互联网开发公司常开发的一种手机应用系统,对于刚刚进入APP软件开发领域的新手来说,选择什么编程语言和需要什么开发环境来开发APP软件是常遇到的问题.下面亿合科技小编来为大家分享下: ...

随机推荐

  1. 3.菜鸟教你一步一步开发 web service 之 axis 服务端创建

    转自:https://blog.csdn.net/shfqbluestone/article/details/37610601 第一步,新建一个工程,如图: 选 Java 写一个工程名,选择好工程路径 ...

  2. Redis封装之List

    /// <summary> /// Redis list的实现为一个双向链表,即可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销, /// Redis内部的很多实现,包括发 ...

  3. 初识activiti

    Activity工作流学习要点 1. 1个插件 在Eclipse中安装Activity插件,让你可以在Eclipse中绘制Activity工作流图 2. 1个引擎 ProcessEngine对象,Ac ...

  4. PasswordHelper 对user对象的password进行加密重设

    public class PasswordHelper { private RandomNumberGenerator randomNumberGenerator = new SecureRandom ...

  5. 打印机共享为什么老是出现“操作无法完成(错误 0X00000709)。再次检查打印机名称、并确保打印机连接网络

    这个情况应该是访问IP连接打印机才会出现的.解决办法:不使用IP访问,使用网上邻居找计算机名称再连接打印机即可. ------------------------------------------- ...

  6. javaScript 对象学习笔记

    javaScript 对象学习笔记 关于对象,这对我们软件工程到学生来说是不陌生的. 因为这个内容是在过年学到,事儿多,断断续续,总感觉有一丝不顺畅,但总结还是要写一下的 JavaScript 对象 ...

  7. U-BOOT启动流程分析--start_armboot函数(二)

    第二阶段的功能: 初始化本阶段所需的硬件设备(主要设置系统时钟.初始化串口.Flash.网卡.USB) 检测系统内存映射(memory map) 将内核映像和根文件系统映象从Flash上读到RAM空间 ...

  8. Android基于XMPP Smack及Openfire学习笔记(1)

    之前开发的项目中实用到IM聊天功能.可是这块功能公司有专门的IM团队来开发,由他们开发好后.直接接入到我们APP中.我參与写IM相关功能非常地少,所以也一直想学习相关知识 . 眼下Android主要用 ...

  9. androidclient和站点数据交互的实现(基于Http协议获取数据方法)

    androidclient一般不直接訪问站点数据库,而是像浏览器一样发送get或者post请求.然后站点返回client能理解的数据格式,client解析这些数据.显示在界面上.经常使用的数据格式是x ...

  10. 【LeetCode-面试算法经典-Java实现】【008-String to Integer (atoi) (字符串转成整数)】

    [008-String to Integer (atoi) (字符串转成整数)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 Implement atoi to co ...