From b4517c7601bffaa9102622be2f5f29adde88d3ed Mon Sep 17 00:00:00 2001 From: Felipe Giacomini Cocco Date: Tue, 3 Feb 2026 17:21:29 -0300 Subject: [PATCH 01/26] Updates branche to the most recent upstream version --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 34a62cb..9082292 100644 --- a/.gitignore +++ b/.gitignore @@ -121,6 +121,7 @@ integration.json # GitHub instructions and agent files # .github/instructions/ +.github/assets/ rough_note.md Solid SettingsView.swift.md @@ -156,4 +157,4 @@ mew-notch/ /References/ /builds/ -/appdmg.json \ No newline at end of file +/appdmg.json From 846f4787be8a8d649303033ef2d733acaf51f0df Mon Sep 17 00:00:00 2001 From: Felipe Giacomini Cocco Date: Tue, 3 Feb 2026 17:37:22 -0300 Subject: [PATCH 02/26] Add localization support for sidebar --- .../components/Settings/SettingsView.swift | 40 +++++++++---------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/DynamicIsland/components/Settings/SettingsView.swift b/DynamicIsland/components/Settings/SettingsView.swift index bd1a815..90683ab 100644 --- a/DynamicIsland/components/Settings/SettingsView.swift +++ b/DynamicIsland/components/Settings/SettingsView.swift @@ -43,26 +43,26 @@ private enum SettingsTab: String, CaseIterable, Identifiable { var title: String { switch self { - case .general: return "General" - case .liveActivities: return "Live Activities" - case .appearance: return "Appearance" - case .lockScreen: return "Lock Screen" - case .media: return "Media" - case .devices: return "Devices" - case .extensions: return "Extensions" - case .timer: return "Timer" - case .calendar: return "Calendar" - case .hudAndOSD: return "Controls" - case .battery: return "Battery" - case .stats: return "Stats" - case .clipboard: return "Clipboard" - case .screenAssistant: return "Screen Assistant" - case .colorPicker: return "Color Picker" - case .downloads: return "Downloads" - case .shelf: return "Shelf" - case .shortcuts: return "Shortcuts" - case .notes: return "Notes" - case .about: return "About" + case .general: return String(localized: "General") + case .liveActivities: return String(localized: "Live Activities") + case .appearance: return String(localized: "Appearance") + case .lockScreen: return String(localized: "Lock Screen") + case .media: return String(localized: "Media") + case .devices: return String(localized: "Devices") + case .extensions: return String(localized: "Extensions") + case .timer: return String(localized: "Timer") + case .calendar: return String(localized: "Calendar") + case .hudAndOSD: return String(localized: "Controls") + case .battery: return String(localized: "Battery") + case .stats: return String(localized: "Stats") + case .clipboard: return String(localized: "Clipboard") + case .screenAssistant: return String(localized: "Screen Assistant") + case .colorPicker: return String(localized: "Color Picker") + case .downloads: return String(localized: "Downloads") + case .shelf: return String(localized: "Shelf") + case .shortcuts: return String(localized: "Shortcuts") + case .notes: return String(localized: "Notes") + case .about: return String(localized: "About") } } From bc0db3fcc439f526422633625c318e41c573ec53 Mon Sep 17 00:00:00 2001 From: Felipe Giacomini Cocco Date: Tue, 3 Feb 2026 18:56:32 -0300 Subject: [PATCH 03/26] feat(localization): wrap search index titles and keywords in String(localized:) This is required to force Xcode's String Catalog to recognize these strings for translation, enabling localization for the settings search feature. --- DynamicIsland/Localizable.xcstrings | 492 +++++++++++++++++- .../components/Settings/SettingsView.swift | 137 +++-- 2 files changed, 570 insertions(+), 59 deletions(-) diff --git a/DynamicIsland/Localizable.xcstrings b/DynamicIsland/Localizable.xcstrings index b9a4d48..ff54730 100644 --- a/DynamicIsland/Localizable.xcstrings +++ b/DynamicIsland/Localizable.xcstrings @@ -2320,7 +2320,14 @@ } }, "Add icon" : { - + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Adicionar ícone" + } + } + } }, "Add manually" : { "extractionState" : "stale", @@ -3894,6 +3901,26 @@ } } }, + "auto open" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "abrir automaticamente" + } + } + } + }, + "auto switch" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "trocar automaticamente" + } + } + } + }, "Auto-scroll to next event" : { "comment" : "A toggle that enables or disables the automatic scrolling to the next event in the calendar view.", "isCommentAutoGenerated" : true, @@ -4106,6 +4133,26 @@ } } }, + "Automatically switch displays" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Trocar automaticamente as telas" + } + } + } + }, + "autostart" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Iiício automático" + } + } + } + }, "Averages" : { "comment" : "A label displayed above the average usage and last update information for a GPU.", "isCommentAutoGenerated" : true, @@ -4938,7 +4985,8 @@ "value" : "Achetez-nous un café" } } - } + }, + "shouldTranslate" : false }, "Calendar" : { "localizations" : { @@ -6424,6 +6472,16 @@ } } }, + "close" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "fechar" + } + } + } + }, "Close" : { "localizations" : { "ar" : { @@ -6540,6 +6598,16 @@ } } }, + "Close gesture" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Gesto de fechar" + } + } + } + }, "Collect the latest crash report to share with the developer when reporting lock screen or overlay issues." : { "comment" : "A footer for the \"Diagnostics\" section of the lock screen settings.", "isCommentAutoGenerated" : true, @@ -7299,6 +7367,9 @@ } } }, + "cursor" : { + "shouldTranslate" : false + }, "Custom" : { "extractionState" : "stale", "localizations" : { @@ -8423,7 +8494,14 @@ } }, "Disable Minimalistic UI to configure the standard notch media controls." : { - + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Desatile a interface do usuário minimalista para configurar os controles de mídia no notch padrão." + } + } + } }, "Disabled" : { "localizations" : { @@ -8569,6 +8647,16 @@ } } }, + "display height" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "altura da tela" + } + } + } + }, "Display Mode" : { "localizations" : { "fr" : { @@ -8596,6 +8684,16 @@ } } }, + "displays" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "telas" + } + } + } + }, "Displays a HUD notification when Bluetooth audio devices (headphones, AirPods, speakers) connect, showing device name and battery level." : { "comment" : "A footer for the \"Bluetooth Audio Devices\" section in the HUD settings.", "isCommentAutoGenerated" : true, @@ -8646,7 +8744,15 @@ }, "Donate" : { "comment" : "A button label that says \"Donate\".", - "isCommentAutoGenerated" : true + "isCommentAutoGenerated" : true, + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Doar" + } + } + } }, "Done" : { "comment" : "A button label that indicates that the user has finished editing a note.", @@ -8967,7 +9073,14 @@ } }, "Drop a PNG, JPEG, TIFF, or ICNS file to add it to your icon library." : { - + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Arraste um arquivo PNG, JPEG, TIFF, or ICNS para adiciona-lo ia sua biblioteca de ícones." + } + } + } }, "Drop files here" : { "localizations" : { @@ -9082,7 +9195,14 @@ } }, "Dynamic Island Visibility" : { - + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Visibilidade da Dynamic Islan" + } + } + } }, "dynamic.island" : { "localizations" : { @@ -9536,7 +9656,14 @@ } }, "Enable Dynamic Island media controls to manage the lock screen panel." : { - + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ative os controles de mídia Dynamic Island para gerenciar o painel da tela de bloqueio." + } + } + } }, "Enable extensions to allow third-party apps to display live activities and lock screen widgets in Atoll." : { "comment" : "A footer text that explains the purpose of enabling extensions.", @@ -9550,6 +9677,16 @@ } } }, + "Enable gestures" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Habilitar gestos" + } + } + } + }, "Enable global keyboard shortcuts above to customize your shortcuts." : { "localizations" : { "pt-BR" : { @@ -9573,7 +9710,6 @@ } }, "Enable haptics" : { - "extractionState" : "stale", "localizations" : { "ar" : { "stringUnit" : { @@ -9786,6 +9922,16 @@ } } }, + "Enable Minimalistic UI" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Habilitar UI Minimalista" + } + } + } + }, "Enable music live activity" : { "localizations" : { "ar" : { @@ -10483,6 +10629,16 @@ } } }, + "Extend hover area" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Expandir a área de hover" + } + } + } + }, "Extension tab unavailable" : { "comment" : "A message displayed when the extension tab is not available.", "isCommentAutoGenerated" : true, @@ -10613,6 +10769,9 @@ } } }, + "feedback" : { + "shouldTranslate" : false + }, "Files dropped on the shelf will be shared via this service" : { "comment" : "A description below the currently selected quick share provider, explaining that files dropped on the shelf will be shared via that provider.", "isCommentAutoGenerated" : true, @@ -10845,6 +11004,16 @@ } } }, + "general" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Geral" + } + } + } + }, "General" : { "localizations" : { "ar" : { @@ -11157,6 +11326,16 @@ } } }, + "gestures" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "gestos" + } + } + } + }, "Get started" : { "localizations" : { "ar" : { @@ -11628,6 +11807,16 @@ } } }, + "haptic" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "tátil" + } + } + } + }, "Height:" : { "extractionState" : "stale", "localizations" : { @@ -11695,6 +11884,16 @@ } } }, + "Hide Dynamic Island during screenshots & recordings" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ocultar Dynamic Island durante capturas de tela e gravações" + } + } + } + }, "Hide DynamicIsland Options" : { "localizations" : { "fr" : { @@ -12050,6 +12249,19 @@ }, "shouldTranslate" : false }, + "hover" : { + "shouldTranslate" : false + }, + "hover to open" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "hover para abrir" + } + } + } + }, "https://example.com/animation.json" : { "comment" : "A placeholder text for a Lottie JSON URL input field.", "isCommentAutoGenerated" : true, @@ -12376,6 +12588,16 @@ }, "shouldTranslate" : false }, + "icon" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "ícone" + } + } + } + }, "Icon & Progress Color" : { "comment" : "A picker that lets users choose the color scheme for the icon and progress bar in the OSD.", "isCommentAutoGenerated" : true, @@ -13050,6 +13272,16 @@ } } }, + "Launch at login" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Iniciar no login" + } + } + } + }, "Layout" : { "comment" : "A label for the segment control that lets the user choose the layout of the weather widget.", "isCommentAutoGenerated" : true, @@ -13808,7 +14040,7 @@ "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Corresponder à altura da barra de menu" + "value" : "Corresponder à altura da barra de menus" } }, "ru" : { @@ -14054,6 +14286,16 @@ } } }, + "media" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "mídia" + } + } + } + }, "Media" : { "localizations" : { "ar" : { @@ -14156,7 +14398,6 @@ }, "Media change with horizontal gestures" : { "comment" : "A toggle that lets the user enable or disable the feature of changing the currently playing media using horizontal gestures.", - "extractionState" : "stale", "isCommentAutoGenerated" : true, "localizations" : { "ar" : { @@ -14227,8 +14468,8 @@ }, "pt-BR" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Media change with horizontal gestures" + "state" : "translated", + "value" : "Mudar a mídia com gestos horizontais" } }, "ru" : { @@ -14820,8 +15061,27 @@ } } }, + "menu bar" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "barra de menu" + } + } + } + }, + "menu bar size" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "tamanho da menu bar" + } + } + } + }, "Menubar icon" : { - "extractionState" : "stale", "localizations" : { "ar" : { "stringUnit" : { @@ -14891,8 +15151,8 @@ }, "pt-BR" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Menubar icon" + "state" : "translated", + "value" : "ícone da barra de menus" } }, "ru" : { @@ -15132,6 +15392,16 @@ } } }, + "minimalistic" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "minimaalista" + } + } + } + }, "Minimalistic mode focuses on media controls and system HUDs, hiding all extra features for a clean, focused experience. Automatically enables simpler animations." : { "localizations" : { "pt-BR" : { @@ -17692,6 +17962,16 @@ } } }, + "open" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "abrir" + } + } + } + }, "Open Google AI Studio" : { "localizations" : { "pt-BR" : { @@ -17724,6 +18004,16 @@ } } }, + "Open notch on hover" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Abrir notch com hover" + } + } + } + }, "Open System Settings" : { "localizations" : { "pt-BR" : { @@ -17960,6 +18250,16 @@ } } }, + "pinch" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "pinça" + } + } + } + }, "Pinned Items" : { "localizations" : { "pt-BR" : { @@ -18222,6 +18522,16 @@ } } }, + "privacy" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "privacidade" + } + } + } + }, "Privacy Indicators" : { "comment" : "A heading for the section that lists privacy indicators.", "isCommentAutoGenerated" : true, @@ -18707,6 +19017,16 @@ } } }, + "recording" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "gravação" + } + } + } + }, "Recording" : { "localizations" : { "fr" : { @@ -19030,7 +19350,14 @@ } }, "Remove selected" : { - + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Remover selecionado" + } + } + } }, "Request Access" : { "localizations" : { @@ -19347,6 +19674,46 @@ } } }, + "reverse" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "inverter" + } + } + } + }, + "Reverse open/close scroll gestures" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Inverter gestos de abrir/fechar com scroll" + } + } + } + }, + "Reverse scroll gestures" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Inverter gestos de rolagem" + } + } + } + }, + "Reverse swipe gestures" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Inverter gestos de arrastar" + } + } + } + }, "Revoke Access" : { "comment" : "A button that revokes access to an app.", "isCommentAutoGenerated" : true, @@ -19638,6 +20005,16 @@ } } }, + "screenshot" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "captura de tela" + } + } + } + }, "Screenshot options" : { "localizations" : { "fr" : { @@ -19670,6 +20047,9 @@ } } }, + "scroll" : { + "shouldTranslate" : false + }, "Scroll" : { "comment" : "A hint text that appears when scrolling horizontally in the control palette.", "isCommentAutoGenerated" : true, @@ -21957,10 +22337,24 @@ } }, "Standard notch media controls are hidden while this toggle is off." : { - + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Os controles de mídia no notch padrão estão ocultos enquanto esta opção está desligada." + } + } + } }, "Standard notch media controls are hidden. Re-enable the toggle above to restore them." : { - + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Os controles de mídia no notch padrão estão ocultos. Reative a opção acima para restaurá-los." + } + } + } }, "Start" : { "localizations" : { @@ -22102,6 +22496,16 @@ } } }, + "startup" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "inicializar" + } + } + } + }, "Stats" : { "localizations" : { "fr" : { @@ -22216,6 +22620,16 @@ } } }, + "status bar" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "barra de status" + } + } + } + }, "Status:" : { "comment" : "A label for the status of an extension.", "isCommentAutoGenerated" : true, @@ -22539,6 +22953,16 @@ } } }, + "swipe" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "arrastar" + } + } + } + }, "System" : { "comment" : "A label displayed above the system, load average, and uptime information.", "isCommentAutoGenerated" : true, @@ -22698,7 +23122,14 @@ "shouldTranslate" : false }, "These controls mirror the Lock Screen tab so you can tune the media overlay while focusing on playback settings." : { - + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Esses controles espelham a aba da Tela de Bloqueio para que você possa ajustar a sobreposição de mídia enquanto se concentra nas configurações de reprodução." + } + } + } }, "These controls sit beside the notch while a timer runs. They require the timer name to stay hidden for spacing." : { "localizations" : { @@ -23292,6 +23723,9 @@ }, "shouldTranslate" : false }, + "trackpad" : { + "shouldTranslate" : false + }, "Transform" : { "extractionState" : "stale", "localizations" : { @@ -23472,6 +23906,16 @@ } } }, + "ui mode" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Modo UI" + } + } + } + }, "UI Mode" : { "localizations" : { "fr" : { @@ -25165,7 +25609,15 @@ }, "Your support funds software development learning for students in 9th–12th grade." : { "comment" : "A footer note explaining the app's funding.", - "isCommentAutoGenerated" : true + "isCommentAutoGenerated" : true, + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Seu apoio financia o aprendizado de desenvolvimento de software para alunos do 9º ao 12º ano." + } + } + } }, "YouTube Music requires this third-party app to be installed: " : { "localizations" : { diff --git a/DynamicIsland/components/Settings/SettingsView.swift b/DynamicIsland/components/Settings/SettingsView.swift index 90683ab..3d5f4aa 100644 --- a/DynamicIsland/components/Settings/SettingsView.swift +++ b/DynamicIsland/components/Settings/SettingsView.swift @@ -592,32 +592,91 @@ struct SettingsView: View { private var settingsSearchIndex: [SettingsSearchEntry] { [ // General - SettingsSearchEntry(tab: .general, title: "Enable Minimalistic UI", keywords: ["minimalistic", "ui mode", "general"], highlightID: SettingsTab.general.highlightID(for: "Enable Minimalistic UI")), - SettingsSearchEntry(tab: .general, title: "Menubar icon", keywords: ["menu bar", "status bar", "icon"], highlightID: SettingsTab.general.highlightID(for: "Menubar icon")), - SettingsSearchEntry(tab: .general, title: "Launch at login", keywords: ["autostart", "startup"], highlightID: SettingsTab.general.highlightID(for: "Launch at login")), + SettingsSearchEntry( + tab: .general, + title: String(localized: "Enable Minimalistic UI"), + keywords: [ String(localized: "minimalistic"), String(localized: "ui mode"), String(localized: "general") ], + highlightID: SettingsTab.general.highlightID(for: "Enable Minimalistic UI") + ), + SettingsSearchEntry( + tab: .general, + title: String(localized:"Menubar icon"), + keywords: [ String(localized:"menu bar"), String(localized:"status bar"), String(localized:"icon") ], + highlightID: SettingsTab.general.highlightID(for: "Menubar icon") + ), + SettingsSearchEntry( + tab: .general, + title: String(localized:"Launch at login"), + keywords: [ String(localized:"autostart"), String(localized:"startup")], + highlightID: SettingsTab.general.highlightID(for: "Launch at login") + ), SettingsSearchEntry(tab: .general, title: "Show on all displays", keywords: ["multi-display", "external monitor"], highlightID: SettingsTab.general.highlightID(for: "Show on all displays")), - SettingsSearchEntry(tab: .general, title: "Show on a specific display", keywords: ["preferred screen", "display picker"], highlightID: SettingsTab.general.highlightID(for: "Show on a specific display")), - SettingsSearchEntry(tab: .general, title: "Automatically switch displays", keywords: ["auto switch", "displays"], highlightID: SettingsTab.general.highlightID(for: "Automatically switch displays")), - SettingsSearchEntry(tab: .general, title: "Hide Dynamic Island during screenshots & recordings", keywords: ["privacy", "screenshot", "recording"], highlightID: SettingsTab.general.highlightID(for: "Hide Dynamic Island during screenshots & recordings")), - SettingsSearchEntry(tab: .general, title: "Enable gestures", keywords: ["gestures", "trackpad"], highlightID: SettingsTab.general.highlightID(for: "Enable gestures")), - SettingsSearchEntry(tab: .general, title: "Close gesture", keywords: ["pinch", "swipe"], highlightID: SettingsTab.general.highlightID(for: "Close gesture")), - SettingsSearchEntry(tab: .general, title: "Reverse swipe gestures", keywords: ["reverse", "swipe", "media"], highlightID: SettingsTab.general.highlightID(for: "Reverse swipe gestures")), - SettingsSearchEntry(tab: .general, title: "Reverse scroll gestures", keywords: ["reverse", "scroll", "open", "close"], highlightID: SettingsTab.general.highlightID(for: "Reverse scroll gestures")), - SettingsSearchEntry(tab: .general, title: "Extend hover area", keywords: ["hover", "cursor"], highlightID: SettingsTab.general.highlightID(for: "Extend hover area")), - SettingsSearchEntry(tab: .general, title: "Enable haptics", keywords: ["haptic", "feedback"], highlightID: SettingsTab.general.highlightID(for: "Enable haptics")), - SettingsSearchEntry(tab: .general, title: "Open notch on hover", keywords: ["hover to open", "auto open"], highlightID: SettingsTab.general.highlightID(for: "Open notch on hover")), - SettingsSearchEntry(tab: .general, title: "Notch display height", keywords: ["display height", "menu bar size"], highlightID: SettingsTab.general.highlightID(for: "Notch display height")), - - // Live Activities - SettingsSearchEntry(tab: .liveActivities, title: "Enable Screen Recording Detection", keywords: ["screen recording", "indicator"], highlightID: SettingsTab.liveActivities.highlightID(for: "Enable Screen Recording Detection")), - SettingsSearchEntry(tab: .liveActivities, title: "Show Recording Indicator", keywords: ["recording indicator", "red dot"], highlightID: SettingsTab.liveActivities.highlightID(for: "Show Recording Indicator")), - SettingsSearchEntry(tab: .liveActivities, title: "Enable Focus Detection", keywords: ["focus", "do not disturb", "dnd"], highlightID: SettingsTab.liveActivities.highlightID(for: "Enable Focus Detection")), - SettingsSearchEntry(tab: .liveActivities, title: "Show Focus Indicator", keywords: ["focus icon", "moon"], highlightID: SettingsTab.liveActivities.highlightID(for: "Show Focus Indicator")), - SettingsSearchEntry(tab: .liveActivities, title: "Show Focus Label", keywords: ["focus label", "text"], highlightID: SettingsTab.liveActivities.highlightID(for: "Show Focus Label")), - SettingsSearchEntry(tab: .liveActivities, title: "Enable Camera Detection", keywords: ["camera", "privacy indicator"], highlightID: SettingsTab.liveActivities.highlightID(for: "Enable Camera Detection")), - SettingsSearchEntry(tab: .liveActivities, title: "Enable Microphone Detection", keywords: ["microphone", "privacy"], highlightID: SettingsTab.liveActivities.highlightID(for: "Enable Microphone Detection")), - SettingsSearchEntry(tab: .liveActivities, title: "Enable music live activity", keywords: ["music", "now playing"], highlightID: SettingsTab.liveActivities.highlightID(for: "Enable music live activity")), - SettingsSearchEntry(tab: .liveActivities, title: "Enable reminder live activity", keywords: ["reminder", "live activity"], highlightID: SettingsTab.liveActivities.highlightID(for: "Enable reminder live activity")), + SettingsSearchEntry( + tab: .general, + title: "Show on a specific display", + keywords: ["preferred screen", "display picker"], + highlightID: SettingsTab.general.highlightID(for: "Show on a specific display") + ), + SettingsSearchEntry( + tab: .general, + title: String(localized:"Automatically switch displays"), + keywords: [String(localized:"auto switch"), String(localized:"displays")], + highlightID: SettingsTab.general.highlightID(for: "Automatically switch displays") + ), + SettingsSearchEntry( + tab: .general, + title: String(localized:"Hide Dynamic Island during screenshots & recordings"), + keywords: [String(localized:"privacy"), String(localized:"screenshot"), String(localized:"recording")], + highlightID: SettingsTab.general.highlightID(for: "Hide Dynamic Island during screenshots & recordings") + ), + SettingsSearchEntry( + tab: .general, + title: String(localized: "Enable gestures"), + keywords: [String(localized: "gestures"), String(localized: "trackpad")], + highlightID: SettingsTab.general.highlightID(for: "Enable gestures") + ), + SettingsSearchEntry( + tab: .general, + title: String(localized: "Close gesture"), + keywords: [String(localized: "pinch"), String(localized: "swipe")], + highlightID: SettingsTab.general.highlightID(for: "Close gesture") + ), + SettingsSearchEntry( + tab: .general, + title: String(localized: "Reverse swipe gestures"), + keywords: [String(localized: "reverse"), String(localized: "swipe"), String(localized: "media")], + highlightID: SettingsTab.general.highlightID(for: "Reverse swipe gestures") + ), + SettingsSearchEntry( + tab: .general, + title: String(localized: "Reverse scroll gestures"), + keywords: [String(localized: "reverse"), String(localized: "scroll"), String(localized: "open"), String(localized: "close")], + highlightID: SettingsTab.general.highlightID(for: "Reverse scroll gestures") + ), + SettingsSearchEntry( + tab: .general, + title: String(localized: "Extend hover area"), + keywords: [String(localized: "hover"), String(localized: "cursor")], + highlightID: SettingsTab.general.highlightID(for: "Extend hover area") + ), + SettingsSearchEntry( + tab: .general, + title: String(localized: "Enable haptics"), + keywords: [String(localized: "haptic"), String(localized: "feedback")], + highlightID: SettingsTab.general.highlightID(for: "Enable haptics") + ), + SettingsSearchEntry( + tab: .general, + title: String(localized: "Open notch on hover"), + keywords: [String(localized: "hover to open"), String(localized: "auto open")], + highlightID: SettingsTab.general.highlightID(for: "Open notch on hover") + ), + SettingsSearchEntry( + tab: .general, + title: String(localized: "Notch display height"), + keywords: [String(localized: "display height"), String(localized: "menu bar size")], + highlightID: SettingsTab.general.highlightID(for: "Notch display height") + ), // Battery (Charge) SettingsSearchEntry(tab: .battery, title: "Show battery indicator", keywords: ["battery hud", "charge"], highlightID: SettingsTab.battery.highlightID(for: "Show battery indicator")), @@ -899,7 +958,7 @@ struct GeneralSettings: View { var body: some View { Form { Section { - Defaults.Toggle("Enable Minimalistic UI", key: .enableMinimalisticUI) + Defaults.Toggle(String(localized: "Enable Minimalistic UI"), key: .enableMinimalisticUI) .onChange(of: enableMinimalisticUI) { _, newValue in if newValue { // Auto-enable simpler animation mode @@ -914,9 +973,9 @@ struct GeneralSettings: View { } Section { - Defaults.Toggle("Menubar icon", key: .menubarIcon) - .settingsHighlight(id: highlightID("Menubar icon")) - LaunchAtLogin.Toggle("Launch at login") + Defaults.Toggle(String(localized:"Menubar icon"), key: .menubarIcon) + .settingsHighlight(id: highlightID("Menubar icon")); + LaunchAtLogin.Toggle(String(localized:"Launch at login")) .settingsHighlight(id: highlightID("Launch at login")) Defaults.Toggle(key: .showOnAllDisplays) { Text("Show on all displays") @@ -935,13 +994,13 @@ struct GeneralSettings: View { } .disabled(showOnAllDisplays) .settingsHighlight(id: highlightID("Show on a specific display")) - Defaults.Toggle("Automatically switch displays", key: .automaticallySwitchDisplay) + Defaults.Toggle(String(localized:"Automatically switch displays"), key: .automaticallySwitchDisplay) .onChange(of: automaticallySwitchDisplay) { NotificationCenter.default.post(name: Notification.Name.automaticallySwitchDisplayChanged, object: nil) } .disabled(showOnAllDisplays) .settingsHighlight(id: highlightID("Automatically switch displays")) - Defaults.Toggle("Hide Dynamic Island during screenshots & recordings", key: .hideDynamicIslandFromScreenCapture) + Defaults.Toggle(String(localized:"Hide Dynamic Island during screenshots & recordings"), key: .hideDynamicIslandFromScreenCapture) .settingsHighlight(id: highlightID("Hide Dynamic Island during screenshots & recordings")) } header: { Text("System features") @@ -1029,11 +1088,11 @@ struct GeneralSettings: View { @ViewBuilder func gestureControls() -> some View { Section { - Defaults.Toggle("Enable gestures", key: .enableGestures) + Defaults.Toggle(String(localized:"Enable gestures"), key: .enableGestures) .disabled(!openNotchOnHover) .settingsHighlight(id: highlightID("Enable gestures")) if enableGestures { - Defaults.Toggle("Media change with horizontal gestures", key: .enableHorizontalMusicGestures) + Defaults.Toggle(String(localized:"Media change with horizontal gestures"), key: .enableHorizontalMusicGestures) .settingsHighlight(id: highlightID("Horizontal media gestures")) if enableHorizontalMusicGestures { @@ -1050,11 +1109,11 @@ struct GeneralSettings: View { .font(.caption) .foregroundStyle(.secondary) - Defaults.Toggle("Reverse swipe gestures", key: .reverseSwipeGestures) + Defaults.Toggle(String(localized:"Reverse swipe gestures"), key: .reverseSwipeGestures) .settingsHighlight(id: highlightID("Reverse swipe gestures")) } - Defaults.Toggle("Close gesture", key: .closeGestureEnabled) + Defaults.Toggle(String(localized:"Close gesture"), key: .closeGestureEnabled) .settingsHighlight(id: highlightID("Close gesture")) Slider(value: $gestureSensitivity, in: 100...300, step: 100) { HStack { @@ -1065,7 +1124,7 @@ struct GeneralSettings: View { } } - Defaults.Toggle("Reverse open/close scroll gestures", key: .reverseScrollGestures) + Defaults.Toggle(String(localized:"Reverse open/close scroll gestures"), key: .reverseScrollGestures) .settingsHighlight(id: highlightID("Reverse scroll gestures")) } } header: { @@ -1084,11 +1143,11 @@ struct GeneralSettings: View { @ViewBuilder func NotchBehaviour() -> some View { Section { - Defaults.Toggle("Extend hover area", key: .extendHoverArea) + Defaults.Toggle(String(localized:"Extend hover area"), key: .extendHoverArea) .settingsHighlight(id: highlightID("Extend hover area")) - Defaults.Toggle("Enable haptics", key: .enableHaptics) + Defaults.Toggle(String(localized:"Enable haptics"), key: .enableHaptics) .settingsHighlight(id: highlightID("Enable haptics")) - Defaults.Toggle("Open notch on hover", key: .openNotchOnHover) + Defaults.Toggle(String(localized:"Open notch on hover"), key: .openNotchOnHover) .settingsHighlight(id: highlightID("Open notch on hover")) Toggle("Remember last tab", isOn: $coordinator.openLastTabByDefault) if openNotchOnHover { From 379c04e79a9063f164dd2ff9e5a8e6840ff90b9e Mon Sep 17 00:00:00 2001 From: Felipe Giacomini Cocco Date: Tue, 3 Feb 2026 19:05:16 -0300 Subject: [PATCH 04/26] feat: Add Portuguese (Brazil) translation (97%) --- DynamicIsland/Localizable.xcstrings | 2763 +-------------------------- 1 file changed, 10 insertions(+), 2753 deletions(-) diff --git a/DynamicIsland/Localizable.xcstrings b/DynamicIsland/Localizable.xcstrings index ff54730..f8c0e29 100644 --- a/DynamicIsland/Localizable.xcstrings +++ b/DynamicIsland/Localizable.xcstrings @@ -213,19 +213,6 @@ } } }, - "-%@" : { - "comment" : "A label displaying the duration of the current song. The argument is the duration of the song in seconds.", - "extractionState" : "stale", - "isCommentAutoGenerated" : true, - "localizations" : { - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "-%@" - } - } - } - }, "—" : { "comment" : "A placeholder text used when GPU usage is not available.", "isCommentAutoGenerated" : true, @@ -656,107 +643,6 @@ } } }, - "%@" : { - "extractionState" : "stale", - "localizations" : { - "ar" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "%@" - } - }, - "cs" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "%@" - } - }, - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "%@" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "%@" - } - }, - "en-GB" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "%@" - } - }, - "es" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "%@" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "%@" - } - }, - "hu" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "%@" - } - }, - "it" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "%@" - } - }, - "ko" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "%@" - } - }, - "pl" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "%@" - } - }, - "pt-BR" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "%@" - } - }, - "ru" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "%@" - } - }, - "tr" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "%@" - } - }, - "uk" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "%@" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "%@" - } - } - } - }, "%@ · %@" : { "comment" : "A secondary line of text that provides additional information about the air quality index, including its scale label and category name.", "isCommentAutoGenerated" : true, @@ -1493,17 +1379,6 @@ } } }, - "• Updated %@" : { - "extractionState" : "stale", - "localizations" : { - "fr" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "• Mis à jour %@" - } - } - } - }, "••••••••" : { "shouldTranslate" : false }, @@ -1538,17 +1413,6 @@ "isCommentAutoGenerated" : true, "shouldTranslate" : false }, - "1x" : { - "extractionState" : "stale", - "localizations" : { - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "1x" - } - } - } - }, "3 items" : { "localizations" : { "fr" : { @@ -1661,17 +1525,6 @@ } } }, - "20" : { - "extractionState" : "stale", - "localizations" : { - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "20" - } - } - } - }, "20 colors" : { "localizations" : { "fr" : { @@ -1688,17 +1541,6 @@ } } }, - "30" : { - "extractionState" : "stale", - "localizations" : { - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "30" - } - } - } - }, "100" : { "comment" : "The text displayed below a 100% battery level in the lock screen.", "isCommentAutoGenerated" : true, @@ -1815,107 +1657,6 @@ } } }, - "Accent color" : { - "extractionState" : "stale", - "localizations" : { - "ar" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Accent color" - } - }, - "cs" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Barva odstínu" - } - }, - "de" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Akzentfarbe" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Accent color" - } - }, - "en-GB" : { - "stringUnit" : { - "state" : "translated", - "value" : "Accent colour" - } - }, - "es" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Color de énfasis" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Couleur d'accentuation" - } - }, - "hu" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Accent color" - } - }, - "it" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Colore in rilievo" - } - }, - "ko" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "강조 색상" - } - }, - "pl" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Kolor akcentu" - } - }, - "pt-BR" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Cor de destaque" - } - }, - "ru" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Accent color" - } - }, - "tr" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Accent color" - } - }, - "uk" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Колір відтінку" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "首选颜色" - } - } - } - }, "Accent colour" : { "comment" : "A label describing the colour picker for the timer preset.", "isCommentAutoGenerated" : true, @@ -2054,57 +1795,6 @@ } } }, - "Activate" : { - "extractionState" : "stale", - "localizations" : { - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Activer" - } - }, - "pt-BR" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ativar" - } - } - } - }, - "Activate your license" : { - "extractionState" : "stale", - "localizations" : { - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Activer votre license" - } - }, - "pt-BR" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ativar sua licença" - } - } - } - }, - "Activation" : { - "extractionState" : "stale", - "localizations" : { - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Activation" - } - }, - "pt-BR" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ativação" - } - } - } - }, "Active" : { "localizations" : { "de" : { @@ -2329,107 +2019,6 @@ } } }, - "Add manually" : { - "extractionState" : "stale", - "localizations" : { - "ar" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Add manually" - } - }, - "cs" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Přidat manuálně" - } - }, - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Manuell hinzufügen" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Add manually" - } - }, - "en-GB" : { - "stringUnit" : { - "state" : "translated", - "value" : "Add manually" - } - }, - "es" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Añadir manualmente" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ajouter manuellement" - } - }, - "hu" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Add manually" - } - }, - "it" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Aggiungi manualmente" - } - }, - "ko" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "수동 추가" - } - }, - "pl" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Dodaj ręcznie" - } - }, - "pt-BR" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Adicionar manualmente" - } - }, - "ru" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Add manually" - } - }, - "tr" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Manuel ekle" - } - }, - "uk" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Додати вручну" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "手动添加" - } - } - } - }, "Add New" : { "comment" : "A label displayed below the button to add a new idle animation.", "isCommentAutoGenerated" : true, @@ -3455,23 +3044,6 @@ } } }, - "Animation" : { - "extractionState" : "stale", - "localizations" : { - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Animation" - } - }, - "pt-BR" : { - "stringUnit" : { - "state" : "translated", - "value" : "Animação" - } - } - } - }, "Animation Name" : { "comment" : "A label for the name input field in the URL import sheet.", "isCommentAutoGenerated" : true, @@ -3816,39 +3388,6 @@ }, "shouldTranslate" : false }, - "Atoll can show all your upcoming events in one place. Access to your calendar is needed to display your schedule." : { - "extractionState" : "stale", - "localizations" : { - "pt-BR" : { - "stringUnit" : { - "state" : "translated", - "value" : "O Atoll pode mostrar todos os seus próximos eventos em um só lugar. O acesso ao seu calendário é necessário para exibir sua agenda." - } - } - } - }, - "Atoll includes a mirror feature that lets you quickly check your appearance using your camera, right from the notch. Camera access is required only to show this live preview. You can turn the mirror feature on or off at any time in the app." : { - "extractionState" : "stale", - "localizations" : { - "pt-BR" : { - "stringUnit" : { - "state" : "translated", - "value" : "O Atoll possui um recurso de espelho que permite verificar rapidamente sua aparência usando sua câmera, direto do notch. O acesso à câmera é necessário apenas para mostrar esta visualização ao vivo. Você pode ligar ou desligar o recurso de espelho a qualquer momento no aplicativo." - } - } - } - }, - "Atoll needs Full Disk Access to read the system notification database. If Atoll does not appear in the list, use 'Reveal App in Finder' and drag it into the settings window." : { - "extractionState" : "stale", - "localizations" : { - "pt-BR" : { - "stringUnit" : { - "state" : "translated", - "value" : "O Atoll precisa de Acesso Completo ao Disco para ler o banco de dados de notificações do sistema. Se o Atoll não aparecer na lista, use ‘Mostrar aplicativo no Finder' e arraste-o para a janela de configurações." - } - } - } - }, "Attached Files" : { "localizations" : { "fr" : { @@ -4674,23 +4213,6 @@ "isCommentAutoGenerated" : true, "shouldTranslate" : false }, - "Blue dashed box shows actual size in Atoll" : { - "extractionState" : "stale", - "localizations" : { - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "La boîte bleue en pointillés affiche la taille actuelle dans la Atoll" - } - }, - "pt-BR" : { - "stringUnit" : { - "state" : "translated", - "value" : "A caixa tracelhada azul mostra o tamanho real no Atol" - } - } - } - }, "Blue outline matches the notch canvas" : { "comment" : "A tooltip explaining that the blue outline in the animation preview matches the notch on a device.", "isCommentAutoGenerated" : true, @@ -4838,29 +4360,6 @@ } } }, - "Both" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Both" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Les deux" - } - }, - "pt-BR" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ambos" - } - } - } - }, "Breakdown" : { "comment" : "A label displayed above the breakdown of memory usage.", "isCommentAutoGenerated" : true, @@ -4879,8 +4378,8 @@ }, "pt-BR" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Breakdown" + "state" : "translated", + "value" : "Detalhes" } } } @@ -4936,37 +4435,9 @@ } }, "pt-BR" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Built-in" - } - } - } - }, - "Built-in System Monitoring" : { - "extractionState" : "stale", - "localizations" : { - "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Système Intégré de Suivi" - } - } - } - }, - "Built-in system monitoring detects volume, brightness, and keyboard backlight changes directly without requiring external apps." : { - "extractionState" : "stale", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Die integrierte Systemüberwachung erkennt Änderungen der Lautstärke, Helligkeit und Tastaturbeleuchtung direkt, ohne dass externe Apps erforderlich sind." - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Le système intégré de suivi détecte les changements de volume, luminosité et éclairage du clavier sans l’aide d’applications externes." + "value" : "Integrada" } } } @@ -5088,107 +4559,6 @@ } } }, - "Calendar access is denied. Please enable it in System Settings." : { - "extractionState" : "stale", - "localizations" : { - "ar" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Calendar access is denied. Please enable it in System Settings." - } - }, - "cs" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Přístup do kalendáře byl odepřen. Prosím povolte jej v nastavení systému." - } - }, - "de" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Kalender Zugriff verweigert. Bitte aktiviere es in den Systemeinstellungen." - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Calendar access is denied. Please enable it in System Settings." - } - }, - "en-GB" : { - "stringUnit" : { - "state" : "translated", - "value" : "Calendar access is denied. Please enable it in System Settings." - } - }, - "es" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Acceso al calendario denegado. Por favor, habilítelo en Configuración del sistema." - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "L'accès au calendrier est refusé. Veuillez l’autoriser dans les réglages." - } - }, - "hu" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Calendar access is denied. Please enable it in System Settings." - } - }, - "it" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "L'accesso al calendario è negato. Si prega di abilitarlo nelle impostazioni di sistema." - } - }, - "ko" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "캘린더 권한 거부됨. 시스템 설정에서 허용해주세요.." - } - }, - "pl" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Dostęp do kalendarza został zablokowany. Proszę odblokować dostęp w Ustawieniach Systemowych." - } - }, - "pt-BR" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Acesso ao Calendário negado. Por favor, autorize nas Configurações do Sistema." - } - }, - "ru" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Calendar access is denied. Please enable it in System Settings." - } - }, - "tr" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Takvim erişimi reddedildi. Lütfen Sistem Ayarlarından aktifleştiriniz." - } - }, - "uk" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Доступ до календаря заборонений. Будь ласка, увімкніть його в Налаштуваннях Системи." - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "日历访问被拒绝。请在系统设置中启用它。" - } - } - } - }, "Calendar or Reminder access is denied. Please enable it in System Settings." : { "comment" : "A message displayed when a user has denied access to the calendar or reminders on their device. It instructs the user to open System Settings to grant access.", "isCommentAutoGenerated" : true, @@ -5420,29 +4790,6 @@ } } }, - "Center" : { - "extractionState" : "stale", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Mitte" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Centrer" - } - }, - "pt-BR" : { - "stringUnit" : { - "state" : "translated", - "value" : "Centro" - } - } - } - }, "Change" : { "localizations" : { "fr" : { @@ -5766,29 +5113,12 @@ "localizations" : { "pt-BR" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Cor do Chip" } } } }, - "Choose a custom sound file that will play when the timer completes. Supported formats: MP3, M4A, WAV, AIFF." : { - "extractionState" : "stale", - "localizations" : { - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Choisissez un son personnalisé lorsque le minuteur . Formats supportés : MP3, M4A, WAV, AIFF." - } - }, - "pt-BR" : { - "stringUnit" : { - "state" : "translated", - "value" : "Escolha um arquivo de som personalizado que será reproduzido quando o cronômetro for concluído. Formatos suportados: MP3, M4A, WAV, AIFF." - } - } - } - }, "Choose a Music Source" : { "localizations" : { "ar" : { @@ -6147,23 +5477,6 @@ } } }, - "Clear" : { - "extractionState" : "stale", - "localizations" : { - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Effacer" - } - }, - "pt-BR" : { - "stringUnit" : { - "state" : "translated", - "value" : "Limpar" - } - } - } - }, "Clear All Files" : { "localizations" : { "fr" : { @@ -6956,17 +6269,6 @@ } } }, - "Connected" : { - "extractionState" : "stale", - "localizations" : { - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Connecté" - } - } - } - }, "Continue" : { "localizations" : { "ar" : { @@ -7270,17 +6572,6 @@ } } }, - "Current custom timer:" : { - "extractionState" : "stale", - "localizations" : { - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Minuteur personnalisé actuel :" - } - } - } - }, "Current default:" : { "comment" : "A label displayed alongside the currently set default timer duration.", "isCommentAutoGenerated" : true, @@ -7370,34 +6661,6 @@ "cursor" : { "shouldTranslate" : false }, - "Custom" : { - "extractionState" : "stale", - "localizations" : { - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Personnalisé" - } - } - } - }, - "Custom color" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Custom color" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Couleur personnalisée" - } - } - } - }, "Custom height" : { "localizations" : { "ar" : { @@ -7760,17 +7023,6 @@ } } }, - "Custom Timer Duration" : { - "extractionState" : "stale", - "localizations" : { - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Durée du minuteur personnalisée" - } - } - } - }, "Custom vizualizers (Lottie)" : { "localizations" : { "ar" : { @@ -7841,7 +7093,7 @@ }, "pt-BR" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Vizualizadores personalizados (Lottie)" } }, @@ -8239,107 +7491,6 @@ } } }, - "Description" : { - "extractionState" : "stale", - "localizations" : { - "ar" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Description" - } - }, - "cs" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Popis" - } - }, - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Beschreibung" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Description" - } - }, - "en-GB" : { - "stringUnit" : { - "state" : "translated", - "value" : "Description" - } - }, - "es" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Descripción" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Description" - } - }, - "hu" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Description" - } - }, - "it" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Descrizione" - } - }, - "ko" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "설명" - } - }, - "pl" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Opis" - } - }, - "pt-BR" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Descrição" - } - }, - "ru" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Description" - } - }, - "tr" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Description" - } - }, - "uk" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Опис" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "描述" - } - } - } - }, "Detection Status" : { "comment" : "The header for a section that displays whether the screen recording detection feature is currently active or inactive.", "isCommentAutoGenerated" : true, @@ -8392,107 +7543,6 @@ } } }, - "Disable" : { - "extractionState" : "stale", - "localizations" : { - "ar" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Disable" - } - }, - "cs" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Vypnout" - } - }, - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Deaktivieren" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Disable" - } - }, - "en-GB" : { - "stringUnit" : { - "state" : "translated", - "value" : "Disable" - } - }, - "es" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Deshabilitar" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Désactiver" - } - }, - "hu" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Disable" - } - }, - "it" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Disabilita" - } - }, - "ko" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "비활성화" - } - }, - "pl" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Wyłącz" - } - }, - "pt-BR" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Disable" - } - }, - "ru" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Disable" - } - }, - "tr" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Disable" - } - }, - "uk" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Вимкнути" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "禁用" - } - } - } - }, "Disable Minimalistic UI to configure the standard notch media controls." : { "localizations" : { "pt-BR" : { @@ -8673,17 +7723,6 @@ } } }, - "Display Options" : { - "extractionState" : "stale", - "localizations" : { - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Options d’affichage" - } - } - } - }, "displays" : { "localizations" : { "pt-BR" : { @@ -8879,29 +7918,6 @@ } } }, - "Download icon style" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Download icon style" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Télécharger le style d’icône" - } - }, - "pt-BR" : { - "stringUnit" : { - "state" : "translated", - "value" : "Estilo do ícone de download" - } - } - } - }, "Download indicator style" : { "localizations" : { "en" : { @@ -8924,17 +7940,6 @@ } } }, - "Download indicators" : { - "extractionState" : "stale", - "localizations" : { - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Télécharger les indicateurs" - } - } - } - }, "Downloads" : { "localizations" : { "ar" : { @@ -9447,17 +8452,6 @@ } } }, - "Email address" : { - "extractionState" : "stale", - "localizations" : { - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Adresse e-mail" - } - } - } - }, "Enable \"Show cool face animation while inactivity\" to customize animations" : { "comment" : "A message displayed below the section header in the IdleAnimationsSettingsSection, explaining that users can customize animations by enabling this feature.", "isCommentAutoGenerated" : true, @@ -9482,151 +8476,6 @@ } } }, - "Enable Built-in System HUD" : { - "extractionState" : "stale", - "localizations" : { - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Activer le système d’ATH intégré" - } - } - } - }, - "Enable built-in system monitoring to replace macOS HUD notifications with Atoll displays." : { - "extractionState" : "stale", - "localizations" : { - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Activez le système de suivi intégré pour remplacer les notifications macOS avec celles de Atoll." - } - } - } - }, - "Enable Calendar Access" : { - "extractionState" : "stale", - "localizations" : { - "pt-BR" : { - "stringUnit" : { - "state" : "translated", - "value" : "Habilitar O Acesso Ao Calendário" - } - } - } - }, - "Enable Camera Access" : { - "extractionState" : "stale", - "localizations" : { - "pt-BR" : { - "stringUnit" : { - "state" : "translated", - "value" : "Habilitar Acesso à Câmera" - } - } - } - }, - "Enable colored spectrograms" : { - "extractionState" : "stale", - "localizations" : { - "ar" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Enable colored spectrograms" - } - }, - "cs" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Enable colored spectrograms" - } - }, - "de" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Farbe für Audiovisualisierung aktivieren" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Enable colored spectrograms" - } - }, - "en-GB" : { - "stringUnit" : { - "state" : "translated", - "value" : "Enable coloured spectrograms" - } - }, - "es" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Enable colored spectrograms" - } - }, - "fr" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Activer les spectrogrammes de couleurs" - } - }, - "hu" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Enable colored spectrograms" - } - }, - "it" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Enable colored spectrograms" - } - }, - "ko" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Enable colored spectrograms" - } - }, - "pl" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Enable colored spectrograms" - } - }, - "pt-BR" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Enable colored spectrograms" - } - }, - "ru" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Enable colored spectrograms" - } - }, - "tr" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Enable colored spectrograms" - } - }, - "uk" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Enable colored spectrograms" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "启用彩色谱图" - } - } - } - }, "Enable ColorPicker in Settings → ColorPicker" : { "localizations" : { "fr" : { @@ -9809,107 +8658,6 @@ } } }, - "Enable HUD replacement" : { - "extractionState" : "stale", - "localizations" : { - "ar" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Enable HUD replacement" - } - }, - "cs" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Povolit nahrazení HUD" - } - }, - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "HUD Ersatz aktivieren" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Enable HUD replacement" - } - }, - "en-GB" : { - "stringUnit" : { - "state" : "translated", - "value" : "Enable HUD replacement" - } - }, - "es" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Habilitar reemplazo HUD" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Activer le mode de remplacement ATH" - } - }, - "hu" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Enable HUD replacement" - } - }, - "it" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Abilita sostituzione HUD" - } - }, - "ko" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "HUD 대체 활성화" - } - }, - "pl" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Włącz zastępowanie HUD" - } - }, - "pt-BR" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Enable HUD replacement" - } - }, - "ru" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Enable HUD replacement" - } - }, - "tr" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Enable HUD replacement" - } - }, - "uk" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Enable HUD replacement" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "启用 HUD 替换" - } - } - } - }, "Enable media panel blur" : { "comment" : "A toggle switch that enables or disables the blur effect on the media panel.", "isCommentAutoGenerated" : true, @@ -10478,23 +9226,6 @@ } } }, - "Exclude apps" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Exclude apps" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Exclure des applications" - } - } - } - }, "Exit" : { "localizations" : { "ar" : { @@ -10611,8 +9342,8 @@ "localizations" : { "pt-BR" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Área de detecção quando expandido" + "state" : "translated", + "value" : "Área de detecção expandida" } } } @@ -10966,17 +9697,6 @@ } } }, - "Full Disk Access required" : { - "extractionState" : "stale", - "localizations" : { - "pt-BR" : { - "stringUnit" : { - "state" : "translated", - "value" : "Acesso completo ao disco necessário" - } - } - } - }, "Fully charged" : { "comment" : "Charging fallback label when already charged", "localizations" : { @@ -11817,23 +10537,6 @@ } } }, - "Height:" : { - "extractionState" : "stale", - "localizations" : { - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Hauteur :" - } - }, - "pt-BR" : { - "stringUnit" : { - "state" : "translated", - "value" : "Altura:" - } - } - } - }, "Height: %lldpx" : { "localizations" : { "pt-BR" : { @@ -12924,124 +11627,6 @@ } } }, - "Install updates automatically" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Install updates automatically" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Installer les mises à jour automatiquement" - } - } - } - }, - "Installed extensions" : { - "extractionState" : "stale", - "localizations" : { - "ar" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Installed extensions" - } - }, - "cs" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Nainstalovaná rozšíření" - } - }, - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Installierte Erweiterungen" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Installed extensions" - } - }, - "en-GB" : { - "stringUnit" : { - "state" : "translated", - "value" : "Installed extensions" - } - }, - "es" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Installed extensions" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Extensions installées" - } - }, - "hu" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Installed extensions" - } - }, - "it" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Estensioni installate" - } - }, - "ko" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "설치된 확장기능들" - } - }, - "pl" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Zainstalowane rozszerzenia" - } - }, - "pt-BR" : { - "stringUnit" : { - "state" : "translated", - "value" : "Extensões Instaladas" - } - }, - "ru" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Installed extensions" - } - }, - "tr" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Installed extensions" - } - }, - "uk" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Встановлені розширення" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "已安装扩展" - } - } - } - }, "Interactive (Drag to Change)" : { "localizations" : { "pt-BR" : { @@ -13307,17 +11892,6 @@ } } }, - "License key" : { - "extractionState" : "stale", - "localizations" : { - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Clé de license" - } - } - } - }, "Line Width: %lldpx" : { "localizations" : { "pt-BR" : { @@ -13402,17 +11976,6 @@ } } }, - "Live Monitoring" : { - "extractionState" : "stale", - "localizations" : { - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Suivi en directe" - } - } - } - }, "Live Performance Data" : { "localizations" : { "fr" : { @@ -14804,7 +13367,7 @@ }, "pt-BR" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Atividade ao vivo da reprodução de mídia" } }, @@ -15181,120 +13744,6 @@ } } }, - "Messages" : { - "comment" : "The title of the \"Messages\" settings page.", - "extractionState" : "stale", - "isCommentAutoGenerated" : true, - "localizations" : { - "pt-BR" : { - "stringUnit" : { - "state" : "translated", - "value" : "Mensagens" - } - } - } - }, - "Mic %@" : { - "extractionState" : "stale", - "localizations" : { - "ar" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Mic %@" - } - }, - "cs" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Mic %@" - } - }, - "de" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Mikrofon %@" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Mic %@" - } - }, - "en-GB" : { - "stringUnit" : { - "state" : "translated", - "value" : "Mic %@" - } - }, - "es" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Mic %@" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Microphone %@" - } - }, - "hu" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Mic %@" - } - }, - "it" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Mic %@" - } - }, - "ko" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "마이크 %@" - } - }, - "pl" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Mikrofon %@" - } - }, - "pt-BR" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Mic %@" - } - }, - "ru" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Mic %@" - } - }, - "tr" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Mic %@" - } - }, - "uk" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Mic %@" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "麦克风 %@" - } - } - } - }, "Mic muted" : { "comment" : "A description of the state when the microphone is muted.", "isCommentAutoGenerated" : true, @@ -15313,8 +13762,8 @@ "localizations" : { "pt-BR" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Microfone fora do mudo" + "state" : "translated", + "value" : "Microfone ativado" } } } @@ -15381,17 +13830,6 @@ } } }, - "min" : { - "extractionState" : "stale", - "localizations" : { - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "min" - } - } - } - }, "minimalistic" : { "localizations" : { "pt-BR" : { @@ -15512,17 +13950,6 @@ } } }, - "Minutes" : { - "extractionState" : "stale", - "localizations" : { - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Minutes" - } - } - } - }, "Mirror" : { "localizations" : { "ar" : { @@ -15793,17 +14220,6 @@ } } }, - "Monitoring Stopped" : { - "extractionState" : "stale", - "localizations" : { - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Le suivi a pris fin" - } - } - } - }, "More" : { "localizations" : { "ar" : { @@ -16916,118 +15332,6 @@ } } }, - "No excludes" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "No excludes" - } - } - } - }, - "No extension installed" : { - "extractionState" : "stale", - "localizations" : { - "ar" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "No extension installed" - } - }, - "cs" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "No extension installed" - } - }, - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Keine Erweiterungen installiert" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "No extension installed" - } - }, - "en-GB" : { - "stringUnit" : { - "state" : "translated", - "value" : "No extension installed" - } - }, - "es" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "No extension installed" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aucune extension installée" - } - }, - "hu" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "No extension installed" - } - }, - "it" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Nessuna estensione installata" - } - }, - "ko" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "설치된 확장기능 없음" - } - }, - "pl" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Brak zainstalowanych rozszerzeń" - } - }, - "pt-BR" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nenhuma extensão instalada" - } - }, - "ru" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "No extension installed" - } - }, - "tr" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "No extension installed" - } - }, - "uk" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "No extension installed" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "未安装扩展" - } - } - } - }, "No extensions yet" : { "comment" : "A message displayed when there are no extensions that have requested permission.", "isCommentAutoGenerated" : true, @@ -17916,17 +16220,6 @@ } } }, - "Only app icon" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Only app icon" - } - } - } - }, "Only applies when Material is set to Frosted Glass." : { "comment" : "A description of the media panel blur setting, visible only when Material is set to Frosted Glass.", "isCommentAutoGenerated" : true, @@ -17951,17 +16244,6 @@ } } }, - "Only download icon" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Only download icon" - } - } - } - }, "open" : { "localizations" : { "pt-BR" : { @@ -18137,17 +16419,6 @@ } } }, - "Percentage" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Percentage" - } - } - } - }, "Permission States:" : { "comment" : "A label describing the different permission states displayed in the footer of the extensions settings view.", "isCommentAutoGenerated" : true, @@ -18556,17 +16827,6 @@ } } }, - "Progress bar" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Progress bar" - } - } - } - }, "Progress style" : { "localizations" : { "pt-BR" : { @@ -18910,23 +17170,6 @@ } } }, - "Quit boring.notch" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Quit boring.notch" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Quitter boring.notch" - } - } - } - }, "Re-authorize" : { "comment" : "A button that re-authorizes an app when pressed.", "isCommentAutoGenerated" : true, @@ -19505,107 +17748,6 @@ } } }, - "Restart" : { - "extractionState" : "stale", - "localizations" : { - "ar" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Restart" - } - }, - "cs" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Restart" - } - }, - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Neustarten" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Restart" - } - }, - "en-GB" : { - "stringUnit" : { - "state" : "translated", - "value" : "Restart" - } - }, - "es" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Restart" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Redémarrer" - } - }, - "hu" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Restart" - } - }, - "it" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Riavvia" - } - }, - "ko" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "재시작" - } - }, - "pl" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Uruchom ponownie" - } - }, - "pt-BR" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Restart" - } - }, - "ru" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Restart" - } - }, - "tr" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Yeniden başlat" - } - }, - "uk" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Restart" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "重启" - } - } - } - }, "Restart Atoll" : { "localizations" : { "fr" : { @@ -19736,118 +17878,6 @@ } } }, - "Rotation:" : { - "extractionState" : "stale", - "localizations" : { - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Rotation:" - } - } - } - }, - "Running" : { - "extractionState" : "stale", - "localizations" : { - "ar" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Running" - } - }, - "cs" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Running" - } - }, - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Läuft" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Running" - } - }, - "en-GB" : { - "stringUnit" : { - "state" : "translated", - "value" : "Running" - } - }, - "es" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Running" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "En cours d'exécution" - } - }, - "hu" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Running" - } - }, - "it" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "In esecuzione" - } - }, - "ko" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "실행 중" - } - }, - "pl" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Uruchomiony" - } - }, - "pt-BR" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Running" - } - }, - "ru" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Running" - } - }, - "tr" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Running" - } - }, - "uk" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Running" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "运行中" - } - } - } - }, "Sampling can continue while the notch is closed when the timeout is disabled." : { "localizations" : { "pt-BR" : { @@ -19938,17 +17968,6 @@ } } }, - "Scale:" : { - "extractionState" : "stale", - "localizations" : { - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Échelle :" - } - } - } - }, "Screen Assistant" : { "localizations" : { "pt-BR" : { @@ -20146,34 +18165,6 @@ } } }, - "seconds" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "seconds" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "secondes" - } - } - } - }, - "Seconds" : { - "extractionState" : "stale", - "localizations" : { - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Secondes" - } - } - } - }, "Segmented" : { "localizations" : { "fr" : { @@ -20558,17 +18549,6 @@ } } }, - "Sensitivity" : { - "extractionState" : "stale", - "localizations" : { - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sensibilité" - } - } - } - }, "Separate Tab mode integrates Copied Items and Notes into a single view. If both are enabled, Notes appear on the right and Clipboard on the left." : { "comment" : "A description of the \"Separate Tab\" clipboard display mode.", "isCommentAutoGenerated" : true, @@ -20933,124 +18913,6 @@ } } }, - "Show battery indicator" : { - "extractionState" : "stale", - "localizations" : { - "ar" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Show battery indicator" - } - }, - "cs" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Show battery indicator" - } - }, - "de" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Batterie-Symbol anzeigen" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Show battery indicator" - } - }, - "en-GB" : { - "stringUnit" : { - "state" : "translated", - "value" : "Show battery indicator" - } - }, - "es" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Show battery indicator" - } - }, - "fr" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Afficher l'indicateur de la batterie" - } - }, - "hu" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Show battery indicator" - } - }, - "it" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Show battery indicator" - } - }, - "ko" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "배터리 상태 표시하기" - } - }, - "pl" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Show battery indicator" - } - }, - "pt-BR" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Show battery indicator" - } - }, - "ru" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Show battery indicator" - } - }, - "tr" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Show battery indicator" - } - }, - "uk" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Show battery indicator" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "显示电量" - } - } - } - }, - "Show charging indicator" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Show charging indicator" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Afficher l’indicateur de charge" - } - } - } - }, "Show Color History" : { "localizations" : { "fr" : { @@ -21077,107 +18939,6 @@ } } }, - "Show cool face animation while inactivity" : { - "extractionState" : "stale", - "localizations" : { - "ar" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Show cool face animation while inactivity" - } - }, - "cs" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Show cool face animation while inactivity" - } - }, - "de" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Show cool face animation while inactivity" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Show cool face animation while inactivity" - } - }, - "en-GB" : { - "stringUnit" : { - "state" : "translated", - "value" : "Show cool face animation while inactivity" - } - }, - "es" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Show cool face animation while inactivity" - } - }, - "fr" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Montrer une animation cool de visage pendant l'inactivité" - } - }, - "hu" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Show cool face animation while inactivity" - } - }, - "it" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Show cool face animation while inactivity" - } - }, - "ko" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Show cool face animation while inactivity" - } - }, - "pl" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Show cool face animation while inactivity" - } - }, - "pt-BR" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Show cool face animation while inactivity" - } - }, - "ru" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Show cool face animation while inactivity" - } - }, - "tr" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Show cool face animation while inactivity" - } - }, - "uk" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Show cool face animation while inactivity" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "不活动时显示动画" - } - } - } - }, "Show countdown" : { "localizations" : { "pt-BR" : { @@ -21188,29 +18949,6 @@ } } }, - "Show download progress" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Show download progress" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Afficher la vitesse de téléchargement" - } - }, - "pt-BR" : { - "stringUnit" : { - "state" : "translated", - "value" : "Mostrar o progresso do download" - } - } - } - }, "Show floating pause/stop controls" : { "localizations" : { "pt-BR" : { @@ -21465,107 +19203,6 @@ } } }, - "Show shuffle and repeat buttons" : { - "extractionState" : "stale", - "localizations" : { - "ar" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Show shuffle and repeat buttons" - } - }, - "cs" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Show shuffle and repeat buttons" - } - }, - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Zeige Zufallswiedergabe und Wiederholung Tasten" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Show shuffle and repeat buttons" - } - }, - "en-GB" : { - "stringUnit" : { - "state" : "translated", - "value" : "Show shuffle and repeat buttons" - } - }, - "es" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Show shuffle and repeat buttons" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Afficher les boutons \"aléatoire\" et \"répéter\"" - } - }, - "hu" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Show shuffle and repeat buttons" - } - }, - "it" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Mostra pulsanti casuale e ripeti" - } - }, - "ko" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "랜덤과 반복 버튼 표시" - } - }, - "pl" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Pokaż przyciski \"pomieszaj\" i \"powtórz\"" - } - }, - "pt-BR" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Show shuffle and repeat buttons" - } - }, - "ru" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Show shuffle and repeat buttons" - } - }, - "tr" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Show shuffle and repeat buttons" - } - }, - "uk" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Show shuffle and repeat buttons" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "显示随机播放和重复按钮" - } - } - } - }, "Show sneak peek on playback changes" : { "comment" : "A toggle that enables showing sneak peek when the currently playing track changes.", "isCommentAutoGenerated" : true, @@ -21636,17 +19273,6 @@ } } }, - "Size & Scale" : { - "extractionState" : "stale", - "localizations" : { - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Taille et échelle" - } - } - } - }, "Size: %lldpx" : { "localizations" : { "pt-BR" : { @@ -22225,17 +19851,6 @@ } } }, - "Speed:" : { - "extractionState" : "stale", - "localizations" : { - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Vitesse:" - } - } - } - }, "Square" : { "localizations" : { "ar" : { @@ -22538,62 +20153,6 @@ } } }, - "Stats Feature Disabled" : { - "extractionState" : "stale", - "localizations" : { - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "La fonctionnalité de statistiques est désactivée" - } - } - } - }, - "Stats feature is disabled" : { - "extractionState" : "stale", - "localizations" : { - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "La fonctionnalité de statistiques est désactivée" - } - } - } - }, - "Stats panel is disabled" : { - "extractionState" : "stale", - "localizations" : { - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Le panneau des statistiques est désactivé" - } - }, - "pt-BR" : { - "stringUnit" : { - "state" : "translated", - "value" : "Painel de estatísticas está desabilitado" - } - } - } - }, - "Stats Panel:" : { - "extractionState" : "stale", - "localizations" : { - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Panneau des statistiques" - } - }, - "pt-BR" : { - "stringUnit" : { - "state" : "translated", - "value" : "Painel de Estatísticas " - } - } - } - }, "Stats update interval" : { "localizations" : { "pt-BR" : { @@ -22805,107 +20364,6 @@ } } }, - "Support Us" : { - "extractionState" : "stale", - "localizations" : { - "ar" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Support Us" - } - }, - "cs" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Support Us" - } - }, - "de" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Unterstütze uns" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Support Us" - } - }, - "en-GB" : { - "stringUnit" : { - "state" : "translated", - "value" : "Support Us" - } - }, - "es" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Support Us" - } - }, - "fr" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Soutenez-nous" - } - }, - "hu" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Support Us" - } - }, - "it" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Supportaci" - } - }, - "ko" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "후원하기" - } - }, - "pl" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Wesprzyj nas" - } - }, - "pt-BR" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Support Us" - } - }, - "ru" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Support Us" - } - }, - "tr" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Bizi Destekle" - } - }, - "uk" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Support Us" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "支持我们" - } - } - } - }, "Supports reasoning mode" : { "localizations" : { "fr" : { @@ -23081,17 +20539,6 @@ } } }, - "System Performance Monitor" : { - "extractionState" : "stale", - "localizations" : { - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Suivi des Performances Système" - } - } - } - }, "Take area screenshot" : { "localizations" : { "fr" : { @@ -23197,17 +20644,6 @@ } } }, - "Time Range" : { - "extractionState" : "stale", - "localizations" : { - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Période de temps" - } - } - } - }, "Time to Full Charge: %lld min" : { "localizations" : { "ar" : { @@ -23726,28 +21162,6 @@ "trackpad" : { "shouldTranslate" : false }, - "Transform" : { - "extractionState" : "stale", - "localizations" : { - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Transformez" - } - } - } - }, - "Transform your notch truly yours" : { - "extractionState" : "stale", - "localizations" : { - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Reprenez le contrôle sur votre encoche" - } - } - } - }, "Try adjusting your search terms" : { "localizations" : { "fr" : { @@ -23932,107 +21346,6 @@ } } }, - "Uninstall" : { - "extractionState" : "stale", - "localizations" : { - "ar" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Uninstall" - } - }, - "cs" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Uninstall" - } - }, - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Deinstallieren" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Uninstall" - } - }, - "en-GB" : { - "stringUnit" : { - "state" : "translated", - "value" : "Uninstall" - } - }, - "es" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Uninstall" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Désinstaller" - } - }, - "hu" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Uninstall" - } - }, - "it" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Disinstalla" - } - }, - "ko" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "설치제거" - } - }, - "pl" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Odinstaluj" - } - }, - "pt-BR" : { - "stringUnit" : { - "state" : "translated", - "value" : "Desisntalar" - } - }, - "ru" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Uninstall" - } - }, - "tr" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Uninstall" - } - }, - "uk" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Uninstall" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "卸载" - } - } - } - }, "Unlock advanced features and improve your experience. Upgrade now for more customizations!" : { "localizations" : { "ar" : { @@ -24243,23 +21556,6 @@ } } }, - "Update Timer" : { - "extractionState" : "stale", - "localizations" : { - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Modifier le minuteur" - } - }, - "pt-BR" : { - "stringUnit" : { - "state" : "translated", - "value" : "Atualizar o Timer" - } - } - } - }, "Upgrade to Pro" : { "localizations" : { "ar" : { @@ -25314,23 +22610,6 @@ } } }, - "Width:" : { - "extractionState" : "stale", - "localizations" : { - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Largueur :" - } - }, - "pt-BR" : { - "stringUnit" : { - "state" : "translated", - "value" : "Largura:" - } - } - } - }, "Width: %lldpx" : { "localizations" : { "pt-BR" : { @@ -25585,28 +22864,6 @@ } } }, - "Your calendar data is only used to show your events and is never shared." : { - "extractionState" : "stale", - "localizations" : { - "pt-BR" : { - "stringUnit" : { - "state" : "translated", - "value" : "Os dados do seu calendário são usados apenas para mostrar seus eventos e nunca são compartilhados." - } - } - } - }, - "Your camera is never used without your consent, and nothing is recorded or stored." : { - "extractionState" : "stale", - "localizations" : { - "pt-BR" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sua câmera nunca é usada sem o seu consentimento, e nada é gravado ou armazenado." - } - } - } - }, "Your support funds software development learning for students in 9th–12th grade." : { "comment" : "A footer note explaining the app's funding.", "isCommentAutoGenerated" : true, From c76224a39dc57267d55e9a4765a47c4ae0f733f8 Mon Sep 17 00:00:00 2001 From: Felipe Giacomini Cocco Date: Wed, 4 Feb 2026 22:34:56 -0300 Subject: [PATCH 05/26] Fix strings detections and translates the entire "Calendar" section in settings --- DynamicIsland/Localizable.xcstrings | 150 ++++++++++++++++++ .../components/Settings/SettingsView.swift | 84 ++++++++-- 2 files changed, 222 insertions(+), 12 deletions(-) diff --git a/DynamicIsland/Localizable.xcstrings b/DynamicIsland/Localizable.xcstrings index f8c0e29..c9c303b 100644 --- a/DynamicIsland/Localizable.xcstrings +++ b/DynamicIsland/Localizable.xcstrings @@ -2615,6 +2615,16 @@ } } }, + "all-day" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "dia todo" + } + } + } + }, "All-day" : { "localizations" : { "ar" : { @@ -4459,6 +4469,16 @@ }, "shouldTranslate" : false }, + "calendar" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "calendário" + } + } + } + }, "Calendar" : { "localizations" : { "ar" : { @@ -5933,6 +5953,16 @@ } } }, + "color" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "cor" + } + } + } + }, "Color Details" : { "localizations" : { "fr" : { @@ -6197,6 +6227,16 @@ } } }, + "completed" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "completo" + } + } + } + }, "Configuration" : { "localizations" : { "fr" : { @@ -8780,6 +8820,16 @@ } } }, + "Enable reminder live activity" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ativar lembrete de atividade ao vivo" + } + } + } + }, "Enable screen color picking functionality. Use Cmd+Shift+P to quickly access the color picker." : { "localizations" : { "pt-BR" : { @@ -9226,6 +9276,16 @@ } } }, + "events" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "eventos" + } + } + } + }, "Exit" : { "localizations" : { "ar" : { @@ -11964,6 +12024,16 @@ } } }, + "live activity" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "atividades ao vivo" + } + } + } + }, "Live Activity & Feedback" : { "comment" : "The header for the \"Live Activity & Feedback\" section in the lock screen settings.", "isCommentAutoGenerated" : true, @@ -12034,6 +12104,16 @@ } } }, + "lock screen" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "tela de bloqueio" + } + } + } + }, "Lock Screen" : { "localizations" : { "fr" : { @@ -17520,6 +17600,36 @@ } } }, + "reminder" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "lembrete" + } + } + } + }, + "reminder chip" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "chip de lembrete" + } + } + } + }, + "reminder countdown" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "contagem regressiva do lembrete" + } + } + } + }, "Reminder Live Activity" : { "comment" : "A section header that lists the options related to live activity notifications for reminders.", "isCommentAutoGenerated" : true, @@ -17532,6 +17642,16 @@ } } }, + "reminder widget" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "widget de lembrete" + } + } + } + }, "Reminders" : { "localizations" : { "fr" : { @@ -18913,6 +19033,16 @@ } } }, + "Show calendar" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mostrar Calendário" + } + } + } + }, "Show Color History" : { "localizations" : { "fr" : { @@ -18971,6 +19101,16 @@ } } }, + "Show lock screen reminder" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mostrar lembrete na tela de bloqueio" + } + } + } + }, "Show on a specific display" : { "localizations" : { "ar" : { @@ -20928,6 +21068,16 @@ } } }, + "titles" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "títulos" + } + } + } + }, "Toggle Notch Open:" : { "localizations" : { "ar" : { diff --git a/DynamicIsland/components/Settings/SettingsView.swift b/DynamicIsland/components/Settings/SettingsView.swift index 3d5f4aa..0474a3a 100644 --- a/DynamicIsland/components/Settings/SettingsView.swift +++ b/DynamicIsland/components/Settings/SettingsView.swift @@ -717,15 +717,75 @@ struct SettingsView: View { SettingsSearchEntry(tab: .media, title: "Enable album art parallax effect", keywords: ["parallax", "parallax effect", "album art"], highlightID: SettingsTab.media.highlightID(for: "Enable album art parallax effect")), // Calendar - SettingsSearchEntry(tab: .calendar, title: "Show calendar", keywords: ["calendar", "events"], highlightID: SettingsTab.calendar.highlightID(for: "Show calendar")), - SettingsSearchEntry(tab: .calendar, title: "Enable reminder live activity", keywords: ["reminder", "live activity"], highlightID: SettingsTab.calendar.highlightID(for: "Enable reminder live activity")), - SettingsSearchEntry(tab: .calendar, title: "Countdown style", keywords: ["reminder countdown"], highlightID: SettingsTab.calendar.highlightID(for: "Countdown style")), - SettingsSearchEntry(tab: .calendar, title: "Show lock screen reminder", keywords: ["lock screen", "reminder widget"], highlightID: SettingsTab.calendar.highlightID(for: "Show lock screen reminder")), - SettingsSearchEntry(tab: .calendar, title: "Chip color", keywords: ["reminder chip", "color"], highlightID: SettingsTab.calendar.highlightID(for: "Chip color")), - SettingsSearchEntry(tab: .calendar, title: "Hide all-day events", keywords: ["calendar", "all-day"], highlightID: SettingsTab.calendar.highlightID(for: "Hide all-day events")), - SettingsSearchEntry(tab: .calendar, title: "Hide completed reminders", keywords: ["reminder", "completed"], highlightID: SettingsTab.calendar.highlightID(for: "Hide completed reminders")), - SettingsSearchEntry(tab: .calendar, title: "Show full event titles", keywords: ["calendar", "titles"], highlightID: SettingsTab.calendar.highlightID(for: "Show full event titles")), - SettingsSearchEntry(tab: .calendar, title: "Auto-scroll to next event", keywords: ["calendar", "scroll"], highlightID: SettingsTab.calendar.highlightID(for: "Auto-scroll to next event")), + SettingsSearchEntry( + tab: .calendar, + title: String(localized: "Show calendar"), + keywords: [String(localized: "calendar"), String(localized: "events")], + highlightID: SettingsTab.calendar.highlightID(for: "Show calendar") + ), + SettingsSearchEntry( + tab: .calendar, + title: String(localized: "Enable reminder live activity"), + keywords: [String(localized: "reminder"), String(localized: "live activity")], + highlightID: SettingsTab.calendar.highlightID(for: "Enable reminder live activity") + ), + SettingsSearchEntry( + tab: .calendar, + title: String(localized:"Countdown style"), + keywords: [String(localized:"reminder countdown")], + highlightID: SettingsTab.calendar.highlightID(for: "Countdown style") + ), + SettingsSearchEntry( + tab: .calendar, + title: String(localized:"Show lock screen reminder"), + keywords: [String(localized:"lock screen"), String(localized:"reminder widget")], + highlightID: SettingsTab.calendar.highlightID(for: "Show lock screen reminder") + ), + SettingsSearchEntry( + tab: .calendar, + title: String(localized: "Chip color"), + keywords: [ + String(localized: "reminder chip"), + String(localized: "color") + ], + highlightID: SettingsTab.calendar.highlightID(for: "Chip color") + ), + SettingsSearchEntry( + tab: .calendar, + title: String(localized: "Hide all-day events"), + keywords: [ + String(localized: "calendar"), + String(localized: "all-day") + ], + highlightID: SettingsTab.calendar.highlightID(for: "Hide all-day events") + ), + SettingsSearchEntry( + tab: .calendar, + title: String(localized: "Hide completed reminders"), + keywords: [ + String(localized: "reminder"), + String(localized: "completed") + ], + highlightID: SettingsTab.calendar.highlightID(for: "Hide completed reminders") + ), + SettingsSearchEntry( + tab: .calendar, + title: String(localized: "Show full event titles"), + keywords: [ + String(localized: "calendar"), + String(localized: "titles") + ], + highlightID: SettingsTab.calendar.highlightID(for: "Show full event titles") + ), + SettingsSearchEntry( + tab: .calendar, + title: String(localized: "Auto-scroll to next event"), + keywords: [ + String(localized: "calendar"), + String(localized: "scroll") + ], + highlightID: SettingsTab.calendar.highlightID(for: "Auto-scroll to next event") + ), // Shelf SettingsSearchEntry(tab: .shelf, title: "Enable shelf", keywords: ["shelf", "dock"], highlightID: SettingsTab.shelf.highlightID(for: "Enable shelf")), @@ -2329,7 +2389,7 @@ struct CalendarSettings: View { Text("Permissions") } - Defaults.Toggle("Show calendar", key: .showCalendar) + Defaults.Toggle(String(localized:"Show calendar"), key: .showCalendar) .settingsHighlight(id: highlightID("Show calendar")) Section(header: Text("Event List")) { @@ -2353,7 +2413,7 @@ struct CalendarSettings: View { } Section(header: Text("Reminder Live Activity")) { - Defaults.Toggle("Enable reminder live activity", key: .enableReminderLiveActivity) + Defaults.Toggle(String(localized:"Enable reminder live activity"), key: .enableReminderLiveActivity) .settingsHighlight(id: highlightID("Enable reminder live activity")) Picker("Countdown style", selection: $reminderPresentationStyle) { @@ -2396,7 +2456,7 @@ struct CalendarSettings: View { } Section(header: Text("Lock Screen Reminder Widget")) { - Defaults.Toggle("Show lock screen reminder", key: .enableLockScreenReminderWidget) + Defaults.Toggle(String(localized:"Show lock screen reminder"), key: .enableLockScreenReminderWidget) .settingsHighlight(id: highlightID("Show lock screen reminder")) Picker("Chip color", selection: $lockScreenReminderChipStyle) { From 69d00d2f7a8d66f9d6b0b1abd96cf6ddcba27bc3 Mon Sep 17 00:00:00 2001 From: Felipe Giacomini Cocco Date: Wed, 4 Feb 2026 23:09:50 -0300 Subject: [PATCH 06/26] Corrects some String detection for pickers --- DynamicIsland/Localizable.xcstrings | 143 ++++++++++++++++++ .../components/Settings/SettingsView.swift | 17 ++- DynamicIsland/enums/generic.swift | 9 ++ DynamicIsland/models/Constants.swift | 17 ++- 4 files changed, 171 insertions(+), 15 deletions(-) diff --git a/DynamicIsland/Localizable.xcstrings b/DynamicIsland/Localizable.xcstrings index c9c303b..75851b4 100644 --- a/DynamicIsland/Localizable.xcstrings +++ b/DynamicIsland/Localizable.xcstrings @@ -1398,6 +1398,16 @@ } } }, + "±10 Seconds" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "±10 Segundos" + } + } + } + }, "0" : { "comment" : "A label displayed in a circular gauge to indicate the minimum battery level.", "isCommentAutoGenerated" : true, @@ -7507,6 +7517,16 @@ } } }, + "Denied" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Negado" + } + } + } + }, "Denied/Revoked" : { "comment" : "A label describing an extension with denied or revoked permissions.", "isCommentAutoGenerated" : true, @@ -7573,6 +7593,9 @@ } } }, + "Digital" : { + "shouldTranslate" : false + }, "Dimensions" : { "localizations" : { "pt-BR" : { @@ -9264,6 +9287,16 @@ } } }, + "Event color" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cor do evento" + } + } + } + }, "Event List" : { "comment" : "A section header in the calendar settings view, describing the list of calendar events.", "isCommentAutoGenerated" : true, @@ -9757,6 +9790,16 @@ } } }, + "Full Access" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Acesso Total" + } + } + } + }, "Fully charged" : { "comment" : "Charging fallback label when already charged", "localizations" : { @@ -14030,6 +14073,16 @@ } } }, + "Minutes" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Minutos" + } + } + } + }, "Mirror" : { "localizations" : { "ar" : { @@ -15648,6 +15701,16 @@ } } }, + "Not Determined" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Não Determinado" + } + } + } + }, "Not Now" : { "localizations" : { "ar" : { @@ -17920,6 +17983,16 @@ } } }, + "Restricted" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Restrito" + } + } + } + }, "Resume" : { "localizations" : { "fr" : { @@ -17998,6 +18071,16 @@ } } }, + "Ring" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Círculo" + } + } + } + }, "Sampling can continue while the notch is closed when the timeout is disabled." : { "localizations" : { "pt-BR" : { @@ -19435,6 +19518,16 @@ } } }, + "Skip forward or backward by ten seconds" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pular dez segundos para frente ou para trás" + } + } + } + }, "Slider color" : { "localizations" : { "ar" : { @@ -20111,6 +20204,16 @@ } } }, + "Standard previous/next track controls" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Controles anterior/próxima padrão " + } + } + } + }, "Start" : { "localizations" : { "fr" : { @@ -21309,6 +21412,16 @@ }, "shouldTranslate" : false }, + "Track Skip" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pular Música" + } + } + } + }, "trackpad" : { "shouldTranslate" : false }, @@ -21496,6 +21609,16 @@ } } }, + "Unknown" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Desconhecido" + } + } + } + }, "Unlock advanced features and improve your experience. Upgrade now for more customizations!" : { "localizations" : { "ar" : { @@ -22748,6 +22871,16 @@ } } }, + "White" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Branco" + } + } + } + }, "Widget Updates" : { "comment" : "A label describing the number of times the extension has updated its widget.", "isCommentAutoGenerated" : true, @@ -22798,6 +22931,16 @@ } } }, + "Write Only" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Apenas Escrita" + } + } + } + }, "You" : { "localizations" : { "fr" : { diff --git a/DynamicIsland/components/Settings/SettingsView.swift b/DynamicIsland/components/Settings/SettingsView.swift index 0474a3a..9282182 100644 --- a/DynamicIsland/components/Settings/SettingsView.swift +++ b/DynamicIsland/components/Settings/SettingsView.swift @@ -2459,9 +2459,10 @@ struct CalendarSettings: View { Defaults.Toggle(String(localized:"Show lock screen reminder"), key: .enableLockScreenReminderWidget) .settingsHighlight(id: highlightID("Show lock screen reminder")) - Picker("Chip color", selection: $lockScreenReminderChipStyle) { + Picker(String(localized: "Chip color"), selection: $lockScreenReminderChipStyle) { ForEach(LockScreenReminderChipStyle.allCases) { style in - Text(style.rawValue).tag(style) + + Text(style.localizedName).tag(style) } } .pickerStyle(.segmented) @@ -2499,12 +2500,12 @@ struct CalendarSettings: View { private func statusText(for status: EKAuthorizationStatus) -> String { switch status { - case .fullAccess, .authorized: return "Full Access" - case .writeOnly: return "Write Only" - case .denied: return "Denied" - case .restricted: return "Restricted" - case .notDetermined: return "Not Determined" - @unknown default: return "Unknown" + case .fullAccess, .authorized: return String(localized:"Full Access") + case .writeOnly: return String(localized:"Write Only") + case .denied: return String(localized:"Denied") + case .restricted: return String(localized:"Restricted") + case .notDetermined: return String(localized:"Not Determined") + @unknown default: return String(localized:"Unknown") } } diff --git a/DynamicIsland/enums/generic.swift b/DynamicIsland/enums/generic.swift index 7f7110f..0d02e13 100644 --- a/DynamicIsland/enums/generic.swift +++ b/DynamicIsland/enums/generic.swift @@ -231,4 +231,13 @@ enum LockScreenReminderChipStyle: String, CaseIterable, Defaults.Serializable, I case monochrome = "White" var id: String { rawValue } + + var localizedName: String { + switch self { + case .eventColor: + return String(localized: "Event color") + case .monochrome: + return String(localized: "White") + } + } } diff --git a/DynamicIsland/models/Constants.swift b/DynamicIsland/models/Constants.swift index 246b05b..4afb8e1 100644 --- a/DynamicIsland/models/Constants.swift +++ b/DynamicIsland/models/Constants.swift @@ -438,18 +438,18 @@ enum MusicSkipBehavior: String, CaseIterable, Identifiable, Defaults.Serializabl var displayName: String { switch self { case .track: - return "Track Skip" + return String(localized: "Track Skip") case .tenSecond: - return "±10 Seconds" + return String(localized: "±10 Seconds") } } var description: String { switch self { case .track: - return "Standard previous/next track controls" + return String(localized: "Standard previous/next track controls") case .tenSecond: - return "Skip forward or backward by ten seconds" + return String(localized: "Skip forward or backward by ten seconds") } } } @@ -484,9 +484,12 @@ enum ReminderPresentationStyle: String, CaseIterable, Identifiable, Defaults.Ser var displayName: String { switch self { - case .ringCountdown: return "Ring" - case .digital: return "Digital" - case .minutes: return "Minutes" + case .ringCountdown: + return String(localized: "Ring") + case .digital: + return String(localized: "Digital") + case .minutes: + return String(localized: "Minutes") } } } From 8f0daa87caf16f57e247e725c32123c2e0194540 Mon Sep 17 00:00:00 2001 From: Felipe Giacomini Cocco Date: Thu, 5 Feb 2026 00:12:59 -0300 Subject: [PATCH 07/26] Fix strings detections and translates the entire "Appearance" section in settings --- DynamicIsland/Localizable.xcstrings | 396 +++++++++++++++++- .../components/Settings/SettingsView.swift | 127 ++++-- DynamicIsland/enums/generic.swift | 20 + 3 files changed, 504 insertions(+), 39 deletions(-) diff --git a/DynamicIsland/Localizable.xcstrings b/DynamicIsland/Localizable.xcstrings index 75851b4..cc75637 100644 --- a/DynamicIsland/Localizable.xcstrings +++ b/DynamicIsland/Localizable.xcstrings @@ -1667,6 +1667,26 @@ } } }, + "accent" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "destaque" + } + } + } + }, + "Accent color" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cor de destaque" + } + } + } + }, "Accent colour" : { "comment" : "A label describing the colour picker for the timer preset.", "isCommentAutoGenerated" : true, @@ -2615,6 +2635,16 @@ } } }, + "album art" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "capa do álbum" + } + } + } + }, "All" : { "localizations" : { "pt-BR" : { @@ -3114,6 +3144,16 @@ } } }, + "app icon" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "ícone do app" + } + } + } + }, "App icon" : { "localizations" : { "ar" : { @@ -3226,6 +3266,16 @@ } } }, + "appearance" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "aparência" + } + } + } + }, "Appearance" : { "localizations" : { "ar" : { @@ -3424,6 +3474,9 @@ } } }, + "audio" : { + "shouldTranslate" : false + }, "Audio feedback" : { "comment" : "A section header that lists audio feedback settings.", "isCommentAutoGenerated" : true, @@ -4280,6 +4333,16 @@ } } }, + "blur" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "desfoque" + } + } + } + }, "Boost your productivity with Clipboard Manager" : { "localizations" : { "ar" : { @@ -5395,6 +5458,16 @@ } } }, + "circle" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "círculo" + } + } + } + }, "Circle" : { "localizations" : { "ar" : { @@ -5925,6 +5998,16 @@ } } }, + "close animation" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "animação de fechar" + } + } + } + }, "Close assistant" : { "localizations" : { "fr" : { @@ -6290,7 +6373,7 @@ "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Configure os materiais da tela de bloqueio na aba Aparência. O Custom Liquid desbloqueia controles deslizantes variantes para ambos os widgets sempre que o Liquid Glass é selecionado." + "value" : "Configure os materiais da tela de bloqueio na aba Aparência. O Liquid Customizado desbloqueia controles deslizantes variantes para ambos os widgets sempre que o Liquid Glass é selecionado." } } } @@ -6584,6 +6667,26 @@ }, "shouldTranslate" : false }, + "corner radius" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "raio das bordas" + } + } + } + }, + "Corner radius scaling" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Escala do raio das bordas" + } + } + } + }, "Countdown style" : { "comment" : "A label for the style of countdown to use when reminders are live.", "isCommentAutoGenerated" : true, @@ -6811,6 +6914,26 @@ } } }, + "custom icon" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "ícone customizado" + } + } + } + }, + "Custom Liquid" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Liquid Customizado" + } + } + } + }, "Custom liquid glass already renders with Apple's liquid material, so this option is managed automatically." : { "comment" : "A description of the custom liquid blur option in the media settings.", "isCommentAutoGenerated" : true, @@ -8521,8 +8644,8 @@ "localizations" : { "pt-BR" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Ative \"Mostrar animação de rosto legal durante a inatividade\" para personalizar as animações" + "state" : "translated", + "value" : "Ative \"Mostrar animações divertidas enquanto inativo\" para personalizar as animações" } } } @@ -8539,6 +8662,26 @@ } } }, + "Enable blur effect behind album art" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Habilitar o efeito de desfoque atrás da arte do álbum" + } + } + } + }, + "Enable colored spectrograms" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ativar espectrogramas coloridos" + } + } + } + }, "Enable ColorPicker in Settings → ColorPicker" : { "localizations" : { "fr" : { @@ -8577,6 +8720,16 @@ } } }, + "Enable Dynamic mirror" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ativar Espelho Dinâmico" + } + } + } + }, "Enable extensions to allow third-party apps to display live activities and lock screen widgets in Atoll." : { "comment" : "A footer text that explains the purpose of enabling extensions.", "isCommentAutoGenerated" : true, @@ -8953,6 +9106,16 @@ } } }, + "Enable window shadow" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ativar sombras da janela" + } + } + } + }, "Engine Utilization" : { "comment" : "A label describing the utilization of the GPU's engine components.", "isCommentAutoGenerated" : true, @@ -9441,6 +9604,16 @@ } } }, + "expanded notch" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "notch expandido" + } + } + } + }, "Expanded notch width" : { "comment" : "A label describing the expanded notch width setting.", "isCommentAutoGenerated" : true, @@ -9463,6 +9636,16 @@ } } }, + "Extend the notch span so the clipboard, colour picker, and other trailing icons remain visible on scaled displays (e.g. More Space)." : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Estende a largura do notch para que a área de transferência, o seletor de cores e outros ícones de arrasto permaneçam visíveis em telas escalonada (por exemplo, Mais Espaço)." + } + } + } + }, "Extension tab unavailable" : { "comment" : "A message displayed when the extension tab is not available.", "isCommentAutoGenerated" : true, @@ -9593,6 +9776,16 @@ } } }, + "face animation" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "animações de rosto" + } + } + } + }, "feedback" : { "shouldTranslate" : false }, @@ -11416,6 +11609,16 @@ } } }, + "idle" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "inativo" + } + } + } + }, "Idle" : { "comment" : "A label displayed alongside the status of a GPU device.", "isCommentAutoGenerated" : true, @@ -14083,6 +14286,16 @@ } } }, + "mirror" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "espelho" + } + } + } + }, "Mirror" : { "localizations" : { "ar" : { @@ -14195,6 +14408,16 @@ } } }, + "mirror shape" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "formato do espelho" + } + } + } + }, "Mirror shape" : { "localizations" : { "ar" : { @@ -14266,7 +14489,7 @@ "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Espelhar o formato" + "value" : "Formato do espelho" } }, "ru" : { @@ -15821,6 +16044,9 @@ } } }, + "notch" : { + "shouldTranslate" : false + }, "Notch behavior" : { "localizations" : { "ar" : { @@ -16684,6 +16910,16 @@ } } }, + "Player tinting" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Luz de fundo do reprodutor" + } + } + } + }, "Plays the supplied feedback clip whenever you press the hardware volume keys." : { "comment" : "A help text describing the audio feedback feature.", "isCommentAutoGenerated" : true, @@ -17463,6 +17699,26 @@ } } }, + "rectangle" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "retângulo" + } + } + } + }, + "reflection" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "reflexo" + } + } + } + }, "Release name" : { "localizations" : { "ar" : { @@ -17931,6 +18187,16 @@ } } }, + "resize" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "redimensionar" + } + } + } + }, "Restart Atoll" : { "localizations" : { "fr" : { @@ -18904,6 +19170,26 @@ } } }, + "settings button" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "botão de configurações" + } + } + } + }, + "Settings icon in notch" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ícone do botão de configurações" + } + } + } + }, "Settings…" : { "comment" : "A command that shows the settings window.", "isCommentAutoGenerated" : true, @@ -18916,6 +19202,26 @@ } } }, + "shadow" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "sombra" + } + } + } + }, + "shape" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "formato" + } + } + } + }, "Shelf" : { "localizations" : { "ar" : { @@ -19152,6 +19458,16 @@ } } }, + "Show cool face animation while inactivity" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mostrar animações divertidas enquanto inativo" + } + } + } + }, "Show countdown" : { "localizations" : { "pt-BR" : { @@ -19528,6 +19844,16 @@ } } }, + "slider" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "controle deslizante" + } + } + } + }, "Slider color" : { "localizations" : { "ar" : { @@ -19984,6 +20310,16 @@ } } }, + "spectrogram" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "espectrogramas" + } + } + } + }, "Speed" : { "localizations" : { "ar" : { @@ -20184,6 +20520,16 @@ } } }, + "Standard" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Padrão" + } + } + } + }, "Standard notch media controls are hidden while this toggle is off." : { "localizations" : { "pt-BR" : { @@ -21132,7 +21478,7 @@ "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Tom do temporizador" + "value" : "Luz de fundo do temporizador" } } } @@ -21393,6 +21739,16 @@ } } }, + "toolbar" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "barra de ferramentas" + } + } + } + }, "Total · %@" : { "comment" : "A label displaying the total storage capacity of a disk device. The argument is the total storage capacity of the disk device.", "isCommentAutoGenerated" : true, @@ -22094,6 +22450,16 @@ } } }, + "Use simpler close animation" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Usar animação de fechar simples" + } + } + } + }, "Use the Media tab to configure sneak peek, lyrics, and floating media controls." : { "comment" : "A footer for the \"Media Live Activity\" section, explaining how to configure the media controls.", "isCommentAutoGenerated" : true, @@ -22893,6 +23259,26 @@ } } }, + "width" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "largura" + } + } + } + }, + "Width adjustments apply only to the standard notch layout. Disable Minimalistic UI to edit this value." : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Os ajustes de largura se aplicam apenas ao layout do notch padrão. Desative a UI minimalista para editar este valor." + } + } + } + }, "Width: %lldpx" : { "localizations" : { "pt-BR" : { diff --git a/DynamicIsland/components/Settings/SettingsView.swift b/DynamicIsland/components/Settings/SettingsView.swift index 9282182..41f9cd6 100644 --- a/DynamicIsland/components/Settings/SettingsView.swift +++ b/DynamicIsland/components/Settings/SettingsView.swift @@ -796,18 +796,77 @@ struct SettingsView: View { SettingsSearchEntry(tab: .shelf, title: "Quick Share Service", keywords: ["shelf", "share", "airdrop"], highlightID: SettingsTab.shelf.highlightID(for: "Quick Share Service")), // Appearance - SettingsSearchEntry(tab: .appearance, title: "Settings icon in notch", keywords: ["settings button", "toolbar"], highlightID: SettingsTab.appearance.highlightID(for: "Settings icon in notch")), - SettingsSearchEntry(tab: .appearance, title: "Enable window shadow", keywords: ["shadow", "appearance"], highlightID: SettingsTab.appearance.highlightID(for: "Enable window shadow")), - SettingsSearchEntry(tab: .appearance, title: "Corner radius scaling", keywords: ["corner radius", "shape"], highlightID: SettingsTab.appearance.highlightID(for: "Corner radius scaling")), - SettingsSearchEntry(tab: .appearance, title: "Use simpler close animation", keywords: ["close animation", "notch"], highlightID: SettingsTab.appearance.highlightID(for: "Use simpler close animation")), - SettingsSearchEntry(tab: .appearance, title: "Notch Width", keywords: ["expanded notch", "width", "resize"], highlightID: SettingsTab.appearance.highlightID(for: "Expanded notch width")), - SettingsSearchEntry(tab: .appearance, title: "Enable colored spectrograms", keywords: ["spectrogram", "audio"], highlightID: SettingsTab.appearance.highlightID(for: "Enable colored spectrograms")), - SettingsSearchEntry(tab: .appearance, title: "Enable blur effect behind album art", keywords: ["blur", "album art"], highlightID: SettingsTab.appearance.highlightID(for: "Enable blur effect behind album art")), - SettingsSearchEntry(tab: .appearance, title: "Slider color", keywords: ["slider", "accent"], highlightID: SettingsTab.appearance.highlightID(for: "Slider color")), - SettingsSearchEntry(tab: .appearance, title: "Enable Dynamic mirror", keywords: ["mirror", "reflection"], highlightID: SettingsTab.appearance.highlightID(for: "Enable Dynamic mirror")), - SettingsSearchEntry(tab: .appearance, title: "Mirror shape", keywords: ["mirror shape", "circle", "rectangle"], highlightID: SettingsTab.appearance.highlightID(for: "Mirror shape")), - SettingsSearchEntry(tab: .appearance, title: "Show cool face animation while inactivity", keywords: ["face animation", "idle"], highlightID: SettingsTab.appearance.highlightID(for: "Show cool face animation while inactivity")), - SettingsSearchEntry(tab: .appearance, title: "App icon", keywords: ["app icon", "custom icon"], highlightID: SettingsTab.appearance.highlightID(for: "App icon")), + SettingsSearchEntry( + tab: .appearance, + title: String(localized: "Settings icon in notch"), + keywords: [String(localized: "settings button"), String(localized: "toolbar")], + highlightID: SettingsTab.appearance.highlightID(for: "Settings icon in notch") + ), + SettingsSearchEntry( + tab: .appearance, + title: String(localized: "Enable window shadow"), + keywords: [String(localized: "shadow"), String(localized: "appearance")], + highlightID: SettingsTab.appearance.highlightID(for: "Enable window shadow") + ), + SettingsSearchEntry( + tab: .appearance, + title: String(localized: "Corner radius scaling"), + keywords: [String(localized: "corner radius"), String(localized: "shape")], + highlightID: SettingsTab.appearance.highlightID(for: "Corner radius scaling") + ), + SettingsSearchEntry( + tab: .appearance, + title: String(localized: "Use simpler close animation"), + keywords: [String(localized: "close animation"), String(localized: "notch")], + highlightID: SettingsTab.appearance.highlightID(for: "Use simpler close animation") + ), + SettingsSearchEntry( + tab: .appearance, + title: String(localized: "Notch Width"), + keywords: [String(localized: "expanded notch"), String(localized: "width"), String(localized: "resize")], + highlightID: SettingsTab.appearance.highlightID(for: "Expanded notch width") + ), + SettingsSearchEntry( + tab: .appearance, + title: String(localized: "Enable colored spectrograms"), keywords: [String(localized: "spectrogram"), String(localized: "audio")], + highlightID: SettingsTab.appearance.highlightID(for: "Enable colored spectrograms") + ), + SettingsSearchEntry( + tab: .appearance, + title: String(localized: "Enable blur effect behind album art"), + keywords: [String(localized: "blur"), String(localized: "album art")], + highlightID: SettingsTab.appearance.highlightID(for: "Enable blur effect behind album art") + ), + SettingsSearchEntry( + tab: .appearance, + title: String(localized: "Slider color"), + keywords: [String(localized: "slider"), String(localized: "accent")], + highlightID: SettingsTab.appearance.highlightID(for: "Slider color") + ), + SettingsSearchEntry( + tab: .appearance, + title: String(localized: "Enable Dynamic mirror"), + keywords: [String(localized: "mirror"), String(localized: "reflection")], + highlightID: SettingsTab.appearance.highlightID(for: "Enable Dynamic mirror") + ), + SettingsSearchEntry( + tab: .appearance, + title: String(localized: "Mirror shape"), + keywords: [String(localized: "mirror shape"), String(localized: "circle"), String(localized: "rectangle")], + highlightID: SettingsTab.appearance.highlightID(for: "Mirror shape") + ), + SettingsSearchEntry( + tab: .appearance, + title: String(localized: "Show cool face animation while inactivity"), + keywords: [String(localized: "face animation"), String(localized: "idle")], + highlightID: SettingsTab.appearance.highlightID(for: "Show cool face animation while inactivity") + ), + SettingsSearchEntry( + tab: .appearance, + title: String(localized: "App icon"), + keywords: [String(localized: "app icon"), String(localized: "custom icon")], + highlightID: SettingsTab.appearance.highlightID(for: "App icon") + ), // Lock Screen SettingsSearchEntry(tab: .lockScreen, title: "Enable lock screen live activity", keywords: ["lock screen", "live activity"], highlightID: SettingsTab.lockScreen.highlightID(for: "Enable lock screen live activity")), @@ -3028,13 +3087,13 @@ struct Appearance: View { Form { Section { Toggle("Always show tabs", isOn: $coordinator.alwaysShowTabs) - Defaults.Toggle("Settings icon in notch", key: .settingsIconInNotch) + Defaults.Toggle(String(localized:"Settings icon in notch"), key: .settingsIconInNotch) .settingsHighlight(id: highlightID("Settings icon in notch")) - Defaults.Toggle("Enable window shadow", key: .enableShadow) + Defaults.Toggle(String(localized:"Enable window shadow"), key: .enableShadow) .settingsHighlight(id: highlightID("Enable window shadow")) - Defaults.Toggle("Corner radius scaling", key: .cornerRadiusScaling) + Defaults.Toggle(String(localized:"Corner radius scaling"), key: .cornerRadiusScaling) .settingsHighlight(id: highlightID("Corner radius scaling")) - Defaults.Toggle("Use simpler close animation", key: .useModernCloseAnimation) + Defaults.Toggle(String(localized:"Use simpler close animation"), key: .useModernCloseAnimation) .settingsHighlight(id: highlightID("Use simpler close animation")) } header: { Text("General") @@ -3064,9 +3123,9 @@ struct Appearance: View { } if lockScreenGlassStyle == .liquid { - Picker("Lock screen glass mode", selection: $lockScreenGlassCustomizationMode) { + Picker(String(localized: "Lock screen glass mode"), selection: $lockScreenGlassCustomizationMode) { ForEach(LockScreenGlassCustomizationMode.allCases) { mode in - Text(mode.rawValue).tag(mode) + Text(mode.localizedName).tag(mode) } } .pickerStyle(.segmented) @@ -3117,15 +3176,15 @@ struct Appearance: View { } Section { - Defaults.Toggle("Enable colored spectrograms", key: .coloredSpectrogram) + Defaults.Toggle(String(localized:"Enable colored spectrograms"), key: .coloredSpectrogram) .settingsHighlight(id: highlightID("Enable colored spectrograms")) - Defaults - .Toggle("Player tinting", key: .playerColorTinting) - Defaults.Toggle("Enable blur effect behind album art", key: .lightingEffect) + Defaults.Toggle(String(localized:"Player tinting"), key: .playerColorTinting) + Defaults.Toggle(String(localized:"Enable blur effect behind album art"), key: .lightingEffect) .settingsHighlight(id: highlightID("Enable blur effect behind album art")) - Picker("Slider color", selection: $sliderColor) { + Picker(String(localized: "Slider color"), selection: $sliderColor) { ForEach(SliderColorEnum.allCases, id: \.self) { option in - Text(option.rawValue) + + Text(option.localizedName).tag(option) } } .settingsHighlight(id: highlightID("Slider color")) @@ -3165,7 +3224,7 @@ struct Appearance: View { } header: { HStack { Text("Custom music live activity animation") - customBadge(text: "Coming soon") + customBadge(text: String(localized: "Coming soon")) } } @@ -3302,7 +3361,7 @@ struct Appearance: View { } Section { - Defaults.Toggle("Enable Dynamic mirror", key: .showMirror) + Defaults.Toggle(String(localized:"Enable Dynamic mirror"), key: .showMirror) .disabled(!checkVideoInput()) .settingsHighlight(id: highlightID("Enable Dynamic mirror")) Picker("Mirror shape", selection: $mirrorShape) { @@ -3312,7 +3371,7 @@ struct Appearance: View { .tag(MirrorShapeEnum.rectangle) } .settingsHighlight(id: highlightID("Mirror shape")) - Defaults.Toggle("Show cool face animation while inactivity", key: .showNotHumanFace) + Defaults.Toggle(String(localized:"Show cool face animation while inactivity"), key: .showNotHumanFace) .settingsHighlight(id: highlightID("Show cool face animation while inactivity")) } header: { HStack { @@ -3328,7 +3387,7 @@ struct Appearance: View { let columns = [GridItem(.adaptive(minimum: 90), spacing: 12)] LazyVGrid(columns: columns, spacing: 12) { appIconCard( - title: "Default", + title: String(localized:"Default"), image: defaultAppIconImage(), isSelected: selectedAppIconID == nil ) { @@ -3571,8 +3630,8 @@ struct Appearance: View { } let description = enableMinimalisticUI - ? "Width adjustments apply only to the standard notch layout. Disable Minimalistic UI to edit this value." - : "Extend the notch span so the clipboard, colour picker, and other trailing icons remain visible on scaled displays (e.g. More Space)." + ? String(localized:"Width adjustments apply only to the standard notch layout. Disable Minimalistic UI to edit this value.") + : String(localized:"Extend the notch span so the clipboard, colour picker, and other trailing icons remain visible on scaled displays (e.g. More Space).") Text(description) .font(.caption) @@ -3688,9 +3747,9 @@ struct LockScreenSettings: View { } if lockScreenGlassStyle == .liquid { - Picker("Glass mode", selection: $lockScreenGlassCustomizationMode) { + Picker(String(localized: "Glass mode"), selection: $lockScreenGlassCustomizationMode) { ForEach(LockScreenGlassCustomizationMode.allCases) { mode in - Text(mode.rawValue).tag(mode) + Text(mode.localizedName).tag(mode) } } .pickerStyle(.segmented) @@ -3777,9 +3836,9 @@ struct LockScreenSettings: View { .settingsHighlight(id: highlightID("Timer glass material")) if lockScreenTimerGlassStyle == .liquid { - Picker("Timer liquid mode", selection: $lockScreenTimerGlassCustomizationMode) { + Picker(String(localized: "Timer liquid mode"), selection: $lockScreenTimerGlassCustomizationMode) { ForEach(LockScreenGlassCustomizationMode.allCases) { mode in - Text(mode.rawValue).tag(mode) + Text(mode.localizedName).tag(mode) } } .pickerStyle(.segmented) diff --git a/DynamicIsland/enums/generic.swift b/DynamicIsland/enums/generic.swift index 0d02e13..bf29477 100644 --- a/DynamicIsland/enums/generic.swift +++ b/DynamicIsland/enums/generic.swift @@ -106,6 +106,17 @@ enum SliderColorEnum: String, CaseIterable, Defaults.Serializable { case white = "White" case albumArt = "Match album art" case accent = "Accent color" + + var localizedName: String { + switch self { + case .white: + return String(localized: "Standard") + case .albumArt: + return String(localized: "Custom Liquid") + case .accent: + return String(localized: "Accent color") + } + } } enum LockScreenGlassStyle: String, CaseIterable, Defaults.Serializable, Identifiable { @@ -124,6 +135,15 @@ enum LockScreenGlassCustomizationMode: String, CaseIterable, Defaults.Serializab var allowsVariantSelection: Bool { self == .customLiquid } + + var localizedName: String { + switch self { + case .standard: + return String(localized: "Standard") + case .customLiquid: + return String(localized: "Custom Liquid") + } + } } enum LockScreenTimerSurfaceMode: String, CaseIterable, Defaults.Serializable, Identifiable { From 68dbca57ef200e45abde12d2fa04277332ee0ddf Mon Sep 17 00:00:00 2001 From: Felipe Giacomini Cocco Date: Thu, 5 Feb 2026 13:40:54 -0300 Subject: [PATCH 08/26] Fix strings detections and translates the entire search index section --- DynamicIsland/Localizable.xcstrings | 1766 +++++++++++++++++ .../components/Settings/SettingsView.swift | 1085 +++++++--- 2 files changed, 2541 insertions(+), 310 deletions(-) diff --git a/DynamicIsland/Localizable.xcstrings b/DynamicIsland/Localizable.xcstrings index cc75637..e442344 100644 --- a/DynamicIsland/Localizable.xcstrings +++ b/DynamicIsland/Localizable.xcstrings @@ -1398,6 +1398,9 @@ } } }, + "±10" : { + "shouldTranslate" : false + }, "±10 Seconds" : { "localizations" : { "pt-BR" : { @@ -2311,6 +2314,16 @@ } } }, + "ai" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "ia" + } + } + } + }, "AI Assistant" : { "localizations" : { "fr" : { @@ -2397,6 +2410,16 @@ } } }, + "air quality" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "qualidade do r" + } + } + } + }, "Air quality index %d, %@" : { "comment" : "Air quality accessibility label", "localizations" : { @@ -2434,6 +2457,9 @@ } } }, + "airdrop" : { + "shouldTranslate" : false + }, "AirDrop" : { "localizations" : { "ar" : { @@ -2635,6 +2661,9 @@ } } }, + "airplay" : { + "shouldTranslate" : false + }, "album art" : { "localizations" : { "pt-BR" : { @@ -2645,6 +2674,16 @@ } } }, + "alert" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "alerta" + } + } + } + }, "All" : { "localizations" : { "pt-BR" : { @@ -2877,6 +2916,26 @@ } } }, + "Allow extension live activities" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Permitir extensões de atividades ao vivo" + } + } + } + }, + "Allow extension lock screen widgets" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Permitir extensões de widgets de tela de bloqueio" + } + } + } + }, "Allowed Features" : { "comment" : "A label describing the allowed features for an app extension.", "isCommentAutoGenerated" : true, @@ -3386,6 +3445,9 @@ } } }, + "apps" : { + "shouldTranslate" : false + }, "Apps using AtollExtensionKit will appear here once they request permission" : { "comment" : "A description below the placeholder text in the \"Search extensions...\" text field, explaining that apps using AtollExtensionKit will be listed here once they grant permission to use the app.", "isCommentAutoGenerated" : true, @@ -3398,6 +3460,16 @@ } } }, + "aqi" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "iqa" + } + } + } + }, "Are you sure you want to delete \"%@\"?" : { "comment" : "A confirmation prompt asking the user to confirm the deletion of a custom idle animation. The placeholder text inside the quotation marks should be replaced with the name of the animation.", "localizations" : { @@ -3489,6 +3561,16 @@ } } }, + "authorization" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "autorização" + } + } + } + }, "Authorize" : { "comment" : "A button that authorizes an app extension.", "isCommentAutoGenerated" : true, @@ -3523,6 +3605,16 @@ } } }, + "auto stop" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "parar automaticamente" + } + } + } + }, "auto switch" : { "localizations" : { "pt-BR" : { @@ -3783,6 +3875,16 @@ } } }, + "backlight" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "luz de fundo" + } + } + } + }, "Backlight" : { "comment" : "A control for adjusting the keyboard backlight intensity.", "isCommentAutoGenerated" : true, @@ -3795,6 +3897,26 @@ } } }, + "bar" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "barraa" + } + } + } + }, + "battery" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "bateria" + } + } + } + }, "Battery" : { "localizations" : { "ar" : { @@ -3939,6 +4061,26 @@ } } }, + "battery gauge" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "medidor de bateria" + } + } + } + }, + "battery hud" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "hud de bateria" + } + } + } + }, "Battery Indicator Styling" : { "comment" : "A section header in the Settings app that lists options for customizing the appearance of the battery indicator.", "isCommentAutoGenerated" : true, @@ -4051,6 +4193,16 @@ } } }, + "battery percent" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "porcentagem de bateria" + } + } + } + }, "Battery Settings" : { "localizations" : { "ar" : { @@ -4261,6 +4413,16 @@ } } }, + "battery text" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "texto da bateria" + } + } + } + }, "Battery Widget" : { "localizations" : { "pt-BR" : { @@ -4286,6 +4448,16 @@ "isCommentAutoGenerated" : true, "shouldTranslate" : false }, + "black" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "preto" + } + } + } + }, "Blue outline matches the notch canvas" : { "comment" : "A tooltip explaining that the blue outline in the animation preview matches the notch on a device.", "isCommentAutoGenerated" : true, @@ -4298,6 +4470,9 @@ } } }, + "bluetooth" : { + "shouldTranslate" : false + }, "Bluetooth Audio Devices" : { "comment" : "A section header that lists Bluetooth audio devices.", "isCommentAutoGenerated" : true, @@ -4467,6 +4642,16 @@ } } }, + "brightness" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "brilho" + } + } + } + }, "Brightness" : { "comment" : "A control that adjusts the brightness of the device.", "isCommentAutoGenerated" : true, @@ -4883,6 +5068,9 @@ } } }, + "celsius" : { + "shouldTranslate" : false + }, "Change" : { "localizations" : { "fr" : { @@ -4899,6 +5087,26 @@ } } }, + "charge" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "carregar" + } + } + } + }, + "charging" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "carregando" + } + } + } + }, "Charging" : { "comment" : "Charging fallback label when no estimate is available", "localizations" : { @@ -5000,6 +5208,16 @@ } } }, + "charging icon" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "ícone de carregamento" + } + } + } + }, "Charging on Hold: Desktop Mode" : { "localizations" : { "ar" : { @@ -5100,6 +5318,16 @@ } } }, + "charging percentage" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "porcentagem de carregamento" + } + } + } + }, "Check for Updates…" : { "localizations" : { "ar" : { @@ -5200,6 +5428,16 @@ } } }, + "chime" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "chime" + } + } + } + }, "Chip color" : { "comment" : "A label for the color of the chip in the lock screen reminder widget.", "isCommentAutoGenerated" : true, @@ -5568,6 +5806,19 @@ } } }, + "circular" : { + "shouldTranslate" : false + }, + "classic" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "clássico" + } + } + } + }, "Classic mode keeps the original translucent black background." : { "comment" : "A description of the \"Classic mode\" option in the Lock Screen Integration settings.", "isCommentAutoGenerated" : true, @@ -5808,6 +6059,16 @@ } } }, + "clipboard" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "área de transferência" + } + } + } + }, "Clipboard" : { "localizations" : { "fr" : { @@ -5888,6 +6149,16 @@ } } }, + "clock app" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "app do relógio" + } + } + } + }, "close" : { "localizations" : { "pt-BR" : { @@ -6072,6 +6343,16 @@ } } }, + "color formats" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "formatos de cores" + } + } + } + }, "Color Formats" : { "localizations" : { "fr" : { @@ -6088,6 +6369,16 @@ } } }, + "color history" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "histórico de cores" + } + } + } + }, "Color History" : { "localizations" : { "fr" : { @@ -6104,6 +6395,16 @@ } } }, + "color icon" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "cor do ícone" + } + } + } + }, "Color options control the icon and progress bar appearance. Auto adapts to system theme." : { "comment" : "A description under the \"Appearance\" section of the Custom OSD settings, explaining that the color options control the icon and progress bar appearance, and that \"Auto\" automatically adapts to the system theme.", "isCommentAutoGenerated" : true, @@ -6132,6 +6433,16 @@ } } }, + "color picker" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "selecionar cor" + } + } + } + }, "Color Picker" : { "localizations" : { "fr" : { @@ -6180,6 +6491,16 @@ } } }, + "Color-coded battery display" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Exibição de bateria codificada por cores" + } + } + } + }, "Color-coded fills and smooth gradients are unavailable in Segmented mode. Switch to Hierarchical or Gradient to adjust these options." : { "comment" : "An explanatory text that appears when the user tries to enable color-coded color gradients in Segmented progress bars. It instructs the user to switch to Hierarchical or Gradient progress bars to enable these features.", "isCommentAutoGenerated" : true, @@ -6204,6 +6525,16 @@ } } }, + "Color-coded volume display" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Exibição de volume codificada por cores" + } + } + } + }, "ColorPicker Disabled" : { "localizations" : { "fr" : { @@ -6320,6 +6651,16 @@ } } }, + "compact" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "compacto" + } + } + } + }, "completed" : { "localizations" : { "pt-BR" : { @@ -6524,6 +6865,26 @@ } } }, + "controller" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "controlador" + } + } + } + }, + "controls" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "controles" + } + } + } + }, "Controls" : { "localizations" : { "fr" : { @@ -6570,6 +6931,16 @@ } } }, + "copy" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "copiar" + } + } + } + }, "Copy event link" : { "comment" : "A tooltip for a button that copies the link of a reminder event to the clipboard.", "isCommentAutoGenerated" : true, @@ -6699,6 +7070,9 @@ } } }, + "cpu" : { + "shouldTranslate" : false + }, "CPU Usage" : { "localizations" : { "fr" : { @@ -6814,6 +7188,16 @@ "cursor" : { "shouldTranslate" : false }, + "custom" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "customizado" + } + } + } + }, "Custom height" : { "localizations" : { "ar" : { @@ -7156,6 +7540,16 @@ } } }, + "custom osd" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "osd customizado" + } + } + } + }, "Custom OSD" : { "comment" : "The title of the settings screen for customizing the OSD.", "isCommentAutoGenerated" : true, @@ -7692,6 +8086,16 @@ } } }, + "device name" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "nome do dispositivo" + } + } + } + }, "Devices" : { "comment" : "The title of the \"Devices\" section in the settings menu.", "isCommentAutoGenerated" : true, @@ -7704,6 +8108,16 @@ } } }, + "diagnostics" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "diagnósticos" + } + } + } + }, "Diagnostics" : { "comment" : "A section header in the Lock Screen Settings view, describing diagnostics-related functionality.", "isCommentAutoGenerated" : true, @@ -7851,6 +8265,26 @@ } } }, + "disk" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "disco" + } + } + } + }, + "Disk I/O" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "I/O de Disco" + } + } + } + }, "Disk Read" : { "localizations" : { "fr" : { @@ -7967,6 +8401,9 @@ } } }, + "dock" : { + "shouldTranslate" : false + }, "Donate" : { "comment" : "A button label that says \"Donate\".", "isCommentAutoGenerated" : true, @@ -8227,6 +8664,16 @@ }, "shouldTranslate" : false }, + "drag" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "arrastar" + } + } + } + }, "Drag a control onto a slot or tap to place it in the first empty slot." : { "comment" : "A description below the control palette that explains how users can interact with it.", "isCommentAutoGenerated" : true, @@ -8638,6 +9085,16 @@ } } }, + "enable" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "ativar" + } + } + } + }, "Enable \"Show cool face animation while inactivity\" to customize animations" : { "comment" : "A message displayed below the section header in the IdleAnimationsSettingsSection, explaining that users can customize animations by enabling this feature.", "isCommentAutoGenerated" : true, @@ -8650,6 +9107,26 @@ } } }, + "Enable album art parallax" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ativar paralax na capa do álbum" + } + } + } + }, + "Enable album art parallax effect" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ativar efeito paralax na capa do álbum" + } + } + } + }, "Enable and style the media controls that appear above the system clock when the screen is locked." : { "comment" : "A description of the media panel settings in the lock screen settings view.", "isCommentAutoGenerated" : true, @@ -8672,6 +9149,26 @@ } } }, + "Enable Clipboard Manager" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ativar Gerenciador da Área de Transferência" + } + } + } + }, + "Enable Color Picker" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ativar Seletor de Cor" + } + } + } + }, "Enable colored spectrograms" : { "localizations" : { "pt-BR" : { @@ -8698,6 +9195,16 @@ } } }, + "Enable Custom OSD" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ativar OSD customizado " + } + } + } + }, "Enable customizable controls" : { "comment" : "A toggle that allows users to enable or disable customizable controls for media playback.", "isCommentAutoGenerated" : true, @@ -8730,6 +9237,16 @@ } } }, + "Enable extension diagnostics logging" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ativar o registro de diagnósticos de extensão" + } + } + } + }, "Enable extensions to allow third-party apps to display live activities and lock screen widgets in Atoll." : { "comment" : "A footer text that explains the purpose of enabling extensions.", "isCommentAutoGenerated" : true, @@ -8752,6 +9269,16 @@ } } }, + "Enable global keyboard shortcuts" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Habilitar atalhos de teclado globais" + } + } + } + }, "Enable global keyboard shortcuts above to customize your shortcuts." : { "localizations" : { "pt-BR" : { @@ -8762,6 +9289,16 @@ } } }, + "Enable glowing effect" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Habilitar efeito brilhante" + } + } + } + }, "Enable graph visibility in Settings → Stats to view performance data." : { "comment" : "A message displayed when no graphs are enabled in the Stats tab.", "isCommentAutoGenerated" : true, @@ -8874,6 +9411,26 @@ } } }, + "Enable lock screen live activity" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ativar a atividade ao vivo da tela de bloqueio" + } + } + } + }, + "Enable lyrics" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ativar letras" + } + } + } + }, "Enable media panel blur" : { "comment" : "A toggle switch that enables or disables the blur effect on the media panel.", "isCommentAutoGenerated" : true, @@ -9006,6 +9563,16 @@ } } }, + "Enable Screen Assistant" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ativar Assistente de Tela" + } + } + } + }, "Enable screen color picking functionality. Use Cmd+Shift+P to quickly access the color picker." : { "localizations" : { "pt-BR" : { @@ -9016,6 +9583,16 @@ } } }, + "Enable shelf" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ativar mesa" + } + } + } + }, "Enable sneak peek" : { "localizations" : { "fr" : { @@ -9042,6 +9619,16 @@ } } }, + "Enable system stats monitoring" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Habilitar o monitoramento de estatísticas do sistema" + } + } + } + }, "Enable the battery capsule and configure its layout." : { "localizations" : { "pt-BR" : { @@ -9086,6 +9673,26 @@ } } }, + "Enable third-party extensions" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Habilitar extensões de terceiros" + } + } + } + }, + "Enable timer feature" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ativar recurso de temporizador" + } + } + } + }, "Enable timer live activity" : { "localizations" : { "pt-BR" : { @@ -9658,6 +10265,16 @@ } } }, + "extensions" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "extensões" + } + } + } + }, "Extensions" : { "localizations" : { "ar" : { @@ -9776,6 +10393,16 @@ } } }, + "eyedropper" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "eyedropper" + } + } + } + }, "face animation" : { "localizations" : { "pt-BR" : { @@ -9786,6 +10413,9 @@ } } }, + "fahrenheit" : { + "shouldTranslate" : false + }, "feedback" : { "shouldTranslate" : false }, @@ -9983,6 +10613,9 @@ } } }, + "frosted" : { + "shouldTranslate" : false + }, "Full Access" : { "localizations" : { "pt-BR" : { @@ -10004,6 +10637,26 @@ } } }, + "gauge" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "medidor" + } + } + } + }, + "gauge tint" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "tom do medidor" + } + } + } + }, "Gemini API Key" : { "localizations" : { "fr" : { @@ -10569,6 +11222,16 @@ }, "shouldTranslate" : false }, + "glass" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "vidro" + } + } + } + }, "Glass mode" : { "localizations" : { "pt-BR" : { @@ -10591,6 +11254,16 @@ } } }, + "glow" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "brilho" + } + } + } + }, "Got it!" : { "localizations" : { "ar" : { @@ -10691,6 +11364,9 @@ } } }, + "gpu" : { + "shouldTranslate" : false + }, "GPU Usage" : { "localizations" : { "fr" : { @@ -10707,6 +11383,16 @@ } } }, + "gradient" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "gradiente" + } + } + } + }, "Gradient" : { "localizations" : { "ar" : { @@ -10807,6 +11493,16 @@ } } }, + "graph" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "gráfico" + } + } + } + }, "Graph Visibility" : { "localizations" : { "fr" : { @@ -10823,6 +11519,36 @@ } } }, + "graphics" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "gráficos" + } + } + } + }, + "gray" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "cinza" + } + } + } + }, + "grid" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "grade" + } + } + } + }, "haptic" : { "localizations" : { "pt-BR" : { @@ -10843,6 +11569,9 @@ } } }, + "hex" : { + "shouldTranslate" : false + }, "Hide" : { "localizations" : { "fr" : { @@ -11220,6 +11949,16 @@ } } }, + "history" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "histórico" + } + } + } + }, "History Size" : { "localizations" : { "fr" : { @@ -11261,6 +12000,9 @@ } } }, + "hsl" : { + "shouldTranslate" : false + }, "https://example.com/animation.json" : { "comment" : "A placeholder text for a Lottie JSON URL input field.", "isCommentAutoGenerated" : true, @@ -11375,6 +12117,9 @@ }, "shouldTranslate" : false }, + "hud" : { + "shouldTranslate" : false + }, "HUD Position" : { "localizations" : { "pt-BR" : { @@ -11823,6 +12568,26 @@ } } }, + "indicator" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "indicador" + } + } + } + }, + "inline" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "em linha" + } + } + } + }, "Inline" : { "localizations" : { "ar" : { @@ -11943,6 +12708,9 @@ } } }, + "io" : { + "shouldTranslate" : false + }, "IPv4 · %@" : { "comment" : "A label displaying an IP address for a network interface. The text inside the parentheses is the IP address of the interface.", "isCommentAutoGenerated" : true, @@ -11979,6 +12747,16 @@ } } }, + "keyboard" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "teclado" + } + } + } + }, "Keyboard Backlight HUD" : { "localizations" : { "fr" : { @@ -12035,6 +12813,16 @@ } } }, + "laptop icon" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "ícone do laptop" + } + } + } + }, "Last Denied Reason:" : { "comment" : "A label for the \"Last Denied Reason\" section in the extensions settings view.", "isCommentAutoGenerated" : true, @@ -12220,6 +13008,16 @@ }, "shouldTranslate" : false }, + "liquid" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "líquido" + } + } + } + }, "Liquid Glass requires macOS 26 or later." : { "localizations" : { "fr" : { @@ -12236,6 +13034,16 @@ } } }, + "list" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "lista" + } + } + } + }, "Listens for Focus session changes via distributed notifications" : { "localizations" : { "pt-BR" : { @@ -12258,6 +13066,16 @@ } } }, + "live activities" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "atividade ao vivo" + } + } + } + }, "Live Activities" : { "comment" : "The title of the \"Live Activities\" screen.", "isCommentAutoGenerated" : true, @@ -12350,6 +13168,16 @@ } } }, + "location" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "localização" + } + } + } + }, "lock screen" : { "localizations" : { "pt-BR" : { @@ -12418,6 +13246,16 @@ } } }, + "lock screen media" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "mídia da tela de bloqueio" + } + } + } + }, "Lock Screen Media" : { "localizations" : { "pt-BR" : { @@ -12464,6 +13302,16 @@ } } }, + "lock screen timer" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "timer da tela de bloqueio" + } + } + } + }, "Lock Screen Widgets" : { "comment" : "A toggle that enables or disables the use of lock screen widgets by the extension.", "isCommentAutoGenerated" : true, @@ -12476,6 +13324,16 @@ } } }, + "logging" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "relatório" + } + } + } + }, "Loop Mode" : { "localizations" : { "pt-BR" : { @@ -12687,6 +13545,16 @@ } } }, + "low battery" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "bateria baixa" + } + } + } + }, "Low Power Mode" : { "localizations" : { "ar" : { @@ -12787,6 +13655,16 @@ } } }, + "lyrics" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "letras" + } + } + } + }, "Mac battery at %d percent" : { "comment" : "Mac battery gauge accessibility label", "localizations" : { @@ -12822,6 +13700,16 @@ } } }, + "Manage app permissions" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Gerenciar permissões de aplicativos" + } + } + } + }, "Manage indicator preferences from Settings → Privacy. No manual microphone toggle is required." : { "comment" : "A description of how to manage the microphone privacy indicator preferences.", "isCommentAutoGenerated" : true, @@ -12834,6 +13722,16 @@ } } }, + "manager" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "gerenciador" + } + } + } + }, "Mark as complete" : { "comment" : "An accessibility label for a button that marks an item as complete.", "isCommentAutoGenerated" : true, @@ -12858,6 +13756,16 @@ } } }, + "marquee" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "marquee" + } + } + } + }, "Match menubar height" : { "localizations" : { "ar" : { @@ -13058,6 +13966,9 @@ } } }, + "material" : { + "shouldTranslate" : false + }, "Material" : { "comment" : "A picker that lets the user select the material of the lock screen glass.", "isCommentAutoGenerated" : true, @@ -13599,6 +14510,16 @@ } } }, + "media output" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "saída de mídia" + } + } + } + }, "Media output" : { "comment" : "Accessibility label describing the control that opens the media output selector.", "isCommentAutoGenerated" : true, @@ -13611,6 +14532,16 @@ } } }, + "media panel" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "painel de mídia" + } + } + } + }, "Media Panel" : { "comment" : "A section header in the lock screen settings view.", "isCommentAutoGenerated" : true, @@ -13723,6 +14654,16 @@ } } }, + "media source" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "fonte de mídia" + } + } + } + }, "Media Source" : { "localizations" : { "ar" : { @@ -13934,6 +14875,16 @@ } } }, + "memory" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "memória" + } + } + } + }, "Memory Usage" : { "localizations" : { "fr" : { @@ -14528,6 +15479,16 @@ } } }, + "mode" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "modo" + } + } + } + }, "Monitor clipboard changes and keep a history of recent copies. Use Cmd+Shift+V to quickly access clipboard history." : { "localizations" : { "pt-BR" : { @@ -14550,6 +15511,16 @@ } } }, + "monitoring" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "monitoramento" + } + } + } + }, "Monitoring Behavior" : { "localizations" : { "pt-BR" : { @@ -14576,6 +15547,16 @@ } } }, + "monochrome" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "monocromático" + } + } + } + }, "More" : { "localizations" : { "ar" : { @@ -15144,6 +16125,26 @@ } } }, + "network" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "rede" + } + } + } + }, + "Network Activity" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Atividade de Rede" + } + } + } + }, "Network Download" : { "localizations" : { "fr" : { @@ -16376,6 +17377,16 @@ } } }, + "notifications" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "notificações" + } + } + } + }, "Notify before" : { "comment" : "A label describing the slider that allows the user to set a reminder lead time.", "isCommentAutoGenerated" : true, @@ -16489,6 +17500,16 @@ }, "shouldTranslate" : false }, + "on-screen display" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Exibição na tela" + } + } + } + }, "One or more files failed to load" : { "localizations" : { "ar" : { @@ -16645,6 +17666,16 @@ } } }, + "open meteo" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "open meteo" + } + } + } + }, "Open Model Settings" : { "localizations" : { "pt-BR" : { @@ -16665,6 +17696,16 @@ } } }, + "Open shelf tab by default if items added" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Abra a guia da mesa por padrão se os itens forem adicionados" + } + } + } + }, "Open System Settings" : { "localizations" : { "pt-BR" : { @@ -16705,6 +17746,9 @@ } } }, + "osd" : { + "shouldTranslate" : false + }, "Output devices" : { "comment" : "Section title for the list of available audio output devices in the media output selector.", "isCommentAutoGenerated" : true, @@ -16741,6 +17785,16 @@ } } }, + "panel border" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "borda do painel" + } + } + } + }, "Panel mode shows clipboard in a floating window near the notch." : { "comment" : "A description of the \"Panel\" clipboard display mode.", "isCommentAutoGenerated" : true, @@ -16773,6 +17827,19 @@ } } }, + "parallax" : { + "shouldTranslate" : false + }, + "parallax effect" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "efeito parallax" + } + } + } + }, "Pause" : { "shouldTranslate" : false }, @@ -16788,6 +17855,16 @@ } } }, + "percentages" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "porcentagem" + } + } + } + }, "Permission States:" : { "comment" : "A label describing the different permission states displayed in the footer of the extensions settings view.", "isCommentAutoGenerated" : true, @@ -16800,6 +17877,16 @@ } } }, + "permissions" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "permissões" + } + } + } + }, "Permissions" : { "localizations" : { "pt-BR" : { @@ -16910,6 +17997,26 @@ } } }, + "Play lock/unlock sounds" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Reproduzir sons de bloqueio/desbloqueio" + } + } + } + }, + "Play low battery alert sound" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Reproduzir som de alerta de bateria fraca" + } + } + } + }, "Player tinting" : { "localizations" : { "pt-BR" : { @@ -17090,6 +18197,36 @@ } } }, + "power" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "energia" + } + } + } + }, + "power icons" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "ícones de energia" + } + } + } + }, + "preset" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "pré-definição" + } + } + } + }, "Preset name" : { "comment" : "A label for the name of a timer preset.", "isCommentAutoGenerated" : true, @@ -17144,6 +18281,16 @@ } } }, + "preview" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "pré-vizualização" + } + } + } + }, "Preview" : { "localizations" : { "fr" : { @@ -17206,6 +18353,16 @@ } } }, + "progress" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "progresso" + } + } + } + }, "Progress style" : { "localizations" : { "pt-BR" : { @@ -17549,6 +18706,9 @@ } } }, + "ram" : { + "shouldTranslate" : false + }, "Re-authorize" : { "comment" : "A button that re-authorizes an app when pressed.", "isCommentAutoGenerated" : true, @@ -17987,6 +19147,16 @@ } } }, + "remove" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "remover" + } + } + } + }, "Remove" : { "comment" : "A button that removes an extension from the authorized list.", "isCommentAutoGenerated" : true, @@ -18337,6 +19507,16 @@ } } }, + "ring" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "círculo" + } + } + } + }, "Ring" : { "localizations" : { "pt-BR" : { @@ -18347,6 +19527,16 @@ } } }, + "route picker" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "seletor de rota" + } + } + } + }, "Sampling can continue while the notch is closed when the timeout is disabled." : { "localizations" : { "pt-BR" : { @@ -18405,6 +19595,16 @@ } } }, + "scale" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "escala" + } + } + } + }, "Scale Down" : { "localizations" : { "fr" : { @@ -18437,6 +19637,16 @@ } } }, + "screen assistant" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "assistente de tela" + } + } + } + }, "Screen Assistant" : { "localizations" : { "pt-BR" : { @@ -18550,6 +19760,16 @@ } } }, + "Scroll device name in HUD" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Rolar o nome do dispositivo no HUD" + } + } + } + }, "Search clipboard..." : { "localizations" : { "fr" : { @@ -19222,6 +20442,26 @@ } } }, + "share" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "compartilhar" + } + } + } + }, + "shelf" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "mesa" + } + } + } + }, "Shelf" : { "localizations" : { "ar" : { @@ -19322,6 +20562,26 @@ } } }, + "shelf tab" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "aba da mesa" + } + } + } + }, + "shortcut" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "atalho" + } + } + } + }, "Shortcuts" : { "localizations" : { "ar" : { @@ -19422,6 +20682,76 @@ } } }, + "Show All Color Formats" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mostrar Todos Os Formatos De Cores" + } + } + } + }, + "Show AQI widget" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mostrar widget QAI" + } + } + } + }, + "Show battery indicator" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mostrar indicador de bateria" + } + } + } + }, + "Show battery percentage" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mostrar porcentagem da bateria" + } + } + } + }, + "Show battery percentage text in HUD" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mostrar texto de porcentagem de bateria no HUD" + } + } + } + }, + "Show Bluetooth battery" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mostrar bateria do bluetooth" + } + } + } + }, + "Show Bluetooth device connections" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mostrar conexões do dispositivo Bluetooth" + } + } + } + }, "Show calendar" : { "localizations" : { "pt-BR" : { @@ -19432,6 +20762,46 @@ } } }, + "Show Change Media Output control" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mostrar Mudança no Controle De Saída De Mídia" + } + } + } + }, + "Show charging percentage" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mostrar porcentagem de carregamento" + } + } + } + }, + "Show charging status" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mostrar status de carregamento" + } + } + } + }, + "Show Clipboard Icon" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mostrar ícone da área de transferência" + } + } + } + }, "Show Color History" : { "localizations" : { "fr" : { @@ -19448,6 +20818,16 @@ } } }, + "Show Color Picker Icon" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mostrar ícone do seletor de cores" + } + } + } + }, "Show Color Picker Panel" : { "localizations" : { "pt-BR" : { @@ -19500,6 +20880,26 @@ } } }, + "Show location label" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mostrar etiqueta de localização" + } + } + } + }, + "Show lock screen media panel" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mostrar painel de mídia da tela de bloqueio" + } + } + } + }, "Show lock screen reminder" : { "localizations" : { "pt-BR" : { @@ -19510,6 +20910,46 @@ } } }, + "Show lock screen timer" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mostrar temporizador da tela de bloqueio" + } + } + } + }, + "Show lock screen timer widget" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mostrar widget do temporizador na tela de bloqueio" + } + } + } + }, + "Show lock screen weather" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mostrar o clima na tela de bloqueio" + } + } + } + }, + "Show media app icon" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mostrar ícone do aplicativo de mídia" + } + } + } + }, "Show on a specific display" : { "localizations" : { "ar" : { @@ -19710,6 +21150,16 @@ } } }, + "Show panel border" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mostrar borda do painel " + } + } + } + }, "Show Percentage" : { "localizations" : { "pt-BR" : { @@ -19720,6 +21170,36 @@ } } }, + "Show percentages beside progress bars" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mostrar porcentagens ao lado da barra de progresso" + } + } + } + }, + "Show power status icons" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mostrar ícones de status de energia" + } + } + } + }, + "Show power status notifications" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mostrar notificações de status de energia" + } + } + } + }, "Show preset list in timer tab" : { "comment" : "A toggle that lets users decide whether to show a list of presets in the timer tab.", "isCommentAutoGenerated" : true, @@ -19822,6 +21302,16 @@ } } }, + "skip" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "pular" + } + } + } + }, "Skip buttons" : { "comment" : "A section header that lists the skip behaviour options.", "isCommentAutoGenerated" : true, @@ -19954,6 +21444,26 @@ } } }, + "smooth" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "suave" + } + } + } + }, + "Smooth color transitions" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Transição suave de cores" + } + } + } + }, "Smooth transitions blend Green (0–60%), Yellow (60–85%), and Red (85–100%) through the entire fill." : { "comment" : "A description of how the color-coding feature works.", "isCommentAutoGenerated" : true, @@ -19976,6 +21486,16 @@ } } }, + "sneak peek" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "espiar" + } + } + } + }, "Sneak peek duration" : { "comment" : "A label describing the duration of the \"sneak peek\" feature in the calendar settings.", "isCommentAutoGenerated" : true, @@ -20300,6 +21820,16 @@ } } }, + "solid" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "sólido" + } + } + } + }, "Solid colour" : { "localizations" : { "pt-BR" : { @@ -20310,6 +21840,26 @@ } } }, + "song text" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "texto do som" + } + } + } + }, + "sound" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "som" + } + } + } + }, "spectrogram" : { "localizations" : { "pt-BR" : { @@ -20520,6 +22070,16 @@ } } }, + "standard" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "padrão" + } + } + } + }, "Standard" : { "localizations" : { "pt-BR" : { @@ -20710,6 +22270,16 @@ } } }, + "stats" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "status" + } + } + } + }, "Stats" : { "localizations" : { "fr" : { @@ -20815,6 +22385,16 @@ } } }, + "Stop monitoring after closing the notch" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Parar de monitorar depois de fechar o entalho" + } + } + } + }, "Stop recording" : { "localizations" : { "fr" : { @@ -20931,6 +22511,16 @@ } } }, + "style" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "estilo" + } + } + } + }, "Style" : { "localizations" : { "pt-BR" : { @@ -21128,6 +22718,16 @@ } } }, + "system timer" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "timer do sistema" + } + } + } + }, "Take area screenshot" : { "localizations" : { "fr" : { @@ -21187,6 +22787,16 @@ } } }, + "third party" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "terceiros" + } + } + } + }, "Third-party apps using AtollExtensionKit can display live activities, lock screen widgets, and dedicated notch experiences. Toggle features above or manage individual app permissions below." : { "comment" : "A footer text that explains the purpose of the \"Global Settings\" section in the Extensions settings view.", "isCommentAutoGenerated" : true, @@ -21333,6 +22943,16 @@ } } }, + "timer" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "temporizador" + } + } + } + }, "Timer" : { "localizations" : { "fr" : { @@ -21349,6 +22969,16 @@ } } }, + "timer colour" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "cor do temporizador" + } + } + } + }, "Timer controls appear as" : { "comment" : "A picker that lets the user choose how the timer controls are displayed.", "isCommentAutoGenerated" : true, @@ -21409,6 +23039,16 @@ } } }, + "timer glass" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "vidro do temporizador" + } + } + } + }, "Timer glass material" : { "comment" : "A label displayed above a picker for selecting the material of the timer glass.", "isCommentAutoGenerated" : true, @@ -21433,6 +23073,16 @@ } } }, + "timer material" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "material do temporizador" + } + } + } + }, "Timer Presets" : { "comment" : "A section header in the timer settings view, describing timer presets.", "isCommentAutoGenerated" : true, @@ -21483,6 +23133,26 @@ } } }, + "timer variant" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "variante do temporizador" + } + } + } + }, + "timer widget" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "widget do temporizador" + } + } + } + }, "Timer Widget" : { "comment" : "A section header for the timer widget settings.", "isCommentAutoGenerated" : true, @@ -22340,6 +24010,16 @@ } } }, + "Use accent color" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Usar cor de destaque" + } + } + } + }, "Use Accent Color" : { "localizations" : { "pt-BR" : { @@ -22350,6 +24030,36 @@ } } }, + "Use circular battery indicator" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Usar o indicador de bateria circular" + } + } + } + }, + "Use colored gauges" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Use medidores coloridos" + } + } + } + }, + "Use MacBook icon when on battery" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Use o ícone do MacBook quando estiver com bateria" + } + } + } + }, "Use music visualizer spectrogram" : { "localizations" : { "ar" : { @@ -22887,6 +24597,9 @@ } } }, + "volume" : { + "shouldTranslate" : false + }, "Volume" : { "comment" : "A button that sets the preview to show a volume OSD.", "isCommentAutoGenerated" : true, @@ -22927,6 +24640,16 @@ } } }, + "weather" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "tempo" + } + } + } + }, "Weather" : { "comment" : "A label and its accompanying text displayed in a lock screen panel.", "isCommentAutoGenerated" : true, @@ -22949,6 +24672,26 @@ } } }, + "weather layout" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "layout do tempo" + } + } + } + }, + "weather widget" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "widget do tempo" + } + } + } + }, "Weather Widget" : { "comment" : "A section header in the Lock Screen Settings view.", "isCommentAutoGenerated" : true, @@ -23237,6 +24980,16 @@ } } }, + "white" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "branco" + } + } + } + }, "White" : { "localizations" : { "pt-BR" : { @@ -23259,6 +25012,9 @@ } } }, + "widgets" : { + "shouldTranslate" : false + }, "width" : { "localizations" : { "pt-BR" : { @@ -23327,6 +25083,16 @@ } } }, + "wttr" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "wttr" + } + } + } + }, "You" : { "localizations" : { "fr" : { diff --git a/DynamicIsland/components/Settings/SettingsView.swift b/DynamicIsland/components/Settings/SettingsView.swift index 41f9cd6..5048d4f 100644 --- a/DynamicIsland/components/Settings/SettingsView.swift +++ b/DynamicIsland/components/Settings/SettingsView.swift @@ -250,13 +250,13 @@ struct SettingsView: View { @State private var searchText: String = "" @StateObject private var highlightCoordinator = SettingsHighlightCoordinator() @Default(.enableMinimalisticUI) var enableMinimalisticUI - + let updaterController: SPUStandardUpdaterController? - + init(updaterController: SPUStandardUpdaterController? = nil) { self.updaterController = updaterController } - + var body: some View { NavigationSplitView { VStack(spacing: 12) { @@ -267,10 +267,10 @@ struct SettingsView: View { ) .padding(.horizontal, 12) .padding(.top, 12) - + Divider() .padding(.horizontal, 12) - + List(filteredTabs, selection: selectionBinding) { tab in NavigationLink(value: tab) { HStack(spacing: 10) { @@ -349,11 +349,11 @@ struct SettingsView: View { .ignoresSafeArea() } } - + private var resolvedSelection: SettingsTab { availableTabs.contains(selectedTab) ? selectedTab : (availableTabs.first ?? .general) } - + @ToolbarContentBuilder private var toolbarSpacingShim: some ToolbarContent { if #available(macOS 26.0, *) { @@ -367,7 +367,7 @@ struct SettingsView: View { } } } - + @ViewBuilder private var toolbarSpacerView: some View { Color.clear @@ -375,11 +375,11 @@ struct SettingsView: View { .allowsHitTesting(false) .accessibilityHidden(true) } - + private var filteredTabs: [SettingsTab] { tabsMatchingSearch(searchText) } - + private var selectionBinding: Binding { Binding( get: { resolvedSelection }, @@ -388,7 +388,7 @@ struct SettingsView: View { } ) } - + @ViewBuilder private func sidebarIcon(for tab: SettingsTab) -> some View { RoundedRectangle(cornerRadius: 8, style: .continuous) @@ -400,7 +400,7 @@ struct SettingsView: View { .foregroundStyle(Color.white) } } - + private var availableTabs: [SettingsTab] { let ordered: [SettingsTab] = [ .general, @@ -424,40 +424,40 @@ struct SettingsView: View { .extensions, .about ] - + return ordered.filter { isTabVisible($0) } } - + private func tabsMatchingSearch(_ query: String) -> [SettingsTab] { let trimmed = query.trimmingCharacters(in: .whitespacesAndNewlines) guard !trimmed.isEmpty else { return availableTabs } - + let entryMatches = searchEntries(matching: trimmed) let matchingTabs = Set(entryMatches.map(\.tab)) - + return availableTabs.filter { tab in tab.title.localizedCaseInsensitiveContains(trimmed) || matchingTabs.contains(tab) } } - + private var searchSuggestions: [SettingsSearchEntry] { Array(searchEntries(matching: searchText).filter { $0.tab != .downloads }.prefix(8)) } - + private func handleSearchSuggestionSelection(_ suggestion: SettingsSearchEntry) { guard suggestion.tab != .downloads else { return } highlightCoordinator.focus(on: suggestion) selectedTab = suggestion.tab } - + private struct SettingsSidebarSearchBar: View { @Binding var text: String let suggestions: [SettingsSearchEntry] let onSuggestionSelected: (SettingsSearchEntry) -> Void - + @FocusState private var isFocused: Bool @State private var hoveredSuggestionID: SettingsSearchEntry.ID? - + var body: some View { VStack(spacing: 6) { searchField @@ -467,21 +467,21 @@ struct SettingsView: View { } .animation(.easeInOut(duration: 0.15), value: showSuggestions) } - + private var showSuggestions: Bool { isFocused && !text.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty && !suggestions.isEmpty } - + private var searchField: some View { HStack(spacing: 6) { Image(systemName: "magnifyingglass") .foregroundStyle(Color.secondary) - + TextField("Search Settings", text: $text) .textFieldStyle(.plain) .focused($isFocused) .onSubmit(triggerFirstSuggestion) - + if !text.isEmpty { Button { text = "" @@ -505,7 +505,7 @@ struct SettingsView: View { .stroke(Color.white.opacity(0.08)) ) } - + private var suggestionList: some View { VStack(spacing: 0) { ForEach(suggestions) { suggestion in @@ -521,7 +521,7 @@ struct SettingsView: View { .font(.system(size: 13, weight: .semibold)) .foregroundStyle(Color.white) } - + VStack(alignment: .leading, spacing: 2) { Text(suggestion.title) .font(.system(size: 13, weight: .semibold)) @@ -530,7 +530,7 @@ struct SettingsView: View { .font(.system(size: 11)) .foregroundStyle(Color.secondary) } - + Spacer(minLength: 0) } .padding(.horizontal, 10) @@ -542,7 +542,7 @@ struct SettingsView: View { .onHover { hovering in hoveredSuggestionID = hovering ? suggestion.id : (hoveredSuggestionID == suggestion.id ? nil : hoveredSuggestionID) } - + if suggestion.id != suggestions.last?.id { Divider() .padding(.leading, 48) @@ -560,27 +560,27 @@ struct SettingsView: View { .shadow(color: Color.black.opacity(0.2), radius: 8, y: 4) .transition(.opacity.combined(with: .move(edge: .top))) } - + private func rowBackground(for suggestion: SettingsSearchEntry) -> some View { RoundedRectangle(cornerRadius: 8, style: .continuous) .fill(hoveredSuggestionID == suggestion.id ? Color.white.opacity(0.08) : Color.clear) } - + private func selectSuggestion(_ suggestion: SettingsSearchEntry) { onSuggestionSelected(suggestion) isFocused = false } - + private func triggerFirstSuggestion() { guard let first = suggestions.first else { return } selectSuggestion(first) } } - + private func searchEntries(matching query: String) -> [SettingsSearchEntry] { let trimmed = query.trimmingCharacters(in: .whitespacesAndNewlines) guard !trimmed.isEmpty else { return [] } - + return settingsSearchIndex .filter { availableTabs.contains($0.tab) } .filter { entry in @@ -588,7 +588,7 @@ struct SettingsView: View { entry.keywords.contains { $0.localizedCaseInsensitiveContains(trimmed) } } } - + private var settingsSearchIndex: [SettingsSearchEntry] { [ // General @@ -671,281 +671,746 @@ struct SettingsView: View { keywords: [String(localized: "hover to open"), String(localized: "auto open")], highlightID: SettingsTab.general.highlightID(for: "Open notch on hover") ), - SettingsSearchEntry( - tab: .general, - title: String(localized: "Notch display height"), - keywords: [String(localized: "display height"), String(localized: "menu bar size")], - highlightID: SettingsTab.general.highlightID(for: "Notch display height") - ), - - // Battery (Charge) - SettingsSearchEntry(tab: .battery, title: "Show battery indicator", keywords: ["battery hud", "charge"], highlightID: SettingsTab.battery.highlightID(for: "Show battery indicator")), - SettingsSearchEntry(tab: .battery, title: "Show battery percentage", keywords: ["battery percent"], highlightID: SettingsTab.battery.highlightID(for: "Show battery percentage")), - SettingsSearchEntry(tab: .battery, title: "Show power status notifications", keywords: ["notifications", "power"], highlightID: SettingsTab.battery.highlightID(for: "Show power status notifications")), - SettingsSearchEntry(tab: .battery, title: "Show power status icons", keywords: ["power icons", "charging icon"], highlightID: SettingsTab.battery.highlightID(for: "Show power status icons")), - SettingsSearchEntry(tab: .battery, title: "Play low battery alert sound", keywords: ["low battery", "alert", "sound"], highlightID: SettingsTab.battery.highlightID(for: "Play low battery alert sound")), - - // HUDs - SettingsSearchEntry(tab: .devices, title: "Show Bluetooth device connections", keywords: ["bluetooth", "hud"], highlightID: SettingsTab.devices.highlightID(for: "Show Bluetooth device connections")), - SettingsSearchEntry(tab: .devices, title: "Use circular battery indicator", keywords: ["battery", "circular"], highlightID: SettingsTab.devices.highlightID(for: "Use circular battery indicator")), - SettingsSearchEntry(tab: .devices, title: "Show battery percentage text in HUD", keywords: ["battery text"], highlightID: SettingsTab.devices.highlightID(for: "Show battery percentage text in HUD")), - SettingsSearchEntry(tab: .devices, title: "Scroll device name in HUD", keywords: ["marquee", "device name"], highlightID: SettingsTab.devices.highlightID(for: "Scroll device name in HUD")), - SettingsSearchEntry(tab: .devices, title: "Color-coded battery display", keywords: ["color", "battery"], highlightID: SettingsTab.devices.highlightID(for: "Color-coded battery display")), - SettingsSearchEntry(tab: .hudAndOSD, title: "Color-coded volume display", keywords: ["volume", "color"], highlightID: SettingsTab.hudAndOSD.highlightID(for: "Color-coded volume display")), - SettingsSearchEntry(tab: .hudAndOSD, title: "Smooth color transitions", keywords: ["gradient", "smooth"], highlightID: SettingsTab.hudAndOSD.highlightID(for: "Smooth color transitions")), - SettingsSearchEntry(tab: .hudAndOSD, title: "Show percentages beside progress bars", keywords: ["percentages", "progress"], highlightID: SettingsTab.hudAndOSD.highlightID(for: "Show percentages beside progress bars")), - SettingsSearchEntry(tab: .hudAndOSD, title: "HUD style", keywords: ["inline", "compact"], highlightID: SettingsTab.hudAndOSD.highlightID(for: "HUD style")), - SettingsSearchEntry(tab: .hudAndOSD, title: "Progressbar style", keywords: ["progress", "style"], highlightID: SettingsTab.hudAndOSD.highlightID(for: "Progressbar style")), - SettingsSearchEntry(tab: .hudAndOSD, title: "Enable glowing effect", keywords: ["glow", "indicator"], highlightID: SettingsTab.hudAndOSD.highlightID(for: "Enable glowing effect")), - SettingsSearchEntry(tab: .hudAndOSD, title: "Use accent color", keywords: ["accent", "color"], highlightID: SettingsTab.hudAndOSD.highlightID(for: "Use accent color")), - - // Custom OSD - SettingsSearchEntry(tab: .hudAndOSD, title: "Enable Custom OSD", keywords: ["osd", "on-screen display", "custom osd"], highlightID: SettingsTab.hudAndOSD.highlightID(for: "Enable Custom OSD")), - SettingsSearchEntry(tab: .hudAndOSD, title: "Volume OSD", keywords: ["volume", "osd"], highlightID: SettingsTab.hudAndOSD.highlightID(for: "Volume OSD")), - SettingsSearchEntry(tab: .hudAndOSD, title: "Brightness OSD", keywords: ["brightness", "osd"], highlightID: SettingsTab.hudAndOSD.highlightID(for: "Brightness OSD")), - SettingsSearchEntry(tab: .hudAndOSD, title: "Keyboard Backlight OSD", keywords: ["keyboard", "backlight", "osd"], highlightID: SettingsTab.hudAndOSD.highlightID(for: "Keyboard Backlight OSD")), - SettingsSearchEntry(tab: .hudAndOSD, title: "Material", keywords: ["material", "frosted", "liquid", "glass", "solid", "osd"], highlightID: SettingsTab.hudAndOSD.highlightID(for: "Material")), - SettingsSearchEntry(tab: .hudAndOSD, title: "Icon & Progress Color", keywords: ["color", "icon", "white", "black", "gray", "osd"], highlightID: SettingsTab.hudAndOSD.highlightID(for: "Icon & Progress Color")), - - // Media - SettingsSearchEntry(tab: .media, title: "Music Source", keywords: ["media source", "controller"], highlightID: SettingsTab.media.highlightID(for: "Music Source")), - SettingsSearchEntry(tab: .media, title: "Skip buttons", keywords: ["skip", "controls", "±10"], highlightID: SettingsTab.media.highlightID(for: "Skip buttons")), - SettingsSearchEntry(tab: .media, title: "Sneak Peek Style", keywords: ["sneak peek", "preview"], highlightID: SettingsTab.media.highlightID(for: "Sneak Peek Style")), - SettingsSearchEntry(tab: .media, title: "Enable lyrics", keywords: ["lyrics", "song text"], highlightID: SettingsTab.media.highlightID(for: "Enable lyrics")), - SettingsSearchEntry(tab: .media, title: "Show Change Media Output control", keywords: ["airplay", "route picker", "media output"], highlightID: SettingsTab.media.highlightID(for: "Show Change Media Output control")), - SettingsSearchEntry(tab: .media, title: "Enable album art parallax", keywords: ["parallax", "lock screen", "album art"], highlightID: SettingsTab.media.highlightID(for: "Enable album art parallax")), - SettingsSearchEntry(tab: .media, title: "Enable album art parallax effect", keywords: ["parallax", "parallax effect", "album art"], highlightID: SettingsTab.media.highlightID(for: "Enable album art parallax effect")), - - // Calendar - SettingsSearchEntry( - tab: .calendar, - title: String(localized: "Show calendar"), - keywords: [String(localized: "calendar"), String(localized: "events")], - highlightID: SettingsTab.calendar.highlightID(for: "Show calendar") - ), - SettingsSearchEntry( - tab: .calendar, - title: String(localized: "Enable reminder live activity"), - keywords: [String(localized: "reminder"), String(localized: "live activity")], - highlightID: SettingsTab.calendar.highlightID(for: "Enable reminder live activity") - ), - SettingsSearchEntry( - tab: .calendar, - title: String(localized:"Countdown style"), - keywords: [String(localized:"reminder countdown")], - highlightID: SettingsTab.calendar.highlightID(for: "Countdown style") - ), - SettingsSearchEntry( - tab: .calendar, - title: String(localized:"Show lock screen reminder"), - keywords: [String(localized:"lock screen"), String(localized:"reminder widget")], - highlightID: SettingsTab.calendar.highlightID(for: "Show lock screen reminder") - ), - SettingsSearchEntry( - tab: .calendar, - title: String(localized: "Chip color"), - keywords: [ - String(localized: "reminder chip"), - String(localized: "color") - ], - highlightID: SettingsTab.calendar.highlightID(for: "Chip color") - ), - SettingsSearchEntry( - tab: .calendar, - title: String(localized: "Hide all-day events"), - keywords: [ - String(localized: "calendar"), - String(localized: "all-day") - ], - highlightID: SettingsTab.calendar.highlightID(for: "Hide all-day events") - ), - SettingsSearchEntry( - tab: .calendar, - title: String(localized: "Hide completed reminders"), - keywords: [ - String(localized: "reminder"), - String(localized: "completed") - ], - highlightID: SettingsTab.calendar.highlightID(for: "Hide completed reminders") - ), - SettingsSearchEntry( - tab: .calendar, - title: String(localized: "Show full event titles"), - keywords: [ - String(localized: "calendar"), - String(localized: "titles") - ], - highlightID: SettingsTab.calendar.highlightID(for: "Show full event titles") - ), - SettingsSearchEntry( - tab: .calendar, - title: String(localized: "Auto-scroll to next event"), - keywords: [ - String(localized: "calendar"), - String(localized: "scroll") - ], - highlightID: SettingsTab.calendar.highlightID(for: "Auto-scroll to next event") - ), - - // Shelf - SettingsSearchEntry(tab: .shelf, title: "Enable shelf", keywords: ["shelf", "dock"], highlightID: SettingsTab.shelf.highlightID(for: "Enable shelf")), - SettingsSearchEntry(tab: .shelf, title: "Open shelf tab by default if items added", keywords: ["auto open", "shelf tab"], highlightID: SettingsTab.shelf.highlightID(for: "Open shelf tab by default if items added")), - SettingsSearchEntry(tab: .shelf, title: "Expanded drag detection area", keywords: ["shelf", "drag"], highlightID: SettingsTab.shelf.highlightID(for: "Expanded drag detection area")), - SettingsSearchEntry(tab: .shelf, title: "Copy items on drag", keywords: ["shelf", "drag", "copy"], highlightID: SettingsTab.shelf.highlightID(for: "Copy items on drag")), - SettingsSearchEntry(tab: .shelf, title: "Remove from shelf after dragging", keywords: ["shelf", "drag", "remove"], highlightID: SettingsTab.shelf.highlightID(for: "Remove from shelf after dragging")), - SettingsSearchEntry(tab: .shelf, title: "Quick Share Service", keywords: ["shelf", "share", "airdrop"], highlightID: SettingsTab.shelf.highlightID(for: "Quick Share Service")), - - // Appearance - SettingsSearchEntry( - tab: .appearance, - title: String(localized: "Settings icon in notch"), - keywords: [String(localized: "settings button"), String(localized: "toolbar")], - highlightID: SettingsTab.appearance.highlightID(for: "Settings icon in notch") - ), - SettingsSearchEntry( - tab: .appearance, - title: String(localized: "Enable window shadow"), - keywords: [String(localized: "shadow"), String(localized: "appearance")], - highlightID: SettingsTab.appearance.highlightID(for: "Enable window shadow") - ), - SettingsSearchEntry( - tab: .appearance, - title: String(localized: "Corner radius scaling"), - keywords: [String(localized: "corner radius"), String(localized: "shape")], - highlightID: SettingsTab.appearance.highlightID(for: "Corner radius scaling") - ), - SettingsSearchEntry( - tab: .appearance, - title: String(localized: "Use simpler close animation"), - keywords: [String(localized: "close animation"), String(localized: "notch")], - highlightID: SettingsTab.appearance.highlightID(for: "Use simpler close animation") - ), - SettingsSearchEntry( - tab: .appearance, - title: String(localized: "Notch Width"), - keywords: [String(localized: "expanded notch"), String(localized: "width"), String(localized: "resize")], - highlightID: SettingsTab.appearance.highlightID(for: "Expanded notch width") - ), - SettingsSearchEntry( - tab: .appearance, - title: String(localized: "Enable colored spectrograms"), keywords: [String(localized: "spectrogram"), String(localized: "audio")], - highlightID: SettingsTab.appearance.highlightID(for: "Enable colored spectrograms") - ), - SettingsSearchEntry( - tab: .appearance, - title: String(localized: "Enable blur effect behind album art"), - keywords: [String(localized: "blur"), String(localized: "album art")], - highlightID: SettingsTab.appearance.highlightID(for: "Enable blur effect behind album art") - ), - SettingsSearchEntry( - tab: .appearance, - title: String(localized: "Slider color"), - keywords: [String(localized: "slider"), String(localized: "accent")], - highlightID: SettingsTab.appearance.highlightID(for: "Slider color") - ), - SettingsSearchEntry( - tab: .appearance, - title: String(localized: "Enable Dynamic mirror"), - keywords: [String(localized: "mirror"), String(localized: "reflection")], - highlightID: SettingsTab.appearance.highlightID(for: "Enable Dynamic mirror") - ), - SettingsSearchEntry( - tab: .appearance, - title: String(localized: "Mirror shape"), - keywords: [String(localized: "mirror shape"), String(localized: "circle"), String(localized: "rectangle")], - highlightID: SettingsTab.appearance.highlightID(for: "Mirror shape") - ), - SettingsSearchEntry( - tab: .appearance, - title: String(localized: "Show cool face animation while inactivity"), - keywords: [String(localized: "face animation"), String(localized: "idle")], - highlightID: SettingsTab.appearance.highlightID(for: "Show cool face animation while inactivity") - ), - SettingsSearchEntry( - tab: .appearance, - title: String(localized: "App icon"), - keywords: [String(localized: "app icon"), String(localized: "custom icon")], - highlightID: SettingsTab.appearance.highlightID(for: "App icon") - ), - - // Lock Screen - SettingsSearchEntry(tab: .lockScreen, title: "Enable lock screen live activity", keywords: ["lock screen", "live activity"], highlightID: SettingsTab.lockScreen.highlightID(for: "Enable lock screen live activity")), - SettingsSearchEntry(tab: .lockScreen, title: "Play lock/unlock sounds", keywords: ["chime", "sound"], highlightID: SettingsTab.lockScreen.highlightID(for: "Play lock/unlock sounds")), - SettingsSearchEntry(tab: .lockScreen, title: "Material", keywords: ["glass", "frosted", "liquid"], highlightID: SettingsTab.lockScreen.highlightID(for: "Material")), - SettingsSearchEntry(tab: .lockScreen, title: "Show lock screen media panel", keywords: ["media panel", "lock screen media"], highlightID: SettingsTab.lockScreen.highlightID(for: "Show lock screen media panel")), - SettingsSearchEntry(tab: .lockScreen, title: "Show media app icon", keywords: ["app icon", "media"], highlightID: SettingsTab.lockScreen.highlightID(for: "Show media app icon")), - SettingsSearchEntry(tab: .lockScreen, title: "Show panel border", keywords: ["panel border"], highlightID: SettingsTab.lockScreen.highlightID(for: "Show panel border")), - SettingsSearchEntry(tab: .lockScreen, title: "Enable media panel blur", keywords: ["blur", "media panel"], highlightID: SettingsTab.lockScreen.highlightID(for: "Enable media panel blur")), - SettingsSearchEntry(tab: .lockScreen, title: "Show lock screen timer", keywords: ["timer widget", "lock screen timer"], highlightID: SettingsTab.lockScreen.highlightID(for: "Show lock screen timer")), - SettingsSearchEntry(tab: .lockScreen, title: "Timer surface", keywords: ["timer glass", "classic", "blur"], highlightID: SettingsTab.lockScreen.highlightID(for: "Timer surface")), - SettingsSearchEntry(tab: .lockScreen, title: "Timer glass material", keywords: ["frosted", "liquid", "timer material"], highlightID: SettingsTab.lockScreen.highlightID(for: "Timer glass material")), - SettingsSearchEntry(tab: .lockScreen, title: "Timer liquid mode", keywords: ["timer", "standard", "custom"], highlightID: SettingsTab.lockScreen.highlightID(for: "Timer liquid mode")), - SettingsSearchEntry(tab: .lockScreen, title: "Timer widget variant", keywords: ["timer variant", "liquid"], highlightID: SettingsTab.lockScreen.highlightID(for: "Timer widget variant")), - SettingsSearchEntry(tab: .lockScreen, title: "Show lock screen weather", keywords: ["weather widget"], highlightID: SettingsTab.lockScreen.highlightID(for: "Show lock screen weather")), - SettingsSearchEntry(tab: .lockScreen, title: "Layout", keywords: ["inline", "circular", "weather layout"], highlightID: SettingsTab.lockScreen.highlightID(for: "Layout")), - SettingsSearchEntry(tab: .lockScreen, title: "Weather data provider", keywords: ["wttr", "open meteo"], highlightID: SettingsTab.lockScreen.highlightID(for: "Weather data provider")), - SettingsSearchEntry(tab: .lockScreen, title: "Temperature unit", keywords: ["celsius", "fahrenheit"], highlightID: SettingsTab.lockScreen.highlightID(for: "Temperature unit")), - SettingsSearchEntry(tab: .lockScreen, title: "Show location label", keywords: ["location", "weather"], highlightID: SettingsTab.lockScreen.highlightID(for: "Show location label")), - SettingsSearchEntry(tab: .lockScreen, title: "Show charging status", keywords: ["charging", "weather"], highlightID: SettingsTab.lockScreen.highlightID(for: "Show charging status")), - SettingsSearchEntry(tab: .lockScreen, title: "Show charging percentage", keywords: ["charging percentage"], highlightID: SettingsTab.lockScreen.highlightID(for: "Show charging percentage")), - SettingsSearchEntry(tab: .lockScreen, title: "Show battery indicator", keywords: ["battery gauge", "weather"], highlightID: SettingsTab.lockScreen.highlightID(for: "Show battery indicator")), - SettingsSearchEntry(tab: .lockScreen, title: "Use MacBook icon when on battery", keywords: ["laptop icon", "battery"], highlightID: SettingsTab.lockScreen.highlightID(for: "Use MacBook icon when on battery")), - SettingsSearchEntry(tab: .lockScreen, title: "Show Bluetooth battery", keywords: ["bluetooth", "gauge"], highlightID: SettingsTab.lockScreen.highlightID(for: "Show Bluetooth battery")), - SettingsSearchEntry(tab: .lockScreen, title: "Show AQI widget", keywords: ["air quality", "aqi"], highlightID: SettingsTab.lockScreen.highlightID(for: "Show AQI widget")), - SettingsSearchEntry(tab: .lockScreen, title: "Air quality scale", keywords: ["aqi", "scale"], highlightID: SettingsTab.lockScreen.highlightID(for: "Air quality scale")), - SettingsSearchEntry(tab: .lockScreen, title: "Use colored gauges", keywords: ["gauge tint", "monochrome"], highlightID: SettingsTab.lockScreen.highlightID(for: "Use colored gauges")), - - // Extensions - SettingsSearchEntry(tab: .extensions, title: "Enable third-party extensions", keywords: ["extensions", "authorization", "third party"], highlightID: SettingsTab.extensions.highlightID(for: "Enable third-party extensions")), - SettingsSearchEntry(tab: .extensions, title: "Allow extension live activities", keywords: ["extensions", "live activities", "permissions"], highlightID: SettingsTab.extensions.highlightID(for: "Allow extension live activities")), - SettingsSearchEntry(tab: .extensions, title: "Allow extension lock screen widgets", keywords: ["extensions", "lock screen", "widgets"], highlightID: SettingsTab.extensions.highlightID(for: "Allow extension lock screen widgets")), - SettingsSearchEntry(tab: .extensions, title: "Enable extension diagnostics logging", keywords: ["extensions", "diagnostics", "logging"], highlightID: SettingsTab.extensions.highlightID(for: "Enable extension diagnostics logging")), - SettingsSearchEntry(tab: .extensions, title: "Manage app permissions", keywords: ["extensions", "permissions", "apps"], highlightID: SettingsTab.extensions.highlightID(for: "App permissions list")), - - // Shortcuts - SettingsSearchEntry(tab: .shortcuts, title: "Enable global keyboard shortcuts", keywords: ["keyboard", "shortcut"], highlightID: SettingsTab.shortcuts.highlightID(for: "Enable global keyboard shortcuts")), - - // Timer - SettingsSearchEntry(tab: .timer, title: "Enable timer feature", keywords: ["timer", "enable"], highlightID: SettingsTab.timer.highlightID(for: "Enable timer feature")), - SettingsSearchEntry(tab: .timer, title: "Mirror macOS Clock timers", keywords: ["system timer", "clock app"], highlightID: SettingsTab.timer.highlightID(for: "Mirror macOS Clock timers")), - SettingsSearchEntry(tab: .timer, title: "Show lock screen timer widget", keywords: ["lock screen", "timer widget"], highlightID: SettingsTab.timer.highlightID(for: "Show lock screen timer widget")), - SettingsSearchEntry(tab: .timer, title: "Timer surface", keywords: ["timer glass", "classic", "blur"], highlightID: SettingsTab.timer.highlightID(for: "Timer surface")), - SettingsSearchEntry(tab: .timer, title: "Timer glass material", keywords: ["frosted", "liquid", "timer material"], highlightID: SettingsTab.timer.highlightID(for: "Timer glass material")), - SettingsSearchEntry(tab: .timer, title: "Timer liquid mode", keywords: ["timer", "standard", "custom"], highlightID: SettingsTab.timer.highlightID(for: "Timer liquid mode")), - SettingsSearchEntry(tab: .timer, title: "Timer widget variant", keywords: ["timer variant", "liquid"], highlightID: SettingsTab.timer.highlightID(for: "Timer widget variant")), - SettingsSearchEntry(tab: .timer, title: "Timer tint", keywords: ["timer colour", "preset"], highlightID: SettingsTab.timer.highlightID(for: "Timer tint")), - SettingsSearchEntry(tab: .timer, title: "Solid colour", keywords: ["timer colour", "custom"], highlightID: SettingsTab.timer.highlightID(for: "Solid colour")), - SettingsSearchEntry(tab: .timer, title: "Progress style", keywords: ["progress", "bar", "ring"], highlightID: SettingsTab.timer.highlightID(for: "Progress style")), - SettingsSearchEntry(tab: .timer, title: "Accent colour", keywords: ["accent", "timer"], highlightID: SettingsTab.timer.highlightID(for: "Accent colour")), - - // Stats - SettingsSearchEntry(tab: .stats, title: "Enable system stats monitoring", keywords: ["stats", "monitoring"], highlightID: SettingsTab.stats.highlightID(for: "Enable system stats monitoring")), - SettingsSearchEntry(tab: .stats, title: "Stop monitoring after closing the notch", keywords: ["stats", "auto stop"], highlightID: SettingsTab.stats.highlightID(for: "Stop monitoring after closing the notch")), - SettingsSearchEntry(tab: .stats, title: "CPU Usage", keywords: ["cpu", "graph"], highlightID: SettingsTab.stats.highlightID(for: "CPU Usage")), - SettingsSearchEntry(tab: .stats, title: "Memory Usage", keywords: ["memory", "ram"], highlightID: SettingsTab.stats.highlightID(for: "Memory Usage")), - SettingsSearchEntry(tab: .stats, title: "GPU Usage", keywords: ["gpu", "graphics"], highlightID: SettingsTab.stats.highlightID(for: "GPU Usage")), - SettingsSearchEntry(tab: .stats, title: "Network Activity", keywords: ["network", "graph"], highlightID: SettingsTab.stats.highlightID(for: "Network Activity")), - SettingsSearchEntry(tab: .stats, title: "Disk I/O", keywords: ["disk", "io"], highlightID: SettingsTab.stats.highlightID(for: "Disk I/O")), - - // Clipboard - SettingsSearchEntry(tab: .clipboard, title: "Enable Clipboard Manager", keywords: ["clipboard", "manager"], highlightID: SettingsTab.clipboard.highlightID(for: "Enable Clipboard Manager")), - SettingsSearchEntry(tab: .clipboard, title: "Show Clipboard Icon", keywords: ["icon", "clipboard"], highlightID: SettingsTab.clipboard.highlightID(for: "Show Clipboard Icon")), - SettingsSearchEntry(tab: .clipboard, title: "Display Mode", keywords: ["list", "grid", "clipboard"], highlightID: SettingsTab.clipboard.highlightID(for: "Display Mode")), - SettingsSearchEntry(tab: .clipboard, title: "History Size", keywords: ["history", "clipboard"], highlightID: SettingsTab.clipboard.highlightID(for: "History Size")), - - // Screen Assistant - SettingsSearchEntry(tab: .screenAssistant, title: "Enable Screen Assistant", keywords: ["screen assistant", "ai"], highlightID: SettingsTab.screenAssistant.highlightID(for: "Enable Screen Assistant")), - SettingsSearchEntry(tab: .screenAssistant, title: "Display Mode", keywords: ["screen assistant", "mode"], highlightID: SettingsTab.screenAssistant.highlightID(for: "Display Mode")), - - // Color Picker - SettingsSearchEntry(tab: .colorPicker, title: "Enable Color Picker", keywords: ["color picker", "eyedropper"], highlightID: SettingsTab.colorPicker.highlightID(for: "Enable Color Picker")), - SettingsSearchEntry(tab: .colorPicker, title: "Show Color Picker Icon", keywords: ["color icon", "toolbar"], highlightID: SettingsTab.colorPicker.highlightID(for: "Show Color Picker Icon")), - SettingsSearchEntry(tab: .colorPicker, title: "Display Mode", keywords: ["color", "list"], highlightID: SettingsTab.colorPicker.highlightID(for: "Display Mode")), - SettingsSearchEntry(tab: .colorPicker, title: "History Size", keywords: ["color history"], highlightID: SettingsTab.colorPicker.highlightID(for: "History Size")), - SettingsSearchEntry(tab: .colorPicker, title: "Show All Color Formats", keywords: ["hex", "hsl", "color formats"], highlightID: SettingsTab.colorPicker.highlightID(for: "Show All Color Formats")) - ] - } - + SettingsSearchEntry( + tab: .general, + title: String(localized: "Notch display height"), + keywords: [String(localized: "display height"), String(localized: "menu bar size")], + highlightID: SettingsTab.general.highlightID(for: "Notch display height") + ), + + // Battery (Charge) + SettingsSearchEntry( + tab: .battery, + title: String(localized: "Show battery indicator"), + keywords: [String(localized: "battery hud"), String(localized: "charge")], + highlightID: SettingsTab.battery.highlightID(for: "Show battery indicator") + ), + SettingsSearchEntry( + tab: .battery, + title: String(localized: "Show battery percentage"), + keywords: [String(localized: "battery percent")], + highlightID: SettingsTab.battery.highlightID(for: "Show battery percentage") + ), + SettingsSearchEntry( + tab: .battery, + title: String(localized: "Show power status notifications"), + keywords: [String(localized: "notifications"), String(localized: "power")], + highlightID: SettingsTab.battery.highlightID(for: "Show power status notifications") + ), + SettingsSearchEntry( + tab: .battery, + title: String(localized: "Show power status icons"), + keywords: [String(localized: "power icons"), String(localized: "charging icon")], + highlightID: SettingsTab.battery.highlightID(for: "Show power status icons") + ), + SettingsSearchEntry( + tab: .battery, + title: String(localized: "Play low battery alert sound"), + keywords: [String(localized: "low battery"), String(localized: "alert"), String(localized: "sound")], + highlightID: SettingsTab.battery.highlightID(for: "Play low battery alert sound") + ), + + // HUDs + SettingsSearchEntry( + tab: .devices, + title: String(localized: "Show Bluetooth device connections"), + keywords: [String(localized: "bluetooth"), String(localized: "hud")], + highlightID: SettingsTab.devices.highlightID(for: "Show Bluetooth device connections") + ), + SettingsSearchEntry( + tab: .devices, + title: String(localized: "Use circular battery indicator"), + keywords: [String(localized: "battery"), String(localized: "circular")], + highlightID: SettingsTab.devices.highlightID(for: "Use circular battery indicator") + ), + SettingsSearchEntry( + tab: .devices, + title: String(localized: "Show battery percentage text in HUD"), + keywords: [String(localized: "battery text")], + highlightID: SettingsTab.devices.highlightID(for: "Show battery percentage text in HUD") + ), + SettingsSearchEntry( + tab: .devices, + title: String(localized: "Scroll device name in HUD"), + keywords: [String(localized: "marquee"), String(localized: "device name")], + highlightID: SettingsTab.devices.highlightID(for: "Scroll device name in HUD") + ), + SettingsSearchEntry( + tab: .devices, + title: String(localized: "Color-coded battery display"), + keywords: [String(localized: "color"), String(localized: "battery")], + highlightID: SettingsTab.devices.highlightID(for: "Color-coded battery display") + ), + SettingsSearchEntry( + tab: .hudAndOSD, + title: String(localized: "Color-coded volume display"), + keywords: [String(localized: "volume"), String(localized: "color")], + highlightID: SettingsTab.hudAndOSD.highlightID(for: "Color-coded volume display") + ), + SettingsSearchEntry( + tab: .hudAndOSD, + title: String(localized: "Smooth color transitions"), + keywords: [String(localized: "gradient"), String(localized: "smooth")], + highlightID: SettingsTab.hudAndOSD.highlightID(for: "Smooth color transitions") + ), + SettingsSearchEntry( + tab: .hudAndOSD, + title: String(localized: "Show percentages beside progress bars"), + keywords: [String(localized: "percentages"), String(localized: "progress")], + highlightID: SettingsTab.hudAndOSD.highlightID(for: "Show percentages beside progress bars") + ), + SettingsSearchEntry( + tab: .hudAndOSD, + title: String(localized: "HUD style"), + keywords: [String(localized: "inline"), String(localized: "compact")], + highlightID: SettingsTab.hudAndOSD.highlightID(for: "HUD style") + ), + SettingsSearchEntry( + tab: .hudAndOSD, + title: String(localized: "Progressbar style"), + keywords: [String(localized: "progress"), String(localized: "style")], + highlightID: SettingsTab.hudAndOSD.highlightID(for: "Progressbar style") + ), + SettingsSearchEntry( + tab: .hudAndOSD, + title: String(localized: "Enable glowing effect"), + keywords: [String(localized: "glow"), String(localized: "indicator")], + highlightID: SettingsTab.hudAndOSD.highlightID(for: "Enable glowing effect") + ), + SettingsSearchEntry( + tab: .hudAndOSD, + title: String(localized: "Use accent color"), + keywords: [String(localized: "accent"), String(localized: "color")], + highlightID: SettingsTab.hudAndOSD.highlightID(for: "Use accent color") + ), + + // Custom OSD + SettingsSearchEntry( + tab: .hudAndOSD, + title: String(localized: "Enable Custom OSD"), + keywords: [String(localized: "osd"), String(localized: "on-screen display"), String(localized: "custom osd")], + highlightID: SettingsTab.hudAndOSD.highlightID(for: "Enable Custom OSD") + ), + SettingsSearchEntry( + tab: .hudAndOSD, + title: String(localized: "Volume OSD"), + keywords: [String(localized: "volume"), String(localized: "osd")], + highlightID: SettingsTab.hudAndOSD.highlightID(for: "Volume OSD") + ), + SettingsSearchEntry( + tab: .hudAndOSD, + title: String(localized: "Brightness OSD"), + keywords: [String(localized: "brightness"), String(localized: "osd")], + highlightID: SettingsTab.hudAndOSD.highlightID(for: "Brightness OSD") + ), + SettingsSearchEntry( + tab: .hudAndOSD, + title: String(localized: "Keyboard Backlight OSD"), + keywords: [String(localized: "keyboard"), String(localized: "backlight"), String(localized: "osd")], + highlightID: SettingsTab.hudAndOSD.highlightID(for: "Keyboard Backlight OSD") + ), + SettingsSearchEntry( + tab: .hudAndOSD, + title: String(localized: "Material"), + keywords: [String(localized: "material"), String(localized: "frosted"), String(localized: "liquid"), String(localized: "glass"), String(localized: "solid"), String(localized: "osd")], + highlightID: SettingsTab.hudAndOSD.highlightID(for: "Material") + ), + SettingsSearchEntry( + tab: .hudAndOSD, + title: String(localized: "Icon & Progress Color"), + keywords: [String(localized: "color"), String(localized: "icon"), String(localized: "white"), String(localized: "black"), String(localized: "gray"), String(localized: "osd")], + highlightID: SettingsTab.hudAndOSD.highlightID(for: "Icon & Progress Color") + ), + + // Media + SettingsSearchEntry( + tab: .media, + title: String(localized: "Music Source"), + keywords: [String(localized: "media source"), String(localized: "controller")], + highlightID: SettingsTab.media.highlightID(for: "Music Source") + ), + SettingsSearchEntry( + tab: .media, + title: String(localized: "Skip buttons"), + keywords: [String(localized: "skip"), String(localized: "controls"), String(localized: "±10")], + highlightID: SettingsTab.media.highlightID(for: "Skip buttons") + ), + SettingsSearchEntry( + tab: .media, + title: String(localized: "Sneak Peek Style"), + keywords: [String(localized: "sneak peek"), String(localized: "preview")], + highlightID: SettingsTab.media.highlightID(for: "Sneak Peek Style") + ), + SettingsSearchEntry( + tab: .media, + title: String(localized: "Enable lyrics"), + keywords: [String(localized: "lyrics"), String(localized: "song text")], + highlightID: SettingsTab.media.highlightID(for: "Enable lyrics") + ), + SettingsSearchEntry( + tab: .media, + title: String(localized: "Show Change Media Output control"), + keywords: [String(localized: "airplay"), String(localized: "route picker"), String(localized: "media output")], + highlightID: SettingsTab.media.highlightID(for: "Show Change Media Output control") + ), + SettingsSearchEntry( + tab: .media, + title: String(localized: "Enable album art parallax"), + keywords: [String(localized: "parallax"), String(localized: "lock screen"), String(localized: "album art")], + highlightID: SettingsTab.media.highlightID(for: "Enable album art parallax") + ), + SettingsSearchEntry( + tab: .media, + title: String(localized: "Enable album art parallax effect"), + keywords: [String(localized: "parallax"), String(localized: "parallax effect"), String(localized: "album art")], + highlightID: SettingsTab.media.highlightID(for: "Enable album art parallax effect") + ), + + // Calendar + SettingsSearchEntry( + tab: .calendar, + title: String(localized: "Show calendar"), + keywords: [String(localized: "calendar"), String(localized: "events")], + highlightID: SettingsTab.calendar.highlightID(for: "Show calendar") + ), + SettingsSearchEntry( + tab: .calendar, + title: String(localized: "Enable reminder live activity"), + keywords: [String(localized: "reminder"), String(localized: "live activity")], + highlightID: SettingsTab.calendar.highlightID(for: "Enable reminder live activity") + ), + SettingsSearchEntry( + tab: .calendar, + title: String(localized: "Countdown style"), + keywords: [String(localized: "reminder countdown")], + highlightID: SettingsTab.calendar.highlightID(for: "Countdown style") + ), + SettingsSearchEntry( + tab: .calendar, + title: String(localized: "Show lock screen reminder"), + keywords: [String(localized: "lock screen"), String(localized: "reminder widget")], + highlightID: SettingsTab.calendar.highlightID(for: "Show lock screen reminder") + ), + SettingsSearchEntry( + tab: .calendar, + title: String(localized: "Chip color"), + keywords: [String(localized: "reminder chip"), String(localized: "color")], + highlightID: SettingsTab.calendar.highlightID(for: "Chip color") + ), + SettingsSearchEntry( + tab: .calendar, + title: String(localized: "Hide all-day events"), + keywords: [String(localized: "calendar"), String(localized: "all-day")], + highlightID: SettingsTab.calendar.highlightID(for: "Hide all-day events") + ), + SettingsSearchEntry( + tab: .calendar, + title: String(localized: "Hide completed reminders"), + keywords: [String(localized: "reminder"), String(localized: "completed")], + highlightID: SettingsTab.calendar.highlightID(for: "Hide completed reminders") + ), + SettingsSearchEntry( + tab: .calendar, + title: String(localized: "Show full event titles"), + keywords: [String(localized: "calendar"), String(localized: "titles")], + highlightID: SettingsTab.calendar.highlightID(for: "Show full event titles") + ), + SettingsSearchEntry( + tab: .calendar, + title: String(localized: "Auto-scroll to next event"), + keywords: [String(localized: "calendar"), String(localized: "scroll")], + highlightID: SettingsTab.calendar.highlightID(for: "Auto-scroll to next event") + ), + + // Shelf + SettingsSearchEntry( + tab: .shelf, + title: String(localized: "Enable shelf"), + keywords: [String(localized: "shelf"), String(localized: "dock")], + highlightID: SettingsTab.shelf.highlightID(for: "Enable shelf") + ), + SettingsSearchEntry( + tab: .shelf, + title: String(localized: "Open shelf tab by default if items added"), + keywords: [String(localized: "auto open"), String(localized: "shelf tab")], + highlightID: SettingsTab.shelf.highlightID(for: "Open shelf tab by default if items added") + ), + SettingsSearchEntry( + tab: .shelf, + title: String(localized: "Expanded drag detection area"), + keywords: [String(localized: "shelf"), String(localized: "drag")], + highlightID: SettingsTab.shelf.highlightID(for: "Expanded drag detection area") + ), + SettingsSearchEntry( + tab: .shelf, + title: String(localized: "Copy items on drag"), + keywords: [String(localized: "shelf"), String(localized: "drag"), String(localized: "copy")], + highlightID: SettingsTab.shelf.highlightID(for: "Copy items on drag") + ), + SettingsSearchEntry( + tab: .shelf, + title: String(localized: "Remove from shelf after dragging"), + keywords: [String(localized: "shelf"), String(localized: "drag"), String(localized: "remove")], + highlightID: SettingsTab.shelf.highlightID(for: "Remove from shelf after dragging") + ), + SettingsSearchEntry( + tab: .shelf, + title: String(localized: "Quick Share Service"), + keywords: [String(localized: "shelf"), String(localized: "share"), String(localized: "airdrop")], + highlightID: SettingsTab.shelf.highlightID(for: "Quick Share Service") + ), + + // Appearance + SettingsSearchEntry( + tab: .appearance, + title: String(localized: "Settings icon in notch"), + keywords: [String(localized: "settings button"), String(localized: "toolbar")], + highlightID: SettingsTab.appearance.highlightID(for: "Settings icon in notch") + ), + SettingsSearchEntry( + tab: .appearance, + title: String(localized: "Enable window shadow"), + keywords: [String(localized: "shadow"), String(localized: "appearance")], + highlightID: SettingsTab.appearance.highlightID(for: "Enable window shadow") + ), + SettingsSearchEntry( + tab: .appearance, + title: String(localized: "Corner radius scaling"), + keywords: [String(localized: "corner radius"), String(localized: "shape")], + highlightID: SettingsTab.appearance.highlightID(for: "Corner radius scaling") + ), + SettingsSearchEntry( + tab: .appearance, + title: String(localized: "Use simpler close animation"), + keywords: [String(localized: "close animation"), String(localized: "notch")], + highlightID: SettingsTab.appearance.highlightID(for: "Use simpler close animation") + ), + SettingsSearchEntry( + tab: .appearance, + title: String(localized: "Notch Width"), + keywords: [String(localized: "expanded notch"), String(localized: "width"), String(localized: "resize")], + highlightID: SettingsTab.appearance.highlightID(for: "Expanded notch width") + ), + SettingsSearchEntry( + tab: .appearance, + title: String(localized: "Enable colored spectrograms"), + keywords: [String(localized: "spectrogram"), String(localized: "audio")], + highlightID: SettingsTab.appearance.highlightID(for: "Enable colored spectrograms") + ), + SettingsSearchEntry( + tab: .appearance, + title: String(localized: "Enable blur effect behind album art"), + keywords: [String(localized: "blur"), String(localized: "album art")], + highlightID: SettingsTab.appearance.highlightID(for: "Enable blur effect behind album art") + ), + SettingsSearchEntry( + tab: .appearance, + title: String(localized: "Slider color"), + keywords: [String(localized: "slider"), String(localized: "accent")], + highlightID: SettingsTab.appearance.highlightID(for: "Slider color") + ), + SettingsSearchEntry( + tab: .appearance, + title: String(localized: "Enable Dynamic mirror"), + keywords: [String(localized: "mirror"), String(localized: "reflection")], + highlightID: SettingsTab.appearance.highlightID(for: "Enable Dynamic mirror") + ), + SettingsSearchEntry( + tab: .appearance, + title: String(localized: "Mirror shape"), + keywords: [String(localized: "mirror shape"), String(localized: "circle"), String(localized: "rectangle")], + highlightID: SettingsTab.appearance.highlightID(for: "Mirror shape") + ), + SettingsSearchEntry( + tab: .appearance, + title: String(localized: "Show cool face animation while inactivity"), + keywords: [String(localized: "face animation"), String(localized: "idle")], + highlightID: SettingsTab.appearance.highlightID(for: "Show cool face animation while inactivity") + ), + SettingsSearchEntry( + tab: .appearance, + title: String(localized: "App icon"), + keywords: [String(localized: "app icon"), String(localized: "custom icon")], + highlightID: SettingsTab.appearance.highlightID(for: "App icon") + ), + + // Lock Screen + SettingsSearchEntry( + tab: .lockScreen, + title: String(localized: "Enable lock screen live activity"), + keywords: [String(localized: "lock screen"), String(localized: "live activity")], + highlightID: SettingsTab.lockScreen.highlightID(for: "Enable lock screen live activity") + ), + SettingsSearchEntry( + tab: .lockScreen, + title: String(localized: "Play lock/unlock sounds"), + keywords: [String(localized: "chime"), String(localized: "sound")], + highlightID: SettingsTab.lockScreen.highlightID(for: "Play lock/unlock sounds") + ), + SettingsSearchEntry( + tab: .lockScreen, + title: String(localized: "Material"), + keywords: [String(localized: "glass"), String(localized: "frosted"), String(localized: "liquid")], + highlightID: SettingsTab.lockScreen.highlightID(for: "Material") + ), + SettingsSearchEntry( + tab: .lockScreen, + title: String(localized: "Show lock screen media panel"), + keywords: [String(localized: "media panel"), String(localized: "lock screen media")], + highlightID: SettingsTab.lockScreen.highlightID(for: "Show lock screen media panel") + ), + SettingsSearchEntry( + tab: .lockScreen, + title: String(localized: "Show media app icon"), + keywords: [String(localized: "app icon"), String(localized: "media")], + highlightID: SettingsTab.lockScreen.highlightID(for: "Show media app icon") + ), + SettingsSearchEntry( + tab: .lockScreen, + title: String(localized: "Show panel border"), + keywords: [String(localized: "panel border")], + highlightID: SettingsTab.lockScreen.highlightID(for: "Show panel border") + ), + SettingsSearchEntry( + tab: .lockScreen, + title: String(localized: "Enable media panel blur"), + keywords: [String(localized: "blur"), String(localized: "media panel")], + highlightID: SettingsTab.lockScreen.highlightID(for: "Enable media panel blur") + ), + SettingsSearchEntry( + tab: .lockScreen, + title: String(localized: "Show lock screen timer"), + keywords: [String(localized: "timer widget"), String(localized: "lock screen timer")], + highlightID: SettingsTab.lockScreen.highlightID(for: "Show lock screen timer") + ), + SettingsSearchEntry( + tab: .lockScreen, + title: String(localized: "Timer surface"), + keywords: [String(localized: "timer glass"), String(localized: "classic"), String(localized: "blur")], + highlightID: SettingsTab.lockScreen.highlightID(for: "Timer surface") + ), + SettingsSearchEntry( + tab: .lockScreen, + title: String(localized: "Timer glass material"), + keywords: [String(localized: "frosted"), String(localized: "liquid"), String(localized: "timer material")], + highlightID: SettingsTab.lockScreen.highlightID(for: "Timer glass material") + ), + SettingsSearchEntry( + tab: .lockScreen, + title: String(localized: "Timer liquid mode"), + keywords: [String(localized: "timer"), String(localized: "standard"), String(localized: "custom")], + highlightID: SettingsTab.lockScreen.highlightID(for: "Timer liquid mode") + ), + SettingsSearchEntry( + tab: .lockScreen, + title: String(localized: "Timer widget variant"), + keywords: [String(localized: "timer variant"), String(localized: "liquid")], + highlightID: SettingsTab.lockScreen.highlightID(for: "Timer widget variant") + ), + SettingsSearchEntry( + tab: .lockScreen, + title: String(localized: "Show lock screen weather"), + keywords: [String(localized: "weather widget")], + highlightID: SettingsTab.lockScreen.highlightID(for: "Show lock screen weather") + ), + SettingsSearchEntry( + tab: .lockScreen, + title: String(localized: "Layout"), + keywords: [String(localized: "inline"), String(localized: "circular"), String(localized: "weather layout")], + highlightID: SettingsTab.lockScreen.highlightID(for: "Layout") + ), + SettingsSearchEntry( + tab: .lockScreen, + title: String(localized: "Weather data provider"), + keywords: [String(localized: "wttr"), String(localized: "open meteo")], + highlightID: SettingsTab.lockScreen.highlightID(for: "Weather data provider") + ), + SettingsSearchEntry( + tab: .lockScreen, + title: String(localized: "Temperature unit"), + keywords: [String(localized: "celsius"), String(localized: "fahrenheit")], + highlightID: SettingsTab.lockScreen.highlightID(for: "Temperature unit") + ), + SettingsSearchEntry( + tab: .lockScreen, + title: String(localized: "Show location label"), + keywords: [String(localized: "location"), String(localized: "weather")], + highlightID: SettingsTab.lockScreen.highlightID(for: "Show location label") + ), + SettingsSearchEntry( + tab: .lockScreen, + title: String(localized: "Show charging status"), + keywords: [String(localized: "charging"), String(localized: "weather")], + highlightID: SettingsTab.lockScreen.highlightID(for: "Show charging status") + ), + SettingsSearchEntry( + tab: .lockScreen, + title: String(localized: "Show charging percentage"), + keywords: [String(localized: "charging percentage")], + highlightID: SettingsTab.lockScreen.highlightID(for: "Show charging percentage") + ), + SettingsSearchEntry( + tab: .lockScreen, + title: String(localized: "Show battery indicator"), + keywords: [String(localized: "battery gauge"), String(localized: "weather")], + highlightID: SettingsTab.lockScreen.highlightID(for: "Show battery indicator") + ), + SettingsSearchEntry( + tab: .lockScreen, + title: String(localized: "Use MacBook icon when on battery"), + keywords: [String(localized: "laptop icon"), String(localized: "battery")], + highlightID: SettingsTab.lockScreen.highlightID(for: "Use MacBook icon when on battery") + ), + SettingsSearchEntry( + tab: .lockScreen, + title: String(localized: "Show Bluetooth battery"), + keywords: [String(localized: "bluetooth"), String(localized: "gauge")], + highlightID: SettingsTab.lockScreen.highlightID(for: "Show Bluetooth battery") + ), + SettingsSearchEntry( + tab: .lockScreen, + title: String(localized: "Show AQI widget"), + keywords: [String(localized: "air quality"), String(localized: "aqi")], + highlightID: SettingsTab.lockScreen.highlightID(for: "Show AQI widget") + ), + SettingsSearchEntry( + tab: .lockScreen, + title: String(localized: "Air quality scale"), + keywords: [String(localized: "aqi"), String(localized: "scale")], + highlightID: SettingsTab.lockScreen.highlightID(for: "Air quality scale") + ), + SettingsSearchEntry( + tab: .lockScreen, + title: String(localized: "Use colored gauges"), + keywords: [String(localized: "gauge tint"), String(localized: "monochrome")], + highlightID: SettingsTab.lockScreen.highlightID(for: "Use colored gauges") + ), + + // Extensions + SettingsSearchEntry( + tab: .extensions, + title: String(localized: "Enable third-party extensions"), + keywords: [String(localized: "extensions"), String(localized: "authorization"), String(localized: "third party")], + highlightID: SettingsTab.extensions.highlightID(for: "Enable third-party extensions") + ), + SettingsSearchEntry( + tab: .extensions, + title: String(localized: "Allow extension live activities"), + keywords: [String(localized: "extensions"), String(localized: "live activities"), String(localized: "permissions")], + highlightID: SettingsTab.extensions.highlightID(for: "Allow extension live activities") + ), + SettingsSearchEntry( + tab: .extensions, + title: String(localized: "Allow extension lock screen widgets"), + keywords: [String(localized: "extensions"), String(localized: "lock screen"), String(localized: "widgets")], + highlightID: SettingsTab.extensions.highlightID(for: "Allow extension lock screen widgets") + ), + SettingsSearchEntry( + tab: .extensions, + title: String(localized: "Enable extension diagnostics logging"), + keywords: [String(localized: "extensions"), String(localized: "diagnostics"), String(localized: "logging")], + highlightID: SettingsTab.extensions.highlightID(for: "Enable extension diagnostics logging") + ), + SettingsSearchEntry( + tab: .extensions, + title: String(localized: "Manage app permissions"), + keywords: [String(localized: "extensions"), String(localized: "permissions"), String(localized: "apps")], + highlightID: SettingsTab.extensions.highlightID(for: "App permissions list") + ), + + // Shortcuts + SettingsSearchEntry( + tab: .shortcuts, + title: String(localized: "Enable global keyboard shortcuts"), + keywords: [String(localized: "keyboard"), String(localized: "shortcut")], + highlightID: SettingsTab.shortcuts.highlightID(for: "Enable global keyboard shortcuts") + ), + + // Timer + SettingsSearchEntry( + tab: .timer, + title: String(localized: "Enable timer feature"), + keywords: [String(localized: "timer"), String(localized: "enable")], + highlightID: SettingsTab.timer.highlightID(for: "Enable timer feature") + ), + SettingsSearchEntry( + tab: .timer, + title: String(localized: "Mirror macOS Clock timers"), + keywords: [String(localized: "system timer"), String(localized: "clock app")], + highlightID: SettingsTab.timer.highlightID(for: "Mirror macOS Clock timers") + ), + SettingsSearchEntry( + tab: .timer, + title: String(localized: "Show lock screen timer widget"), + keywords: [String(localized: "lock screen"), String(localized: "timer widget")], + highlightID: SettingsTab.timer.highlightID(for: "Show lock screen timer widget") + ), + SettingsSearchEntry( + tab: .timer, + title: String(localized: "Timer surface"), + keywords: [String(localized: "timer glass"), String(localized: "classic"), String(localized: "blur")], + highlightID: SettingsTab.timer.highlightID(for: "Timer surface") + ), + SettingsSearchEntry( + tab: .timer, + title: String(localized: "Timer glass material"), + keywords: [String(localized: "frosted"), String(localized: "liquid"), String(localized: "timer material")], + highlightID: SettingsTab.timer.highlightID(for: "Timer glass material") + ), + SettingsSearchEntry( + tab: .timer, + title: String(localized: "Timer liquid mode"), + keywords: [String(localized: "timer"), String(localized: "standard"), String(localized: "custom")], + highlightID: SettingsTab.timer.highlightID(for: "Timer liquid mode") + ), + SettingsSearchEntry( + tab: .timer, + title: String(localized: "Timer widget variant"), + keywords: [String(localized: "timer variant"), String(localized: "liquid")], + highlightID: SettingsTab.timer.highlightID(for: "Timer widget variant") + ), + SettingsSearchEntry( + tab: .timer, + title: String(localized: "Timer tint"), + keywords: [String(localized: "timer colour"), String(localized: "preset")], + highlightID: SettingsTab.timer.highlightID(for: "Timer tint") + ), + SettingsSearchEntry( + tab: .timer, + title: String(localized: "Solid colour"), + keywords: [String(localized: "timer colour"), String(localized: "custom")], + highlightID: SettingsTab.timer.highlightID(for: "Solid colour") + ), + SettingsSearchEntry( + tab: .timer, + title: String(localized: "Progress style"), + keywords: [String(localized: "progress"), String(localized: "bar"), String(localized: "ring")], + highlightID: SettingsTab.timer.highlightID(for: "Progress style") + ), + SettingsSearchEntry( + tab: .timer, + title: String(localized: "Accent colour"), + keywords: [String(localized: "accent"), String(localized: "timer")], + highlightID: SettingsTab.timer.highlightID(for: "Accent colour") + ), + + // Stats + SettingsSearchEntry( + tab: .stats, + title: String(localized: "Enable system stats monitoring"), + keywords: [String(localized: "stats"), String(localized: "monitoring")], + highlightID: SettingsTab.stats.highlightID(for: "Enable system stats monitoring") + ), + SettingsSearchEntry( + tab: .stats, + title: String(localized: "Stop monitoring after closing the notch"), + keywords: [String(localized: "stats"), String(localized: "auto stop")], + highlightID: SettingsTab.stats.highlightID(for: "Stop monitoring after closing the notch") + ), + SettingsSearchEntry( + tab: .stats, + title: String(localized: "CPU Usage"), + keywords: [String(localized: "cpu"), String(localized: "graph")], + highlightID: SettingsTab.stats.highlightID(for: "CPU Usage") + ), + SettingsSearchEntry( + tab: .stats, + title: String(localized: "Memory Usage"), + keywords: [String(localized: "memory"), String(localized: "ram")], + highlightID: SettingsTab.stats.highlightID(for: "Memory Usage") + ), + SettingsSearchEntry( + tab: .stats, + title: String(localized: "GPU Usage"), + keywords: [String(localized: "gpu"), String(localized: "graphics")], + highlightID: SettingsTab.stats.highlightID(for: "GPU Usage") + ), + SettingsSearchEntry( + tab: .stats, + title: String(localized: "Network Activity"), + keywords: [String(localized: "network"), String(localized: "graph")], + highlightID: SettingsTab.stats.highlightID(for: "Network Activity") + ), + SettingsSearchEntry( + tab: .stats, + title: String(localized: "Disk I/O"), + keywords: [String(localized: "disk"), String(localized: "io")], + highlightID: SettingsTab.stats.highlightID(for: "Disk I/O") + ), + + // Clipboard + SettingsSearchEntry( + tab: .clipboard, + title: String(localized: "Enable Clipboard Manager"), + keywords: [String(localized: "clipboard"), String(localized: "manager")], + highlightID: SettingsTab.clipboard.highlightID(for: "Enable Clipboard Manager") + ), + SettingsSearchEntry( + tab: .clipboard, + title: String(localized: "Show Clipboard Icon"), + keywords: [String(localized: "icon"), String(localized: "clipboard")], + highlightID: SettingsTab.clipboard.highlightID(for: "Show Clipboard Icon") + ), + SettingsSearchEntry( + tab: .clipboard, + title: String(localized: "Display Mode"), + keywords: [String(localized: "list"), String(localized: "grid"), String(localized: "clipboard")], + highlightID: SettingsTab.clipboard.highlightID(for: "Display Mode") + ), + SettingsSearchEntry( + tab: .clipboard, + title: String(localized: "History Size"), + keywords: [String(localized: "history"), String(localized: "clipboard")], + highlightID: SettingsTab.clipboard.highlightID(for: "History Size") + ), + + // Screen Assistant + SettingsSearchEntry( + tab: .screenAssistant, + title: String(localized: "Enable Screen Assistant"), + keywords: [String(localized: "screen assistant"), String(localized: "ai")], + highlightID: SettingsTab.screenAssistant.highlightID(for: "Enable Screen Assistant") + ), + SettingsSearchEntry( + tab: .screenAssistant, + title: String(localized: "Display Mode"), + keywords: [String(localized: "screen assistant"), String(localized: "mode")], + highlightID: SettingsTab.screenAssistant.highlightID(for: "Display Mode") + ), + + // Color Picker + SettingsSearchEntry( + tab: .colorPicker, + title: String(localized: "Enable Color Picker"), + keywords: [String(localized: "color picker"), String(localized: "eyedropper")], + highlightID: SettingsTab.colorPicker.highlightID(for: "Enable Color Picker") + ), + SettingsSearchEntry( + tab: .colorPicker, + title: String(localized: "Show Color Picker Icon"), + keywords: [String(localized: "color icon"), String(localized: "toolbar")], + highlightID: SettingsTab.colorPicker.highlightID(for: "Show Color Picker Icon") + ), + SettingsSearchEntry( + tab: .colorPicker, + title: String(localized: "Display Mode"), + keywords: [String(localized: "color"), String(localized: "list")], + highlightID: SettingsTab.colorPicker.highlightID(for: "Display Mode") + ), + SettingsSearchEntry( + tab: .colorPicker, + title: String(localized: "History Size"), + keywords: [String(localized: "color history")], + highlightID: SettingsTab.colorPicker.highlightID(for: "History Size") + ), + SettingsSearchEntry( + tab: .colorPicker, + title: String(localized: "Show All Color Formats"), + keywords: [String(localized: "hex"), String(localized: "hsl"), String(localized: "color formats")], + highlightID: SettingsTab.colorPicker.highlightID(for: "Show All Color Formats") + ) + ] + } private func isTabVisible(_ tab: SettingsTab) -> Bool { switch tab { case .timer, .stats, .clipboard, .screenAssistant, .colorPicker, .shelf, .notes: From c71bb1db2efb77c29874a847d849d8e61adcd9bd Mon Sep 17 00:00:00 2001 From: Felipe Giacomini Cocco Date: Thu, 5 Feb 2026 13:44:33 -0300 Subject: [PATCH 09/26] Fix strings detections and translates the entire "Color Picker" section --- DynamicIsland/components/Settings/SettingsView.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DynamicIsland/components/Settings/SettingsView.swift b/DynamicIsland/components/Settings/SettingsView.swift index 5048d4f..4832399 100644 --- a/DynamicIsland/components/Settings/SettingsView.swift +++ b/DynamicIsland/components/Settings/SettingsView.swift @@ -6442,7 +6442,7 @@ struct ColorPickerSettings: View { var body: some View { Form { Section { - Defaults.Toggle("Enable Color Picker", key: .enableColorPickerFeature) + Defaults.Toggle(String(localized: "Enable Color Picker"), key: .enableColorPickerFeature) .settingsHighlight(id: highlightID("Enable Color Picker")) } header: { Text("Color Picker") From 345eebd498b96d41319c16c6344542e1b3e60d2c Mon Sep 17 00:00:00 2001 From: Felipe Giacomini Cocco Date: Thu, 5 Feb 2026 13:49:11 -0300 Subject: [PATCH 10/26] Fix strings detections and translates the entire "Screen Aassistant" section --- DynamicIsland/components/Settings/SettingsView.swift | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/DynamicIsland/components/Settings/SettingsView.swift b/DynamicIsland/components/Settings/SettingsView.swift index 4832399..48e7a52 100644 --- a/DynamicIsland/components/Settings/SettingsView.swift +++ b/DynamicIsland/components/Settings/SettingsView.swift @@ -6266,7 +6266,7 @@ struct ScreenAssistantSettings: View { var body: some View { Form { Section { - Defaults.Toggle("Enable Screen Assistant", key: .enableScreenAssistant) + Defaults.Toggle(String(localized: "Enable Screen Assistant"), key: .enableScreenAssistant) .settingsHighlight(id: highlightID("Enable Screen Assistant")) } header: { Text("AI Assistant") @@ -6452,7 +6452,7 @@ struct ColorPickerSettings: View { if enableColorPickerFeature { Section { - Defaults.Toggle("Show Color Picker Icon", key: .showColorPickerIcon) + Defaults.Toggle(String(localized: "Show Color Picker Icon"), key: .showColorPickerIcon) .settingsHighlight(id: highlightID("Show Color Picker Icon")) HStack { @@ -6482,7 +6482,7 @@ struct ColorPickerSettings: View { } .settingsHighlight(id: highlightID("History Size")) - Defaults.Toggle("Show All Color Formats", key: .showColorFormats) + Defaults.Toggle(String(localized: "Show All Color Formats"), key: .showColorFormats) .settingsHighlight(id: highlightID("Show All Color Formats")) } header: { From da612906224f3593b74f53c377dd322f06d77bd9 Mon Sep 17 00:00:00 2001 From: Felipe Giacomini Cocco Date: Thu, 5 Feb 2026 14:01:29 -0300 Subject: [PATCH 11/26] Fix strings detections and translates the entire "Downloaads" --- DynamicIsland/Localizable.xcstrings | 30 +++++++++++++++++++ .../components/Settings/SettingsView.swift | 6 ++-- DynamicIsland/enums/generic.swift | 11 +++++++ 3 files changed, 44 insertions(+), 3 deletions(-) diff --git a/DynamicIsland/Localizable.xcstrings b/DynamicIsland/Localizable.xcstrings index e442344..2f9c320 100644 --- a/DynamicIsland/Localizable.xcstrings +++ b/DynamicIsland/Localizable.xcstrings @@ -9217,6 +9217,16 @@ } } }, + "Enable download detection" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Habilitar detecção de download" + } + } + } + }, "Enable Dynamic Island media controls to manage the lock screen panel." : { "localizations" : { "pt-BR" : { @@ -17855,6 +17865,16 @@ } } }, + "Percentage" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Porcentagem" + } + } + } + }, "percentages" : { "localizations" : { "pt-BR" : { @@ -18363,6 +18383,16 @@ } } }, + "Progress" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Progresso" + } + } + } + }, "Progress style" : { "localizations" : { "pt-BR" : { diff --git a/DynamicIsland/components/Settings/SettingsView.swift b/DynamicIsland/components/Settings/SettingsView.swift index 48e7a52..b4e05db 100644 --- a/DynamicIsland/components/Settings/SettingsView.swift +++ b/DynamicIsland/components/Settings/SettingsView.swift @@ -1805,10 +1805,10 @@ struct Downloads: View { var body: some View { Form { Section { - Defaults.Toggle("Enable download detection", key: .enableDownloadListener) + Defaults.Toggle(String(localized: "Enable download detection"), key: .enableDownloadListener) .settingsHighlight(id: highlightID("Enable download detection")) VStack(alignment: .leading, spacing: 12) { - Text("Download indicator style") + Text(String(localized: "Download indicator style")) .font(.system(size: 13, weight: .semibold)) .foregroundStyle(.white) @@ -1876,7 +1876,7 @@ struct Downloads: View { } } - Text(style.rawValue) + Text(style.localizedName) .font(.caption) .fontWeight(.medium) .lineLimit(2) diff --git a/DynamicIsland/enums/generic.swift b/DynamicIsland/enums/generic.swift index bf29477..4f66755 100644 --- a/DynamicIsland/enums/generic.swift +++ b/DynamicIsland/enums/generic.swift @@ -83,6 +83,17 @@ enum DownloadIndicatorStyle: String, Defaults.Serializable { case progress = "Progress" case percentage = "Percentage" case circle = "Circle" + + var localizedName: String { + switch self { + case .progress: + return String(localized: "Progress") + case .percentage: + return String(localized: "Percentage") + case .circle: + return String(localized: "Circle") + } + } } enum DownloadIconStyle: String, Defaults.Serializable { From df665866026bfd4844744082923904276b328e36 Mon Sep 17 00:00:00 2001 From: Felipe Giacomini Cocco Date: Thu, 5 Feb 2026 14:57:27 -0300 Subject: [PATCH 12/26] Fix strings detections and translates the entire "Clipboard Manager" section and change the width to work better with all languages --- DynamicIsland/Localizable.xcstrings | 80 ++++++++++++++++++- .../components/Settings/SettingsView.swift | 22 ++--- DynamicIsland/managers/ClipboardManager.swift | 12 +-- 3 files changed, 95 insertions(+), 19 deletions(-) diff --git a/DynamicIsland/Localizable.xcstrings b/DynamicIsland/Localizable.xcstrings index 2f9c320..784872f 100644 --- a/DynamicIsland/Localizable.xcstrings +++ b/DynamicIsland/Localizable.xcstrings @@ -1003,6 +1003,36 @@ }, "shouldTranslate" : false }, + "%lldd ago" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lldd atrás" + } + } + } + }, + "%lldh ago" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lldh atrás" + } + } + } + }, + "%lldm ago" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lldm atrás" + } + } + } + }, "%lldx" : { "localizations" : { "fr" : { @@ -1845,7 +1875,7 @@ "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Ativar" + "value" : "Ativo" } } } @@ -10429,6 +10459,16 @@ "feedback" : { "shouldTranslate" : false }, + "File" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Arquivo" + } + } + } + }, "Files dropped on the shelf will be shared via this service" : { "comment" : "A description below the currently selected quick share provider, explaining that files dropped on the shelf will be shared via that provider.", "isCommentAutoGenerated" : true, @@ -12410,6 +12450,16 @@ } } }, + "Image" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Imagem" + } + } + } + }, "Import" : { "localizations" : { "fr" : { @@ -12757,6 +12807,16 @@ } } }, + "Just now" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Agora mesmo" + } + } + } + }, "keyboard" : { "localizations" : { "pt-BR" : { @@ -15552,7 +15612,7 @@ "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Status de Monitoramente" + "value" : "Status de Monitoramento" } } } @@ -19527,6 +19587,9 @@ } } }, + "Rich Text" : { + "shouldTranslate" : false + }, "Right" : { "localizations" : { "pt-BR" : { @@ -22784,6 +22847,16 @@ } } }, + "Text" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Texto" + } + } + } + }, "TheDynamicIsland" : { "shouldTranslate" : false }, @@ -24004,6 +24077,9 @@ }, "shouldTranslate" : false }, + "URL" : { + "shouldTranslate" : false + }, "Usage" : { "comment" : "A label displayed above the CPU usage statistics.", "isCommentAutoGenerated" : true, diff --git a/DynamicIsland/components/Settings/SettingsView.swift b/DynamicIsland/components/Settings/SettingsView.swift index b4e05db..f7c1c36 100644 --- a/DynamicIsland/components/Settings/SettingsView.swift +++ b/DynamicIsland/components/Settings/SettingsView.swift @@ -6114,7 +6114,7 @@ struct ClipboardSettings: View { if enableClipboardManager { Section { - Defaults.Toggle("Show Clipboard Icon", key: .showClipboardIcon) + Defaults.Toggle(String(localized: "Show Clipboard Icon"), key: .showClipboardIcon) .settingsHighlight(id: highlightID("Show Clipboard Icon")) HStack { @@ -6126,7 +6126,7 @@ struct ClipboardSettings: View { } } .pickerStyle(.menu) - .frame(width: 100) + .frame(width: 200) } .settingsHighlight(id: highlightID("Display Mode")) @@ -6140,7 +6140,7 @@ struct ClipboardSettings: View { Text("10 items").tag(10) } .pickerStyle(.menu) - .frame(width: 100) + .frame(width: 200) } .settingsHighlight(id: highlightID("History Size")) @@ -6237,16 +6237,16 @@ struct ClipboardSettings: View { let interval = Date().timeIntervalSince(date) if interval < 60 { - return "Just now" + return String(localized: "Just now") } else if interval < 3600 { let minutes = Int(interval / 60) - return "\(minutes)m ago" + return String(localized: "\(minutes)m ago") } else if interval < 86400 { let hours = Int(interval / 3600) - return "\(hours)h ago" + return String(localized: "\(hours)h ago") } else { let days = Int(interval / 86400) - return "\(days)d ago" + return String(localized: "\(days)d ago") } } } @@ -6413,16 +6413,16 @@ struct ScreenAssistantSettings: View { let interval = Date().timeIntervalSince(date) if interval < 60 { - return "Just now" + return String(localized: "Just now") } else if interval < 3600 { let minutes = Int(interval / 60) - return "\(minutes)m ago" + return String(localized: "\(minutes)m ago") } else if interval < 86400 { let hours = Int(interval / 3600) - return "\(hours)h ago" + return String(localized: "\(hours)h ago") } else { let days = Int(interval / 86400) - return "\(days)d ago" + return String(localized: "\(days)d ago") } } } diff --git a/DynamicIsland/managers/ClipboardManager.swift b/DynamicIsland/managers/ClipboardManager.swift index c6f7ba8..d3a11a6 100644 --- a/DynamicIsland/managers/ClipboardManager.swift +++ b/DynamicIsland/managers/ClipboardManager.swift @@ -155,12 +155,12 @@ enum ClipboardItemType: String, CaseIterable, Codable { var displayName: String { switch self { - case .text: return "Text" - case .url: return "URL" - case .file: return "File" - case .image: return "Image" - case .rtf: return "Rich Text" - case .unknown: return "Unknown" + case .text: return String(localized: "Text") + case .url: return String(localized: "URL") + case .file: return String(localized: "File") + case .image: return String(localized: "Image") + case .rtf: return String(localized: "Rich Text") + case .unknown: return String(localized: "Unknown") } } } From acfa94987976acec7718ad7526997d70ae4c8d3d Mon Sep 17 00:00:00 2001 From: Felipe Giacomini Cocco Date: Thu, 5 Feb 2026 15:02:05 -0300 Subject: [PATCH 13/26] Fix strings detections and translates the entire "Notes" section --- DynamicIsland/Localizable.xcstrings | 62 ++++++++++++++++++- .../components/Settings/SettingsView.swift | 12 ++-- 2 files changed, 67 insertions(+), 7 deletions(-) diff --git a/DynamicIsland/Localizable.xcstrings b/DynamicIsland/Localizable.xcstrings index 784872f..99be532 100644 --- a/DynamicIsland/Localizable.xcstrings +++ b/DynamicIsland/Localizable.xcstrings @@ -9189,6 +9189,16 @@ } } }, + "Enable Color Filtering" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Habilitar Filtragem por Cores" + } + } + } + }, "Enable Color Picker" : { "localizations" : { "pt-BR" : { @@ -9225,6 +9235,16 @@ } } }, + "Enable Create from Clipboard" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Habilitar Criar a partir da Área de Transferência" + } + } + } + }, "Enable Custom OSD" : { "localizations" : { "pt-BR" : { @@ -9593,6 +9613,36 @@ } } }, + "Enable Note Pinning" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ativar Fixação de Notas" + } + } + } + }, + "Enable Note Search" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ativar Pesquisa de Notas" + } + } + } + }, + "Enable Notes" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ativar Notas" + } + } + } + }, "Enable reminder live activity" : { "localizations" : { "pt-BR" : { @@ -20865,6 +20915,16 @@ } } }, + "Show Character Count" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mostrar Contagem de Caracteres" + } + } + } + }, "Show charging percentage" : { "localizations" : { "pt-BR" : { @@ -25081,7 +25141,7 @@ "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Quando ativada, a guia Estatísticas exibirá gráficos de desempenho do sistema em tempo real. Esse recurso requer permissões do sistema e pode usar bateria adicional." + "value" : "Quando ativado, a guia Estatísticas exibirá gráficos de desempenho do sistema em tempo real. Esse recurso requer permissões do sistema e pode usar bateria adicional." } } } diff --git a/DynamicIsland/components/Settings/SettingsView.swift b/DynamicIsland/components/Settings/SettingsView.swift index f7c1c36..b9ee05b 100644 --- a/DynamicIsland/components/Settings/SettingsView.swift +++ b/DynamicIsland/components/Settings/SettingsView.swift @@ -6766,13 +6766,13 @@ struct NotesSettingsView: View { var body: some View { Form { Section { - Defaults.Toggle("Enable Notes", key: .enableNotes) + Defaults.Toggle(String(localized: "Enable Notes"), key: .enableNotes) if Defaults[.enableNotes] { - Defaults.Toggle("Enable Note Pinning", key: .enableNotePinning) - Defaults.Toggle("Enable Note Search", key: .enableNoteSearch) - Defaults.Toggle("Enable Color Filtering", key: .enableNoteColorFiltering) - Defaults.Toggle("Enable Create from Clipboard", key: .enableCreateFromClipboard) - Defaults.Toggle("Show Character Count", key: .enableNoteCharCount) + Defaults.Toggle(String(localized: "Enable Note Pinning"), key: .enableNotePinning) + Defaults.Toggle(String(localized: "Enable Note Search"), key: .enableNoteSearch) + Defaults.Toggle(String(localized: "Enable Color Filtering"), key: .enableNoteColorFiltering) + Defaults.Toggle(String(localized: "Enable Create from Clipboard"), key: .enableCreateFromClipboard) + Defaults.Toggle(String(localized: "Show Character Count"), key: .enableNoteCharCount) } } header: { Text("General") From 041dfbb824bff9cdd517013ab39fa32a1208deb9 Mon Sep 17 00:00:00 2001 From: Felipe Giacomini Cocco Date: Thu, 5 Feb 2026 15:08:37 -0300 Subject: [PATCH 14/26] Fix strings detections and translates the entire "Stats" section --- DynamicIsland/Localizable.xcstrings | 2 +- .../components/Settings/SettingsView.swift | 30 +++++++++---------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/DynamicIsland/Localizable.xcstrings b/DynamicIsland/Localizable.xcstrings index 99be532..01b6142 100644 --- a/DynamicIsland/Localizable.xcstrings +++ b/DynamicIsland/Localizable.xcstrings @@ -12966,7 +12966,7 @@ "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Atualizado pelo Última vez" + "value" : "Última Atualização Há" } } } diff --git a/DynamicIsland/components/Settings/SettingsView.swift b/DynamicIsland/components/Settings/SettingsView.swift index b9ee05b..93b42dc 100644 --- a/DynamicIsland/components/Settings/SettingsView.swift +++ b/DynamicIsland/components/Settings/SettingsView.swift @@ -5884,7 +5884,7 @@ struct StatsSettings: View { var body: some View { Form { Section { - Defaults.Toggle("Enable system stats monitoring", key: .enableStatsFeature) + Defaults.Toggle(String(localized: "Enable system stats monitoring"), key: .enableStatsFeature) .settingsHighlight(id: highlightID("Enable system stats monitoring")) .onChange(of: enableStatsFeature) { _, newValue in if !newValue { @@ -5904,7 +5904,7 @@ struct StatsSettings: View { if enableStatsFeature { Section { - Defaults.Toggle("Stop monitoring after closing the notch", key: .statsStopWhenNotchCloses) + Defaults.Toggle(String(localized: "Stop monitoring after closing the notch"), key: .statsStopWhenNotchCloses) .settingsHighlight(id: highlightID("Stop monitoring after closing the notch")) .help("When enabled, stats monitoring stops a few seconds after the notch closes.") @@ -5944,15 +5944,15 @@ struct StatsSettings: View { } Section { - Defaults.Toggle("CPU Usage", key: .showCpuGraph) + Defaults.Toggle(String(localized: "CPU Usage"), key: .showCpuGraph) .settingsHighlight(id: highlightID("CPU Usage")) - Defaults.Toggle("Memory Usage", key: .showMemoryGraph) + Defaults.Toggle(String(localized: "Memory Usage"), key: .showMemoryGraph) .settingsHighlight(id: highlightID("Memory Usage")) - Defaults.Toggle("GPU Usage", key: .showGpuGraph) + Defaults.Toggle(String(localized: "GPU Usage"), key: .showGpuGraph) .settingsHighlight(id: highlightID("GPU Usage")) - Defaults.Toggle("Network Activity", key: .showNetworkGraph) + Defaults.Toggle(String(localized: "Network Activity"), key: .showNetworkGraph) .settingsHighlight(id: highlightID("Network Activity")) - Defaults.Toggle("Disk I/O", key: .showDiskGraph) + Defaults.Toggle(String(localized: "Disk I/O"), key: .showDiskGraph) .settingsHighlight(id: highlightID("Disk I/O")) } header: { Text("Graph Visibility") @@ -5986,7 +5986,7 @@ struct StatsSettings: View { if statsManager.isMonitoring { if showCpuGraph { HStack { - Text("CPU Usage") + Text(String(localized: "CPU Usage")) Spacer() Text(statsManager.cpuUsageString) .foregroundStyle(.secondary) @@ -5995,7 +5995,7 @@ struct StatsSettings: View { if showMemoryGraph { HStack { - Text("Memory Usage") + Text(String(localized: "Memory Usage")) Spacer() Text(statsManager.memoryUsageString) .foregroundStyle(.secondary) @@ -6004,7 +6004,7 @@ struct StatsSettings: View { if showGpuGraph { HStack { - Text("GPU Usage") + Text(String(localized: "GPU Usage")) Spacer() Text(statsManager.gpuUsageString) .foregroundStyle(.secondary) @@ -6013,14 +6013,14 @@ struct StatsSettings: View { if showNetworkGraph { HStack { - Text("Network Download") + Text(String(localized: "Network Download")) Spacer() Text(String(format: "%.1f MB/s", statsManager.networkDownload)) .foregroundStyle(.secondary) } HStack { - Text("Network Upload") + Text(String(localized: "Network Upload")) Spacer() Text(String(format: "%.1f MB/s", statsManager.networkUpload)) .foregroundStyle(.secondary) @@ -6029,14 +6029,14 @@ struct StatsSettings: View { if showDiskGraph { HStack { - Text("Disk Read") + Text(String(localized: "Disk Read")) Spacer() Text(String(format: "%.1f MB/s", statsManager.diskRead)) .foregroundStyle(.secondary) } HStack { - Text("Disk Write") + Text(String(localized: "Disk Write")) Spacer() Text(String(format: "%.1f MB/s", statsManager.diskWrite)) .foregroundStyle(.secondary) @@ -6044,7 +6044,7 @@ struct StatsSettings: View { } HStack { - Text("Last Updated") + Text(String(localized: "Last Updated")) Spacer() Text(statsManager.lastUpdated, style: .relative) .foregroundStyle(.secondary) From 7f72b8e496edc3f14ced6ba5539fc24ac81d56db Mon Sep 17 00:00:00 2001 From: Felipe Giacomini Cocco Date: Thu, 5 Feb 2026 17:52:09 -0300 Subject: [PATCH 15/26] Fix strings detections and translates the entire "Battery" section --- DynamicIsland/components/Settings/SettingsView.swift | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/DynamicIsland/components/Settings/SettingsView.swift b/DynamicIsland/components/Settings/SettingsView.swift index 93b42dc..7c4b7b1 100644 --- a/DynamicIsland/components/Settings/SettingsView.swift +++ b/DynamicIsland/components/Settings/SettingsView.swift @@ -1762,19 +1762,19 @@ struct Charge: View { Form { if BatteryActivityManager.shared.hasBattery() { Section { - Defaults.Toggle("Show battery indicator", key: .showBatteryIndicator) + Defaults.Toggle(String(localized: "Show battery indicator"), key: .showBatteryIndicator) .settingsHighlight(id: highlightID("Show battery indicator")) - Defaults.Toggle("Show power status notifications", key: .showPowerStatusNotifications) + Defaults.Toggle(String(localized: "Show power status notifications"), key: .showPowerStatusNotifications) .settingsHighlight(id: highlightID("Show power status notifications")) - Defaults.Toggle("Play low battery alert sound", key: .playLowBatteryAlertSound) + Defaults.Toggle(String(localized: "Play low battery alert sound"), key: .playLowBatteryAlertSound) .settingsHighlight(id: highlightID("Play low battery alert sound")) } header: { Text("General") } Section { - Defaults.Toggle("Show battery percentage", key: .showBatteryPercentage) + Defaults.Toggle(String(localized: "Show battery percentage"), key: .showBatteryPercentage) .settingsHighlight(id: highlightID("Show battery percentage")) - Defaults.Toggle("Show power status icons", key: .showPowerStatusIcons) + Defaults.Toggle(String(localized: "Show power status icons"), key: .showPowerStatusIcons) .settingsHighlight(id: highlightID("Show power status icons")) } header: { Text("Battery Information") From 6f94b353e885bdf673364bbf1128e61f357ce492 Mon Sep 17 00:00:00 2001 From: Felipe Giacomini Cocco Date: Thu, 5 Feb 2026 18:15:41 -0300 Subject: [PATCH 16/26] Fix strings detections and translates the entire "Shelf" section --- DynamicIsland/Localizable.xcstrings | 115 ++++++++++++++++-- .../components/Settings/SettingsView.swift | 51 ++++---- 2 files changed, 137 insertions(+), 29 deletions(-) diff --git a/DynamicIsland/Localizable.xcstrings b/DynamicIsland/Localizable.xcstrings index 01b6142..67ceccb 100644 --- a/DynamicIsland/Localizable.xcstrings +++ b/DynamicIsland/Localizable.xcstrings @@ -1842,6 +1842,26 @@ } } }, + "Accessibility permission lets Dynamic Island replace the native volume, brightness, and keyboard HUDs." : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "A permissão de acessibilidade permite que o Dynamic Island substitua o volume nativo, o brilho e os HUDs do teclado." + } + } + } + }, + "Accessibility permission required" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Permissão de acessibilidade necessária" + } + } + } + }, "Actions" : { "localizations" : { "fr" : { @@ -5663,7 +5683,7 @@ "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Escolha qual serviço usar ao compartilhar arquivos da prateleira. Arraste os arquivos para a prateleira ou clique no botão da prateleira para escolher os arquivos." + "value" : "Escolha qual serviço usar ao compartilhar arquivos da mesa. Arraste os arquivos para a mesa ou clique no botão da mesa para escolher os arquivos." } } } @@ -5675,7 +5695,7 @@ "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Escolha quais controles de sistema devem exibir janelas OSD personalizadas." + "value" : "Escolha quais controles de sistema devem exibir janelas OSD customizadas." } } } @@ -5839,6 +5859,9 @@ "circular" : { "shouldTranslate" : false }, + "Circular" : { + "shouldTranslate" : false + }, "classic" : { "localizations" : { "pt-BR" : { @@ -7587,7 +7610,7 @@ "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "OSD personalizado" + "value" : "OSD Customizado" } } } @@ -7599,7 +7622,7 @@ "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "O recurso OSD personalizado requer o macOS 15 ou posterior." + "value" : "O recurso OSD customizado requer o macOS 15 ou posterior." } } } @@ -8850,6 +8873,12 @@ } } }, + "Dynamic Island" : { + "shouldTranslate" : false + }, + "Dynamic Island HUD" : { + "shouldTranslate" : false + }, "Dynamic Island Progress Bars" : { "comment" : "A section header that lists the options for customizing the appearance of the progress bars displayed by Dynamic Island.", "isCommentAutoGenerated" : true, @@ -10526,7 +10555,7 @@ "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Os arquivos deixados na prateleira serão compartilhados através deste serviço" + "value" : "Os arquivos deixados na mesa serão compartilhados através deste serviço" } } } @@ -10726,6 +10755,16 @@ } } }, + "Full Disk Access required" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Acesso Completo ao Disco Necessário" + } + } + } + }, "Fully charged" : { "comment" : "Charging fallback label when already charged", "localizations" : { @@ -11593,6 +11632,16 @@ } } }, + "Grant Full Disk Access so the Shelf can index and move files outside the app sandbox." : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Conceda Acesso Total ao Disco para que a Mesa possa indexar e mover arquivos para fora da sandbox do aplicativo." + } + } + } + }, "graph" : { "localizations" : { "pt-BR" : { @@ -17816,6 +17865,26 @@ } } }, + "Open Privacy & Security" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Abrir Privacidade e Segurança" + } + } + } + }, + "Open Settings" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Abrir Ajustes" + } + } + } + }, "Open shelf tab by default if items added" : { "localizations" : { "pt-BR" : { @@ -18127,6 +18196,16 @@ } } }, + "Play feedback when volume is changed" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Reproduzir feedback quando o volume for alterado" + } + } + } + }, "Play lock/unlock sounds" : { "localizations" : { "pt-BR" : { @@ -19336,7 +19415,7 @@ "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Remova da prateleira depois de arrastar" + "value" : "Remova da mesa depois de arrastar" } } } @@ -19362,7 +19441,17 @@ "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Requer Acesso" + "value" : "Solicitar Acesso" + } + } + } + }, + "Request Full Disk Access" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Solicitar Acesso Completo ao Disco" } } } @@ -20676,7 +20765,7 @@ "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Prateleira" + "value" : "Mesa" } }, "ru" : { @@ -24645,6 +24734,16 @@ } } }, + "Vertical Bar" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Barra Vertical" + } + } + } + }, "Vertical:" : { "extractionState" : "stale", "localizations" : { diff --git a/DynamicIsland/components/Settings/SettingsView.swift b/DynamicIsland/components/Settings/SettingsView.swift index 7c4b7b1..9977d7a 100644 --- a/DynamicIsland/components/Settings/SettingsView.swift +++ b/DynamicIsland/components/Settings/SettingsView.swift @@ -2014,6 +2014,15 @@ private struct HUDAndOSDSettingsView: View { case circular = "Circular" var id: String { rawValue } + + var title: String { + switch self { + case .hud: return String(localized: "Dynamic Island HUD") + case .osd: return String(localized: "Custom OSD") + case .vertical: return String(localized: "Vertical Bar") + case .circular: return String(localized: "Circular") + } + } } private var paneBackgroundColor: Color { @@ -2024,7 +2033,7 @@ private struct HUDAndOSDSettingsView: View { VStack(spacing: 20) { HStack(spacing: 16) { HUDSelectionCard( - title: "Dynamic Island", + title: String(localized: "Dynamic Island"), isSelected: selectedTab == .hud, action: { selectedTab = .hud @@ -2064,7 +2073,7 @@ private struct HUDAndOSDSettingsView: View { } HUDSelectionCard( - title: "Custom OSD", + title: String(localized: "Custom OSD"), isSelected: selectedTab == .osd, action: { selectedTab = .osd @@ -2106,7 +2115,7 @@ private struct HUDAndOSDSettingsView: View { } HUDSelectionCard( - title: "Vertical Bar", + title: String(localized: "Vertical Bar"), isSelected: selectedTab == .vertical, action: { selectedTab = .vertical @@ -2149,7 +2158,7 @@ private struct HUDAndOSDSettingsView: View { } HUDSelectionCard( - title: "Circular", + title: String(localized: "Circular"), isSelected: selectedTab == .circular, action: { selectedTab = .circular @@ -2489,7 +2498,7 @@ struct HUD: View { if !hasAccessibilityPermission { Section { SettingsPermissionCallout( - message: "Accessibility permission lets Dynamic Island replace the native volume, brightness, and keyboard HUDs.", + message: String(localized: "Accessibility permission lets Dynamic Island replace the native volume, brightness, and keyboard HUDs."), requestAction: { accessibilityPermission.requestAuthorizationPrompt() }, openSettingsAction: { accessibilityPermission.openSystemSettings() } ) @@ -2515,7 +2524,7 @@ struct HUD: View { } Section { - Defaults.Toggle("Play feedback when volume is changed", key: .playVolumeChangeFeedback) + Defaults.Toggle(String(localized: "Play feedback when volume is changed"), key: .playVolumeChangeFeedback) .settingsHighlight(id: highlightID("Play feedback when volume is changed")) .help("Plays the supplied feedback clip whenever you press the hardware volume keys.") } header: { @@ -2527,16 +2536,16 @@ struct HUD: View { } Section { - Defaults.Toggle("Color-coded volume display", key: .useColorCodedVolumeDisplay) + Defaults.Toggle(String(localized: "Color-coded volume display"), key: .useColorCodedVolumeDisplay) .disabled(colorCodingDisabled) .settingsHighlight(id: highlightID("Color-coded volume display")) if !colorCodingDisabled && (Defaults[.useColorCodedBatteryDisplay] || Defaults[.useColorCodedVolumeDisplay]) { - Defaults.Toggle("Smooth color transitions", key: .useSmoothColorGradient) + Defaults.Toggle(String(localized: "Smooth color transitions"), key: .useSmoothColorGradient) .settingsHighlight(id: highlightID("Smooth color transitions")) } - Defaults.Toggle("Show percentages beside progress bars", key: .showProgressPercentages) + Defaults.Toggle(String(localized: "Show percentages beside progress bars"), key: .showProgressPercentages) .settingsHighlight(id: highlightID("Show percentages beside progress bars")) } header: { Text("Dynamic Island Progress Bars") @@ -2581,9 +2590,9 @@ struct HUD: View { .tag(ProgressBarStyle.segmented) } .settingsHighlight(id: highlightID("Progressbar style")) - Defaults.Toggle("Enable glowing effect", key: .systemEventIndicatorShadow) + Defaults.Toggle(String(localized: "Enable glowing effect"), key: .systemEventIndicatorShadow) .settingsHighlight(id: highlightID("Enable glowing effect")) - Defaults.Toggle("Use accent color", key: .systemEventIndicatorUseAccent) + Defaults.Toggle(String(localized: "Use accent color"), key: .systemEventIndicatorUseAccent) .settingsHighlight(id: highlightID("Use accent color")) } header: { HStack { @@ -3163,12 +3172,12 @@ struct Shelf: View { if !fullDiskAccessPermission.isAuthorized { Section { SettingsPermissionCallout( - title: "Full Disk Access required", - message: "Grant Full Disk Access so the Shelf can index and move files outside the app sandbox.", + title: String(localized: "Full Disk Access required"), + message: String(localized: "Grant Full Disk Access so the Shelf can index and move files outside the app sandbox."), icon: "externaldrive.fill", iconColor: .purple, - requestButtonTitle: "Request Full Disk Access", - openSettingsButtonTitle: "Open Privacy & Security", + requestButtonTitle: String(localized: "Request Full Disk Access"), + openSettingsButtonTitle: String(localized: "Open Privacy & Security"), requestAction: { fullDiskAccessPermission.requestAccessPrompt() }, openSettingsAction: { fullDiskAccessPermission.openSystemSettings() } ) @@ -3178,11 +3187,11 @@ struct Shelf: View { } Section { - Defaults.Toggle("Enable shelf", key: .dynamicShelf) + Defaults.Toggle(String(localized: "Enable shelf"), key: .dynamicShelf) .disabled(!fullDiskAccessPermission.isAuthorized) .settingsHighlight(id: highlightID("Enable shelf")) - Defaults.Toggle("Open shelf tab by default if items added", key: .openShelfByDefault) + Defaults.Toggle(String(localized: "Open shelf tab by default if items added"), key: .openShelfByDefault) .settingsHighlight(id: highlightID("Open shelf tab by default if items added")) Defaults.Toggle(key: .expandedDragDetection) { @@ -5043,7 +5052,7 @@ struct Shortcuts: View { var body: some View { Form { Section { - Defaults.Toggle("Enable global keyboard shortcuts", key: .enableShortcuts) + Defaults.Toggle(String(localized: "Enable global keyboard shortcuts"), key: .enableShortcuts) .settingsHighlight(id: highlightID("Enable global keyboard shortcuts")) } header: { Text("General") @@ -6702,12 +6711,12 @@ struct SettingsPermissionCallout: View { let openSettingsAction: () -> Void init( - title: String = "Accessibility permission required", + title: String = String(localized: "Accessibility permission required"), message: String, icon: String = "exclamationmark.triangle.fill", iconColor: Color = .orange, - requestButtonTitle: String = "Request Access", - openSettingsButtonTitle: String = "Open Settings", + requestButtonTitle: String = String(localized: "Request Access"), + openSettingsButtonTitle: String = String(localized: "Open Settings"), requestAction: @escaping () -> Void, openSettingsAction: @escaping () -> Void ) { From 10d421b25b57d51a905587fad390e58826a2c47e Mon Sep 17 00:00:00 2001 From: Felipe Giacomini Cocco Date: Thu, 5 Feb 2026 18:27:11 -0300 Subject: [PATCH 17/26] Fix strings detections and translates the entire "Live Activities" section --- DynamicIsland/Localizable.xcstrings | 140 ++++++++++++++++++ .../components/Settings/SettingsView.swift | 30 ++-- DynamicIsland/models/Constants.swift | 6 +- 3 files changed, 158 insertions(+), 18 deletions(-) diff --git a/DynamicIsland/Localizable.xcstrings b/DynamicIsland/Localizable.xcstrings index 67ceccb..b0f87de 100644 --- a/DynamicIsland/Localizable.xcstrings +++ b/DynamicIsland/Localizable.xcstrings @@ -1710,6 +1710,16 @@ } } }, + "Accent" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Destaque" + } + } + } + }, "Accent color" : { "localizations" : { "pt-BR" : { @@ -7251,6 +7261,16 @@ } } }, + "Custom Focus metadata" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Metadados de Foco Customizado" + } + } + } + }, "Custom height" : { "localizations" : { "ar" : { @@ -9208,6 +9228,16 @@ } } }, + "Enable Camera Detection" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ativar Detecção de Câmera" + } + } + } + }, "Enable Clipboard Manager" : { "localizations" : { "pt-BR" : { @@ -9348,6 +9378,16 @@ } } }, + "Enable Focus Detection" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ativar Detecção de Foco" + } + } + } + }, "Enable gestures" : { "localizations" : { "pt-BR" : { @@ -9532,6 +9572,16 @@ } } }, + "Enable Microphone Detection" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Habilitar Detecção de Microfone" + } + } + } + }, "Enable Minimalistic UI" : { "localizations" : { "pt-BR" : { @@ -9702,6 +9752,16 @@ } } }, + "Enable Screen Recording Detection" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ativar Detecção de Gravação de Tela" + } + } + } + }, "Enable shelf" : { "localizations" : { "pt-BR" : { @@ -10765,6 +10825,16 @@ } } }, + "Full Disk Access unlocks custom Focus icons, colors, and labels. Standard Focus detection still works without it—grant access only if you need personalized indicators." : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "O Acesso Total ao Disco desbloqueia ícones, cores e rótulos personalizados do Foco. A detecção de foco padrão ainda funciona sem ele - conceda acesso apenas se você precisar de indicadores personalizados." + } + } + } + }, "Fully charged" : { "comment" : "Charging fallback label when already charged", "localizations" : { @@ -11688,6 +11758,16 @@ } } }, + "Green" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Verde" + } + } + } + }, "grid" : { "localizations" : { "pt-BR" : { @@ -20994,6 +21074,26 @@ } } }, + "Show Caps Lock Indicator" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mostrar Indicador de Caps Lock" + } + } + } + }, + "Show Caps Lock label" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mostrar rótulo Caps Lock" + } + } + } + }, "Show Change Media Output control" : { "localizations" : { "pt-BR" : { @@ -21110,6 +21210,36 @@ } } }, + "Show Focus as brief toast" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mostrar Foco como um breve visualização" + } + } + } + }, + "Show Focus Indicator" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mostrar Indicador de Foco" + } + } + } + }, + "Show Focus Label" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mostrar Rótulo do Foco" + } + } + } + }, "Show full event titles" : { "comment" : "A toggle that shows or hides the full event titles in the calendar view", "isCommentAutoGenerated" : true, @@ -21464,6 +21594,16 @@ } } }, + "Show Recording Indicator" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mostrar Indicador de Gravação" + } + } + } + }, "Show sneak peek on playback changes" : { "comment" : "A toggle that enables showing sneak peek when the currently playing track changes.", "isCommentAutoGenerated" : true, diff --git a/DynamicIsland/components/Settings/SettingsView.swift b/DynamicIsland/components/Settings/SettingsView.swift index 9977d7a..1b47734 100644 --- a/DynamicIsland/components/Settings/SettingsView.swift +++ b/DynamicIsland/components/Settings/SettingsView.swift @@ -3298,10 +3298,10 @@ struct LiveActivitiesSettings: View { var body: some View { Form { Section { - Defaults.Toggle("Enable Screen Recording Detection", key: .enableScreenRecordingDetection) + Defaults.Toggle(String(localized: "Enable Screen Recording Detection"), key: .enableScreenRecordingDetection) .settingsHighlight(id: highlightID("Enable Screen Recording Detection")) - Defaults.Toggle("Show Recording Indicator", key: .showRecordingIndicator) + Defaults.Toggle(String(localized: "Show Recording Indicator"), key: .showRecordingIndicator) .disabled(!enableScreenRecordingDetection) .settingsHighlight(id: highlightID("Show Recording Indicator")) @@ -3332,30 +3332,30 @@ struct LiveActivitiesSettings: View { Section { if !fullDiskAccessPermission.isAuthorized { SettingsPermissionCallout( - title: "Custom Focus metadata", - message: "Full Disk Access unlocks custom Focus icons, colors, and labels. Standard Focus detection still works without it—grant access only if you need personalized indicators.", + title: String(localized: "Custom Focus metadata"), + message: String(localized: "Full Disk Access unlocks custom Focus icons, colors, and labels. Standard Focus detection still works without it—grant access only if you need personalized indicators."), icon: "externaldrive.fill", iconColor: .purple, - requestButtonTitle: "Request Full Disk Access", - openSettingsButtonTitle: "Open Privacy & Security", + requestButtonTitle: String(localized: "Request Full Disk Access"), + openSettingsButtonTitle: String(localized: "Open Privacy & Security"), requestAction: { fullDiskAccessPermission.requestAccessPrompt() }, openSettingsAction: { fullDiskAccessPermission.openSystemSettings() } ) } - Defaults.Toggle("Enable Focus Detection", key: .enableDoNotDisturbDetection) + Defaults.Toggle(String(localized: "Enable Focus Detection"), key: .enableDoNotDisturbDetection) .settingsHighlight(id: highlightID("Enable Focus Detection")) - Defaults.Toggle("Show Focus Indicator", key: .showDoNotDisturbIndicator) + Defaults.Toggle(String(localized: "Show Focus Indicator"), key: .showDoNotDisturbIndicator) .disabled(!enableDoNotDisturbDetection) .settingsHighlight(id: highlightID("Show Focus Indicator")) - Defaults.Toggle("Show Focus Label", key: .showDoNotDisturbLabel) + Defaults.Toggle(String(localized: "Show Focus Label"), key: .showDoNotDisturbLabel) .disabled(!enableDoNotDisturbDetection || focusIndicatorNonPersistent) .help(focusIndicatorNonPersistent ? "Labels are forced to compact on/off text while brief toast mode is enabled." : "Show the active Focus name inside the indicator.") .settingsHighlight(id: highlightID("Show Focus Label")) - Defaults.Toggle("Show Focus as brief toast", key: .focusIndicatorNonPersistent) + Defaults.Toggle(String(localized: "Show Focus as brief toast"), key: .focusIndicatorNonPersistent) .disabled(!enableDoNotDisturbDetection) .settingsHighlight(id: highlightID("Show Focus as brief toast")) .help("When enabled, Focus appears briefly (on/off) and then collapses instead of staying visible.") @@ -3392,10 +3392,10 @@ struct LiveActivitiesSettings: View { } Section { - Defaults.Toggle("Show Caps Lock Indicator", key: .enableCapsLockIndicator) + Defaults.Toggle(String(localized: "Show Caps Lock Indicator"), key: .enableCapsLockIndicator) .settingsHighlight(id: highlightID("Show Caps Lock Indicator")) - Defaults.Toggle("Show Caps Lock label", key: .showCapsLockLabel) + Defaults.Toggle(String(localized: "Show Caps Lock label"), key: .showCapsLockLabel) .disabled(!Defaults[.enableCapsLockIndicator]) .settingsHighlight(id: highlightID("Show Caps Lock label")) @@ -3414,9 +3414,9 @@ struct LiveActivitiesSettings: View { } Section { - Defaults.Toggle("Enable Camera Detection", key: .enableCameraDetection) + Defaults.Toggle(String(localized: "Enable Camera Detection"), key: .enableCameraDetection) .settingsHighlight(id: highlightID("Enable Camera Detection")) - Defaults.Toggle("Enable Microphone Detection", key: .enableMicrophoneDetection) + Defaults.Toggle(String(localized: "Enable Microphone Detection"), key: .enableMicrophoneDetection) .settingsHighlight(id: highlightID("Enable Microphone Detection")) if privacyManager.isMonitoring { @@ -3473,7 +3473,7 @@ struct LiveActivitiesSettings: View { } Section { - Defaults.Toggle("Enable reminder live activity", key: .enableReminderLiveActivity) + Defaults.Toggle(String(localized: "Enable reminder live activity"), key: .enableReminderLiveActivity) .settingsHighlight(id: highlightID("Enable reminder live activity")) } header: { Text("Reminder Live Activity") diff --git a/DynamicIsland/models/Constants.swift b/DynamicIsland/models/Constants.swift index 4afb8e1..44aca8b 100644 --- a/DynamicIsland/models/Constants.swift +++ b/DynamicIsland/models/Constants.swift @@ -355,11 +355,11 @@ enum CapsLockIndicatorTintMode: String, CaseIterable, Identifiable, Defaults.Ser var displayName: String { switch self { case .green: - return "Green" + return String(localized: "Green") case .accent: - return "Accent" + return String(localized: "Accent") case .white: - return "White" + return String(localized: "White") } } From 5c4415c770b1169a3f530c30a9ffe8501a32c505 Mon Sep 17 00:00:00 2001 From: Felipe Giacomini Cocco Date: Thu, 5 Feb 2026 19:02:30 -0300 Subject: [PATCH 18/26] Fix strings detections and translates the entire "Appearance" section and review some translations --- DynamicIsland/Localizable.xcstrings | 235 ++++++++++++++---- .../components/Settings/SettingsView.swift | 62 ++--- DynamicIsland/enums/generic.swift | 26 +- 3 files changed, 245 insertions(+), 78 deletions(-) diff --git a/DynamicIsland/Localizable.xcstrings b/DynamicIsland/Localizable.xcstrings index b0f87de..d2cff21 100644 --- a/DynamicIsland/Localizable.xcstrings +++ b/DynamicIsland/Localizable.xcstrings @@ -99,7 +99,8 @@ "value" : "" } } - } + }, + "shouldTranslate" : false }, " – %lld" : { "localizations" : { @@ -2374,6 +2375,16 @@ } } }, + "Adjusts the lock screen timer widget width without affecting button sizing." : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ajusta a largura do widget do temporizador da tela de bloqueio sem afetar o tamanho do botão." + } + } + } + }, "ai" : { "localizations" : { "pt-BR" : { @@ -3530,6 +3541,16 @@ } } }, + "AQI" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "IQA" + } + } + } + }, "Are you sure you want to delete \"%@\"?" : { "comment" : "A confirmation prompt asking the user to confirm the deletion of a custom idle animation. The placeholder text inside the quotation marks should be replaced with the name of the animation.", "localizations" : { @@ -5492,8 +5513,8 @@ "localizations" : { "pt-BR" : { "stringUnit" : { - "state" : "needs_review", - "value" : "chime" + "state" : "translated", + "value" : "toque de notificação" } } } @@ -5882,6 +5903,16 @@ } } }, + "Classic" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Clássico" + } + } + } + }, "Classic mode keeps the original translucent black background." : { "comment" : "A description of the \"Classic mode\" option in the Lock Screen Integration settings.", "isCommentAutoGenerated" : true, @@ -8458,8 +8489,8 @@ "localizations" : { "pt-BR" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Exibe o estado atual do Foco acima da cápsula climática sempre que a detecção de Foco está ativada." + "state" : "translated", + "value" : "Exibe o estado atual do Foco acima da cápsula de clima quando a detecção de Foco estiver ativada." } } } @@ -8948,6 +8979,9 @@ } } }, + "EAQI" : { + "shouldTranslate" : false + }, "Easily copy, store, and manage your most-used content. Upgrade now for advanced features like multi-item storage and quick access!" : { "localizations" : { "ar" : { @@ -9510,8 +9544,8 @@ }, "pt-BR" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Enable haptics" + "state" : "translated", + "value" : "Ativar feedback tátil" } }, "ru" : { @@ -9812,8 +9846,8 @@ "localizations" : { "pt-BR" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Ative a cápsula da bateria e configure seu layout." + "state" : "translated", + "value" : "Ative a cápsula da bateria e configura seu layout." } } } @@ -9914,8 +9948,8 @@ }, "pt-BR" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Utilização do motor" + "state" : "translated", + "value" : "Utilização da GPU" } } } @@ -10576,8 +10610,8 @@ "localizations" : { "pt-BR" : { "stringUnit" : { - "state" : "needs_review", - "value" : "eyedropper" + "state" : "translated", + "value" : "conta-gotas" } } } @@ -11441,6 +11475,16 @@ } } }, + "Glass" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vidro" + } + } + } + }, "Glass mode" : { "localizations" : { "pt-BR" : { @@ -12897,8 +12941,8 @@ }, "pt-BR" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Inline" + "state" : "translated", + "value" : "em linha" } }, "ru" : { @@ -12931,8 +12975,8 @@ "localizations" : { "pt-BR" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Inline snapshot preview" + "state" : "translated", + "value" : "Pré-visualização de snapshot em linha" } } } @@ -13056,8 +13100,8 @@ "localizations" : { "pt-BR" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Os rótulos são forçados a compactar o texto ligado/desligado enquanto o modo brief toast está ativado." + "state" : "translated", + "value" : "Os rótulos usam textos compactos de ligado/desligado enquanto o modo de notificação breve estiver ativado." } } } @@ -13691,7 +13735,8 @@ "value" : "Lottie JSON 链接" } } - } + }, + "shouldTranslate" : false }, "Low" : { "comment" : "Low battery level label", @@ -14009,8 +14054,8 @@ "localizations" : { "pt-BR" : { "stringUnit" : { - "state" : "needs_review", - "value" : "marquee" + "state" : "translated", + "value" : "texto rolante" } } } @@ -14803,6 +14848,16 @@ } } }, + "Media Panel Width" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Largura do Painel de Mídia" + } + } + } + }, "Media playback live activity" : { "localizations" : { "ar" : { @@ -15930,6 +15985,16 @@ } } }, + "Music" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Música" + } + } + } + }, "Music panel variant" : { "localizations" : { "pt-BR" : { @@ -17923,7 +17988,8 @@ "value" : "open meteo" } } - } + }, + "shouldTranslate" : false }, "Open Model Settings" : { "localizations" : { @@ -19602,6 +19668,26 @@ } } }, + "Reset Media Width" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Redefinir a largura da mídia" + } + } + } + }, + "Reset Music" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Redefinir Música" + } + } + } + }, "Reset Notch Experiences" : { "comment" : "A menu item that resets all notch experiences for a particular app.", "isCommentAutoGenerated" : true, @@ -19626,6 +19712,26 @@ } } }, + "Reset Timer" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Redefinir Temporizador" + } + } + } + }, + "Reset Timer Width" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Redefinir Largura do Temporizador" + } + } + } + }, "Reset to Default" : { "localizations" : { "fr" : { @@ -19654,6 +19760,16 @@ } } }, + "Reset Weather" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Redefinir Tempo" + } + } + } + }, "Reset Width" : { "comment" : "A button to reset the expanded notch width to its default value.", "isCommentAutoGenerated" : true, @@ -19999,8 +20115,8 @@ "localizations" : { "pt-BR" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Screen Padding: %lldpx" + "state" : "translated", + "value" : "Espaçamento da tela: %lldpx" } } } @@ -21240,6 +21356,16 @@ } } }, + "Show focus widget" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Redefinir Widget de Foco" + } + } + } + }, "Show full event titles" : { "comment" : "A toggle that shows or hides the full event titles in the calendar view", "isCommentAutoGenerated" : true, @@ -21616,6 +21742,16 @@ } } }, + "Show sunrise time" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mostrar a hora do nascer do sol" + } + } + } + }, "Show the active Focus name inside the indicator." : { "comment" : "A description of why the \"Show Focus Label\" toggle is disabled when the \"Show Focus as brief toast\" toggle is enabled.", "isCommentAutoGenerated" : true, @@ -21674,6 +21810,16 @@ } } }, + "Shrinks the lock screen media panel while keeping the expanded view full width." : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Encolhe o painel de mídia da tela de bloqueio, mantendo a largura total da visualização expandida." + } + } + } + }, "Size: %lldpx" : { "localizations" : { "pt-BR" : { @@ -22060,8 +22206,8 @@ }, "pt-BR" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Sneak Peek Style" + "state" : "translated", + "value" : "Estilo de prévia rápida" } }, "ru" : { @@ -23447,8 +23593,8 @@ "localizations" : { "pt-BR" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Timer glass material" + "state" : "translated", + "value" : "Material do vidro do temporizador" } } } @@ -23459,8 +23605,8 @@ "localizations" : { "pt-BR" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Timer liquid mode" + "state" : "translated", + "value" : "Modo fluido do temporizador" } } } @@ -23567,6 +23713,16 @@ } } }, + "Timer Widget Width" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Largura do Widget do Temporizador" + } + } + } + }, "Title" : { "comment" : "A label for the title input field in the note editor.", "isCommentAutoGenerated" : true, @@ -24525,8 +24681,8 @@ }, "pt-BR" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Use o espectrograma visualizador de música" + "state" : "translated", + "value" : "Usar espectrograma no visualizador de música" } }, "ru" : { @@ -24639,8 +24795,8 @@ "localizations" : { "pt-BR" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Usa o tratamento de desfoque fosco enquanto o modo de vidro está ativado." + "state" : "translated", + "value" : "Aplica o efeito de desfoque fosco quando o modo vidro está ativado." } } } @@ -25489,14 +25645,7 @@ } }, "wttr" : { - "localizations" : { - "pt-BR" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "wttr" - } - } - } + "shouldTranslate" : false }, "You" : { "localizations" : { diff --git a/DynamicIsland/components/Settings/SettingsView.swift b/DynamicIsland/components/Settings/SettingsView.swift index 1b47734..3288b6a 100644 --- a/DynamicIsland/components/Settings/SettingsView.swift +++ b/DynamicIsland/components/Settings/SettingsView.swift @@ -4189,9 +4189,9 @@ struct LockScreenSettings: View { var body: some View { Form { Section { - Defaults.Toggle("Enable lock screen live activity", key: .enableLockScreenLiveActivity) + Defaults.Toggle(String(localized: "Enable lock screen live activity"), key: .enableLockScreenLiveActivity) .settingsHighlight(id: highlightID("Enable lock screen live activity")) - Defaults.Toggle("Play lock/unlock sounds", key: .enableLockSounds) + Defaults.Toggle(String(localized: "Play lock/unlock sounds"), key: .enableLockSounds) .settingsHighlight(id: highlightID("Play lock/unlock sounds")) } header: { Text("Live Activity & Feedback") @@ -4246,12 +4246,12 @@ struct LockScreenSettings: View { } Section { - Defaults.Toggle("Show lock screen media panel", key: .enableLockScreenMediaWidget) + Defaults.Toggle(String(localized: "Show lock screen media panel"), key: .enableLockScreenMediaWidget) .settingsHighlight(id: highlightID("Show lock screen media panel")) - Defaults.Toggle("Show media app icon", key: .lockScreenShowAppIcon) + Defaults.Toggle(String(localized: "Show media app icon"), key: .lockScreenShowAppIcon) .disabled(!enableLockScreenMediaWidget) .settingsHighlight(id: highlightID("Show media app icon")) - Defaults.Toggle("Show panel border", key: .lockScreenPanelShowsBorder) + Defaults.Toggle(String(localized: "Show panel border"), key: .lockScreenPanelShowsBorder) .disabled(!enableLockScreenMediaWidget) .settingsHighlight(id: highlightID("Show panel border")) if lockScreenGlassCustomizationMode == .customLiquid { @@ -4287,11 +4287,11 @@ struct LockScreenSettings: View { .opacity(showStandardMediaControls ? 1 : 0.5) Section { - Defaults.Toggle("Show lock screen timer", key: .enableLockScreenTimerWidget) + Defaults.Toggle(String(localized: "Show lock screen timer"), key: .enableLockScreenTimerWidget) .settingsHighlight(id: highlightID("Show lock screen timer")) Picker("Timer surface", selection: timerSurfaceBinding) { ForEach(LockScreenTimerSurfaceMode.allCases) { mode in - Text(mode.rawValue).tag(mode) + Text(mode.localizedName).tag(mode) } } .pickerStyle(.segmented) @@ -4349,13 +4349,13 @@ struct LockScreenSettings: View { } Section { - Defaults.Toggle("Show lock screen weather", key: .enableLockScreenWeatherWidget) + Defaults.Toggle(String(localized: "Show lock screen weather"), key: .enableLockScreenWeatherWidget) .settingsHighlight(id: highlightID("Show lock screen weather")) if enableLockScreenWeatherWidget { Picker("Layout", selection: $lockScreenWeatherWidgetStyle) { ForEach(LockScreenWeatherWidgetStyle.allCases) { style in - Text(style.rawValue).tag(style) + Text(style.localizedName).tag(style) } } .pickerStyle(.segmented) @@ -4377,15 +4377,15 @@ struct LockScreenSettings: View { .pickerStyle(.segmented) .settingsHighlight(id: highlightID("Temperature unit")) - Defaults.Toggle("Show location label", key: .lockScreenWeatherShowsLocation) + Defaults.Toggle(String(localized: "Show location label"), key: .lockScreenWeatherShowsLocation) .disabled(lockScreenWeatherWidgetStyle == .circular) .settingsHighlight(id: highlightID("Show location label")) - Defaults.Toggle("Show sunrise time", key: .lockScreenWeatherShowsSunrise) + Defaults.Toggle(String(localized: "Show sunrise time"), key: .lockScreenWeatherShowsSunrise) .disabled(lockScreenWeatherWidgetStyle != .inline) .settingsHighlight(id: highlightID("Show sunrise time")) - Defaults.Toggle("Show AQI widget", key: .lockScreenWeatherShowsAQI) + Defaults.Toggle(String(localized: "Show AQI widget"), key: .lockScreenWeatherShowsAQI) .disabled(!lockScreenWeatherProviderSource.supportsAirQuality) .settingsHighlight(id: highlightID("Show AQI widget")) @@ -4405,7 +4405,7 @@ struct LockScreenSettings: View { .foregroundStyle(.secondary) } - Defaults.Toggle("Use colored gauges", key: .lockScreenWeatherUsesGaugeTint) + Defaults.Toggle(String(localized: "Use colored gauges"), key: .lockScreenWeatherUsesGaugeTint) .settingsHighlight(id: highlightID("Use colored gauges")) } } header: { @@ -4416,22 +4416,22 @@ struct LockScreenSettings: View { if BatteryActivityManager.shared.hasBattery() { Section { - Defaults.Toggle("Show battery indicator", key: .lockScreenBatteryShowsBatteryGauge) + Defaults.Toggle(String(localized: "Show battery indicator"), key: .lockScreenBatteryShowsBatteryGauge) .settingsHighlight(id: highlightID("Show battery indicator")) if lockScreenWeatherShowsBatteryGauge { - Defaults.Toggle("Use MacBook icon when on battery", key: .lockScreenBatteryUsesLaptopSymbol) + Defaults.Toggle(String(localized: "Use MacBook icon when on battery"), key: .lockScreenBatteryUsesLaptopSymbol) .settingsHighlight(id: highlightID("Use MacBook icon when on battery")) - Defaults.Toggle("Show charging status", key: .lockScreenBatteryShowsCharging) + Defaults.Toggle(String(localized: "Show charging status"), key: .lockScreenBatteryShowsCharging) .settingsHighlight(id: highlightID("Show charging status")) if lockScreenWeatherShowsCharging { - Defaults.Toggle("Show charging percentage", key: .lockScreenBatteryShowsChargingPercentage) + Defaults.Toggle(String(localized: "Show charging percentage"), key: .lockScreenBatteryShowsChargingPercentage) .settingsHighlight(id: highlightID("Show charging percentage")) } - Defaults.Toggle("Show Bluetooth battery", key: .lockScreenBatteryShowsBluetooth) + Defaults.Toggle(String(localized: "Show Bluetooth battery"), key: .lockScreenBatteryShowsBluetooth) .settingsHighlight(id: highlightID("Show Bluetooth battery")) } } header: { @@ -4442,7 +4442,7 @@ struct LockScreenSettings: View { } Section { - Defaults.Toggle("Show focus widget", key: .enableLockScreenFocusWidget) + Defaults.Toggle(String(localized: "Show focus widget"), key: .enableLockScreenFocusWidget) .settingsHighlight(id: highlightID("Show focus widget")) } header: { Text("Focus Widget") @@ -4593,9 +4593,9 @@ private struct LockScreenPositioningControls: View { HStack(alignment: .top, spacing: 24) { offsetColumn( - title: "Weather", + title: String(localized: "Weather"), value: weatherOffset, - resetTitle: "Reset Weather", + resetTitle: String(localized: "Reset Weather"), resetAction: resetWeatherOffset ) @@ -4603,9 +4603,9 @@ private struct LockScreenPositioningControls: View { .frame(height: 64) offsetColumn( - title: "Timer", + title: String(localized: "Timer"), value: timerOffset, - resetTitle: "Reset Timer", + resetTitle: String(localized: "Reset Timer"), resetAction: resetTimerOffset ) @@ -4613,9 +4613,9 @@ private struct LockScreenPositioningControls: View { .frame(height: 64) offsetColumn( - title: "Music", + title: String(localized: "Music"), value: musicOffset, - resetTitle: "Reset Music", + resetTitle: String(localized: "Reset Music"), resetAction: resetMusicOffset ) @@ -4627,21 +4627,21 @@ private struct LockScreenPositioningControls: View { VStack(alignment: .leading, spacing: 16) { widthSlider( - title: "Media Panel Width", + title: String(localized: "Media Panel Width"), value: musicWidthBinding, range: musicWidthRange, - resetTitle: "Reset Media Width", + resetTitle: String(localized: "Reset Media Width"), resetAction: resetMusicWidth, - helpText: "Shrinks the lock screen media panel while keeping the expanded view full width." + helpText: String(localized: "Shrinks the lock screen media panel while keeping the expanded view full width.") ) widthSlider( - title: "Timer Widget Width", + title: String(localized: "Timer Widget Width"), value: timerWidthBinding, range: timerWidthRange, - resetTitle: "Reset Timer Width", + resetTitle: String(localized: "Reset Timer Width"), resetAction: resetTimerWidth, - helpText: "Adjusts the lock screen timer widget width without affecting button sizing." + helpText: String(localized: "Adjusts the lock screen timer widget width without affecting button sizing.") ) } } header: { diff --git a/DynamicIsland/enums/generic.swift b/DynamicIsland/enums/generic.swift index 4f66755..0c92bcd 100644 --- a/DynamicIsland/enums/generic.swift +++ b/DynamicIsland/enums/generic.swift @@ -162,6 +162,15 @@ enum LockScreenTimerSurfaceMode: String, CaseIterable, Defaults.Serializable, Id case glass = "Glass" var id: String { rawValue } + + var localizedName: String { + switch self { + case .classic: + return String(localized: "Classic") + case .glass: + return String(localized: "Glass") + } + } } enum LockScreenWeatherWidgetStyle: String, CaseIterable, Defaults.Serializable, Identifiable { @@ -169,6 +178,15 @@ enum LockScreenWeatherWidgetStyle: String, CaseIterable, Defaults.Serializable, case circular = "Circular" var id: String { rawValue } + + var localizedName: String { + switch self { + case .inline: + return String(localized: "Inline") + case .circular: + return String(localized: "Circular") + } + } } enum LockScreenWeatherProviderSource: String, CaseIterable, Defaults.Serializable, Identifiable { @@ -223,18 +241,18 @@ enum LockScreenWeatherAirQualityScale: String, CaseIterable, Defaults.Serializab var compactLabel: String { switch self { case .us: - return "AQI" + return String(localized: "AQI") case .european: - return "EAQI" + return String(localized: "EAQI") } } var accessibilityLabel: String { switch self { case .us: - return "AQI" + return String(localized: "AQI") case .european: - return "EAQI" + return String(localized: "EAQI") } } From 30694fca340b3de6a5e999d09a98722b1c7850c8 Mon Sep 17 00:00:00 2001 From: Felipe Giacomini Cocco Date: Thu, 5 Feb 2026 19:07:22 -0300 Subject: [PATCH 19/26] Fixed missing detection on "Clipboard Manager"section --- DynamicIsland/Localizable.xcstrings | 2 +- DynamicIsland/components/Settings/SettingsView.swift | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/DynamicIsland/Localizable.xcstrings b/DynamicIsland/Localizable.xcstrings index d2cff21..a22ccf3 100644 --- a/DynamicIsland/Localizable.xcstrings +++ b/DynamicIsland/Localizable.xcstrings @@ -12942,7 +12942,7 @@ "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "em linha" + "value" : "Em linha" } }, "ru" : { diff --git a/DynamicIsland/components/Settings/SettingsView.swift b/DynamicIsland/components/Settings/SettingsView.swift index 3288b6a..7418137 100644 --- a/DynamicIsland/components/Settings/SettingsView.swift +++ b/DynamicIsland/components/Settings/SettingsView.swift @@ -6106,7 +6106,7 @@ struct ClipboardSettings: View { var body: some View { Form { Section { - Defaults.Toggle("Enable Clipboard Manager", key: .enableClipboardManager) + Defaults.Toggle(String(localized: "Enable Clipboard Manager"), key: .enableClipboardManager) .settingsHighlight(id: highlightID("Enable Clipboard Manager")) .onChange(of: enableClipboardManager) { _, enabled in if enabled { From 879a4589d291f84e1a9f6067c77e698795e5a447 Mon Sep 17 00:00:00 2001 From: Felipe Giacomini Cocco Date: Thu, 5 Feb 2026 19:56:10 -0300 Subject: [PATCH 20/26] Fix strings detections and translates the entire "Extensions" and "Timer" sections --- DynamicIsland/Localizable.xcstrings | 154 +++++++++++++++++- .../Settings/ExtensionsSettings.swift | 16 +- .../components/Settings/SettingsView.swift | 22 +-- DynamicIsland/enums/TimerDisplayMode.swift | 4 +- DynamicIsland/enums/generic.swift | 11 +- DynamicIsland/models/Constants.swift | 11 +- DynamicIsland/models/TimerPreset.swift | 6 +- 7 files changed, 188 insertions(+), 36 deletions(-) diff --git a/DynamicIsland/Localizable.xcstrings b/DynamicIsland/Localizable.xcstrings index a22ccf3..0c4db4d 100644 --- a/DynamicIsland/Localizable.xcstrings +++ b/DynamicIsland/Localizable.xcstrings @@ -1945,6 +1945,16 @@ } } }, + "Adaptive gradient" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Gradiente Adaptativo" + } + } + } + }, "Add" : { "localizations" : { "ar" : { @@ -3007,6 +3017,36 @@ } } }, + "Allow extension notch experiences" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Permitir experiências de extensão no notch" + } + } + } + }, + "Allow interactive web content" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Permitir conteúdo web interativo " + } + } + } + }, + "Allow minimalistic overrides" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Permitir substituições minimalistas" + } + } + } + }, "Allowed Features" : { "comment" : "A label describing the allowed features for an app extension.", "isCommentAutoGenerated" : true, @@ -3237,7 +3277,7 @@ "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Nome da Animaçãp" + "value" : "Nome da Animação" } } } @@ -3988,6 +4028,16 @@ } } }, + "Bar" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Barra" + } + } + } + }, "battery" : { "localizations" : { "pt-BR" : { @@ -4699,6 +4749,16 @@ } } }, + "Break" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Descanso" + } + } + } + }, "Breakdown" : { "comment" : "A label displayed above the breakdown of memory usage.", "isCommentAutoGenerated" : true, @@ -7950,6 +8010,16 @@ } } }, + "Deep Work" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Trabalho Focado" + } + } + } + }, "Default" : { "localizations" : { "ar" : { @@ -10786,6 +10856,16 @@ } } }, + "Focus" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Foco" + } + } + } + }, "Focus active: %@" : { "comment" : "An accessibility label for the focus widget, describing the currently active focus mode.", "isCommentAutoGenerated" : true, @@ -10839,6 +10919,9 @@ "frosted" : { "shouldTranslate" : false }, + "Frosted Glass" : { + "shouldTranslate" : false + }, "Full Access" : { "localizations" : { "pt-BR" : { @@ -12260,6 +12343,16 @@ }, "shouldTranslate" : false }, + "Hours" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Horas" + } + } + } + }, "hover" : { "shouldTranslate" : false }, @@ -13311,6 +13404,9 @@ } } }, + "Liquid Glass" : { + "shouldTranslate" : false + }, "Liquid Glass requires macOS 26 or later." : { "localizations" : { "fr" : { @@ -17060,7 +17156,7 @@ "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Nenhuma predefinição configurada. Adicione uma predefinição para que ela apareça no pop-over do temporizador." + "value" : "Nenhuma predefinição configurada. Adicione uma predefinição para que ela apareça no menu suspenso do temporizador." } } } @@ -18504,6 +18600,16 @@ } } }, + "Popover" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Menu Suspenso" + } + } + } + }, "Popover mode shows clipboard as a dropdown attached to the clipboard button." : { "comment" : "A description of the \"Popover mode\" in the Clipboard Settings view.", "isCommentAutoGenerated" : true, @@ -18511,7 +18617,7 @@ "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "O modo popover mostra a área de transferência como um menu suspenso anexado ao botão da área de transferência." + "value" : "O modo Menu Suspenso mostra a área de transferência como um menu suspenso anexado ao botão da área de transferência." } } } @@ -18521,7 +18627,7 @@ "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "O modo popover mostra o seletor de cores como um menu suspenso anexado ao botão do seletor de cores. O modo painel mostra o seletor de cores em uma janela flutuante." + "value" : "O modo Menu Suspenso mostra o seletor de cores como um menu suspenso anexado ao botão do seletor de cores. O modo painel mostra o seletor de cores em uma janela flutuante." } } } @@ -18531,7 +18637,7 @@ "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "O modo Popover mostra o assistente como um menu suspenso conectado ao botão AI. O modo painel mostra o assistente em uma janela flutuante perto do notch." + "value" : "O modo Menu Suspenso mostra o assistente como um menu suspenso conectado ao botão AI. O modo painel mostra o assistente em uma janela flutuante perto do notch." } } } @@ -18589,7 +18695,7 @@ "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Nome da predefinições" + "value" : "Nome da predefinição" } } } @@ -18613,7 +18719,7 @@ "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "As predefinições aparecem dentro do pop-over do temporizador com o nome configurado, a duração e a cor de destaque. Reordene-os para alterar a ordem de exibição." + "value" : "As predefinições aparecem dentro do menu suspenso do temporizador com o nome configurado, a duração e a cor de destaque. Reordene-os para alterar a ordem de exibição." } } } @@ -20282,6 +20388,16 @@ } } }, + "Seconds" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Segundos" + } + } + } + }, "Segmented" : { "localizations" : { "fr" : { @@ -21316,6 +21432,16 @@ } } }, + "Show extension tabs" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mostrar aba de extensão" + } + } + } + }, "Show floating pause/stop controls" : { "localizations" : { "pt-BR" : { @@ -23256,6 +23382,16 @@ } } }, + "Tab" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aba" + } + } + } + }, "Take area screenshot" : { "localizations" : { "fr" : { @@ -23354,7 +23490,7 @@ "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Essa duração alimenta a opção \"Personalizado\" dentro do popover do temporizador para acesso rápido." + "value" : "Essa duração alimenta a opção \"Personalizado\" dentro do menu suspenso do temporizador para acesso rápido." } } } @@ -23628,7 +23764,7 @@ "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Presets do Temporizador" + "value" : "Pré-Definições do Temporizador" } } } diff --git a/DynamicIsland/components/Settings/ExtensionsSettings.swift b/DynamicIsland/components/Settings/ExtensionsSettings.swift index 05fc9ed..cda6147 100644 --- a/DynamicIsland/components/Settings/ExtensionsSettings.swift +++ b/DynamicIsland/components/Settings/ExtensionsSettings.swift @@ -61,32 +61,32 @@ struct ExtensionsSettingsView: View { private var globalTogglesSection: some View { Section { - Defaults.Toggle("Enable third-party extensions", key: .enableThirdPartyExtensions) + Defaults.Toggle(String(localized:"Enable third-party extensions"), key: .enableThirdPartyExtensions) .settingsHighlight(id: highlightID("Enable third-party extensions")) if Defaults[.enableThirdPartyExtensions] { - Defaults.Toggle("Allow extension live activities", key: .enableExtensionLiveActivities) + Defaults.Toggle(String(localized:"Allow extension live activities"), key: .enableExtensionLiveActivities) .settingsHighlight(id: highlightID("Allow extension live activities")) - Defaults.Toggle("Allow extension lock screen widgets", key: .enableExtensionLockScreenWidgets) + Defaults.Toggle(String(localized:"Allow extension lock screen widgets"), key: .enableExtensionLockScreenWidgets) .settingsHighlight(id: highlightID("Allow extension lock screen widgets")) - Defaults.Toggle("Allow extension notch experiences", key: .enableExtensionNotchExperiences) + Defaults.Toggle(String(localized:"Allow extension notch experiences"), key: .enableExtensionNotchExperiences) .settingsHighlight(id: highlightID("Allow extension notch experiences")) if Defaults[.enableExtensionNotchExperiences] { VStack(alignment: .leading, spacing: 8) { - Defaults.Toggle("Show extension tabs", key: .enableExtensionNotchTabs) + Defaults.Toggle(String(localized:"Show extension tabs"), key: .enableExtensionNotchTabs) .tint(.accentColor) - Defaults.Toggle("Allow minimalistic overrides", key: .enableExtensionNotchMinimalisticOverrides) + Defaults.Toggle(String(localized:"Allow minimalistic overrides"), key: .enableExtensionNotchMinimalisticOverrides) .tint(.accentColor) - Defaults.Toggle("Allow interactive web content", key: .enableExtensionNotchInteractiveWebViews) + Defaults.Toggle(String(localized:"Allow interactive web content"), key: .enableExtensionNotchInteractiveWebViews) .tint(.accentColor) } .padding(.leading, 4) } - Defaults.Toggle("Enable extension diagnostics logging", key: .extensionDiagnosticsLoggingEnabled) + Defaults.Toggle(String(localized:"Enable extension diagnostics logging"), key: .extensionDiagnosticsLoggingEnabled) .settingsHighlight(id: highlightID("Enable extension diagnostics logging")) } } header: { diff --git a/DynamicIsland/components/Settings/SettingsView.swift b/DynamicIsland/components/Settings/SettingsView.swift index 7418137..dac8606 100644 --- a/DynamicIsland/components/Settings/SettingsView.swift +++ b/DynamicIsland/components/Settings/SettingsView.swift @@ -5322,7 +5322,7 @@ struct TimerSettings: View { @ViewBuilder private var timerFeatureSection: some View { Section { - Defaults.Toggle("Enable timer feature", key: .enableTimerFeature) + Defaults.Toggle(String(localized: "Enable timer feature"), key: .enableTimerFeature) .settingsHighlight(id: highlightID("Enable timer feature")) if enableTimerFeature { @@ -5377,11 +5377,11 @@ struct TimerSettings: View { @ViewBuilder private var lockScreenIntegrationSection: some View { Section { - Defaults.Toggle("Show lock screen timer widget", key: .enableLockScreenTimerWidget) + Defaults.Toggle(String(localized:"Show lock screen timer widget"), key: .enableLockScreenTimerWidget) .settingsHighlight(id: highlightID("Show lock screen timer widget")) Picker("Timer surface", selection: timerSurfaceBinding) { ForEach(LockScreenTimerSurfaceMode.allCases) { mode in - Text(mode.rawValue).tag(mode) + Text(mode.localizedName).tag(mode) } } .pickerStyle(.segmented) @@ -5392,7 +5392,7 @@ struct TimerSettings: View { if timerGlassModeIsGlass { Picker("Timer glass material", selection: $lockScreenTimerGlassStyle) { ForEach(LockScreenGlassStyle.allCases) { style in - Text(style.rawValue).tag(style) + Text(style.localizedName).tag(style) } } .disabled(!enableLockScreenTimerWidget) @@ -5452,9 +5452,9 @@ struct TimerSettings: View { Text("Default Custom Timer") .font(.headline) - TimerDurationStepperRow(title: "Hours", value: $customHours, range: 0...23) - TimerDurationStepperRow(title: "Minutes", value: $customMinutes, range: 0...59) - TimerDurationStepperRow(title: "Seconds", value: $customSeconds, range: 0...59) + TimerDurationStepperRow(title: String(localized:"Hours"), value: $customHours, range: 0...23) + TimerDurationStepperRow(title: String(localized:"Minutes"), value: $customMinutes, range: 0...59) + TimerDurationStepperRow(title: String(localized:"Seconds"), value: $customSeconds, range: 0...59) HStack { Text("Current default:") @@ -5504,7 +5504,7 @@ struct TimerSettings: View { Picker("Progress style", selection: $progressStyle) { ForEach(TimerProgressStyle.allCases) { style in - Text(style.rawValue).tag(style) + Text(style.localizedName).tag(style) } } .pickerStyle(.segmented) @@ -5794,9 +5794,9 @@ private struct TimerPresetEditorRow: View { } HStack(spacing: 16) { - TimerPresetComponentControl(title: "Hours", value: hoursBinding, range: 0...23) - TimerPresetComponentControl(title: "Minutes", value: minutesBinding, range: 0...59) - TimerPresetComponentControl(title: "Seconds", value: secondsBinding, range: 0...59) + TimerPresetComponentControl(title: String(localized:"Hours"), value: hoursBinding, range: 0...23) + TimerPresetComponentControl(title: String(localized:"Minutes"), value: minutesBinding, range: 0...59) + TimerPresetComponentControl(title: String(localized:"Seconds"), value: secondsBinding, range: 0...59) } ColorPicker("Accent colour", selection: colorBinding, supportsOpacity: false) diff --git a/DynamicIsland/enums/TimerDisplayMode.swift b/DynamicIsland/enums/TimerDisplayMode.swift index 00835dd..b65fd56 100644 --- a/DynamicIsland/enums/TimerDisplayMode.swift +++ b/DynamicIsland/enums/TimerDisplayMode.swift @@ -27,9 +27,9 @@ public enum TimerDisplayMode: String, CaseIterable, Defaults.Serializable, Ident var displayName: String { switch self { case .tab: - return "Tab" + return String(localized:"Tab") case .popover: - return "Popover" + return String(localized:"Popover") } } diff --git a/DynamicIsland/enums/generic.swift b/DynamicIsland/enums/generic.swift index 0c92bcd..f9a9b8d 100644 --- a/DynamicIsland/enums/generic.swift +++ b/DynamicIsland/enums/generic.swift @@ -133,8 +133,17 @@ enum SliderColorEnum: String, CaseIterable, Defaults.Serializable { enum LockScreenGlassStyle: String, CaseIterable, Defaults.Serializable, Identifiable { case liquid = "Liquid Glass" case frosted = "Frosted Glass" - + var id: String { rawValue } + + var localizedName: String { + switch self { + case .liquid: + return String(localized: "Liquid Glass") + case .frosted: + return String(localized: "Frosted Glass") + } + } } enum LockScreenGlassCustomizationMode: String, CaseIterable, Defaults.Serializable, Identifiable { diff --git a/DynamicIsland/models/Constants.swift b/DynamicIsland/models/Constants.swift index 44aca8b..b1b0ed7 100644 --- a/DynamicIsland/models/Constants.swift +++ b/DynamicIsland/models/Constants.swift @@ -462,8 +462,8 @@ enum TimerIconColorMode: String, CaseIterable, Identifiable, Defaults.Serializab var displayName: String { switch self { - case .adaptive: return "Adaptive gradient" - case .solid: return "Solid colour" + case .adaptive: return String(localized:"Adaptive gradient") + case .solid: return String(localized:"Solid colour") } } } @@ -473,6 +473,13 @@ enum TimerProgressStyle: String, CaseIterable, Identifiable, Defaults.Serializab case ring = "Ring" var id: String { rawValue } + + var localizedName: String { + switch self { + case .bar: return String(localized:"Bar") + case .ring: return String(localized:"Ring") + } + } } enum ReminderPresentationStyle: String, CaseIterable, Identifiable, Defaults.Serializable { diff --git a/DynamicIsland/models/TimerPreset.swift b/DynamicIsland/models/TimerPreset.swift index b733459..cfd0b9f 100644 --- a/DynamicIsland/models/TimerPreset.swift +++ b/DynamicIsland/models/TimerPreset.swift @@ -97,8 +97,8 @@ struct TimerPreset: Identifiable, Codable, Hashable, Defaults.Serializable { } static let defaultPresets: [TimerPreset] = [ - TimerPreset(name: "Focus", duration: 25 * 60, color: Color.orange), - TimerPreset(name: "Break", duration: 5 * 60, color: Color.green), - TimerPreset(name: "Deep Work", duration: 45 * 60, color: Color.purple) + TimerPreset(name: String(localized:"Focus"), duration: 25 * 60, color: Color.orange), + TimerPreset(name: String(localized:"Break"), duration: 5 * 60, color: Color.green), + TimerPreset(name: String(localized:"Deep Work"), duration: 45 * 60, color: Color.purple) ] } From f6f6321defa014961b06583f330bdd4fdc40cca6 Mon Sep 17 00:00:00 2001 From: Felipe Giacomini Cocco Date: Thu, 5 Feb 2026 22:55:25 -0300 Subject: [PATCH 21/26] Fix string detection issues and complete pt-BR localization (100% done, as far as I can tell) --- DynamicIsland/Localizable.xcstrings | 321 +++++++++++++++++- .../components/Clipboard/ClipboardPanel.swift | 8 +- .../Clipboard/ClipboardShared.swift | 9 +- .../ColorPicker/ColorPickerPanel.swift | 16 +- .../Live activities/InlineHUD.swift | 10 +- .../Notch/ClipboardHistoryPopover.swift | 8 +- .../Notch/NotchColorPickerView.swift | 8 +- .../components/Notch/NotchNotesView.swift | 12 +- .../components/Notch/NotchStatsView.swift | 14 +- .../components/Notch/NotchTimerView.swift | 2 +- .../components/Settings/SettingsView.swift | 40 ++- .../components/Timer/TimerPopover.swift | 2 +- .../models/BatteryStatusViewModel.swift | 12 +- DynamicIsland/models/Constants.swift | 17 +- 14 files changed, 402 insertions(+), 77 deletions(-) diff --git a/DynamicIsland/Localizable.xcstrings b/DynamicIsland/Localizable.xcstrings index 0c4db4d..ae19b40 100644 --- a/DynamicIsland/Localizable.xcstrings +++ b/DynamicIsland/Localizable.xcstrings @@ -888,11 +888,59 @@ } } }, + "%lld day%@ ago" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "%1$lld day%2$@ ago" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$lld dias %2$@ atrás" + } + } + } + }, + "%lld hour%@ ago" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "%1$lld hour%2$@ ago" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$lld horas %2$@ atrás" + } + } + } + }, "%lld min" : { "comment" : "A text label displaying the current value of the \"Notify before\" slider. The argument is the current value of the slider, expressed in minutes.", "isCommentAutoGenerated" : true, "shouldTranslate" : false }, + "%lld minute%@ ago" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "%1$lld minute%2$@ ago" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$lld minutos %2$@ atrás" + } + } + } + }, "%lld px" : { "comment" : "A label displaying the current expanded notch width value. The value is shown in pixels.", "isCommentAutoGenerated" : true, @@ -1014,6 +1062,9 @@ } } }, + "%lldh" : { + "shouldTranslate" : false + }, "%lldh ago" : { "localizations" : { "pt-BR" : { @@ -1024,6 +1075,9 @@ } } }, + "%lldm" : { + "shouldTranslate" : false + }, "%lldm ago" : { "localizations" : { "pt-BR" : { @@ -3546,6 +3600,9 @@ } } }, + "Apple Music" : { + "shouldTranslate" : false + }, "Applies the notch-style parallax effect to the lock screen media widget album art." : { "localizations" : { "pt-BR" : { @@ -5349,6 +5406,16 @@ } } }, + "Charging battery" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Carregando Bateria" + } + } + } + }, "charging icon" : { "localizations" : { "pt-BR" : { @@ -7227,6 +7294,9 @@ "cpu" : { "shouldTranslate" : false }, + "CPU" : { + "shouldTranslate" : false + }, "CPU Usage" : { "localizations" : { "fr" : { @@ -7749,7 +7819,7 @@ "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Temporizador Personalizado" + "value" : "Temporizador Customizado" } } } @@ -8127,7 +8197,7 @@ "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Temporizador Personalizado Padrão" + "value" : "Temporizador Customizado Padrão" } } } @@ -8449,6 +8519,16 @@ } } }, + "Disk" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Disco" + } + } + } + }, "Disk I/O" : { "localizations" : { "pt-BR" : { @@ -9017,7 +9097,7 @@ "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Visibilidade da Dynamic Islan" + "value" : "Visibilidade da Dynamic Island" } } } @@ -10699,6 +10779,16 @@ "fahrenheit" : { "shouldTranslate" : false }, + "Favorites" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Favoritos" + } + } + } + }, "feedback" : { "shouldTranslate" : false }, @@ -10932,6 +11022,16 @@ } } }, + "Full charge" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bateria Completa" + } + } + } + }, "Full Disk Access required" : { "localizations" : { "pt-BR" : { @@ -11703,6 +11803,9 @@ "gpu" : { "shouldTranslate" : false }, + "GPU" : { + "shouldTranslate" : false + }, "GPU Usage" : { "localizations" : { "fr" : { @@ -12315,6 +12418,16 @@ } } }, + "History" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Histórico" + } + } + } + }, "History Size" : { "localizations" : { "fr" : { @@ -13123,6 +13236,16 @@ } } }, + "just now" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "agora mesmo" + } + } + } + }, "Just now" : { "localizations" : { "pt-BR" : { @@ -13945,6 +14068,16 @@ } } }, + "Low battery" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bateria baixa" + } + } + } + }, "Low Power Mode" : { "localizations" : { "ar" : { @@ -14045,6 +14178,16 @@ } } }, + "Low Power: %@" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pouca Energia: %@" + } + } + } + }, "lyrics" : { "localizations" : { "pt-BR" : { @@ -15285,6 +15428,16 @@ } } }, + "Memory" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Memória" + } + } + } + }, "Memory Usage" : { "localizations" : { "fr" : { @@ -15421,6 +15574,16 @@ } } }, + "Mic" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Microfone" + } + } + } + }, "Mic muted" : { "comment" : "A description of the state when the microphone is muted.", "isCommentAutoGenerated" : true, @@ -16545,6 +16708,16 @@ } } }, + "Network" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Rede" + } + } + } + }, "Network Activity" : { "localizations" : { "pt-BR" : { @@ -17335,6 +17508,16 @@ } } }, + "Not charging" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Carregamento Parado" + } + } + } + }, "Not Determined" : { "localizations" : { "pt-BR" : { @@ -17809,6 +17992,26 @@ } } }, + "Now Playing" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tocando Agora" + } + } + } + }, + "Off" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Desligado" + } + } + } + }, "OK" : { "localizations" : { "ar" : { @@ -17910,6 +18113,16 @@ }, "shouldTranslate" : false }, + "On" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ligado" + } + } + } + }, "on-screen display" : { "localizations" : { "pt-BR" : { @@ -18216,6 +18429,16 @@ } } }, + "Panel" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Painel" + } + } + } + }, "panel border" : { "localizations" : { "pt-BR" : { @@ -19177,6 +19400,17 @@ } } }, + "R " : { + "comment" : "Abbreviation for “Disk Read”", + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "L" + } + } + } + }, "ram" : { "shouldTranslate" : false }, @@ -20431,7 +20665,7 @@ "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Selecione um som personalizado para reproduzir quando um cronômetro terminar. Os formatos suportados incluem MP3, M4A, WAV e AIFF." + "value" : "Selecione um som Customizado para reproduzir quando um cronômetro terminar. Os formatos suportados incluem MP3, M4A, WAV e AIFF." } } } @@ -21226,6 +21460,16 @@ } } }, + "Show \"Change Media Output\" control" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mostrar controle \"Alterar Saída de Mídia\"" + } + } + } + }, "Show All Color Formats" : { "localizations" : { "pt-BR" : { @@ -21442,6 +21686,16 @@ } } }, + "Show floating media controls" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mostrar controles de mídia flutuantes" + } + } + } + }, "Show floating pause/stop controls" : { "localizations" : { "pt-BR" : { @@ -21574,6 +21828,16 @@ } } }, + "Show media controls in Dynamic Island" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mostrar controles de mídia na Ilha Dinâmica" + } + } + } + }, "Show on a specific display" : { "localizations" : { "ar" : { @@ -21910,6 +22174,26 @@ } } }, + "Shows screen assistant as a dropdown attached to the AI button" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mostra o assistente de tela como um menu suspenso anexado ao botão de IA" + } + } + } + }, + "Shows screen assistant in a floating panel near the notch" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mostra o assistente de tela em um painel flutuante próximo ao notch" + } + } + } + }, "Shows the model's reasoning process before the final answer" : { "localizations" : { "fr" : { @@ -22624,6 +22908,9 @@ } } }, + "Spotify" : { + "shouldTranslate" : false + }, "Square" : { "localizations" : { "ar" : { @@ -22899,7 +23186,7 @@ "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Comece a digital…" + "value" : "Comece a digitar…" } } } @@ -24529,6 +24816,16 @@ } } }, + "Unplugged" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Desconectado" + } + } + } + }, "Update interval" : { "localizations" : { "pt-BR" : { @@ -25337,6 +25634,17 @@ } } }, + "W " : { + "comment" : "Abbreviation for “Disk Write”", + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "G" + } + } + } + }, "weather" : { "localizations" : { "pt-BR" : { @@ -26011,6 +26319,9 @@ } } }, + "Youtube Music" : { + "shouldTranslate" : false + }, "YouTube Music requires this third-party app to be installed: " : { "localizations" : { "ar" : { diff --git a/DynamicIsland/components/Clipboard/ClipboardPanel.swift b/DynamicIsland/components/Clipboard/ClipboardPanel.swift index d80ae42..6972bba 100644 --- a/DynamicIsland/components/Clipboard/ClipboardPanel.swift +++ b/DynamicIsland/components/Clipboard/ClipboardPanel.swift @@ -456,16 +456,16 @@ struct ClipboardPanelItemRow: View { let interval = Date().timeIntervalSince(date) if interval < 60 { - return "Just now" + return String(localized: "Just now") } else if interval < 3600 { let minutes = Int(interval / 60) - return "\(minutes)m ago" + return String(localized: "\(minutes)m ago") } else if interval < 86400 { let hours = Int(interval / 3600) - return "\(hours)h ago" + return String(localized: "\(hours)h ago") } else { let days = Int(interval / 86400) - return "\(days)d ago" + return String(localized: "\(days)d ago") } } } diff --git a/DynamicIsland/components/Clipboard/ClipboardShared.swift b/DynamicIsland/components/Clipboard/ClipboardShared.swift index 1bd5baf..e30acc5 100644 --- a/DynamicIsland/components/Clipboard/ClipboardShared.swift +++ b/DynamicIsland/components/Clipboard/ClipboardShared.swift @@ -28,6 +28,13 @@ enum ClipboardTab: String, CaseIterable { case .favorites: return "heart.fill" } } + + var localizedName: String { + switch self { + case .history: return String(localized: "History") + case .favorites: return String(localized: "Favorites") + } + } } struct ClipboardTabButton: View { @@ -51,7 +58,7 @@ struct ClipboardTabButton: View { Image(systemName: tab.icon) .font(.system(size: 11)) - Text(tab.rawValue) + Text(tab.localizedName) .font(.system(size: 11, weight: .medium)) if itemCount > 0 { diff --git a/DynamicIsland/components/ColorPicker/ColorPickerPanel.swift b/DynamicIsland/components/ColorPicker/ColorPickerPanel.swift index 63488c2..4e7b019 100644 --- a/DynamicIsland/components/ColorPicker/ColorPickerPanel.swift +++ b/DynamicIsland/components/ColorPicker/ColorPickerPanel.swift @@ -530,16 +530,16 @@ struct ColorListRow: View { let interval = Date().timeIntervalSince(date) if interval < 60 { - return "Just now" + return String(localized: "Just now") } else if interval < 3600 { let minutes = Int(interval / 60) - return "\(minutes)m ago" + return String(localized: "\(minutes)m ago") } else if interval < 86400 { let hours = Int(interval / 3600) - return "\(hours)h ago" + return String(localized: "\(hours)h ago") } else { let days = Int(interval / 86400) - return "\(days)d ago" + return String(localized: "\(days)d ago") } } } @@ -589,16 +589,16 @@ struct ColorDetailsView: View { let interval = Date().timeIntervalSince(date) if interval < 60 { - return "just now" + return String(localized: "just now") } else if interval < 3600 { let minutes = Int(interval / 60) - return "\(minutes) minute\(minutes == 1 ? "" : "s") ago" + return String(localized: "\(minutes) minute\(minutes == 1 ? "" : "s") ago") } else if interval < 86400 { let hours = Int(interval / 3600) - return "\(hours) hour\(hours == 1 ? "" : "s") ago" + return String(localized: "\(hours) hour\(hours == 1 ? "" : "s") ago") } else { let days = Int(interval / 86400) - return "\(days) day\(days == 1 ? "" : "s") ago" + return String(localized: "\(days) day\(days == 1 ? "" : "s") ago") } } } diff --git a/DynamicIsland/components/Live activities/InlineHUD.swift b/DynamicIsland/components/Live activities/InlineHUD.swift index e319b29..5c591d4 100644 --- a/DynamicIsland/components/Live activities/InlineHUD.swift +++ b/DynamicIsland/components/Live activities/InlineHUD.swift @@ -432,17 +432,17 @@ struct InlineHUD: View { func Type2Name(_ type: SneakContentType) -> String { switch(type) { case .volume: - return "Volume" + return String(localized: "Volume") case .brightness: - return "Brightness" + return String(localized: "Brightness") case .backlight: - return "Backlight" + return String(localized: "Backlight") case .mic: - return "Mic" + return String(localized: "Mic") case .bluetoothAudio: return BluetoothAudioManager.shared.lastConnectedDevice?.name ?? "Bluetooth" case .capsLock: - return "Caps Lock" + return String(localized: "Caps Lock") default: return "" } diff --git a/DynamicIsland/components/Notch/ClipboardHistoryPopover.swift b/DynamicIsland/components/Notch/ClipboardHistoryPopover.swift index 0867434..530f672 100644 --- a/DynamicIsland/components/Notch/ClipboardHistoryPopover.swift +++ b/DynamicIsland/components/Notch/ClipboardHistoryPopover.swift @@ -193,16 +193,16 @@ struct ClipboardItemRow: View { let interval = Date().timeIntervalSince(date) if interval < 60 { - return "Just now" + return String(localized: "Just now") } else if interval < 3600 { let minutes = Int(interval / 60) - return "\(minutes)m ago" + return String(localized: "\(minutes)m ago") } else if interval < 86400 { let hours = Int(interval / 3600) - return "\(hours)h ago" + return String(localized: "\(hours)h ago") } else { let days = Int(interval / 86400) - return "\(days)d ago" + return String(localized: "\(days)d ago") } } } diff --git a/DynamicIsland/components/Notch/NotchColorPickerView.swift b/DynamicIsland/components/Notch/NotchColorPickerView.swift index 2a819de..674878e 100644 --- a/DynamicIsland/components/Notch/NotchColorPickerView.swift +++ b/DynamicIsland/components/Notch/NotchColorPickerView.swift @@ -288,16 +288,16 @@ struct ColorInfoPopup: View { let interval = Date().timeIntervalSince(date) if interval < 60 { - return "Just now" + return String(localized: "Just now") } else if interval < 3600 { let minutes = Int(interval / 60) - return "\(minutes)m ago" + return String(localized: "\(minutes)m ago") } else if interval < 86400 { let hours = Int(interval / 3600) - return "\(hours)h ago" + return String(localized: "\(hours)h ago") } else { let days = Int(interval / 86400) - return "\(days)d ago" + return String(localized: "\(days)d ago") } } } diff --git a/DynamicIsland/components/Notch/NotchNotesView.swift b/DynamicIsland/components/Notch/NotchNotesView.swift index 308ebfa..d78a1b8 100644 --- a/DynamicIsland/components/Notch/NotchNotesView.swift +++ b/DynamicIsland/components/Notch/NotchNotesView.swift @@ -527,9 +527,9 @@ struct NotchClipboardItemRow: View { private func timeAgoString(from date: Date) -> String { let interval = Date().timeIntervalSince(date) - if interval < 60 { return "Just now" } - if interval < 3600 { return "\(Int(interval/60))m" } - return "\(Int(interval/3600))h" + if interval < 60 { return String(localized: "Just now") } + if interval < 3600 { return String(localized: "\(Int(interval/60))m") } + return String(localized: "\(Int(interval/3600))h") } } @@ -936,9 +936,9 @@ struct NoteRow: View { private func timeAgoString(from date: Date) -> String { let interval = Date().timeIntervalSince(date) - if interval < 60 { return "Just now" } - if interval < 3600 { return "\(Int(interval/60))m" } - if interval < 86400 { return "\(Int(interval/3600))h" } + if interval < 60 { return String(localized: "Just now") } + if interval < 3600 { return String(localized: "\(Int(interval/60))m") } + if interval < 86400 { return String(localized: "\(Int(interval/3600))h") } return date.formatted(.dateTime.day().month()) } } diff --git a/DynamicIsland/components/Notch/NotchStatsView.swift b/DynamicIsland/components/Notch/NotchStatsView.swift index 545b393..dc6a7b5 100644 --- a/DynamicIsland/components/Notch/NotchStatsView.swift +++ b/DynamicIsland/components/Notch/NotchStatsView.swift @@ -82,7 +82,7 @@ struct NotchStatsView: View { if showCpuGraph { graphs.append(SingleGraphData( - title: "CPU", + title: String(localized: "CPU"), value: statsManager.cpuUsageString, data: statsManager.cpuHistory, color: .blue, @@ -92,7 +92,7 @@ struct NotchStatsView: View { if showMemoryGraph { graphs.append(SingleGraphData( - title: "Memory", + title: String(localized: "Memory"), value: statsManager.memoryUsageString, data: statsManager.memoryHistory, color: .green, @@ -102,7 +102,7 @@ struct NotchStatsView: View { if showGpuGraph { graphs.append(SingleGraphData( - title: "GPU", + title: String(localized: "GPU"), value: statsManager.gpuUsageString, data: statsManager.gpuHistory, color: .purple, @@ -112,7 +112,7 @@ struct NotchStatsView: View { if showNetworkGraph { graphs.append(DualGraphData( - title: "Network", + title: String(localized: "Network"), positiveValue: "↓" + statsManager.networkDownloadString, negativeValue: "↑" + statsManager.networkUploadString, positiveData: statsManager.networkDownloadHistory, @@ -126,9 +126,9 @@ struct NotchStatsView: View { if showDiskGraph { graphs.append(DualGraphData( - title: "Disk", - positiveValue: "R " + statsManager.diskReadString, - negativeValue: "W " + statsManager.diskWriteString, + title: String(localized: "Disk"), + positiveValue: String(localized: "R ") + statsManager.diskReadString, + negativeValue: String(localized: "W ") + statsManager.diskWriteString, positiveData: statsManager.diskReadHistory, negativeData: statsManager.diskWriteHistory, positiveColor: .cyan, diff --git a/DynamicIsland/components/Notch/NotchTimerView.swift b/DynamicIsland/components/Notch/NotchTimerView.swift index 384b86b..c64606e 100644 --- a/DynamicIsland/components/Notch/NotchTimerView.swift +++ b/DynamicIsland/components/Notch/NotchTimerView.swift @@ -461,7 +461,7 @@ struct NotchTimerView: View { private var startButton: some View { Button { withAnimation(.smooth) { - timerManager.startTimer(duration: customDurationInSeconds, name: "Custom Timer") + timerManager.startTimer(duration: customDurationInSeconds, name: String(localized: "Custom Timer")) if !enableMinimalisticUI { coordinator.currentView = .timer } diff --git a/DynamicIsland/components/Settings/SettingsView.swift b/DynamicIsland/components/Settings/SettingsView.swift index dac8606..14a4f8d 100644 --- a/DynamicIsland/components/Settings/SettingsView.swift +++ b/DynamicIsland/components/Settings/SettingsView.swift @@ -2427,13 +2427,13 @@ private struct DevicesSettingsView: View { var body: some View { Form { Section { - Defaults.Toggle("Show Bluetooth device connections", key: .showBluetoothDeviceConnections) + Defaults.Toggle(String(localized: "Show Bluetooth device connections"), key: .showBluetoothDeviceConnections) .settingsHighlight(id: highlightID("Show Bluetooth device connections")) - Defaults.Toggle("Use circular battery indicator", key: .useCircularBluetoothBatteryIndicator) + Defaults.Toggle(String(localized: "Use circular battery indicator"), key: .useCircularBluetoothBatteryIndicator) .settingsHighlight(id: highlightID("Use circular battery indicator")) - Defaults.Toggle("Show battery percentage text in HUD", key: .showBluetoothBatteryPercentageText) + Defaults.Toggle(String(localized: "Show battery percentage text in HUD"), key: .showBluetoothBatteryPercentageText) .settingsHighlight(id: highlightID("Show battery percentage text in HUD")) - Defaults.Toggle("Scroll device name in HUD", key: .showBluetoothDeviceNameMarquee) + Defaults.Toggle(String(localized: "Scroll device name in HUD"), key: .showBluetoothDeviceNameMarquee) .settingsHighlight(id: highlightID("Scroll device name in HUD")) } header: { Text("Bluetooth Audio Devices") @@ -2444,7 +2444,7 @@ private struct DevicesSettingsView: View { } Section { - Defaults.Toggle("Color-coded battery display", key: .useColorCodedBatteryDisplay) + Defaults.Toggle(String(localized: "Color-coded battery display"), key: .useColorCodedBatteryDisplay) .disabled(colorCodingDisabled) .settingsHighlight(id: highlightID("Color-coded battery display")) } header: { @@ -2643,7 +2643,7 @@ struct Media: View { Section { Picker("Music Source", selection: $mediaController) { ForEach(availableMediaControllers) { controller in - Text(controller.rawValue).tag(controller) + Text(controller.localizedName).tag(controller) } } .onChange(of: mediaController) { _, _ in @@ -2672,7 +2672,7 @@ struct Media: View { } } Section { - Defaults.Toggle("Show media controls in Dynamic Island", key: .showStandardMediaControls) + Defaults.Toggle(String(localized: "Show media controls in Dynamic Island"), key: .showStandardMediaControls) .disabled(enableMinimalisticUI) .settingsHighlight(id: highlightID("Show media controls in Dynamic Island")) @@ -2696,7 +2696,7 @@ struct Media: View { } } if showShuffleAndRepeat { - Defaults.Toggle("Show \"Change Media Output\" control", key: .showMediaOutputControl) + Defaults.Toggle(String(localized: "Show \"Change Media Output\" control"), key: .showMediaOutputControl) .settingsHighlight(id: highlightID("Show Change Media Output control")) .help("Adds the AirPlay/route picker button back to the customizable controls palette.") MusicSlotConfigurationView() @@ -2711,7 +2711,7 @@ struct Media: View { } Section(header: Text("Lock Screen Media")) { - Defaults.Toggle("Enable album art parallax", key: .lockScreenMusicAlbumParallaxEnabled) + Defaults.Toggle(String(localized: "Enable album art parallax"), key: .lockScreenMusicAlbumParallaxEnabled) .settingsHighlight(id: highlightID("Enable album art parallax")) Text("Applies the notch-style parallax effect to the lock screen media widget album art.") .font(.caption) @@ -2741,18 +2741,16 @@ struct Media: View { ) .disabled(standardControlsSuppressed) .help(standardControlsSuppressed ? "Standard notch media controls are hidden while this toggle is off." : "") - Defaults.Toggle( - "Show floating media controls", - key: .musicControlWindowEnabled - ) + Defaults.Toggle(String(localized: "Show floating media controls"), + key: .musicControlWindowEnabled) .disabled(!coordinator.musicLiveActivityEnabled || standardControlsSuppressed) .help("Displays play/pause and skip buttons beside the notch while music is active. Disabled by default.") Toggle("Enable sneak peek", isOn: $enableSneakPeek) Toggle("Show sneak peek on playback changes", isOn: $showSneakPeekOnTrackChange) .disabled(!enableSneakPeek) - Defaults.Toggle("Enable lyrics", key: .enableLyrics) + Defaults.Toggle(String(localized: "Enable lyrics"), key: .enableLyrics) .settingsHighlight(id: highlightID("Enable lyrics")) - Defaults.Toggle("Enable album art parallax effect", key: .enableParallaxEffect) + Defaults.Toggle(String(localized: "Enable album art parallax effect"), key: .enableParallaxEffect) .settingsHighlight(id: highlightID("Enable album art parallax effect")) Picker("Sneak Peek Style", selection: $sneakPeekStyles){ ForEach(SneakPeekStyle.allCases) { style in @@ -2789,10 +2787,10 @@ struct Media: View { } Section { - Defaults.Toggle("Show lock screen media panel", key: .enableLockScreenMediaWidget) - Defaults.Toggle("Show media app icon", key: .lockScreenShowAppIcon) + Defaults.Toggle(String(localized: "Show lock screen media panel"), key: .enableLockScreenMediaWidget) + Defaults.Toggle(String(localized: "Show media app icon"), key: .lockScreenShowAppIcon) .disabled(!enableLockScreenMediaWidget) - Defaults.Toggle("Show panel border", key: .lockScreenPanelShowsBorder) + Defaults.Toggle(String(localized: "Show panel border"), key: .lockScreenPanelShowsBorder) .disabled(!enableLockScreenMediaWidget) if lockScreenGlassCustomizationMode == .customLiquid { customLiquidBlurRow @@ -6346,7 +6344,7 @@ struct ScreenAssistantSettings: View { } } .pickerStyle(.menu) - .frame(width: 100) + .frame(width: 150) } .settingsHighlight(id: highlightID("Display Mode")) @@ -6473,7 +6471,7 @@ struct ColorPickerSettings: View { } } .pickerStyle(.menu) - .frame(width: 100) + .frame(width: 150) } .settingsHighlight(id: highlightID("Display Mode")) @@ -6487,7 +6485,7 @@ struct ColorPickerSettings: View { Text("20 colors").tag(20) } .pickerStyle(.menu) - .frame(width: 100) + .frame(width: 150) } .settingsHighlight(id: highlightID("History Size")) diff --git a/DynamicIsland/components/Timer/TimerPopover.swift b/DynamicIsland/components/Timer/TimerPopover.swift index 7b27eff..4bef53d 100644 --- a/DynamicIsland/components/Timer/TimerPopover.swift +++ b/DynamicIsland/components/Timer/TimerPopover.swift @@ -100,7 +100,7 @@ struct TimerPopover: View { let duration = customDurationInSeconds guard duration > 0 else { return } withAnimation(.smooth) { - timerManager.startTimer(duration: duration, name: "Custom Timer") + timerManager.startTimer(duration: duration, name: String(localized: "Custom Timer")) } dismiss() } diff --git a/DynamicIsland/models/BatteryStatusViewModel.swift b/DynamicIsland/models/BatteryStatusViewModel.swift index 42d4ce3..0b9e792 100644 --- a/DynamicIsland/models/BatteryStatusViewModel.swift +++ b/DynamicIsland/models/BatteryStatusViewModel.swift @@ -81,7 +81,7 @@ class BatteryStatusViewModel: ObservableObject { print("🔌 Power source: \(isPluggedIn ? "Connected" : "Disconnected")") withAnimation { self.isPluggedIn = isPluggedIn - self.statusText = isPluggedIn ? "Plugged In" : "Unplugged" + self.statusText = isPluggedIn ? String(localized: "Plugged In") : String(localized: "Unplugged") self.notifyImportanChangeStatus() } @@ -98,7 +98,7 @@ class BatteryStatusViewModel: ObservableObject { self.notifyImportanChangeStatus() withAnimation { self.isInLowPowerMode = isEnabled - self.statusText = "Low Power: \(self.isInLowPowerMode ? "On" : "Off")" + self.statusText = String(localized: "Low Power: \(self.isInLowPowerMode ? String(localized: "On") : String(localized: "Off"))") } case .isChargingChanged(let isCharging): @@ -110,8 +110,8 @@ class BatteryStatusViewModel: ObservableObject { self.isCharging = isCharging self.statusText = isCharging - ? "Charging battery" - : (self.levelBattery < self.maxCapacity ? "Not charging" : "Full charge") + ? String(localized: "Charging battery") + : (self.levelBattery < self.maxCapacity ? String(localized: "Not charging") : String(localized: "Full charge")) } case .timeToFullChargeChanged(let time): @@ -141,7 +141,7 @@ class BatteryStatusViewModel: ObservableObject { self.isInLowPowerMode = batteryInfo.isInLowPowerMode self.timeToFullCharge = batteryInfo.timeToFullCharge self.maxCapacity = batteryInfo.maxCapacity - self.statusText = batteryInfo.isPluggedIn ? "Plugged In" : "Unplugged" + self.statusText = batteryInfo.isPluggedIn ? String(localized: "Plugged In") : String(localized: "Unplugged") } } @@ -161,7 +161,7 @@ class BatteryStatusViewModel: ObservableObject { for threshold in lowBatteryAlertThresholds { if previousLevel >= threshold && newLevel < threshold { - self.statusText = "Low battery" + self.statusText = String(localized: "Low battery") notifyImportanChangeStatus() playLowBatteryAlertSound() break diff --git a/DynamicIsland/models/Constants.swift b/DynamicIsland/models/Constants.swift index b1b0ed7..8d94c30 100644 --- a/DynamicIsland/models/Constants.swift +++ b/DynamicIsland/models/Constants.swift @@ -284,15 +284,15 @@ enum ScreenAssistantDisplayMode: String, CaseIterable, Codable, Defaults.Seriali var displayName: String { switch self { - case .popover: return "Popover" - case .panel: return "Panel" + case .popover: return String(localized: "Popover") + case .panel: return String(localized: "Panel") } } var description: String { switch self { - case .popover: return "Shows screen assistant as a dropdown attached to the AI button" - case .panel: return "Shows screen assistant in a floating panel near the notch" + case .popover: return String(localized: "Shows screen assistant as a dropdown attached to the AI button") + case .panel: return String(localized: "Shows screen assistant in a floating panel near the notch") } } } @@ -335,6 +335,15 @@ enum MediaControllerType: String, CaseIterable, Identifiable, Defaults.Serializa case youtubeMusic = "Youtube Music" var id: String { self.rawValue } + + var localizedName: String { + switch self { + case .nowPlaying: return String(localized: "Now Playing") + case .appleMusic: return String(localized: "Apple Music") + case .spotify: return String(localized: "Spotify") + case .youtubeMusic: return String(localized: "Youtube Music") + } + } } // Sneak peek styles for selection in settings From d80ead1bd2e137f2e3bbbfaf652feb0cacdcaada Mon Sep 17 00:00:00 2001 From: Felipe Giacomini Cocco Date: Thu, 5 Feb 2026 23:16:57 -0300 Subject: [PATCH 22/26] Fix strings detections and translates the entire Onboarding --- .../MusicControllerSelectionView.swift | 8 ++++---- .../components/Onboarding/OnboardingView.swift | 12 ++++++------ .../Onboarding/ProfileSelectionView.swift | 16 ++++++++-------- .../components/Settings/SettingsView.swift | 3 +-- 4 files changed, 19 insertions(+), 20 deletions(-) diff --git a/DynamicIsland/components/Onboarding/MusicControllerSelectionView.swift b/DynamicIsland/components/Onboarding/MusicControllerSelectionView.swift index 082e428..b3dc6d0 100644 --- a/DynamicIsland/components/Onboarding/MusicControllerSelectionView.swift +++ b/DynamicIsland/components/Onboarding/MusicControllerSelectionView.swift @@ -136,13 +136,13 @@ extension MediaControllerType { var description: String { switch self { case .nowPlaying: - return "Works with most media apps, including browsers, to detect what's playing. Note: This may be removed in a future macOS version." + return String(localized: "Works with most media apps, including browsers, to detect what's playing. Note: This may be removed in a future macOS version.") case .spotify: - return "Connects directly to the Spotify app." + return String(localized: "Connects directly to the Spotify app.") case .appleMusic: - return "Connects directly to the Apple Music app." + return String(localized: "Connects directly to the Apple Music app.") case .youtubeMusic: - return "Requires a third-party client with API plugin enabled." + return String(localized: "Requires a third-party client with API plugin enabled.") } } } diff --git a/DynamicIsland/components/Onboarding/OnboardingView.swift b/DynamicIsland/components/Onboarding/OnboardingView.swift index 7c6988b..bed1fd7 100644 --- a/DynamicIsland/components/Onboarding/OnboardingView.swift +++ b/DynamicIsland/components/Onboarding/OnboardingView.swift @@ -53,9 +53,9 @@ struct OnboardingView: View { case .cameraPermission: PermissionRequestView( icon: Image(systemName: "camera.fill"), - title: "Enable Camera Access", - description: "Atoll includes a mirror feature that lets you quickly check your appearance using your camera, right from the notch. Camera access is required only to show this live preview. You can turn the mirror feature on or off at any time in the app.", - privacyNote: "Your camera is never used without your consent, and nothing is recorded or stored.", + title: String(localized: "Enable Camera Access"), + description: String(localized: "Atoll includes a mirror feature that lets you quickly check your appearance using your camera, right from the notch. Camera access is required only to show this live preview. You can turn the mirror feature on or off at any time in the app."), + privacyNote: String(localized: "Your camera is never used without your consent, and nothing is recorded or stored."), onAllow: { Task { await requestCameraPermission() @@ -75,9 +75,9 @@ struct OnboardingView: View { case .calendarPermission: PermissionRequestView( icon: Image(systemName: "calendar"), - title: "Enable Calendar Access", - description: "Atoll can show all your upcoming events in one place. Access to your calendar is needed to display your schedule.", - privacyNote: "Your calendar data is only used to show your events and is never shared.", + title: String(localized: "Enable Calendar Access"), + description: String(localized: "Atoll can show all your upcoming events in one place. Access to your calendar is needed to display your schedule."), + privacyNote: String(localized: "Your calendar data is only used to show your events and is never shared."), onAllow: { Task { await requestCalendarPermission() diff --git a/DynamicIsland/components/Onboarding/ProfileSelectionView.swift b/DynamicIsland/components/Onboarding/ProfileSelectionView.swift index 564d351..92b6594 100644 --- a/DynamicIsland/components/Onboarding/ProfileSelectionView.swift +++ b/DynamicIsland/components/Onboarding/ProfileSelectionView.swift @@ -34,30 +34,30 @@ struct ProfileSelectionView: View { let profiles: [UserProfile] = [ UserProfile( id: "developer", - name: "Developer", + name: String(localized: "Developer"), icon: "terminal.fill", - description: "Code and debug with color picker, stats monitoring, and screen assistant.", + description: String(localized: "Code and debug with color picker, stats monitoring, and screen assistant."), gradient: [Color.blue, Color.purple] ), UserProfile( id: "designer", - name: "Designer", + name: String(localized: "Designer"), icon: "paintbrush.fill", - description: "Create and design with color picker, mirror, and visual effects.", + description: String(localized: "Create and design with color picker, mirror, and visual effects."), gradient: [Color.pink, Color.orange] ), UserProfile( id: "lightuse", - name: "Light Use", + name: String(localized: "Light Use"), icon: "sparkles", - description: "Simple and minimal interface with just the essentials for everyday tasks.", + description: String(localized: "Simple and minimal interface with just the essentials for everyday tasks."), gradient: [Color.green, Color.mint] ), UserProfile( id: "student", - name: "Student", + name: String(localized: "Student"), icon: "book.fill", - description: "Stay organized with calendar, timer, and battery monitoring.", + description: String(localized: "Stay organized with calendar, timer, and battery monitoring."), gradient: [Color.indigo, Color.cyan] ) ] diff --git a/DynamicIsland/components/Settings/SettingsView.swift b/DynamicIsland/components/Settings/SettingsView.swift index 14a4f8d..29660ab 100644 --- a/DynamicIsland/components/Settings/SettingsView.swift +++ b/DynamicIsland/components/Settings/SettingsView.swift @@ -1682,8 +1682,7 @@ struct GeneralSettings: View { if enableHorizontalMusicGestures { Picker("Gesture skip behavior", selection: $musicGestureBehavior) { ForEach(MusicSkipBehavior.allCases) { behavior in - Text(behavior.displayName) - .tag(behavior) + Text(behavior.displayName).tag(behavior) } } .pickerStyle(.segmented) From 00d30e489e444972a612cd1659e6bd077cf7d751 Mon Sep 17 00:00:00 2001 From: Hariharan Mudaliar Date: Wed, 4 Feb 2026 20:00:28 +0530 Subject: [PATCH 23/26] Delete backup --- DynamicIsland/Localizable.xcstrings.backup | 1615 -------------------- 1 file changed, 1615 deletions(-) delete mode 100644 DynamicIsland/Localizable.xcstrings.backup diff --git a/DynamicIsland/Localizable.xcstrings.backup b/DynamicIsland/Localizable.xcstrings.backup deleted file mode 100644 index d637cd2..0000000 --- a/DynamicIsland/Localizable.xcstrings.backup +++ /dev/null @@ -1,1615 +0,0 @@ -{ - "sourceLanguage" : "en", - "strings" : { - "" : { - - }, - " – %lld" : { - - }, - "-%@" : { - "comment" : "A label displaying the duration of the current song. The argument is the duration of the song in seconds.", - "isCommentAutoGenerated" : true - }, - "'Now Playing' was the only option on previous versions and works with all media apps." : { - - }, - "(%@)" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "(%@)" - } - } - } - }, - "%.0f seconds" : { - - }, - "%.1fs" : { - - }, - "%@" : { - - }, - "%@ Models" : { - - }, - "%d%%" : { - - }, - "%lld" : { - - }, - "%lld colors" : { - - }, - "%lld processes" : { - "comment" : "A label at the bottom of the ranked processes popover showing the total number of processes being monitored.", - "isCommentAutoGenerated" : true - }, - "%lld%%" : { - - }, - "•" : { - "comment" : "A period used to separate two related items.", - "isCommentAutoGenerated" : true - }, - "• Bug fixes" : { - - }, - "• Improved performance" : { - - }, - "• New feature 1" : { - - }, - "• Thinking" : { - - }, - "• Updated %@" : { - - }, - "••••••••" : { - - }, - "+%lld more" : { - - }, - "3 items" : { - - }, - "5 colors" : { - - }, - "5 items" : { - - }, - "7 items" : { - - }, - "10 colors" : { - - }, - "10 items" : { - - }, - "15 colors" : { - - }, - "20 colors" : { - - }, - "About" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "About" - } - } - } - }, - "Accent color" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Accent color" - } - } - } - }, - "Access Denied" : { - - }, - "Actions" : { - - }, - "Activate" : { - - }, - "Activate your license" : { - - }, - "Activation" : { - - }, - "Active" : { - - }, - "Active - No Recording" : { - "comment" : "A description of the recording detection feature, indicating that recording is not currently active.", - "isCommentAutoGenerated" : true - }, - "Add" : { - - }, - "Add files" : { - - }, - "Add manually" : { - - }, - "Add new visualizer" : { - - }, - "Additional features" : { - - }, - "AI Assistant" : { - - }, - "AI is thinking..." : { - - }, - "AI Model Selection" : { - - }, - "AI Provider" : { - - }, - "AI-powered assistant that can analyze files, images, and provide conversational help. Use Cmd+Shift+A to quickly access the assistant." : { - - }, - "AirDrop" : { - - }, - "AirDrop service not available" : { - - }, - "All-day" : { - - }, - "Allow Access" : { - - }, - "Always hide in fullscreen" : { - - }, - "Always show tabs" : { - - }, - "API Configuration" : { - - }, - "API Key Required" : { - - }, - "App icon" : { - - }, - "Appearance" : { - - }, - "Are you sure you want to delete this color from your history?" : { - - }, - "Ask me anything..." : { - - }, - "Attached Files" : { - - }, - "Automatically check for updates" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Automatically check for updates" - } - } - } - }, - "Automatically download updates" : { - - }, - "Battery" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Battery" - } - } - } - }, - "Battery Information" : { - - }, - "Battery Settings" : { - - }, - "Battery Status" : { - - }, - "Boost your productivity with Clipboard Manager" : { - - }, - "Both" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Both" - } - } - } - }, - "Brightness HUD" : { - - }, - "Built-in System Monitoring" : { - - }, - "Built-in system monitoring detects volume, brightness, and keyboard backlight changes directly without requiring external apps." : { - - }, - "Buy us a coffee" : { - - }, - "Calendar" : { - - }, - "Calendar access is denied. Please enable it in System Settings." : { - - }, - "Cancel" : { - - }, - "Change" : { - - }, - "Charging" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Charging" - } - } - } - }, - "Charging on Hold: Desktop Mode" : { - - }, - "Check for Updates…" : { - - }, - "Choose a custom sound file that will play when the timer completes. Supported formats: MP3, M4A, WAV, AIFF." : { - - }, - "Choose a Music Source" : { - - }, - "Choose AI model" : { - - }, - "Choose File" : { - - }, - "Choose your preferred AI model and configuration" : { - - }, - "Choose Your Profile" : { - "comment" : "A title displayed above the list of profile selection options.", - "isCommentAutoGenerated" : true - }, - "Circle" : { - - }, - "Clear" : { - - }, - "Clear All Files" : { - - }, - "Clear all files removes all attached files and audio recordings. This action is permanent." : { - - }, - "Clear Clipboard History" : { - - }, - "Clear clipboard history removes recent copies. Clear pinned items removes your favorites. Both actions are permanent." : { - - }, - "Clear Color History" : { - - }, - "Clear color history removes all picked colors. Start color picking begins screen color capture mode." : { - - }, - "Clear Data" : { - - }, - "Clear Pinned Items" : { - - }, - "Click 'Pick Color' or use Cmd+Shift+P to start picking colors" : { - - }, - "Click for details" : { - "comment" : "A hint text displayed below the graph in the Stats Card, indicating that tapping it will reveal more details.", - "isCommentAutoGenerated" : true - }, - "Clipboard" : { - - }, - "Clipboard feature is disabled" : { - - }, - "Clipboard History" : { - - }, - "Clipboard History:" : { - - }, - "Clipboard Manager" : { - - }, - "Close" : { - - }, - "Close assistant" : { - - }, - "Color Details" : { - - }, - "Color Formats" : { - - }, - "Color History" : { - - }, - "Color Picked!" : { - - }, - "Color Picker" : { - - }, - "Color Picker feature is disabled" : { - - }, - "Color Picker Panel:" : { - - }, - "ColorPicker Disabled" : { - - }, - "Coming soon" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Coming soon" - } - } - } - }, - "Configuration" : { - - }, - "Continue" : { - - }, - "Controls" : { - - }, - "Copy something to get started" : { - - }, - "Copy something to start" : { - - }, - "CPU Usage" : { - - }, - "Current custom timer:" : { - - }, - "Current History" : { - - }, - "Current Items" : { - - }, - "Custom" : { - - }, - "Custom color" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Custom color" - } - } - } - }, - "Custom height" : { - - }, - "Custom music live activity animation" : { - - }, - "Custom notch size - %.0f" : { - - }, - "Custom Timer" : { - - }, - "Custom Timer Duration" : { - - }, - "Custom vizualizers (Lottie)" : { - - }, - "Custom: %@" : { - - }, - "Customize in Settings" : { - - }, - "Default" : { - - }, - "Default: dynamic.m4a" : { - - }, - "Delete" : { - - }, - "Delete Color" : { - - }, - "Description" : { - - }, - "Detection Status" : { - "comment" : "The header for a section that displays whether the screen recording detection feature is currently active or inactive.", - "isCommentAutoGenerated" : true - }, - "Disable" : { - - }, - "Disabled" : { - - }, - "Disk Read" : { - - }, - "Disk Write" : { - - }, - "Display Mode" : { - - }, - "Download" : { - - }, - "Download icon style" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Download icon style" - } - } - } - }, - "Download indicator style" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Download indicator style" - } - } - } - }, - "Download indicators" : { - - }, - "Downloads" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Downloads" - } - } - } - }, - "Drop files here" : { - - }, - "Atoll" : { - - }, - "dynamic.island" : { - - }, - "Each graph can be individually enabled or disabled. Network activity shows download/upload speeds, and disk I/O shows read/write speeds." : { - - }, - "Easily copy, store, and manage your most-used content. Upgrade now for advanced features like multi-item storage and quick access!" : { - - }, - "Edit layout" : { - - }, - "Email address" : { - - }, - "Enable Built-in System HUD" : { - - }, - "Enable built-in system monitoring to replace macOS HUD notifications with Atoll displays." : { - - }, - "Enable colored spectrograms" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Enable colored spectrograms" - } - } - } - }, - "Enable ColorPicker in Settings → ColorPicker" : { - - }, - "Enable global keyboard shortcuts above to customize your shortcuts." : { - - }, - "Enable graph visibility in Settings → Stats to view performance data." : { - "comment" : "A message displayed when no graphs are enabled in the Stats tab.", - "isCommentAutoGenerated" : true - }, - "Enable haptics" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Enable haptics" - } - } - } - }, - "Enable HUD replacement" : { - - }, - "Enable music live activity" : { - - }, - "Enable or disable the timer functionality in the Atoll. The live activity toggle controls whether timer progress is shown in the expanded view." : { - - }, - "Enable screen color picking functionality. Use Cmd+Shift+P to quickly access the color picker." : { - - }, - "Enable sneak peek" : { - - }, - "Enable stats monitoring in Settings to view system performance data." : { - - }, - "Enable system stats monitoring in Settings to view detailed performance data." : { - - }, - "Enable Thinking Mode" : { - - }, - "Enable timer feature in Settings to use this tab" : { - - }, - "Enable timer live activity" : { - - }, - "Enhance your experience with HUDs" : { - - }, - "Enjoy your free time!" : { - - }, - "Enter your Gemini API Key" : { - - }, - "Error" : { - - }, - "Exclude apps" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Exclude apps" - } - } - } - }, - "Exit" : { - - }, - "Extensions" : { - - }, - "Finish" : { - - }, - "Gemini API Key" : { - - }, - "General" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "General" - } - } - } - }, - "Gesture control" : { - - }, - "Gesture sensitivity" : { - - }, - "Get started" : { - - }, - "Get your free API key from Google AI Studio" : { - - }, - "GitHub" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "GitHub" - } - } - } - }, - "Got it!" : { - - }, - "GPU Usage" : { - - }, - "Gradient" : { - - }, - "Graph Visibility" : { - - }, - "Hide" : { - - }, - "Hide DynamicIsland Options" : { - - }, - "Hide only when NowPlaying app is in fullscreen" : { - - }, - "Hierarchical" : { - - }, - "High" : { - - }, - "History Size" : { - - }, - "https://github.com/th-ch/youtube-music" : { - - }, - "HUD style" : { - - }, - "HUDs" : { - - }, - "In progress" : { - - }, - "Inline" : { - - }, - "Install updates automatically" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Install updates automatically" - } - } - } - }, - "Installed extensions" : { - - }, - "Keyboard Backlight HUD" : { - - }, - "Keyboard shortcuts are disabled" : { - - }, - "Last Updated" : { - - }, - "Later" : { - - }, - "License key" : { - - }, - "LinkedIn" : { - - }, - "Live Monitoring" : { - - }, - "Live Performance Data" : { - - }, - "Lottie JSON URL" : { - - }, - "Low" : { - - }, - "Low Power Mode" : { - - }, - "Made ❤️ by Ebullioscopic" : { - - }, - "Made with 🫶🏻 by not so boring not.people" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Made with 🫶🏻 by not so boring not.people" - } - } - } - }, - "Match menubar height" : { - - }, - "Match real notch size" : { - - }, - "Max Capacity: %lld%%" : { - - }, - "Media" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Media" - } - } - } - }, - "Media change with horizontal gestures" : { - "comment" : "A toggle that lets the user enable or disable the feature of changing the currently playing media using horizontal gestures.", - "isCommentAutoGenerated" : true - }, - "Media controls" : { - - }, - "Media inactivity timeout" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Media inactivity timeout" - } - } - } - }, - "Media playback live activity" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Media playback live activity" - } - } - } - }, - "Media Source" : { - - }, - "Medium" : { - - }, - "Memory Usage" : { - - }, - "Menubar icon" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Menubar icon" - } - } - } - }, - "Mic %@" : { - - }, - "min" : { - - }, - "Minimalistic mode focuses on media controls and system HUDs, hiding all extra features for a clean, focused experience. Automatically enables simpler animations." : { - - }, - "Minimum hover duration" : { - - }, - "Minutes" : { - - }, - "Mirror" : { - - }, - "Mirror shape" : { - - }, - "Monitor clipboard changes and keep a history of recent copies. Use Cmd+Shift+V to quickly access clipboard history." : { - - }, - "Monitoring Status" : { - - }, - "Monitoring Stopped" : { - - }, - "More" : { - - }, - "Music Source" : { - - }, - "muted" : { - - }, - "Name" : { - - }, - "Navigation" : { - - }, - "Need Restart" : { - - }, - "Network Download" : { - - }, - "Network Upload" : { - - }, - "Never hide" : { - - }, - "No clipboard history" : { - - }, - "No Colors Found" : { - - }, - "No colors match '%@'" : { - - }, - "No Colors Yet" : { - - }, - "No custom animation available" : { - - }, - "No custom visualizer" : { - - }, - "No events today" : { - - }, - "No excluded apps" : { - - }, - "No excludes" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "No excludes" - } - } - } - }, - "No extension installed" : { - - }, - "No favorites" : { - - }, - "No Graphs Enabled" : { - "comment" : "A label displayed when no graphs are enabled in the Stats tab.", - "isCommentAutoGenerated" : true - }, - "No results" : { - - }, - "No results found" : { - - }, - "Non-notch display height" : { - - }, - "Not Now" : { - - }, - "Not Set" : { - - }, - "Notch behavior" : { - - }, - "Notch display height" : { - - }, - "Notch Height" : { - - }, - "OK" : { - - }, - "One or more files failed to load" : { - - }, - "Only app icon" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Only app icon" - } - } - } - }, - "Only download icon" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Only download icon" - } - } - } - }, - "Open Google AI Studio" : { - - }, - "Open Model Settings" : { - - }, - "Open Settings" : { - - }, - "Open System Settings" : { - - }, - "Opens the AI assistant panel for file analysis and conversation. Default is Cmd+Shift+A. Only works when screen assistant feature is enabled." : { - - }, - "Opens the clipboard history panel. Default is Cmd+Shift+V (similar to Windows+V on PC). Only works when clipboard feature is enabled." : { - - }, - "Opens the color picker panel for screen color capture. Default is Cmd+Shift+P. Only works when color picker feature is enabled." : { - - }, - "Opens the detailed system performance monitor panel. Default is Cmd+Shift+S. Only works when stats feature is enabled." : { - - }, - "Panel mode shows clipboard in a floating window near the notch. Popover mode shows clipboard as a dropdown attached to the clipboard button." : { - - }, - "Panel mode shows color picker in a floating window. Popover mode shows color picker as a dropdown attached to the color picker button." : { - - }, - "Panel mode shows the assistant in a floating window near the notch. Popover mode shows the assistant as a dropdown attached to the AI button." : { - - }, - "Pause" : { - - }, - "Paused" : { - - }, - "Percentage" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Percentage" - } - } - } - }, - "Pick Color" : { - - }, - "Picked %@" : { - - }, - "Picked Color" : { - - }, - "Picking Status" : { - - }, - "PID: %d" : { - "comment" : "A small label displaying the process ID of a particular app. The argument is the process ID of the app.", - "isCommentAutoGenerated" : true - }, - "Pin items from history to save them here" : { - - }, - "Pin items to add favorites" : { - - }, - "Pin items to add them to favorites" : { - - }, - "Pinned Items" : { - - }, - "Please configure your API key for the selected AI provider in model settings." : { - - }, - "Plugged In" : { - - }, - "Popover mode shows clipboard as a dropdown attached to the clipboard button. Panel mode shows clipboard in a floating window near the notch." : { - - }, - "Popover mode shows color picker as a dropdown attached to the color picker button. Panel mode shows color picker in a floating window." : { - - }, - "Popover mode shows the assistant as a dropdown attached to the AI button. Panel mode shows the assistant in a floating window near the notch." : { - - }, - "Privacy & Security" : { - "comment" : "The title of the privacy and security settings screen.", - "isCommentAutoGenerated" : true - }, - "Privacy Policy" : { - "comment" : "A link to the privacy policy.", - "isCommentAutoGenerated" : true - }, - "Progress bar" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Progress bar" - } - } - } - }, - "Progressbar style" : { - - }, - "Quick Actions" : { - - }, - "Quit" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Quit" - } - } - } - }, - "Quit app" : { - - }, - "Quit boring.notch" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Quit boring.notch" - } - } - } - }, - "Ready" : { - - }, - "Reasoning Mode" : { - - }, - "Recent Colors" : { - - }, - "Recording" : { - - }, - "Recording Detected" : { - "comment" : "A text description of a red dot displayed in the Atoll header when screen recording is active.", - "isCommentAutoGenerated" : true - }, - "Recording Status" : { - - }, - "Refresh" : { - "comment" : "A button to refresh the displayed data.", - "isCommentAutoGenerated" : true - }, - "Release name" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Release name" - } - } - } - }, - "Remember last tab" : { - - }, - "Replaces system HUD notifications with Atoll displays." : { - - }, - "Reset to Default" : { - - }, - "Restart" : { - - }, - "Restart Atoll" : { - - }, - "Resume" : { - - }, - "Running" : { - - }, - "Save" : { - - }, - "Save Configuration" : { - - }, - "Screen Assistant" : { - - }, - "Screen Assistant feature is disabled" : { - - }, - "Screen Assistant:" : { - - }, - "Screen recording detection shows a red indicator when your screen is being captured. Detection uses minimal system resources and can be disabled at any time." : { - "comment" : "A footer description for the \"Privacy & Security\" section of the settings.", - "isCommentAutoGenerated" : true - }, - "Screenshot options" : { - - }, - "Screenshot Type" : { - - }, - "Search clipboard..." : { - - }, - "Search colors..." : { - - }, - "Search..." : { - - }, - "seconds" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "seconds" - } - } - } - }, - "Seconds" : { - - }, - "Segmented" : { - - }, - "Select a color to view details" : { - - }, - "Select Calendars" : { - - }, - "Select one or more profiles to customize your experience" : { - "comment" : "A description below the header that instructs users to select one or more profiles to customize their experience.", - "isCommentAutoGenerated" : true - }, - "Select the music source you want to use. You can change this later in the app settings." : { - - }, - "selected" : { - - }, - "Selected animation" : { - - }, - "Sensitivity" : { - - }, - "Set" : { - - }, - "Set a custom duration for the timer. This will be used when you press the 'Custom' button in the timer interface." : { - - }, - "Settings" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Settings" - } - } - } - }, - "Shelf" : { - - }, - "Shortcuts" : { - - }, - "Show battery indicator" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Show battery indicator" - } - } - } - }, - "Show charging indicator" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Show charging indicator" - } - } - } - }, - "Show Color History" : { - - }, - "Show Color Picker Panel" : { - - }, - "Show cool face animation while inactivity" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Show cool face animation while inactivity" - } - } - } - }, - "Show download progress" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Show download progress" - } - } - } - }, - "Show on a specific display" : { - - }, - "Show on all displays" : { - - }, - "Show shuffle and repeat buttons" : { - - }, - "Shows the model's reasoning process before the final answer" : { - - }, - "Slider color" : { - - }, - "Sneak Peek shows the media title and artist under the notch for a few seconds." : { - - }, - "Sneak Peek Style" : { - - }, - "Sneak peek style is locked to Standard in minimalistic mode" : { - "comment" : "A message displayed when the sneak peek style is locked to standard in minimalistic UI mode.", - "isCommentAutoGenerated" : true - }, - "Software updates" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Software updates" - } - } - } - }, - "Speed" : { - - }, - "Square" : { - - }, - "Start" : { - - }, - "Start a conversation to see your chat history here" : { - - }, - "Start Color Picking" : { - - }, - "Start Demo Timer:" : { - - }, - "Start Monitoring" : { - - }, - "Start picking colors to build your history" : { - - }, - "Start recording" : { - - }, - "Starts a 5-minute demo timer to test the timer live activity feature. Only works when timer feature is enabled." : { - - }, - "Stats" : { - - }, - "Stats Disabled" : { - - }, - "Stats Feature Disabled" : { - - }, - "Stats feature is disabled" : { - - }, - "Stats monitoring displays performance graphs in the Atoll. The detailed panel (Cmd+Shift+S) shows Activity Monitor-style detailed graphs and metrics." : { - - }, - "Stats panel is disabled" : { - - }, - "Stats Panel:" : { - - }, - "Status & Actions" : { - - }, - "Stop" : { - - }, - "Stop Monitoring" : { - - }, - "Stop recording" : { - - }, - "Stopped" : { - - }, - "Support Us" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Support Us" - } - } - } - }, - "Supports reasoning mode" : { - - }, - "System features" : { - - }, - "System Performance Monitor" : { - - }, - "Take area screenshot" : { - - }, - "TheDynamicIsland" : { - - }, - "Time Range" : { - - }, - "Time to Full Charge: %lld min" : { - - }, - "Timer" : { - - }, - "Timer Disabled" : { - - }, - "Timer Feature" : { - - }, - "Timer feature is disabled" : { - - }, - "Timer Sound" : { - - }, - "Toggle Notch Open:" : { - - }, - "Toggle Sneak Peek:" : { - - }, - "Toggle the Atoll open or closed from anywhere." : { - - }, - "Top Processes by %@" : { - "comment" : "A heading that announces the top processes by a specific metric. The text inside the parentheses is replaced with the actual metric name.", - "isCommentAutoGenerated" : true - }, - "Transform your notch truly yours" : { - - }, - "Try adjusting your search terms" : { - - }, - "Try different search terms" : { - - }, - "Two-finger swipe up on notch to close, two-finger swipe down on notch to open when **Open notch on hover** option is disabled" : { - "comment" : "A footer text explaining the gesture control functionality.", - "isCommentAutoGenerated" : true - }, - "UI Mode" : { - - }, - "Uninstall" : { - - }, - "Unlock advanced features and improve your experience. Upgrade now for more customizations!" : { - - }, - "unmuted" : { - - }, - "Update Timer" : { - - }, - "Upgrade to Pro" : { - - }, - "Use music visualizer spectrogram" : { - - }, - "Version" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Version" - } - } - } - }, - "Version info" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Version info" - } - } - } - }, - "View on GitHub: th-ch/youtube-music" : { - - }, - "Volume HUD" : { - - }, - "Welcome" : { - - }, - "What's New" : { - - }, - "When disabled, all keyboard shortcuts will be inactive. You can still use the UI controls." : { - - }, - "When enabled, the Stats tab will display real-time system performance graphs. This feature requires system permissions and may use additional battery." : { - - }, - "With %lld graphs enabled, the Atoll will expand horizontally to accommodate all graphs in a single row." : { - - }, - "You" : { - - }, - "You can now enjoy the app. If you want to tweak things further, you can always visit the settings." : { - - }, - "You're All Set!" : { - - }, - "YouTube Music requires this third-party app to be installed: " : { - - } - }, - "version" : "1.1" -} \ No newline at end of file From e8ce2e6a86fd679e4210f2980001c2f2fe0ff017 Mon Sep 17 00:00:00 2001 From: Felipe Giacomini Cocco Date: Thu, 5 Feb 2026 23:34:59 -0300 Subject: [PATCH 24/26] Fix strings detections and translates some missing translations (maybe the last commit?) --- DynamicIsland/Localizable.xcstrings | 183 ++++++++++++++++++ .../components/Settings/SettingsView.swift | 2 +- DynamicIsland/models/Constants.swift | 13 +- 3 files changed, 194 insertions(+), 4 deletions(-) diff --git a/DynamicIsland/Localizable.xcstrings b/DynamicIsland/Localizable.xcstrings index ae19b40..0806b97 100644 --- a/DynamicIsland/Localizable.xcstrings +++ b/DynamicIsland/Localizable.xcstrings @@ -3708,6 +3708,26 @@ }, "shouldTranslate" : false }, + "Atoll can show all your upcoming events in one place. Access to your calendar is needed to display your schedule." : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "O Atoll pode mostrar todos os seus próximos eventos em um só lugar. O acesso ao seu calendário é necessário para exibir sua agenda." + } + } + } + }, + "Atoll includes a mirror feature that lets you quickly check your appearance using your camera, right from the notch. Camera access is required only to show this live preview. You can turn the mirror feature on or off at any time in the app." : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "O Atoll inclui um recurso de espelho que permite verificar rapidamente sua aparência usando sua câmera, direto do notch. O acesso à câmera é necessário apenas para mostrar esta visualização ao vivo. Você pode ligar ou desligar o recurso de espelho a qualquer momento no aplicativo." + } + } + } + }, "Attached Files" : { "localizations" : { "fr" : { @@ -6526,6 +6546,16 @@ } } }, + "Code and debug with color picker, stats monitoring, and screen assistant." : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Codifique e depure com seletor de cores, monitoramento de estatísticas e assistente de tela." + } + } + } + }, "Collect the latest crash report to share with the developer when reporting lock screen or overlay issues." : { "comment" : "A footer for the \"Diagnostics\" section of the lock screen settings.", "isCommentAutoGenerated" : true, @@ -6964,6 +6994,26 @@ } } }, + "Connects directly to the Apple Music app." : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Conecta-se diretamente ao aplicativo Apple Music." + } + } + } + }, + "Connects directly to the Spotify app." : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Conecta-se diretamente ao aplicativo Spotify." + } + } + } + }, "Continue" : { "localizations" : { "ar" : { @@ -7313,6 +7363,16 @@ } } }, + "Create and design with color picker, mirror, and visual effects." : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Crie e projete com seletor de cores, espelho e efeitos visuais." + } + } + } + }, "Create from Clipboard" : { "localizations" : { "pt-BR" : { @@ -8312,6 +8372,9 @@ } } }, + "Designer" : { + "shouldTranslate" : false + }, "Detection Status" : { "comment" : "The header for a section that displays whether the screen recording detection feature is currently active or inactive.", "isCommentAutoGenerated" : true, @@ -8330,6 +8393,16 @@ } } }, + "Developer" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Desenvolvedor" + } + } + } + }, "device name" : { "localizations" : { "pt-BR" : { @@ -9412,6 +9485,26 @@ } } }, + "Enable Calendar Access" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Habilitar O Acesso Ao Calendário" + } + } + } + }, + "Enable Camera Access" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Habilitar Acesso à Câmera" + } + } + } + }, "Enable Camera Detection" : { "localizations" : { "pt-BR" : { @@ -13495,6 +13588,16 @@ } } }, + "Light Use" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Uso Leve" + } + } + } + }, "Line Width: %lldpx" : { "localizations" : { "pt-BR" : { @@ -19942,6 +20045,16 @@ } } }, + "Requires a third-party client with API plugin enabled." : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Requer um cliente de terceiros com o plugin de API ativado." + } + } + } + }, "Requires Accessibility permission so Dynamic Island can intercept the hardware volume keys." : { "localizations" : { "pt-BR" : { @@ -21016,6 +21129,16 @@ } } }, + "Separate Tab" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aba Separada" + } + } + } + }, "Separate Tab mode integrates Copied Items and Notes into a single view. If both are enabled, Notes appear on the right and Clipboard on the left." : { "comment" : "A description of the \"Separate Tab\" clipboard display mode.", "isCommentAutoGenerated" : true, @@ -22230,6 +22353,16 @@ } } }, + "Simple and minimal interface with just the essentials for everyday tasks." : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Interface simples e minimalista com apenas o essencial para tarefas diárias." + } + } + } + }, "Size: %lldpx" : { "localizations" : { "pt-BR" : { @@ -23294,6 +23427,16 @@ "isCommentAutoGenerated" : true, "shouldTranslate" : false }, + "Stay organized with calendar, timer, and battery monitoring." : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mantenha-se organizado com o monitoramento de calendário, temporizador e bateria." + } + } + } + }, "Stop" : { "localizations" : { "fr" : { @@ -23452,6 +23595,16 @@ } } }, + "Student" : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Estudante" + } + } + } + }, "style" : { "localizations" : { "pt-BR" : { @@ -26060,6 +26213,16 @@ } } }, + "Works with most media apps, including browsers, to detect what's playing. Note: This may be removed in a future macOS version." : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Funciona com a maioria dos aplicativos de mídia, incluindo navegadores, para detectar o que está sendo reproduzido. Aviso: Isso pode ser removido em uma versão futura do macOS." + } + } + } + }, "Write" : { "comment" : "A label for the write section of the disk overview.", "isCommentAutoGenerated" : true, @@ -26307,6 +26470,26 @@ } } }, + "Your calendar data is only used to show your events and is never shared." : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Os dados do seu calendário são usados apenas para mostrar seus eventos e nunca são compartilhados." + } + } + } + }, + "Your camera is never used without your consent, and nothing is recorded or stored." : { + "localizations" : { + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sua câmera nunca é usada sem o seu consentimento, e nada é gravado ou armazenado." + } + } + } + }, "Your support funds software development learning for students in 9th–12th grade." : { "comment" : "A footer note explaining the app's funding.", "isCommentAutoGenerated" : true, diff --git a/DynamicIsland/components/Settings/SettingsView.swift b/DynamicIsland/components/Settings/SettingsView.swift index 29660ab..8da0a75 100644 --- a/DynamicIsland/components/Settings/SettingsView.swift +++ b/DynamicIsland/components/Settings/SettingsView.swift @@ -2753,7 +2753,7 @@ struct Media: View { .settingsHighlight(id: highlightID("Enable album art parallax effect")) Picker("Sneak Peek Style", selection: $sneakPeekStyles){ ForEach(SneakPeekStyle.allCases) { style in - Text(style.rawValue).tag(style) + Text(style.LocalizedName).tag(style) } } .disabled(!enableSneakPeek || enableMinimalisticUI) diff --git a/DynamicIsland/models/Constants.swift b/DynamicIsland/models/Constants.swift index 8d94c30..a92a790 100644 --- a/DynamicIsland/models/Constants.swift +++ b/DynamicIsland/models/Constants.swift @@ -263,9 +263,9 @@ enum ClipboardDisplayMode: String, CaseIterable, Codable, Defaults.Serializable var displayName: String { switch self { - case .popover: return "Popover" - case .panel: return "Panel" - case .separateTab: return "Separate Tab" + case .popover: return String(localized: "Popover") + case .panel: return String(localized: "Panel") + case .separateTab: return String(localized: "Separate Tab") } } @@ -352,6 +352,13 @@ enum SneakPeekStyle: String, CaseIterable, Identifiable, Defaults.Serializable { case inline = "Inline" var id: String { self.rawValue } + + var LocalizedName : String { + switch self { + case .standard: return String(localized: "Default") + case .inline: return String(localized: "Inline") + } + } } enum CapsLockIndicatorTintMode: String, CaseIterable, Identifiable, Defaults.Serializable { From 43a585a46c494252b8b54e2d954fd6b6f5188043 Mon Sep 17 00:00:00 2001 From: Hariharan Mudaliar Date: Sun, 8 Feb 2026 14:06:02 +0530 Subject: [PATCH 25/26] Update localizable --- DynamicIsland/Localizable.xcstrings | 1444 +++++++++++++++++++++++++-- 1 file changed, 1380 insertions(+), 64 deletions(-) diff --git a/DynamicIsland/Localizable.xcstrings b/DynamicIsland/Localizable.xcstrings index 43742e8..7bd69af 100644 --- a/DynamicIsland/Localizable.xcstrings +++ b/DynamicIsland/Localizable.xcstrings @@ -1013,11 +1013,47 @@ } } }, + "%lld day%@ ago" : { + "comment" : "Text that appears in the \"Time\" column of the \"Account History\" view, indicating how long ago a particular event occurred. The number in the parentheses is replaced with the actual number of days.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "%1$lld day%2$@ ago" + } + } + } + }, + "%lld hour%@ ago" : { + "comment" : "Text for a time string, showing how many hours have passed since a given date.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "%1$lld hour%2$@ ago" + } + } + } + }, "%lld min" : { "comment" : "A text label displaying the current value of the \"Notify before\" slider. The argument is the current value of the slider, expressed in minutes.", "isCommentAutoGenerated" : true, "shouldTranslate" : false }, + "%lld minute%@ ago" : { + "comment" : "A string describing how long ago a particular event occurred, based on the number of minutes that have passed.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "%1$lld minute%2$@ ago" + } + } + } + }, "%lld px" : { "comment" : "A label displaying the current expanded notch width value. The value is shown in pixels.", "isCommentAutoGenerated" : true, @@ -1129,6 +1165,26 @@ }, "shouldTranslate" : false }, + "%lldd ago" : { + "comment" : "A string describing how many days have passed since a given date. The argument is the number of days.", + "isCommentAutoGenerated" : true + }, + "%lldh" : { + "comment" : "Text that describes a time interval, such as \"1 hour ago\".", + "isCommentAutoGenerated" : true + }, + "%lldh ago" : { + "comment" : "A string describing how long ago a given date was, in terms of hours.", + "isCommentAutoGenerated" : true + }, + "%lldm" : { + "comment" : "A string that describes how long ago a given date was, in a human-readable form.", + "isCommentAutoGenerated" : true + }, + "%lldm ago" : { + "comment" : "A string describing how long ago a given date was, in terms of minutes. The argument is the number of minutes.", + "isCommentAutoGenerated" : true + }, "%lldx" : { "localizations" : { "fr" : { @@ -1535,6 +1591,13 @@ } } }, + "±10" : { + + }, + "±10 Seconds" : { + "comment" : "Name of the music skip behavior that skips the current track within ±10 seconds.", + "isCommentAutoGenerated" : true + }, "0" : { "comment" : "A label displayed in a circular gauge to indicate the minimum battery level.", "isCommentAutoGenerated" : true, @@ -1549,12 +1612,6 @@ "comment" : "A time displayed in the timer panel on a lock screen.", "isCommentAutoGenerated" : true, "shouldTranslate" : false - }, - "1 hour" : { - - }, - "1 min" : { - }, "1x" : { "extractionState" : "stale", @@ -1566,9 +1623,6 @@ } } } - }, - "2 hours" : { - }, "3 items" : { "localizations" : { @@ -1617,9 +1671,6 @@ } } } - }, - "5 mins" : { - }, "7 items" : { "localizations" : { @@ -1668,9 +1719,6 @@ } } } - }, - "10 mins" : { - }, "15 colors" : { "localizations" : { @@ -1687,9 +1735,6 @@ } } } - }, - "15 mins" : { - }, "20" : { "extractionState" : "stale", @@ -1728,12 +1773,6 @@ } } } - }, - "30 mins" : { - - }, - "45 mins" : { - }, "100" : { "comment" : "The text displayed below a 100% battery level in the lock screen.", @@ -1851,8 +1890,14 @@ } } }, + "accent" : { + + }, + "Accent" : { + "comment" : "Name of the tint mode for the caps lock indicator that uses the accent color.", + "isCommentAutoGenerated" : true + }, "Accent color" : { - "extractionState" : "stale", "localizations" : { "ar" : { "stringUnit" : { @@ -2073,6 +2118,13 @@ } } } + }, + "Accessibility permission lets Dynamic Island replace the native volume, brightness, and keyboard HUDs." : { + "comment" : "Message in a callout that explains the purpose of requesting accessibility permission.", + "isCommentAutoGenerated" : true + }, + "Accessibility permission required" : { + }, "Actions" : { "localizations" : { @@ -2197,6 +2249,10 @@ } } }, + "Adaptive gradient" : { + "comment" : "Name of the timer icon color mode option that uses an adaptive gradient.", + "isCommentAutoGenerated" : true + }, "Add" : { "localizations" : { "ar" : { @@ -2720,6 +2776,13 @@ } } } + }, + "Adjusts the lock screen timer widget width without affecting button sizing." : { + "comment" : "Help text for adjusting the width of the lock screen timer widget.", + "isCommentAutoGenerated" : true + }, + "ai" : { + }, "AI Assistant" : { "localizations" : { @@ -2806,6 +2869,9 @@ } } } + }, + "air quality" : { + }, "Air quality index %d, %@" : { "comment" : "Air quality accessibility label", @@ -2843,6 +2909,9 @@ } } } + }, + "airdrop" : { + }, "AirDrop" : { "localizations" : { @@ -3045,7 +3114,13 @@ } } }, - "Alignment" : { + "airplay" : { + + }, + "album art" : { + + }, + "alert" : { }, "All" : { @@ -3057,6 +3132,9 @@ } } } + }, + "all-day" : { + }, "All-day" : { "localizations" : { @@ -3270,6 +3348,26 @@ } } }, + "Allow extension live activities" : { + "comment" : "Toggle to allow extension live activities.", + "isCommentAutoGenerated" : true + }, + "Allow extension lock screen widgets" : { + "comment" : "Text displayed in a toggle that allows users to enable or disable the display of lock screen widgets in Atoll.", + "isCommentAutoGenerated" : true + }, + "Allow extension notch experiences" : { + "comment" : "Text displayed in a toggle that allows users to enable or disable the display of notch-specific features in an extension.", + "isCommentAutoGenerated" : true + }, + "Allow interactive web content" : { + "comment" : "Toggle label for allowing interactive web content in notch experiences.", + "isCommentAutoGenerated" : true + }, + "Allow minimalistic overrides" : { + "comment" : "Label for a toggle that allows minimalistic overrides in notch experiences.", + "isCommentAutoGenerated" : true + }, "Allowed Features" : { "comment" : "A label describing the allowed features for an app extension.", "isCommentAutoGenerated" : true, @@ -3553,6 +3651,9 @@ } } } + }, + "app icon" : { + }, "App icon" : { "localizations" : { @@ -3665,6 +3766,9 @@ } } } + }, + "appearance" : { + }, "Appearance" : { "localizations" : { @@ -3766,6 +3870,10 @@ } } }, + "Apple Music" : { + "comment" : "Names for the different media player types available in the app.", + "isCommentAutoGenerated" : true + }, "Applies the notch-style parallax effect to the lock screen media widget album art." : { "localizations" : { "pt-BR" : { @@ -3775,6 +3883,9 @@ } } } + }, + "apps" : { + }, "Apps using AtollExtensionKit will appear here once they request permission" : { "comment" : "A description below the placeholder text in the \"Search extensions...\" text field, explaining that apps using AtollExtensionKit will be listed here once they grant permission to use the app.", @@ -3788,6 +3899,13 @@ } } }, + "aqi" : { + + }, + "AQI" : { + "comment" : "Label for the US AQI scale in the lock screen weather view.", + "isCommentAutoGenerated" : true + }, "Are you sure you want to delete \"%@\"?" : { "comment" : "A confirmation prompt asking the user to confirm the deletion of a custom idle animation. The placeholder text inside the quotation marks should be replaced with the name of the animation.", "localizations" : { @@ -3849,7 +3967,6 @@ "shouldTranslate" : false }, "Atoll can show all your upcoming events in one place. Access to your calendar is needed to display your schedule." : { - "extractionState" : "stale", "localizations" : { "pt-BR" : { "stringUnit" : { @@ -3860,7 +3977,6 @@ } }, "Atoll includes a mirror feature that lets you quickly check your appearance using your camera, right from the notch. Camera access is required only to show this live preview. You can turn the mirror feature on or off at any time in the app." : { - "extractionState" : "stale", "localizations" : { "pt-BR" : { "stringUnit" : { @@ -3896,6 +4012,9 @@ } } } + }, + "audio" : { + }, "Audio feedback" : { "comment" : "A section header that lists audio feedback settings.", @@ -3908,6 +4027,9 @@ } } } + }, + "authorization" : { + }, "Authorize" : { "comment" : "A button that authorizes an app extension.", @@ -3932,6 +4054,15 @@ } } } + }, + "auto open" : { + + }, + "auto stop" : { + + }, + "auto switch" : { + }, "Auto-scroll to next event" : { "comment" : "A toggle that enables or disables the automatic scrolling to the next event in the calendar view.", @@ -4144,6 +4275,12 @@ } } } + }, + "Automatically switch displays" : { + + }, + "autostart" : { + }, "Averages" : { "comment" : "A label displayed above the average usage and last update information for a GPU.", @@ -4162,6 +4299,9 @@ } } } + }, + "backlight" : { + }, "Backlight" : { "comment" : "A control for adjusting the keyboard backlight intensity.", @@ -4174,6 +4314,16 @@ } } } + }, + "bar" : { + + }, + "Bar" : { + "comment" : "Localized name for \"Bar\" timer progress style.", + "isCommentAutoGenerated" : true + }, + "battery" : { + }, "Battery" : { "localizations" : { @@ -4318,6 +4468,12 @@ } } } + }, + "battery gauge" : { + + }, + "battery hud" : { + }, "Battery Indicator Styling" : { "comment" : "A section header in the Settings app that lists options for customizing the appearance of the battery indicator.", @@ -4430,6 +4586,9 @@ } } } + }, + "battery percent" : { + }, "Battery Settings" : { "localizations" : { @@ -4640,6 +4799,9 @@ } } } + }, + "battery text" : { + }, "Battery Widget" : { "localizations" : { @@ -4665,6 +4827,9 @@ "comment" : "A label indicating a beta version.", "isCommentAutoGenerated" : true, "shouldTranslate" : false + }, + "black" : { + }, "Blue dashed box shows actual size in Atoll" : { "extractionState" : "stale", @@ -4694,6 +4859,9 @@ } } } + }, + "bluetooth" : { + }, "Bluetooth Audio Devices" : { "comment" : "A section header that lists Bluetooth audio devices.", @@ -4729,6 +4897,9 @@ } } } + }, + "blur" : { + }, "Boost your productivity with Clipboard Manager" : { "localizations" : { @@ -4853,6 +5024,10 @@ } } }, + "Break" : { + "comment" : "Name of a default timer preset that lasts for 5 minutes.", + "isCommentAutoGenerated" : true + }, "Breakdown" : { "comment" : "A label displayed above the breakdown of memory usage.", "isCommentAutoGenerated" : true, @@ -4876,6 +5051,9 @@ } } } + }, + "brightness" : { + }, "Brightness" : { "comment" : "A control that adjusts the brightness of the device.", @@ -4978,6 +5156,9 @@ } } } + }, + "calendar" : { + }, "Calendar" : { "localizations" : { @@ -5197,9 +5378,6 @@ } } } - }, - "Calendar Widget" : { - }, "Calendars" : { "localizations" : { @@ -5413,6 +5591,9 @@ } } } + }, + "celsius" : { + }, "Center" : { "extractionState" : "stale", @@ -5452,6 +5633,12 @@ } } } + }, + "charge" : { + + }, + "charging" : { + }, "Charging" : { "comment" : "Charging fallback label when no estimate is available", @@ -5553,6 +5740,13 @@ } } } + }, + "Charging battery" : { + "comment" : "Text displayed in the status text field when the device is charging.", + "isCommentAutoGenerated" : true + }, + "charging icon" : { + }, "Charging on Hold: Desktop Mode" : { "localizations" : { @@ -5653,6 +5847,9 @@ } } } + }, + "charging percentage" : { + }, "Check for Updates…" : { "localizations" : { @@ -5753,6 +5950,9 @@ } } } + }, + "chime" : { + }, "Chip color" : { "comment" : "A label for the color of the chip in the lock screen reminder widget.", @@ -6028,6 +6228,9 @@ } } } + }, + "circle" : { + }, "Circle" : { "localizations" : { @@ -6129,6 +6332,20 @@ } } }, + "circular" : { + + }, + "Circular" : { + "comment" : "Label for the \"Circular\" tab in the HUD and OSD settings view.", + "isCommentAutoGenerated" : true + }, + "classic" : { + + }, + "Classic" : { + "comment" : "Name of the timer surface mode in the lock screen that looks like a traditional stopwatch.", + "isCommentAutoGenerated" : true + }, "Classic mode keeps the original translucent black background." : { "comment" : "A description of the \"Classic mode\" option in the Lock Screen Integration settings.", "isCommentAutoGenerated" : true, @@ -6385,6 +6602,9 @@ } } } + }, + "clipboard" : { + }, "Clipboard" : { "localizations" : { @@ -6465,6 +6685,12 @@ } } } + }, + "clock app" : { + + }, + "close" : { + }, "Close" : { "localizations" : { @@ -6565,6 +6791,9 @@ } } } + }, + "close animation" : { + }, "Close assistant" : { "localizations" : { @@ -6582,6 +6811,13 @@ } } }, + "Close gesture" : { + + }, + "Code and debug with color picker, stats monitoring, and screen assistant." : { + "comment" : "Description of a user profile when the name is \"Developer\".", + "isCommentAutoGenerated" : true + }, "Collect the latest crash report to share with the developer when reporting lock screen or overlay issues." : { "comment" : "A footer for the \"Diagnostics\" section of the lock screen settings.", "isCommentAutoGenerated" : true, @@ -6593,6 +6829,9 @@ } } } + }, + "color" : { + }, "Color Details" : { "localizations" : { @@ -6609,6 +6848,9 @@ } } } + }, + "color formats" : { + }, "Color Formats" : { "localizations" : { @@ -6625,6 +6867,9 @@ } } } + }, + "color history" : { + }, "Color History" : { "localizations" : { @@ -6641,6 +6886,9 @@ } } } + }, + "color icon" : { + }, "Color options control the icon and progress bar appearance. Auto adapts to system theme." : { "comment" : "A description under the \"Appearance\" section of the Custom OSD settings, explaining that the color options control the icon and progress bar appearance, and that \"Auto\" automatically adapts to the system theme.", @@ -6669,6 +6917,9 @@ } } } + }, + "color picker" : { + }, "Color Picker" : { "localizations" : { @@ -6717,6 +6968,9 @@ } } } + }, + "Color-coded battery display" : { + }, "Color-coded fills and smooth gradients are unavailable in Segmented mode. Switch to Hierarchical or Gradient to adjust these options." : { "comment" : "An explanatory text that appears when the user tries to enable color-coded color gradients in Segmented progress bars. It instructs the user to switch to Hierarchical or Gradient progress bars to enable these features.", @@ -6741,6 +6995,9 @@ } } } + }, + "Color-coded volume display" : { + }, "ColorPicker Disabled" : { "localizations" : { @@ -6857,6 +7114,12 @@ } } } + }, + "compact" : { + + }, + "completed" : { + }, "Configuration" : { "localizations" : { @@ -6940,6 +7203,12 @@ } } } + }, + "Connects directly to the Apple Music app." : { + + }, + "Connects directly to the Spotify app." : { + }, "Continue" : { "localizations" : { @@ -7062,6 +7331,12 @@ } } } + }, + "controller" : { + + }, + "controls" : { + }, "Controls" : { "localizations" : { @@ -7088,9 +7363,6 @@ } } } - }, - "Controls the lock screen reminder chip and its positioning." : { - }, "Controls the optional timer widget that floats above the media panel, including its classic, frosted, or liquid glass surface independent of the global material setting." : { "localizations" : { @@ -7111,6 +7383,9 @@ } } } + }, + "copy" : { + }, "Copy event link" : { "comment" : "A tooltip for a button that copies the link of a reminder event to the clipboard.", @@ -7208,6 +7483,12 @@ } }, "shouldTranslate" : false + }, + "corner radius" : { + + }, + "Corner radius scaling" : { + }, "Countdown style" : { "comment" : "A label for the style of countdown to use when reminders are live.", @@ -7221,6 +7502,13 @@ } } }, + "cpu" : { + + }, + "CPU" : { + "comment" : "Title for the CPU usage graph.", + "isCommentAutoGenerated" : true + }, "CPU Usage" : { "localizations" : { "fr" : { @@ -7237,6 +7525,10 @@ } } }, + "Create and design with color picker, mirror, and visual effects." : { + "comment" : "Description of a user profile when the name is \"Designer\".", + "isCommentAutoGenerated" : true + }, "Create from Clipboard" : { "localizations" : { "pt-BR" : { @@ -7343,6 +7635,12 @@ } } } + }, + "cursor" : { + + }, + "custom" : { + }, "Custom" : { "extractionState" : "stale", @@ -7371,6 +7669,9 @@ } } } + }, + "Custom Focus metadata" : { + }, "Custom height" : { "localizations" : { @@ -7471,6 +7772,12 @@ } } } + }, + "custom icon" : { + + }, + "Custom Liquid" : { + }, "Custom liquid glass already renders with Apple's liquid material, so this option is managed automatically." : { "comment" : "A description of the custom liquid blur option in the media settings.", @@ -7693,6 +8000,9 @@ } } } + }, + "custom osd" : { + }, "Custom OSD" : { "comment" : "The title of the settings screen for customizing the OSD.", @@ -8001,6 +8311,10 @@ } } }, + "Deep Work" : { + "comment" : "Name of a default timer preset for deep work.", + "isCommentAutoGenerated" : true + }, "Default" : { "localizations" : { "ar" : { @@ -8189,6 +8503,10 @@ } } }, + "Denied" : { + "comment" : "Description of a calendar authorization status when access is denied.", + "isCommentAutoGenerated" : true + }, "Denied/Revoked" : { "comment" : "A label describing an extension with denied or revoked permissions.", "isCommentAutoGenerated" : true, @@ -8314,8 +8632,9 @@ } } }, - "Deselect All" : { - + "Designer" : { + "comment" : "Name of a user profile for a designer.", + "isCommentAutoGenerated" : true }, "Detection Status" : { "comment" : "The header for a section that displays whether the screen recording detection feature is currently active or inactive.", @@ -8334,6 +8653,13 @@ } } } + }, + "Developer" : { + "comment" : "Name of a user profile.", + "isCommentAutoGenerated" : true + }, + "device name" : { + }, "Devices" : { "comment" : "The title of the \"Devices\" section in the settings menu.", @@ -8346,6 +8672,9 @@ } } } + }, + "diagnostics" : { + }, "Diagnostics" : { "comment" : "A section header in the Lock Screen Settings view, describing diagnostics-related functionality.", @@ -8359,6 +8688,10 @@ } } }, + "Digital" : { + "comment" : "Name for the \"Digital\" style of reminder presentation.", + "isCommentAutoGenerated" : true + }, "Dimensions" : { "localizations" : { "pt-BR" : { @@ -8584,6 +8917,16 @@ } } } + }, + "disk" : { + + }, + "Disk" : { + "comment" : "Title for the \"Disk\" section in the stats view.", + "isCommentAutoGenerated" : true + }, + "Disk I/O" : { + }, "Disk Read" : { "localizations" : { @@ -8616,6 +8959,9 @@ } } } + }, + "display height" : { + }, "Display Mode" : { "localizations" : { @@ -8643,6 +8989,9 @@ } } } + }, + "displays" : { + }, "Displays a HUD notification when Bluetooth audio devices (headphones, AirPods, speakers) connect, showing device name and battery level." : { "comment" : "A footer for the \"Bluetooth Audio Devices\" section in the HUD settings.", @@ -8681,9 +9030,6 @@ } } } - }, - "Displays your next upcoming calendar event above or below the weather capsule. Calendar selection here is independent from the Dynamic Island calendar filter." : { - }, "Do Not Disturb" : { "localizations" : { @@ -8694,6 +9040,9 @@ } } } + }, + "dock" : { + }, "Donate" : { "comment" : "A button label that says \"Donate\".", @@ -8980,6 +9329,9 @@ } }, "shouldTranslate" : false + }, + "drag" : { + }, "Drag a control onto a slot or tap to place it in the first empty slot." : { "comment" : "A description below the control palette that explains how users can interact with it.", @@ -9120,6 +9472,13 @@ } } }, + "Dynamic Island" : { + + }, + "Dynamic Island HUD" : { + "comment" : "Titles for the tabs in the HUD and OSD settings view.", + "isCommentAutoGenerated" : true + }, "Dynamic Island Progress Bars" : { "comment" : "A section header that lists the options for customizing the appearance of the progress bars displayed by Dynamic Island.", "isCommentAutoGenerated" : true, @@ -9162,6 +9521,10 @@ } } }, + "EAQI" : { + "comment" : "The label to use for the compact version of the weather air quality scale in the lock screen.", + "isCommentAutoGenerated" : true + }, "Easily copy, store, and manage your most-used content. Upgrade now for advanced features like multi-item storage and quick access!" : { "localizations" : { "ar" : { @@ -9388,6 +9751,9 @@ } } } + }, + "enable" : { + }, "Enable \"Show cool face animation while inactivity\" to customize animations" : { "comment" : "A message displayed below the section header in the IdleAnimationsSettingsSection, explaining that users can customize animations by enabling this feature.", @@ -9400,6 +9766,12 @@ } } } + }, + "Enable album art parallax" : { + + }, + "Enable album art parallax effect" : { + }, "Enable and style the media controls that appear above the system clock when the screen is locked." : { "comment" : "A description of the media panel settings in the lock screen settings view.", @@ -9412,6 +9784,9 @@ } } } + }, + "Enable blur effect behind album art" : { + }, "Enable Built-in System HUD" : { "extractionState" : "stale", @@ -9436,7 +9811,6 @@ } }, "Enable Calendar Access" : { - "extractionState" : "stale", "localizations" : { "pt-BR" : { "stringUnit" : { @@ -9447,7 +9821,6 @@ } }, "Enable Camera Access" : { - "extractionState" : "stale", "localizations" : { "pt-BR" : { "stringUnit" : { @@ -9456,9 +9829,21 @@ } } } + }, + "Enable Camera Detection" : { + + }, + "Enable Clipboard Manager" : { + + }, + "Enable Color Filtering" : { + "comment" : "Label for a toggle that enables or disables color filtering in the notes view.", + "isCommentAutoGenerated" : true + }, + "Enable Color Picker" : { + }, "Enable colored spectrograms" : { - "extractionState" : "stale", "localizations" : { "ar" : { "stringUnit" : { @@ -9573,6 +9958,13 @@ } } } + }, + "Enable Create from Clipboard" : { + "comment" : "Label for a toggle that enables the ability to create notes from text copied from the clipboard.", + "isCommentAutoGenerated" : true + }, + "Enable Custom OSD" : { + }, "Enable customizable controls" : { "comment" : "A toggle that allows users to enable or disable customizable controls for media playback.", @@ -9586,8 +9978,19 @@ } } }, + "Enable download detection" : { + "comment" : "Toggle to enable or disable download detection.", + "isCommentAutoGenerated" : true + }, "Enable Dynamic Island media controls to manage the lock screen panel." : { + }, + "Enable Dynamic mirror" : { + + }, + "Enable extension diagnostics logging" : { + "comment" : "A toggle that enables or disables logging of diagnostic information related to extensions.", + "isCommentAutoGenerated" : true }, "Enable extensions to allow third-party apps to display live activities and lock screen widgets in Atoll." : { "comment" : "A footer text that explains the purpose of enabling extensions.", @@ -9600,6 +10003,15 @@ } } } + }, + "Enable Focus Detection" : { + + }, + "Enable gestures" : { + + }, + "Enable global keyboard shortcuts" : { + }, "Enable global keyboard shortcuts above to customize your shortcuts." : { "localizations" : { @@ -9610,6 +10022,9 @@ } } } + }, + "Enable glowing effect" : { + }, "Enable graph visibility in Settings → Stats to view performance data." : { "comment" : "A message displayed when no graphs are enabled in the Stats tab.", @@ -9624,7 +10039,6 @@ } }, "Enable haptics" : { - "extractionState" : "stale", "localizations" : { "ar" : { "stringUnit" : { @@ -9824,6 +10238,12 @@ } } } + }, + "Enable lock screen live activity" : { + + }, + "Enable lyrics" : { + }, "Enable media panel blur" : { "comment" : "A toggle switch that enables or disables the blur effect on the media panel.", @@ -9836,6 +10256,12 @@ } } } + }, + "Enable Microphone Detection" : { + + }, + "Enable Minimalistic UI" : { + }, "Enable music live activity" : { "localizations" : { @@ -9936,6 +10362,24 @@ } } } + }, + "Enable Note Pinning" : { + "comment" : "Label for a toggle switch in the Notes settings view that enables or disables note pinning.", + "isCommentAutoGenerated" : true + }, + "Enable Note Search" : { + "comment" : "Label for a toggle that enables or disables note search functionality.", + "isCommentAutoGenerated" : true + }, + "Enable Notes" : { + "comment" : "Label for a toggle switch that enables or disables the notes feature.", + "isCommentAutoGenerated" : true + }, + "Enable reminder live activity" : { + + }, + "Enable Screen Assistant" : { + }, "Enable screen color picking functionality. Use Cmd+Shift+P to quickly access the color picker." : { "localizations" : { @@ -9946,6 +10390,12 @@ } } } + }, + "Enable Screen Recording Detection" : { + + }, + "Enable shelf" : { + }, "Enable sneak peek" : { "localizations" : { @@ -9972,6 +10422,9 @@ } } } + }, + "Enable system stats monitoring" : { + }, "Enable the battery capsule and configure its layout." : { "localizations" : { @@ -10016,6 +10469,13 @@ } } } + }, + "Enable third-party extensions" : { + "comment" : "Toggle to enable or disable third-party extensions.", + "isCommentAutoGenerated" : true + }, + "Enable timer feature" : { + }, "Enable timer live activity" : { "localizations" : { @@ -10036,6 +10496,9 @@ } } } + }, + "Enable window shadow" : { + }, "Engine Utilization" : { "comment" : "A label describing the utilization of the GPU's engine components.", @@ -10371,6 +10834,10 @@ } } }, + "Event color" : { + "comment" : "Name of the chip style that shows the event color.", + "isCommentAutoGenerated" : true + }, "Event List" : { "comment" : "A section header in the calendar settings view, describing the list of calendar events.", "isCommentAutoGenerated" : true, @@ -10382,6 +10849,9 @@ } } } + }, + "events" : { + }, "Exclude apps" : { "extractionState" : "stale", @@ -10521,6 +10991,9 @@ } } } + }, + "expanded notch" : { + }, "Expanded notch width" : { "comment" : "A label describing the expanded notch width setting.", @@ -10534,6 +11007,13 @@ } } }, + "Extend hover area" : { + + }, + "Extend the notch span so the clipboard, colour picker, and other trailing icons remain visible on scaled displays (e.g. More Space)." : { + "comment" : "Help text for the \"Notch Width\" section in the \"Appearance\" tab of the settings.", + "isCommentAutoGenerated" : true + }, "Extension tab unavailable" : { "comment" : "A message displayed when the extension tab is not available.", "isCommentAutoGenerated" : true, @@ -10545,6 +11025,9 @@ } } } + }, + "extensions" : { + }, "Extensions" : { "localizations" : { @@ -10664,6 +11147,26 @@ } } }, + "eyedropper" : { + + }, + "face animation" : { + + }, + "fahrenheit" : { + + }, + "Favorites" : { + "comment" : "Localized name of the \"Favorites\" tab in the clipboard.", + "isCommentAutoGenerated" : true + }, + "feedback" : { + + }, + "File" : { + "comment" : "Display name for a \"File\" clipboard item type.", + "isCommentAutoGenerated" : true + }, "Files dropped on the shelf will be shared via this service" : { "comment" : "A description below the currently selected quick share provider, explaining that files dropped on the shelf will be shared via that provider.", "isCommentAutoGenerated" : true, @@ -10808,6 +11311,10 @@ } } }, + "Focus" : { + "comment" : "Name of a default timer preset.", + "isCommentAutoGenerated" : true + }, "Focus active: %@" : { "comment" : "An accessibility label for the focus widget, describing the currently active focus mode.", "isCommentAutoGenerated" : true, @@ -10858,8 +11365,22 @@ } } }, + "frosted" : { + + }, + "Frosted Glass" : { + "comment" : "The name of the frosted glass style.", + "isCommentAutoGenerated" : true + }, + "Full Access" : { + "comment" : "Text describing the status of calendar access when the user has full access.", + "isCommentAutoGenerated" : true + }, + "Full charge" : { + "comment" : "Text displayed in the status text when the battery is fully charged.", + "isCommentAutoGenerated" : true + }, "Full Disk Access required" : { - "extractionState" : "stale", "localizations" : { "pt-BR" : { "stringUnit" : { @@ -10868,6 +11389,9 @@ } } } + }, + "Full Disk Access unlocks custom Focus icons, colors, and labels. Standard Focus detection still works without it—grant access only if you need personalized indicators." : { + }, "Fully charged" : { "comment" : "Charging fallback label when already charged", @@ -10879,6 +11403,12 @@ } } } + }, + "gauge" : { + + }, + "gauge tint" : { + }, "Gemini API Key" : { "localizations" : { @@ -10895,6 +11425,9 @@ } } } + }, + "general" : { + }, "General" : { "localizations" : { @@ -11207,6 +11740,9 @@ } } } + }, + "gestures" : { + }, "Get started" : { "localizations" : { @@ -11425,6 +11961,13 @@ }, "shouldTranslate" : false }, + "glass" : { + + }, + "Glass" : { + "comment" : "Name of the timer surface mode that uses a glass effect.", + "isCommentAutoGenerated" : true + }, "Glass mode" : { "localizations" : { "pt-BR" : { @@ -11446,6 +11989,9 @@ } } } + }, + "glow" : { + }, "Got it!" : { "localizations" : { @@ -11547,6 +12093,13 @@ } } }, + "gpu" : { + + }, + "GPU" : { + "comment" : "Title for the GPU usage graph.", + "isCommentAutoGenerated" : true + }, "GPU Usage" : { "localizations" : { "fr" : { @@ -11562,6 +12115,9 @@ } } } + }, + "gradient" : { + }, "Gradient" : { "localizations" : { @@ -11662,6 +12218,13 @@ } } } + }, + "Grant Full Disk Access so the Shelf can index and move files outside the app sandbox." : { + "comment" : "Message in a settings permission callout explaining why Full Disk Access is needed for the Shelf.", + "isCommentAutoGenerated" : true + }, + "graph" : { + }, "Graph Visibility" : { "localizations" : { @@ -11678,6 +12241,22 @@ } } } + }, + "graphics" : { + + }, + "gray" : { + + }, + "Green" : { + "comment" : "Display name for the \"Green\" caps lock indicator tint mode.", + "isCommentAutoGenerated" : true + }, + "grid" : { + + }, + "haptic" : { + }, "Height:" : { "extractionState" : "stale", @@ -11705,6 +12284,9 @@ } } } + }, + "hex" : { + }, "Hide" : { "localizations" : { @@ -11745,6 +12327,9 @@ } } } + }, + "Hide Dynamic Island during screenshots & recordings" : { + }, "Hide DynamicIsland Options" : { "localizations" : { @@ -12073,6 +12658,13 @@ } } }, + "history" : { + + }, + "History" : { + "comment" : "Localized name of each tab in the clipboard view.", + "isCommentAutoGenerated" : true + }, "History Size" : { "localizations" : { "fr" : { @@ -12100,6 +12692,19 @@ } }, "shouldTranslate" : false + }, + "Hours" : { + "comment" : "Labels and steppers for adjusting the duration of the custom timer.", + "isCommentAutoGenerated" : true + }, + "hover" : { + + }, + "hover to open" : { + + }, + "hsl" : { + }, "https://example.com/animation.json" : { "comment" : "A placeholder text for a Lottie JSON URL input field.", @@ -12214,6 +12819,9 @@ } }, "shouldTranslate" : false + }, + "hud" : { + }, "HUD Position" : { "localizations" : { @@ -12426,6 +13034,9 @@ } }, "shouldTranslate" : false + }, + "icon" : { + }, "Icon & Progress Color" : { "comment" : "A picker that lets users choose the color scheme for the icon and progress bar in the OSD.", @@ -12438,6 +13049,9 @@ } } } + }, + "idle" : { + }, "Idle" : { "comment" : "A label displayed alongside the status of a GPU device.", @@ -12475,6 +13089,10 @@ } } }, + "Image" : { + "comment" : "Name of the \"Image\" clipboard item type.", + "isCommentAutoGenerated" : true + }, "Import" : { "localizations" : { "fr" : { @@ -12642,6 +13260,12 @@ } } } + }, + "indicator" : { + + }, + "inline" : { + }, "Inline" : { "localizations" : { @@ -12880,6 +13504,9 @@ } } } + }, + "io" : { + }, "IPv4 · %@" : { "comment" : "A label displaying an IP address for a network interface. The text inside the parentheses is the IP address of the interface.", @@ -12916,6 +13543,17 @@ } } } + }, + "just now" : { + "comment" : "Text describing a moment in time that is just now.", + "isCommentAutoGenerated" : true + }, + "Just now" : { + "comment" : "A string indicating that an action was performed just recently.", + "isCommentAutoGenerated" : true + }, + "keyboard" : { + }, "Keyboard Backlight HUD" : { "localizations" : { @@ -12972,6 +13610,9 @@ } } } + }, + "laptop icon" : { + }, "Last Denied Reason:" : { "comment" : "A label for the \"Last Denied Reason\" section in the extensions settings view.", @@ -13100,6 +13741,9 @@ } } } + }, + "Launch at login" : { + }, "Layout" : { "comment" : "A label for the segment control that lets the user choose the layout of the weather widget.", @@ -13137,6 +13781,10 @@ } } }, + "Light Use" : { + "comment" : "Name of the \"Light Use\" user profile.", + "isCommentAutoGenerated" : true + }, "Line Width: %lldpx" : { "localizations" : { "pt-BR" : { @@ -13159,6 +13807,13 @@ }, "shouldTranslate" : false }, + "liquid" : { + + }, + "Liquid Glass" : { + "comment" : "Name of the \"Liquid Glass\" lock screen glass style.", + "isCommentAutoGenerated" : true + }, "Liquid Glass requires macOS 26 or later." : { "localizations" : { "fr" : { @@ -13174,6 +13829,9 @@ } } } + }, + "list" : { + }, "Listens for Focus session changes via distributed notifications" : { "localizations" : { @@ -13196,6 +13854,9 @@ } } } + }, + "live activities" : { + }, "Live Activities" : { "comment" : "The title of the \"Live Activities\" screen.", @@ -13208,6 +13869,9 @@ } } } + }, + "live activity" : { + }, "Live Activity & Feedback" : { "comment" : "The header for the \"Live Activity & Feedback\" section in the lock screen settings.", @@ -13289,6 +13953,12 @@ } } } + }, + "location" : { + + }, + "lock screen" : { + }, "Lock Screen" : { "localizations" : { @@ -13347,6 +14017,9 @@ } } } + }, + "lock screen media" : { + }, "Lock Screen Media" : { "localizations" : { @@ -13393,6 +14066,9 @@ } } } + }, + "lock screen timer" : { + }, "Lock Screen Widgets" : { "comment" : "A toggle that enables or disables the use of lock screen widgets by the extension.", @@ -13405,6 +14081,9 @@ } } } + }, + "logging" : { + }, "Loop Mode" : { "localizations" : { @@ -13617,6 +14296,13 @@ } } }, + "low battery" : { + + }, + "Low battery" : { + "comment" : "Text displayed when the battery level drops below a certain threshold.", + "isCommentAutoGenerated" : true + }, "Low Power Mode" : { "localizations" : { "ar" : { @@ -13716,6 +14402,13 @@ } } } + }, + "Low Power: %@" : { + "comment" : "Text displayed in a status label at the top of the screen indicating whether low power mode is on or off.", + "isCommentAutoGenerated" : true + }, + "lyrics" : { + }, "Mac battery at %d percent" : { "comment" : "Mac battery gauge accessibility label", @@ -13751,6 +14444,9 @@ } } } + }, + "Manage app permissions" : { + }, "Manage indicator preferences from Settings → Privacy. No manual microphone toggle is required." : { "comment" : "A description of how to manage the microphone privacy indicator preferences.", @@ -13763,6 +14459,9 @@ } } } + }, + "manager" : { + }, "Mark as complete" : { "comment" : "An accessibility label for a button that marks an item as complete.", @@ -13787,6 +14486,9 @@ } } } + }, + "marquee" : { + }, "Match menubar height" : { "localizations" : { @@ -13987,6 +14689,9 @@ } } } + }, + "material" : { + }, "Material" : { "comment" : "A picker that lets the user select the material of the lock screen glass.", @@ -14104,6 +14809,9 @@ } } } + }, + "media" : { + }, "Media" : { "localizations" : { @@ -14207,7 +14915,6 @@ }, "Media change with horizontal gestures" : { "comment" : "A toggle that lets the user enable or disable the feature of changing the currently playing media using horizontal gestures.", - "extractionState" : "stale", "isCommentAutoGenerated" : true, "localizations" : { "ar" : { @@ -14519,6 +15226,9 @@ } } } + }, + "media output" : { + }, "Media output" : { "comment" : "Accessibility label describing the control that opens the media output selector.", @@ -14531,6 +15241,9 @@ } } } + }, + "media panel" : { + }, "Media Panel" : { "comment" : "A section header in the lock screen settings view.", @@ -14544,6 +15257,10 @@ } } }, + "Media Panel Width" : { + "comment" : "Title of a slider that adjusts the width of the lock screen media panel.", + "isCommentAutoGenerated" : true + }, "Media playback live activity" : { "localizations" : { "ar" : { @@ -14643,6 +15360,9 @@ } } } + }, + "media source" : { + }, "Media Source" : { "localizations" : { @@ -14855,6 +15575,13 @@ } } }, + "memory" : { + + }, + "Memory" : { + "comment" : "Title of the memory usage single value graph.", + "isCommentAutoGenerated" : true + }, "Memory Usage" : { "localizations" : { "fr" : { @@ -14870,9 +15597,14 @@ } } } + }, + "menu bar" : { + + }, + "menu bar size" : { + }, "Menubar icon" : { - "extractionState" : "stale", "localizations" : { "ar" : { "stringUnit" : { @@ -14985,6 +15717,10 @@ } } }, + "Mic" : { + "comment" : "Name of a sneak action type that controls the microphone.", + "isCommentAutoGenerated" : true + }, "Mic %@" : { "extractionState" : "stale", "localizations" : { @@ -15182,6 +15918,9 @@ } } } + }, + "minimalistic" : { + }, "Minimalistic mode focuses on media controls and system HUDs, hiding all extra features for a clean, focused experience. Automatically enables simpler animations." : { "localizations" : { @@ -15294,7 +16033,6 @@ } }, "Minutes" : { - "extractionState" : "stale", "localizations" : { "fr" : { "stringUnit" : { @@ -15303,6 +16041,9 @@ } } } + }, + "mirror" : { + }, "Mirror" : { "localizations" : { @@ -15415,6 +16156,9 @@ } } } + }, + "mirror shape" : { + }, "Mirror shape" : { "localizations" : { @@ -15525,6 +16269,9 @@ } } } + }, + "mode" : { + }, "Monitor clipboard changes and keep a history of recent copies. Use Cmd+Shift+V to quickly access clipboard history." : { "localizations" : { @@ -15547,6 +16294,9 @@ } } } + }, + "monitoring" : { + }, "Monitoring Behavior" : { "localizations" : { @@ -15584,6 +16334,9 @@ } } } + }, + "monochrome" : { + }, "More" : { "localizations" : { @@ -15709,6 +16462,10 @@ } } }, + "Music" : { + "comment" : "Title for the \"Music\" column in the lock screen positioning controls.", + "isCommentAutoGenerated" : true + }, "Music panel variant" : { "localizations" : { "pt-BR" : { @@ -16152,6 +16909,16 @@ } } } + }, + "network" : { + + }, + "Network" : { + "comment" : "Title for the \"Network\" section in the stats view.", + "isCommentAutoGenerated" : true + }, + "Network Activity" : { + }, "Network Download" : { "localizations" : { @@ -17045,6 +17812,14 @@ } } }, + "Not charging" : { + "comment" : "Text displayed in the status text when the battery is not charging.", + "isCommentAutoGenerated" : true + }, + "Not Determined" : { + "comment" : "Title of the section in the settings view that allows the user to determine if the app has access to their calendar.", + "isCommentAutoGenerated" : true + }, "Not Now" : { "localizations" : { "ar" : { @@ -17154,6 +17929,9 @@ } } } + }, + "notch" : { + }, "Notch behavior" : { "localizations" : { @@ -17483,6 +18261,9 @@ } } } + }, + "notifications" : { + }, "Notify before" : { "comment" : "A label describing the slider that allows the user to set a reminder lead time.", @@ -17496,6 +18277,14 @@ } } }, + "Now Playing" : { + "comment" : "Localized name for each media controller type.", + "isCommentAutoGenerated" : true + }, + "Off" : { + "comment" : "Text displayed in a status label at the top of the screen indicating whether low power mode is on or off.", + "isCommentAutoGenerated" : true + }, "OK" : { "localizations" : { "ar" : { @@ -17596,6 +18385,13 @@ } }, "shouldTranslate" : false + }, + "On" : { + "comment" : "Status text that indicates whether low power mode is on or off.", + "isCommentAutoGenerated" : true + }, + "on-screen display" : { + }, "One or more files failed to load" : { "localizations" : { @@ -17742,6 +18538,9 @@ } } } + }, + "open" : { + }, "Open Google AI Studio" : { "localizations" : { @@ -17764,6 +18563,9 @@ } } } + }, + "open meteo" : { + }, "Open Model Settings" : { "localizations" : { @@ -17774,6 +18576,20 @@ } } } + }, + "Open notch on hover" : { + + }, + "Open Privacy & Security" : { + "comment" : "Title of the button that opens the user's system settings to grant the requested permission.", + "isCommentAutoGenerated" : true + }, + "Open Settings" : { + "comment" : "Title of a button that opens the user's system settings.", + "isCommentAutoGenerated" : true + }, + "Open shelf tab by default if items added" : { + }, "Open System Settings" : { "localizations" : { @@ -17814,6 +18630,9 @@ } } } + }, + "osd" : { + }, "Output devices" : { "comment" : "Section title for the list of available audio output devices in the media output selector.", @@ -17850,6 +18669,13 @@ } } } + }, + "Panel" : { + "comment" : "Display name for the \"Panel\" clipboard display mode.", + "isCommentAutoGenerated" : true + }, + "panel border" : { + }, "Panel mode shows clipboard in a floating window near the notch." : { "comment" : "A description of the \"Panel\" clipboard display mode.", @@ -17882,6 +18708,12 @@ } } } + }, + "parallax" : { + + }, + "parallax effect" : { + }, "Pause" : { "shouldTranslate" : false @@ -17899,7 +18731,6 @@ } }, "Percentage" : { - "extractionState" : "stale", "localizations" : { "en" : { "stringUnit" : { @@ -17908,6 +18739,9 @@ } } } + }, + "percentages" : { + }, "Permission States:" : { "comment" : "A label describing the different permission states displayed in the footer of the extensions settings view.", @@ -17920,6 +18754,9 @@ } } } + }, + "permissions" : { + }, "Permissions" : { "localizations" : { @@ -18010,6 +18847,9 @@ } } } + }, + "pinch" : { + }, "Pinned Items" : { "localizations" : { @@ -18020,6 +18860,19 @@ } } } + }, + "Play feedback when volume is changed" : { + "comment" : "Toggle to enable or disable audio feedback when the volume is changed.", + "isCommentAutoGenerated" : true + }, + "Play lock/unlock sounds" : { + + }, + "Play low battery alert sound" : { + + }, + "Player tinting" : { + }, "Plays the supplied feedback clip whenever you press the hardware volume keys." : { "comment" : "A help text describing the audio feedback feature.", @@ -18143,6 +18996,10 @@ } } }, + "Popover" : { + "comment" : "Description of a timer display mode when the controls are displayed as a popover.", + "isCommentAutoGenerated" : true + }, "Popover mode shows clipboard as a dropdown attached to the clipboard button." : { "comment" : "A description of the \"Popover mode\" in the Clipboard Settings view.", "isCommentAutoGenerated" : true, @@ -18190,6 +19047,15 @@ } } } + }, + "power" : { + + }, + "power icons" : { + + }, + "preset" : { + }, "Preset name" : { "comment" : "A label for the name of a timer preset.", @@ -18244,6 +19110,9 @@ } } } + }, + "preview" : { + }, "Preview" : { "localizations" : { @@ -18272,6 +19141,9 @@ } } } + }, + "privacy" : { + }, "Privacy Indicators" : { "comment" : "A heading for the section that lists privacy indicators.", @@ -18297,6 +19169,13 @@ } } }, + "progress" : { + + }, + "Progress" : { + "comment" : "Name of the download indicator style that shows a progress bar.", + "isCommentAutoGenerated" : true + }, "Progress bar" : { "extractionState" : "stale", "localizations" : { @@ -18667,6 +19546,13 @@ } } } + }, + "R " : { + "comment" : "Label for the read data in the disk usage graph.", + "isCommentAutoGenerated" : true + }, + "ram" : { + }, "Re-authorize" : { "comment" : "A button that re-authorizes an app when pressed.", @@ -18757,6 +19643,9 @@ } } } + }, + "recording" : { + }, "Recording" : { "localizations" : { @@ -18807,6 +19696,12 @@ } } } + }, + "rectangle" : { + + }, + "reflection" : { + }, "Release name" : { "localizations" : { @@ -19007,6 +19902,15 @@ } } } + }, + "reminder" : { + + }, + "reminder chip" : { + + }, + "reminder countdown" : { + }, "Reminder Live Activity" : { "comment" : "A section header that lists the options related to live activity notifications for reminders.", @@ -19020,7 +19924,7 @@ } } }, - "Reminder Widget" : { + "reminder widget" : { }, "Reminders" : { @@ -19038,6 +19942,9 @@ } } } + }, + "remove" : { + }, "Remove" : { "comment" : "A button that removes an extension from the authorized list.", @@ -19102,6 +20009,14 @@ } } }, + "Request Full Disk Access" : { + "comment" : "Titles for the buttons in the permission callout.", + "isCommentAutoGenerated" : true + }, + "Requires a third-party client with API plugin enabled." : { + "comment" : "Description of a music controller type when it requires a third-party client with an API plugin enabled.", + "isCommentAutoGenerated" : true + }, "Requires Accessibility permission so Dynamic Island can intercept the hardware volume keys." : { "localizations" : { "pt-BR" : { @@ -19168,6 +20083,14 @@ } } }, + "Reset Media Width" : { + "comment" : "Title for a button that resets the width of the lock screen media panel to its default value.", + "isCommentAutoGenerated" : true + }, + "Reset Music" : { + "comment" : "Title for a button that resets the offset of the music section in the lock screen.", + "isCommentAutoGenerated" : true + }, "Reset Notch Experiences" : { "comment" : "A menu item that resets all notch experiences for a particular app.", "isCommentAutoGenerated" : true, @@ -19192,6 +20115,14 @@ } } }, + "Reset Timer" : { + "comment" : "Title for a button that resets the offset of the timer widget in the lock screen.", + "isCommentAutoGenerated" : true + }, + "Reset Timer Width" : { + "comment" : "Title for a button that resets the width of the lock screen timer widget to its default value.", + "isCommentAutoGenerated" : true + }, "Reset to Default" : { "localizations" : { "fr" : { @@ -19220,6 +20151,10 @@ } } }, + "Reset Weather" : { + "comment" : "Label for resetting the vertical offset of the weather section in the lock screen positioning controls.", + "isCommentAutoGenerated" : true + }, "Reset Width" : { "comment" : "A button to reset the expanded notch width to its default value.", "isCommentAutoGenerated" : true, @@ -19231,6 +20166,9 @@ } } } + }, + "resize" : { + }, "Restart" : { "extractionState" : "stale", @@ -19385,6 +20323,10 @@ } } }, + "Restricted" : { + "comment" : "Description of a calendar authorization status when access is restricted.", + "isCommentAutoGenerated" : true + }, "Resume" : { "localizations" : { "fr" : { @@ -19400,6 +20342,19 @@ } } } + }, + "reverse" : { + + }, + "Reverse open/close scroll gestures" : { + "comment" : "Label for a toggle that allows the user to reverse the behavior of scrolling up and down to open and close the app's window.", + "isCommentAutoGenerated" : true + }, + "Reverse scroll gestures" : { + + }, + "Reverse swipe gestures" : { + }, "Revoke Access" : { "comment" : "A button that revokes access to an app.", @@ -19413,6 +20368,10 @@ } } }, + "Rich Text" : { + "comment" : "Name for a clipboard item type that represents a rich text format.", + "isCommentAutoGenerated" : true + }, "Right" : { "localizations" : { "pt-BR" : { @@ -19423,6 +20382,13 @@ } } }, + "ring" : { + + }, + "Ring" : { + "comment" : "Name of the timer progress style that shows a ring animation.", + "isCommentAutoGenerated" : true + }, "Rotation:" : { "extractionState" : "stale", "localizations" : { @@ -19433,6 +20399,9 @@ } } } + }, + "route picker" : { + }, "Running" : { "extractionState" : "stale", @@ -19592,6 +20561,9 @@ } } } + }, + "scale" : { + }, "Scale Down" : { "localizations" : { @@ -19635,6 +20607,9 @@ } } } + }, + "screen assistant" : { + }, "Screen Assistant" : { "localizations" : { @@ -19691,6 +20666,9 @@ } } } + }, + "screenshot" : { + }, "Screenshot options" : { "localizations" : { @@ -19723,6 +20701,9 @@ } } } + }, + "scroll" : { + }, "Scroll" : { "comment" : "A hint text that appears when scrolling horizontally in the control palette.", @@ -19735,6 +20716,9 @@ } } } + }, + "Scroll device name in HUD" : { + }, "Search clipboard..." : { "localizations" : { @@ -19838,7 +20822,6 @@ } }, "Seconds" : { - "extractionState" : "stale", "localizations" : { "fr" : { "stringUnit" : { @@ -20243,6 +21226,10 @@ } } }, + "Separate Tab" : { + "comment" : "Name of the clipboard display mode option that opens the clipboard in a separate tab.", + "isCommentAutoGenerated" : true + }, "Separate Tab mode integrates Copied Items and Notes into a single view. If both are enabled, Notes appear on the right and Clipboard on the left." : { "comment" : "A description of the \"Separate Tab\" clipboard display mode.", "isCommentAutoGenerated" : true, @@ -20394,6 +21381,12 @@ } } } + }, + "settings button" : { + + }, + "Settings icon in notch" : { + }, "Settings…" : { "comment" : "A command that shows the settings window.", @@ -20406,6 +21399,18 @@ } } } + }, + "shadow" : { + + }, + "shape" : { + + }, + "share" : { + + }, + "shelf" : { + }, "Shelf" : { "localizations" : { @@ -20506,6 +21511,12 @@ } } } + }, + "shelf tab" : { + + }, + "shortcut" : { + }, "Shortcuts" : { "localizations" : { @@ -20606,9 +21617,17 @@ } } } + }, + "Show \"Change Media Output\" control" : { + + }, + "Show All Color Formats" : { + + }, + "Show AQI widget" : { + }, "Show battery indicator" : { - "extractionState" : "stale", "localizations" : { "ar" : { "stringUnit" : { @@ -20708,6 +21727,34 @@ } } }, + "Show battery percentage" : { + + }, + "Show battery percentage text in HUD" : { + + }, + "Show Bluetooth battery" : { + + }, + "Show Bluetooth device connections" : { + + }, + "Show calendar" : { + + }, + "Show Caps Lock Indicator" : { + + }, + "Show Caps Lock label" : { + + }, + "Show Change Media Output control" : { + + }, + "Show Character Count" : { + "comment" : "Label for a toggle that shows the character count of a note.", + "isCommentAutoGenerated" : true + }, "Show charging indicator" : { "extractionState" : "stale", "localizations" : { @@ -20724,6 +21771,15 @@ } } } + }, + "Show charging percentage" : { + + }, + "Show charging status" : { + + }, + "Show Clipboard Icon" : { + }, "Show Color History" : { "localizations" : { @@ -20740,6 +21796,9 @@ } } } + }, + "Show Color Picker Icon" : { + }, "Show Color Picker Panel" : { "localizations" : { @@ -20752,7 +21811,6 @@ } }, "Show cool face animation while inactivity" : { - "extractionState" : "stale", "localizations" : { "ar" : { "stringUnit" : { @@ -20885,13 +21943,11 @@ } } }, - "Show event after it starts" : { - + "Show extension tabs" : { + "comment" : "Label for a toggle that enables or disables the display of tabs in notch experiences.", + "isCommentAutoGenerated" : true }, - "Show events from all calendars" : { - - }, - "Show events within the next" : { + "Show floating media controls" : { }, "Show floating pause/stop controls" : { @@ -20903,6 +21959,18 @@ } } } + }, + "Show Focus as brief toast" : { + + }, + "Show Focus Indicator" : { + + }, + "Show Focus Label" : { + + }, + "Show focus widget" : { + }, "Show full event titles" : { "comment" : "A toggle that shows or hides the full event titles in the calendar view", @@ -20915,6 +21983,30 @@ } } } + }, + "Show location label" : { + + }, + "Show lock screen media panel" : { + + }, + "Show lock screen reminder" : { + + }, + "Show lock screen timer" : { + + }, + "Show lock screen timer widget" : { + + }, + "Show lock screen weather" : { + + }, + "Show media app icon" : { + + }, + "Show media controls in Dynamic Island" : { + }, "Show on a specific display" : { "localizations" : { @@ -21115,6 +22207,9 @@ } } } + }, + "Show panel border" : { + }, "Show Percentage" : { "localizations" : { @@ -21125,6 +22220,15 @@ } } } + }, + "Show percentages beside progress bars" : { + + }, + "Show power status icons" : { + + }, + "Show power status notifications" : { + }, "Show preset list in timer tab" : { "comment" : "A toggle that lets users decide whether to show a list of presets in the timer tab.", @@ -21147,6 +22251,9 @@ } } } + }, + "Show Recording Indicator" : { + }, "Show shuffle and repeat buttons" : { "extractionState" : "stale", @@ -21260,6 +22367,9 @@ } } } + }, + "Show sunrise time" : { + }, "Show the active Focus name inside the indicator." : { "comment" : "A description of why the \"Show Focus Label\" toggle is disabled when the \"Show Focus as brief toast\" toggle is enabled.", @@ -21293,6 +22403,14 @@ } } }, + "Shows screen assistant as a dropdown attached to the AI button" : { + "comment" : "Description of the \"Popover\" screen assistant display mode.", + "isCommentAutoGenerated" : true + }, + "Shows screen assistant in a floating panel near the notch" : { + "comment" : "Description of the \"panel\" display mode for the screen assistant.", + "isCommentAutoGenerated" : true + }, "Shows the model's reasoning process before the final answer" : { "localizations" : { "fr" : { @@ -21318,6 +22436,13 @@ } } } + }, + "Shrinks the lock screen media panel while keeping the expanded view full width." : { + "comment" : "Help text for adjusting the width of the lock screen media panel.", + "isCommentAutoGenerated" : true + }, + "Simple and minimal interface with just the essentials for everyday tasks." : { + }, "Size & Scale" : { "extractionState" : "stale", @@ -21339,6 +22464,9 @@ } } } + }, + "skip" : { + }, "Skip buttons" : { "comment" : "A section header that lists the skip behaviour options.", @@ -21351,6 +22479,13 @@ } } } + }, + "Skip forward or backward by ten seconds" : { + "comment" : "Description of the \"Skip forward or backward by ten seconds\" music skip behavior option.", + "isCommentAutoGenerated" : true + }, + "slider" : { + }, "Slider color" : { "localizations" : { @@ -21451,6 +22586,12 @@ } } } + }, + "smooth" : { + + }, + "Smooth color transitions" : { + }, "Smooth transitions blend Green (0–60%), Yellow (60–85%), and Red (85–100%) through the entire fill." : { "comment" : "A description of how the color-coding feature works.", @@ -21473,6 +22614,9 @@ } } } + }, + "sneak peek" : { + }, "Sneak peek duration" : { "comment" : "A label describing the duration of the \"sneak peek\" feature in the calendar settings.", @@ -21797,6 +22941,9 @@ } } } + }, + "solid" : { + }, "Solid colour" : { "localizations" : { @@ -21807,6 +22954,15 @@ } } } + }, + "song text" : { + + }, + "sound" : { + + }, + "spectrogram" : { + }, "Speed" : { "localizations" : { @@ -21919,6 +23075,10 @@ } } }, + "Spotify" : { + "comment" : "Name of a media controller type for Spotify.", + "isCommentAutoGenerated" : true + }, "Square" : { "localizations" : { "ar" : { @@ -22018,12 +23178,22 @@ } } } + }, + "standard" : { + + }, + "Standard" : { + }, "Standard notch media controls are hidden while this toggle is off." : { }, "Standard notch media controls are hidden. Re-enable the toggle above to restore them." : { + }, + "Standard previous/next track controls" : { + "comment" : "Description of a music skip behavior option that uses standard previous/next track controls.", + "isCommentAutoGenerated" : true }, "Start" : { "localizations" : { @@ -22164,6 +23334,12 @@ } } } + }, + "startup" : { + + }, + "stats" : { + }, "Stats" : { "localizations" : { @@ -22278,11 +23454,17 @@ } } } + }, + "status bar" : { + }, "Status:" : { "comment" : "A label for the status of an extension.", "isCommentAutoGenerated" : true, "shouldTranslate" : false + }, + "Stay organized with calendar, timer, and battery monitoring." : { + }, "Stop" : { "localizations" : { @@ -22315,6 +23497,9 @@ } } } + }, + "Stop monitoring after closing the notch" : { + }, "Stop recording" : { "localizations" : { @@ -22431,6 +23616,13 @@ } } } + }, + "Student" : { + "comment" : "Name of a user profile for a student.", + "isCommentAutoGenerated" : true + }, + "style" : { + }, "Style" : { "localizations" : { @@ -22601,6 +23793,9 @@ } } } + }, + "swipe" : { + }, "System" : { "comment" : "A label displayed above the system, load average, and uptime information.", @@ -22731,6 +23926,13 @@ } } }, + "system timer" : { + + }, + "Tab" : { + "comment" : "Name of the \"Tab\" display mode.", + "isCommentAutoGenerated" : true + }, "Take area screenshot" : { "localizations" : { "fr" : { @@ -22757,6 +23959,10 @@ } } }, + "Text" : { + "comment" : "Name of a clipboard item type that contains plain text.", + "isCommentAutoGenerated" : true + }, "TheDynamicIsland" : { "shouldTranslate" : false }, @@ -22782,6 +23988,9 @@ } } } + }, + "third party" : { + }, "Third-party apps using AtollExtensionKit can display live activities, lock screen widgets, and dedicated notch experiences. Toggle features above or manage individual app permissions below." : { "comment" : "A footer text that explains the purpose of the \"Global Settings\" section in the Extensions settings view.", @@ -22939,6 +24148,9 @@ } } } + }, + "timer" : { + }, "Timer" : { "localizations" : { @@ -22955,6 +24167,9 @@ } } } + }, + "timer colour" : { + }, "Timer controls appear as" : { "comment" : "A picker that lets the user choose how the timer controls are displayed.", @@ -23015,6 +24230,9 @@ } } } + }, + "timer glass" : { + }, "Timer glass material" : { "comment" : "A label displayed above a picker for selecting the material of the timer glass.", @@ -23039,6 +24257,9 @@ } } } + }, + "timer material" : { + }, "Timer Presets" : { "comment" : "A section header in the timer settings view, describing timer presets.", @@ -23089,6 +24310,12 @@ } } } + }, + "timer variant" : { + + }, + "timer widget" : { + }, "Timer Widget" : { "comment" : "A section header for the timer widget settings.", @@ -23112,6 +24339,10 @@ } } }, + "Timer Widget Width" : { + "comment" : "Title of a slider that adjusts the width of the lock screen timer widget.", + "isCommentAutoGenerated" : true + }, "Title" : { "comment" : "A label for the title input field in the note editor.", "isCommentAutoGenerated" : true, @@ -23123,6 +24354,9 @@ } } } + }, + "titles" : { + }, "Toggle Notch Open:" : { "localizations" : { @@ -23335,6 +24569,9 @@ } } } + }, + "toolbar" : { + }, "Total · %@" : { "comment" : "A label displaying the total storage capacity of a disk device. The argument is the total storage capacity of the disk device.", @@ -23354,6 +24591,13 @@ } }, "shouldTranslate" : false + }, + "Track Skip" : { + "comment" : "Display name for the \"Track Skip\" music skip behavior option.", + "isCommentAutoGenerated" : true + }, + "trackpad" : { + }, "Transform" : { "extractionState" : "stale", @@ -23408,9 +24652,6 @@ } } } - }, - "Turn off 'Show event for entire duration' to use the post-start duration option." : { - }, "Turn on customizable controls to rearrange media buttons." : { "comment" : "A description of the feature that allows users to rearrange the order of media buttons.", @@ -23537,6 +24778,9 @@ } } } + }, + "ui mode" : { + }, "UI Mode" : { "localizations" : { @@ -23655,6 +24899,10 @@ } } }, + "Unknown" : { + "comment" : "Description of a calendar authorization status that is not explicitly listed.", + "isCommentAutoGenerated" : true + }, "Unlock advanced features and improve your experience. Upgrade now for more customizations!" : { "localizations" : { "ar" : { @@ -23855,6 +25103,10 @@ } } }, + "Unplugged" : { + "comment" : "Text displayed in a notification when the device is plugged in.", + "isCommentAutoGenerated" : true + }, "Update interval" : { "localizations" : { "pt-BR" : { @@ -24001,6 +25253,10 @@ }, "shouldTranslate" : false }, + "URL" : { + "comment" : "Name of a clipboard item type that represents a URL.", + "isCommentAutoGenerated" : true + }, "Usage" : { "comment" : "A label displayed above the CPU usage statistics.", "isCommentAutoGenerated" : true, @@ -24036,6 +25292,9 @@ } } } + }, + "Use accent color" : { + }, "Use Accent Color" : { "localizations" : { @@ -24046,6 +25305,15 @@ } } } + }, + "Use circular battery indicator" : { + + }, + "Use colored gauges" : { + + }, + "Use MacBook icon when on battery" : { + }, "Use music visualizer spectrogram" : { "localizations" : { @@ -24146,6 +25414,9 @@ } } } + }, + "Use simpler close animation" : { + }, "Use the Media tab to configure sneak peek, lyrics, and floating media controls." : { "comment" : "A footer for the \"Media Live Activity\" section, explaining how to configure the media controls.", @@ -24456,7 +25727,7 @@ } } }, - "Vertical offset" : { + "Vertical Bar" : { }, "Vertical:" : { @@ -24576,6 +25847,9 @@ } } } + }, + "volume" : { + }, "Volume" : { "comment" : "A button that sets the preview to show a volume OSD.", @@ -24616,6 +25890,13 @@ } } } + }, + "W " : { + "comment" : "Label for the write data point in the disk usage graph.", + "isCommentAutoGenerated" : true + }, + "weather" : { + }, "Weather" : { "comment" : "A label and its accompanying text displayed in a lock screen panel.", @@ -24638,6 +25919,12 @@ } } } + }, + "weather layout" : { + + }, + "weather widget" : { + }, "Weather Widget" : { "comment" : "A section header in the Lock Screen Settings view.", @@ -24926,6 +26213,12 @@ } } } + }, + "white" : { + + }, + "White" : { + }, "Widget Updates" : { "comment" : "A label describing the number of times the extension has updated its widget.", @@ -24939,6 +26232,16 @@ } } }, + "widgets" : { + + }, + "width" : { + + }, + "Width adjustments apply only to the standard notch layout. Disable Minimalistic UI to edit this value." : { + "comment" : "Description of the notch width controls, explaining that width adjustments only apply to the standard notch layout and that the user must disable the Minimalistic UI setting to edit the notch width.", + "isCommentAutoGenerated" : true + }, "Width:" : { "extractionState" : "stale", "localizations" : { @@ -24976,6 +26279,10 @@ } } }, + "Works with most media apps, including browsers, to detect what's playing. Note: This may be removed in a future macOS version." : { + "comment" : "Description of a media controller type when it works with most media apps, including browsers, to detect what's playing. Note: This may be removed in a future macOS version.", + "isCommentAutoGenerated" : true + }, "Write" : { "comment" : "A label for the write section of the disk overview.", "isCommentAutoGenerated" : true, @@ -24993,6 +26300,13 @@ } } } + }, + "Write Only" : { + "comment" : "Description of a calendar authorization status when the app has write-only access to the user's calendar.", + "isCommentAutoGenerated" : true + }, + "wttr" : { + }, "You" : { "localizations" : { @@ -25211,7 +26525,6 @@ } }, "Your calendar data is only used to show your events and is never shared." : { - "extractionState" : "stale", "localizations" : { "pt-BR" : { "stringUnit" : { @@ -25222,7 +26535,6 @@ } }, "Your camera is never used without your consent, and nothing is recorded or stored." : { - "extractionState" : "stale", "localizations" : { "pt-BR" : { "stringUnit" : { @@ -25236,6 +26548,10 @@ "comment" : "A footer note explaining the app's funding.", "isCommentAutoGenerated" : true }, + "Youtube Music" : { + "comment" : "Name for the \"Youtube Music\" media controller type in settings.", + "isCommentAutoGenerated" : true + }, "YouTube Music requires this third-party app to be installed: " : { "localizations" : { "ar" : { From 422b24813200e78d05e2b4881df596136fcd4c0f Mon Sep 17 00:00:00 2001 From: Hariharan Mudaliar Date: Sun, 8 Feb 2026 14:28:04 +0530 Subject: [PATCH 26/26] Restore settings --- DynamicIsland/Localizable.xcstrings | 1070 +-------- .../components/Settings/SettingsView.swift | 1928 +++++++---------- 2 files changed, 898 insertions(+), 2100 deletions(-) diff --git a/DynamicIsland/Localizable.xcstrings b/DynamicIsland/Localizable.xcstrings index 7bd69af..c493d44 100644 --- a/DynamicIsland/Localizable.xcstrings +++ b/DynamicIsland/Localizable.xcstrings @@ -1590,9 +1590,6 @@ } } } - }, - "±10" : { - }, "±10 Seconds" : { "comment" : "Name of the music skip behavior that skips the current track within ±10 seconds.", @@ -1612,6 +1609,12 @@ "comment" : "A time displayed in the timer panel on a lock screen.", "isCommentAutoGenerated" : true, "shouldTranslate" : false + }, + "1 hour" : { + + }, + "1 min" : { + }, "1x" : { "extractionState" : "stale", @@ -1623,6 +1626,9 @@ } } } + }, + "2 hours" : { + }, "3 items" : { "localizations" : { @@ -1671,6 +1677,9 @@ } } } + }, + "5 mins" : { + }, "7 items" : { "localizations" : { @@ -1719,6 +1728,9 @@ } } } + }, + "10 mins" : { + }, "15 colors" : { "localizations" : { @@ -1735,6 +1747,9 @@ } } } + }, + "15 mins" : { + }, "20" : { "extractionState" : "stale", @@ -1773,6 +1788,12 @@ } } } + }, + "30 mins" : { + + }, + "45 mins" : { + }, "100" : { "comment" : "The text displayed below a 100% battery level in the lock screen.", @@ -1889,9 +1910,6 @@ } } } - }, - "accent" : { - }, "Accent" : { "comment" : "Name of the tint mode for the caps lock indicator that uses the accent color.", @@ -2118,13 +2136,6 @@ } } } - }, - "Accessibility permission lets Dynamic Island replace the native volume, brightness, and keyboard HUDs." : { - "comment" : "Message in a callout that explains the purpose of requesting accessibility permission.", - "isCommentAutoGenerated" : true - }, - "Accessibility permission required" : { - }, "Actions" : { "localizations" : { @@ -2776,13 +2787,6 @@ } } } - }, - "Adjusts the lock screen timer widget width without affecting button sizing." : { - "comment" : "Help text for adjusting the width of the lock screen timer widget.", - "isCommentAutoGenerated" : true - }, - "ai" : { - }, "AI Assistant" : { "localizations" : { @@ -2869,9 +2873,6 @@ } } } - }, - "air quality" : { - }, "Air quality index %d, %@" : { "comment" : "Air quality accessibility label", @@ -2909,9 +2910,6 @@ } } } - }, - "airdrop" : { - }, "AirDrop" : { "localizations" : { @@ -3114,13 +3112,7 @@ } } }, - "airplay" : { - - }, - "album art" : { - - }, - "alert" : { + "Alignment" : { }, "All" : { @@ -3132,9 +3124,6 @@ } } } - }, - "all-day" : { - }, "All-day" : { "localizations" : { @@ -3651,9 +3640,6 @@ } } } - }, - "app icon" : { - }, "App icon" : { "localizations" : { @@ -3766,9 +3752,6 @@ } } } - }, - "appearance" : { - }, "Appearance" : { "localizations" : { @@ -3883,9 +3866,6 @@ } } } - }, - "apps" : { - }, "Apps using AtollExtensionKit will appear here once they request permission" : { "comment" : "A description below the placeholder text in the \"Search extensions...\" text field, explaining that apps using AtollExtensionKit will be listed here once they grant permission to use the app.", @@ -3898,9 +3878,6 @@ } } } - }, - "aqi" : { - }, "AQI" : { "comment" : "Label for the US AQI scale in the lock screen weather view.", @@ -4012,9 +3989,6 @@ } } } - }, - "audio" : { - }, "Audio feedback" : { "comment" : "A section header that lists audio feedback settings.", @@ -4027,9 +4001,6 @@ } } } - }, - "authorization" : { - }, "Authorize" : { "comment" : "A button that authorizes an app extension.", @@ -4054,15 +4025,6 @@ } } } - }, - "auto open" : { - - }, - "auto stop" : { - - }, - "auto switch" : { - }, "Auto-scroll to next event" : { "comment" : "A toggle that enables or disables the automatic scrolling to the next event in the calendar view.", @@ -4275,12 +4237,6 @@ } } } - }, - "Automatically switch displays" : { - - }, - "autostart" : { - }, "Averages" : { "comment" : "A label displayed above the average usage and last update information for a GPU.", @@ -4299,9 +4255,6 @@ } } } - }, - "backlight" : { - }, "Backlight" : { "comment" : "A control for adjusting the keyboard backlight intensity.", @@ -4314,16 +4267,10 @@ } } } - }, - "bar" : { - }, "Bar" : { "comment" : "Localized name for \"Bar\" timer progress style.", "isCommentAutoGenerated" : true - }, - "battery" : { - }, "Battery" : { "localizations" : { @@ -4468,12 +4415,6 @@ } } } - }, - "battery gauge" : { - - }, - "battery hud" : { - }, "Battery Indicator Styling" : { "comment" : "A section header in the Settings app that lists options for customizing the appearance of the battery indicator.", @@ -4586,9 +4527,6 @@ } } } - }, - "battery percent" : { - }, "Battery Settings" : { "localizations" : { @@ -4799,9 +4737,6 @@ } } } - }, - "battery text" : { - }, "Battery Widget" : { "localizations" : { @@ -4827,9 +4762,6 @@ "comment" : "A label indicating a beta version.", "isCommentAutoGenerated" : true, "shouldTranslate" : false - }, - "black" : { - }, "Blue dashed box shows actual size in Atoll" : { "extractionState" : "stale", @@ -4859,9 +4791,6 @@ } } } - }, - "bluetooth" : { - }, "Bluetooth Audio Devices" : { "comment" : "A section header that lists Bluetooth audio devices.", @@ -4897,9 +4826,6 @@ } } } - }, - "blur" : { - }, "Boost your productivity with Clipboard Manager" : { "localizations" : { @@ -5051,9 +4977,6 @@ } } } - }, - "brightness" : { - }, "Brightness" : { "comment" : "A control that adjusts the brightness of the device.", @@ -5156,9 +5079,6 @@ } } } - }, - "calendar" : { - }, "Calendar" : { "localizations" : { @@ -5378,6 +5298,9 @@ } } } + }, + "Calendar Widget" : { + }, "Calendars" : { "localizations" : { @@ -5591,9 +5514,6 @@ } } } - }, - "celsius" : { - }, "Center" : { "extractionState" : "stale", @@ -5633,12 +5553,6 @@ } } } - }, - "charge" : { - - }, - "charging" : { - }, "Charging" : { "comment" : "Charging fallback label when no estimate is available", @@ -5744,9 +5658,6 @@ "Charging battery" : { "comment" : "Text displayed in the status text field when the device is charging.", "isCommentAutoGenerated" : true - }, - "charging icon" : { - }, "Charging on Hold: Desktop Mode" : { "localizations" : { @@ -5847,9 +5758,6 @@ } } } - }, - "charging percentage" : { - }, "Check for Updates…" : { "localizations" : { @@ -5950,9 +5858,6 @@ } } } - }, - "chime" : { - }, "Chip color" : { "comment" : "A label for the color of the chip in the lock screen reminder widget.", @@ -6228,9 +6133,6 @@ } } } - }, - "circle" : { - }, "Circle" : { "localizations" : { @@ -6331,16 +6233,10 @@ } } } - }, - "circular" : { - }, "Circular" : { "comment" : "Label for the \"Circular\" tab in the HUD and OSD settings view.", "isCommentAutoGenerated" : true - }, - "classic" : { - }, "Classic" : { "comment" : "Name of the timer surface mode in the lock screen that looks like a traditional stopwatch.", @@ -6602,9 +6498,6 @@ } } } - }, - "clipboard" : { - }, "Clipboard" : { "localizations" : { @@ -6685,12 +6578,6 @@ } } } - }, - "clock app" : { - - }, - "close" : { - }, "Close" : { "localizations" : { @@ -6791,9 +6678,6 @@ } } } - }, - "close animation" : { - }, "Close assistant" : { "localizations" : { @@ -6810,9 +6694,6 @@ } } } - }, - "Close gesture" : { - }, "Code and debug with color picker, stats monitoring, and screen assistant." : { "comment" : "Description of a user profile when the name is \"Developer\".", @@ -6829,9 +6710,6 @@ } } } - }, - "color" : { - }, "Color Details" : { "localizations" : { @@ -6848,9 +6726,6 @@ } } } - }, - "color formats" : { - }, "Color Formats" : { "localizations" : { @@ -6867,9 +6742,6 @@ } } } - }, - "color history" : { - }, "Color History" : { "localizations" : { @@ -6886,9 +6758,6 @@ } } } - }, - "color icon" : { - }, "Color options control the icon and progress bar appearance. Auto adapts to system theme." : { "comment" : "A description under the \"Appearance\" section of the Custom OSD settings, explaining that the color options control the icon and progress bar appearance, and that \"Auto\" automatically adapts to the system theme.", @@ -6917,9 +6786,6 @@ } } } - }, - "color picker" : { - }, "Color Picker" : { "localizations" : { @@ -6968,9 +6834,6 @@ } } } - }, - "Color-coded battery display" : { - }, "Color-coded fills and smooth gradients are unavailable in Segmented mode. Switch to Hierarchical or Gradient to adjust these options." : { "comment" : "An explanatory text that appears when the user tries to enable color-coded color gradients in Segmented progress bars. It instructs the user to switch to Hierarchical or Gradient progress bars to enable these features.", @@ -6995,9 +6858,6 @@ } } } - }, - "Color-coded volume display" : { - }, "ColorPicker Disabled" : { "localizations" : { @@ -7114,12 +6974,6 @@ } } } - }, - "compact" : { - - }, - "completed" : { - }, "Configuration" : { "localizations" : { @@ -7331,12 +7185,6 @@ } } } - }, - "controller" : { - - }, - "controls" : { - }, "Controls" : { "localizations" : { @@ -7363,6 +7211,9 @@ } } } + }, + "Controls the lock screen reminder chip and its positioning." : { + }, "Controls the optional timer widget that floats above the media panel, including its classic, frosted, or liquid glass surface independent of the global material setting." : { "localizations" : { @@ -7383,9 +7234,6 @@ } } } - }, - "copy" : { - }, "Copy event link" : { "comment" : "A tooltip for a button that copies the link of a reminder event to the clipboard.", @@ -7483,12 +7331,6 @@ } }, "shouldTranslate" : false - }, - "corner radius" : { - - }, - "Corner radius scaling" : { - }, "Countdown style" : { "comment" : "A label for the style of countdown to use when reminders are live.", @@ -7501,9 +7343,6 @@ } } } - }, - "cpu" : { - }, "CPU" : { "comment" : "Title for the CPU usage graph.", @@ -7635,12 +7474,6 @@ } } } - }, - "cursor" : { - - }, - "custom" : { - }, "Custom" : { "extractionState" : "stale", @@ -7669,9 +7502,6 @@ } } } - }, - "Custom Focus metadata" : { - }, "Custom height" : { "localizations" : { @@ -7772,9 +7602,6 @@ } } } - }, - "custom icon" : { - }, "Custom Liquid" : { @@ -8000,9 +7827,6 @@ } } } - }, - "custom osd" : { - }, "Custom OSD" : { "comment" : "The title of the settings screen for customizing the OSD.", @@ -8503,10 +8327,6 @@ } } }, - "Denied" : { - "comment" : "Description of a calendar authorization status when access is denied.", - "isCommentAutoGenerated" : true - }, "Denied/Revoked" : { "comment" : "A label describing an extension with denied or revoked permissions.", "isCommentAutoGenerated" : true, @@ -8631,6 +8451,9 @@ } } } + }, + "Deselect All" : { + }, "Designer" : { "comment" : "Name of a user profile for a designer.", @@ -8657,9 +8480,6 @@ "Developer" : { "comment" : "Name of a user profile.", "isCommentAutoGenerated" : true - }, - "device name" : { - }, "Devices" : { "comment" : "The title of the \"Devices\" section in the settings menu.", @@ -8672,9 +8492,6 @@ } } } - }, - "diagnostics" : { - }, "Diagnostics" : { "comment" : "A section header in the Lock Screen Settings view, describing diagnostics-related functionality.", @@ -8917,16 +8734,10 @@ } } } - }, - "disk" : { - }, "Disk" : { "comment" : "Title for the \"Disk\" section in the stats view.", "isCommentAutoGenerated" : true - }, - "Disk I/O" : { - }, "Disk Read" : { "localizations" : { @@ -8959,9 +8770,6 @@ } } } - }, - "display height" : { - }, "Display Mode" : { "localizations" : { @@ -8989,9 +8797,6 @@ } } } - }, - "displays" : { - }, "Displays a HUD notification when Bluetooth audio devices (headphones, AirPods, speakers) connect, showing device name and battery level." : { "comment" : "A footer for the \"Bluetooth Audio Devices\" section in the HUD settings.", @@ -9030,6 +8835,9 @@ } } } + }, + "Displays your next upcoming calendar event above or below the weather capsule. Calendar selection here is independent from the Dynamic Island calendar filter." : { + }, "Do Not Disturb" : { "localizations" : { @@ -9040,9 +8848,6 @@ } } } - }, - "dock" : { - }, "Donate" : { "comment" : "A button label that says \"Donate\".", @@ -9329,9 +9134,6 @@ } }, "shouldTranslate" : false - }, - "drag" : { - }, "Drag a control onto a slot or tap to place it in the first empty slot." : { "comment" : "A description below the control palette that explains how users can interact with it.", @@ -9472,13 +9274,6 @@ } } }, - "Dynamic Island" : { - - }, - "Dynamic Island HUD" : { - "comment" : "Titles for the tabs in the HUD and OSD settings view.", - "isCommentAutoGenerated" : true - }, "Dynamic Island Progress Bars" : { "comment" : "A section header that lists the options for customizing the appearance of the progress bars displayed by Dynamic Island.", "isCommentAutoGenerated" : true, @@ -9751,9 +9546,6 @@ } } } - }, - "enable" : { - }, "Enable \"Show cool face animation while inactivity\" to customize animations" : { "comment" : "A message displayed below the section header in the IdleAnimationsSettingsSection, explaining that users can customize animations by enabling this feature.", @@ -9766,12 +9558,6 @@ } } } - }, - "Enable album art parallax" : { - - }, - "Enable album art parallax effect" : { - }, "Enable and style the media controls that appear above the system clock when the screen is locked." : { "comment" : "A description of the media panel settings in the lock screen settings view.", @@ -9784,9 +9570,6 @@ } } } - }, - "Enable blur effect behind album art" : { - }, "Enable Built-in System HUD" : { "extractionState" : "stale", @@ -9829,21 +9612,9 @@ } } } - }, - "Enable Camera Detection" : { - - }, - "Enable Clipboard Manager" : { - - }, - "Enable Color Filtering" : { - "comment" : "Label for a toggle that enables or disables color filtering in the notes view.", - "isCommentAutoGenerated" : true - }, - "Enable Color Picker" : { - }, "Enable colored spectrograms" : { + "extractionState" : "stale", "localizations" : { "ar" : { "stringUnit" : { @@ -9958,13 +9729,6 @@ } } } - }, - "Enable Create from Clipboard" : { - "comment" : "Label for a toggle that enables the ability to create notes from text copied from the clipboard.", - "isCommentAutoGenerated" : true - }, - "Enable Custom OSD" : { - }, "Enable customizable controls" : { "comment" : "A toggle that allows users to enable or disable customizable controls for media playback.", @@ -9978,15 +9742,8 @@ } } }, - "Enable download detection" : { - "comment" : "Toggle to enable or disable download detection.", - "isCommentAutoGenerated" : true - }, "Enable Dynamic Island media controls to manage the lock screen panel." : { - }, - "Enable Dynamic mirror" : { - }, "Enable extension diagnostics logging" : { "comment" : "A toggle that enables or disables logging of diagnostic information related to extensions.", @@ -10003,15 +9760,6 @@ } } } - }, - "Enable Focus Detection" : { - - }, - "Enable gestures" : { - - }, - "Enable global keyboard shortcuts" : { - }, "Enable global keyboard shortcuts above to customize your shortcuts." : { "localizations" : { @@ -10022,9 +9770,6 @@ } } } - }, - "Enable glowing effect" : { - }, "Enable graph visibility in Settings → Stats to view performance data." : { "comment" : "A message displayed when no graphs are enabled in the Stats tab.", @@ -10039,6 +9784,7 @@ } }, "Enable haptics" : { + "extractionState" : "stale", "localizations" : { "ar" : { "stringUnit" : { @@ -10238,12 +9984,6 @@ } } } - }, - "Enable lock screen live activity" : { - - }, - "Enable lyrics" : { - }, "Enable media panel blur" : { "comment" : "A toggle switch that enables or disables the blur effect on the media panel.", @@ -10256,12 +9996,6 @@ } } } - }, - "Enable Microphone Detection" : { - - }, - "Enable Minimalistic UI" : { - }, "Enable music live activity" : { "localizations" : { @@ -10362,24 +10096,6 @@ } } } - }, - "Enable Note Pinning" : { - "comment" : "Label for a toggle switch in the Notes settings view that enables or disables note pinning.", - "isCommentAutoGenerated" : true - }, - "Enable Note Search" : { - "comment" : "Label for a toggle that enables or disables note search functionality.", - "isCommentAutoGenerated" : true - }, - "Enable Notes" : { - "comment" : "Label for a toggle switch that enables or disables the notes feature.", - "isCommentAutoGenerated" : true - }, - "Enable reminder live activity" : { - - }, - "Enable Screen Assistant" : { - }, "Enable screen color picking functionality. Use Cmd+Shift+P to quickly access the color picker." : { "localizations" : { @@ -10390,12 +10106,6 @@ } } } - }, - "Enable Screen Recording Detection" : { - - }, - "Enable shelf" : { - }, "Enable sneak peek" : { "localizations" : { @@ -10422,9 +10132,6 @@ } } } - }, - "Enable system stats monitoring" : { - }, "Enable the battery capsule and configure its layout." : { "localizations" : { @@ -10473,9 +10180,6 @@ "Enable third-party extensions" : { "comment" : "Toggle to enable or disable third-party extensions.", "isCommentAutoGenerated" : true - }, - "Enable timer feature" : { - }, "Enable timer live activity" : { "localizations" : { @@ -10496,9 +10200,6 @@ } } } - }, - "Enable window shadow" : { - }, "Engine Utilization" : { "comment" : "A label describing the utilization of the GPU's engine components.", @@ -10849,9 +10550,6 @@ } } } - }, - "events" : { - }, "Exclude apps" : { "extractionState" : "stale", @@ -10991,9 +10689,6 @@ } } } - }, - "expanded notch" : { - }, "Expanded notch width" : { "comment" : "A label describing the expanded notch width setting.", @@ -11007,13 +10702,6 @@ } } }, - "Extend hover area" : { - - }, - "Extend the notch span so the clipboard, colour picker, and other trailing icons remain visible on scaled displays (e.g. More Space)." : { - "comment" : "Help text for the \"Notch Width\" section in the \"Appearance\" tab of the settings.", - "isCommentAutoGenerated" : true - }, "Extension tab unavailable" : { "comment" : "A message displayed when the extension tab is not available.", "isCommentAutoGenerated" : true, @@ -11025,9 +10713,6 @@ } } } - }, - "extensions" : { - }, "Extensions" : { "localizations" : { @@ -11146,22 +10831,10 @@ } } } - }, - "eyedropper" : { - - }, - "face animation" : { - - }, - "fahrenheit" : { - }, "Favorites" : { "comment" : "Localized name of the \"Favorites\" tab in the clipboard.", "isCommentAutoGenerated" : true - }, - "feedback" : { - }, "File" : { "comment" : "Display name for a \"File\" clipboard item type.", @@ -11364,23 +11037,17 @@ } } } - }, - "frosted" : { - }, "Frosted Glass" : { "comment" : "The name of the frosted glass style.", "isCommentAutoGenerated" : true }, - "Full Access" : { - "comment" : "Text describing the status of calendar access when the user has full access.", - "isCommentAutoGenerated" : true - }, "Full charge" : { "comment" : "Text displayed in the status text when the battery is fully charged.", "isCommentAutoGenerated" : true }, "Full Disk Access required" : { + "extractionState" : "stale", "localizations" : { "pt-BR" : { "stringUnit" : { @@ -11389,9 +11056,6 @@ } } } - }, - "Full Disk Access unlocks custom Focus icons, colors, and labels. Standard Focus detection still works without it—grant access only if you need personalized indicators." : { - }, "Fully charged" : { "comment" : "Charging fallback label when already charged", @@ -11403,12 +11067,6 @@ } } } - }, - "gauge" : { - - }, - "gauge tint" : { - }, "Gemini API Key" : { "localizations" : { @@ -11425,9 +11083,6 @@ } } } - }, - "general" : { - }, "General" : { "localizations" : { @@ -11740,9 +11395,6 @@ } } } - }, - "gestures" : { - }, "Get started" : { "localizations" : { @@ -11960,9 +11612,6 @@ } }, "shouldTranslate" : false - }, - "glass" : { - }, "Glass" : { "comment" : "Name of the timer surface mode that uses a glass effect.", @@ -11989,9 +11638,6 @@ } } } - }, - "glow" : { - }, "Got it!" : { "localizations" : { @@ -12092,9 +11738,6 @@ } } } - }, - "gpu" : { - }, "GPU" : { "comment" : "Title for the GPU usage graph.", @@ -12115,9 +11758,6 @@ } } } - }, - "gradient" : { - }, "Gradient" : { "localizations" : { @@ -12218,13 +11858,6 @@ } } } - }, - "Grant Full Disk Access so the Shelf can index and move files outside the app sandbox." : { - "comment" : "Message in a settings permission callout explaining why Full Disk Access is needed for the Shelf.", - "isCommentAutoGenerated" : true - }, - "graph" : { - }, "Graph Visibility" : { "localizations" : { @@ -12241,22 +11874,10 @@ } } } - }, - "graphics" : { - - }, - "gray" : { - }, "Green" : { "comment" : "Display name for the \"Green\" caps lock indicator tint mode.", "isCommentAutoGenerated" : true - }, - "grid" : { - - }, - "haptic" : { - }, "Height:" : { "extractionState" : "stale", @@ -12284,9 +11905,6 @@ } } } - }, - "hex" : { - }, "Hide" : { "localizations" : { @@ -12327,9 +11945,6 @@ } } } - }, - "Hide Dynamic Island during screenshots & recordings" : { - }, "Hide DynamicIsland Options" : { "localizations" : { @@ -12657,9 +12272,6 @@ } } } - }, - "history" : { - }, "History" : { "comment" : "Localized name of each tab in the clipboard view.", @@ -12692,19 +12304,6 @@ } }, "shouldTranslate" : false - }, - "Hours" : { - "comment" : "Labels and steppers for adjusting the duration of the custom timer.", - "isCommentAutoGenerated" : true - }, - "hover" : { - - }, - "hover to open" : { - - }, - "hsl" : { - }, "https://example.com/animation.json" : { "comment" : "A placeholder text for a Lottie JSON URL input field.", @@ -12819,9 +12418,6 @@ } }, "shouldTranslate" : false - }, - "hud" : { - }, "HUD Position" : { "localizations" : { @@ -13034,9 +12630,6 @@ } }, "shouldTranslate" : false - }, - "icon" : { - }, "Icon & Progress Color" : { "comment" : "A picker that lets users choose the color scheme for the icon and progress bar in the OSD.", @@ -13049,9 +12642,6 @@ } } } - }, - "idle" : { - }, "Idle" : { "comment" : "A label displayed alongside the status of a GPU device.", @@ -13260,12 +12850,6 @@ } } } - }, - "indicator" : { - - }, - "inline" : { - }, "Inline" : { "localizations" : { @@ -13504,9 +13088,6 @@ } } } - }, - "io" : { - }, "IPv4 · %@" : { "comment" : "A label displaying an IP address for a network interface. The text inside the parentheses is the IP address of the interface.", @@ -13551,9 +13132,6 @@ "Just now" : { "comment" : "A string indicating that an action was performed just recently.", "isCommentAutoGenerated" : true - }, - "keyboard" : { - }, "Keyboard Backlight HUD" : { "localizations" : { @@ -13610,9 +13188,6 @@ } } } - }, - "laptop icon" : { - }, "Last Denied Reason:" : { "comment" : "A label for the \"Last Denied Reason\" section in the extensions settings view.", @@ -13741,9 +13316,6 @@ } } } - }, - "Launch at login" : { - }, "Layout" : { "comment" : "A label for the segment control that lets the user choose the layout of the weather widget.", @@ -13806,9 +13378,6 @@ } }, "shouldTranslate" : false - }, - "liquid" : { - }, "Liquid Glass" : { "comment" : "Name of the \"Liquid Glass\" lock screen glass style.", @@ -13829,9 +13398,6 @@ } } } - }, - "list" : { - }, "Listens for Focus session changes via distributed notifications" : { "localizations" : { @@ -13854,9 +13420,6 @@ } } } - }, - "live activities" : { - }, "Live Activities" : { "comment" : "The title of the \"Live Activities\" screen.", @@ -13869,9 +13432,6 @@ } } } - }, - "live activity" : { - }, "Live Activity & Feedback" : { "comment" : "The header for the \"Live Activity & Feedback\" section in the lock screen settings.", @@ -13953,12 +13513,6 @@ } } } - }, - "location" : { - - }, - "lock screen" : { - }, "Lock Screen" : { "localizations" : { @@ -14017,9 +13571,6 @@ } } } - }, - "lock screen media" : { - }, "Lock Screen Media" : { "localizations" : { @@ -14066,9 +13617,6 @@ } } } - }, - "lock screen timer" : { - }, "Lock Screen Widgets" : { "comment" : "A toggle that enables or disables the use of lock screen widgets by the extension.", @@ -14081,9 +13629,6 @@ } } } - }, - "logging" : { - }, "Loop Mode" : { "localizations" : { @@ -14295,9 +13840,6 @@ } } } - }, - "low battery" : { - }, "Low battery" : { "comment" : "Text displayed when the battery level drops below a certain threshold.", @@ -14406,9 +13948,6 @@ "Low Power: %@" : { "comment" : "Text displayed in a status label at the top of the screen indicating whether low power mode is on or off.", "isCommentAutoGenerated" : true - }, - "lyrics" : { - }, "Mac battery at %d percent" : { "comment" : "Mac battery gauge accessibility label", @@ -14444,9 +13983,6 @@ } } } - }, - "Manage app permissions" : { - }, "Manage indicator preferences from Settings → Privacy. No manual microphone toggle is required." : { "comment" : "A description of how to manage the microphone privacy indicator preferences.", @@ -14459,9 +13995,6 @@ } } } - }, - "manager" : { - }, "Mark as complete" : { "comment" : "An accessibility label for a button that marks an item as complete.", @@ -14486,9 +14019,6 @@ } } } - }, - "marquee" : { - }, "Match menubar height" : { "localizations" : { @@ -14689,9 +14219,6 @@ } } } - }, - "material" : { - }, "Material" : { "comment" : "A picker that lets the user select the material of the lock screen glass.", @@ -14809,9 +14336,6 @@ } } } - }, - "media" : { - }, "Media" : { "localizations" : { @@ -14915,6 +14439,7 @@ }, "Media change with horizontal gestures" : { "comment" : "A toggle that lets the user enable or disable the feature of changing the currently playing media using horizontal gestures.", + "extractionState" : "stale", "isCommentAutoGenerated" : true, "localizations" : { "ar" : { @@ -15226,9 +14751,6 @@ } } } - }, - "media output" : { - }, "Media output" : { "comment" : "Accessibility label describing the control that opens the media output selector.", @@ -15241,9 +14763,6 @@ } } } - }, - "media panel" : { - }, "Media Panel" : { "comment" : "A section header in the lock screen settings view.", @@ -15257,10 +14776,6 @@ } } }, - "Media Panel Width" : { - "comment" : "Title of a slider that adjusts the width of the lock screen media panel.", - "isCommentAutoGenerated" : true - }, "Media playback live activity" : { "localizations" : { "ar" : { @@ -15360,9 +14875,6 @@ } } } - }, - "media source" : { - }, "Media Source" : { "localizations" : { @@ -15574,9 +15086,6 @@ } } } - }, - "memory" : { - }, "Memory" : { "comment" : "Title of the memory usage single value graph.", @@ -15597,14 +15106,9 @@ } } } - }, - "menu bar" : { - - }, - "menu bar size" : { - }, "Menubar icon" : { + "extractionState" : "stale", "localizations" : { "ar" : { "stringUnit" : { @@ -15918,9 +15422,6 @@ } } } - }, - "minimalistic" : { - }, "Minimalistic mode focuses on media controls and system HUDs, hiding all extra features for a clean, focused experience. Automatically enables simpler animations." : { "localizations" : { @@ -16041,9 +15542,6 @@ } } } - }, - "mirror" : { - }, "Mirror" : { "localizations" : { @@ -16156,9 +15654,6 @@ } } } - }, - "mirror shape" : { - }, "Mirror shape" : { "localizations" : { @@ -16269,9 +15764,6 @@ } } } - }, - "mode" : { - }, "Monitor clipboard changes and keep a history of recent copies. Use Cmd+Shift+V to quickly access clipboard history." : { "localizations" : { @@ -16294,9 +15786,6 @@ } } } - }, - "monitoring" : { - }, "Monitoring Behavior" : { "localizations" : { @@ -16334,9 +15823,6 @@ } } } - }, - "monochrome" : { - }, "More" : { "localizations" : { @@ -16462,10 +15948,6 @@ } } }, - "Music" : { - "comment" : "Title for the \"Music\" column in the lock screen positioning controls.", - "isCommentAutoGenerated" : true - }, "Music panel variant" : { "localizations" : { "pt-BR" : { @@ -16909,16 +16391,10 @@ } } } - }, - "network" : { - }, "Network" : { "comment" : "Title for the \"Network\" section in the stats view.", "isCommentAutoGenerated" : true - }, - "Network Activity" : { - }, "Network Download" : { "localizations" : { @@ -17816,10 +17292,6 @@ "comment" : "Text displayed in the status text when the battery is not charging.", "isCommentAutoGenerated" : true }, - "Not Determined" : { - "comment" : "Title of the section in the settings view that allows the user to determine if the app has access to their calendar.", - "isCommentAutoGenerated" : true - }, "Not Now" : { "localizations" : { "ar" : { @@ -17929,9 +17401,6 @@ } } } - }, - "notch" : { - }, "Notch behavior" : { "localizations" : { @@ -18261,9 +17730,6 @@ } } } - }, - "notifications" : { - }, "Notify before" : { "comment" : "A label describing the slider that allows the user to set a reminder lead time.", @@ -18389,9 +17855,6 @@ "On" : { "comment" : "Status text that indicates whether low power mode is on or off.", "isCommentAutoGenerated" : true - }, - "on-screen display" : { - }, "One or more files failed to load" : { "localizations" : { @@ -18538,9 +18001,6 @@ } } } - }, - "open" : { - }, "Open Google AI Studio" : { "localizations" : { @@ -18563,9 +18023,6 @@ } } } - }, - "open meteo" : { - }, "Open Model Settings" : { "localizations" : { @@ -18576,20 +18033,6 @@ } } } - }, - "Open notch on hover" : { - - }, - "Open Privacy & Security" : { - "comment" : "Title of the button that opens the user's system settings to grant the requested permission.", - "isCommentAutoGenerated" : true - }, - "Open Settings" : { - "comment" : "Title of a button that opens the user's system settings.", - "isCommentAutoGenerated" : true - }, - "Open shelf tab by default if items added" : { - }, "Open System Settings" : { "localizations" : { @@ -18630,9 +18073,6 @@ } } } - }, - "osd" : { - }, "Output devices" : { "comment" : "Section title for the list of available audio output devices in the media output selector.", @@ -18673,9 +18113,6 @@ "Panel" : { "comment" : "Display name for the \"Panel\" clipboard display mode.", "isCommentAutoGenerated" : true - }, - "panel border" : { - }, "Panel mode shows clipboard in a floating window near the notch." : { "comment" : "A description of the \"Panel\" clipboard display mode.", @@ -18708,12 +18145,6 @@ } } } - }, - "parallax" : { - - }, - "parallax effect" : { - }, "Pause" : { "shouldTranslate" : false @@ -18739,9 +18170,6 @@ } } } - }, - "percentages" : { - }, "Permission States:" : { "comment" : "A label describing the different permission states displayed in the footer of the extensions settings view.", @@ -18754,9 +18182,6 @@ } } } - }, - "permissions" : { - }, "Permissions" : { "localizations" : { @@ -18847,9 +18272,6 @@ } } } - }, - "pinch" : { - }, "Pinned Items" : { "localizations" : { @@ -18860,19 +18282,6 @@ } } } - }, - "Play feedback when volume is changed" : { - "comment" : "Toggle to enable or disable audio feedback when the volume is changed.", - "isCommentAutoGenerated" : true - }, - "Play lock/unlock sounds" : { - - }, - "Play low battery alert sound" : { - - }, - "Player tinting" : { - }, "Plays the supplied feedback clip whenever you press the hardware volume keys." : { "comment" : "A help text describing the audio feedback feature.", @@ -19047,15 +18456,6 @@ } } } - }, - "power" : { - - }, - "power icons" : { - - }, - "preset" : { - }, "Preset name" : { "comment" : "A label for the name of a timer preset.", @@ -19110,9 +18510,6 @@ } } } - }, - "preview" : { - }, "Preview" : { "localizations" : { @@ -19141,9 +18538,6 @@ } } } - }, - "privacy" : { - }, "Privacy Indicators" : { "comment" : "A heading for the section that lists privacy indicators.", @@ -19168,9 +18562,6 @@ } } } - }, - "progress" : { - }, "Progress" : { "comment" : "Name of the download indicator style that shows a progress bar.", @@ -19550,9 +18941,6 @@ "R " : { "comment" : "Label for the read data in the disk usage graph.", "isCommentAutoGenerated" : true - }, - "ram" : { - }, "Re-authorize" : { "comment" : "A button that re-authorizes an app when pressed.", @@ -19643,9 +19031,6 @@ } } } - }, - "recording" : { - }, "Recording" : { "localizations" : { @@ -19696,12 +19081,6 @@ } } } - }, - "rectangle" : { - - }, - "reflection" : { - }, "Release name" : { "localizations" : { @@ -19902,15 +19281,6 @@ } } } - }, - "reminder" : { - - }, - "reminder chip" : { - - }, - "reminder countdown" : { - }, "Reminder Live Activity" : { "comment" : "A section header that lists the options related to live activity notifications for reminders.", @@ -19924,7 +19294,7 @@ } } }, - "reminder widget" : { + "Reminder Widget" : { }, "Reminders" : { @@ -19942,9 +19312,6 @@ } } } - }, - "remove" : { - }, "Remove" : { "comment" : "A button that removes an extension from the authorized list.", @@ -20009,10 +19376,6 @@ } } }, - "Request Full Disk Access" : { - "comment" : "Titles for the buttons in the permission callout.", - "isCommentAutoGenerated" : true - }, "Requires a third-party client with API plugin enabled." : { "comment" : "Description of a music controller type when it requires a third-party client with an API plugin enabled.", "isCommentAutoGenerated" : true @@ -20083,14 +19446,6 @@ } } }, - "Reset Media Width" : { - "comment" : "Title for a button that resets the width of the lock screen media panel to its default value.", - "isCommentAutoGenerated" : true - }, - "Reset Music" : { - "comment" : "Title for a button that resets the offset of the music section in the lock screen.", - "isCommentAutoGenerated" : true - }, "Reset Notch Experiences" : { "comment" : "A menu item that resets all notch experiences for a particular app.", "isCommentAutoGenerated" : true, @@ -20115,14 +19470,6 @@ } } }, - "Reset Timer" : { - "comment" : "Title for a button that resets the offset of the timer widget in the lock screen.", - "isCommentAutoGenerated" : true - }, - "Reset Timer Width" : { - "comment" : "Title for a button that resets the width of the lock screen timer widget to its default value.", - "isCommentAutoGenerated" : true - }, "Reset to Default" : { "localizations" : { "fr" : { @@ -20151,10 +19498,6 @@ } } }, - "Reset Weather" : { - "comment" : "Label for resetting the vertical offset of the weather section in the lock screen positioning controls.", - "isCommentAutoGenerated" : true - }, "Reset Width" : { "comment" : "A button to reset the expanded notch width to its default value.", "isCommentAutoGenerated" : true, @@ -20166,9 +19509,6 @@ } } } - }, - "resize" : { - }, "Restart" : { "extractionState" : "stale", @@ -20323,10 +19663,6 @@ } } }, - "Restricted" : { - "comment" : "Description of a calendar authorization status when access is restricted.", - "isCommentAutoGenerated" : true - }, "Resume" : { "localizations" : { "fr" : { @@ -20342,19 +19678,6 @@ } } } - }, - "reverse" : { - - }, - "Reverse open/close scroll gestures" : { - "comment" : "Label for a toggle that allows the user to reverse the behavior of scrolling up and down to open and close the app's window.", - "isCommentAutoGenerated" : true - }, - "Reverse scroll gestures" : { - - }, - "Reverse swipe gestures" : { - }, "Revoke Access" : { "comment" : "A button that revokes access to an app.", @@ -20381,9 +19704,6 @@ } } } - }, - "ring" : { - }, "Ring" : { "comment" : "Name of the timer progress style that shows a ring animation.", @@ -20399,9 +19719,6 @@ } } } - }, - "route picker" : { - }, "Running" : { "extractionState" : "stale", @@ -20561,9 +19878,6 @@ } } } - }, - "scale" : { - }, "Scale Down" : { "localizations" : { @@ -20607,9 +19921,6 @@ } } } - }, - "screen assistant" : { - }, "Screen Assistant" : { "localizations" : { @@ -20666,9 +19977,6 @@ } } } - }, - "screenshot" : { - }, "Screenshot options" : { "localizations" : { @@ -20701,9 +20009,6 @@ } } } - }, - "scroll" : { - }, "Scroll" : { "comment" : "A hint text that appears when scrolling horizontally in the control palette.", @@ -20716,9 +20021,6 @@ } } } - }, - "Scroll device name in HUD" : { - }, "Search clipboard..." : { "localizations" : { @@ -20822,6 +20124,7 @@ } }, "Seconds" : { + "extractionState" : "stale", "localizations" : { "fr" : { "stringUnit" : { @@ -21381,12 +20684,6 @@ } } } - }, - "settings button" : { - - }, - "Settings icon in notch" : { - }, "Settings…" : { "comment" : "A command that shows the settings window.", @@ -21399,18 +20696,6 @@ } } } - }, - "shadow" : { - - }, - "shape" : { - - }, - "share" : { - - }, - "shelf" : { - }, "Shelf" : { "localizations" : { @@ -21511,12 +20796,6 @@ } } } - }, - "shelf tab" : { - - }, - "shortcut" : { - }, "Shortcuts" : { "localizations" : { @@ -21617,17 +20896,9 @@ } } } - }, - "Show \"Change Media Output\" control" : { - - }, - "Show All Color Formats" : { - - }, - "Show AQI widget" : { - }, "Show battery indicator" : { + "extractionState" : "stale", "localizations" : { "ar" : { "stringUnit" : { @@ -21727,34 +20998,6 @@ } } }, - "Show battery percentage" : { - - }, - "Show battery percentage text in HUD" : { - - }, - "Show Bluetooth battery" : { - - }, - "Show Bluetooth device connections" : { - - }, - "Show calendar" : { - - }, - "Show Caps Lock Indicator" : { - - }, - "Show Caps Lock label" : { - - }, - "Show Change Media Output control" : { - - }, - "Show Character Count" : { - "comment" : "Label for a toggle that shows the character count of a note.", - "isCommentAutoGenerated" : true - }, "Show charging indicator" : { "extractionState" : "stale", "localizations" : { @@ -21771,15 +21014,6 @@ } } } - }, - "Show charging percentage" : { - - }, - "Show charging status" : { - - }, - "Show Clipboard Icon" : { - }, "Show Color History" : { "localizations" : { @@ -21796,9 +21030,6 @@ } } } - }, - "Show Color Picker Icon" : { - }, "Show Color Picker Panel" : { "localizations" : { @@ -21811,6 +21042,7 @@ } }, "Show cool face animation while inactivity" : { + "extractionState" : "stale", "localizations" : { "ar" : { "stringUnit" : { @@ -21942,13 +21174,19 @@ } } } + }, + "Show event after it starts" : { + + }, + "Show events from all calendars" : { + + }, + "Show events within the next" : { + }, "Show extension tabs" : { "comment" : "Label for a toggle that enables or disables the display of tabs in notch experiences.", "isCommentAutoGenerated" : true - }, - "Show floating media controls" : { - }, "Show floating pause/stop controls" : { "localizations" : { @@ -21959,18 +21197,6 @@ } } } - }, - "Show Focus as brief toast" : { - - }, - "Show Focus Indicator" : { - - }, - "Show Focus Label" : { - - }, - "Show focus widget" : { - }, "Show full event titles" : { "comment" : "A toggle that shows or hides the full event titles in the calendar view", @@ -21983,30 +21209,6 @@ } } } - }, - "Show location label" : { - - }, - "Show lock screen media panel" : { - - }, - "Show lock screen reminder" : { - - }, - "Show lock screen timer" : { - - }, - "Show lock screen timer widget" : { - - }, - "Show lock screen weather" : { - - }, - "Show media app icon" : { - - }, - "Show media controls in Dynamic Island" : { - }, "Show on a specific display" : { "localizations" : { @@ -22207,9 +21409,6 @@ } } } - }, - "Show panel border" : { - }, "Show Percentage" : { "localizations" : { @@ -22220,15 +21419,6 @@ } } } - }, - "Show percentages beside progress bars" : { - - }, - "Show power status icons" : { - - }, - "Show power status notifications" : { - }, "Show preset list in timer tab" : { "comment" : "A toggle that lets users decide whether to show a list of presets in the timer tab.", @@ -22251,9 +21441,6 @@ } } } - }, - "Show Recording Indicator" : { - }, "Show shuffle and repeat buttons" : { "extractionState" : "stale", @@ -22367,9 +21554,6 @@ } } } - }, - "Show sunrise time" : { - }, "Show the active Focus name inside the indicator." : { "comment" : "A description of why the \"Show Focus Label\" toggle is disabled when the \"Show Focus as brief toast\" toggle is enabled.", @@ -22437,10 +21621,6 @@ } } }, - "Shrinks the lock screen media panel while keeping the expanded view full width." : { - "comment" : "Help text for adjusting the width of the lock screen media panel.", - "isCommentAutoGenerated" : true - }, "Simple and minimal interface with just the essentials for everyday tasks." : { }, @@ -22464,9 +21644,6 @@ } } } - }, - "skip" : { - }, "Skip buttons" : { "comment" : "A section header that lists the skip behaviour options.", @@ -22483,9 +21660,6 @@ "Skip forward or backward by ten seconds" : { "comment" : "Description of the \"Skip forward or backward by ten seconds\" music skip behavior option.", "isCommentAutoGenerated" : true - }, - "slider" : { - }, "Slider color" : { "localizations" : { @@ -22586,12 +21760,6 @@ } } } - }, - "smooth" : { - - }, - "Smooth color transitions" : { - }, "Smooth transitions blend Green (0–60%), Yellow (60–85%), and Red (85–100%) through the entire fill." : { "comment" : "A description of how the color-coding feature works.", @@ -22614,9 +21782,6 @@ } } } - }, - "sneak peek" : { - }, "Sneak peek duration" : { "comment" : "A label describing the duration of the \"sneak peek\" feature in the calendar settings.", @@ -22941,9 +22106,6 @@ } } } - }, - "solid" : { - }, "Solid colour" : { "localizations" : { @@ -22954,15 +22116,6 @@ } } } - }, - "song text" : { - - }, - "sound" : { - - }, - "spectrogram" : { - }, "Speed" : { "localizations" : { @@ -23178,9 +22331,6 @@ } } } - }, - "standard" : { - }, "Standard" : { @@ -23334,12 +22484,6 @@ } } } - }, - "startup" : { - - }, - "stats" : { - }, "Stats" : { "localizations" : { @@ -23454,9 +22598,6 @@ } } } - }, - "status bar" : { - }, "Status:" : { "comment" : "A label for the status of an extension.", @@ -23497,9 +22638,6 @@ } } } - }, - "Stop monitoring after closing the notch" : { - }, "Stop recording" : { "localizations" : { @@ -23620,9 +22758,6 @@ "Student" : { "comment" : "Name of a user profile for a student.", "isCommentAutoGenerated" : true - }, - "style" : { - }, "Style" : { "localizations" : { @@ -23793,9 +22928,6 @@ } } } - }, - "swipe" : { - }, "System" : { "comment" : "A label displayed above the system, load average, and uptime information.", @@ -23925,9 +23057,6 @@ } } } - }, - "system timer" : { - }, "Tab" : { "comment" : "Name of the \"Tab\" display mode.", @@ -23988,9 +23117,6 @@ } } } - }, - "third party" : { - }, "Third-party apps using AtollExtensionKit can display live activities, lock screen widgets, and dedicated notch experiences. Toggle features above or manage individual app permissions below." : { "comment" : "A footer text that explains the purpose of the \"Global Settings\" section in the Extensions settings view.", @@ -24148,9 +23274,6 @@ } } } - }, - "timer" : { - }, "Timer" : { "localizations" : { @@ -24167,9 +23290,6 @@ } } } - }, - "timer colour" : { - }, "Timer controls appear as" : { "comment" : "A picker that lets the user choose how the timer controls are displayed.", @@ -24230,9 +23350,6 @@ } } } - }, - "timer glass" : { - }, "Timer glass material" : { "comment" : "A label displayed above a picker for selecting the material of the timer glass.", @@ -24257,9 +23374,6 @@ } } } - }, - "timer material" : { - }, "Timer Presets" : { "comment" : "A section header in the timer settings view, describing timer presets.", @@ -24310,12 +23424,6 @@ } } } - }, - "timer variant" : { - - }, - "timer widget" : { - }, "Timer Widget" : { "comment" : "A section header for the timer widget settings.", @@ -24339,10 +23447,6 @@ } } }, - "Timer Widget Width" : { - "comment" : "Title of a slider that adjusts the width of the lock screen timer widget.", - "isCommentAutoGenerated" : true - }, "Title" : { "comment" : "A label for the title input field in the note editor.", "isCommentAutoGenerated" : true, @@ -24354,9 +23458,6 @@ } } } - }, - "titles" : { - }, "Toggle Notch Open:" : { "localizations" : { @@ -24569,9 +23670,6 @@ } } } - }, - "toolbar" : { - }, "Total · %@" : { "comment" : "A label displaying the total storage capacity of a disk device. The argument is the total storage capacity of the disk device.", @@ -24595,9 +23693,6 @@ "Track Skip" : { "comment" : "Display name for the \"Track Skip\" music skip behavior option.", "isCommentAutoGenerated" : true - }, - "trackpad" : { - }, "Transform" : { "extractionState" : "stale", @@ -24652,6 +23747,9 @@ } } } + }, + "Turn off 'Show event for entire duration' to use the post-start duration option." : { + }, "Turn on customizable controls to rearrange media buttons." : { "comment" : "A description of the feature that allows users to rearrange the order of media buttons.", @@ -24778,9 +23876,6 @@ } } } - }, - "ui mode" : { - }, "UI Mode" : { "localizations" : { @@ -25292,9 +24387,6 @@ } } } - }, - "Use accent color" : { - }, "Use Accent Color" : { "localizations" : { @@ -25305,15 +24397,6 @@ } } } - }, - "Use circular battery indicator" : { - - }, - "Use colored gauges" : { - - }, - "Use MacBook icon when on battery" : { - }, "Use music visualizer spectrogram" : { "localizations" : { @@ -25414,9 +24497,6 @@ } } } - }, - "Use simpler close animation" : { - }, "Use the Media tab to configure sneak peek, lyrics, and floating media controls." : { "comment" : "A footer for the \"Media Live Activity\" section, explaining how to configure the media controls.", @@ -25727,7 +24807,7 @@ } } }, - "Vertical Bar" : { + "Vertical offset" : { }, "Vertical:" : { @@ -25847,9 +24927,6 @@ } } } - }, - "volume" : { - }, "Volume" : { "comment" : "A button that sets the preview to show a volume OSD.", @@ -25894,9 +24971,6 @@ "W " : { "comment" : "Label for the write data point in the disk usage graph.", "isCommentAutoGenerated" : true - }, - "weather" : { - }, "Weather" : { "comment" : "A label and its accompanying text displayed in a lock screen panel.", @@ -25919,12 +24993,6 @@ } } } - }, - "weather layout" : { - - }, - "weather widget" : { - }, "Weather Widget" : { "comment" : "A section header in the Lock Screen Settings view.", @@ -26213,9 +25281,6 @@ } } } - }, - "white" : { - }, "White" : { @@ -26232,16 +25297,6 @@ } } }, - "widgets" : { - - }, - "width" : { - - }, - "Width adjustments apply only to the standard notch layout. Disable Minimalistic UI to edit this value." : { - "comment" : "Description of the notch width controls, explaining that width adjustments only apply to the standard notch layout and that the user must disable the Minimalistic UI setting to edit the notch width.", - "isCommentAutoGenerated" : true - }, "Width:" : { "extractionState" : "stale", "localizations" : { @@ -26300,13 +25355,6 @@ } } } - }, - "Write Only" : { - "comment" : "Description of a calendar authorization status when the app has write-only access to the user's calendar.", - "isCommentAutoGenerated" : true - }, - "wttr" : { - }, "You" : { "localizations" : { diff --git a/DynamicIsland/components/Settings/SettingsView.swift b/DynamicIsland/components/Settings/SettingsView.swift index 8da0a75..bb30b13 100644 --- a/DynamicIsland/components/Settings/SettingsView.swift +++ b/DynamicIsland/components/Settings/SettingsView.swift @@ -43,26 +43,26 @@ private enum SettingsTab: String, CaseIterable, Identifiable { var title: String { switch self { - case .general: return String(localized: "General") - case .liveActivities: return String(localized: "Live Activities") - case .appearance: return String(localized: "Appearance") - case .lockScreen: return String(localized: "Lock Screen") - case .media: return String(localized: "Media") - case .devices: return String(localized: "Devices") - case .extensions: return String(localized: "Extensions") - case .timer: return String(localized: "Timer") - case .calendar: return String(localized: "Calendar") - case .hudAndOSD: return String(localized: "Controls") - case .battery: return String(localized: "Battery") - case .stats: return String(localized: "Stats") - case .clipboard: return String(localized: "Clipboard") - case .screenAssistant: return String(localized: "Screen Assistant") - case .colorPicker: return String(localized: "Color Picker") - case .downloads: return String(localized: "Downloads") - case .shelf: return String(localized: "Shelf") - case .shortcuts: return String(localized: "Shortcuts") - case .notes: return String(localized: "Notes") - case .about: return String(localized: "About") + case .general: return "General" + case .liveActivities: return "Live Activities" + case .appearance: return "Appearance" + case .lockScreen: return "Lock Screen" + case .media: return "Media" + case .devices: return "Devices" + case .extensions: return "Extensions" + case .timer: return "Timer" + case .calendar: return "Calendar" + case .hudAndOSD: return "Controls" + case .battery: return "Battery" + case .stats: return "Stats" + case .clipboard: return "Clipboard" + case .screenAssistant: return "Screen Assistant" + case .colorPicker: return "Color Picker" + case .downloads: return "Downloads" + case .shelf: return "Shelf" + case .shortcuts: return "Shortcuts" + case .notes: return "Notes" + case .about: return "About" } } @@ -250,13 +250,13 @@ struct SettingsView: View { @State private var searchText: String = "" @StateObject private var highlightCoordinator = SettingsHighlightCoordinator() @Default(.enableMinimalisticUI) var enableMinimalisticUI - + let updaterController: SPUStandardUpdaterController? - + init(updaterController: SPUStandardUpdaterController? = nil) { self.updaterController = updaterController } - + var body: some View { NavigationSplitView { VStack(spacing: 12) { @@ -267,10 +267,10 @@ struct SettingsView: View { ) .padding(.horizontal, 12) .padding(.top, 12) - + Divider() .padding(.horizontal, 12) - + List(filteredTabs, selection: selectionBinding) { tab in NavigationLink(value: tab) { HStack(spacing: 10) { @@ -349,11 +349,11 @@ struct SettingsView: View { .ignoresSafeArea() } } - + private var resolvedSelection: SettingsTab { availableTabs.contains(selectedTab) ? selectedTab : (availableTabs.first ?? .general) } - + @ToolbarContentBuilder private var toolbarSpacingShim: some ToolbarContent { if #available(macOS 26.0, *) { @@ -367,7 +367,7 @@ struct SettingsView: View { } } } - + @ViewBuilder private var toolbarSpacerView: some View { Color.clear @@ -375,11 +375,11 @@ struct SettingsView: View { .allowsHitTesting(false) .accessibilityHidden(true) } - + private var filteredTabs: [SettingsTab] { tabsMatchingSearch(searchText) } - + private var selectionBinding: Binding { Binding( get: { resolvedSelection }, @@ -388,7 +388,7 @@ struct SettingsView: View { } ) } - + @ViewBuilder private func sidebarIcon(for tab: SettingsTab) -> some View { RoundedRectangle(cornerRadius: 8, style: .continuous) @@ -400,7 +400,7 @@ struct SettingsView: View { .foregroundStyle(Color.white) } } - + private var availableTabs: [SettingsTab] { let ordered: [SettingsTab] = [ .general, @@ -424,40 +424,40 @@ struct SettingsView: View { .extensions, .about ] - + return ordered.filter { isTabVisible($0) } } - + private func tabsMatchingSearch(_ query: String) -> [SettingsTab] { let trimmed = query.trimmingCharacters(in: .whitespacesAndNewlines) guard !trimmed.isEmpty else { return availableTabs } - + let entryMatches = searchEntries(matching: trimmed) let matchingTabs = Set(entryMatches.map(\.tab)) - + return availableTabs.filter { tab in tab.title.localizedCaseInsensitiveContains(trimmed) || matchingTabs.contains(tab) } } - + private var searchSuggestions: [SettingsSearchEntry] { Array(searchEntries(matching: searchText).filter { $0.tab != .downloads }.prefix(8)) } - + private func handleSearchSuggestionSelection(_ suggestion: SettingsSearchEntry) { guard suggestion.tab != .downloads else { return } highlightCoordinator.focus(on: suggestion) selectedTab = suggestion.tab } - + private struct SettingsSidebarSearchBar: View { @Binding var text: String let suggestions: [SettingsSearchEntry] let onSuggestionSelected: (SettingsSearchEntry) -> Void - + @FocusState private var isFocused: Bool @State private var hoveredSuggestionID: SettingsSearchEntry.ID? - + var body: some View { VStack(spacing: 6) { searchField @@ -467,21 +467,21 @@ struct SettingsView: View { } .animation(.easeInOut(duration: 0.15), value: showSuggestions) } - + private var showSuggestions: Bool { isFocused && !text.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty && !suggestions.isEmpty } - + private var searchField: some View { HStack(spacing: 6) { Image(systemName: "magnifyingglass") .foregroundStyle(Color.secondary) - + TextField("Search Settings", text: $text) .textFieldStyle(.plain) .focused($isFocused) .onSubmit(triggerFirstSuggestion) - + if !text.isEmpty { Button { text = "" @@ -505,7 +505,7 @@ struct SettingsView: View { .stroke(Color.white.opacity(0.08)) ) } - + private var suggestionList: some View { VStack(spacing: 0) { ForEach(suggestions) { suggestion in @@ -521,7 +521,7 @@ struct SettingsView: View { .font(.system(size: 13, weight: .semibold)) .foregroundStyle(Color.white) } - + VStack(alignment: .leading, spacing: 2) { Text(suggestion.title) .font(.system(size: 13, weight: .semibold)) @@ -530,7 +530,7 @@ struct SettingsView: View { .font(.system(size: 11)) .foregroundStyle(Color.secondary) } - + Spacer(minLength: 0) } .padding(.horizontal, 10) @@ -542,7 +542,7 @@ struct SettingsView: View { .onHover { hovering in hoveredSuggestionID = hovering ? suggestion.id : (hoveredSuggestionID == suggestion.id ? nil : hoveredSuggestionID) } - + if suggestion.id != suggestions.last?.id { Divider() .padding(.leading, 48) @@ -560,27 +560,27 @@ struct SettingsView: View { .shadow(color: Color.black.opacity(0.2), radius: 8, y: 4) .transition(.opacity.combined(with: .move(edge: .top))) } - + private func rowBackground(for suggestion: SettingsSearchEntry) -> some View { RoundedRectangle(cornerRadius: 8, style: .continuous) .fill(hoveredSuggestionID == suggestion.id ? Color.white.opacity(0.08) : Color.clear) } - + private func selectSuggestion(_ suggestion: SettingsSearchEntry) { onSuggestionSelected(suggestion) isFocused = false } - + private func triggerFirstSuggestion() { guard let first = suggestions.first else { return } selectSuggestion(first) } } - + private func searchEntries(matching query: String) -> [SettingsSearchEntry] { let trimmed = query.trimmingCharacters(in: .whitespacesAndNewlines) guard !trimmed.isEmpty else { return [] } - + return settingsSearchIndex .filter { availableTabs.contains($0.tab) } .filter { entry in @@ -588,829 +588,199 @@ struct SettingsView: View { entry.keywords.contains { $0.localizedCaseInsensitiveContains(trimmed) } } } - + private var settingsSearchIndex: [SettingsSearchEntry] { [ // General - SettingsSearchEntry( - tab: .general, - title: String(localized: "Enable Minimalistic UI"), - keywords: [ String(localized: "minimalistic"), String(localized: "ui mode"), String(localized: "general") ], - highlightID: SettingsTab.general.highlightID(for: "Enable Minimalistic UI") - ), - SettingsSearchEntry( - tab: .general, - title: String(localized:"Menubar icon"), - keywords: [ String(localized:"menu bar"), String(localized:"status bar"), String(localized:"icon") ], - highlightID: SettingsTab.general.highlightID(for: "Menubar icon") - ), - SettingsSearchEntry( - tab: .general, - title: String(localized:"Launch at login"), - keywords: [ String(localized:"autostart"), String(localized:"startup")], - highlightID: SettingsTab.general.highlightID(for: "Launch at login") - ), + SettingsSearchEntry(tab: .general, title: "Enable Minimalistic UI", keywords: ["minimalistic", "ui mode", "general"], highlightID: SettingsTab.general.highlightID(for: "Enable Minimalistic UI")), + SettingsSearchEntry(tab: .general, title: "Menubar icon", keywords: ["menu bar", "status bar", "icon"], highlightID: SettingsTab.general.highlightID(for: "Menubar icon")), + SettingsSearchEntry(tab: .general, title: "Launch at login", keywords: ["autostart", "startup"], highlightID: SettingsTab.general.highlightID(for: "Launch at login")), SettingsSearchEntry(tab: .general, title: "Show on all displays", keywords: ["multi-display", "external monitor"], highlightID: SettingsTab.general.highlightID(for: "Show on all displays")), - SettingsSearchEntry( - tab: .general, - title: "Show on a specific display", - keywords: ["preferred screen", "display picker"], - highlightID: SettingsTab.general.highlightID(for: "Show on a specific display") - ), - SettingsSearchEntry( - tab: .general, - title: String(localized:"Automatically switch displays"), - keywords: [String(localized:"auto switch"), String(localized:"displays")], - highlightID: SettingsTab.general.highlightID(for: "Automatically switch displays") - ), - SettingsSearchEntry( - tab: .general, - title: String(localized:"Hide Dynamic Island during screenshots & recordings"), - keywords: [String(localized:"privacy"), String(localized:"screenshot"), String(localized:"recording")], - highlightID: SettingsTab.general.highlightID(for: "Hide Dynamic Island during screenshots & recordings") - ), - SettingsSearchEntry( - tab: .general, - title: String(localized: "Enable gestures"), - keywords: [String(localized: "gestures"), String(localized: "trackpad")], - highlightID: SettingsTab.general.highlightID(for: "Enable gestures") - ), - SettingsSearchEntry( - tab: .general, - title: String(localized: "Close gesture"), - keywords: [String(localized: "pinch"), String(localized: "swipe")], - highlightID: SettingsTab.general.highlightID(for: "Close gesture") - ), - SettingsSearchEntry( - tab: .general, - title: String(localized: "Reverse swipe gestures"), - keywords: [String(localized: "reverse"), String(localized: "swipe"), String(localized: "media")], - highlightID: SettingsTab.general.highlightID(for: "Reverse swipe gestures") - ), - SettingsSearchEntry( - tab: .general, - title: String(localized: "Reverse scroll gestures"), - keywords: [String(localized: "reverse"), String(localized: "scroll"), String(localized: "open"), String(localized: "close")], - highlightID: SettingsTab.general.highlightID(for: "Reverse scroll gestures") - ), - SettingsSearchEntry( - tab: .general, - title: String(localized: "Extend hover area"), - keywords: [String(localized: "hover"), String(localized: "cursor")], - highlightID: SettingsTab.general.highlightID(for: "Extend hover area") - ), - SettingsSearchEntry( - tab: .general, - title: String(localized: "Enable haptics"), - keywords: [String(localized: "haptic"), String(localized: "feedback")], - highlightID: SettingsTab.general.highlightID(for: "Enable haptics") - ), - SettingsSearchEntry( - tab: .general, - title: String(localized: "Open notch on hover"), - keywords: [String(localized: "hover to open"), String(localized: "auto open")], - highlightID: SettingsTab.general.highlightID(for: "Open notch on hover") - ), - SettingsSearchEntry( - tab: .general, - title: String(localized: "Notch display height"), - keywords: [String(localized: "display height"), String(localized: "menu bar size")], - highlightID: SettingsTab.general.highlightID(for: "Notch display height") - ), - - // Battery (Charge) - SettingsSearchEntry( - tab: .battery, - title: String(localized: "Show battery indicator"), - keywords: [String(localized: "battery hud"), String(localized: "charge")], - highlightID: SettingsTab.battery.highlightID(for: "Show battery indicator") - ), - SettingsSearchEntry( - tab: .battery, - title: String(localized: "Show battery percentage"), - keywords: [String(localized: "battery percent")], - highlightID: SettingsTab.battery.highlightID(for: "Show battery percentage") - ), - SettingsSearchEntry( - tab: .battery, - title: String(localized: "Show power status notifications"), - keywords: [String(localized: "notifications"), String(localized: "power")], - highlightID: SettingsTab.battery.highlightID(for: "Show power status notifications") - ), - SettingsSearchEntry( - tab: .battery, - title: String(localized: "Show power status icons"), - keywords: [String(localized: "power icons"), String(localized: "charging icon")], - highlightID: SettingsTab.battery.highlightID(for: "Show power status icons") - ), - SettingsSearchEntry( - tab: .battery, - title: String(localized: "Play low battery alert sound"), - keywords: [String(localized: "low battery"), String(localized: "alert"), String(localized: "sound")], - highlightID: SettingsTab.battery.highlightID(for: "Play low battery alert sound") - ), - - // HUDs - SettingsSearchEntry( - tab: .devices, - title: String(localized: "Show Bluetooth device connections"), - keywords: [String(localized: "bluetooth"), String(localized: "hud")], - highlightID: SettingsTab.devices.highlightID(for: "Show Bluetooth device connections") - ), - SettingsSearchEntry( - tab: .devices, - title: String(localized: "Use circular battery indicator"), - keywords: [String(localized: "battery"), String(localized: "circular")], - highlightID: SettingsTab.devices.highlightID(for: "Use circular battery indicator") - ), - SettingsSearchEntry( - tab: .devices, - title: String(localized: "Show battery percentage text in HUD"), - keywords: [String(localized: "battery text")], - highlightID: SettingsTab.devices.highlightID(for: "Show battery percentage text in HUD") - ), - SettingsSearchEntry( - tab: .devices, - title: String(localized: "Scroll device name in HUD"), - keywords: [String(localized: "marquee"), String(localized: "device name")], - highlightID: SettingsTab.devices.highlightID(for: "Scroll device name in HUD") - ), - SettingsSearchEntry( - tab: .devices, - title: String(localized: "Color-coded battery display"), - keywords: [String(localized: "color"), String(localized: "battery")], - highlightID: SettingsTab.devices.highlightID(for: "Color-coded battery display") - ), - SettingsSearchEntry( - tab: .hudAndOSD, - title: String(localized: "Color-coded volume display"), - keywords: [String(localized: "volume"), String(localized: "color")], - highlightID: SettingsTab.hudAndOSD.highlightID(for: "Color-coded volume display") - ), - SettingsSearchEntry( - tab: .hudAndOSD, - title: String(localized: "Smooth color transitions"), - keywords: [String(localized: "gradient"), String(localized: "smooth")], - highlightID: SettingsTab.hudAndOSD.highlightID(for: "Smooth color transitions") - ), - SettingsSearchEntry( - tab: .hudAndOSD, - title: String(localized: "Show percentages beside progress bars"), - keywords: [String(localized: "percentages"), String(localized: "progress")], - highlightID: SettingsTab.hudAndOSD.highlightID(for: "Show percentages beside progress bars") - ), - SettingsSearchEntry( - tab: .hudAndOSD, - title: String(localized: "HUD style"), - keywords: [String(localized: "inline"), String(localized: "compact")], - highlightID: SettingsTab.hudAndOSD.highlightID(for: "HUD style") - ), - SettingsSearchEntry( - tab: .hudAndOSD, - title: String(localized: "Progressbar style"), - keywords: [String(localized: "progress"), String(localized: "style")], - highlightID: SettingsTab.hudAndOSD.highlightID(for: "Progressbar style") - ), - SettingsSearchEntry( - tab: .hudAndOSD, - title: String(localized: "Enable glowing effect"), - keywords: [String(localized: "glow"), String(localized: "indicator")], - highlightID: SettingsTab.hudAndOSD.highlightID(for: "Enable glowing effect") - ), - SettingsSearchEntry( - tab: .hudAndOSD, - title: String(localized: "Use accent color"), - keywords: [String(localized: "accent"), String(localized: "color")], - highlightID: SettingsTab.hudAndOSD.highlightID(for: "Use accent color") - ), - - // Custom OSD - SettingsSearchEntry( - tab: .hudAndOSD, - title: String(localized: "Enable Custom OSD"), - keywords: [String(localized: "osd"), String(localized: "on-screen display"), String(localized: "custom osd")], - highlightID: SettingsTab.hudAndOSD.highlightID(for: "Enable Custom OSD") - ), - SettingsSearchEntry( - tab: .hudAndOSD, - title: String(localized: "Volume OSD"), - keywords: [String(localized: "volume"), String(localized: "osd")], - highlightID: SettingsTab.hudAndOSD.highlightID(for: "Volume OSD") - ), - SettingsSearchEntry( - tab: .hudAndOSD, - title: String(localized: "Brightness OSD"), - keywords: [String(localized: "brightness"), String(localized: "osd")], - highlightID: SettingsTab.hudAndOSD.highlightID(for: "Brightness OSD") - ), - SettingsSearchEntry( - tab: .hudAndOSD, - title: String(localized: "Keyboard Backlight OSD"), - keywords: [String(localized: "keyboard"), String(localized: "backlight"), String(localized: "osd")], - highlightID: SettingsTab.hudAndOSD.highlightID(for: "Keyboard Backlight OSD") - ), - SettingsSearchEntry( - tab: .hudAndOSD, - title: String(localized: "Material"), - keywords: [String(localized: "material"), String(localized: "frosted"), String(localized: "liquid"), String(localized: "glass"), String(localized: "solid"), String(localized: "osd")], - highlightID: SettingsTab.hudAndOSD.highlightID(for: "Material") - ), - SettingsSearchEntry( - tab: .hudAndOSD, - title: String(localized: "Icon & Progress Color"), - keywords: [String(localized: "color"), String(localized: "icon"), String(localized: "white"), String(localized: "black"), String(localized: "gray"), String(localized: "osd")], - highlightID: SettingsTab.hudAndOSD.highlightID(for: "Icon & Progress Color") - ), - - // Media - SettingsSearchEntry( - tab: .media, - title: String(localized: "Music Source"), - keywords: [String(localized: "media source"), String(localized: "controller")], - highlightID: SettingsTab.media.highlightID(for: "Music Source") - ), - SettingsSearchEntry( - tab: .media, - title: String(localized: "Skip buttons"), - keywords: [String(localized: "skip"), String(localized: "controls"), String(localized: "±10")], - highlightID: SettingsTab.media.highlightID(for: "Skip buttons") - ), - SettingsSearchEntry( - tab: .media, - title: String(localized: "Sneak Peek Style"), - keywords: [String(localized: "sneak peek"), String(localized: "preview")], - highlightID: SettingsTab.media.highlightID(for: "Sneak Peek Style") - ), - SettingsSearchEntry( - tab: .media, - title: String(localized: "Enable lyrics"), - keywords: [String(localized: "lyrics"), String(localized: "song text")], - highlightID: SettingsTab.media.highlightID(for: "Enable lyrics") - ), - SettingsSearchEntry( - tab: .media, - title: String(localized: "Show Change Media Output control"), - keywords: [String(localized: "airplay"), String(localized: "route picker"), String(localized: "media output")], - highlightID: SettingsTab.media.highlightID(for: "Show Change Media Output control") - ), - SettingsSearchEntry( - tab: .media, - title: String(localized: "Enable album art parallax"), - keywords: [String(localized: "parallax"), String(localized: "lock screen"), String(localized: "album art")], - highlightID: SettingsTab.media.highlightID(for: "Enable album art parallax") - ), - SettingsSearchEntry( - tab: .media, - title: String(localized: "Enable album art parallax effect"), - keywords: [String(localized: "parallax"), String(localized: "parallax effect"), String(localized: "album art")], - highlightID: SettingsTab.media.highlightID(for: "Enable album art parallax effect") - ), - - // Calendar - SettingsSearchEntry( - tab: .calendar, - title: String(localized: "Show calendar"), - keywords: [String(localized: "calendar"), String(localized: "events")], - highlightID: SettingsTab.calendar.highlightID(for: "Show calendar") - ), - SettingsSearchEntry( - tab: .calendar, - title: String(localized: "Enable reminder live activity"), - keywords: [String(localized: "reminder"), String(localized: "live activity")], - highlightID: SettingsTab.calendar.highlightID(for: "Enable reminder live activity") - ), - SettingsSearchEntry( - tab: .calendar, - title: String(localized: "Countdown style"), - keywords: [String(localized: "reminder countdown")], - highlightID: SettingsTab.calendar.highlightID(for: "Countdown style") - ), - SettingsSearchEntry( - tab: .calendar, - title: String(localized: "Show lock screen reminder"), - keywords: [String(localized: "lock screen"), String(localized: "reminder widget")], - highlightID: SettingsTab.calendar.highlightID(for: "Show lock screen reminder") - ), - SettingsSearchEntry( - tab: .calendar, - title: String(localized: "Chip color"), - keywords: [String(localized: "reminder chip"), String(localized: "color")], - highlightID: SettingsTab.calendar.highlightID(for: "Chip color") - ), - SettingsSearchEntry( - tab: .calendar, - title: String(localized: "Hide all-day events"), - keywords: [String(localized: "calendar"), String(localized: "all-day")], - highlightID: SettingsTab.calendar.highlightID(for: "Hide all-day events") - ), - SettingsSearchEntry( - tab: .calendar, - title: String(localized: "Hide completed reminders"), - keywords: [String(localized: "reminder"), String(localized: "completed")], - highlightID: SettingsTab.calendar.highlightID(for: "Hide completed reminders") - ), - SettingsSearchEntry( - tab: .calendar, - title: String(localized: "Show full event titles"), - keywords: [String(localized: "calendar"), String(localized: "titles")], - highlightID: SettingsTab.calendar.highlightID(for: "Show full event titles") - ), - SettingsSearchEntry( - tab: .calendar, - title: String(localized: "Auto-scroll to next event"), - keywords: [String(localized: "calendar"), String(localized: "scroll")], - highlightID: SettingsTab.calendar.highlightID(for: "Auto-scroll to next event") - ), - - // Shelf - SettingsSearchEntry( - tab: .shelf, - title: String(localized: "Enable shelf"), - keywords: [String(localized: "shelf"), String(localized: "dock")], - highlightID: SettingsTab.shelf.highlightID(for: "Enable shelf") - ), - SettingsSearchEntry( - tab: .shelf, - title: String(localized: "Open shelf tab by default if items added"), - keywords: [String(localized: "auto open"), String(localized: "shelf tab")], - highlightID: SettingsTab.shelf.highlightID(for: "Open shelf tab by default if items added") - ), - SettingsSearchEntry( - tab: .shelf, - title: String(localized: "Expanded drag detection area"), - keywords: [String(localized: "shelf"), String(localized: "drag")], - highlightID: SettingsTab.shelf.highlightID(for: "Expanded drag detection area") - ), - SettingsSearchEntry( - tab: .shelf, - title: String(localized: "Copy items on drag"), - keywords: [String(localized: "shelf"), String(localized: "drag"), String(localized: "copy")], - highlightID: SettingsTab.shelf.highlightID(for: "Copy items on drag") - ), - SettingsSearchEntry( - tab: .shelf, - title: String(localized: "Remove from shelf after dragging"), - keywords: [String(localized: "shelf"), String(localized: "drag"), String(localized: "remove")], - highlightID: SettingsTab.shelf.highlightID(for: "Remove from shelf after dragging") - ), - SettingsSearchEntry( - tab: .shelf, - title: String(localized: "Quick Share Service"), - keywords: [String(localized: "shelf"), String(localized: "share"), String(localized: "airdrop")], - highlightID: SettingsTab.shelf.highlightID(for: "Quick Share Service") - ), - - // Appearance - SettingsSearchEntry( - tab: .appearance, - title: String(localized: "Settings icon in notch"), - keywords: [String(localized: "settings button"), String(localized: "toolbar")], - highlightID: SettingsTab.appearance.highlightID(for: "Settings icon in notch") - ), - SettingsSearchEntry( - tab: .appearance, - title: String(localized: "Enable window shadow"), - keywords: [String(localized: "shadow"), String(localized: "appearance")], - highlightID: SettingsTab.appearance.highlightID(for: "Enable window shadow") - ), - SettingsSearchEntry( - tab: .appearance, - title: String(localized: "Corner radius scaling"), - keywords: [String(localized: "corner radius"), String(localized: "shape")], - highlightID: SettingsTab.appearance.highlightID(for: "Corner radius scaling") - ), - SettingsSearchEntry( - tab: .appearance, - title: String(localized: "Use simpler close animation"), - keywords: [String(localized: "close animation"), String(localized: "notch")], - highlightID: SettingsTab.appearance.highlightID(for: "Use simpler close animation") - ), - SettingsSearchEntry( - tab: .appearance, - title: String(localized: "Notch Width"), - keywords: [String(localized: "expanded notch"), String(localized: "width"), String(localized: "resize")], - highlightID: SettingsTab.appearance.highlightID(for: "Expanded notch width") - ), - SettingsSearchEntry( - tab: .appearance, - title: String(localized: "Enable colored spectrograms"), - keywords: [String(localized: "spectrogram"), String(localized: "audio")], - highlightID: SettingsTab.appearance.highlightID(for: "Enable colored spectrograms") - ), - SettingsSearchEntry( - tab: .appearance, - title: String(localized: "Enable blur effect behind album art"), - keywords: [String(localized: "blur"), String(localized: "album art")], - highlightID: SettingsTab.appearance.highlightID(for: "Enable blur effect behind album art") - ), - SettingsSearchEntry( - tab: .appearance, - title: String(localized: "Slider color"), - keywords: [String(localized: "slider"), String(localized: "accent")], - highlightID: SettingsTab.appearance.highlightID(for: "Slider color") - ), - SettingsSearchEntry( - tab: .appearance, - title: String(localized: "Enable Dynamic mirror"), - keywords: [String(localized: "mirror"), String(localized: "reflection")], - highlightID: SettingsTab.appearance.highlightID(for: "Enable Dynamic mirror") - ), - SettingsSearchEntry( - tab: .appearance, - title: String(localized: "Mirror shape"), - keywords: [String(localized: "mirror shape"), String(localized: "circle"), String(localized: "rectangle")], - highlightID: SettingsTab.appearance.highlightID(for: "Mirror shape") - ), - SettingsSearchEntry( - tab: .appearance, - title: String(localized: "Show cool face animation while inactivity"), - keywords: [String(localized: "face animation"), String(localized: "idle")], - highlightID: SettingsTab.appearance.highlightID(for: "Show cool face animation while inactivity") - ), - SettingsSearchEntry( - tab: .appearance, - title: String(localized: "App icon"), - keywords: [String(localized: "app icon"), String(localized: "custom icon")], - highlightID: SettingsTab.appearance.highlightID(for: "App icon") - ), - - // Lock Screen - SettingsSearchEntry( - tab: .lockScreen, - title: String(localized: "Enable lock screen live activity"), - keywords: [String(localized: "lock screen"), String(localized: "live activity")], - highlightID: SettingsTab.lockScreen.highlightID(for: "Enable lock screen live activity") - ), - SettingsSearchEntry( - tab: .lockScreen, - title: String(localized: "Play lock/unlock sounds"), - keywords: [String(localized: "chime"), String(localized: "sound")], - highlightID: SettingsTab.lockScreen.highlightID(for: "Play lock/unlock sounds") - ), - SettingsSearchEntry( - tab: .lockScreen, - title: String(localized: "Material"), - keywords: [String(localized: "glass"), String(localized: "frosted"), String(localized: "liquid")], - highlightID: SettingsTab.lockScreen.highlightID(for: "Material") - ), - SettingsSearchEntry( - tab: .lockScreen, - title: String(localized: "Show lock screen media panel"), - keywords: [String(localized: "media panel"), String(localized: "lock screen media")], - highlightID: SettingsTab.lockScreen.highlightID(for: "Show lock screen media panel") - ), - SettingsSearchEntry( - tab: .lockScreen, - title: String(localized: "Show media app icon"), - keywords: [String(localized: "app icon"), String(localized: "media")], - highlightID: SettingsTab.lockScreen.highlightID(for: "Show media app icon") - ), - SettingsSearchEntry( - tab: .lockScreen, - title: String(localized: "Show panel border"), - keywords: [String(localized: "panel border")], - highlightID: SettingsTab.lockScreen.highlightID(for: "Show panel border") - ), - SettingsSearchEntry( - tab: .lockScreen, - title: String(localized: "Enable media panel blur"), - keywords: [String(localized: "blur"), String(localized: "media panel")], - highlightID: SettingsTab.lockScreen.highlightID(for: "Enable media panel blur") - ), - SettingsSearchEntry( - tab: .lockScreen, - title: String(localized: "Show lock screen timer"), - keywords: [String(localized: "timer widget"), String(localized: "lock screen timer")], - highlightID: SettingsTab.lockScreen.highlightID(for: "Show lock screen timer") - ), - SettingsSearchEntry( - tab: .lockScreen, - title: String(localized: "Timer surface"), - keywords: [String(localized: "timer glass"), String(localized: "classic"), String(localized: "blur")], - highlightID: SettingsTab.lockScreen.highlightID(for: "Timer surface") - ), - SettingsSearchEntry( - tab: .lockScreen, - title: String(localized: "Timer glass material"), - keywords: [String(localized: "frosted"), String(localized: "liquid"), String(localized: "timer material")], - highlightID: SettingsTab.lockScreen.highlightID(for: "Timer glass material") - ), - SettingsSearchEntry( - tab: .lockScreen, - title: String(localized: "Timer liquid mode"), - keywords: [String(localized: "timer"), String(localized: "standard"), String(localized: "custom")], - highlightID: SettingsTab.lockScreen.highlightID(for: "Timer liquid mode") - ), - SettingsSearchEntry( - tab: .lockScreen, - title: String(localized: "Timer widget variant"), - keywords: [String(localized: "timer variant"), String(localized: "liquid")], - highlightID: SettingsTab.lockScreen.highlightID(for: "Timer widget variant") - ), - SettingsSearchEntry( - tab: .lockScreen, - title: String(localized: "Show lock screen weather"), - keywords: [String(localized: "weather widget")], - highlightID: SettingsTab.lockScreen.highlightID(for: "Show lock screen weather") - ), - SettingsSearchEntry( - tab: .lockScreen, - title: String(localized: "Layout"), - keywords: [String(localized: "inline"), String(localized: "circular"), String(localized: "weather layout")], - highlightID: SettingsTab.lockScreen.highlightID(for: "Layout") - ), - SettingsSearchEntry( - tab: .lockScreen, - title: String(localized: "Weather data provider"), - keywords: [String(localized: "wttr"), String(localized: "open meteo")], - highlightID: SettingsTab.lockScreen.highlightID(for: "Weather data provider") - ), - SettingsSearchEntry( - tab: .lockScreen, - title: String(localized: "Temperature unit"), - keywords: [String(localized: "celsius"), String(localized: "fahrenheit")], - highlightID: SettingsTab.lockScreen.highlightID(for: "Temperature unit") - ), - SettingsSearchEntry( - tab: .lockScreen, - title: String(localized: "Show location label"), - keywords: [String(localized: "location"), String(localized: "weather")], - highlightID: SettingsTab.lockScreen.highlightID(for: "Show location label") - ), - SettingsSearchEntry( - tab: .lockScreen, - title: String(localized: "Show charging status"), - keywords: [String(localized: "charging"), String(localized: "weather")], - highlightID: SettingsTab.lockScreen.highlightID(for: "Show charging status") - ), - SettingsSearchEntry( - tab: .lockScreen, - title: String(localized: "Show charging percentage"), - keywords: [String(localized: "charging percentage")], - highlightID: SettingsTab.lockScreen.highlightID(for: "Show charging percentage") - ), - SettingsSearchEntry( - tab: .lockScreen, - title: String(localized: "Show battery indicator"), - keywords: [String(localized: "battery gauge"), String(localized: "weather")], - highlightID: SettingsTab.lockScreen.highlightID(for: "Show battery indicator") - ), - SettingsSearchEntry( - tab: .lockScreen, - title: String(localized: "Use MacBook icon when on battery"), - keywords: [String(localized: "laptop icon"), String(localized: "battery")], - highlightID: SettingsTab.lockScreen.highlightID(for: "Use MacBook icon when on battery") - ), - SettingsSearchEntry( - tab: .lockScreen, - title: String(localized: "Show Bluetooth battery"), - keywords: [String(localized: "bluetooth"), String(localized: "gauge")], - highlightID: SettingsTab.lockScreen.highlightID(for: "Show Bluetooth battery") - ), - SettingsSearchEntry( - tab: .lockScreen, - title: String(localized: "Show AQI widget"), - keywords: [String(localized: "air quality"), String(localized: "aqi")], - highlightID: SettingsTab.lockScreen.highlightID(for: "Show AQI widget") - ), - SettingsSearchEntry( - tab: .lockScreen, - title: String(localized: "Air quality scale"), - keywords: [String(localized: "aqi"), String(localized: "scale")], - highlightID: SettingsTab.lockScreen.highlightID(for: "Air quality scale") - ), - SettingsSearchEntry( - tab: .lockScreen, - title: String(localized: "Use colored gauges"), - keywords: [String(localized: "gauge tint"), String(localized: "monochrome")], - highlightID: SettingsTab.lockScreen.highlightID(for: "Use colored gauges") - ), - - // Extensions - SettingsSearchEntry( - tab: .extensions, - title: String(localized: "Enable third-party extensions"), - keywords: [String(localized: "extensions"), String(localized: "authorization"), String(localized: "third party")], - highlightID: SettingsTab.extensions.highlightID(for: "Enable third-party extensions") - ), - SettingsSearchEntry( - tab: .extensions, - title: String(localized: "Allow extension live activities"), - keywords: [String(localized: "extensions"), String(localized: "live activities"), String(localized: "permissions")], - highlightID: SettingsTab.extensions.highlightID(for: "Allow extension live activities") - ), - SettingsSearchEntry( - tab: .extensions, - title: String(localized: "Allow extension lock screen widgets"), - keywords: [String(localized: "extensions"), String(localized: "lock screen"), String(localized: "widgets")], - highlightID: SettingsTab.extensions.highlightID(for: "Allow extension lock screen widgets") - ), - SettingsSearchEntry( - tab: .extensions, - title: String(localized: "Enable extension diagnostics logging"), - keywords: [String(localized: "extensions"), String(localized: "diagnostics"), String(localized: "logging")], - highlightID: SettingsTab.extensions.highlightID(for: "Enable extension diagnostics logging") - ), - SettingsSearchEntry( - tab: .extensions, - title: String(localized: "Manage app permissions"), - keywords: [String(localized: "extensions"), String(localized: "permissions"), String(localized: "apps")], - highlightID: SettingsTab.extensions.highlightID(for: "App permissions list") - ), - - // Shortcuts - SettingsSearchEntry( - tab: .shortcuts, - title: String(localized: "Enable global keyboard shortcuts"), - keywords: [String(localized: "keyboard"), String(localized: "shortcut")], - highlightID: SettingsTab.shortcuts.highlightID(for: "Enable global keyboard shortcuts") - ), - - // Timer - SettingsSearchEntry( - tab: .timer, - title: String(localized: "Enable timer feature"), - keywords: [String(localized: "timer"), String(localized: "enable")], - highlightID: SettingsTab.timer.highlightID(for: "Enable timer feature") - ), - SettingsSearchEntry( - tab: .timer, - title: String(localized: "Mirror macOS Clock timers"), - keywords: [String(localized: "system timer"), String(localized: "clock app")], - highlightID: SettingsTab.timer.highlightID(for: "Mirror macOS Clock timers") - ), - SettingsSearchEntry( - tab: .timer, - title: String(localized: "Show lock screen timer widget"), - keywords: [String(localized: "lock screen"), String(localized: "timer widget")], - highlightID: SettingsTab.timer.highlightID(for: "Show lock screen timer widget") - ), - SettingsSearchEntry( - tab: .timer, - title: String(localized: "Timer surface"), - keywords: [String(localized: "timer glass"), String(localized: "classic"), String(localized: "blur")], - highlightID: SettingsTab.timer.highlightID(for: "Timer surface") - ), - SettingsSearchEntry( - tab: .timer, - title: String(localized: "Timer glass material"), - keywords: [String(localized: "frosted"), String(localized: "liquid"), String(localized: "timer material")], - highlightID: SettingsTab.timer.highlightID(for: "Timer glass material") - ), - SettingsSearchEntry( - tab: .timer, - title: String(localized: "Timer liquid mode"), - keywords: [String(localized: "timer"), String(localized: "standard"), String(localized: "custom")], - highlightID: SettingsTab.timer.highlightID(for: "Timer liquid mode") - ), - SettingsSearchEntry( - tab: .timer, - title: String(localized: "Timer widget variant"), - keywords: [String(localized: "timer variant"), String(localized: "liquid")], - highlightID: SettingsTab.timer.highlightID(for: "Timer widget variant") - ), - SettingsSearchEntry( - tab: .timer, - title: String(localized: "Timer tint"), - keywords: [String(localized: "timer colour"), String(localized: "preset")], - highlightID: SettingsTab.timer.highlightID(for: "Timer tint") - ), - SettingsSearchEntry( - tab: .timer, - title: String(localized: "Solid colour"), - keywords: [String(localized: "timer colour"), String(localized: "custom")], - highlightID: SettingsTab.timer.highlightID(for: "Solid colour") - ), - SettingsSearchEntry( - tab: .timer, - title: String(localized: "Progress style"), - keywords: [String(localized: "progress"), String(localized: "bar"), String(localized: "ring")], - highlightID: SettingsTab.timer.highlightID(for: "Progress style") - ), - SettingsSearchEntry( - tab: .timer, - title: String(localized: "Accent colour"), - keywords: [String(localized: "accent"), String(localized: "timer")], - highlightID: SettingsTab.timer.highlightID(for: "Accent colour") - ), - - // Stats - SettingsSearchEntry( - tab: .stats, - title: String(localized: "Enable system stats monitoring"), - keywords: [String(localized: "stats"), String(localized: "monitoring")], - highlightID: SettingsTab.stats.highlightID(for: "Enable system stats monitoring") - ), - SettingsSearchEntry( - tab: .stats, - title: String(localized: "Stop monitoring after closing the notch"), - keywords: [String(localized: "stats"), String(localized: "auto stop")], - highlightID: SettingsTab.stats.highlightID(for: "Stop monitoring after closing the notch") - ), - SettingsSearchEntry( - tab: .stats, - title: String(localized: "CPU Usage"), - keywords: [String(localized: "cpu"), String(localized: "graph")], - highlightID: SettingsTab.stats.highlightID(for: "CPU Usage") - ), - SettingsSearchEntry( - tab: .stats, - title: String(localized: "Memory Usage"), - keywords: [String(localized: "memory"), String(localized: "ram")], - highlightID: SettingsTab.stats.highlightID(for: "Memory Usage") - ), - SettingsSearchEntry( - tab: .stats, - title: String(localized: "GPU Usage"), - keywords: [String(localized: "gpu"), String(localized: "graphics")], - highlightID: SettingsTab.stats.highlightID(for: "GPU Usage") - ), - SettingsSearchEntry( - tab: .stats, - title: String(localized: "Network Activity"), - keywords: [String(localized: "network"), String(localized: "graph")], - highlightID: SettingsTab.stats.highlightID(for: "Network Activity") - ), - SettingsSearchEntry( - tab: .stats, - title: String(localized: "Disk I/O"), - keywords: [String(localized: "disk"), String(localized: "io")], - highlightID: SettingsTab.stats.highlightID(for: "Disk I/O") - ), - - // Clipboard - SettingsSearchEntry( - tab: .clipboard, - title: String(localized: "Enable Clipboard Manager"), - keywords: [String(localized: "clipboard"), String(localized: "manager")], - highlightID: SettingsTab.clipboard.highlightID(for: "Enable Clipboard Manager") - ), - SettingsSearchEntry( - tab: .clipboard, - title: String(localized: "Show Clipboard Icon"), - keywords: [String(localized: "icon"), String(localized: "clipboard")], - highlightID: SettingsTab.clipboard.highlightID(for: "Show Clipboard Icon") - ), - SettingsSearchEntry( - tab: .clipboard, - title: String(localized: "Display Mode"), - keywords: [String(localized: "list"), String(localized: "grid"), String(localized: "clipboard")], - highlightID: SettingsTab.clipboard.highlightID(for: "Display Mode") - ), - SettingsSearchEntry( - tab: .clipboard, - title: String(localized: "History Size"), - keywords: [String(localized: "history"), String(localized: "clipboard")], - highlightID: SettingsTab.clipboard.highlightID(for: "History Size") - ), - - // Screen Assistant - SettingsSearchEntry( - tab: .screenAssistant, - title: String(localized: "Enable Screen Assistant"), - keywords: [String(localized: "screen assistant"), String(localized: "ai")], - highlightID: SettingsTab.screenAssistant.highlightID(for: "Enable Screen Assistant") - ), - SettingsSearchEntry( - tab: .screenAssistant, - title: String(localized: "Display Mode"), - keywords: [String(localized: "screen assistant"), String(localized: "mode")], - highlightID: SettingsTab.screenAssistant.highlightID(for: "Display Mode") - ), - - // Color Picker - SettingsSearchEntry( - tab: .colorPicker, - title: String(localized: "Enable Color Picker"), - keywords: [String(localized: "color picker"), String(localized: "eyedropper")], - highlightID: SettingsTab.colorPicker.highlightID(for: "Enable Color Picker") - ), - SettingsSearchEntry( - tab: .colorPicker, - title: String(localized: "Show Color Picker Icon"), - keywords: [String(localized: "color icon"), String(localized: "toolbar")], - highlightID: SettingsTab.colorPicker.highlightID(for: "Show Color Picker Icon") - ), - SettingsSearchEntry( - tab: .colorPicker, - title: String(localized: "Display Mode"), - keywords: [String(localized: "color"), String(localized: "list")], - highlightID: SettingsTab.colorPicker.highlightID(for: "Display Mode") - ), - SettingsSearchEntry( - tab: .colorPicker, - title: String(localized: "History Size"), - keywords: [String(localized: "color history")], - highlightID: SettingsTab.colorPicker.highlightID(for: "History Size") - ), - SettingsSearchEntry( - tab: .colorPicker, - title: String(localized: "Show All Color Formats"), - keywords: [String(localized: "hex"), String(localized: "hsl"), String(localized: "color formats")], - highlightID: SettingsTab.colorPicker.highlightID(for: "Show All Color Formats") - ) - ] - } + SettingsSearchEntry(tab: .general, title: "Show on a specific display", keywords: ["preferred screen", "display picker"], highlightID: SettingsTab.general.highlightID(for: "Show on a specific display")), + SettingsSearchEntry(tab: .general, title: "Automatically switch displays", keywords: ["auto switch", "displays"], highlightID: SettingsTab.general.highlightID(for: "Automatically switch displays")), + SettingsSearchEntry(tab: .general, title: "Hide Dynamic Island during screenshots & recordings", keywords: ["privacy", "screenshot", "recording"], highlightID: SettingsTab.general.highlightID(for: "Hide Dynamic Island during screenshots & recordings")), + SettingsSearchEntry(tab: .general, title: "Enable gestures", keywords: ["gestures", "trackpad"], highlightID: SettingsTab.general.highlightID(for: "Enable gestures")), + SettingsSearchEntry(tab: .general, title: "Close gesture", keywords: ["pinch", "swipe"], highlightID: SettingsTab.general.highlightID(for: "Close gesture")), + SettingsSearchEntry(tab: .general, title: "Reverse swipe gestures", keywords: ["reverse", "swipe", "media"], highlightID: SettingsTab.general.highlightID(for: "Reverse swipe gestures")), + SettingsSearchEntry(tab: .general, title: "Reverse scroll gestures", keywords: ["reverse", "scroll", "open", "close"], highlightID: SettingsTab.general.highlightID(for: "Reverse scroll gestures")), + SettingsSearchEntry(tab: .general, title: "Extend hover area", keywords: ["hover", "cursor"], highlightID: SettingsTab.general.highlightID(for: "Extend hover area")), + SettingsSearchEntry(tab: .general, title: "Enable haptics", keywords: ["haptic", "feedback"], highlightID: SettingsTab.general.highlightID(for: "Enable haptics")), + SettingsSearchEntry(tab: .general, title: "Open notch on hover", keywords: ["hover to open", "auto open"], highlightID: SettingsTab.general.highlightID(for: "Open notch on hover")), + SettingsSearchEntry(tab: .general, title: "Notch display height", keywords: ["display height", "menu bar size"], highlightID: SettingsTab.general.highlightID(for: "Notch display height")), + + // Live Activities + SettingsSearchEntry(tab: .liveActivities, title: "Enable Screen Recording Detection", keywords: ["screen recording", "indicator"], highlightID: SettingsTab.liveActivities.highlightID(for: "Enable Screen Recording Detection")), + SettingsSearchEntry(tab: .liveActivities, title: "Show Recording Indicator", keywords: ["recording indicator", "red dot"], highlightID: SettingsTab.liveActivities.highlightID(for: "Show Recording Indicator")), + SettingsSearchEntry(tab: .liveActivities, title: "Enable Focus Detection", keywords: ["focus", "do not disturb", "dnd"], highlightID: SettingsTab.liveActivities.highlightID(for: "Enable Focus Detection")), + SettingsSearchEntry(tab: .liveActivities, title: "Show Focus Indicator", keywords: ["focus icon", "moon"], highlightID: SettingsTab.liveActivities.highlightID(for: "Show Focus Indicator")), + SettingsSearchEntry(tab: .liveActivities, title: "Show Focus Label", keywords: ["focus label", "text"], highlightID: SettingsTab.liveActivities.highlightID(for: "Show Focus Label")), + SettingsSearchEntry(tab: .liveActivities, title: "Enable Camera Detection", keywords: ["camera", "privacy indicator"], highlightID: SettingsTab.liveActivities.highlightID(for: "Enable Camera Detection")), + SettingsSearchEntry(tab: .liveActivities, title: "Enable Microphone Detection", keywords: ["microphone", "privacy"], highlightID: SettingsTab.liveActivities.highlightID(for: "Enable Microphone Detection")), + SettingsSearchEntry(tab: .liveActivities, title: "Enable music live activity", keywords: ["music", "now playing"], highlightID: SettingsTab.liveActivities.highlightID(for: "Enable music live activity")), + SettingsSearchEntry(tab: .liveActivities, title: "Enable reminder live activity", keywords: ["reminder", "live activity"], highlightID: SettingsTab.liveActivities.highlightID(for: "Enable reminder live activity")), + + // Battery (Charge) + SettingsSearchEntry(tab: .battery, title: "Show battery indicator", keywords: ["battery hud", "charge"], highlightID: SettingsTab.battery.highlightID(for: "Show battery indicator")), + SettingsSearchEntry(tab: .battery, title: "Show battery percentage", keywords: ["battery percent"], highlightID: SettingsTab.battery.highlightID(for: "Show battery percentage")), + SettingsSearchEntry(tab: .battery, title: "Show power status notifications", keywords: ["notifications", "power"], highlightID: SettingsTab.battery.highlightID(for: "Show power status notifications")), + SettingsSearchEntry(tab: .battery, title: "Show power status icons", keywords: ["power icons", "charging icon"], highlightID: SettingsTab.battery.highlightID(for: "Show power status icons")), + SettingsSearchEntry(tab: .battery, title: "Play low battery alert sound", keywords: ["low battery", "alert", "sound"], highlightID: SettingsTab.battery.highlightID(for: "Play low battery alert sound")), + + // HUDs + SettingsSearchEntry(tab: .devices, title: "Show Bluetooth device connections", keywords: ["bluetooth", "hud"], highlightID: SettingsTab.devices.highlightID(for: "Show Bluetooth device connections")), + SettingsSearchEntry(tab: .devices, title: "Use circular battery indicator", keywords: ["battery", "circular"], highlightID: SettingsTab.devices.highlightID(for: "Use circular battery indicator")), + SettingsSearchEntry(tab: .devices, title: "Show battery percentage text in HUD", keywords: ["battery text"], highlightID: SettingsTab.devices.highlightID(for: "Show battery percentage text in HUD")), + SettingsSearchEntry(tab: .devices, title: "Scroll device name in HUD", keywords: ["marquee", "device name"], highlightID: SettingsTab.devices.highlightID(for: "Scroll device name in HUD")), + SettingsSearchEntry(tab: .devices, title: "Use 3D Bluetooth HUD icon", keywords: ["bluetooth", "3d", "animation", "mov"], highlightID: SettingsTab.devices.highlightID(for: "Use 3D Bluetooth HUD icon")), + SettingsSearchEntry(tab: .devices, title: "Color-coded battery display", keywords: ["color", "battery"], highlightID: SettingsTab.devices.highlightID(for: "Color-coded battery display")), + SettingsSearchEntry(tab: .hudAndOSD, title: "Color-coded volume display", keywords: ["volume", "color"], highlightID: SettingsTab.hudAndOSD.highlightID(for: "Color-coded volume display")), + SettingsSearchEntry(tab: .hudAndOSD, title: "Smooth color transitions", keywords: ["gradient", "smooth"], highlightID: SettingsTab.hudAndOSD.highlightID(for: "Smooth color transitions")), + SettingsSearchEntry(tab: .hudAndOSD, title: "Show percentages beside progress bars", keywords: ["percentages", "progress"], highlightID: SettingsTab.hudAndOSD.highlightID(for: "Show percentages beside progress bars")), + SettingsSearchEntry(tab: .hudAndOSD, title: "HUD style", keywords: ["inline", "compact"], highlightID: SettingsTab.hudAndOSD.highlightID(for: "HUD style")), + SettingsSearchEntry(tab: .hudAndOSD, title: "Progressbar style", keywords: ["progress", "style"], highlightID: SettingsTab.hudAndOSD.highlightID(for: "Progressbar style")), + SettingsSearchEntry(tab: .hudAndOSD, title: "Enable glowing effect", keywords: ["glow", "indicator"], highlightID: SettingsTab.hudAndOSD.highlightID(for: "Enable glowing effect")), + SettingsSearchEntry(tab: .hudAndOSD, title: "Use accent color", keywords: ["accent", "color"], highlightID: SettingsTab.hudAndOSD.highlightID(for: "Use accent color")), + + // Custom OSD + SettingsSearchEntry(tab: .hudAndOSD, title: "Enable Custom OSD", keywords: ["osd", "on-screen display", "custom osd"], highlightID: SettingsTab.hudAndOSD.highlightID(for: "Enable Custom OSD")), + SettingsSearchEntry(tab: .hudAndOSD, title: "Volume OSD", keywords: ["volume", "osd"], highlightID: SettingsTab.hudAndOSD.highlightID(for: "Volume OSD")), + SettingsSearchEntry(tab: .hudAndOSD, title: "Brightness OSD", keywords: ["brightness", "osd"], highlightID: SettingsTab.hudAndOSD.highlightID(for: "Brightness OSD")), + SettingsSearchEntry(tab: .hudAndOSD, title: "Keyboard Backlight OSD", keywords: ["keyboard", "backlight", "osd"], highlightID: SettingsTab.hudAndOSD.highlightID(for: "Keyboard Backlight OSD")), + SettingsSearchEntry(tab: .hudAndOSD, title: "Material", keywords: ["material", "frosted", "liquid", "glass", "solid", "osd"], highlightID: SettingsTab.hudAndOSD.highlightID(for: "Material")), + SettingsSearchEntry(tab: .hudAndOSD, title: "Icon & Progress Color", keywords: ["color", "icon", "white", "black", "gray", "osd"], highlightID: SettingsTab.hudAndOSD.highlightID(for: "Icon & Progress Color")), + + // Media + SettingsSearchEntry(tab: .media, title: "Music Source", keywords: ["media source", "controller"], highlightID: SettingsTab.media.highlightID(for: "Music Source")), + SettingsSearchEntry(tab: .media, title: "Skip buttons", keywords: ["skip", "controls", "±10"], highlightID: SettingsTab.media.highlightID(for: "Skip buttons")), + SettingsSearchEntry(tab: .media, title: "Sneak Peek Style", keywords: ["sneak peek", "preview"], highlightID: SettingsTab.media.highlightID(for: "Sneak Peek Style")), + SettingsSearchEntry(tab: .media, title: "Enable lyrics", keywords: ["lyrics", "song text"], highlightID: SettingsTab.media.highlightID(for: "Enable lyrics")), + SettingsSearchEntry(tab: .media, title: "Show Change Media Output control", keywords: ["airplay", "route picker", "media output"], highlightID: SettingsTab.media.highlightID(for: "Show Change Media Output control")), + SettingsSearchEntry(tab: .media, title: "Enable album art parallax", keywords: ["parallax", "lock screen", "album art"], highlightID: SettingsTab.media.highlightID(for: "Enable album art parallax")), + SettingsSearchEntry(tab: .media, title: "Enable album art parallax effect", keywords: ["parallax", "parallax effect", "album art"], highlightID: SettingsTab.media.highlightID(for: "Enable album art parallax effect")), + + // Calendar + SettingsSearchEntry(tab: .calendar, title: "Show calendar", keywords: ["calendar", "events"], highlightID: SettingsTab.calendar.highlightID(for: "Show calendar")), + SettingsSearchEntry(tab: .calendar, title: "Enable reminder live activity", keywords: ["reminder", "live activity"], highlightID: SettingsTab.calendar.highlightID(for: "Enable reminder live activity")), + SettingsSearchEntry(tab: .calendar, title: "Countdown style", keywords: ["reminder countdown"], highlightID: SettingsTab.calendar.highlightID(for: "Countdown style")), + SettingsSearchEntry(tab: .calendar, title: "Show lock screen reminder", keywords: ["lock screen", "reminder widget"], highlightID: SettingsTab.calendar.highlightID(for: "Show lock screen reminder")), + SettingsSearchEntry(tab: .calendar, title: "Show next calendar event", keywords: ["calendar widget", "lock screen", "next event"], highlightID: SettingsTab.calendar.highlightID(for: "Show next calendar event")), + SettingsSearchEntry(tab: .calendar, title: "Show events within the next", keywords: ["calendar widget", "lookahead"], highlightID: SettingsTab.calendar.highlightID(for: "Show events within the next")), + SettingsSearchEntry(tab: .calendar, title: "Show events from all calendars", keywords: ["calendar widget", "selection"], highlightID: SettingsTab.calendar.highlightID(for: "Show events from all calendars")), + SettingsSearchEntry(tab: .calendar, title: "Show countdown", keywords: ["calendar widget", "countdown"], highlightID: SettingsTab.calendar.highlightID(for: "Show countdown")), + SettingsSearchEntry(tab: .calendar, title: "Show event for entire duration", keywords: ["calendar widget", "duration"], highlightID: SettingsTab.calendar.highlightID(for: "Show event for entire duration")), + SettingsSearchEntry(tab: .calendar, title: "Hide active event and show next upcoming event", keywords: ["calendar widget", "after start"], highlightID: SettingsTab.calendar.highlightID(for: "Hide active event and show next upcoming event")), + SettingsSearchEntry(tab: .calendar, title: "Show time remaining", keywords: ["calendar widget", "remaining"], highlightID: SettingsTab.calendar.highlightID(for: "Show time remaining")), + SettingsSearchEntry(tab: .calendar, title: "Show start time after event begins", keywords: ["calendar widget", "start time"], highlightID: SettingsTab.calendar.highlightID(for: "Show start time after event begins")), + SettingsSearchEntry(tab: .calendar, title: "Chip color", keywords: ["reminder chip", "color"], highlightID: SettingsTab.calendar.highlightID(for: "Chip color")), + SettingsSearchEntry(tab: .calendar, title: "Hide all-day events", keywords: ["calendar", "all-day"], highlightID: SettingsTab.calendar.highlightID(for: "Hide all-day events")), + SettingsSearchEntry(tab: .calendar, title: "Hide completed reminders", keywords: ["reminder", "completed"], highlightID: SettingsTab.calendar.highlightID(for: "Hide completed reminders")), + SettingsSearchEntry(tab: .calendar, title: "Show full event titles", keywords: ["calendar", "titles"], highlightID: SettingsTab.calendar.highlightID(for: "Show full event titles")), + SettingsSearchEntry(tab: .calendar, title: "Auto-scroll to next event", keywords: ["calendar", "scroll"], highlightID: SettingsTab.calendar.highlightID(for: "Auto-scroll to next event")), + + // Shelf + SettingsSearchEntry(tab: .shelf, title: "Enable shelf", keywords: ["shelf", "dock"], highlightID: SettingsTab.shelf.highlightID(for: "Enable shelf")), + SettingsSearchEntry(tab: .shelf, title: "Open shelf tab by default if items added", keywords: ["auto open", "shelf tab"], highlightID: SettingsTab.shelf.highlightID(for: "Open shelf tab by default if items added")), + SettingsSearchEntry(tab: .shelf, title: "Expanded drag detection area", keywords: ["shelf", "drag"], highlightID: SettingsTab.shelf.highlightID(for: "Expanded drag detection area")), + SettingsSearchEntry(tab: .shelf, title: "Copy items on drag", keywords: ["shelf", "drag", "copy"], highlightID: SettingsTab.shelf.highlightID(for: "Copy items on drag")), + SettingsSearchEntry(tab: .shelf, title: "Remove from shelf after dragging", keywords: ["shelf", "drag", "remove"], highlightID: SettingsTab.shelf.highlightID(for: "Remove from shelf after dragging")), + SettingsSearchEntry(tab: .shelf, title: "Quick Share Service", keywords: ["shelf", "share", "airdrop"], highlightID: SettingsTab.shelf.highlightID(for: "Quick Share Service")), + + // Appearance + SettingsSearchEntry(tab: .appearance, title: "Settings icon in notch", keywords: ["settings button", "toolbar"], highlightID: SettingsTab.appearance.highlightID(for: "Settings icon in notch")), + SettingsSearchEntry(tab: .appearance, title: "Enable window shadow", keywords: ["shadow", "appearance"], highlightID: SettingsTab.appearance.highlightID(for: "Enable window shadow")), + SettingsSearchEntry(tab: .appearance, title: "Corner radius scaling", keywords: ["corner radius", "shape"], highlightID: SettingsTab.appearance.highlightID(for: "Corner radius scaling")), + SettingsSearchEntry(tab: .appearance, title: "Use simpler close animation", keywords: ["close animation", "notch"], highlightID: SettingsTab.appearance.highlightID(for: "Use simpler close animation")), + SettingsSearchEntry(tab: .appearance, title: "Notch Width", keywords: ["expanded notch", "width", "resize"], highlightID: SettingsTab.appearance.highlightID(for: "Expanded notch width")), + SettingsSearchEntry(tab: .appearance, title: "Enable colored spectrograms", keywords: ["spectrogram", "audio"], highlightID: SettingsTab.appearance.highlightID(for: "Enable colored spectrograms")), + SettingsSearchEntry(tab: .appearance, title: "Enable blur effect behind album art", keywords: ["blur", "album art"], highlightID: SettingsTab.appearance.highlightID(for: "Enable blur effect behind album art")), + SettingsSearchEntry(tab: .appearance, title: "Slider color", keywords: ["slider", "accent"], highlightID: SettingsTab.appearance.highlightID(for: "Slider color")), + SettingsSearchEntry(tab: .appearance, title: "Enable Dynamic mirror", keywords: ["mirror", "reflection"], highlightID: SettingsTab.appearance.highlightID(for: "Enable Dynamic mirror")), + SettingsSearchEntry(tab: .appearance, title: "Mirror shape", keywords: ["mirror shape", "circle", "rectangle"], highlightID: SettingsTab.appearance.highlightID(for: "Mirror shape")), + SettingsSearchEntry(tab: .appearance, title: "Show cool face animation while inactivity", keywords: ["face animation", "idle"], highlightID: SettingsTab.appearance.highlightID(for: "Show cool face animation while inactivity")), + SettingsSearchEntry(tab: .appearance, title: "App icon", keywords: ["app icon", "custom icon"], highlightID: SettingsTab.appearance.highlightID(for: "App icon")), + + // Lock Screen + SettingsSearchEntry(tab: .lockScreen, title: "Enable lock screen live activity", keywords: ["lock screen", "live activity"], highlightID: SettingsTab.lockScreen.highlightID(for: "Enable lock screen live activity")), + SettingsSearchEntry(tab: .lockScreen, title: "Play lock/unlock sounds", keywords: ["chime", "sound"], highlightID: SettingsTab.lockScreen.highlightID(for: "Play lock/unlock sounds")), + SettingsSearchEntry(tab: .lockScreen, title: "Material", keywords: ["glass", "frosted", "liquid"], highlightID: SettingsTab.lockScreen.highlightID(for: "Material")), + SettingsSearchEntry(tab: .lockScreen, title: "Show lock screen media panel", keywords: ["media panel", "lock screen media"], highlightID: SettingsTab.lockScreen.highlightID(for: "Show lock screen media panel")), + SettingsSearchEntry(tab: .lockScreen, title: "Show media app icon", keywords: ["app icon", "media"], highlightID: SettingsTab.lockScreen.highlightID(for: "Show media app icon")), + SettingsSearchEntry(tab: .lockScreen, title: "Show panel border", keywords: ["panel border"], highlightID: SettingsTab.lockScreen.highlightID(for: "Show panel border")), + SettingsSearchEntry(tab: .lockScreen, title: "Enable media panel blur", keywords: ["blur", "media panel"], highlightID: SettingsTab.lockScreen.highlightID(for: "Enable media panel blur")), + SettingsSearchEntry(tab: .lockScreen, title: "Show lock screen timer", keywords: ["timer widget", "lock screen timer"], highlightID: SettingsTab.lockScreen.highlightID(for: "Show lock screen timer")), + SettingsSearchEntry(tab: .lockScreen, title: "Timer surface", keywords: ["timer glass", "classic", "blur"], highlightID: SettingsTab.lockScreen.highlightID(for: "Timer surface")), + SettingsSearchEntry(tab: .lockScreen, title: "Timer glass material", keywords: ["frosted", "liquid", "timer material"], highlightID: SettingsTab.lockScreen.highlightID(for: "Timer glass material")), + SettingsSearchEntry(tab: .lockScreen, title: "Timer liquid mode", keywords: ["timer", "standard", "custom"], highlightID: SettingsTab.lockScreen.highlightID(for: "Timer liquid mode")), + SettingsSearchEntry(tab: .lockScreen, title: "Timer widget variant", keywords: ["timer variant", "liquid"], highlightID: SettingsTab.lockScreen.highlightID(for: "Timer widget variant")), + SettingsSearchEntry(tab: .lockScreen, title: "Show lock screen weather", keywords: ["weather widget"], highlightID: SettingsTab.lockScreen.highlightID(for: "Show lock screen weather")), + SettingsSearchEntry(tab: .lockScreen, title: "Layout", keywords: ["inline", "circular", "weather layout"], highlightID: SettingsTab.lockScreen.highlightID(for: "Layout")), + SettingsSearchEntry(tab: .lockScreen, title: "Weather data provider", keywords: ["wttr", "open meteo"], highlightID: SettingsTab.lockScreen.highlightID(for: "Weather data provider")), + SettingsSearchEntry(tab: .lockScreen, title: "Temperature unit", keywords: ["celsius", "fahrenheit"], highlightID: SettingsTab.lockScreen.highlightID(for: "Temperature unit")), + SettingsSearchEntry(tab: .lockScreen, title: "Show location label", keywords: ["location", "weather"], highlightID: SettingsTab.lockScreen.highlightID(for: "Show location label")), + SettingsSearchEntry(tab: .lockScreen, title: "Show charging status", keywords: ["charging", "weather"], highlightID: SettingsTab.lockScreen.highlightID(for: "Show charging status")), + SettingsSearchEntry(tab: .lockScreen, title: "Show charging percentage", keywords: ["charging percentage"], highlightID: SettingsTab.lockScreen.highlightID(for: "Show charging percentage")), + SettingsSearchEntry(tab: .lockScreen, title: "Show battery indicator", keywords: ["battery gauge", "weather"], highlightID: SettingsTab.lockScreen.highlightID(for: "Show battery indicator")), + SettingsSearchEntry(tab: .lockScreen, title: "Use MacBook icon when on battery", keywords: ["laptop icon", "battery"], highlightID: SettingsTab.lockScreen.highlightID(for: "Use MacBook icon when on battery")), + SettingsSearchEntry(tab: .lockScreen, title: "Show Bluetooth battery", keywords: ["bluetooth", "gauge"], highlightID: SettingsTab.lockScreen.highlightID(for: "Show Bluetooth battery")), + SettingsSearchEntry(tab: .lockScreen, title: "Show AQI widget", keywords: ["air quality", "aqi"], highlightID: SettingsTab.lockScreen.highlightID(for: "Show AQI widget")), + SettingsSearchEntry(tab: .lockScreen, title: "Air quality scale", keywords: ["aqi", "scale"], highlightID: SettingsTab.lockScreen.highlightID(for: "Air quality scale")), + SettingsSearchEntry(tab: .lockScreen, title: "Use colored gauges", keywords: ["gauge tint", "monochrome"], highlightID: SettingsTab.lockScreen.highlightID(for: "Use colored gauges")), + SettingsSearchEntry(tab: .lockScreen, title: "Show lock screen reminder", keywords: ["lock screen", "reminder widget"], highlightID: SettingsTab.lockScreen.highlightID(for: "Show lock screen reminder")), + SettingsSearchEntry(tab: .lockScreen, title: "Chip color", keywords: ["reminder chip", "color"], highlightID: SettingsTab.lockScreen.highlightID(for: "Chip color")), + SettingsSearchEntry(tab: .lockScreen, title: "Reminder alignment", keywords: ["reminder", "alignment", "position"], highlightID: SettingsTab.lockScreen.highlightID(for: "Reminder alignment")), + SettingsSearchEntry(tab: .lockScreen, title: "Reminder vertical offset", keywords: ["reminder", "offset", "position"], highlightID: SettingsTab.lockScreen.highlightID(for: "Reminder vertical offset")), + + // Extensions + SettingsSearchEntry(tab: .extensions, title: "Enable third-party extensions", keywords: ["extensions", "authorization", "third party"], highlightID: SettingsTab.extensions.highlightID(for: "Enable third-party extensions")), + SettingsSearchEntry(tab: .extensions, title: "Allow extension live activities", keywords: ["extensions", "live activities", "permissions"], highlightID: SettingsTab.extensions.highlightID(for: "Allow extension live activities")), + SettingsSearchEntry(tab: .extensions, title: "Allow extension lock screen widgets", keywords: ["extensions", "lock screen", "widgets"], highlightID: SettingsTab.extensions.highlightID(for: "Allow extension lock screen widgets")), + SettingsSearchEntry(tab: .extensions, title: "Enable extension diagnostics logging", keywords: ["extensions", "diagnostics", "logging"], highlightID: SettingsTab.extensions.highlightID(for: "Enable extension diagnostics logging")), + SettingsSearchEntry(tab: .extensions, title: "Manage app permissions", keywords: ["extensions", "permissions", "apps"], highlightID: SettingsTab.extensions.highlightID(for: "App permissions list")), + + // Shortcuts + SettingsSearchEntry(tab: .shortcuts, title: "Enable global keyboard shortcuts", keywords: ["keyboard", "shortcut"], highlightID: SettingsTab.shortcuts.highlightID(for: "Enable global keyboard shortcuts")), + + // Timer + SettingsSearchEntry(tab: .timer, title: "Enable timer feature", keywords: ["timer", "enable"], highlightID: SettingsTab.timer.highlightID(for: "Enable timer feature")), + SettingsSearchEntry(tab: .timer, title: "Mirror macOS Clock timers", keywords: ["system timer", "clock app"], highlightID: SettingsTab.timer.highlightID(for: "Mirror macOS Clock timers")), + SettingsSearchEntry(tab: .timer, title: "Show lock screen timer widget", keywords: ["lock screen", "timer widget"], highlightID: SettingsTab.timer.highlightID(for: "Show lock screen timer widget")), + SettingsSearchEntry(tab: .timer, title: "Timer surface", keywords: ["timer glass", "classic", "blur"], highlightID: SettingsTab.timer.highlightID(for: "Timer surface")), + SettingsSearchEntry(tab: .timer, title: "Timer glass material", keywords: ["frosted", "liquid", "timer material"], highlightID: SettingsTab.timer.highlightID(for: "Timer glass material")), + SettingsSearchEntry(tab: .timer, title: "Timer liquid mode", keywords: ["timer", "standard", "custom"], highlightID: SettingsTab.timer.highlightID(for: "Timer liquid mode")), + SettingsSearchEntry(tab: .timer, title: "Timer widget variant", keywords: ["timer variant", "liquid"], highlightID: SettingsTab.timer.highlightID(for: "Timer widget variant")), + SettingsSearchEntry(tab: .timer, title: "Timer tint", keywords: ["timer colour", "preset"], highlightID: SettingsTab.timer.highlightID(for: "Timer tint")), + SettingsSearchEntry(tab: .timer, title: "Solid colour", keywords: ["timer colour", "custom"], highlightID: SettingsTab.timer.highlightID(for: "Solid colour")), + SettingsSearchEntry(tab: .timer, title: "Progress style", keywords: ["progress", "bar", "ring"], highlightID: SettingsTab.timer.highlightID(for: "Progress style")), + SettingsSearchEntry(tab: .timer, title: "Accent colour", keywords: ["accent", "timer"], highlightID: SettingsTab.timer.highlightID(for: "Accent colour")), + + // Stats + SettingsSearchEntry(tab: .stats, title: "Enable system stats monitoring", keywords: ["stats", "monitoring"], highlightID: SettingsTab.stats.highlightID(for: "Enable system stats monitoring")), + SettingsSearchEntry(tab: .stats, title: "Stop monitoring after closing the notch", keywords: ["stats", "auto stop"], highlightID: SettingsTab.stats.highlightID(for: "Stop monitoring after closing the notch")), + SettingsSearchEntry(tab: .stats, title: "CPU Usage", keywords: ["cpu", "graph"], highlightID: SettingsTab.stats.highlightID(for: "CPU Usage")), + SettingsSearchEntry(tab: .stats, title: "Memory Usage", keywords: ["memory", "ram"], highlightID: SettingsTab.stats.highlightID(for: "Memory Usage")), + SettingsSearchEntry(tab: .stats, title: "GPU Usage", keywords: ["gpu", "graphics"], highlightID: SettingsTab.stats.highlightID(for: "GPU Usage")), + SettingsSearchEntry(tab: .stats, title: "Network Activity", keywords: ["network", "graph"], highlightID: SettingsTab.stats.highlightID(for: "Network Activity")), + SettingsSearchEntry(tab: .stats, title: "Disk I/O", keywords: ["disk", "io"], highlightID: SettingsTab.stats.highlightID(for: "Disk I/O")), + + // Clipboard + SettingsSearchEntry(tab: .clipboard, title: "Enable Clipboard Manager", keywords: ["clipboard", "manager"], highlightID: SettingsTab.clipboard.highlightID(for: "Enable Clipboard Manager")), + SettingsSearchEntry(tab: .clipboard, title: "Show Clipboard Icon", keywords: ["icon", "clipboard"], highlightID: SettingsTab.clipboard.highlightID(for: "Show Clipboard Icon")), + SettingsSearchEntry(tab: .clipboard, title: "Display Mode", keywords: ["list", "grid", "clipboard"], highlightID: SettingsTab.clipboard.highlightID(for: "Display Mode")), + SettingsSearchEntry(tab: .clipboard, title: "History Size", keywords: ["history", "clipboard"], highlightID: SettingsTab.clipboard.highlightID(for: "History Size")), + + // Screen Assistant + SettingsSearchEntry(tab: .screenAssistant, title: "Enable Screen Assistant", keywords: ["screen assistant", "ai"], highlightID: SettingsTab.screenAssistant.highlightID(for: "Enable Screen Assistant")), + SettingsSearchEntry(tab: .screenAssistant, title: "Display Mode", keywords: ["screen assistant", "mode"], highlightID: SettingsTab.screenAssistant.highlightID(for: "Display Mode")), + + // Color Picker + SettingsSearchEntry(tab: .colorPicker, title: "Enable Color Picker", keywords: ["color picker", "eyedropper"], highlightID: SettingsTab.colorPicker.highlightID(for: "Enable Color Picker")), + SettingsSearchEntry(tab: .colorPicker, title: "Show Color Picker Icon", keywords: ["color icon", "toolbar"], highlightID: SettingsTab.colorPicker.highlightID(for: "Show Color Picker Icon")), + SettingsSearchEntry(tab: .colorPicker, title: "Display Mode", keywords: ["color", "list"], highlightID: SettingsTab.colorPicker.highlightID(for: "Display Mode")), + SettingsSearchEntry(tab: .colorPicker, title: "History Size", keywords: ["color history"], highlightID: SettingsTab.colorPicker.highlightID(for: "History Size")), + SettingsSearchEntry(tab: .colorPicker, title: "Show All Color Formats", keywords: ["hex", "hsl", "color formats"], highlightID: SettingsTab.colorPicker.highlightID(for: "Show All Color Formats")) + ] + } + private func isTabVisible(_ tab: SettingsTab) -> Bool { switch tab { case .timer, .stats, .clipboard, .screenAssistant, .colorPicker, .shelf, .notes: @@ -1542,7 +912,7 @@ struct GeneralSettings: View { var body: some View { Form { Section { - Defaults.Toggle(String(localized: "Enable Minimalistic UI"), key: .enableMinimalisticUI) + Defaults.Toggle("Enable Minimalistic UI", key: .enableMinimalisticUI) .onChange(of: enableMinimalisticUI) { _, newValue in if newValue { // Auto-enable simpler animation mode @@ -1557,9 +927,9 @@ struct GeneralSettings: View { } Section { - Defaults.Toggle(String(localized:"Menubar icon"), key: .menubarIcon) - .settingsHighlight(id: highlightID("Menubar icon")); - LaunchAtLogin.Toggle(String(localized:"Launch at login")) + Defaults.Toggle("Menubar icon", key: .menubarIcon) + .settingsHighlight(id: highlightID("Menubar icon")) + LaunchAtLogin.Toggle("Launch at login") .settingsHighlight(id: highlightID("Launch at login")) Defaults.Toggle(key: .showOnAllDisplays) { Text("Show on all displays") @@ -1578,13 +948,13 @@ struct GeneralSettings: View { } .disabled(showOnAllDisplays) .settingsHighlight(id: highlightID("Show on a specific display")) - Defaults.Toggle(String(localized:"Automatically switch displays"), key: .automaticallySwitchDisplay) + Defaults.Toggle("Automatically switch displays", key: .automaticallySwitchDisplay) .onChange(of: automaticallySwitchDisplay) { NotificationCenter.default.post(name: Notification.Name.automaticallySwitchDisplayChanged, object: nil) } .disabled(showOnAllDisplays) .settingsHighlight(id: highlightID("Automatically switch displays")) - Defaults.Toggle(String(localized:"Hide Dynamic Island during screenshots & recordings"), key: .hideDynamicIslandFromScreenCapture) + Defaults.Toggle("Hide Dynamic Island during screenshots & recordings", key: .hideDynamicIslandFromScreenCapture) .settingsHighlight(id: highlightID("Hide Dynamic Island during screenshots & recordings")) } header: { Text("System features") @@ -1672,17 +1042,18 @@ struct GeneralSettings: View { @ViewBuilder func gestureControls() -> some View { Section { - Defaults.Toggle(String(localized:"Enable gestures"), key: .enableGestures) + Defaults.Toggle("Enable gestures", key: .enableGestures) .disabled(!openNotchOnHover) .settingsHighlight(id: highlightID("Enable gestures")) if enableGestures { - Defaults.Toggle(String(localized:"Media change with horizontal gestures"), key: .enableHorizontalMusicGestures) + Defaults.Toggle("Media change with horizontal gestures", key: .enableHorizontalMusicGestures) .settingsHighlight(id: highlightID("Horizontal media gestures")) if enableHorizontalMusicGestures { Picker("Gesture skip behavior", selection: $musicGestureBehavior) { ForEach(MusicSkipBehavior.allCases) { behavior in - Text(behavior.displayName).tag(behavior) + Text(behavior.displayName) + .tag(behavior) } } .pickerStyle(.segmented) @@ -1692,11 +1063,11 @@ struct GeneralSettings: View { .font(.caption) .foregroundStyle(.secondary) - Defaults.Toggle(String(localized:"Reverse swipe gestures"), key: .reverseSwipeGestures) + Defaults.Toggle("Reverse swipe gestures", key: .reverseSwipeGestures) .settingsHighlight(id: highlightID("Reverse swipe gestures")) } - Defaults.Toggle(String(localized:"Close gesture"), key: .closeGestureEnabled) + Defaults.Toggle("Close gesture", key: .closeGestureEnabled) .settingsHighlight(id: highlightID("Close gesture")) Slider(value: $gestureSensitivity, in: 100...300, step: 100) { HStack { @@ -1707,7 +1078,7 @@ struct GeneralSettings: View { } } - Defaults.Toggle(String(localized:"Reverse open/close scroll gestures"), key: .reverseScrollGestures) + Defaults.Toggle("Reverse open/close scroll gestures", key: .reverseScrollGestures) .settingsHighlight(id: highlightID("Reverse scroll gestures")) } } header: { @@ -1726,11 +1097,11 @@ struct GeneralSettings: View { @ViewBuilder func NotchBehaviour() -> some View { Section { - Defaults.Toggle(String(localized:"Extend hover area"), key: .extendHoverArea) + Defaults.Toggle("Extend hover area", key: .extendHoverArea) .settingsHighlight(id: highlightID("Extend hover area")) - Defaults.Toggle(String(localized:"Enable haptics"), key: .enableHaptics) + Defaults.Toggle("Enable haptics", key: .enableHaptics) .settingsHighlight(id: highlightID("Enable haptics")) - Defaults.Toggle(String(localized:"Open notch on hover"), key: .openNotchOnHover) + Defaults.Toggle("Open notch on hover", key: .openNotchOnHover) .settingsHighlight(id: highlightID("Open notch on hover")) Toggle("Remember last tab", isOn: $coordinator.openLastTabByDefault) if openNotchOnHover { @@ -1761,19 +1132,19 @@ struct Charge: View { Form { if BatteryActivityManager.shared.hasBattery() { Section { - Defaults.Toggle(String(localized: "Show battery indicator"), key: .showBatteryIndicator) + Defaults.Toggle("Show battery indicator", key: .showBatteryIndicator) .settingsHighlight(id: highlightID("Show battery indicator")) - Defaults.Toggle(String(localized: "Show power status notifications"), key: .showPowerStatusNotifications) + Defaults.Toggle("Show power status notifications", key: .showPowerStatusNotifications) .settingsHighlight(id: highlightID("Show power status notifications")) - Defaults.Toggle(String(localized: "Play low battery alert sound"), key: .playLowBatteryAlertSound) + Defaults.Toggle("Play low battery alert sound", key: .playLowBatteryAlertSound) .settingsHighlight(id: highlightID("Play low battery alert sound")) } header: { Text("General") } Section { - Defaults.Toggle(String(localized: "Show battery percentage"), key: .showBatteryPercentage) + Defaults.Toggle("Show battery percentage", key: .showBatteryPercentage) .settingsHighlight(id: highlightID("Show battery percentage")) - Defaults.Toggle(String(localized: "Show power status icons"), key: .showPowerStatusIcons) + Defaults.Toggle("Show power status icons", key: .showPowerStatusIcons) .settingsHighlight(id: highlightID("Show power status icons")) } header: { Text("Battery Information") @@ -1802,12 +1173,12 @@ struct Downloads: View { } var body: some View { - Form { + SwiftUI.Form { Section { - Defaults.Toggle(String(localized: "Enable download detection"), key: .enableDownloadListener) + Defaults.Toggle("Enable download detection", key: .enableDownloadListener) .settingsHighlight(id: highlightID("Enable download detection")) VStack(alignment: .leading, spacing: 12) { - Text(String(localized: "Download indicator style")) + Text("Download indicator style") .font(.system(size: 13, weight: .semibold)) .foregroundStyle(.white) @@ -1875,7 +1246,7 @@ struct Downloads: View { } } - Text(style.localizedName) + Text(style.rawValue) .font(.caption) .fontWeight(.medium) .lineLimit(2) @@ -2013,15 +1384,6 @@ private struct HUDAndOSDSettingsView: View { case circular = "Circular" var id: String { rawValue } - - var title: String { - switch self { - case .hud: return String(localized: "Dynamic Island HUD") - case .osd: return String(localized: "Custom OSD") - case .vertical: return String(localized: "Vertical Bar") - case .circular: return String(localized: "Circular") - } - } } private var paneBackgroundColor: Color { @@ -2032,7 +1394,7 @@ private struct HUDAndOSDSettingsView: View { VStack(spacing: 20) { HStack(spacing: 16) { HUDSelectionCard( - title: String(localized: "Dynamic Island"), + title: "Dynamic Island", isSelected: selectedTab == .hud, action: { selectedTab = .hud @@ -2072,7 +1434,7 @@ private struct HUDAndOSDSettingsView: View { } HUDSelectionCard( - title: String(localized: "Custom OSD"), + title: "Custom OSD", isSelected: selectedTab == .osd, action: { selectedTab = .osd @@ -2114,7 +1476,7 @@ private struct HUDAndOSDSettingsView: View { } HUDSelectionCard( - title: String(localized: "Vertical Bar"), + title: "Vertical Bar", isSelected: selectedTab == .vertical, action: { selectedTab = .vertical @@ -2157,7 +1519,7 @@ private struct HUDAndOSDSettingsView: View { } HUDSelectionCard( - title: String(localized: "Circular"), + title: "Circular", isSelected: selectedTab == .circular, action: { selectedTab = .circular @@ -2426,14 +1788,16 @@ private struct DevicesSettingsView: View { var body: some View { Form { Section { - Defaults.Toggle(String(localized: "Show Bluetooth device connections"), key: .showBluetoothDeviceConnections) + Defaults.Toggle("Show Bluetooth device connections", key: .showBluetoothDeviceConnections) .settingsHighlight(id: highlightID("Show Bluetooth device connections")) - Defaults.Toggle(String(localized: "Use circular battery indicator"), key: .useCircularBluetoothBatteryIndicator) + Defaults.Toggle("Use circular battery indicator", key: .useCircularBluetoothBatteryIndicator) .settingsHighlight(id: highlightID("Use circular battery indicator")) - Defaults.Toggle(String(localized: "Show battery percentage text in HUD"), key: .showBluetoothBatteryPercentageText) + Defaults.Toggle("Show battery percentage text in HUD", key: .showBluetoothBatteryPercentageText) .settingsHighlight(id: highlightID("Show battery percentage text in HUD")) - Defaults.Toggle(String(localized: "Scroll device name in HUD"), key: .showBluetoothDeviceNameMarquee) + Defaults.Toggle("Scroll device name in HUD", key: .showBluetoothDeviceNameMarquee) .settingsHighlight(id: highlightID("Scroll device name in HUD")) + Defaults.Toggle("Use 3D Bluetooth HUD icon", key: .useBluetoothHUD3DIcon) + .settingsHighlight(id: highlightID("Use 3D Bluetooth HUD icon")) } header: { Text("Bluetooth Audio Devices") } footer: { @@ -2443,7 +1807,7 @@ private struct DevicesSettingsView: View { } Section { - Defaults.Toggle(String(localized: "Color-coded battery display"), key: .useColorCodedBatteryDisplay) + Defaults.Toggle("Color-coded battery display", key: .useColorCodedBatteryDisplay) .disabled(colorCodingDisabled) .settingsHighlight(id: highlightID("Color-coded battery display")) } header: { @@ -2497,7 +1861,7 @@ struct HUD: View { if !hasAccessibilityPermission { Section { SettingsPermissionCallout( - message: String(localized: "Accessibility permission lets Dynamic Island replace the native volume, brightness, and keyboard HUDs."), + message: "Accessibility permission lets Dynamic Island replace the native volume, brightness, and keyboard HUDs.", requestAction: { accessibilityPermission.requestAuthorizationPrompt() }, openSettingsAction: { accessibilityPermission.openSystemSettings() } ) @@ -2523,7 +1887,7 @@ struct HUD: View { } Section { - Defaults.Toggle(String(localized: "Play feedback when volume is changed"), key: .playVolumeChangeFeedback) + Defaults.Toggle("Play feedback when volume is changed", key: .playVolumeChangeFeedback) .settingsHighlight(id: highlightID("Play feedback when volume is changed")) .help("Plays the supplied feedback clip whenever you press the hardware volume keys.") } header: { @@ -2535,16 +1899,16 @@ struct HUD: View { } Section { - Defaults.Toggle(String(localized: "Color-coded volume display"), key: .useColorCodedVolumeDisplay) + Defaults.Toggle("Color-coded volume display", key: .useColorCodedVolumeDisplay) .disabled(colorCodingDisabled) .settingsHighlight(id: highlightID("Color-coded volume display")) if !colorCodingDisabled && (Defaults[.useColorCodedBatteryDisplay] || Defaults[.useColorCodedVolumeDisplay]) { - Defaults.Toggle(String(localized: "Smooth color transitions"), key: .useSmoothColorGradient) + Defaults.Toggle("Smooth color transitions", key: .useSmoothColorGradient) .settingsHighlight(id: highlightID("Smooth color transitions")) } - Defaults.Toggle(String(localized: "Show percentages beside progress bars"), key: .showProgressPercentages) + Defaults.Toggle("Show percentages beside progress bars", key: .showProgressPercentages) .settingsHighlight(id: highlightID("Show percentages beside progress bars")) } header: { Text("Dynamic Island Progress Bars") @@ -2589,9 +1953,9 @@ struct HUD: View { .tag(ProgressBarStyle.segmented) } .settingsHighlight(id: highlightID("Progressbar style")) - Defaults.Toggle(String(localized: "Enable glowing effect"), key: .systemEventIndicatorShadow) + Defaults.Toggle("Enable glowing effect", key: .systemEventIndicatorShadow) .settingsHighlight(id: highlightID("Enable glowing effect")) - Defaults.Toggle(String(localized: "Use accent color"), key: .systemEventIndicatorUseAccent) + Defaults.Toggle("Use accent color", key: .systemEventIndicatorUseAccent) .settingsHighlight(id: highlightID("Use accent color")) } header: { HStack { @@ -2642,7 +2006,7 @@ struct Media: View { Section { Picker("Music Source", selection: $mediaController) { ForEach(availableMediaControllers) { controller in - Text(controller.localizedName).tag(controller) + Text(controller.rawValue).tag(controller) } } .onChange(of: mediaController) { _, _ in @@ -2671,7 +2035,7 @@ struct Media: View { } } Section { - Defaults.Toggle(String(localized: "Show media controls in Dynamic Island"), key: .showStandardMediaControls) + Defaults.Toggle("Show media controls in Dynamic Island", key: .showStandardMediaControls) .disabled(enableMinimalisticUI) .settingsHighlight(id: highlightID("Show media controls in Dynamic Island")) @@ -2695,7 +2059,7 @@ struct Media: View { } } if showShuffleAndRepeat { - Defaults.Toggle(String(localized: "Show \"Change Media Output\" control"), key: .showMediaOutputControl) + Defaults.Toggle("Show \"Change Media Output\" control", key: .showMediaOutputControl) .settingsHighlight(id: highlightID("Show Change Media Output control")) .help("Adds the AirPlay/route picker button back to the customizable controls palette.") MusicSlotConfigurationView() @@ -2710,7 +2074,7 @@ struct Media: View { } Section(header: Text("Lock Screen Media")) { - Defaults.Toggle(String(localized: "Enable album art parallax"), key: .lockScreenMusicAlbumParallaxEnabled) + Defaults.Toggle("Enable album art parallax", key: .lockScreenMusicAlbumParallaxEnabled) .settingsHighlight(id: highlightID("Enable album art parallax")) Text("Applies the notch-style parallax effect to the lock screen media widget album art.") .font(.caption) @@ -2740,20 +2104,22 @@ struct Media: View { ) .disabled(standardControlsSuppressed) .help(standardControlsSuppressed ? "Standard notch media controls are hidden while this toggle is off." : "") - Defaults.Toggle(String(localized: "Show floating media controls"), - key: .musicControlWindowEnabled) + Defaults.Toggle( + "Show floating media controls", + key: .musicControlWindowEnabled + ) .disabled(!coordinator.musicLiveActivityEnabled || standardControlsSuppressed) .help("Displays play/pause and skip buttons beside the notch while music is active. Disabled by default.") Toggle("Enable sneak peek", isOn: $enableSneakPeek) Toggle("Show sneak peek on playback changes", isOn: $showSneakPeekOnTrackChange) .disabled(!enableSneakPeek) - Defaults.Toggle(String(localized: "Enable lyrics"), key: .enableLyrics) + Defaults.Toggle("Enable lyrics", key: .enableLyrics) .settingsHighlight(id: highlightID("Enable lyrics")) - Defaults.Toggle(String(localized: "Enable album art parallax effect"), key: .enableParallaxEffect) + Defaults.Toggle("Enable album art parallax effect", key: .enableParallaxEffect) .settingsHighlight(id: highlightID("Enable album art parallax effect")) Picker("Sneak Peek Style", selection: $sneakPeekStyles){ ForEach(SneakPeekStyle.allCases) { style in - Text(style.LocalizedName).tag(style) + Text(style.rawValue).tag(style) } } .disabled(!enableSneakPeek || enableMinimalisticUI) @@ -2786,10 +2152,10 @@ struct Media: View { } Section { - Defaults.Toggle(String(localized: "Show lock screen media panel"), key: .enableLockScreenMediaWidget) - Defaults.Toggle(String(localized: "Show media app icon"), key: .lockScreenShowAppIcon) + Defaults.Toggle("Show lock screen media panel", key: .enableLockScreenMediaWidget) + Defaults.Toggle("Show media app icon", key: .lockScreenShowAppIcon) .disabled(!enableLockScreenMediaWidget) - Defaults.Toggle(String(localized: "Show panel border"), key: .lockScreenPanelShowsBorder) + Defaults.Toggle("Show panel border", key: .lockScreenPanelShowsBorder) .disabled(!enableLockScreenMediaWidget) if lockScreenGlassCustomizationMode == .customLiquid { customLiquidBlurRow @@ -2872,11 +2238,47 @@ struct CalendarSettings: View { @Default(.hideCompletedReminders) var hideCompletedReminders @Default(.showFullEventTitles) var showFullEventTitles @Default(.autoScrollToNextEvent) var autoScrollToNextEvent + @Default(.lockScreenShowCalendarCountdown) private var lockScreenShowCalendarCountdown + @Default(.lockScreenShowCalendarEvent) private var lockScreenShowCalendarEvent + @Default(.lockScreenShowCalendarEventEntireDuration) private var lockScreenShowCalendarEventEntireDuration + @Default(.lockScreenShowCalendarEventAfterStartWindow) private var lockScreenShowCalendarEventAfterStartWindow + @Default(.lockScreenShowCalendarTimeRemaining) private var lockScreenShowCalendarTimeRemaining + @Default(.lockScreenShowCalendarStartTimeAfterBegins) private var lockScreenShowCalendarStartTimeAfterBegins + @Default(.lockScreenCalendarEventLookaheadWindow) private var lockScreenCalendarEventLookaheadWindow + @Default(.lockScreenCalendarSelectionMode) private var lockScreenCalendarSelectionMode + @Default(.lockScreenSelectedCalendarIDs) private var lockScreenSelectedCalendarIDs + @Default(.lockScreenShowCalendarEventAfterStartEnabled) private var lockScreenShowCalendarEventAfterStartEnabled private func highlightID(_ title: String) -> String { SettingsTab.calendar.highlightID(for: title) } + private enum CalendarLookaheadOption: String, CaseIterable, Identifiable { + case mins15 = "15m" + case mins30 = "30m" + case hour1 = "1h" + case hours3 = "3h" + case hours6 = "6h" + case hours12 = "12h" + case restOfDay = "rest_of_day" + case allTime = "all_time" + + var id: String { rawValue } + + var title: String { + switch self { + case .mins15: return "15 mins" + case .mins30: return "30 mins" + case .hour1: return "1 hour" + case .hours3: return "3 hours" + case .hours6: return "6 hours" + case .hours12: return "12 hours" + case .restOfDay: return "Rest of the day" + case .allTime: return "All time" + } + } + } + var body: some View { Form { if !calendarManager.hasCalendarAccess || !calendarManager.hasReminderAccess { @@ -2902,7 +2304,7 @@ struct CalendarSettings: View { } } else { // Permissions status - Section { + Section(header: Text("Permissions")) { HStack { Text("Calendars") Spacer() @@ -2915,11 +2317,9 @@ struct CalendarSettings: View { Text(statusText(for: calendarManager.reminderAuthorizationStatus)) .foregroundColor(color(for: calendarManager.reminderAuthorizationStatus)) } - } header: { - Text("Permissions") } - Defaults.Toggle(String(localized:"Show calendar"), key: .showCalendar) + Defaults.Toggle("Show calendar", key: .showCalendar) .settingsHighlight(id: highlightID("Show calendar")) Section(header: Text("Event List")) { @@ -2943,7 +2343,7 @@ struct CalendarSettings: View { } Section(header: Text("Reminder Live Activity")) { - Defaults.Toggle(String(localized:"Enable reminder live activity"), key: .enableReminderLiveActivity) + Defaults.Toggle("Enable reminder live activity", key: .enableReminderLiveActivity) .settingsHighlight(id: highlightID("Enable reminder live activity")) Picker("Countdown style", selection: $reminderPresentationStyle) { @@ -2986,13 +2386,12 @@ struct CalendarSettings: View { } Section(header: Text("Lock Screen Reminder Widget")) { - Defaults.Toggle(String(localized:"Show lock screen reminder"), key: .enableLockScreenReminderWidget) + Defaults.Toggle("Show lock screen reminder", key: .enableLockScreenReminderWidget) .settingsHighlight(id: highlightID("Show lock screen reminder")) - Picker(String(localized: "Chip color"), selection: $lockScreenReminderChipStyle) { + Picker("Chip color", selection: $lockScreenReminderChipStyle) { ForEach(LockScreenReminderChipStyle.allCases) { style in - - Text(style.localizedName).tag(style) + Text(style.rawValue).tag(style) } } .pickerStyle(.segmented) @@ -3000,21 +2399,147 @@ struct CalendarSettings: View { .settingsHighlight(id: highlightID("Chip color")) } - Section(header: Text("Select Calendars")) { - List { - ForEach(calendarManager.allCalendars, id: \.id) { calendar in - Toggle(isOn: Binding( - get: { calendarManager.getCalendarSelected(calendar) }, - set: { isSelected in - Task { - await calendarManager.setCalendarSelected(calendar, isSelected: isSelected) + Section( + header: Text("Calendar Widget"), + footer: Text("Displays your next upcoming calendar event above or below the weather capsule. Calendar selection here is independent from the Dynamic Island calendar filter.") + .foregroundStyle(.secondary) + .font(.caption) + ) { + Defaults.Toggle("Show next calendar event", key: .lockScreenShowCalendarEvent) + .settingsHighlight(id: highlightID("Show next calendar event")) + + LabeledContent("Show events within the next") { + HStack { + Spacer(minLength: 0) + Picker("", selection: $lockScreenCalendarEventLookaheadWindow) { + ForEach(CalendarLookaheadOption.allCases) { option in + Text(option.title).tag(option.rawValue) + } + } + .labelsHidden() + .pickerStyle(.menu) + } + .frame(maxWidth: .infinity, alignment: .trailing) + } + .disabled(!lockScreenShowCalendarEvent) + .settingsHighlight(id: highlightID("Show events within the next")) + + Toggle("Show events from all calendars", isOn: Binding( + get: { lockScreenCalendarSelectionMode == "all" }, + set: { useAll in + if useAll { + lockScreenCalendarSelectionMode = "all" + } else { + lockScreenCalendarSelectionMode = "selected" + lockScreenSelectedCalendarIDs = Set(calendarManager.eventCalendars.map { $0.id }) + } + } + )) + .disabled(!lockScreenShowCalendarEvent) + .settingsHighlight(id: highlightID("Show events from all calendars")) + + if lockScreenCalendarSelectionMode != "all" { + HStack { + Spacer() + Button("Deselect All") { + lockScreenSelectedCalendarIDs = [] + } + .buttonStyle(.link) + } + .padding(.top, 2) + + VStack(alignment: .leading, spacing: 8) { + ForEach(calendarManager.eventCalendars, id: \.id) { calendar in + Toggle(isOn: Binding( + get: { lockScreenSelectedCalendarIDs.contains(calendar.id) }, + set: { isOn in + if isOn { + lockScreenSelectedCalendarIDs.insert(calendar.id) + } else { + lockScreenSelectedCalendarIDs.remove(calendar.id) + } + } + )) { + HStack(spacing: 8) { + Circle() + .fill(Color(calendar.color)) + .frame(width: 8, height: 8) + Text(calendar.title) } } - )) { - Text(calendar.title) } - .disabled(!showCalendar) } + .padding(.top, 4) + .padding(.leading, 2) + .disabled(!lockScreenShowCalendarEvent) + } + + Defaults.Toggle("Show countdown", key: .lockScreenShowCalendarCountdown) + .disabled(!lockScreenShowCalendarEvent) + .settingsHighlight(id: highlightID("Show countdown")) + + Defaults.Toggle("Show event for entire duration", key: .lockScreenShowCalendarEventEntireDuration) + .disabled(!lockScreenShowCalendarEvent) + .settingsHighlight(id: highlightID("Show event for entire duration")) + .onChange(of: Defaults[.lockScreenShowCalendarEventEntireDuration]) { _, newValue in + if newValue { + Defaults[.lockScreenShowCalendarEventAfterStartEnabled] = false + } + } + + Defaults.Toggle( + "Hide active event and show next upcoming event", + key: .lockScreenShowCalendarEventAfterStartEnabled + ) + .disabled(!lockScreenShowCalendarEvent || lockScreenShowCalendarEventEntireDuration) + .settingsHighlight(id: highlightID("Hide active event and show next upcoming event")) + + LabeledContent("Show event after it starts") { + HStack { + Spacer(minLength: 0) + Picker("", selection: $lockScreenShowCalendarEventAfterStartWindow) { + Text("1 min").tag("1m") + Text("5 mins").tag("5m") + Text("10 mins").tag("10m") + Text("15 mins").tag("15m") + Text("30 mins").tag("30m") + Text("45 mins").tag("45m") + Text("1 hour").tag("1h") + Text("2 hours").tag("2h") + } + .labelsHidden() + .pickerStyle(.menu) + } + .frame(maxWidth: .infinity, alignment: .trailing) + } + .disabled(!lockScreenShowCalendarEvent || lockScreenShowCalendarEventEntireDuration || !lockScreenShowCalendarEventAfterStartEnabled) + + Text("Turn off 'Show event for entire duration' to use the post-start duration option.") + .font(.caption) + .foregroundStyle(.secondary) + + Defaults.Toggle("Show time remaining", key: .lockScreenShowCalendarTimeRemaining) + .disabled(!lockScreenShowCalendarEvent) + .settingsHighlight(id: highlightID("Show time remaining")) + + Defaults.Toggle("Show start time after event begins", key: .lockScreenShowCalendarStartTimeAfterBegins) + .disabled(!lockScreenShowCalendarEvent) + .settingsHighlight(id: highlightID("Show start time after event begins")) + } + + Section(header: Text("Select Calendars")) { + ForEach(calendarManager.allCalendars, id: \.id) { calendar in + Toggle(isOn: Binding( + get: { calendarManager.getCalendarSelected(calendar) }, + set: { isSelected in + Task { + await calendarManager.setCalendarSelected(calendar, isSelected: isSelected) + } + } + )) { + Text(calendar.title) + } + .disabled(!showCalendar) } } } @@ -3030,12 +2555,12 @@ struct CalendarSettings: View { private func statusText(for status: EKAuthorizationStatus) -> String { switch status { - case .fullAccess, .authorized: return String(localized:"Full Access") - case .writeOnly: return String(localized:"Write Only") - case .denied: return String(localized:"Denied") - case .restricted: return String(localized:"Restricted") - case .notDetermined: return String(localized:"Not Determined") - @unknown default: return String(localized:"Unknown") + case .fullAccess, .authorized: return "Full Access" + case .writeOnly: return "Write Only" + case .denied: return "Denied" + case .restricted: return "Restricted" + case .notDetermined: return "Not Determined" + @unknown default: return "Unknown" } } @@ -3169,12 +2694,12 @@ struct Shelf: View { if !fullDiskAccessPermission.isAuthorized { Section { SettingsPermissionCallout( - title: String(localized: "Full Disk Access required"), - message: String(localized: "Grant Full Disk Access so the Shelf can index and move files outside the app sandbox."), + title: "Full Disk Access required", + message: "Grant Full Disk Access so the Shelf can index and move files outside the app sandbox.", icon: "externaldrive.fill", iconColor: .purple, - requestButtonTitle: String(localized: "Request Full Disk Access"), - openSettingsButtonTitle: String(localized: "Open Privacy & Security"), + requestButtonTitle: "Request Full Disk Access", + openSettingsButtonTitle: "Open Privacy & Security", requestAction: { fullDiskAccessPermission.requestAccessPrompt() }, openSettingsAction: { fullDiskAccessPermission.openSystemSettings() } ) @@ -3184,11 +2709,11 @@ struct Shelf: View { } Section { - Defaults.Toggle(String(localized: "Enable shelf"), key: .dynamicShelf) + Defaults.Toggle("Enable shelf", key: .dynamicShelf) .disabled(!fullDiskAccessPermission.isAuthorized) .settingsHighlight(id: highlightID("Enable shelf")) - Defaults.Toggle(String(localized: "Open shelf tab by default if items added"), key: .openShelfByDefault) + Defaults.Toggle("Open shelf tab by default if items added", key: .openShelfByDefault) .settingsHighlight(id: highlightID("Open shelf tab by default if items added")) Defaults.Toggle(key: .expandedDragDetection) { @@ -3295,10 +2820,10 @@ struct LiveActivitiesSettings: View { var body: some View { Form { Section { - Defaults.Toggle(String(localized: "Enable Screen Recording Detection"), key: .enableScreenRecordingDetection) + Defaults.Toggle("Enable Screen Recording Detection", key: .enableScreenRecordingDetection) .settingsHighlight(id: highlightID("Enable Screen Recording Detection")) - Defaults.Toggle(String(localized: "Show Recording Indicator"), key: .showRecordingIndicator) + Defaults.Toggle("Show Recording Indicator", key: .showRecordingIndicator) .disabled(!enableScreenRecordingDetection) .settingsHighlight(id: highlightID("Show Recording Indicator")) @@ -3329,30 +2854,30 @@ struct LiveActivitiesSettings: View { Section { if !fullDiskAccessPermission.isAuthorized { SettingsPermissionCallout( - title: String(localized: "Custom Focus metadata"), - message: String(localized: "Full Disk Access unlocks custom Focus icons, colors, and labels. Standard Focus detection still works without it—grant access only if you need personalized indicators."), + title: "Custom Focus metadata", + message: "Full Disk Access unlocks custom Focus icons, colors, and labels. Standard Focus detection still works without it—grant access only if you need personalized indicators.", icon: "externaldrive.fill", iconColor: .purple, - requestButtonTitle: String(localized: "Request Full Disk Access"), - openSettingsButtonTitle: String(localized: "Open Privacy & Security"), + requestButtonTitle: "Request Full Disk Access", + openSettingsButtonTitle: "Open Privacy & Security", requestAction: { fullDiskAccessPermission.requestAccessPrompt() }, openSettingsAction: { fullDiskAccessPermission.openSystemSettings() } ) } - Defaults.Toggle(String(localized: "Enable Focus Detection"), key: .enableDoNotDisturbDetection) + Defaults.Toggle("Enable Focus Detection", key: .enableDoNotDisturbDetection) .settingsHighlight(id: highlightID("Enable Focus Detection")) - Defaults.Toggle(String(localized: "Show Focus Indicator"), key: .showDoNotDisturbIndicator) + Defaults.Toggle("Show Focus Indicator", key: .showDoNotDisturbIndicator) .disabled(!enableDoNotDisturbDetection) .settingsHighlight(id: highlightID("Show Focus Indicator")) - Defaults.Toggle(String(localized: "Show Focus Label"), key: .showDoNotDisturbLabel) + Defaults.Toggle("Show Focus Label", key: .showDoNotDisturbLabel) .disabled(!enableDoNotDisturbDetection || focusIndicatorNonPersistent) .help(focusIndicatorNonPersistent ? "Labels are forced to compact on/off text while brief toast mode is enabled." : "Show the active Focus name inside the indicator.") .settingsHighlight(id: highlightID("Show Focus Label")) - Defaults.Toggle(String(localized: "Show Focus as brief toast"), key: .focusIndicatorNonPersistent) + Defaults.Toggle("Show Focus as brief toast", key: .focusIndicatorNonPersistent) .disabled(!enableDoNotDisturbDetection) .settingsHighlight(id: highlightID("Show Focus as brief toast")) .help("When enabled, Focus appears briefly (on/off) and then collapses instead of staying visible.") @@ -3389,10 +2914,10 @@ struct LiveActivitiesSettings: View { } Section { - Defaults.Toggle(String(localized: "Show Caps Lock Indicator"), key: .enableCapsLockIndicator) + Defaults.Toggle("Show Caps Lock Indicator", key: .enableCapsLockIndicator) .settingsHighlight(id: highlightID("Show Caps Lock Indicator")) - Defaults.Toggle(String(localized: "Show Caps Lock label"), key: .showCapsLockLabel) + Defaults.Toggle("Show Caps Lock label", key: .showCapsLockLabel) .disabled(!Defaults[.enableCapsLockIndicator]) .settingsHighlight(id: highlightID("Show Caps Lock label")) @@ -3411,9 +2936,9 @@ struct LiveActivitiesSettings: View { } Section { - Defaults.Toggle(String(localized: "Enable Camera Detection"), key: .enableCameraDetection) + Defaults.Toggle("Enable Camera Detection", key: .enableCameraDetection) .settingsHighlight(id: highlightID("Enable Camera Detection")) - Defaults.Toggle(String(localized: "Enable Microphone Detection"), key: .enableMicrophoneDetection) + Defaults.Toggle("Enable Microphone Detection", key: .enableMicrophoneDetection) .settingsHighlight(id: highlightID("Enable Microphone Detection")) if privacyManager.isMonitoring { @@ -3470,7 +2995,7 @@ struct LiveActivitiesSettings: View { } Section { - Defaults.Toggle(String(localized: "Enable reminder live activity"), key: .enableReminderLiveActivity) + Defaults.Toggle("Enable reminder live activity", key: .enableReminderLiveActivity) .settingsHighlight(id: highlightID("Enable reminder live activity")) } header: { Text("Reminder Live Activity") @@ -3558,13 +3083,13 @@ struct Appearance: View { Form { Section { Toggle("Always show tabs", isOn: $coordinator.alwaysShowTabs) - Defaults.Toggle(String(localized:"Settings icon in notch"), key: .settingsIconInNotch) + Defaults.Toggle("Settings icon in notch", key: .settingsIconInNotch) .settingsHighlight(id: highlightID("Settings icon in notch")) - Defaults.Toggle(String(localized:"Enable window shadow"), key: .enableShadow) + Defaults.Toggle("Enable window shadow", key: .enableShadow) .settingsHighlight(id: highlightID("Enable window shadow")) - Defaults.Toggle(String(localized:"Corner radius scaling"), key: .cornerRadiusScaling) + Defaults.Toggle("Corner radius scaling", key: .cornerRadiusScaling) .settingsHighlight(id: highlightID("Corner radius scaling")) - Defaults.Toggle(String(localized:"Use simpler close animation"), key: .useModernCloseAnimation) + Defaults.Toggle("Use simpler close animation", key: .useModernCloseAnimation) .settingsHighlight(id: highlightID("Use simpler close animation")) } header: { Text("General") @@ -3594,9 +3119,9 @@ struct Appearance: View { } if lockScreenGlassStyle == .liquid { - Picker(String(localized: "Lock screen glass mode"), selection: $lockScreenGlassCustomizationMode) { + Picker("Lock screen glass mode", selection: $lockScreenGlassCustomizationMode) { ForEach(LockScreenGlassCustomizationMode.allCases) { mode in - Text(mode.localizedName).tag(mode) + Text(mode.rawValue).tag(mode) } } .pickerStyle(.segmented) @@ -3647,15 +3172,15 @@ struct Appearance: View { } Section { - Defaults.Toggle(String(localized:"Enable colored spectrograms"), key: .coloredSpectrogram) + Defaults.Toggle("Enable colored spectrograms", key: .coloredSpectrogram) .settingsHighlight(id: highlightID("Enable colored spectrograms")) - Defaults.Toggle(String(localized:"Player tinting"), key: .playerColorTinting) - Defaults.Toggle(String(localized:"Enable blur effect behind album art"), key: .lightingEffect) + Defaults + .Toggle("Player tinting", key: .playerColorTinting) + Defaults.Toggle("Enable blur effect behind album art", key: .lightingEffect) .settingsHighlight(id: highlightID("Enable blur effect behind album art")) - Picker(String(localized: "Slider color"), selection: $sliderColor) { + Picker("Slider color", selection: $sliderColor) { ForEach(SliderColorEnum.allCases, id: \.self) { option in - - Text(option.localizedName).tag(option) + Text(option.rawValue) } } .settingsHighlight(id: highlightID("Slider color")) @@ -3695,7 +3220,7 @@ struct Appearance: View { } header: { HStack { Text("Custom music live activity animation") - customBadge(text: String(localized: "Coming soon")) + customBadge(text: "Coming soon") } } @@ -3832,7 +3357,7 @@ struct Appearance: View { } Section { - Defaults.Toggle(String(localized:"Enable Dynamic mirror"), key: .showMirror) + Defaults.Toggle("Enable Dynamic mirror", key: .showMirror) .disabled(!checkVideoInput()) .settingsHighlight(id: highlightID("Enable Dynamic mirror")) Picker("Mirror shape", selection: $mirrorShape) { @@ -3842,7 +3367,7 @@ struct Appearance: View { .tag(MirrorShapeEnum.rectangle) } .settingsHighlight(id: highlightID("Mirror shape")) - Defaults.Toggle(String(localized:"Show cool face animation while inactivity"), key: .showNotHumanFace) + Defaults.Toggle("Show cool face animation while inactivity", key: .showNotHumanFace) .settingsHighlight(id: highlightID("Show cool face animation while inactivity")) } header: { HStack { @@ -3858,7 +3383,7 @@ struct Appearance: View { let columns = [GridItem(.adaptive(minimum: 90), spacing: 12)] LazyVGrid(columns: columns, spacing: 12) { appIconCard( - title: String(localized:"Default"), + title: "Default", image: defaultAppIconImage(), isSelected: selectedAppIconID == nil ) { @@ -4101,8 +3626,8 @@ struct Appearance: View { } let description = enableMinimalisticUI - ? String(localized:"Width adjustments apply only to the standard notch layout. Disable Minimalistic UI to edit this value.") - : String(localized:"Extend the notch span so the clipboard, colour picker, and other trailing icons remain visible on scaled displays (e.g. More Space).") + ? "Width adjustments apply only to the standard notch layout. Disable Minimalistic UI to edit this value." + : "Extend the notch span so the clipboard, colour picker, and other trailing icons remain visible on scaled displays (e.g. More Space)." Text(description) .font(.caption) @@ -4127,6 +3652,7 @@ struct Appearance: View { } struct LockScreenSettings: View { + @ObservedObject private var calendarManager = CalendarManager.shared @Default(.lockScreenGlassStyle) private var lockScreenGlassStyle @Default(.lockScreenGlassCustomizationMode) private var lockScreenGlassCustomizationMode @Default(.lockScreenMusicLiquidGlassVariant) private var lockScreenMusicLiquidGlassVariant @@ -4146,7 +3672,21 @@ struct LockScreenSettings: View { @Default(.lockScreenWeatherShowsAQI) private var lockScreenWeatherShowsAQI @Default(.lockScreenWeatherShowsSunrise) private var lockScreenWeatherShowsSunrise @Default(.lockScreenWeatherAQIScale) private var lockScreenWeatherAQIScale + @Default(.enableLockScreenReminderWidget) private var enableLockScreenReminderWidget + @Default(.lockScreenReminderChipStyle) private var lockScreenReminderChipStyle + @Default(.lockScreenReminderWidgetHorizontalAlignment) private var lockScreenReminderWidgetHorizontalAlignment + @Default(.lockScreenReminderWidgetVerticalOffset) private var lockScreenReminderWidgetVerticalOffset @Default(.showStandardMediaControls) private var showStandardMediaControls + @Default(.lockScreenShowCalendarCountdown) private var lockScreenShowCalendarCountdown + @Default(.lockScreenShowCalendarEvent) private var lockScreenShowCalendarEvent + @Default(.lockScreenShowCalendarEventEntireDuration) private var lockScreenShowCalendarEventEntireDuration + @Default(.lockScreenShowCalendarEventAfterStartWindow) private var lockScreenShowCalendarEventAfterStartWindow + @Default(.lockScreenShowCalendarTimeRemaining) private var lockScreenShowCalendarTimeRemaining + @Default(.lockScreenShowCalendarStartTimeAfterBegins) private var lockScreenShowCalendarStartTimeAfterBegins + @Default(.lockScreenCalendarEventLookaheadWindow) private var lockScreenCalendarEventLookaheadWindow + @Default(.lockScreenCalendarSelectionMode) private var lockScreenCalendarSelectionMode + @Default(.lockScreenSelectedCalendarIDs) private var lockScreenSelectedCalendarIDs + @Default(.lockScreenShowCalendarEventAfterStartEnabled) private var lockScreenShowCalendarEventAfterStartEnabled private func highlightID(_ title: String) -> String { SettingsTab.lockScreen.highlightID(for: title) @@ -4156,6 +3696,48 @@ struct LockScreenSettings: View { Double(LiquidGlassVariant.supportedRange.lowerBound)...Double(LiquidGlassVariant.supportedRange.upperBound) } + private enum CalendarLookaheadOption: String, CaseIterable, Identifiable { + case mins15 = "15m" + case mins30 = "30m" + case hour1 = "1h" + case hours3 = "3h" + case hours6 = "6h" + case hours12 = "12h" + case restOfDay = "rest_of_day" + case allTime = "all_time" + + var id: String { rawValue } + + var title: String { + switch self { + case .mins15: return "15 mins" + case .mins30: return "30 mins" + case .hour1: return "1 hour" + case .hours3: return "3 hours" + case .hours6: return "6 hours" + case .hours12: return "12 hours" + case .restOfDay: return "Rest of the day" + case .allTime: return "All time" + } + } + } + + private enum ReminderAlignmentOption: String, CaseIterable, Identifiable { + case leading + case center + case trailing + + var id: String { rawValue } + + var title: String { + switch self { + case .leading: return "Left" + case .center: return "Center" + case .trailing: return "Right" + } + } + } + private var musicVariantBinding: Binding { Binding( get: { Double(lockScreenMusicLiquidGlassVariant.rawValue) }, @@ -4186,9 +3768,9 @@ struct LockScreenSettings: View { var body: some View { Form { Section { - Defaults.Toggle(String(localized: "Enable lock screen live activity"), key: .enableLockScreenLiveActivity) + Defaults.Toggle("Enable lock screen live activity", key: .enableLockScreenLiveActivity) .settingsHighlight(id: highlightID("Enable lock screen live activity")) - Defaults.Toggle(String(localized: "Play lock/unlock sounds"), key: .enableLockSounds) + Defaults.Toggle("Play lock/unlock sounds", key: .enableLockSounds) .settingsHighlight(id: highlightID("Play lock/unlock sounds")) } header: { Text("Live Activity & Feedback") @@ -4218,9 +3800,9 @@ struct LockScreenSettings: View { } if lockScreenGlassStyle == .liquid { - Picker(String(localized: "Glass mode"), selection: $lockScreenGlassCustomizationMode) { + Picker("Glass mode", selection: $lockScreenGlassCustomizationMode) { ForEach(LockScreenGlassCustomizationMode.allCases) { mode in - Text(mode.localizedName).tag(mode) + Text(mode.rawValue).tag(mode) } } .pickerStyle(.segmented) @@ -4243,12 +3825,12 @@ struct LockScreenSettings: View { } Section { - Defaults.Toggle(String(localized: "Show lock screen media panel"), key: .enableLockScreenMediaWidget) + Defaults.Toggle("Show lock screen media panel", key: .enableLockScreenMediaWidget) .settingsHighlight(id: highlightID("Show lock screen media panel")) - Defaults.Toggle(String(localized: "Show media app icon"), key: .lockScreenShowAppIcon) + Defaults.Toggle("Show media app icon", key: .lockScreenShowAppIcon) .disabled(!enableLockScreenMediaWidget) .settingsHighlight(id: highlightID("Show media app icon")) - Defaults.Toggle(String(localized: "Show panel border"), key: .lockScreenPanelShowsBorder) + Defaults.Toggle("Show panel border", key: .lockScreenPanelShowsBorder) .disabled(!enableLockScreenMediaWidget) .settingsHighlight(id: highlightID("Show panel border")) if lockScreenGlassCustomizationMode == .customLiquid { @@ -4284,11 +3866,11 @@ struct LockScreenSettings: View { .opacity(showStandardMediaControls ? 1 : 0.5) Section { - Defaults.Toggle(String(localized: "Show lock screen timer"), key: .enableLockScreenTimerWidget) + Defaults.Toggle("Show lock screen timer", key: .enableLockScreenTimerWidget) .settingsHighlight(id: highlightID("Show lock screen timer")) Picker("Timer surface", selection: timerSurfaceBinding) { ForEach(LockScreenTimerSurfaceMode.allCases) { mode in - Text(mode.localizedName).tag(mode) + Text(mode.rawValue).tag(mode) } } .pickerStyle(.segmented) @@ -4307,9 +3889,9 @@ struct LockScreenSettings: View { .settingsHighlight(id: highlightID("Timer glass material")) if lockScreenTimerGlassStyle == .liquid { - Picker(String(localized: "Timer liquid mode"), selection: $lockScreenTimerGlassCustomizationMode) { + Picker("Timer liquid mode", selection: $lockScreenTimerGlassCustomizationMode) { ForEach(LockScreenGlassCustomizationMode.allCases) { mode in - Text(mode.localizedName).tag(mode) + Text(mode.rawValue).tag(mode) } } .pickerStyle(.segmented) @@ -4346,13 +3928,13 @@ struct LockScreenSettings: View { } Section { - Defaults.Toggle(String(localized: "Show lock screen weather"), key: .enableLockScreenWeatherWidget) + Defaults.Toggle("Show lock screen weather", key: .enableLockScreenWeatherWidget) .settingsHighlight(id: highlightID("Show lock screen weather")) if enableLockScreenWeatherWidget { Picker("Layout", selection: $lockScreenWeatherWidgetStyle) { ForEach(LockScreenWeatherWidgetStyle.allCases) { style in - Text(style.localizedName).tag(style) + Text(style.rawValue).tag(style) } } .pickerStyle(.segmented) @@ -4374,15 +3956,15 @@ struct LockScreenSettings: View { .pickerStyle(.segmented) .settingsHighlight(id: highlightID("Temperature unit")) - Defaults.Toggle(String(localized: "Show location label"), key: .lockScreenWeatherShowsLocation) + Defaults.Toggle("Show location label", key: .lockScreenWeatherShowsLocation) .disabled(lockScreenWeatherWidgetStyle == .circular) .settingsHighlight(id: highlightID("Show location label")) - Defaults.Toggle(String(localized: "Show sunrise time"), key: .lockScreenWeatherShowsSunrise) + Defaults.Toggle("Show sunrise time", key: .lockScreenWeatherShowsSunrise) .disabled(lockScreenWeatherWidgetStyle != .inline) .settingsHighlight(id: highlightID("Show sunrise time")) - Defaults.Toggle(String(localized: "Show AQI widget"), key: .lockScreenWeatherShowsAQI) + Defaults.Toggle("Show AQI widget", key: .lockScreenWeatherShowsAQI) .disabled(!lockScreenWeatherProviderSource.supportsAirQuality) .settingsHighlight(id: highlightID("Show AQI widget")) @@ -4402,7 +3984,7 @@ struct LockScreenSettings: View { .foregroundStyle(.secondary) } - Defaults.Toggle(String(localized: "Use colored gauges"), key: .lockScreenWeatherUsesGaugeTint) + Defaults.Toggle("Use colored gauges", key: .lockScreenWeatherUsesGaugeTint) .settingsHighlight(id: highlightID("Use colored gauges")) } } header: { @@ -4410,25 +3992,66 @@ struct LockScreenSettings: View { } footer: { Text("Enable the weather capsule and configure its layout, provider, units, and optional battery/AQI indicators.") } + + Section { + Defaults.Toggle("Show lock screen reminder", key: .enableLockScreenReminderWidget) + .settingsHighlight(id: highlightID("Show lock screen reminder")) + + Picker("Chip color", selection: $lockScreenReminderChipStyle) { + ForEach(LockScreenReminderChipStyle.allCases) { style in + Text(style.rawValue).tag(style) + } + } + .pickerStyle(.segmented) + .disabled(!enableLockScreenReminderWidget) + .settingsHighlight(id: highlightID("Chip color")) + + Picker("Alignment", selection: $lockScreenReminderWidgetHorizontalAlignment) { + ForEach(ReminderAlignmentOption.allCases) { option in + Text(option.title).tag(option.rawValue) + } + } + .pickerStyle(.segmented) + .disabled(!enableLockScreenReminderWidget) + .settingsHighlight(id: highlightID("Reminder alignment")) + + HStack { + Text("Vertical offset") + Slider( + value: $lockScreenReminderWidgetVerticalOffset, + in: -160...160, + step: 2 + ) + .disabled(!enableLockScreenReminderWidget) + Text("\(Int(lockScreenReminderWidgetVerticalOffset)) px") + .foregroundStyle(.secondary) + .frame(width: 70, alignment: .trailing) + } + .settingsHighlight(id: highlightID("Reminder vertical offset")) + } header: { + Text("Reminder Widget") + } footer: { + Text("Controls the lock screen reminder chip and its positioning.") + } if BatteryActivityManager.shared.hasBattery() { Section { - Defaults.Toggle(String(localized: "Show battery indicator"), key: .lockScreenBatteryShowsBatteryGauge) + Defaults.Toggle("Show battery indicator", key: .lockScreenBatteryShowsBatteryGauge) .settingsHighlight(id: highlightID("Show battery indicator")) if lockScreenWeatherShowsBatteryGauge { - Defaults.Toggle(String(localized: "Use MacBook icon when on battery"), key: .lockScreenBatteryUsesLaptopSymbol) + Defaults.Toggle("Use MacBook icon when on battery", key: .lockScreenBatteryUsesLaptopSymbol) .settingsHighlight(id: highlightID("Use MacBook icon when on battery")) - Defaults.Toggle(String(localized: "Show charging status"), key: .lockScreenBatteryShowsCharging) + Defaults.Toggle("Show charging status", key: .lockScreenBatteryShowsCharging) .settingsHighlight(id: highlightID("Show charging status")) if lockScreenWeatherShowsCharging { - Defaults.Toggle(String(localized: "Show charging percentage"), key: .lockScreenBatteryShowsChargingPercentage) + Defaults.Toggle("Show charging percentage", key: .lockScreenBatteryShowsChargingPercentage) .settingsHighlight(id: highlightID("Show charging percentage")) } - Defaults.Toggle(String(localized: "Show Bluetooth battery"), key: .lockScreenBatteryShowsBluetooth) + Defaults.Toggle("Show Bluetooth battery", key: .lockScreenBatteryShowsBluetooth) .settingsHighlight(id: highlightID("Show Bluetooth battery")) } } header: { @@ -4439,7 +4062,7 @@ struct LockScreenSettings: View { } Section { - Defaults.Toggle(String(localized: "Show focus widget"), key: .enableLockScreenFocusWidget) + Defaults.Toggle("Show focus widget", key: .enableLockScreenFocusWidget) .settingsHighlight(id: highlightID("Show focus widget")) } header: { Text("Focus Widget") @@ -4447,6 +4070,133 @@ struct LockScreenSettings: View { Text("Displays the current Focus state above the weather capsule whenever Focus detection is enabled.") } + Section { + Defaults.Toggle("Show next calendar event", key: .lockScreenShowCalendarEvent) + .settingsHighlight(id: highlightID("Show next calendar event")) + + LabeledContent("Show events within the next") { + HStack { + Spacer(minLength: 0) + Picker("", selection: $lockScreenCalendarEventLookaheadWindow) { + ForEach(CalendarLookaheadOption.allCases) { option in + Text(option.title).tag(option.rawValue) + } + } + .labelsHidden() + .pickerStyle(.menu) + } + .frame(maxWidth: .infinity, alignment: .trailing) + } + .disabled(!lockScreenShowCalendarEvent) + .settingsHighlight(id: highlightID("Show events within the next")) + + Toggle("Show events from all calendars", isOn: Binding( + get: { lockScreenCalendarSelectionMode == "all" }, + set: { useAll in + if useAll { + lockScreenCalendarSelectionMode = "all" + } else { + lockScreenCalendarSelectionMode = "selected" + lockScreenSelectedCalendarIDs = Set(calendarManager.eventCalendars.map { $0.id }) + } + } + )) + .disabled(!lockScreenShowCalendarEvent) + .settingsHighlight(id: highlightID("Show events from all calendars")) + + if lockScreenCalendarSelectionMode != "all" { + HStack { + Spacer() + Button("Deselect All") { + lockScreenSelectedCalendarIDs = [] + } + .buttonStyle(.link) + } + .padding(.top, 2) + + VStack(alignment: .leading, spacing: 8) { + ForEach(calendarManager.eventCalendars, id: \.id) { calendar in + Toggle(isOn: Binding( + get: { lockScreenSelectedCalendarIDs.contains(calendar.id) }, + set: { isOn in + if isOn { + lockScreenSelectedCalendarIDs.insert(calendar.id) + } else { + lockScreenSelectedCalendarIDs.remove(calendar.id) + } + } + )) { + HStack(spacing: 8) { + Circle() + .fill(Color(calendar.color)) + .frame(width: 8, height: 8) + Text(calendar.title) + } + } + } + } + .padding(.top, 4) + .padding(.leading, 2) + .disabled(!lockScreenShowCalendarEvent) + } + + Defaults.Toggle("Show countdown", key: .lockScreenShowCalendarCountdown) + .disabled(!lockScreenShowCalendarEvent) + .settingsHighlight(id: highlightID("Show countdown")) + + Defaults.Toggle("Show event for entire duration", key: .lockScreenShowCalendarEventEntireDuration) + .disabled(!lockScreenShowCalendarEvent) + .settingsHighlight(id: highlightID("Show event for entire duration")) + .onChange(of: Defaults[.lockScreenShowCalendarEventEntireDuration]) { _, newValue in + if newValue { + Defaults[.lockScreenShowCalendarEventAfterStartEnabled] = false + } + } + + Defaults.Toggle( + "Hide active event and show next upcoming event", + key: .lockScreenShowCalendarEventAfterStartEnabled + ) + .disabled(!lockScreenShowCalendarEvent || lockScreenShowCalendarEventEntireDuration) + .settingsHighlight(id: highlightID("Hide active event and show next upcoming event")) + + LabeledContent("Show event after it starts") { + HStack { + Spacer(minLength: 0) + Picker("", selection: $lockScreenShowCalendarEventAfterStartWindow) { + Text("1 min").tag("1m") + Text("5 mins").tag("5m") + Text("10 mins").tag("10m") + Text("15 mins").tag("15m") + Text("30 mins").tag("30m") + Text("45 mins").tag("45m") + Text("1 hour").tag("1h") + Text("2 hours").tag("2h") + } + .labelsHidden() + .pickerStyle(.menu) + } + .frame(maxWidth: .infinity, alignment: .trailing) + } + .disabled(!lockScreenShowCalendarEvent || lockScreenShowCalendarEventEntireDuration || !lockScreenShowCalendarEventAfterStartEnabled) + + Text("Turn off 'Show event for entire duration' to use the post-start duration option.") + .font(.caption) + .foregroundStyle(.secondary) + + Defaults.Toggle("Show time remaining", key: .lockScreenShowCalendarTimeRemaining) + .disabled(!lockScreenShowCalendarEvent) + .settingsHighlight(id: highlightID("Show time remaining")) + + Defaults.Toggle("Show start time after event begins", key: .lockScreenShowCalendarStartTimeAfterBegins) + .disabled(!lockScreenShowCalendarEvent) + .settingsHighlight(id: highlightID("Show start time after event begins")) + } header: { + Text("Calendar Widget") + } footer: { + Text("Displays your next upcoming calendar event above or below the weather capsule. Calendar selection here is independent from the Dynamic Island calendar filter.") + } + LockScreenPositioningControls() Section { @@ -4590,9 +4340,9 @@ private struct LockScreenPositioningControls: View { HStack(alignment: .top, spacing: 24) { offsetColumn( - title: String(localized: "Weather"), + title: "Weather", value: weatherOffset, - resetTitle: String(localized: "Reset Weather"), + resetTitle: "Reset Weather", resetAction: resetWeatherOffset ) @@ -4600,9 +4350,9 @@ private struct LockScreenPositioningControls: View { .frame(height: 64) offsetColumn( - title: String(localized: "Timer"), + title: "Timer", value: timerOffset, - resetTitle: String(localized: "Reset Timer"), + resetTitle: "Reset Timer", resetAction: resetTimerOffset ) @@ -4610,9 +4360,9 @@ private struct LockScreenPositioningControls: View { .frame(height: 64) offsetColumn( - title: String(localized: "Music"), + title: "Music", value: musicOffset, - resetTitle: String(localized: "Reset Music"), + resetTitle: "Reset Music", resetAction: resetMusicOffset ) @@ -4624,21 +4374,21 @@ private struct LockScreenPositioningControls: View { VStack(alignment: .leading, spacing: 16) { widthSlider( - title: String(localized: "Media Panel Width"), + title: "Media Panel Width", value: musicWidthBinding, range: musicWidthRange, - resetTitle: String(localized: "Reset Media Width"), + resetTitle: "Reset Media Width", resetAction: resetMusicWidth, - helpText: String(localized: "Shrinks the lock screen media panel while keeping the expanded view full width.") + helpText: "Shrinks the lock screen media panel while keeping the expanded view full width." ) widthSlider( - title: String(localized: "Timer Widget Width"), + title: "Timer Widget Width", value: timerWidthBinding, range: timerWidthRange, - resetTitle: String(localized: "Reset Timer Width"), + resetTitle: "Reset Timer Width", resetAction: resetTimerWidth, - helpText: String(localized: "Adjusts the lock screen timer widget width without affecting button sizing.") + helpText: "Adjusts the lock screen timer widget width without affecting button sizing." ) } } header: { @@ -5049,7 +4799,7 @@ struct Shortcuts: View { var body: some View { Form { Section { - Defaults.Toggle(String(localized: "Enable global keyboard shortcuts"), key: .enableShortcuts) + Defaults.Toggle("Enable global keyboard shortcuts", key: .enableShortcuts) .settingsHighlight(id: highlightID("Enable global keyboard shortcuts")) } header: { Text("General") @@ -5319,7 +5069,7 @@ struct TimerSettings: View { @ViewBuilder private var timerFeatureSection: some View { Section { - Defaults.Toggle(String(localized: "Enable timer feature"), key: .enableTimerFeature) + Defaults.Toggle("Enable timer feature", key: .enableTimerFeature) .settingsHighlight(id: highlightID("Enable timer feature")) if enableTimerFeature { @@ -5374,11 +5124,11 @@ struct TimerSettings: View { @ViewBuilder private var lockScreenIntegrationSection: some View { Section { - Defaults.Toggle(String(localized:"Show lock screen timer widget"), key: .enableLockScreenTimerWidget) + Defaults.Toggle("Show lock screen timer widget", key: .enableLockScreenTimerWidget) .settingsHighlight(id: highlightID("Show lock screen timer widget")) Picker("Timer surface", selection: timerSurfaceBinding) { ForEach(LockScreenTimerSurfaceMode.allCases) { mode in - Text(mode.localizedName).tag(mode) + Text(mode.rawValue).tag(mode) } } .pickerStyle(.segmented) @@ -5389,7 +5139,7 @@ struct TimerSettings: View { if timerGlassModeIsGlass { Picker("Timer glass material", selection: $lockScreenTimerGlassStyle) { ForEach(LockScreenGlassStyle.allCases) { style in - Text(style.localizedName).tag(style) + Text(style.rawValue).tag(style) } } .disabled(!enableLockScreenTimerWidget) @@ -5449,9 +5199,9 @@ struct TimerSettings: View { Text("Default Custom Timer") .font(.headline) - TimerDurationStepperRow(title: String(localized:"Hours"), value: $customHours, range: 0...23) - TimerDurationStepperRow(title: String(localized:"Minutes"), value: $customMinutes, range: 0...59) - TimerDurationStepperRow(title: String(localized:"Seconds"), value: $customSeconds, range: 0...59) + TimerDurationStepperRow(title: "Hours", value: $customHours, range: 0...23) + TimerDurationStepperRow(title: "Minutes", value: $customMinutes, range: 0...59) + TimerDurationStepperRow(title: "Seconds", value: $customSeconds, range: 0...59) HStack { Text("Current default:") @@ -5501,7 +5251,7 @@ struct TimerSettings: View { Picker("Progress style", selection: $progressStyle) { ForEach(TimerProgressStyle.allCases) { style in - Text(style.localizedName).tag(style) + Text(style.rawValue).tag(style) } } .pickerStyle(.segmented) @@ -5791,9 +5541,9 @@ private struct TimerPresetEditorRow: View { } HStack(spacing: 16) { - TimerPresetComponentControl(title: String(localized:"Hours"), value: hoursBinding, range: 0...23) - TimerPresetComponentControl(title: String(localized:"Minutes"), value: minutesBinding, range: 0...59) - TimerPresetComponentControl(title: String(localized:"Seconds"), value: secondsBinding, range: 0...59) + TimerPresetComponentControl(title: "Hours", value: hoursBinding, range: 0...23) + TimerPresetComponentControl(title: "Minutes", value: minutesBinding, range: 0...59) + TimerPresetComponentControl(title: "Seconds", value: secondsBinding, range: 0...59) } ColorPicker("Accent colour", selection: colorBinding, supportsOpacity: false) @@ -5890,7 +5640,7 @@ struct StatsSettings: View { var body: some View { Form { Section { - Defaults.Toggle(String(localized: "Enable system stats monitoring"), key: .enableStatsFeature) + Defaults.Toggle("Enable system stats monitoring", key: .enableStatsFeature) .settingsHighlight(id: highlightID("Enable system stats monitoring")) .onChange(of: enableStatsFeature) { _, newValue in if !newValue { @@ -5910,7 +5660,7 @@ struct StatsSettings: View { if enableStatsFeature { Section { - Defaults.Toggle(String(localized: "Stop monitoring after closing the notch"), key: .statsStopWhenNotchCloses) + Defaults.Toggle("Stop monitoring after closing the notch", key: .statsStopWhenNotchCloses) .settingsHighlight(id: highlightID("Stop monitoring after closing the notch")) .help("When enabled, stats monitoring stops a few seconds after the notch closes.") @@ -5950,15 +5700,15 @@ struct StatsSettings: View { } Section { - Defaults.Toggle(String(localized: "CPU Usage"), key: .showCpuGraph) + Defaults.Toggle("CPU Usage", key: .showCpuGraph) .settingsHighlight(id: highlightID("CPU Usage")) - Defaults.Toggle(String(localized: "Memory Usage"), key: .showMemoryGraph) + Defaults.Toggle("Memory Usage", key: .showMemoryGraph) .settingsHighlight(id: highlightID("Memory Usage")) - Defaults.Toggle(String(localized: "GPU Usage"), key: .showGpuGraph) + Defaults.Toggle("GPU Usage", key: .showGpuGraph) .settingsHighlight(id: highlightID("GPU Usage")) - Defaults.Toggle(String(localized: "Network Activity"), key: .showNetworkGraph) + Defaults.Toggle("Network Activity", key: .showNetworkGraph) .settingsHighlight(id: highlightID("Network Activity")) - Defaults.Toggle(String(localized: "Disk I/O"), key: .showDiskGraph) + Defaults.Toggle("Disk I/O", key: .showDiskGraph) .settingsHighlight(id: highlightID("Disk I/O")) } header: { Text("Graph Visibility") @@ -5992,7 +5742,7 @@ struct StatsSettings: View { if statsManager.isMonitoring { if showCpuGraph { HStack { - Text(String(localized: "CPU Usage")) + Text("CPU Usage") Spacer() Text(statsManager.cpuUsageString) .foregroundStyle(.secondary) @@ -6001,7 +5751,7 @@ struct StatsSettings: View { if showMemoryGraph { HStack { - Text(String(localized: "Memory Usage")) + Text("Memory Usage") Spacer() Text(statsManager.memoryUsageString) .foregroundStyle(.secondary) @@ -6010,7 +5760,7 @@ struct StatsSettings: View { if showGpuGraph { HStack { - Text(String(localized: "GPU Usage")) + Text("GPU Usage") Spacer() Text(statsManager.gpuUsageString) .foregroundStyle(.secondary) @@ -6019,14 +5769,14 @@ struct StatsSettings: View { if showNetworkGraph { HStack { - Text(String(localized: "Network Download")) + Text("Network Download") Spacer() Text(String(format: "%.1f MB/s", statsManager.networkDownload)) .foregroundStyle(.secondary) } HStack { - Text(String(localized: "Network Upload")) + Text("Network Upload") Spacer() Text(String(format: "%.1f MB/s", statsManager.networkUpload)) .foregroundStyle(.secondary) @@ -6035,14 +5785,14 @@ struct StatsSettings: View { if showDiskGraph { HStack { - Text(String(localized: "Disk Read")) + Text("Disk Read") Spacer() Text(String(format: "%.1f MB/s", statsManager.diskRead)) .foregroundStyle(.secondary) } HStack { - Text(String(localized: "Disk Write")) + Text("Disk Write") Spacer() Text(String(format: "%.1f MB/s", statsManager.diskWrite)) .foregroundStyle(.secondary) @@ -6050,7 +5800,7 @@ struct StatsSettings: View { } HStack { - Text(String(localized: "Last Updated")) + Text("Last Updated") Spacer() Text(statsManager.lastUpdated, style: .relative) .foregroundStyle(.secondary) @@ -6103,7 +5853,7 @@ struct ClipboardSettings: View { var body: some View { Form { Section { - Defaults.Toggle(String(localized: "Enable Clipboard Manager"), key: .enableClipboardManager) + Defaults.Toggle("Enable Clipboard Manager", key: .enableClipboardManager) .settingsHighlight(id: highlightID("Enable Clipboard Manager")) .onChange(of: enableClipboardManager) { _, enabled in if enabled { @@ -6120,7 +5870,7 @@ struct ClipboardSettings: View { if enableClipboardManager { Section { - Defaults.Toggle(String(localized: "Show Clipboard Icon"), key: .showClipboardIcon) + Defaults.Toggle("Show Clipboard Icon", key: .showClipboardIcon) .settingsHighlight(id: highlightID("Show Clipboard Icon")) HStack { @@ -6132,7 +5882,7 @@ struct ClipboardSettings: View { } } .pickerStyle(.menu) - .frame(width: 200) + .frame(width: 100) } .settingsHighlight(id: highlightID("Display Mode")) @@ -6146,7 +5896,7 @@ struct ClipboardSettings: View { Text("10 items").tag(10) } .pickerStyle(.menu) - .frame(width: 200) + .frame(width: 100) } .settingsHighlight(id: highlightID("History Size")) @@ -6243,16 +5993,16 @@ struct ClipboardSettings: View { let interval = Date().timeIntervalSince(date) if interval < 60 { - return String(localized: "Just now") + return "Just now" } else if interval < 3600 { let minutes = Int(interval / 60) - return String(localized: "\(minutes)m ago") + return "\(minutes)m ago" } else if interval < 86400 { let hours = Int(interval / 3600) - return String(localized: "\(hours)h ago") + return "\(hours)h ago" } else { let days = Int(interval / 86400) - return String(localized: "\(days)d ago") + return "\(days)d ago" } } } @@ -6272,7 +6022,7 @@ struct ScreenAssistantSettings: View { var body: some View { Form { Section { - Defaults.Toggle(String(localized: "Enable Screen Assistant"), key: .enableScreenAssistant) + Defaults.Toggle("Enable Screen Assistant", key: .enableScreenAssistant) .settingsHighlight(id: highlightID("Enable Screen Assistant")) } header: { Text("AI Assistant") @@ -6343,7 +6093,7 @@ struct ScreenAssistantSettings: View { } } .pickerStyle(.menu) - .frame(width: 150) + .frame(width: 100) } .settingsHighlight(id: highlightID("Display Mode")) @@ -6419,16 +6169,16 @@ struct ScreenAssistantSettings: View { let interval = Date().timeIntervalSince(date) if interval < 60 { - return String(localized: "Just now") + return "Just now" } else if interval < 3600 { let minutes = Int(interval / 60) - return String(localized: "\(minutes)m ago") + return "\(minutes)m ago" } else if interval < 86400 { let hours = Int(interval / 3600) - return String(localized: "\(hours)h ago") + return "\(hours)h ago" } else { let days = Int(interval / 86400) - return String(localized: "\(days)d ago") + return "\(days)d ago" } } } @@ -6448,7 +6198,7 @@ struct ColorPickerSettings: View { var body: some View { Form { Section { - Defaults.Toggle(String(localized: "Enable Color Picker"), key: .enableColorPickerFeature) + Defaults.Toggle("Enable Color Picker", key: .enableColorPickerFeature) .settingsHighlight(id: highlightID("Enable Color Picker")) } header: { Text("Color Picker") @@ -6458,7 +6208,7 @@ struct ColorPickerSettings: View { if enableColorPickerFeature { Section { - Defaults.Toggle(String(localized: "Show Color Picker Icon"), key: .showColorPickerIcon) + Defaults.Toggle("Show Color Picker Icon", key: .showColorPickerIcon) .settingsHighlight(id: highlightID("Show Color Picker Icon")) HStack { @@ -6470,7 +6220,7 @@ struct ColorPickerSettings: View { } } .pickerStyle(.menu) - .frame(width: 150) + .frame(width: 100) } .settingsHighlight(id: highlightID("Display Mode")) @@ -6484,11 +6234,11 @@ struct ColorPickerSettings: View { Text("20 colors").tag(20) } .pickerStyle(.menu) - .frame(width: 150) + .frame(width: 100) } .settingsHighlight(id: highlightID("History Size")) - Defaults.Toggle(String(localized: "Show All Color Formats"), key: .showColorFormats) + Defaults.Toggle("Show All Color Formats", key: .showColorFormats) .settingsHighlight(id: highlightID("Show All Color Formats")) } header: { @@ -6708,12 +6458,12 @@ struct SettingsPermissionCallout: View { let openSettingsAction: () -> Void init( - title: String = String(localized: "Accessibility permission required"), + title: String = "Accessibility permission required", message: String, icon: String = "exclamationmark.triangle.fill", iconColor: Color = .orange, - requestButtonTitle: String = String(localized: "Request Access"), - openSettingsButtonTitle: String = String(localized: "Open Settings"), + requestButtonTitle: String = "Request Access", + openSettingsButtonTitle: String = "Open Settings", requestAction: @escaping () -> Void, openSettingsAction: @escaping () -> Void ) { @@ -6772,13 +6522,13 @@ struct NotesSettingsView: View { var body: some View { Form { Section { - Defaults.Toggle(String(localized: "Enable Notes"), key: .enableNotes) + Defaults.Toggle("Enable Notes", key: .enableNotes) if Defaults[.enableNotes] { - Defaults.Toggle(String(localized: "Enable Note Pinning"), key: .enableNotePinning) - Defaults.Toggle(String(localized: "Enable Note Search"), key: .enableNoteSearch) - Defaults.Toggle(String(localized: "Enable Color Filtering"), key: .enableNoteColorFiltering) - Defaults.Toggle(String(localized: "Enable Create from Clipboard"), key: .enableCreateFromClipboard) - Defaults.Toggle(String(localized: "Show Character Count"), key: .enableNoteCharCount) + Defaults.Toggle("Enable Note Pinning", key: .enableNotePinning) + Defaults.Toggle("Enable Note Search", key: .enableNoteSearch) + Defaults.Toggle("Enable Color Filtering", key: .enableNoteColorFiltering) + Defaults.Toggle("Enable Create from Clipboard", key: .enableCreateFromClipboard) + Defaults.Toggle("Show Character Count", key: .enableNoteCharCount) } } header: { Text("General")