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开发--应用国际化,应用内切换语言的更多相关文章

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

    上篇 IOS APP 国际化(实现不跟随系统语言,不用重启应用,代码切换stroyboard ,xib ,图片,其他资源 介绍了纯代码刷新 实现程序内切换语言. 但效率底下,也存在一些问题.暂放弃. ...

  2. App内切换语言

    前几天客户提需求,对App增加一个功能,这个功能目前市面上已经很常见,那就是应用内切换语言.啥意思,就是 英.中.法.德.日...语言随意切换. (本案例采用Data-Bingding模式,麻麻再也不 ...

  3. iOS开发:使用Tab Bar切换视图

    iOS开发:使用Tab Bar切换视图 上一篇文章提到了多视图程序中各个视图之间的切换,用的Tool Bar,说白了还是根据触发事件使用代码改变Root View Controller中的Conten ...

  4. iOS开发中,应用内直接跳转到Appstore

    iOS开发中,应用内直接跳转到Appstore 1.进入appstore中指定的应用NSString *str = [NSString stringWithFormat:                ...

  5. IOS开发中UIBarButtonItem上按钮切换或隐藏实现案例

    IOS开发中UIBarButtonItem上按钮切换或隐藏案例实现案例是本文要介绍的内容,这个代码例子的背景是:导航条右侧有个 edit button,左侧是 back button 和 add bu ...

  6. iOS 国际化 (国际化文字内容不改变,app名字国际化,一键切换语言)

    首先我们要分三个步骤讲解怎么一步步实现app名字国际化.内容国际化.一键切换国际化的: 一.app设置内容或者可以说是app名字或者可以说Info.Plist中的东西国际化  app名字国际化  1. ...

  7. iOS开发之虾米音乐频道选择切换效果分析与实现

    今天博客的内容比较简单,就是看一下虾米音乐首页中频道选择的一个动画效果的实现.之前用mask写过另外一种Tab切换的一种效果,网易云音乐里边的一种Tab切换效果,详情请移步于"视错觉:从一个 ...

  8. Android 应用内切换语言

    extends :http://bbs.51cto.com/thread-1075165-1.html,http://www.cnblogs.com/loulijun/p/3164746.html 1 ...

  9. iOS开发之——从零开始完成页面切换形变动画

    前言 某天我接到了UI发给我的两张图: 需求图.png 看到图的时候我一脸懵逼,显然我需要做一个页面切换的指示动画.老实说,从大三暑假开始做iOS开发也一年有余了,但是遇到复杂动画总是唯恐避之不及,只 ...

随机推荐

  1. cubieboard网络设置

    1.1 配置静态ip vi /etc/network/interface auto lo iface lo inet loopback #以下是添加的内如 auto eth0 #iface eth0 ...

  2. cubieboard安装小记

    1.1.使用ttl线 ttl线驱动程序:PL2303_Prolific_DriverInstaller_v1.7.0.exe(驱动精灵上下载) ttl终端:http://the.earth.li/~s ...

  3. ORACLE实用函数之一 ratio_to_report的简单使用

    应用场景: 查询学生成绩级别(ABCDE)个人数和所占百分比(案列简单,勿喷). 表结构: create or replace table stu_grade( id varchar2(36), le ...

  4. jquery判断显示的元素并获取显示元素数据

    // 获取显示元素的数据 jQuery(this).find("a:visible").attr("href"); // 多级标签选择器 jQuery(&quo ...

  5. javabean为什么要实现序列化?

    javabean为什么要实现序列化? 所谓的Serializable,就是java提供的通用数据保存和读取的接口.至于从什么地方读出来和保存到哪里去都被隐藏在函数参数的背后了.这样子,任何类型只要实现 ...

  6. Linux下Git安装及配置

    转载自:https://blog.csdn.net/u013256816/article/details/54743470:加了一些自己的注释. yum安装 这里采用的是CentOS系统,如果采用yu ...

  7. Python 字典(Dictionary) keys()方法

    Python 字典(Dictionary) keys() 函数以列表返回一个字典所有的键. 语法 keys()方法语法: dict.keys() 参数 NA. 返回值 返回一个字典所有的键. 实例 以 ...

  8. 20155339 2016-2017-2 《Java程序设计》第9周学习总结

    20155339 2016-2017-2 <Java程序设计>第9周学习总结 教材学习内容总结 JDBC入门 JDBC简介 JDBC全名Java DataBase Connectivity ...

  9. CGA填充算法之种子填充算法

    CGA填充算法之种子填充算法 平面区域填充算法是计算机图形学领域的一个很重要的算法,区域填充即给出一个区域的边界 (也可以是没有边界,只是给出指定颜色),要求将边界范围内的所有象素单元都修改成指定的颜 ...

  10. 《Python3网络爬虫开发实战》PDF+源代码+《精通Python爬虫框架Scrapy》中英文PDF源代码

    下载:https://pan.baidu.com/s/1oejHek3Vmu0ZYvp4w9ZLsw <Python 3网络爬虫开发实战>中文PDF+源代码 下载:https://pan. ...