iOS 国际化语言第一语言不支持时候默认语言强转英文

news/2024/10/18 22:22:06/

对bundle扩展
直接贴代码
.h文件

//
//  NSBundle+KdLocalBundle.h
//  QooCam
//
//  Created by bob bob on 2023/9/8.//#import <Foundation/Foundation.h>NS_ASSUME_NONNULL_BEGIN@interface NSBundle (KdLocalBundle)@end
@interface KdLocalBundle:NSBundle@end
@interface CLLanguageManager : NSObject
+ (void)setUserLanguage:(NSString *)userLanguage;
+ (NSString *)userLanguage;
+ (void)resetSystemLanguage;
+(void)setEnglishFirst;
+ (void)setLanguage:(NSString *)language;
@end
NS_ASSUME_NONNULL_END

.m文件

//
//  NSBundle+KdLocalBundle.m
//  QooCam
//
//  Created by bob bob on 2023/9/8.//#import "NSBundle+KdLocalBundle.h"
#import <objc/runtime.h>static const char _bundle = 0;@interface BundleEx : NSBundle@end@implementation BundleEx- (NSString *)localizedStringForKey:(NSString *)key value:(NSString *)value table:(NSString *)tableName {NSBundle *bundle = objc_getAssociatedObject(self, &_bundle);return bundle ? [bundle localizedStringForKey:key value:value table:tableName] : [super localizedStringForKey:key value:value table:tableName];
}@end@implementation NSBundle (KdLocalBundle)
+(void)load{static dispatch_once_t onceToken;dispatch_once(&onceToken, ^{object_setClass([NSBundle mainBundle], [KdLocalBundle class]);});
}@end@implementation KdLocalBundle
//- (NSString *)localizedStringForKey:(NSString *)key value:(NSString *)value table:(NSString *)tableName {
// if ([KdLocalBundle cl_mainBundle]) {
//  return [[KdLocalBundle cl_mainBundle] localizedStringForKey:key value:value table:tableName];
// } else {
//  return [super localizedStringForKey:key value:value table:tableName];
// }
//}
- (NSString *)localizedStringForKey:(NSString *)key value:(NSString *)value table:(NSString *)tableName {NSBundle *bundle = objc_getAssociatedObject(self, &_bundle);NSString *retSt = bundle ? [bundle localizedStringForKey:key value:value table:tableName] : [super localizedStringForKey:key value:value table:tableName];if([retSt componentsSeparatedByString:@"_"].count >=3){KdLog(@"包含没有处理的多语言key: %@",retSt);
//        NSAssert(false, @"contain not handle key %@",retSt);//如果没有这个就强制显示英文,默认英文是有的retSt = [self englishBundelStrFromKey:key value:value table:tableName];}return  retSt;}-(NSString *)englishBundelStrFromKey:(NSString*)key value:(NSString *)value table:(NSString *)tableName{NSString *path = [[NSBundle mainBundle] pathForResource:@"en" ofType:@"lproj"];NSBundle *englishBundel = [NSBundle bundleWithPath:path];NSString *valueStr = englishBundel ? [englishBundel localizedStringForKey:key value:value table:tableName] : [super localizedStringForKey:key value:value table:tableName];if([valueStr componentsSeparatedByString:@"_"].count >=3){
//        NSAssert(false, @"英语也不包含的key必须要处理了 %@",valueStr);valueStr = @"";}return valueStr;
}+ (NSBundle *)cl_mainBundle {if ([KdLocalBundle currentLanguage].length) {NSString *path = [[NSBundle mainBundle] pathForResource:[KdLocalBundle currentLanguage] ofType:@"lproj"];if (path.length) {return [NSBundle bundleWithPath:path];}}return nil;
}+ (NSString *)currentLanguage {return [NSLocale preferredLanguages].firstObject;
// return [CLLanguageManager userLanguage] ? : [NSLocale preferredLanguages].firstObject;
}@end@implementation CLLanguageManager
#define CLUserLanguageKey @"kd_CLUserLanguageKey"
+ (void)setLanguage:(NSString *)language {static dispatch_once_t onceToken;dispatch_once(&onceToken, ^{object_setClass([NSBundle mainBundle], [BundleEx class]);});/**objc_setAssociatedObject来把一个对象与另外一个对象进行关联。该函数需要四个参数:源对象,关键字,关联的对象和一个关联策略。*关键字是一个void类型的指针。每一个关联的关键字必须是唯一的。通常都是会采用静态变量来作为关键字。*/objc_setAssociatedObject([NSBundle mainBundle], &_bundle, language ? [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:language ofType:@"lproj"]] : nil, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
+ (void)setUserLanguage:(NSString *)userLanguage {//跟随手机系统if (!userLanguage.length) {[self resetSystemLanguage];return;}//用户自定义[[NSUserDefaults standardUserDefaults] setValue:userLanguage forKey:CLUserLanguageKey];[[NSUserDefaults standardUserDefaults] setValue:@[userLanguage] forKey:@"AppleLanguages"];[[NSUserDefaults standardUserDefaults] synchronize];
}+ (NSString *)userLanguage {return [[NSUserDefaults standardUserDefaults] valueForKey:CLUserLanguageKey];
}/**重置系统语言*/
+ (void)resetSystemLanguage {[[NSUserDefaults standardUserDefaults] removeObjectForKey:CLUserLanguageKey];[[NSUserDefaults standardUserDefaults] setValue:nil forKey:@"AppleLanguages"];[[NSUserDefaults standardUserDefaults] synchronize];
}
//如果当前设置的语言不支持的话强制转英文,不然操作系统会默认第二选择语言
+(void)setEnglishFirst{NSMutableArray *userDefaultLanguages = [[NSUserDefaults standardUserDefaults]objectForKey:@"AppleLanguages"];NSString *firstLanguage = userDefaultLanguages.firstObject;NSLog(@"国际化语言%@",firstLanguage);//目前中日英,默认英文if(!([firstLanguage.lowercaseString hasPrefix:@"en-"] ||[firstLanguage.lowercaseString hasPrefix:@"zh-hans"] ||[firstLanguage.lowercaseString hasPrefix:@"ja-"] || [firstLanguage.lowercaseString hasPrefix:@"zh-hant"]||[firstLanguage.lowercaseString hasPrefix:@"fr-"]||[firstLanguage.lowercaseString hasPrefix:@"de-"]||[firstLanguage.lowercaseString hasPrefix:@"it-"]||[firstLanguage.lowercaseString hasPrefix:@"ko-"]||[firstLanguage.lowercaseString hasPrefix:@"ru-"]||[firstLanguage.lowercaseString hasPrefix:@"es-"]||[firstLanguage.lowercaseString hasPrefix:@"tr-"])){[CLLanguageManager setLanguage:@"en"];}
}@end

http://www.ppmy.cn/news/1474238.html

相关文章

uniapp,app端使用echarts不兼容,可以使用iframe来使用echarts

可以新建文件夹 echarts&#xff0c;里面放echart.min.js文件,echarts.html文件生成echarts图&#xff0c;之所以用iframe不用webview&#xff0c;是因为webview容易出问题&#xff0c;最明显问题是层级问题。 <!DOCTYPE html> <html lang"en"> <hea…

STM32G474使用HRTIM触发多路ADC采样,通过DMA传输,通过串口打印显示,实现PWM中间时刻采样,避免开关噪声

本工程使用CUBEIDE进行配置以及编译调试&#xff0c;使用的硬件为STM32G474官方开发板NUCLEO-G474RE CUBEIDE配置 HRTIM配置 本章工程使用HRTIM定时器进行ADC的触发&#xff0c;打开主定时器&#xff0c;子定时器A,B,C。&#xff08;本工程未使用到A与C定时器&#xff0c;配置…

HarmonyOS鸿蒙DevEco Studio无法连接本地模拟器

使用DevEcoStudio 5.0.3.403版本 发现无法选择模拟器 解决方法&#xff1a; 1、打开模拟器 2、关闭DevEco Studio&#xff0c;&#xff08;不要关闭模拟器&#xff09; 3、重新打开DevEco Studio。

SQL 字段类型-上

定义方式 use xxxx; 使用xxxx数据库后 create table table_name {username char(20)/*数据类型*/ null/*属性*/,password varchar(10) not null; 字段名... } 整型数据 和高级语言一样可以用 int unsigned 修饰无符号放在后面 数据类型关键字描述迷你整型tinyint使用1…

Spring Boot 事件监听机制实战【自定义 Spring Boot 事件监听】

前言&#xff1a; 上一篇我们分析了 Spring Boot 事件监听的原理&#xff0c;本篇我们来自定义实现自己的监听器。 Spring Boot 系列文章传送门 Spring Boot 启动流程源码分析&#xff08;2&#xff09; Spring Boot 启动流程源码分析&#xff08;2&#xff09; Spring Bo…

《妃梦千年》第二十八章:反间之计

第二十八章&#xff1a;反间之计 在经历了一系列的斗争和变故后&#xff0c;林清婉意识到&#xff0c;宫中的敌人和外部的敌人正在联手&#xff0c;他们不仅试图从外部攻破大周的防线&#xff0c;还在内部制造混乱。为了彻底解决这个问题&#xff0c;她决定采取反间之计&#…

华为HCIP Datacom H12-821 卷32

1、默认情况下&#xff0c;IS-IS Leve1-1-2路由器会将Leve1-2区域的明细路由信息发布到Level-1区域、保证level-1区域的路由器能够正常访问骨干区域的设备 A、对 B、错 正确答案&#xff1a; B 解析&#xff1a;不会发布&#xff0c;需要用到路由泄露。 2、BGP在建立邻居…

看影视学英语(假如第一季第一集)

in the hour也代表一小时吗&#xff1f;等同于in an hour&#xff1f;