一:尾随系统切换语言

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. BZOJ 1103 DFS序+线段树

    思路: 先搞出来DFS序 进入这个点 +1 出这个点 -1 线段树维护前缀和 (因为还要修改) 搞定 修改的时候只修改底下节点就OK了 (边权–>点权 不多说) //By SiriusRen # ...

  2. BZOJ1194: [HNOI2006]潘多拉的盒子(tarjan)

    Description 传说中,有个神奇的潘多拉宝盒.如果谁能打开,便可以拥有幸福.财富.爱情.可是直到真的打开,才发现与之 相随的还有灾难.不幸.其实,在潘多拉制造这个宝盒的时候,设置了一些咒语来封 ...

  3. iOS Scheme 跳转主流实现方案

    iOS Scheme跳转主流实现方案主要是路由跳转,目前iOS常用路由框架是JLRouter.HHRouter.MGJRouter. 但是这些路由库都各有不足,首先是JLRouter,用不到的功能繁多 ...

  4. effective stl读书笔记 & stl里面提供的算法 & emplace & ostream_iterator

    加锁和解锁,也可以在构造函数和析构函数里面,自动调用. 相等和等价的关系:等价是用在排序的时候,跟less函数有关. vector,deque,string 要用erase-remove组合:而关联容 ...

  5. EBS OAF开发中实体对象和视图对象的属性设置器

    EBS OAF开发中实体对象和视图对象的属性设置器 (版权声明.本人原创或者翻译的文章如需转载,如转载用于个人学习,请注明出处:否则请与本人联系,违者必究) 源文: Home > Oracle ...

  6. [ES2017] Iterate over properties of an object with ES2017 Object.entries()

    The Object.entries() function is an addition to the ECMAscript scpec in Es2017. This allows us to it ...

  7. Codeforces 240E. Road Repairs 最小树形图+输出路径

    最小树形图裸题,只是须要记录路径 E. Road Repairs time limit per test 2 seconds memory limit per test 256 megabytes i ...

  8. C#最简单的登录Web服务

    因为演示程序,所以有下面问题: 1.password是明码传输. 本文在  C#建立最简单的web服务,无需IIS  的基础上完毕. 详细步骤: 一.RequestProcessor添加变量mLogi ...

  9. 【POJ 2482】 Stars in Your Window(线段树+离散化+扫描线)

    [POJ 2482] Stars in Your Window(线段树+离散化+扫描线) Time Limit: 1000MS   Memory Limit: 65536K Total Submiss ...

  10. Java的IO流架构

    输入输出是指应用程序与外部设备及其他计算机进行数据交流的操作,如读写硬盘数据.向显示器输出数据.通过网络读取其他节点的数据等.任何一种编程语言必须拥有输入输出的处理方式,Java语言也不例外.Java ...