@@ -389,12 +389,21 @@ struct InputMethod: Codable, Hashable {
389
389
}
390
390
}
391
391
392
- private func languageCodeMatch( _ code: String ) -> Bool {
392
+ private func normalizeLanguageCode( _ code: String ) -> String {
393
+ // "".split throws
394
+ if code. isEmpty {
395
+ return " "
396
+ }
397
+ return String ( code. split ( separator: " _ " ) [ 0 ] )
398
+ }
399
+
400
+ // Match both system language and languages of enabled input methods.
401
+ private func languageCodeMatch( _ code: String , _ languagesOfEnabledIMs: Set < String > ) -> Bool {
393
402
guard let languageCode = Locale . current. language. languageCode? . identifier else {
394
403
return true
395
404
}
396
- // "".split throws
397
- return !code . isEmpty && String ( code . split ( separator : " _ " ) [ 0 ] ) == languageCode
405
+ let normalized = normalizeLanguageCode ( code )
406
+ return normalized == languageCode || languagesOfEnabledIMs . contains ( normalized )
398
407
}
399
408
400
409
struct AvailableInputMethodView : View {
@@ -470,7 +479,8 @@ struct AvailableInputMethodView: View {
470
479
updateList ( )
471
480
}
472
481
}
473
- @Published var availableIMsForLanguage : [ InputMethod ] = [ ]
482
+ @Published var availableIMsForLanguage = [ InputMethod] ( )
483
+ var languagesOfEnabledIMs = Set < String > ( )
474
484
475
485
var errorMsg : String ? {
476
486
didSet {
@@ -490,6 +500,7 @@ struct AvailableInputMethodView: View {
490
500
491
501
func refresh( _ alreadyEnabled: Set < String > ) {
492
502
availableIMs. removeAll ( )
503
+ languagesOfEnabledIMs. removeAll ( )
493
504
let jsonStr = String ( Fcitx . imGetAvailableIMs ( ) )
494
505
if let jsonData = jsonStr. data ( using: . utf8) {
495
506
do {
@@ -501,6 +512,9 @@ struct AvailableInputMethodView: View {
501
512
} else {
502
513
availableIMs [ im. languageCode] = [ im]
503
514
}
515
+ if alreadyEnabled. contains ( im. uniqueName) {
516
+ languagesOfEnabledIMs. update ( with: normalizeLanguageCode ( im. languageCode) )
517
+ }
504
518
}
505
519
} catch {
506
520
errorMsg =
@@ -541,7 +555,9 @@ struct AvailableInputMethodView: View {
541
555
542
556
fileprivate func languages( ) -> [ LocalizedLanguageCode ] {
543
557
return Array ( availableIMs. keys)
544
- . filter { !( addIMOnlyShowCurrentLanguage ?? false ) || languageCodeMatch ( $0) }
558
+ . filter {
559
+ !( addIMOnlyShowCurrentLanguage ?? false ) || languageCodeMatch ( $0, languagesOfEnabledIMs)
560
+ }
545
561
. map { LocalizedLanguageCode ( code: $0) }
546
562
. sorted ( )
547
563
}
0 commit comments