158 lines
5.1 KiB
Swift
158 lines
5.1 KiB
Swift
import AppKit
|
|
import CodexBarCore
|
|
import SwiftUI
|
|
|
|
enum AppLanguage: String, CaseIterable, Identifiable {
|
|
case system = ""
|
|
case english = "en"
|
|
case chineseSimplified = "zh-Hans"
|
|
case chineseTraditional = "zh-Hant"
|
|
case japanese = "ja"
|
|
case spanish = "es"
|
|
case portugueseBrazilian = "pt-BR"
|
|
case korean = "ko"
|
|
case german = "de"
|
|
case french = "fr"
|
|
case arabic = "ar"
|
|
case italian = "it"
|
|
case vietnamese = "vi"
|
|
case dutch = "nl"
|
|
case turkish = "tr"
|
|
case ukrainian = "uk"
|
|
case russian = "ru"
|
|
case indonesian = "id"
|
|
case polish = "pl"
|
|
case persian = "fa"
|
|
case thai = "th"
|
|
case galician = "gl"
|
|
case catalan = "ca"
|
|
case swedish = "sv"
|
|
|
|
var id: String {
|
|
self.rawValue
|
|
}
|
|
|
|
var label: String {
|
|
L(self.labelKey, language: self.labelLanguage)
|
|
}
|
|
|
|
private var labelLanguage: String {
|
|
switch self {
|
|
case .system, .english:
|
|
"en"
|
|
default:
|
|
self.rawValue
|
|
}
|
|
}
|
|
|
|
private var labelKey: String {
|
|
switch self {
|
|
case .system: "language_system"
|
|
case .english: "language_english"
|
|
case .chineseSimplified: "language_chinese_simplified"
|
|
case .chineseTraditional: "language_chinese_traditional"
|
|
case .japanese: "language_japanese"
|
|
case .spanish: "language_spanish"
|
|
case .portugueseBrazilian: "language_portuguese_brazilian"
|
|
case .korean: "language_korean"
|
|
case .german: "language_german"
|
|
case .french: "language_french"
|
|
case .arabic: "language_arabic"
|
|
case .italian: "language_italian"
|
|
case .vietnamese: "language_vietnamese"
|
|
case .dutch: "language_dutch"
|
|
case .turkish: "language_turkish"
|
|
case .ukrainian: "language_ukrainian"
|
|
case .russian: "language_russian"
|
|
case .indonesian: "language_indonesian"
|
|
case .polish: "language_polish"
|
|
case .persian: "language_persian"
|
|
case .thai: "language_thai"
|
|
case .galician: "language_galician"
|
|
case .catalan: "language_catalan"
|
|
case .swedish: "language_swedish"
|
|
}
|
|
}
|
|
}
|
|
|
|
@MainActor
|
|
struct GeneralPane: View {
|
|
@Bindable var settings: SettingsStore
|
|
|
|
var body: some View {
|
|
Form {
|
|
Section {
|
|
SettingsMenuPicker(
|
|
selection: self.$settings.appLanguage,
|
|
options: GeneralSettingsMenuOptions.languages,
|
|
label: {
|
|
SettingsRowLabel(L("language_title"), subtitle: L("language_subtitle"))
|
|
},
|
|
optionLabel: { rawValue in
|
|
Text(verbatim: AppLanguage(rawValue: rawValue)?.label ?? rawValue)
|
|
})
|
|
|
|
SettingsMenuPicker(
|
|
selection: self.$settings.terminalApp,
|
|
options: GeneralSettingsMenuOptions.terminalApps(selected: self.settings.terminalApp),
|
|
label: {
|
|
SettingsRowLabel(L("terminal_app_title"), subtitle: L("terminal_app_subtitle"))
|
|
},
|
|
optionLabel: { option in
|
|
HStack(spacing: 6) {
|
|
if let icon = option.pickerIcon {
|
|
Image(nsImage: icon)
|
|
}
|
|
Text(option.label)
|
|
}
|
|
})
|
|
|
|
Toggle(L("start_at_login_title"), isOn: self.$settings.launchAtLogin)
|
|
} header: {
|
|
Text(L("section_system"))
|
|
}
|
|
|
|
Section {
|
|
SettingsMenuPicker(
|
|
selection: self.$settings.refreshFrequency,
|
|
options: GeneralSettingsMenuOptions.refreshFrequencies,
|
|
label: { Text(L("refresh_interval_title")) },
|
|
optionLabel: { option in Text(option.label) })
|
|
|
|
Toggle(L("refresh_on_open_title"), isOn: self.$settings.refreshAllProvidersOnMenuOpen)
|
|
|
|
Toggle(isOn: self.$settings.statusChecksEnabled) {
|
|
SettingsRowLabel(
|
|
L("check_provider_status_title"),
|
|
subtitle: L("check_provider_status_subtitle"))
|
|
}
|
|
} header: {
|
|
Text(L("section_refreshing"))
|
|
} footer: {
|
|
if self.settings.refreshFrequency == .manual {
|
|
SettingsSectionFooter(L("manual_refresh_hint"))
|
|
}
|
|
}
|
|
|
|
Section {
|
|
LabeledContent(L("open_menu_shortcut_title")) {
|
|
OpenMenuShortcutRecorder()
|
|
}
|
|
} header: {
|
|
Text(L("section_keyboard_shortcut"))
|
|
}
|
|
|
|
Section {
|
|
HStack {
|
|
Spacer()
|
|
Button(L("quit_app")) { NSApp.terminate(nil) }
|
|
}
|
|
}
|
|
}
|
|
.formStyle(.grouped)
|
|
.toggleStyle(.switch)
|
|
.scrollContentBackground(.hidden)
|
|
.background(FocusResigningBackground())
|
|
}
|
|
}
|