2026-03-02 09:19:06 +08:00
|
|
|
|
//
|
|
|
|
|
|
// KBKeyboardLayoutResolver.m
|
|
|
|
|
|
// CustomKeyboard
|
|
|
|
|
|
//
|
|
|
|
|
|
|
|
|
|
|
|
#import "KBKeyboardLayoutResolver.h"
|
|
|
|
|
|
#import "KBInputProfileManager.h"
|
|
|
|
|
|
#import "KBConfig.h"
|
2026-03-05 17:42:50 +08:00
|
|
|
|
#import "KBLocalizationManager.h"
|
2026-03-02 09:19:06 +08:00
|
|
|
|
|
|
|
|
|
|
@implementation KBKeyboardLayoutResolver
|
|
|
|
|
|
|
|
|
|
|
|
+ (instancetype)sharedResolver {
|
|
|
|
|
|
static KBKeyboardLayoutResolver *instance = nil;
|
|
|
|
|
|
static dispatch_once_t onceToken;
|
|
|
|
|
|
dispatch_once(&onceToken, ^{
|
|
|
|
|
|
instance = [[self alloc] init];
|
|
|
|
|
|
});
|
|
|
|
|
|
return instance;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-03-05 17:42:50 +08:00
|
|
|
|
/// 未手动选择键盘输入配置时,根据当前 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;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-03-02 09:19:06 +08:00
|
|
|
|
- (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];
|
2026-03-05 17:42:50 +08:00
|
|
|
|
if ([self kb_didUserSelectKeyboardProfileInAppGroup:appGroup]) {
|
|
|
|
|
|
return profileId;
|
|
|
|
|
|
}
|
|
|
|
|
|
KBInputProfileLayout *layout = [self kb_defaultLayoutForCurrentAppLanguage];
|
|
|
|
|
|
return layout.profileId.length > 0 ? layout.profileId : profileId;
|
2026-03-02 09:19:06 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
- (nullable NSString *)currentLanguageCode {
|
|
|
|
|
|
NSUserDefaults *appGroup = [[NSUserDefaults alloc] initWithSuiteName:AppGroup];
|
|
|
|
|
|
NSString *languageCode = [appGroup stringForKey:AppGroup_SelectedKeyboardLanguageCode];
|
2026-03-05 17:42:50 +08:00
|
|
|
|
if ([self kb_didUserSelectKeyboardProfileInAppGroup:appGroup]) {
|
|
|
|
|
|
return languageCode;
|
|
|
|
|
|
}
|
|
|
|
|
|
NSString *appLang = [KBLocalizationManager shared].currentLanguageCode ?: KBLanguageCodeEnglish;
|
|
|
|
|
|
return [self kb_defaultKeyboardLanguageCodeForAppLanguageCode:appLang];
|
2026-03-02 09:19:06 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
- (nullable NSString *)currentLayoutVariant {
|
|
|
|
|
|
NSUserDefaults *appGroup = [[NSUserDefaults alloc] initWithSuiteName:AppGroup];
|
|
|
|
|
|
NSString *layoutVariant = [appGroup stringForKey:AppGroup_SelectedKeyboardLayoutVariant];
|
2026-03-05 17:42:50 +08:00
|
|
|
|
if ([self kb_didUserSelectKeyboardProfileInAppGroup:appGroup]) {
|
|
|
|
|
|
return layoutVariant;
|
|
|
|
|
|
}
|
|
|
|
|
|
KBInputProfileLayout *layout = [self kb_defaultLayoutForCurrentAppLanguage];
|
|
|
|
|
|
return layout.variant.length > 0 ? layout.variant : layoutVariant;
|
2026-03-02 09:19:06 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@end
|