Files
steipete--codexbar/Sources/CodexBar/PreferencesGeneralPane.swift
2026-07-13 12:22:33 +08:00

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())
}
}