前言

在一次项目中,要求在应用内切换语言的需求。如需跟随系统改变语言的,可以参考其他的博客,这里就不多说了

思路

创建一个国际化管理者,通过传递一个key,再根据当前的语言环境,获取对应的value。

实现步骤

1、选择要国际化的语言

进入如下界面后,找到最下面的“+”号,选择要进行国际化的语言

2、创建strings文件

点击strings文件,在右侧工具栏找到Localization,选择要国际化的语种

选择后,就会产生对应的lproj文件,以下是勾选了简体中文和英语后的文件目录

3、创建国际化管理者

LocalizationManager.h

#import <Foundation/Foundation.h>/// 国际化管理者
@interface LocalizationManager : NSObject
/// 获取当前资源文件
+ (NSBundle *)bundle;
/// 初始化语言文件
+ (void)initUserLanguage;
/// 获取应用当前语言
+ (NSString *)userLanguage;
/// 设置当前语言
+ (void)setUserlanguage:(NSString *)language;
/// 通过Key获得对应的string
+ (NSString *)getStringByKey:(NSString *)key;@end

LocalizationManager.m

#import "LocalizationManager.h"
#import "AppDelegate.h"
#import "MyTabBarViewController.h"@implementation LocalizationManagerstatic NSString *TableName = @"localization";
static NSBundle *bundle = nil;
static NSString *UserLanguage = @"UserLanguage";+ (NSBundle *)bundle
{if(!bundle){[self initUserLanguage];}return bundle;
}+ (void)initUserLanguage{NSUserDefaults *def = [NSUserDefaults standardUserDefaults];NSString *string = [def valueForKey:UserLanguage];if(string.length == 0){//获取系统当前语言版本(中文zh-Hans,英文en)NSArray *languages = [NSLocale preferredLanguages];NSString *current = [languages objectAtIndex:0];string = [self languageFormat:current];[def setValue:current forKey:UserLanguage];[def synchronize];//持久化,不加的话不会保存}//获取文件路径NSString *path = [[NSBundle mainBundle] pathForResource:[self languageFormat:string] ofType:@"lproj"];bundle = [NSBundle bundleWithPath:path];//生成bundle
}+ (void)setUserlanguage:(NSString *)language{NSUserDefaults *def = [NSUserDefaults standardUserDefaults];//1.第一步改变bundle的值NSString *path = [[NSBundle mainBundle] pathForResource:[self languageFormat:language] ofType:@"lproj" ];bundle = [NSBundle bundleWithPath:path];//2.持久化[def setValue:language forKey:UserLanguage];[def synchronize];[self resetRootViewController];
}+ (NSString *)userLanguage
{NSString *userLanguage = [[NSUserDefaults standardUserDefaults] objectForKey:UserLanguage];return userLanguage;
}+ (NSString *)getStringByKey:(NSString *)key
{return [[LocalizationManager bundle] localizedStringForKey:key value:nil table:TableName];
}///语言和语言对应的.lproj的文件夹前缀不一致时在这里做处理
+ (NSString *)languageFormat:(NSString*)language {if([language rangeOfString:@"zh-Hans"].location != NSNotFound){return @"zh-Hans";}else if([language rangeOfString:@"zh-Hant"].location != NSNotFound){return @"zh-Hant";}else{//字符串查找if([language rangeOfString:@"-"].location != NSNotFound) {//除了中文以外的其他语言统一处理@"ru_RU" @"ko_KR"取前面一部分NSArray *ary = [language componentsSeparatedByString:@"-"];if (ary.count > 1) {NSString *str = ary[0];return str;}}}return language;
}//重新设置
+ (void)resetRootViewController
{AppDelegate *delegate = (AppDelegate *)[UIApplication sharedApplication].delegate;MyTabBarViewController *tabVC = [[MyTabBarViewController alloc] init];delegate.window.rootViewController = tabVC;
}
@end

难点解析

一、获取bundle文件

通过getStringByKey去获取对应的语种蚊子

_homeLabel.text = [LocalizationManager getStringByKey:@"home"];

二、切换语言

这里只做了对中英的切换。这里切换我是使用的是直接更改根控制器,从而达到其他界面的文字随之改变。另外一种是使用通知的方法,这个方法可以是可以,但是当控制器一多,通知起来就显示十分麻烦了。微信也是采用直接更改根控制器实现的。

- (IBAction)switch
{if([[LocalizationManager userLanguage] isEqualToString:@"en"]){[LocalizationManager setUserlanguage:@"zh-Hans"];}else{[LocalizationManager setUserlanguage:@"en"];}
}

演示图

源代码

http://download.csdn.net/detail/bloody_leaves/9720202

参考链接

http://blog.csdn.net/x32sky/article/details/39031025
http://www.jianshu.com/p/627da5a9992c

iOS--在应用内切换语言相关推荐

  1. iOS 应用程序内切换语言 中英文切换

    前言:网络上关于iOS国际化的文章很多,但基本上都是基于跟随系统语言的国际化,笔者就不赘述了-0 – 今天要讲的是不跟随系统的切换语言版本方案,即程序内部的切换语言版本方案. 一.总则: 应用内部语言 ...

  2. iOS 应用程序内切换语言 中英文切换

    前言:网络上关于iOS国际化的文章很多,但基本上都是基于跟随系统语言的国际化,笔者就不赘述了-0 – 今天要讲的是不跟随系统的切换语言版本方案,即程序内部的切换语言版本方案. 一.总则: 应用内部语言 ...

  3. IOS APP 国际化 程序内切换语言实现 不重新启动系统(支持项目中stroyboard 、xib 混用。完美解决方案)

    IOS APP 国际化 程序内切换语言实现 不重新启动系统(支持项目中stroyboard .xib 混用.完美解决方案) 参考文章: (1)IOS APP 国际化 程序内切换语言实现 不重新启动系统 ...

  4. Swift之本地国际化与App内切换语言

    添加语言库 点击项目 -> PROJECT -> Info -> Localizations -> + , 添加需要的语言; 添加完成的语言库如下所示: 创建Localizab ...

  5. Android切换泰语,Android应用内切换语言

    首先扯点别的:这是第一次在简书上写东西,我突然明白为啥这么多人在简书上写东西了,因为没有广告啊,哈哈. 最近接触到Android 应用内切换语言的问题,研究了两天,做个记录先.实现了中文,英文,泰语的 ...

  6. Android 8.0 App内切换语言不生效的问题记录

    国内大部分简单应该都只做了中文简体版,但是有部分项目需要面向国际化,甚至可能就是主打国外市场.因此我们有时候会遇到需要APP内做多语言切换的功能需求. 如何做多语言切换,网上资料还是很多的,本文也不是 ...

  7. 解决Android 7.0 App内切换语言不生效的问题

    Android7.0及以前版本,Configuration中的语言相当于是App的全局设置: 1 public static void changeAppLanguage(Context contex ...

  8. android 语言选则,应用内切换语言不重启应用的方法。

    切换方法public void updataLanguage(String s){SharedPreferences sp =getSharedPreferences("语言",M ...

  9. android 应用内切换语言

    一:创建不同语言的strings.xml 1.1 选中res,右键选择Android Resource Directory => Locale => >> 选择你需要的语言 1 ...

最新文章

  1. Caused by: java.sql.BatchUpdateException
  2. Android如何使用读写cookie的方法
  3. Set、Map、和WeakSet、WeakMap
  4. html友情链接效果代码,HTML友情链接代码
  5. 女程序员被阿里录取工资二万六,辞职时被领导挽留:给你四万留下
  6. f450四轴使用技巧
  7. 2019年第十届蓝桥杯国赛B组试题G-排列数-next_permutation枚举,模拟
  8. 设计灵感|展览海报如何排版?好的作品给你灵感
  9. 海外新趋势:挑战Tiktok,跨境卖家的新红利流量渠道?
  10. 打造“5G+IoT”生态,共创产业繁荣沃土
  11. HTML5+app开发学习之IOS打包篇
  12. 计算机论文投tmc期刊,无线网络会议与期刊档次划分一览
  13. 设计一个电商平台积分兑换系统的流程和技术选型
  14. ReadHub源码阅读笔记(一)
  15. Java - Certificate has been revoked
  16. 基于神经网络的人脸识别(Tensorflow,opencv,dlib,cnn,)
  17. dw改透明度_div 背景透明度 如何设置一个div的背景透明度
  18. 键盘可以实现向计算机输入数据判断,计算机应用基础_学习指南.docx
  19. 电脑开机显示“被调用的对象已与其客户端断开连接”解决方法
  20. 数组方法中会更改原数组,不会更改原数组(详细)

热门文章

  1. 安卓9 怎么运行老程序_孩子老走神怎么办?9张图教你培养孩子的注意力!
  2. 医学影像中呼吸门控的动态显示
  3. 成都榆熙:为什么一口价是影响权重重要因素之一
  4. SOM v3.3.3 C++ DLL用户自定义技能实战
  5. Linux / Ubuntu在命令行下载安装Flash插件(无需官网下载tar包)
  6. 解释微信小程序const app=getApp()的作用
  7. Dentalis Animal Health任命顾问委员会
  8. bug: java.io.IOException: 你的主机中的软件中止了一个已建立的连接。
  9. 超宽带定位算法matlab,毕业设计_--超宽带(UWB)无线定位技术.doc
  10. Struts 2中s:action标签的用法