iOS app 無侵入控制語言顯示

2021-10-19 03:36:10 字數 2799 閱讀 8622

做為乙個愛打破沙鍋問到底的碼農來說,問題並沒有止步於此,如果有很多不同的小白銷售都遇到類似的問題,總不可能乙個乙個的去跟他解釋這些吧,能不能通過自己的方式來控制這些呢?做為乙個資深的搬磚人,回答是肯定的,於是很快我就寫出了第乙個版本。

//

// nsbundle+preferlanguage.h

// smarthome

//// created by sven on 2021/2/4.

//#import ns_assume_nonnull_begin

@inte***ce nsbundle (preferlanguage)

@end

ns_assume_nonnull_end

//// nsbundle+preferlanguage.m

// smarthome

//// created by sven on 2021/2/4.

//#import "nsbundle+preferlanguage.h"

#import static const char routebundle = 0;

@inte***ce shbundlenew : nsbundle

@end

@implementation shbundlenew

- (nsstring *)localizedstringforkey:(nsstring *)key value:(nsstring *)value table:(nsstring *)tablename

@end

@implementation nsbundle (preferlanguage)

+ (void)load

+ (void)setpreferlanguage:(nsstring *)language

nsstring *usebundle = [[nsbundle mainbundle] pathforresource:strlanguage oftype:@"lproj"];

if (!usebundle) );

nsbundle *curbundle = language ? [nsbundle bundlewithpath:[[nsbundle mainbundle] pathforresource:language oftype:@"lproj"]] : nil;

objc_setassociatedobject([nsbundle mainbundle], &routebundle, curbundle, objc_association_retain_nonatomic);

}}@end

通過oc強大的runtime特性,使用object_setclass把nsbundle的isa指向了我的當前類shbundlenew,通過objc_setassociatedobject 和 objc_getassociatedobject進行bundle值的傳遞,這樣只要選擇了不支援的語言,就模式顯示為英文,問題得到了解決。

然後,探索的腳步並沒有因此停止,這種寫法比較不好理解,需要對runtime有乙個較深的涉獵,所以,我很快又給出了更加通俗易懂的第二版本:

//

// nsbundle+language.h

// smarthome

//// created by sven on 2021/2/5.

//#import ns_assume_nonnull_begin

@inte***ce nsbundle (language)

@end

ns_assume_nonnull_end

//// nsbundle+language.m

// smarthome

//// created by sven on 2021/2/5.

//#import "nsbundle+language.h"

#import #define kperferredlanguage @"en" //設定首選語言

@implementation nsbundle (language)

+ (void)load

- (nsstring *)hy_localizedstringforkey:(nsstring *)key value:(nsstring *)value table:(nsstring *)tablename

nsstring *usebundle = [[nsbundle mainbundle] pathforresource:strlanguage oftype:@"lproj"];

nsbundle *changebundle = [nsbundle mainbundle];

if (!usebundle)

return [changebundle hy_localizedstringforkey:key value:value table:tablename];

}@end

好了,到此基本就可以了,如果想更加去精煉這塊,可以繼續去深挖:

[[nsbundle mainbundle] preferredlocalizations];

[[nsbundle mainbundle] localizations];

[[nsbundle mainbundle] developmentlocalization];

看看能否不需要讀取當前語言首選項呢,如果有好的想法或者在使用中遇到了什麼問題,歡迎給出修改意見。

JEECGBOOT 無侵入提公升訪問效率

dict 1.14000條 1 分鐘 獲取json資料 耗時 633ms 解析注入json資料 耗時71402ms 獲取json資料 耗時 465ms 解析注入json資料 耗時56333ms 獲取json資料 耗時 489ms 解析注入json資料 耗時67972ms 獲取json資料 耗時 52...

Ansible playbook 流程控制語句

1.when條件判斷 root test2 playbook cat test.yml hosts all remote user root tasks name shut down the db server service name mysqld state stopped when ansib...

3 5資料控制SQL語旬

作用 控制使用者資料訪問權 grant 語句是一種由資料庫物件建立者或管理員執行的授權語句,把訪問資料庫物件許可權授予給其他角色。grant 許可權列表 on 資料庫物件 to 使用者或角色 with grant option 假定系統管理員希望將register表的select insert up...