Files
keyboard/CustomKeyboard/Manager/KBKeyboardLayoutResolver.m
CodeST eaf512be7f 语言逻辑处理
我的项目里有5个国家的语言,如果用户在app里手动切换了国家语言,只要不卸载app,用户在手机设置切换语言,app的语言不要变;如果app被删
  除,重新安装,app语言要跟随手机设置的语言(如果语言对不上,app就显示英语)
  用户没有在app里手动设置过国家语言,用户在手机设置界面切换国家,app要跟随手机设置的语言(如果语言对不上,app就显示英语)。
2026-03-05 17:42:50 +08:00

107 lines
4.0 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.
//
// 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