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 == 0) {
        NSArray *languages = [userDefault objectForKey:APPLE_LANGUAGES];
        NSString *current = [languages objectAtIndex:0];
        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: 进行本地字符串的切换,最麻烦的是刷新每个页面都需要设置消息观察者,这个就比较蛋疼。有没有好的方法,欢迎留言交流。

时间: 2024-08-07 17:49:54

iOS开发--应用国际化,应用内切换语言的相关文章

App内切换语言

转载请注明出处 http://www.cnblogs.com/cnwutianhao/p/6746981.html 前几天客户提需求,对App增加一个功能,这个功能目前市面上已经很常见,那就是应用内切换语言.啥意思,就是 英.中.法.德.日...语言随意切换. (本案例采用Data-Bingding模式,麻麻再也不用担心我findViewBy不到Id了哈哈,开个玩笑) 先上示例图: 代码实现: 布局文件(Data-Binding模式),很简单就是两行文字 <?xml version="1.

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

iOS开发:使用Tab Bar切换视图 上一篇文章提到了多视图程序中各个视图之间的切换,用的Tool Bar,说白了还是根据触发事件使用代码改变Root View Controller中的Content View.这次,我们还是讲一讲切换视图,不过这次使用的是Tab Bar. 这次要写的程序运行起来的效果是这样的:底部有几个图标,每个图标对应一个视图.每点击一个图标,对应的视图就会打开.如下图,就是我们做好的程序效果:    每个Tab Bar有一个对应颜色的视图. 为了搞清使用Tab Bar切

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

IOS开发中UIBarButtonItem上按钮切换或隐藏案例实现案例是本文要介绍的内容,这个代码例子的背景是:导航条右侧有个 edit button,左侧是 back button 和 add button. AD:[线下活动]三大新锐HTML 5企业汇聚51CTO—大话移动前端技术 IOS开发中UIBarButtonItem上按钮切换或隐藏案例实现案例是本文要介绍的内容,这个代码例子的背景是:导航条右侧有个 edit button,左侧是 back button 和 add button.代

iOS开发-进阶:语言国际化及代码切换语言

语言国际化和使用代码切换语言是很多APP都有的功能, 实现起来也很简单, 没有什么技术难题, 网上有很多相关的资料, 在实现了功能后, 打算把整个过程写在这里.(例子均为中英文, 替换其他语言原理相同, 只需记录保存该语言的key值即可) 需求: 1.应用名跟随系统切换 2.应用内容跟随系统切换 3.使用代码切换应用内容的语言(含后台返回数据切换语言) 实现: 1.应用名跟随系统切换 首先在Project下选择Info, 然后在Localizations中添加程序需要使用的语言,中文. 然后创建

IOS开发之国际化篇第二章:文本信息国际化

本文是以XCode7.2.1为开发平台 在第一章中,我们基本了解了国际化是怎么一会事,介绍到有3种国际化,接下来的几章就会分别介绍这3种国际化,第一个是文本信息国际化 文本信息国际化包含一下几点 系统按钮和信息国际化 应用名称国际化 程序代码中输出的静态文本国际化 -系统按钮和信息国际化 系统本身会自带一些系统的信息,系统按钮等,这一些系统自带的信息提示,按钮文本都是由Cocoa本身自带的,他们都是统一又系统管理,例如Done在英文环境中是Done,还有系统提示信息,如下图,在不同语言环境系统会

Android 应用内切换语言

extends :http://bbs.51cto.com/thread-1075165-1.html,http://www.cnblogs.com/loulijun/p/3164746.html 1. 多国语言: 在res目录下建立不同名称的values文件来调用不同的语言包Values文件汇总如下:中文(中国):values-zh-rCN中文(台湾):values-zh-rTW中文(香港):values-zh-rHK英语(美国):values-en-rUS英语(英国):values-en-r

iOS开发——代码生成TabBar与视图切换详解

我在之前多篇博客中讲解了在不使用storyboard而使用nib文件的情况下,使用代码生成导航栏并进行跳转,具体可以参考<iOS开发--界面跳转与返回及视图类型详解><iOS纯代码实现界面建立.跳转.导航栏(无storyboard.无nib)(Objective-C)>.今天我来讲解下在使用nib搭建界面的情况下,用代码生成TabBar,并进行界面之间的跳转.代码示例已经上传至:https://github.com/chenyufeng1991/TabBarTest   . (1)

iOS开发——代码生成TabBar与视图切换具体解释

我在之前多篇博客中解说了在不使用storyboard而使用nib文件的情况下.使用代码生成导航栏并进行跳转,具体能够參考<iOS开发--界面跳转与返回及视图类型具体解释><iOS纯代码实现界面建立.跳转.导航栏(无storyboard.无nib)(Objective-C)>. 今天我来解说下在使用nib搭建界面的情况下,用代码生成TabBar,并进行界面之间的跳转.代码演示样例已经上传至:https://github.com/chenyufeng1991/TabBarTest  

iOS 应用内切换语言。

参考:https://github.com/Alittlefly/AppLanguageChange 核心: - (NSString *)localizeStringWithResourceName:(NSString *)RecoursePath withKey:(NSString *)key table:(NSString *)table{ NSString *PathString = [[NSBundle mainBundle] pathForResource:[NSString stri