Release TagLauncher 5.7.5
| | |
| | | # Apptag — Mac App Store 提审资料 |
| | | |
| | | > 版本: 5.7.0 | Bundle ID: com.apptag.launcher | 更新日期: 2026-05-13 |
| | | > 版本: 5.7.5 | Bundle ID: com.apptag.launcher | 更新日期: 2026-05-14 |
| | | |
| | | --- |
| | | |
| | |
| | | | **App 名称** | Apptag | |
| | | | **副标题** | Tag-Based App Launcher | |
| | | | **Bundle ID** | com.apptag.launcher | |
| | | | **版本号** | 5.7.0 | |
| | | | **Build 号** | 570 | |
| | | | **版本号** | 5.7.5 | |
| | | | **Build 号** | 575 | |
| | | | **SKU** | apptag-mac-001 | |
| | | | **主要类别** | Utilities (工具) | |
| | | | **次要类别** | Productivity (效率) | |
| | |
| | | ## 8. What's New (本次版本更新说明) |
| | | |
| | | ``` |
| | | Apptag 5.7.0 |
| | | Apptag 5.7.5 |
| | | |
| | | - Fixed the menu bar icon visibility issue and added a Show Menu Bar Icon preference |
| | | - Fixed Preferences placement when opened above TagLauncher from a fullscreen app Space |
| | | - Fixed tag navigation reorder mode so clicking elsewhere exits the shaking state |
| | | - Expanded localization support to 29 language variants |
| | | - Updated the Language preferences tab to a two-column layout for better readability |
| | | - Added long-press drag sorting for tag navigation in normal app-list views |
| | |
| | | - Added Mac App Store sandbox entitlements and App Store build validation |
| | | - Hid Launch at Login controls in sandboxed App Store builds |
| | | - Removed deprecated app launch API usage |
| | | - Version updated to 5.7.0 (Build 570) |
| | | - Version updated to 5.7.5 (Build 575) |
| | | ``` |
| | | |
| | | --- |
| | |
| | | } |
| | | |
| | | final class AppDelegate: NSObject, NSApplicationDelegate { |
| | | private static let showMenuBarIconKey = "showMenuBarIcon" |
| | | |
| | | private var statusItem: NSStatusItem? |
| | | private var overlayWindow: NSWindow? |
| | | private var settingsWindow: NSWindow? // Track Settings window to keep it above overlay |
| | |
| | | |
| | | func applicationDidFinishLaunching(_ notification: Notification) { |
| | | L10n.setup() |
| | | setupDefaultPreferences() |
| | | migrateDefaultGroupName() |
| | | TagDatabase.seedDefaultTags() |
| | | let showDock = UserDefaults.standard.bool(forKey: "showDockIcon") |
| | |
| | | observeOtherWindows() |
| | | observeSettingsClose() |
| | | observeEditMode() |
| | | observeDockSetting() |
| | | observeChromeSettings() |
| | | observeLanguageChanges() |
| | | setupLaunchAtLogin() |
| | | } |
| | |
| | | // User has set a custom name — keep it |
| | | } |
| | | |
| | | /// Observe Show in Dock changes so it takes effect immediately. |
| | | private func observeDockSetting() { |
| | | private func setupDefaultPreferences() { |
| | | if UserDefaults.standard.object(forKey: Self.showMenuBarIconKey) == nil { |
| | | UserDefaults.standard.set(true, forKey: Self.showMenuBarIconKey) |
| | | } |
| | | } |
| | | |
| | | /// Observe Dock/menu-bar visibility changes so they take effect immediately. |
| | | private func observeChromeSettings() { |
| | | NotificationCenter.default.addObserver( |
| | | forName: UserDefaults.didChangeNotification, |
| | | object: nil, queue: .main |
| | | ) { _ in |
| | | ) { [weak self] _ in |
| | | let show = UserDefaults.standard.bool(forKey: "showDockIcon") |
| | | NSApp.setActivationPolicy(show ? .regular : .accessory) |
| | | self?.setupMenuBar() |
| | | } |
| | | } |
| | | |
| | |
| | | // MARK: - Menu Bar |
| | | |
| | | private func setupMenuBar() { |
| | | guard UserDefaults.standard.object(forKey: Self.showMenuBarIconKey) as? Bool ?? true else { |
| | | removeMenuBarItem() |
| | | return |
| | | } |
| | | |
| | | if statusItem == nil { |
| | | statusItem = NSStatusBar.system.statusItem(withLength: NSStatusItem.squareLength) |
| | | statusItem = NSStatusBar.system.statusItem(withLength: NSStatusItem.variableLength) |
| | | } |
| | | guard let statusItem else { return } |
| | | |
| | | if let button = statusItem.button { |
| | | let image = NSImage( |
| | | systemSymbolName: "tag.fill", |
| | | accessibilityDescription: "TagLauncher" |
| | | ) |
| | | image?.isTemplate = true |
| | | let image = makeMenuBarIcon() |
| | | button.image = image |
| | | button.imageScaling = .scaleProportionallyDown |
| | | button.imagePosition = .imageOnly |
| | | button.title = image == nil ? "T" : "" |
| | | button.toolTip = "TagLauncher — Tag-based app launcher" |
| | | button.action = #selector(toggleOverlay) |
| | | button.target = self |
| | |
| | | ) |
| | | ) |
| | | statusItem.menu = menu |
| | | } |
| | | |
| | | private func removeMenuBarItem() { |
| | | guard let statusItem else { return } |
| | | NSStatusBar.system.removeStatusItem(statusItem) |
| | | self.statusItem = nil |
| | | } |
| | | |
| | | private func makeMenuBarIcon() -> NSImage? { |
| | | let size = NSSize(width: 18, height: 18) |
| | | let image = NSImage(size: size) |
| | | image.lockFocus() |
| | | NSColor.black.setFill() |
| | | let tagPath = NSBezierPath() |
| | | tagPath.move(to: NSPoint(x: 2.5, y: 10.5)) |
| | | tagPath.line(to: NSPoint(x: 8.5, y: 16.5)) |
| | | tagPath.line(to: NSPoint(x: 15.5, y: 16.5)) |
| | | tagPath.line(to: NSPoint(x: 15.5, y: 9.5)) |
| | | tagPath.line(to: NSPoint(x: 8.5, y: 2.5)) |
| | | tagPath.close() |
| | | tagPath.appendOval(in: NSRect(x: 10.6, y: 12.2, width: 2.6, height: 2.6)) |
| | | tagPath.windingRule = .evenOdd |
| | | tagPath.fill() |
| | | image.unlockFocus() |
| | | image.isTemplate = true |
| | | image.accessibilityDescription = "TagLauncher" |
| | | return image |
| | | } |
| | | |
| | | // MARK: - Overlay Window |
| | |
| | | if let overlayWindow, overlayWindow.isVisible { |
| | | center(window, over: overlayWindow.frame) |
| | | window.level = NSWindow.Level(rawValue: overlayWindow.level.rawValue + 1) |
| | | attachSettingsWindow(window, to: overlayWindow) |
| | | } else if let screen = screenUnderMouse() { |
| | | center(window, over: screen.visibleFrame) |
| | | window.level = .floating |
| | | detachSettingsWindow(window) |
| | | } |
| | | |
| | | window.collectionBehavior.formUnion([.moveToActiveSpace, .fullScreenAuxiliary]) |
| | | window.collectionBehavior.formUnion([.canJoinAllSpaces, .fullScreenAuxiliary, .moveToActiveSpace]) |
| | | window.makeKeyAndOrderFront(nil) |
| | | window.orderFrontRegardless() |
| | | settingsWindow = window |
| | | } |
| | | |
| | | private func attachSettingsWindow(_ window: NSWindow, to overlayWindow: NSWindow) { |
| | | if window.parent != overlayWindow { |
| | | window.parent?.removeChildWindow(window) |
| | | overlayWindow.addChildWindow(window, ordered: .above) |
| | | } |
| | | } |
| | | |
| | | private func detachSettingsWindow(_ window: NSWindow) { |
| | | window.parent?.removeChildWindow(window) |
| | | } |
| | | |
| | | private func isSettingsWindowCandidate(_ window: NSWindow) -> Bool { |
| | |
| | | let closingWindow = notification.object as? NSWindow, |
| | | closingWindow == self.settingsWindow |
| | | else { return } |
| | | self.detachSettingsWindow(closingWindow) |
| | | self.settingsWindow = nil |
| | | } |
| | | } |
| | |
| | | |
| | | @objc private func openPreferences() { |
| | | // Don't hide overlay — keep it visible for real-time setting preview. |
| | | if let overlayWindow, overlayWindow.isVisible { |
| | | overlayWindow.makeKeyAndOrderFront(nil) |
| | | overlayWindow.orderFrontRegardless() |
| | | } |
| | | NSApp.sendAction(Selector(("showSettingsWindow:")), to: nil, from: nil) |
| | | prepareSettingsWindowWhenAvailable(retries: 5) |
| | | prepareSettingsWindowWhenAvailable(retries: 10) |
| | | } |
| | | |
| | | private func prepareSettingsWindowWhenAvailable(retries: Int) { |
| | |
| | | @AppStorage("defaultGroupName") private var defaultGroupName = "Other" |
| | | @AppStorage("displayMode") private var displayMode = "flat" |
| | | @AppStorage("hideAppNames") private var hideAppNames = false |
| | | @AppStorage("showMenuBarIcon") private var showMenuBarIcon = true |
| | | @AppStorage("showDockIcon") private var showDockIcon = false |
| | | @AppStorage("launchAtLogin") private var launchAtLogin = true |
| | | @State private var selectedLanguage = L10n.currentCode |
| | |
| | | } |
| | | } |
| | | } |
| | | Toggle(tr("settings.showMenuBarIcon"), isOn: $showMenuBarIcon) |
| | | Toggle(tr("settings.showInDock"), isOn: $showDockIcon) |
| | | Toggle(tr("settings.hideAppNames"), isOn: $hideAppNames) |
| | | } |
| | |
| | | @State private var tagReorderFrames: [String: CGRect] = [:] |
| | | @State private var tagNavDragModeActive = false |
| | | @State private var tagNavDragItem: String? = nil |
| | | @State private var tagNavDismissMonitor: Any? = nil |
| | | @State private var tagNavReorderFrames: [String: CGRect] = [:] |
| | | @State private var hoveredContainer: String? = nil // colored container lift |
| | | // Fixed interaction for "Colorless Container": hover fills persistently; click clears. |
| | |
| | | userInfo: ["active": active] |
| | | ) |
| | | } |
| | | .onChange(of: tagNavDragModeActive) { _, active in |
| | | updateTagNavDismissMonitor(active: active) |
| | | } |
| | | .onDisappear { |
| | | removeTagNavDismissMonitor() |
| | | } |
| | | } |
| | | |
| | | /// Set edit phase with synchronous notification BEFORE state change. |
| | |
| | | topLayout |
| | | } |
| | | |
| | | if tagNavDragModeActive && tagNavDragItem == nil { |
| | | Color.clear |
| | | .contentShape(Rectangle()) |
| | | .ignoresSafeArea() |
| | | .onTapGesture { |
| | | endTagNavReorder() |
| | | } |
| | | .zIndex(1) |
| | | } |
| | | |
| | | Button { |
| | | setEditPhase(.editingApps) |
| | | } label: { |
| | |
| | | .padding(.top, notchHeight > 0 ? notchHeight + 10 : 20) |
| | | .padding(.trailing, 20) |
| | | .keyboardShortcut("e", modifiers: .control) |
| | | .zIndex(2) |
| | | } |
| | | } |
| | | |
| | |
| | | } |
| | | tagNavDragModeActive = false |
| | | tagNavDragItem = nil |
| | | removeTagNavDismissMonitor() |
| | | } |
| | | |
| | | private func updateTagNavDismissMonitor(active: Bool) { |
| | | if active { |
| | | guard tagNavDismissMonitor == nil else { return } |
| | | tagNavDismissMonitor = NSEvent.addLocalMonitorForEvents(matching: [.leftMouseDown, .rightMouseDown]) { event in |
| | | guard tagNavDragModeActive, editPhase == .none else { return event } |
| | | endTagNavReorder() |
| | | return nil |
| | | } |
| | | } else { |
| | | removeTagNavDismissMonitor() |
| | | } |
| | | } |
| | | |
| | | private func removeTagNavDismissMonitor() { |
| | | if let monitor = tagNavDismissMonitor { |
| | | NSEvent.removeMonitor(monitor) |
| | | tagNavDismissMonitor = nil |
| | | } |
| | | } |
| | | |
| | | private func reorderTagNavItem(at location: CGPoint) { |
| | |
| | | } |
| | | |
| | | private func setAppDragMode(_ active: Bool) { |
| | | if active { |
| | | endTagNavReorder() |
| | | } |
| | | appDragModeActive = active |
| | | if active { |
| | | DispatchQueue.main.asyncAfter(deadline: .now() + 8) { |
| | |
| | | |
| | | func openApp(_ app: AppInfo) { |
| | | appDragModeActive = false |
| | | endTagNavReorder() |
| | | hideOverlay() |
| | | let configuration = NSWorkspace.OpenConfiguration() |
| | | NSWorkspace.shared.openApplication(at: app.path, configuration: configuration) |
| | |
| | | <key>CFBundlePackageType</key> |
| | | <string>APPL</string> |
| | | <key>CFBundleShortVersionString</key> |
| | | <string>5.7.0</string> |
| | | <string>5.7.5</string> |
| | | <key>CFBundleVersion</key> |
| | | <string>570</string> |
| | | <string>575</string> |
| | | <key>LSMinimumSystemVersion</key> |
| | | <string>15.0</string> |
| | | <key>NSHighResolutionCapable</key> |
| | |
| | | "settings.about": "عن التطبيق", |
| | | "settings.launchAtLogin": "يشتغل مع الدخول", |
| | | "settings.showInDock": "إظهار في Dock", |
| | | "settings.showMenuBarIcon": "إظهار أيقونة شريط القوائم", |
| | | "settings.appListStyle": "شكل قائمة التطبيقات:", |
| | | "settings.flat": "مسطح", |
| | | "settings.container": "حاوية بدون لون", |
| | |
| | | "settings.about": "حول", |
| | | "settings.launchAtLogin": "التشغيل عند تسجيل الدخول", |
| | | "settings.showInDock": "إظهار في Dock", |
| | | "settings.showMenuBarIcon": "إظهار أيقونة شريط القوائم", |
| | | "settings.appListStyle": "نمط قائمة التطبيقات:", |
| | | "settings.flat": "مسطح", |
| | | "settings.container": "حاوية بلا لون", |
| | |
| | | "settings.about": "O aplikaci", |
| | | "settings.launchAtLogin": "Spustit při přihlášení", |
| | | "settings.showInDock": "Zobrazit v Docku", |
| | | "settings.showMenuBarIcon": "Zobrazit ikonu v řádku nabídek", |
| | | "settings.appListStyle": "Styl seznamu aplikací:", |
| | | "settings.flat": "Plochý", |
| | | "settings.container": "Bezbarvý kontejner", |
| | |
| | | "settings.about": "Om", |
| | | "settings.launchAtLogin": "Start ved login", |
| | | "settings.showInDock": "Vis i Dock", |
| | | "settings.showMenuBarIcon": "Vis ikon i menulinjen", |
| | | "settings.appListStyle": "Applistestil:", |
| | | "settings.flat": "Flad", |
| | | "settings.container": "Farveløs beholder", |
| | |
| | | "settings.about": "Über", |
| | | "settings.launchAtLogin": "Beim Anmelden starten", |
| | | "settings.showInDock": "Im Dock anzeigen", |
| | | "settings.showMenuBarIcon": "Menüleistensymbol anzeigen", |
| | | "settings.appListStyle": "App-Listenstil:", |
| | | "settings.flat": "Flach", |
| | | "settings.container": "Farbloser Container", |
| | |
| | | "settings.about": "About", |
| | | "settings.launchAtLogin": "Launch at login", |
| | | "settings.showInDock": "Show in Dock", |
| | | "settings.showMenuBarIcon": "Show menu bar icon", |
| | | "settings.appListStyle": "App list style:", |
| | | "settings.flat": "Flat", |
| | | "settings.container": "Colorless Container", |
| | |
| | | "settings.about": "Acerca de", |
| | | "settings.launchAtLogin": "Iniciar al iniciar sesión", |
| | | "settings.showInDock": "Mostrar en el Dock", |
| | | "settings.showMenuBarIcon": "Mostrar icono en la barra de menús", |
| | | "settings.appListStyle": "Estilo de lista de apps:", |
| | | "settings.flat": "Plano", |
| | | "settings.container": "Contenedor sin color", |
| | |
| | | "settings.about": "À propos", |
| | | "settings.launchAtLogin": "Lancer à l'ouverture de session", |
| | | "settings.showInDock": "Afficher dans le Dock", |
| | | "settings.showMenuBarIcon": "Afficher l’icône de la barre des menus", |
| | | "settings.appListStyle": "Style de liste d'applications :", |
| | | "settings.flat": "Liste", |
| | | "settings.container": "Conteneur sans couleur", |
| | |
| | | "settings.about": "Tentang", |
| | | "settings.launchAtLogin": "Mulai saat masuk", |
| | | "settings.showInDock": "Tampilkan di Dock", |
| | | "settings.showMenuBarIcon": "Tampilkan ikon bilah menu", |
| | | "settings.appListStyle": "Gaya daftar app:", |
| | | "settings.flat": "Datar", |
| | | "settings.container": "Kontainer tanpa warna", |
| | |
| | | "settings.about": "Informazioni", |
| | | "settings.launchAtLogin": "Avvia al login", |
| | | "settings.showInDock": "Mostra nel Dock", |
| | | "settings.showMenuBarIcon": "Mostra icona nella barra dei menu", |
| | | "settings.appListStyle": "Stile elenco app:", |
| | | "settings.flat": "Elenco", |
| | | "settings.container": "Contenitore senza colore", |
| | |
| | | "settings.about": "概要", |
| | | "settings.launchAtLogin": "ログイン時に起動", |
| | | "settings.showInDock": "Dockに表示", |
| | | "settings.showMenuBarIcon": "メニューバーアイコンを表示", |
| | | "settings.appListStyle": "アプリ一覧スタイル:", |
| | | "settings.flat": "フラット", |
| | | "settings.container": "無色コンテナ", |
| | |
| | | "settings.about": "정보", |
| | | "settings.launchAtLogin": "로그인 시 시작", |
| | | "settings.showInDock": "Dock에 표시", |
| | | "settings.showMenuBarIcon": "메뉴 막대 아이콘 표시", |
| | | "settings.appListStyle": "앱 목록 스타일:", |
| | | "settings.flat": "플랫", |
| | | "settings.container": "무색 컨테이너", |
| | |
| | | "settings.about": "Tentang", |
| | | "settings.launchAtLogin": "Mula semasa log masuk", |
| | | "settings.showInDock": "Tunjukkan dalam Dock", |
| | | "settings.showMenuBarIcon": "Tunjukkan ikon bar menu", |
| | | "settings.appListStyle": "Gaya senarai app:", |
| | | "settings.flat": "Datar", |
| | | "settings.container": "Kontainer tanpa warna", |
| | |
| | | "settings.about": "Om", |
| | | "settings.launchAtLogin": "Start ved innlogging", |
| | | "settings.showInDock": "Vis i Dock", |
| | | "settings.showMenuBarIcon": "Vis menylinjeikon", |
| | | "settings.appListStyle": "App-listestil:", |
| | | "settings.flat": "Flat", |
| | | "settings.container": "Fargeløs beholder", |
| | |
| | | "settings.about": "Over", |
| | | "settings.launchAtLogin": "Start bij inloggen", |
| | | "settings.showInDock": "Toon in Dock", |
| | | "settings.showMenuBarIcon": "Toon menubalkicoon", |
| | | "settings.appListStyle": "App-lijststijl:", |
| | | "settings.flat": "Plat", |
| | | "settings.container": "Kleurloze container", |
| | |
| | | "settings.about": "Om", |
| | | "settings.launchAtLogin": "Start ved innlogging", |
| | | "settings.showInDock": "Vis i Dock", |
| | | "settings.showMenuBarIcon": "Vis menylinjeikon", |
| | | "settings.appListStyle": "App-listestil:", |
| | | "settings.flat": "Flat", |
| | | "settings.container": "Fargeløs beholder", |
| | |
| | | "settings.about": "Om", |
| | | "settings.launchAtLogin": "Start ved innlogging", |
| | | "settings.showInDock": "Vis i Dock", |
| | | "settings.showMenuBarIcon": "Vis menylinjeikon", |
| | | "settings.appListStyle": "App-listestil:", |
| | | "settings.flat": "Flat", |
| | | "settings.container": "Fargeløs beholder", |
| | |
| | | "settings.about": "O aplikacji", |
| | | "settings.launchAtLogin": "Uruchamiaj przy logowaniu", |
| | | "settings.showInDock": "Pokaż w Docku", |
| | | "settings.showMenuBarIcon": "Pokaż ikonę na pasku menu", |
| | | "settings.appListStyle": "Styl listy aplikacji:", |
| | | "settings.flat": "Płaski", |
| | | "settings.container": "Bezbarwny kontener", |
| | |
| | | "settings.about": "Sobre", |
| | | "settings.launchAtLogin": "Iniciar ao fazer login", |
| | | "settings.showInDock": "Mostrar no Dock", |
| | | "settings.showMenuBarIcon": "Mostrar ícone na barra de menus", |
| | | "settings.appListStyle": "Estilo da lista de apps:", |
| | | "settings.flat": "Plano", |
| | | "settings.container": "Contêiner sem cor", |
| | |
| | | "settings.about": "Despre", |
| | | "settings.launchAtLogin": "Pornește la autentificare", |
| | | "settings.showInDock": "Afișează în Dock", |
| | | "settings.showMenuBarIcon": "Afișează pictograma în bara de meniu", |
| | | "settings.appListStyle": "Stil listă aplicații:", |
| | | "settings.flat": "Plat", |
| | | "settings.container": "Container fără culoare", |
| | |
| | | "settings.about": "О программе", |
| | | "settings.launchAtLogin": "Запускать при входе", |
| | | "settings.showInDock": "Показывать в Dock", |
| | | "settings.showMenuBarIcon": "Показывать значок в строке меню", |
| | | "settings.appListStyle": "Стиль списка приложений:", |
| | | "settings.flat": "Плоский", |
| | | "settings.container": "Бесцветный контейнер", |
| | |
| | | "settings.about": "О програму", |
| | | "settings.launchAtLogin": "Покрени при пријављивању", |
| | | "settings.showInDock": "Прикажи у Dock-у", |
| | | "settings.showMenuBarIcon": "Прикажи икону у траци менија", |
| | | "settings.appListStyle": "Стил листе апликација:", |
| | | "settings.flat": "Равно", |
| | | "settings.container": "Безбојни контејнер", |
| | |
| | | "settings.about": "Om", |
| | | "settings.launchAtLogin": "Starta vid inloggning", |
| | | "settings.showInDock": "Visa i Dock", |
| | | "settings.showMenuBarIcon": "Visa ikon i menyraden", |
| | | "settings.appListStyle": "Applistestil:", |
| | | "settings.flat": "Platt", |
| | | "settings.container": "Färglös behållare", |
| | |
| | | "settings.about": "เกี่ยวกับ", |
| | | "settings.launchAtLogin": "เปิดเมื่อเข้าสู่ระบบ", |
| | | "settings.showInDock": "แสดงใน Dock", |
| | | "settings.showMenuBarIcon": "แสดงไอคอนในแถบเมนู", |
| | | "settings.appListStyle": "รูปแบบรายการแอป:", |
| | | "settings.flat": "แบน", |
| | | "settings.container": "คอนเทนเนอร์ไม่มีสี", |
| | |
| | | "settings.about": "Hakkında", |
| | | "settings.launchAtLogin": "Girişte başlat", |
| | | "settings.showInDock": "Dock’ta göster", |
| | | "settings.showMenuBarIcon": "Menü çubuğu simgesini göster", |
| | | "settings.appListStyle": "Uygulama listesi stili:", |
| | | "settings.flat": "Düz", |
| | | "settings.container": "Renksiz Kapsayıcı", |
| | |
| | | "settings.about": "Про програму", |
| | | "settings.launchAtLogin": "Запускати під час входу", |
| | | "settings.showInDock": "Показувати в Dock", |
| | | "settings.showMenuBarIcon": "Показувати значок у рядку меню", |
| | | "settings.appListStyle": "Стиль списку застосунків:", |
| | | "settings.flat": "Плоский", |
| | | "settings.container": "Безбарвний контейнер", |
| | |
| | | "settings.about": "Giới thiệu", |
| | | "settings.launchAtLogin": "Khởi động khi đăng nhập", |
| | | "settings.showInDock": "Hiển thị trong Dock", |
| | | "settings.showMenuBarIcon": "Hiển thị biểu tượng trên thanh menu", |
| | | "settings.appListStyle": "Kiểu danh sách ứng dụng:", |
| | | "settings.flat": "Phẳng", |
| | | "settings.container": "Vùng chứa không màu", |
| | |
| | | "settings.about": "关于", |
| | | "settings.launchAtLogin": "登录时启动", |
| | | "settings.showInDock": "在 Dock 中显示", |
| | | "settings.showMenuBarIcon": "显示菜单栏图标", |
| | | "settings.appListStyle": "应用列表样式:", |
| | | "settings.flat": "平铺", |
| | | "settings.container": "无色容器", |
| | |
| | | "settings.about": "關於", |
| | | "settings.launchAtLogin": "登入時啟動", |
| | | "settings.showInDock": "在 Dock 中顯示", |
| | | "settings.showMenuBarIcon": "顯示選單列圖示", |
| | | "settings.appListStyle": "應用程式列表樣式:", |
| | | "settings.flat": "平鋪", |
| | | "settings.container": "無色容器", |