想要实现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内语言切换(国际化)相关推荐

  1. iOS 程序内语言切换 -- 中英文切换

    随着时代的发展,应用程序相继出现了不同语言的版本方案,中文,英文,法文,韩文等等:想在应用程序中实现语言的自由切换,需要配置多个语言的文件,根据用户的动态选择获取不同语言文件下的语言文件,从而显示到界 ...

  2. iOS国际化APP内语言切换

    开发java的时候要求实现语言国际化,在java中用了i18来进行处理,移动端也可以进行处理: 方法可以有以下两种: 方案一:在原国际化版本的基础上做修改,在info.plist文件中新增key=&q ...

  3. app系统语言切换及app内部切换语言

    今天闲来无事看了点关于android系统语言及app内语言的切换,有点小感想就做了个demo,拿出来分享下 1.根据系统语言app适配 这个相对来说比较简单我们只需要建一个相应的values文件夹就好 ...

  4. Android实现应用内语言切换,android 应用内切换 多国语言

    微信中可以动态设置,apk的语言版本,最近尝试实现了这个功能. 我们知道,android本身就支持多国语言版本的. 不过这个语言的切换 依赖于系统的的语言设置,见图 也依赖apk本身values多国语 ...

  5. android自动切换暗色,超实用!Android 深色模式适配(可定时开启的APP内主题切换管理工具)...

    前言 前面分享了一篇"黑白化主题"的文,主要适用场景是不久就要到来的"清明"等时节或者是其他的国家公祭日什么的(一名成熟的程序员,要学会自己提产品需求). 今天 ...

  6. IOS APP软件多国语言切换,国际化app

    转自:http://www.lanrenios.com/tutorials/advanced/2013/0406/1033.html App Store 中很多流行的应用程序有多种语言版本.虽然这些应 ...

  7. Android app内语言环境切换

    逻辑很简单: 1  app内所有activity继承自BaseActivity或BaseActivity派生出来的子类,BaseActivity中维护了一个静态的 app Activity访问栈,在创 ...

  8. IOS APP内后台音乐播放

    写在开头 最近做了IOS音频.音乐后台播放相关的需求,这里主要总结一下支持后台播放以及远程控制的一些用法,在这个过程中也遇到了一些问题,会在另一个博客里面进行总结. 一.后台权限申请 1.在Info. ...

  9. Android 实现应用内语言切换(包括不重启应用方式)

    一.前言 对于一个移动应用,可能不仅仅是面向一个国家的用户,所以多语言国际化是移动应用开发中比较常见的一个功能:正常实现多语言国际化,我们只需要在资源目录下res/下创建需要支持的国家values目录 ...

最新文章

  1. 伍六七带你学算法——栈的使用
  2. 技术人生:与其鸟宿檐下,不如击翅风雨
  3. CentOS yum源
  4. Android Wi-Fi子系统学习笔记
  5. __getattribute__()、__getattr__()、__setattr__()、__delattr__()
  6. Java23-day14【函数式接口(Supplier\Consumer\Predicate\Function)、Stream流(生产方式\中间方法\终结方法)】
  7. 谁控制了我们的浏览器?
  8. 谈CRM产品设计的指导思想
  9. java 模块化基础
  10. php是什么电器元件,电阻器是电子、电器设备中常使用的一种基本电子元件
  11. html怎么增加td的宽度,html td怎么设置宽度
  12. python从入门到放弃-掌握这个学习方法,让 Python 不再从入门到放弃
  13. B2C电商产品系统分析
  14. WiFi共享大师 去广告
  15. Data Matrix of Zint
  16. matlab 输出 syms,matlab中latex和syms的完美结合
  17. 计算机应用基础的课程目的,《计算机应用基础》课程教学大纲
  18. 单号查询方法,怎么查快递物流到哪里了
  19. ChatGPT使用案例之自然语言处理
  20. 三星android se干啥得,结果竟然这样!看iPhone SE与最强Android旗舰三星S7对比!

热门文章

  1. 关于文件夹拒绝访问的问题
  2. 不确定性下的判断:启发法和偏见
  3. 【多目标跟踪】Deep SORT: Simple Online and Realtime Tracking with a Deep Association Metric阅读笔记
  4. 强化学习基础知识梳理(4)
  5. 【ML】基于机器学习的房价预测研究(系列7:双向LSTM模型)
  6. MSChart使用之动态生成多个多行ChartArea
  7. 射频芯片基础知识科普
  8. python二维码,条形码识别
  9. 2020-08-05:请解释下为什么鹿晗发布恋情的时候, 微博系统会崩溃,如何解决?
  10. 【C语言经典例题】打印菱形