TranslationService.swift (2715B)
1 // 2 // TranslationService.swift 3 // damus 4 // 5 // Created by Terry Yiu on 2/3/23. 6 // 7 8 import Foundation 9 10 enum TranslationService: String, CaseIterable, Identifiable, StringCodable { 11 init?(from string: String) { 12 guard let ts = TranslationService(rawValue: string) else { 13 return nil 14 } 15 16 self = ts 17 } 18 19 func to_string() -> String { 20 return self.rawValue 21 } 22 23 var id: String { self.rawValue } 24 25 struct Model: Identifiable, Hashable { 26 var id: String { self.tag } 27 var tag: String 28 var displayName: String 29 } 30 31 case none 32 case purple 33 case libretranslate 34 case deepl 35 case nokyctranslate 36 case winetranslate 37 38 var model: Model { 39 switch self { 40 case .none: 41 let displayName: String 42 if TranslationService.isAppleTranslationPopoverSupported { 43 displayName = NSLocalizedString("apple_translation_service", value: "Apple", comment: "Dropdown option for selecting Apple as a translation service.") 44 } else { 45 displayName = NSLocalizedString("none_translation_service", value: "None", comment: "Dropdown option for selecting no translation service.") 46 } 47 return .init(tag: self.rawValue, displayName: displayName) 48 case .purple: 49 return .init(tag: self.rawValue, displayName: NSLocalizedString("Damus Purple", comment: "Dropdown option for selecting Damus Purple as a translation service.")) 50 case .libretranslate: 51 return .init(tag: self.rawValue, displayName: NSLocalizedString("LibreTranslate (Open Source)", comment: "Dropdown option for selecting LibreTranslate as the translation service.")) 52 case .deepl: 53 return .init(tag: self.rawValue, displayName: NSLocalizedString("DeepL (Proprietary, Higher Accuracy)", comment: "Dropdown option for selecting DeepL as the translation service.")) 54 case .nokyctranslate: 55 return .init(tag: self.rawValue, displayName: NSLocalizedString("NoKYCTranslate.com (Prepay with BTC)", comment: "Dropdown option for selecting NoKYCTranslate.com as the translation service.")) 56 case .winetranslate: 57 return .init(tag: self.rawValue, displayName: NSLocalizedString("translate.nostr.wine (DeepL, Pay with BTC)", comment: "Dropdown option for selecting translate.nostr.wine as the translation service.")) 58 } 59 } 60 61 static var isAppleTranslationPopoverSupported: Bool { 62 #if targetEnvironment(macCatalyst) 63 return false 64 #else 65 if #available(iOS 17.4, macOS 14.4, *) { 66 return true 67 } else { 68 return false 69 } 70 #endif 71 } 72 }