我的项目里有5个国家的语言,如果用户在app里手动切换了国家语言,只要不卸载app,用户在手机设置切换语言,app的语言不要变;如果app被删 除,重新安装,app语言要跟随手机设置的语言(如果语言对不上,app就显示英语) 用户没有在app里手动设置过国家语言,用户在手机设置界面切换国家,app要跟随手机设置的语言(如果语言对不上,app就显示英语)。
107 lines
4.0 KiB
Objective-C
107 lines
4.0 KiB
Objective-C
//
|
||
// KBKeyboardLayoutResolver.m
|
||
// CustomKeyboard
|
||
//
|
||
|
||
#import "KBKeyboardLayoutResolver.h"
|
||
#import "KBInputProfileManager.h"
|
||
#import "KBConfig.h"
|
||
#import "KBLocalizationManager.h"
|
||
|
||
@implementation KBKeyboardLayoutResolver
|
||
|
||
+ (instancetype)sharedResolver {
|
||
static KBKeyboardLayoutResolver *instance = nil;
|
||
static dispatch_once_t onceToken;
|
||
dispatch_once(&onceToken, ^{
|
||
instance = [[self alloc] init];
|
||
});
|
||
return instance;
|
||
}
|
||
|
||
/// 未手动选择键盘输入配置时,根据当前 App 语言推导默认键盘语言码(对应 kb_input_profiles.json 的 code)。
|
||
- (NSString *)kb_defaultKeyboardLanguageCodeForAppLanguageCode:(NSString *)appLanguageCode {
|
||
NSString *lc = (appLanguageCode ?: @"").lowercaseString;
|
||
if ([lc hasPrefix:@"es"]) { return @"es"; }
|
||
if ([lc hasPrefix:@"pt"]) { return @"pt"; }
|
||
if ([lc hasPrefix:@"id"]) { return @"id"; }
|
||
if ([lc hasPrefix:@"zh-hant"]) { return @"zh-Hant-Pinyin"; }
|
||
return @"en";
|
||
}
|
||
|
||
- (BOOL)kb_didUserSelectKeyboardProfileInAppGroup:(NSUserDefaults *)appGroup {
|
||
return [appGroup boolForKey:AppGroup_DidUserSelectKeyboardProfile];
|
||
}
|
||
|
||
- (nullable KBInputProfileLayout *)kb_defaultLayoutForCurrentAppLanguage {
|
||
NSString *appLang = [KBLocalizationManager shared].currentLanguageCode ?: KBLanguageCodeEnglish;
|
||
NSString *kbLang = [self kb_defaultKeyboardLanguageCodeForAppLanguageCode:appLang];
|
||
KBInputProfile *profile = [[KBInputProfileManager sharedManager] profileForLanguageCode:kbLang];
|
||
if (!profile) {
|
||
profile = [[KBInputProfileManager sharedManager] profileForLanguageCode:@"en"];
|
||
}
|
||
return profile.layouts.firstObject;
|
||
}
|
||
|
||
- (NSString *)layoutJsonIdForProfileId:(NSString *)profileId {
|
||
if (profileId.length == 0) {
|
||
return @"letters";
|
||
}
|
||
|
||
NSString *layoutJsonId = [[KBInputProfileManager sharedManager] layoutJsonIdForProfileId:profileId];
|
||
if (layoutJsonId.length > 0) {
|
||
return layoutJsonId;
|
||
}
|
||
|
||
// 回退到默认布局
|
||
NSLog(@"[KBKeyboardLayoutResolver] No layoutJsonId found for profileId: %@, using default 'letters'", profileId);
|
||
return @"letters";
|
||
}
|
||
|
||
- (NSString *)suggestionEngineForProfileId:(NSString *)profileId {
|
||
if (profileId.length == 0) {
|
||
return @"latin";
|
||
}
|
||
|
||
NSString *engine = [[KBInputProfileManager sharedManager] suggestionEngineForProfileId:profileId];
|
||
if (engine.length > 0) {
|
||
return engine;
|
||
}
|
||
|
||
// 回退到默认引擎
|
||
NSLog(@"[KBKeyboardLayoutResolver] No suggestionEngine found for profileId: %@, using default 'latin'", profileId);
|
||
return @"latin";
|
||
}
|
||
|
||
- (nullable NSString *)currentProfileId {
|
||
NSUserDefaults *appGroup = [[NSUserDefaults alloc] initWithSuiteName:AppGroup];
|
||
NSString *profileId = [appGroup stringForKey:AppGroup_SelectedKeyboardProfileId];
|
||
if ([self kb_didUserSelectKeyboardProfileInAppGroup:appGroup]) {
|
||
return profileId;
|
||
}
|
||
KBInputProfileLayout *layout = [self kb_defaultLayoutForCurrentAppLanguage];
|
||
return layout.profileId.length > 0 ? layout.profileId : profileId;
|
||
}
|
||
|
||
- (nullable NSString *)currentLanguageCode {
|
||
NSUserDefaults *appGroup = [[NSUserDefaults alloc] initWithSuiteName:AppGroup];
|
||
NSString *languageCode = [appGroup stringForKey:AppGroup_SelectedKeyboardLanguageCode];
|
||
if ([self kb_didUserSelectKeyboardProfileInAppGroup:appGroup]) {
|
||
return languageCode;
|
||
}
|
||
NSString *appLang = [KBLocalizationManager shared].currentLanguageCode ?: KBLanguageCodeEnglish;
|
||
return [self kb_defaultKeyboardLanguageCodeForAppLanguageCode:appLang];
|
||
}
|
||
|
||
- (nullable NSString *)currentLayoutVariant {
|
||
NSUserDefaults *appGroup = [[NSUserDefaults alloc] initWithSuiteName:AppGroup];
|
||
NSString *layoutVariant = [appGroup stringForKey:AppGroup_SelectedKeyboardLayoutVariant];
|
||
if ([self kb_didUserSelectKeyboardProfileInAppGroup:appGroup]) {
|
||
return layoutVariant;
|
||
}
|
||
KBInputProfileLayout *layout = [self kb_defaultLayoutForCurrentAppLanguage];
|
||
return layout.variant.length > 0 ? layout.variant : layoutVariant;
|
||
}
|
||
|
||
@end
|