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

对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
相关推荐
dnekmihfbnmv2 小时前
好用的电容笔有哪些推荐一下?年度最值得推荐五款电容笔分享!
ios·电脑·ipad·平板
黑果魏叔2 小时前
macOS Sequoia 正式版(24A335)黑苹果/Mac/虚拟机系统镜像
macos
tekin3 小时前
macos macport软件包管理工具 sudo port install xxx 安装的软件的路径 与 brew install xxx 软件安装路径总结
macos·brew·port·macport·port install·port软件包安装路径·brew软件包安装路径
Hellc0075 小时前
MacOS升级ruby版本
前端·macos·ruby
GEEKVIP12 小时前
Android 恢复挑战和解决方案:如何从 Android 设备恢复删除的文件
android·笔记·安全·macos·智能手机·电脑·笔记本电脑
逢生博客17 小时前
Mac 搭建仓颉语言开发环境(Cangjie SDK)
macos·华为·鸿蒙
Rverdoser20 小时前
MacOS Catalina 从源码构建Qt6.2开发库之01: 编译Qt6.2源代码
macos
Magnetic_h20 小时前
【iOS】单例模式
笔记·学习·ui·ios·单例模式·objective-c
归辞...1 天前
「iOS」——单例模式
ios·单例模式·cocoa
GEEKVIP1 天前
如何在没有备份的情况下恢复 Mac 上丢失的数据
经验分享·笔记·安全·macos·电脑·笔记本电脑·改行学it