您的位置:首页 > 汽车 > 新车 > iOS 国际化语言第一语言不支持时候默认语言强转英文

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

2024/10/23 23:18:40 来源:https://blog.csdn.net/bobbob32/article/details/140302515  浏览:    关键词:iOS 国际化语言第一语言不支持时候默认语言强转英文

对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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com