当前位置: 首页 > news >正文

iOS app语言切换

一、准备工作

1、在Project中的info新增需要支持的语言

2、新增.string语言文件用于文本替换,在文件中写入,比如繁体中写入 "用户协议" = "用戶協議";

二、新建语言控制类代码

1、LanguageManager.h

#import <Foundation/Foundation.h>extern NSString * const LanguageDidChangeNotification;typedef enum : NSUInteger {RegionTypeMainlandChina,RegionTypeHongKong,RegionTypeMacau,
} RegionType;typedef enum : NSUInteger {LanguageTypeSimplifiedChinese,LanguageTypeTraditionalChinese,LanguageTypeEnglish,
} LanguageType;@interface LanguageManager : NSObject+ (instancetype)sharedManager;/// 设置app语言
/// - Parameter language: 语言代码 如 @"en", @"zh-Hans"
- (void)setLanguage:(NSString *)language;/// 获取系统语言转换后的字符串数组
/// - Parameter array: 字符串数组
- (NSMutableArray *)localizedArray:(NSArray *)array;/// 获取系统语言转换后的字符串
/// - Parameter key: 字符串key
- (NSString *)localizedStringForKey:(NSString *)key;/// 获取当前语言
- (NSString *)currentLanguage;/// 获取用户系统设置地区
@property (nonatomic, assign) RegionType regionType;/// 获取用户系统设置语言,只做获取不做设置
@property (nonatomic, assign) LanguageType languageType;@end

2、LanguageManager.m

#import "LanguageManager.h"#define kAppLanguage @"AppLanguage"NSString * const LanguageDidChangeNotification = @"LanguageDidChangeNotification";@interface LanguageManager ()
@property (nonatomic, strong) NSBundle *bundle;
@end@implementation LanguageManager+ (instancetype)sharedManager {static LanguageManager *instance;static dispatch_once_t onceToken;dispatch_once(&onceToken, ^{instance = [[LanguageManager alloc] init];});return instance;
}- (instancetype)init {if (self = [super init]) {NSString *language = [[NSUserDefaults standardUserDefaults] objectForKey:kAppLanguage];if (!language) language = [NSLocale preferredLanguages].firstObject;[self updateBundleWithLanguage:language];}return self;
}- (void)setLanguage:(NSString *)language {[[NSUserDefaults standardUserDefaults] setObject:language forKey:kAppLanguage];[[NSUserDefaults standardUserDefaults] synchronize];[self updateBundleWithLanguage:language];// 保存语言到用户偏好设置kUser.languageCode = language;// 发送语言改变通知[[NSNotificationCenter defaultCenter] postNotificationName:LanguageDidChangeNotification object:nil];
}- (NSMutableArray *)localizedArray:(NSArray *)array {NSMutableArray *localized = [NSMutableArray array];for (NSString *key in array) {NSString *text = [self localizedStringForKey:key];[localized addObject:text];}return localized;
}- (void)updateBundleWithLanguage:(NSString *)language {NSString *path = [[NSBundle mainBundle] pathForResource:language ofType:@"lproj"];if (path) {self.bundle = [NSBundle bundleWithPath:path];} else {self.bundle = [NSBundle mainBundle];}
}- (NSString *)localizedStringForKey:(NSString *)key {return [self.bundle localizedStringForKey:key value:nil table:@"Localizable"];
}- (NSString *)currentLanguage {return [[NSUserDefaults standardUserDefaults] objectForKey:kAppLanguage];
}- (RegionType)regionType {NSString *countryCode = [[NSLocale currentLocale] objectForKey:NSLocaleCountryCode];if ([countryCode isEqualToString:@"CN"]) {return RegionTypeMainlandChina;} else if ([countryCode isEqualToString:@"HK"]) {return RegionTypeHongKong;} else if ([countryCode isEqualToString:@"MO"]) {return RegionTypeMacau;} else {return RegionTypeMainlandChina;}
}- (LanguageType)languageType {NSString *languageCode = [self currentLanguage];if ([languageCode isEqualToString:@"zh-Hans"]) {return LanguageTypeSimplifiedChinese;} else if ([languageCode isEqualToString:@"zh-Hant"]) {return LanguageTypeTraditionalChinese;} else if ([languageCode isEqualToString:@"en"]) {return LanguageTypeEnglish;} else {return LanguageTypeSimplifiedChinese;}
}@end

3、ViewController中切换

