123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
- /// MARK: - DDYAuthManager 2018/10/30
- /// !!!: Author: 豆电雨
- /// !!!: QQ/WX: 634778311
- /// !!!: Github: https://github.com/RainOpen/
- /// !!!: Blog: https://juejin.im/user/57dddcd8128fe10064cadee9
- /// MARK: - DDYLanguageTool.M
- #import "DDYLanguageTool.h"
- #import <UIKit/UIKit.h>
- #import <objc/runtime.h>
- #define DDYLanguages @"DDYLanguages"
- NSString *const DDY_ZHS = @"zh-Hans";
- NSString *const DDY_EN = @"en";
- NSString *const DDY_ZHT = @"zh-Hant";
- NSString *const DDY_JA = @"ja";
- NSString *const DDY_FR = @"fr";
- NSString *const DDY_DE = @"de";
- NSString *const DDY_KO = @"ko";
- NSErrorDomain DDYLanguageErrorDomain = @"DDYLanguageErrorDomain";
- static inline void ddy_Swizzle(Class class, SEL originalSelector, SEL swizzledSelector) {
- Method originalMethod = class_getInstanceMethod(class, originalSelector);
- Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector);
- if (class_addMethod(class, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod))) {
- class_replaceMethod(class, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod));
- } else {
- method_exchangeImplementations(originalMethod, swizzledMethod);
- }
- }
- @implementation NSBundle (DDYLanguage)
- + (void)load {
- static dispatch_once_t onceToken;
- dispatch_once(&onceToken, ^{
- ddy_Swizzle([self class], @selector(localizedStringForKey:value:table:), @selector(ddyLanguageLocalizedStringForKey:value:table:));
- ddy_Swizzle([self class], NSSelectorFromString(@"dealloc"), @selector(ddyLanguageDealloc));
- });
- }
- - (NSString *)ddyLanguageLocalizedStringForKey:(NSString *)key value:(NSString *)value table:(NSString *)tableName {
- NSString *language = [[NSUserDefaults standardUserDefaults] objectForKey:DDYLanguages];
- // 可以加更多条件,比如特定的key,value,tableName才进行交换,否则直接return原方法返回值([language isEqualToString:@"Localizable"])
- if (language && ![self.bundlePath hasSuffix:@".lproj"]) {
- NSBundle *languageBundle = [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:language ofType:@"lproj"]];
- if (languageBundle) {
- return [languageBundle ddyLanguageLocalizedStringForKey:key value:value table:tableName];
- }
- }
- return [self ddyLanguageLocalizedStringForKey:key value:value table:tableName];
- }
- - (void)ddyLanguageDealloc {
- objc_removeAssociatedObjects(self);
- [self ddyLanguageDealloc];
- }
- @end
- @implementation DDYLanguageTool
- // MARK: - 类方法
- // MARK: 手机系统语言
- + (NSString *)ddy_SystemLanguage {
- return [[NSLocale preferredLanguages] objectAtIndex:0];
- }
- // MARK: App应用语言
- + (NSString *)ddy_AppLanguage {
- return [[NSUserDefaults standardUserDefaults] objectForKey:DDYLanguages];
- }
- // MARK: 设置语言 nil:跟随系统 language:相应语言
- + (void)ddy_SetLanguage:(NSString *)language complete:(void (^)(NSError *))complete {
- NSError *languageError;
- if (language == nil || [language isEqualToString:@""]) {
- [[NSUserDefaults standardUserDefaults] removeObjectForKey:DDYLanguages];
- languageError = [NSError errorWithDomain:DDYLanguageErrorDomain code:kDDYLanguageErrorNil userInfo:@{@"reason":@"Remove language setting"}];
- } else {
- NSBundle *languageBundle = [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:language ofType:@"lproj"]];
- if (languageBundle) {
- [[NSUserDefaults standardUserDefaults] setObject:language forKey:DDYLanguages];
- languageError = [NSError errorWithDomain:DDYLanguageErrorDomain code:kDDYLanguageErrorSuccess userInfo:@{@"reason":@"Success"}];
- } else {
- languageError = [NSError errorWithDomain:DDYLanguageErrorDomain code:kDDYLanguageErrorUnsupport userInfo:@{@"reason":@"Unsupported language"}];
- }
- }
- [[NSUserDefaults standardUserDefaults] synchronize];
- if (complete) {
- dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
- complete(languageError);
- });
- }
- }
- @end
|