Hibit_iOS/HiBit/Project/Publics/MultiLanguage/Manager/HBMultiLanguageManager.m
2024-06-07 13:38:31 +08:00

169 lines
5.9 KiB
Objective-C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// HBMultiLanguageManager.m
// QinJiuTV
//
// Created by HI_LOSER on 2024/5/6.
//
#import "HBMultiLanguageManager.h"
/// 多语言 userdefine key
NSString *const HBMultiLanguageKey = @"HB_language";
NSString *const HBLocaleLanguageKey = @"AppleLanguages";
NSString *const HBNotificationMultiLanguageChangeKey = @"HB_language_change_key";
@implementation HBLanguageModel
+ (HBLanguageModel *) newWithTitle:(NSString *) title subTitle:(NSString *)subTitle abbr:(NSString *) abbr imageNamed:(NSString *)imageNamed{
HBLanguageModel * model = [[HBLanguageModel alloc]init];
model.title = title;
model.abbr = abbr;
model.imageNamed = imageNamed;
model.subTitle = subTitle;
return model;
}
-(BOOL)selected{
return [self.abbr isEqualToString:[NSUserDefaults stringForKey:HBMultiLanguageKey]];
}
@end
@implementation HBMultiLanguageManager
+ (NSString *)abbr{
NSString * abbr = [self currentlanguageAbbr];
if ([abbr isEqualToString:@"--"]) {
NSString * localAbbr = [NSUserDefaults arrayForKey:HBLocaleLanguageKey].firstObject;
NSString *countryCode = [NSString stringWithFormat:@"-%@", [[NSLocale currentLocale] objectForKey:NSLocaleCountryCode]];
if (localAbbr) {
localAbbr = [localAbbr stringByReplacingOccurrencesOfString:countryCode withString:@""];
}
return localAbbr;
}
return abbr;
}
+ (BOOL)isSystem {
NSString * abbr = [self currentlanguageAbbr];
return [abbr isEqualToString:@"--"];
}
+ (NSString *)currentlanguageAbbr{
NSString * abbr = [NSUserDefaults stringForKey:HBMultiLanguageKey];
if (!abbr) {
abbr = @"--";
[self saveCurrentLanguageAbbr:abbr];
}
return abbr;
}
+ (void)saveCurrentLanguageAbbr:(NSString *)abbr {
NSString * oldAbbr = [NSUserDefaults stringForKey:HBMultiLanguageKey];
if ([oldAbbr isEqualToString:abbr]) return;
// [NSUserDefaults setObject:abbr forKey:HBLocaleLanguageKey];
[NSUserDefaults setObject:abbr forKey:HBMultiLanguageKey];
[NSUserDefaults synchronize];
[[NSNotificationCenter defaultCenter]postNotificationName:HBNotificationMultiLanguageChangeKey object:nil];
}
+(NSArray<HBLanguageModel *> *)languages{
return @[
[HBLanguageModel newWithTitle:@"中文" subTitle:@"选择语言后,您的系统将会切换成中文" abbr:@"zh" imageNamed:@"language_country_zh"],
[HBLanguageModel newWithTitle:@"English" subTitle:@"After selecting the language, your system will switch to English" abbr:@"en" imageNamed:@"language_country_en"],
[HBLanguageModel newWithTitle:@"Tiếng Việt" subTitle:@"Sau khi chọn ngôn ngữ, hệ thống của bạn sẽ chuyển sang tiếng việt" abbr:@"vi" imageNamed:@"language_country_vi"],
[HBLanguageModel newWithTitle:@"한국어" subTitle:@"언어를 선택하면 시스템이 한국어로 전환됩니다" abbr:@"ko" imageNamed:@"language_country_ko"],
[HBLanguageModel newWithTitle:@"日本語" subTitle:@"言語をせんたく選択すると、システムはにっぽん日本ご語にきりかわり切り替わります" abbr:@"ja" imageNamed:@"language_country_ja"]
];
}
@end
@implementation NSString (language)
- (NSString *)language {
return NSLocalizedStringFromTable(self, @"MultiLanguage",nil);
}
//- (NSString *)language {
//
// NSString * abbr = [HBMultiLanguageManager currentlanguageAbbr];
//
// NSString * localAbbr = [NSUserDefaults arrayForKey:HBLocaleLanguageKey].firstObject;
//
// NSString *countryCode = [NSString stringWithFormat:@"-%@", [[NSLocale currentLocale] objectForKey:NSLocaleCountryCode]];
// if (localAbbr) {
// localAbbr = [localAbbr stringByReplacingOccurrencesOfString:countryCode withString:@""];
// }
//
// if ([abbr isEqualToString:@"--"]) {
// return [self bundleWithAbbr:localAbbr];
// } else {
// return [self bundleWithAbbr:abbr];
// }
//}
//
//- (NSBundle *) bundleWithAbbr:(NSString *) abbr {
// return [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:abbr ofType:@"lproj"]];
//}
//
//- (NSString *)languageWithBundle:(NSBundle *) bundle {
// if (bundle) {
// return NSLocalizedStringFromTableInBundle(self, @"MultiLanguage", bundle, ni);
// } else {
// return NSLocalizedStringFromTable(self, @"MultiLanguage",nil);
// }
//}
@end
@interface HBBundle : NSBundle
@end
@implementation HBBundle
- (NSString *)localizedStringForKey:(NSString *)key value:(NSString *)value table:(NSString *)tableName {
if ([HBBundle bundle]) {
return [[HBBundle bundle] localizedStringForKey:key value:value table:tableName];
} else {
return [super localizedStringForKey:key value:value table:tableName];
}
}
+ (NSBundle *)bundle {
NSString * abbr = [HBMultiLanguageManager currentlanguageAbbr];
NSString * localAbbr = [NSUserDefaults arrayForKey:HBLocaleLanguageKey].firstObject;
NSString *countryCode = [NSString stringWithFormat:@"-%@", [[NSLocale currentLocale] objectForKey:NSLocaleCountryCode]];
if (localAbbr) {
localAbbr = [localAbbr stringByReplacingOccurrencesOfString:countryCode withString:@""];
}
if ([abbr isEqualToString:@"--"]) {
return [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:localAbbr ofType:@"lproj"]];
} else {
return [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:abbr ofType:@"lproj"]];;
}
}
@end
@implementation NSBundle (Language)
+ (void)load {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
// 动态继承、交换方法类似KVO通过修改[NSBundle mainBundle]对象的isa指针使其指向它的子类CLBundle
// 这样便可以调用子类的方法其实这里也可以使用method_swizzling来交换mainBundle的实现来动态判断可以同样实现。
object_setClass([NSBundle mainBundle], [HBBundle class]);
});
}
@end