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
相关推荐
goodSleep3 小时前
更新Mac OS Tahoe26用命令恢复 Mac 启动台时不小心禁用了聚焦搜索
macos
叽哥10 小时前
Flutter Riverpod上手指南
android·flutter·ios
用户091 天前
SwiftUI Charts 函数绘图完全指南
ios·swiftui·swift
YungFan1 天前
iOS26适配指南之UIColor
ios·swift
权咚2 天前
阿权的开发经验小集
git·ios·xcode
用户092 天前
TipKit与CloudKit同步完全指南
ios·swift
小溪彼岸2 天前
macOS自带截图命令ScreenCapture
macos
法的空间2 天前
Flutter JsonToDart 支持 JsonSchema
android·flutter·ios
2501_915918412 天前
iOS 上架全流程指南 iOS 应用发布步骤、App Store 上架流程、uni-app 打包上传 ipa 与审核实战经验分享
android·ios·小程序·uni-app·cocoa·iphone·webview
TESmart碲视2 天前
Mac 真正多显示器支持:TESmart USB-C KVM(搭载 DisplayLink 技术)如何实现
macos·计算机外设·电脑