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
相关推荐
Swift社区1 分钟前
iOS 基于 Foundation Model 构建媒体流
ios·iphone·swift·媒体
上去我就QWER2 小时前
macOS下如何全文检索epub格式文件?
macos
库奇噜啦呼2 小时前
【iOS】音频与视频播放
ios·音视频·cocoa
谢娘蓝桥3 小时前
Mac 安装 Xcode 及qt 环境安装
ide·macos·xcode
witton6 小时前
克隆整个macOS系统到新磁盘
macos·asr·克隆·复制·迁移·恢复·restore
csdn_aspnet7 小时前
如何在 Mac、Ubuntu、CentOS、Windows 上安装 MySQL 客户端
linux·windows·mysql·macos·centos
我的golang之路果然有问题7 小时前
mac M系列芯片 unity 安装会遇到的错误以及解决
经验分享·学习·macos·unity·游戏引擎
大熊猫侯佩10 小时前
黑衣人档案:用 Apple Foundation Models + SwiftUI 打造 AI 聊天机器人全攻略
ios·swiftui·ai编程
大熊猫侯佩10 小时前
侠客行・iOS 26 Liquid Glass TabBar 破阵记
ios·swiftui·swift
心灵宝贝10 小时前
如何安装 PDF Reader Pro for Mac v3.2.1.0?超简单DMG安装步骤(附安装包)
macos