// // 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