From e64cdcb8e172e212bd38b8bd5cec06befa337f7c Mon Sep 17 00:00:00 2001
From: Ariver <ar@MacBook-Air.local>
Date: Wed, 06 May 2026 18:35:10 +0800
Subject: [PATCH] checkpoint: v3.1.1 — 修复语言勾选+图标消失bug +新增Dock显示开关

---
 Apptag/ApptagApp.swift |   14 ++++++++++++--
 Apptag/Info.plist      |    2 +-
 Apptag/L10n.swift      |    3 ++-
 CHANGELOG.md           |    6 ++++++
 4 files changed, 21 insertions(+), 4 deletions(-)

diff --git a/Apptag/ApptagApp.swift b/Apptag/ApptagApp.swift
index 640545d..adc2a53 100644
--- a/Apptag/ApptagApp.swift
+++ b/Apptag/ApptagApp.swift
@@ -25,7 +25,8 @@
 
     func applicationDidFinishLaunching(_ notification: Notification) {
         L10n.setup()
-        NSApp.setActivationPolicy(.accessory)
+        let showDock = UserDefaults.standard.bool(forKey: "showDockIcon")
+        NSApp.setActivationPolicy(showDock ? .regular : .accessory)
         setupMenuBar()
         registerHotkey()
         observeOtherWindows()
@@ -35,6 +36,10 @@
     // MARK: - Menu Bar
 
     private func setupMenuBar() {
+        // Remove old status item if re-creating (language switch, etc.)
+        if let existing = statusItem {
+            NSStatusBar.system.removeStatusItem(existing)
+        }
         statusItem = NSStatusBar.system.statusItem(withLength: NSStatusItem.variableLength)
 
         if let button = statusItem.button {
@@ -80,7 +85,7 @@
 
         // Language submenu
         let langMenu = NSMenu()
-        let currentLang = UserDefaults.standard.string(forKey: "appLanguage") ?? "en"
+        let currentLang = L10n.currentCode
         for (code, name) in L10n.supported {
             let item = NSMenuItem(title: name, action: #selector(switchLanguage(_:)), keyEquivalent: "")
             item.representedObject = code
@@ -343,6 +348,7 @@
     @AppStorage("defaultGroupName") private var defaultGroupName = "Other"
     @AppStorage("displayMode") private var displayMode = "flat"
     @AppStorage("hideAppNames") private var hideAppNames = false
+    @AppStorage("showDockIcon") private var showDockIcon = false
 
     @State private var allApps: [AppInfo] = []
     @State private var tagColors: [String: Int] = [:]
@@ -468,6 +474,10 @@
                 }
 
                 Section {
+                    Toggle("Show in Dock", isOn: $showDockIcon)
+                }
+
+                Section {
                     Toggle("Hide app names", isOn: $hideAppNames)
                 }
             }
diff --git a/Apptag/Info.plist b/Apptag/Info.plist
index 4c4db55..af5bbd5 100644
--- a/Apptag/Info.plist
+++ b/Apptag/Info.plist
@@ -19,7 +19,7 @@
 	<key>CFBundlePackageType</key>
 	<string>APPL</string>
 	<key>CFBundleShortVersionString</key>
-	<string>3.1.0</string>
+	<string>3.1.1</string>
 	<key>CFBundleVersion</key>
 	<string>1</string>
 	<key>LSMinimumSystemVersion</key>
diff --git a/Apptag/L10n.swift b/Apptag/L10n.swift
index be24145..9d6ac8b 100644
--- a/Apptag/L10n.swift
+++ b/Apptag/L10n.swift
@@ -4,6 +4,7 @@
 
 enum L10n {
     static var current: [String: String] = [:]
+    private(set) static var currentCode = "en"
 
     /// Call once at startup to load the saved or system language.
     static func setup() {
@@ -33,7 +34,6 @@
             forResource: code, withExtension: "json",
             subdirectory: "Localization"
         ) else {
-            // Fallback to bundled English
             if code != "en" { load("en") }
             return
         }
@@ -41,6 +41,7 @@
               let dict = try? JSONSerialization.jsonObject(with: data) as? [String: String]
         else { return }
         current = dict
+        currentCode = code
     }
 
     private static func fallbackCode() -> String {
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 9beb6ec..e33c7a6 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,11 @@
 # Apptag Changelog
 
+## [3.1.1] — 2026-05-06
+
+- 修复语言菜单勾选与实际语言不一致(`L10n.currentCode` 替代 UserDefaults)
+- 修复 `setupMenuBar` 重复调用导致图标消失(先移除旧 statusItem)
+- Preferences → General 新增「Show in Dock」Toggle
+
 ## [3.1.0] — 2026-05-06
 
 - 国际化:支持 9 种语言(英/简中/繁中/日/韩/俄/法/意/西)

--
Gitblit v1.9.3