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.pswp.cn/web/42624.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/42624.shtml
英文地址,請注明出處:http://en.pswp.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…