50 lines
1.5 KiB
Swift
50 lines
1.5 KiB
Swift
import Foundation
|
|
import MacToolsPluginKit
|
|
|
|
struct TranslatorLanguageSelection: Equatable, Sendable {
|
|
var source: TranslatorLanguage?
|
|
var target: TranslatorLanguage
|
|
|
|
var sourceIsAutomatic: Bool {
|
|
source == nil
|
|
}
|
|
|
|
var sourceDisplayName: String {
|
|
sourceDisplayName()
|
|
}
|
|
|
|
func sourceDisplayName(localization: PluginLocalization = PluginLocalization(bundle: .main)) -> String {
|
|
source?.displayName(localization: localization)
|
|
?? localization.string("language.automatic", defaultValue: "自动检测")
|
|
}
|
|
}
|
|
|
|
struct AutomaticLanguageSelector: Sendable {
|
|
private let detector: any LanguageDetecting
|
|
private let preferredPair: TranslatorLanguagePair
|
|
|
|
init(
|
|
detector: any LanguageDetecting = LanguageDetector(),
|
|
preferredPair: TranslatorLanguagePair
|
|
) {
|
|
self.detector = detector
|
|
self.preferredPair = preferredPair
|
|
}
|
|
|
|
func select(text: String) -> TranslatorLanguageSelection {
|
|
guard let source = detector.detect(text) else {
|
|
return TranslatorLanguageSelection(source: nil, target: preferredPair.first)
|
|
}
|
|
|
|
if source == preferredPair.first {
|
|
return TranslatorLanguageSelection(source: source, target: preferredPair.second)
|
|
}
|
|
|
|
return TranslatorLanguageSelection(source: source, target: preferredPair.first)
|
|
}
|
|
|
|
func select(for text: String) -> TranslatorLanguageSelection {
|
|
select(text: text)
|
|
}
|
|
}
|