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. 【文件下载】Java下载文件的几种方式

    [文件下载]Java下载文件的几种方式  摘自:https://www.cnblogs.com/sunny3096/p/8204291.html 1.以流的方式下载. public HttpServl ...

  2. pyspider示例代码六:传递参数

    传递参数 示例一 #!/usr/bin/env python # -*- encoding: utf- -*- # vim: ts= sts= ff=unix fenc=utf8: # Created ...

  3. 2018.07.03 POJ 2318 TOYS(二分+简单计算几何)

    TOYS Time Limit: 2000MS Memory Limit: 65536K Description Calculate the number of toys that land in e ...

  4. 2018.07.23 洛谷P4097 [HEOI2013]Segment(李超线段树)

    传送门 给出一个二维平面,给出若干根线段,求出x" role="presentation" style="position: relative;"&g ...

  5. Django入门与实践-第11章:URL 分发(完结)

    http://127.0.0.1:8000http://127.0.0.1:8000/boards/1/http://127.0.0.1:8000/boards/2/http://127.0.0.1: ...

  6. java多线程同步(转)

    原文地址:http://developer.51cto.com/art/201509/490965.htm 一.场景 因为当我们有多个线程要同时访问一个变量或对象时,如果这些线程中既有读又有写操作时, ...

  7. csdn的一次回答问题

    #coding:utf8 import tushare as ts import pandas as pd import numpy as np import pymysql,datetime imp ...

  8. spring的IOC/DI功能实践

    一.写在前面: 做这个Demo主要是为了能够更好的理解Spring的原理,看再多的文章,听再多的讲解最终都最好自己去实现一遍,可以将Spring的功能分块实现,最终自然比较容易将各个功能组合起来. 这 ...

  9. Kolakoski

    Kolakoski序列:我们知道的还是太少 上帝创造了整数,其余的则是我们人类的事了.正因为如此,质数.完全数.Fibonacci 数之类的数列才会让数学家们如痴如醉,因为它们的存在是如此自然,没有任 ...

  10. JVM性能调优监控工具jps、jstack、jmap、jhat、jstat, hprof使用详解

    JDK本身提供了很多方便的JVM性能调优监控工具,除了集成式的VisualVM和jConsole外,还有jps.jstack.jmap.jhat.jstat等小巧的工具,本博客希望能起抛砖引玉之用,让 ...