Files
wehub-resource-sync 1d1286fadb
Build / Build and test (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 13:18:38 +08:00

161 lines
4.8 KiB
Swift

import Foundation
import MacToolsPluginKit
enum TranslatorLanguage: String, CaseIterable, Codable, Identifiable, Sendable {
case simplifiedChinese = "zh-Hans"
case traditionalChinese = "zh-Hant"
case english = "en"
case japanese = "ja"
case korean = "ko"
case french = "fr"
case german = "de"
case spanish = "es"
case portuguese = "pt"
case italian = "it"
case russian = "ru"
var id: String { rawValue }
var displayName: String {
displayName()
}
func displayName(localization: PluginLocalization = PluginLocalization(bundle: .main)) -> String {
switch self {
case .simplifiedChinese:
return localization.string("language.simplifiedChinese", defaultValue: "简体中文")
case .traditionalChinese:
return localization.string("language.traditionalChinese", defaultValue: "繁體中文")
case .english:
return localization.string("language.english", defaultValue: "英语")
case .japanese:
return localization.string("language.japanese", defaultValue: "日语")
case .korean:
return localization.string("language.korean", defaultValue: "韩语")
case .french:
return localization.string("language.french", defaultValue: "法语")
case .german:
return localization.string("language.german", defaultValue: "德语")
case .spanish:
return localization.string("language.spanish", defaultValue: "西班牙语")
case .portuguese:
return localization.string("language.portuguese", defaultValue: "葡萄牙语")
case .italian:
return localization.string("language.italian", defaultValue: "意大利语")
case .russian:
return localization.string("language.russian", defaultValue: "俄语")
}
}
var promptName: String {
switch self {
case .simplifiedChinese:
return "Simplified Chinese"
case .traditionalChinese:
return "Traditional Chinese"
case .english:
return "English"
case .japanese:
return "Japanese"
case .korean:
return "Korean"
case .french:
return "French"
case .german:
return "German"
case .spanish:
return "Spanish"
case .portuguese:
return "Portuguese"
case .italian:
return "Italian"
case .russian:
return "Russian"
}
}
/// BCP-47 voice locale used by `AVSpeechSynthesisVoice(language:)` for speech playback.
var speechLanguageCode: String {
switch self {
case .simplifiedChinese:
return "zh-CN"
case .traditionalChinese:
return "zh-TW"
case .english:
return "en-US"
case .japanese:
return "ja-JP"
case .korean:
return "ko-KR"
case .french:
return "fr-FR"
case .german:
return "de-DE"
case .spanish:
return "es-ES"
case .portuguese:
return "pt-BR"
case .italian:
return "it-IT"
case .russian:
return "ru-RU"
}
}
var flag: String {
switch self {
case .simplifiedChinese:
return "🇨🇳"
case .traditionalChinese:
return "🇨🇳"
case .english:
return "🇬🇧"
case .japanese:
return "🇯🇵"
case .korean:
return "🇰🇷"
case .french:
return "🇫🇷"
case .german:
return "🇩🇪"
case .spanish:
return "🇪🇸"
case .portuguese:
return "🇵🇹"
case .italian:
return "🇮🇹"
case .russian:
return "🇷🇺"
}
}
static func from(localeIdentifier: String) -> TranslatorLanguage? {
let normalized = localeIdentifier
.replacingOccurrences(of: "_", with: "-")
.lowercased()
if normalized == "zh-hant" ||
normalized.hasPrefix("zh-hant-") ||
normalized == "zh-tw" ||
normalized.hasPrefix("zh-tw-") ||
normalized == "zh-hk" ||
normalized.hasPrefix("zh-hk-") {
return .traditionalChinese
}
if normalized == "zh" || normalized.hasPrefix("zh-") {
return .simplifiedChinese
}
return allCases.first { language in
normalized == language.rawValue.lowercased() ||
normalized.hasPrefix("\(language.rawValue.lowercased())-")
}
}
}
struct TranslatorLanguagePair: Equatable, Codable, Sendable {
var first: TranslatorLanguage
var second: TranslatorLanguage
}