iOS开发--应用国际化,应用内切换语言
1.前言
自己负责的项目需要做国际化,并且要求应用内部切换语言。这个是可以做到的,也并不难,可以直接戳Github看一下
https://github.com/leo90821/LocaliztionStringExchange
2.实现原理
原理比较简单,利用NSBundle切换语言包,主要利用NSBundle的方法
- localizedStringForKey:value:table: 进行本地字符串的切换
3.实现代码
1)业务逻辑
头文件
#import <Foundation/Foundation.h> #define USER_DEFAULT_STRING @"userLanguage"
#define APPLE_LANGUAGES @"AppleLanguages"
/**
* App BLL
**/
@interface BLL : NSObject
/**
* BLL single
**/
+ (instancetype)currentLogic;
/**
* App bundle
**/
+ (NSBundle *)bundle;
/**
* 初始化语言
**/
- (void)initUserLanguage;
/**
* 获得当前语言
**/
- (NSString *)getCurrentLanguage;
/**
* 设置语言
**/
- (void)setUserLanguageWithLanguage:(NSString *)language;
@end
实现文件
#import "BLL.h" @implementation BLL
static NSBundle *bundle = nil; - (instancetype)init {
self = [super init];
return self;
} + (instancetype)currentLogic {
static BLL *logic = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
logic = [[BLL alloc] init];
});
return logic;
} + (NSBundle *)bundle {
return bundle;
} /**
* 初始化语言
**/
- (void)initUserLanguage {
NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];
NSString *string = [userDefault valueForKey:USER_DEFAULT_STRING];
if (string.length == ) {
NSArray *languages = [userDefault objectForKey:APPLE_LANGUAGES];
NSString *current = [languages objectAtIndex:];
string = current;
[userDefault setValue:string forKey:USER_DEFAULT_STRING];
[userDefault synchronize];
} NSString *path = [[NSBundle mainBundle] pathForResource:string ofType:@"lproj"];
bundle = [NSBundle bundleWithPath:path];
}
/**
* 获得当前语言
**/
- (NSString *)getCurrentLanguage {
NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];
NSString *language = [userDefault valueForKey:USER_DEFAULT_STRING];
return language;
}
/**
* 设置语言
**/
- (void)setUserLanguageWithLanguage:(NSString *)language {
NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];
NSString *path = [[NSBundle mainBundle] pathForResource:language ofType:@"lproj"];
bundle = [NSBundle bundleWithPath:path];
[userDefault setValue:language forKey:USER_DEFAULT_STRING];
[userDefault synchronize];
} @end
2)视图控制器
#import <UIKit/UIKit.h>
#define NOTIFICATION_CHANGE_LANGUAGE @"ChangeLanguage"
@interface ViewController : UIViewController
@end
#import "ViewController.h"
#import "BLL.h"
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UILabel *tip; - (IBAction)changeLanguage:(id)sender;
@property (weak, nonatomic) IBOutlet UIButton *button; @end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib. [self.button setTitle:NSLocalizedStringFromTable(@"Change", @"MyString", nil) forState:UIControlStateNormal];
self.tip.text = NSLocalizedStringFromTable(@"Hello", @"MyString", nil); } - (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[self addObservers];
} - (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
[self removeObservers];
} - (void)addObservers {
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(refreshUI) name:NOTIFICATION_CHANGE_LANGUAGE object:nil];
} - (void)removeObservers {
[[NSNotificationCenter defaultCenter] removeObserver:self name:NOTIFICATION_CHANGE_LANGUAGE object:nil];
} - (void)refreshUI { [self.button setTitle:[[BLL bundle] localizedStringForKey:@"Change" value:nil table:@"MyString"] forState:UIControlStateNormal];
self.tip.text = [[BLL bundle] localizedStringForKey:@"Hello" value:nil table:@"MyString"];
} - (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
} - (IBAction)changeLanguage:(id)sender {
NSString *language = [[BLL currentLogic] getCurrentLanguage]; if ([language rangeOfString:@"en"].location != NSNotFound) {
[[BLL currentLogic] setUserLanguageWithLanguage:@"zh-Hans"];
} else {
[[BLL currentLogic] setUserLanguageWithLanguage:@"en"];
}
[[NSNotificationCenter defaultCenter] postNotificationName:NOTIFICATION_CHANGE_LANGUAGE object:nil
];
}
@end
4.小结
原理比较简单,利用NSBundle切换语言包,主要利用NSBundle的方法
- localizedStringForKey:value:table: 进行本地字符串的切换,最麻烦的是刷新每个页面都需要设置消息观察者,这个就比较蛋疼。有没有好的方法,欢迎留言交流。
iOS开发--应用国际化,应用内切换语言的更多相关文章
- IOS APP 国际化 程序内切换语言实现 不重新启动系统(支持项目中stroyboard 、xib 混用。完美解决方案)
上篇 IOS APP 国际化(实现不跟随系统语言,不用重启应用,代码切换stroyboard ,xib ,图片,其他资源 介绍了纯代码刷新 实现程序内切换语言. 但效率底下,也存在一些问题.暂放弃. ...
- App内切换语言
前几天客户提需求,对App增加一个功能,这个功能目前市面上已经很常见,那就是应用内切换语言.啥意思,就是 英.中.法.德.日...语言随意切换. (本案例采用Data-Bingding模式,麻麻再也不 ...
- iOS开发:使用Tab Bar切换视图
iOS开发:使用Tab Bar切换视图 上一篇文章提到了多视图程序中各个视图之间的切换,用的Tool Bar,说白了还是根据触发事件使用代码改变Root View Controller中的Conten ...
- iOS开发中,应用内直接跳转到Appstore
iOS开发中,应用内直接跳转到Appstore 1.进入appstore中指定的应用NSString *str = [NSString stringWithFormat: ...
- IOS开发中UIBarButtonItem上按钮切换或隐藏实现案例
IOS开发中UIBarButtonItem上按钮切换或隐藏案例实现案例是本文要介绍的内容,这个代码例子的背景是:导航条右侧有个 edit button,左侧是 back button 和 add bu ...
- iOS 国际化 (国际化文字内容不改变,app名字国际化,一键切换语言)
首先我们要分三个步骤讲解怎么一步步实现app名字国际化.内容国际化.一键切换国际化的: 一.app设置内容或者可以说是app名字或者可以说Info.Plist中的东西国际化 app名字国际化 1. ...
- iOS开发之虾米音乐频道选择切换效果分析与实现
今天博客的内容比较简单,就是看一下虾米音乐首页中频道选择的一个动画效果的实现.之前用mask写过另外一种Tab切换的一种效果,网易云音乐里边的一种Tab切换效果,详情请移步于"视错觉:从一个 ...
- Android 应用内切换语言
extends :http://bbs.51cto.com/thread-1075165-1.html,http://www.cnblogs.com/loulijun/p/3164746.html 1 ...
- iOS开发之——从零开始完成页面切换形变动画
前言 某天我接到了UI发给我的两张图: 需求图.png 看到图的时候我一脸懵逼,显然我需要做一个页面切换的指示动画.老实说,从大三暑假开始做iOS开发也一年有余了,但是遇到复杂动画总是唯恐避之不及,只 ...
随机推荐
- 学习GIT 版本控制的好去处 另GDB资料
廖雪峰的官方网站 http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 作者不仅仅是做技 ...
- Spring缓存配置遇到的坑
基本配置 <cache:annotation-driven cache-manager="cacheManager"/> <bean id="cache ...
- db2 存储过程中的玩意
aix的top是topas.vmstat也是一个玩意,但是不懂. AND C_DEP_CDE like substr(I_C_DPT_CDE,1,2)||'%';--db2中字符串的加法用||这个 ...
- JavaScript的异步运行机制
----异步运行机制如下: 1.左右同步任务都在主线程上执行,形成一个执行栈 2.主线程值外,还存在一个任务队列,只要异步任务有了运行结果,就在任务队列中放置一个事件 3.一旦执行栈中的所有同步任务执 ...
- 2018.07.23 codeforces 438D. The Child and Sequence(线段树)
传送门 线段树维护区间取模,单点修改,区间求和. 这题老套路了,对一个数来说,每次取模至少让它减少一半,这样每次单点修改对时间复杂度的贡献就是一个log" role="presen ...
- Python 析构方法__del__
class Car: def __init__(self): print('---ok---') def __del__(self): print('----deconstrcut-------') ...
- Cache Algorithms
1. 平均内存引用时间 T = average memory reference time m = miss ratio = 1 - (hit ratio) Tm = time to make a m ...
- 五、搭建kube-dns
1. 简介 kube-dns用来为kubernetes service分配子域名,在集群中可以通过名称访问service.通常kube-dns会为service赋予一个名为"servic ...
- Team Foundation Server 开发流程管理管理研讨会
这周,和微软公司的朋友一起,受北京某金融企业邀请,为企业软件部门一个70多人的软件团队提供了一场基于Team Foundation Server的软件软件流程的技术研讨会.在研讨会中,培训基于微软Te ...
- Redis的认识和基本操作
Redis是什么 Redis 是一个高性能的开源的.C语言写的Nosql(非关系型数据库),数据保存在内存中. Redis 是以key-value形式存储的Nosql,和传统的关系型数据库不一样.不一 ...