iOS App内语言切换(国际化)
想要实现App内的语言切换功能,那么首先要创建国际化语言文件,用于存储对应语言显示的文本。
1、创建国际化语言文件
command+N,选择Other里面的Empty文件。
我们将其命名为Localizable.strings
选中刚才创建的文件,在其右侧的的属性栏中点击Localize按钮。
2、设置项目需要支持的语言
选中project--->info--->Localization。
我们会发现里面默认有一个英语,我们可以点击左下角的➕号添加支持的语言。
点击+号,选择简体中文。
默认全选,点击完成即可:
这时我们展开Localizable.strings、Main.storyboard和LaunchScreen.storyboard,会看到多了一些文件。
3、文本国际化
大家看这个可能会有疑问,不知道是什么意思。
"首页" = "首页";
"首页" = "Homepage";
其实这两个是一个文本的不同语言的展示。“=”号左面的相当于key值;“=”号右面的相当于value值。不过为了使用方便,更容易理解,我这里直接使用了中文的内容作为key值。
使用方法的话:NSLocalizedString(@"首页", nil);
这样,在中文语言的时候返回“首页”(中文),在英文语言中返回“ Homepage”(英文)。
如果你是用xib或者Storyboard展示文本的话,想要文本国际化展示的话,需要另外的方法。
首先选中xib或者Storyboard,选中需要支持的语言。
我们可以看到对应的文件里面有对应的显示文本。如果要想xib随着设置的不同语言展示不同的文本的话,可以在这两个文件中修改。
4、本地存储语言设置
使用NSUserDefaults存储本地语言设置。
直接上代码:这是一位大神分享的代码,我复制了一份,效果很不错,看原文请点这里原文.
存储、获取、重置本地语言设置
#import <Foundation/Foundation.h>@interface UWConfig : NSObject/**用户自定义使用的语言,当传nil时,等同于resetSystemLanguage*/
@property (class, nonatomic, strong, nullable) NSString *userLanguage;/**重置系统语言*/
+ (void)resetSystemLanguage;@end
#import "UWConfig.h"static NSString *const UWUserLanguageKey = @"UWUserLanguageKey";
#define STANDARD_USER_DEFAULT [NSUserDefaults standardUserDefaults]@implementation UWConfig+ (void)setUserLanguage:(NSString *)userLanguage
{//跟随手机系统if (!userLanguage.length) {[self resetSystemLanguage];return;}//用户自定义[STANDARD_USER_DEFAULT setValue:userLanguage forKey:UWUserLanguageKey];[STANDARD_USER_DEFAULT setValue:@[userLanguage] forKey:@"AppleLanguages"];[STANDARD_USER_DEFAULT synchronize];
}+ (NSString *)userLanguage
{return [STANDARD_USER_DEFAULT valueForKey:UWUserLanguageKey];
}/**重置系统语言*/
+ (void)resetSystemLanguage
{[STANDARD_USER_DEFAULT removeObjectForKey:UWUserLanguageKey];[STANDARD_USER_DEFAULT setValue:nil forKey:@"AppleLanguages"];[STANDARD_USER_DEFAULT synchronize];
}@end
切换bundle
#import <Foundation/Foundation.h>@interface NSBundle (UWUtils)+ (BOOL)isChineseLanguage;+ (NSString *)currentLanguage;@end
#import "NSBundle+UWUtils.h"
#import "UWConfig.h"
#import <objc/runtime.h>@interface UWBundle : NSBundle@end@implementation NSBundle (UWUtils)+ (BOOL)isChineseLanguage
{NSString *currentLanguage = [self currentLanguage];if ([currentLanguage hasPrefix:@"zh-Hans"]) {return YES;} else {return NO;}
}/** 设置默认语言类型*/
+ (NSString *)currentLanguage
{
// return [UWConfig userLanguage] ? : [NSLocale preferredLanguages].firstObject;return [UWConfig userLanguage] ? : @"zh-Hans";
}+ (void)load
{static dispatch_once_t onceToken;dispatch_once(&onceToken, ^{//动态继承、交换,方法类似KVO,通过修改[NSBundle mainBundle]对象的isa指针,使其指向它的子类UWBundle,这样便可以调用子类的方法;其实这里也可以使用method_swizzling来交换mainBundle的实现,来动态判断,可以同样实现。object_setClass([NSBundle mainBundle], [UWBundle class]);});
}@end@implementation UWBundle- (NSString *)localizedStringForKey:(NSString *)key value:(NSString *)value table:(NSString *)tableName
{if ([UWBundle uw_mainBundle]) {return [[UWBundle uw_mainBundle] localizedStringForKey:key value:value table:tableName];} else {return [super localizedStringForKey:key value:value table:tableName];}
}+ (NSBundle *)uw_mainBundle
{if ([NSBundle currentLanguage].length) {NSString *path = [[NSBundle mainBundle] pathForResource:[NSBundle currentLanguage] ofType:@"lproj"];if (path.length) {return [NSBundle bundleWithPath:path];}}return nil;
}@end
5、使用方式
当切换app语言的时候,先存储本地语言的设置;然后刷新界面即可。
- (IBAction)simplifiedChinese:(UIButton *)sender {[UWConfig setUserLanguage:@"zh-Hans"];// 刷新界面[self reloadTabBarViewController];
}- (IBAction)english:(UIButton *)sender {[UWConfig setUserLanguage:@"en"];// 刷新界面[self reloadTabBarViewController];
}
刷新界面
我这儿是直接刷新了tabBar控制器。
- (void)reloadTabBarViewController {UIStoryboard *storyBoard = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]];UITabBarController *tbc = [storyBoard instantiateInitialViewController];// 跳转到个人中心页面(即设置语言的那个tabBarItem)tbc.selectedIndex = self.tabBarController.selectedIndex;// 创建设置页面UIViewController *settingVC = [storyBoard instantiateViewControllerWithIdentifier:@"setting"];settingVC.hidesBottomBarWhenPushed = YES;// 创建语言选择界面FiFLanguageController *languageVC = [storyBoard instantiateViewControllerWithIdentifier:@"chooseLanguage"];languageVC.hidesBottomBarWhenPushed = YES;UINavigationController *nvc = tbc.selectedViewController;// 备用NSMutableArray *vcs = nvc.viewControllers.mutableCopy;[vcs addObjectsFromArray:@[settingVC, languageVC]];//解决奇怪的动画bug。异步执行dispatch_async(dispatch_get_main_queue(), ^{//注意刷新rootViewController的时机,在主线程异步执行//先刷新rootViewController[UIApplication sharedApplication].keyWindow.rootViewController = tbc;//然后再给个人中心的nvc设置viewControllersnvc.viewControllers = vcs;});
}
UIStoryboard *storyBoard = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]];UINavigationController *nvc = [storyBoard instantiateInitialViewController];//设置NavigationBar隐藏[nvc setNavigationBarHidden:YES];// 创建语言选择界面LanguageViewController *languageVC = [storyBoard instantiateViewControllerWithIdentifier:@"language"];languageVC.hidesBottomBarWhenPushed = YES;// 备用NSMutableArray *vcs = nvc.viewControllers.mutableCopy;[vcs addObjectsFromArray:@[ languageVC]];//解决奇怪的动画bug。异步执行dispatch_async(dispatch_get_main_queue(), ^{//注意刷新rootViewController的时机,在主线程异步执行//先刷新rootViewController[UIApplication sharedApplication].keyWindow.rootViewController = nvc;//然后再给个人中心的nvc设置viewControllersnvc.viewControllers = vcs;});
iOS App内语言切换(国际化)相关推荐
- iOS 程序内语言切换 -- 中英文切换
随着时代的发展,应用程序相继出现了不同语言的版本方案,中文,英文,法文,韩文等等:想在应用程序中实现语言的自由切换,需要配置多个语言的文件,根据用户的动态选择获取不同语言文件下的语言文件,从而显示到界 ...
- iOS国际化APP内语言切换
开发java的时候要求实现语言国际化,在java中用了i18来进行处理,移动端也可以进行处理: 方法可以有以下两种: 方案一:在原国际化版本的基础上做修改,在info.plist文件中新增key=&q ...
- app系统语言切换及app内部切换语言
今天闲来无事看了点关于android系统语言及app内语言的切换,有点小感想就做了个demo,拿出来分享下 1.根据系统语言app适配 这个相对来说比较简单我们只需要建一个相应的values文件夹就好 ...
- Android实现应用内语言切换,android 应用内切换 多国语言
微信中可以动态设置,apk的语言版本,最近尝试实现了这个功能. 我们知道,android本身就支持多国语言版本的. 不过这个语言的切换 依赖于系统的的语言设置,见图 也依赖apk本身values多国语 ...
- android自动切换暗色,超实用!Android 深色模式适配(可定时开启的APP内主题切换管理工具)...
前言 前面分享了一篇"黑白化主题"的文,主要适用场景是不久就要到来的"清明"等时节或者是其他的国家公祭日什么的(一名成熟的程序员,要学会自己提产品需求). 今天 ...
- IOS APP软件多国语言切换,国际化app
转自:http://www.lanrenios.com/tutorials/advanced/2013/0406/1033.html App Store 中很多流行的应用程序有多种语言版本.虽然这些应 ...
- Android app内语言环境切换
逻辑很简单: 1 app内所有activity继承自BaseActivity或BaseActivity派生出来的子类,BaseActivity中维护了一个静态的 app Activity访问栈,在创 ...
- IOS APP内后台音乐播放
写在开头 最近做了IOS音频.音乐后台播放相关的需求,这里主要总结一下支持后台播放以及远程控制的一些用法,在这个过程中也遇到了一些问题,会在另一个博客里面进行总结. 一.后台权限申请 1.在Info. ...
- Android 实现应用内语言切换(包括不重启应用方式)
一.前言 对于一个移动应用,可能不仅仅是面向一个国家的用户,所以多语言国际化是移动应用开发中比较常见的一个功能:正常实现多语言国际化,我们只需要在资源目录下res/下创建需要支持的国家values目录 ...
最新文章
- 伍六七带你学算法——栈的使用
- 技术人生:与其鸟宿檐下,不如击翅风雨
- CentOS yum源
- Android Wi-Fi子系统学习笔记
- __getattribute__()、__getattr__()、__setattr__()、__delattr__()
- Java23-day14【函数式接口(Supplier\Consumer\Predicate\Function)、Stream流(生产方式\中间方法\终结方法)】
- 谁控制了我们的浏览器?
- 谈CRM产品设计的指导思想
- java 模块化基础
- php是什么电器元件,电阻器是电子、电器设备中常使用的一种基本电子元件
- html怎么增加td的宽度,html td怎么设置宽度
- python从入门到放弃-掌握这个学习方法,让 Python 不再从入门到放弃
- B2C电商产品系统分析
- WiFi共享大师 去广告
- Data Matrix of Zint
- matlab 输出 syms,matlab中latex和syms的完美结合
- 计算机应用基础的课程目的,《计算机应用基础》课程教学大纲
- 单号查询方法,怎么查快递物流到哪里了
- ChatGPT使用案例之自然语言处理
- 三星android se干啥得,结果竟然这样!看iPhone SE与最强Android旗舰三星S7对比!