对bundle扩展
直接贴代码
.h文件
swift
//
// 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文件
swift
//
// 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