可以重新加载VC,也可以自定义一个方法切换,下面仅展示重新加载

在VC中写通知接收,tabbar文本也需要更新,根据需求来

[[NSNotificationCenter defaultCenter] addObserver:selfselector:@selector(rebuildSelfForLanguageChange)name:LanguageDidChangeNotificationobject:nil];
- (void)rebuildSelfForLanguageChange {UINavigationController *nav = self.navigationController;Class cls = [self class];UIViewController *newVC = [[cls alloc] init];// 保留 TabBarItemnewVC.tabBarItem = self.tabBarItem;NSMutableArray *controllers = [nav.viewControllers mutableCopy];NSUInteger idx = [controllers indexOfObject:self];controllers[idx] = newVC;[nav setViewControllers:controllers animated:NO];
}

如果是在没有tabbar的子页面可以这样初始化,避免重新加载后后tabbar突然出现

- (void)rebuildSelfForLanguageChange {UINavigationController *nav = self.navigationController;Class cls = [self class];UIViewController *newVC = [[cls alloc] init];// 保留 hidesBottomBarWhenPushednewVC.hidesBottomBarWhenPushed = self.hidesBottomBarWhenPushed;NSMutableArray *controllers = [nav.viewControllers mutableCopy];NSUInteger idx = [controllers indexOfObject:self];controllers[idx] = newVC;[nav setViewControllers:controllers animated:NO];
}

4、调用示例

//可以在AppDelegate中设置初始化语言
- (void)initWindow {self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];self.window.backgroundColor = kWhiteColor;[self.window makeKeyAndVisible];kApplication.statusBarHidden = NO;if (kUser.languageCode.length == 0) {NSString *systemLanguage = [NSLocale preferredLanguages].firstObject; // e.g., "zh-Hant-CN"NSString *appLanguage = @"en"; // 默认英文if ([systemLanguage hasPrefix:@"zh"]) {if ([systemLanguage containsString:@"Hant"]) {appLanguage = @"zh-Hant"; // 繁体} else {appLanguage = @"zh-Hans"; // 简体}} else if ([systemLanguage hasPrefix:@"en"]) {appLanguage = @"en"; // 英文}// 设置语言[[LanguageManager sharedManager] setLanguage:appLanguage];}
}//设置好语言之后可以通过这种方式自动匹配繁体或者简体或者英文
_tipText.text = [[LanguageManager sharedManager] localizedStringForKey:@"验证码登录"];

http://www.dtcms.com/a/580983.html

相关文章:

  • Search-o1:增强大型推理模型的主动搜索能力
  • 个人笔记|IP分片不用TTL
  • 百汇游戏网站开发商南通网站推广公司
  • 【Linux】权限(2):文件权限的深入理解粘滞位
  • 做网站公司如何选百度广告联盟推广链接
  • BIM+GIS协同:RVT文件转3DTiles的技术路径与场景落地
  • 中颖AFE芯片:SH367303、SH367306 和 SH367309
  • 数据结构—排序算法篇三
  • 从“医疗大模型”向“医疗智能体”架构与路径分析(白皮书草案-上)
  • LeetCode算法日记 - Day 95: 回文子串
  • DockerCompose与多容器编排
  • AngularJS与SQL的集成使用指南
  • 【ZeroRange WebRTC】TWCC 在 WebRTC 中的角色与工作原理(深入指南)
  • 数据结构常见的八大排序算法
  • 个人怎么做网站app推广引流方法
  • 初识光伏逆变器
  • 一文了解LLM应用架构:从Prompt到Multi-Agent
  • MongoDB 内存管理避坑指南:解决高占用、页错误等核心问题,让数据库性能翻倍
  • 关于DNS中毒攻击的解决方案分享
  • 【C++】数据挖掘算法在软件测试中的应用
  • WebSocket 完全指南:从原理到实战,搭建实时通信桥梁
  • STM32项目分享:智能水产养殖系统
  • 网站开发线框个体营业执照网上年报
  • iPhone苹果手机拍的照片默认是heic如何换成jpg格式
  • 基于微信小程序的旅游攻略分享互动平台设计与实现-项目分享
  • Neo4j Windows桌面版安装及更改默认数据存储位置
  • 智能安防新篇章:EasyGBS助力重塑物业视频管理服务
  • ps2017做网站当阳网站建设电话
  • H5短视频SDK,赋能Web端视频创作革命
  • 如何选择温州本凡科技进行小程序开发服务?