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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/42624.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CurrentHashMap巧妙利用位运算获取数组指定下标元素

先来了解一下数组对象在堆中的存储形式【数组长度&#xff0c;数组元素类型信息等】 【存放元素对象的空间】 Ma 基础信息实例数据内存填充Mark Word,ClassPointer,数组长度第一个元素第二个元素固定的填充内容 所以我们想要获取某个下标的元素首先要获取这个元素的起始位置…

软件工程常见知识点

下午收到字节日常实习的面试邀请&#xff0c;希望这次能有一个好的表现。言归正传&#xff0c;邮件中提到这些问题&#xff0c;我这边借了书并查了网上的资料&#xff0c;做一个提前准备。 软件工程核心概念&#xff1a; 如何从一个需求落实到一个系统设计&#xff1f; 经过我…

c++ primer plus 第15章友,异常和其他:异常,15.3.7 其他异常特性

c primer plus 第15章友&#xff0c;异常和其他&#xff1a;异常,15.3.7 其他异常特性 c primer plus 第15章友&#xff0c;异常和其他&#xff1a;异常,15.3.7 其他异常特性 文章目录 c primer plus 第15章友&#xff0c;异常和其他&#xff1a;异常,15.3.7 其他异常特性 15.…

Sorted Set 类型命令(命令语法、操作演示、命令返回值、时间复杂度、注意事项)

Sorted Set 类型 文章目录 Sorted Set 类型zadd 命令zrange 命令zcard 命令zcount 命令zrevrange 命令zrangebyscore 命令zpopmax 命令bzpopmax 命令zpopmin 命令bzpopmin 命令zrank 命令zscore 命令zrem 命令zremrangebyrank 命令zremrangebyscore 命令zincrby 命令zinterstor…

线程池案例

秒杀 需求 10个礼物20个客户抢随机10个客户获取礼物&#xff0c;另外10无法获取礼物 任务类 记得给共享资源加锁 public class MyTask implements Runnable{// 礼物列表private ArrayList<String> gifts ;// 用户名private String username;public MyTask( String user…

android Dialog全屏沉浸式状态栏实现

在Android中&#xff0c;创建沉浸式状态栏通常意味着让状态栏背景与应用的主题颜色一致&#xff0c;并且让对话框在状态栏下面显示&#xff0c;而不是浮动。为了实现这一点&#xff0c;你可以使用以下代码片段&#xff1a; 1、实际效果图&#xff1a; 2、代码实现&#xff1a;…

揭秘GPT-4o:未来智能的曙光

引言 近年来&#xff0c;人工智能&#xff08;AI&#xff09;的发展突飞猛进&#xff0c;尤其是自然语言处理&#xff08;NLP&#xff09;领域的进步&#xff0c;更是引人注目。在这一背景下&#xff0c;OpenAI发布的GPT系列模型成为了焦点。本文将详细探讨最新的模型GPT-4o&a…

Unity海面效果——6、反射和高光

Unity引擎制作海面效果 大家好&#xff0c;我是阿赵。 上一篇的结束时&#xff0c;海面效果已经做成这样了&#xff1a; 这个Shader的复杂程度已经比较高了&#xff1a; 不过还有一些美中不足的地方。 1、 海平面没有反射到天空球 2、 在近岸边看得到水底的部分&#xff0c;水…

JVM调优:深入理解与实战指南

引言 Java虚拟机&#xff08;JVM&#xff09;作为Java应用程序的运行环境&#xff0c;其性能直接影响到应用程序的响应速度、吞吐量和稳定性。JVM调优是Java开发者必须掌握的一项关键技能&#xff0c;它能够帮助我们更好地利用系统资源&#xff0c;提升应用程序的性能。本文将…

一些关于C++的基础知识

引言&#xff1a;C兼容C的大部分内容&#xff0c;但其中仍有许多小细节的东西需要大家注意 一.C的第一个程序 #include <iostream> using namespace std;int main() {cout << "hello world!" << endl;return 0; } 第一次看这个是否感觉一头雾水…

数据挖掘——matplotlib

matplotlib概述 Mat指的是Matlab&#xff0c;plot指的是画图&#xff0c;lib即library&#xff0c;顾名思义&#xff0c;matplotlib是python专门用于开发2D图表的第三方库&#xff0c;使用之前需要下载该库&#xff0c;使用pip命令即可下载。 pip install matplotlib1、matpl…

elasticsearch SQL:在Elasticsearch中启用和使用SQL功能

❃博主首页 &#xff1a; 「码到三十五」 &#xff0c;同名公众号 :「码到三十五」&#xff0c;wx号 : 「liwu0213」 ☠博主专栏 &#xff1a; <mysql高手> <elasticsearch高手> <源码解读> <java核心> <面试攻关> ♝博主的话 &#xff1a…

服务注册Eureka

目录 一、背景 1、概念 2、CAP 理论 3、常见的注册中心 二、Eureka 三、搭建 Eureka Server 1、搭建注册中心 四、服务注册 五、服务发现 六、Eureka 和 Zooper 的区别 一、背景 1、概念 远程调用就类似于一种通信 例如&#xff1a;当游客与景区之间进行通信&…

代码随想录算法训练营第六十三天 | prim算法、kruskal算法、复习

53. 寻宝 — prim算法 题目链接&#xff1a;https://kamacoder.com/problempage.php?pid1053 文档讲解&#xff1a;https://programmercarl.com/kamacoder/0053.%E5%AF%BB%E5%AE%9D-prim.html 思路 本题是最小生成树的模板题&#xff0c;最小生成树可以使用 prim算法&#xf…

bash shell 重定向输入和输出

shell 提供的重定向操作符 操作符作用>将命令的输出发到一个文件中如果文件存在&#xff0c;则新的文件数据会覆盖已经存在的文件>>将命令的输出追加到一有文件如果文件不存在&#xff0c;则创建新的文件<将文件内容重定向到命令<<内联输入重定向(inline in…

Xubuntu24.04之设置高性能模式两种方式(二百六十一)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒体系统工程师系列【原创干货持续更新中……】🚀 优质视频课程:AAOS车载系统+AOSP…

苍穹外卖--新增员工

代码开发 package com.sky.controller.admin;import com.sky.constant.JwtClaimsConstant; import com.sky.dto.EmployeeDTO; import com.sky.dto.EmployeeLoginDTO; import com.sky.entity.Employee; import com.sky.properties.JwtProperties; import com.sky.result.Result…

Springboot各个版本维护时间

Springboot各个版本维护时间

MQTT教程--服务器使用EMQX和客户端使用MQTTX

什么是MQTT MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;是一种轻量级、基于发布-订阅模式的消息传输协议&#xff0c;适用于资源受限的设备和低带宽、高延迟或不稳定的网络环境。它在物联网应用中广受欢迎&#xff0c;能够实现传感器、执行器和其它设备…

【Linux】shell基础知识点(updating)

1.输出重定向2.多命令批量执行&#xff08;; 、&&、 ||&#xff09;3.脚本不同方式执行的区别&#xff08;source、bash、sh、./&#xff09;4.理解环境变量5.export6.引号的使用last.命令相关 1.输出重定向 3种数据流&#xff1a; stdin&#xff1a;标准输入&#xf…