diff --git a/DynamicIsland/BluetoothHUDAnimations/airpods.mov b/DynamicIsland/BluetoothHUDAnimations/airpods.mov
new file mode 100755
index 0000000..96e69a1
--- /dev/null
+++ b/DynamicIsland/BluetoothHUDAnimations/airpods.mov
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:54332f65534c9af667a302e9c2df17e4420bffb94e93cecd0091b11a05e70efc
+size 351501
diff --git a/DynamicIsland/BluetoothHUDAnimations/airpodsGen3.mov b/DynamicIsland/BluetoothHUDAnimations/airpodsGen3.mov
new file mode 100755
index 0000000..37b635e
--- /dev/null
+++ b/DynamicIsland/BluetoothHUDAnimations/airpodsGen3.mov
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:329be57b63f437e3329772b688440b825ae4b27ece16ac33c483d43b3725d0cf
+size 391452
diff --git a/DynamicIsland/BluetoothHUDAnimations/airpodsGen4.mov b/DynamicIsland/BluetoothHUDAnimations/airpodsGen4.mov
new file mode 100644
index 0000000..089fda0
--- /dev/null
+++ b/DynamicIsland/BluetoothHUDAnimations/airpodsGen4.mov
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:04b9bce0be1bb910c10d7466b795e0909cbf70d6b62e5f227124d7c67bc9b53a
+size 352641
diff --git a/DynamicIsland/BluetoothHUDAnimations/airpodsMax.mov b/DynamicIsland/BluetoothHUDAnimations/airpodsMax.mov
new file mode 100755
index 0000000..1cab6ca
--- /dev/null
+++ b/DynamicIsland/BluetoothHUDAnimations/airpodsMax.mov
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b587c84649e0f3986d59b46fab527a15b2c8146eb9c57a523a2e899afe41ac20
+size 476065
diff --git a/DynamicIsland/BluetoothHUDAnimations/airpodsPro.mov b/DynamicIsland/BluetoothHUDAnimations/airpodsPro.mov
new file mode 100755
index 0000000..ee76359
--- /dev/null
+++ b/DynamicIsland/BluetoothHUDAnimations/airpodsPro.mov
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c2be0bc5150dd21d85c9d64a18ec5a782279e30980996e726a6c8d3a8cecb775
+size 463126
diff --git a/DynamicIsland/BluetoothHUDAnimations/airpodsPro3.mov b/DynamicIsland/BluetoothHUDAnimations/airpodsPro3.mov
new file mode 100644
index 0000000..e03ff48
--- /dev/null
+++ b/DynamicIsland/BluetoothHUDAnimations/airpodsPro3.mov
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:df3275c52a9599dbd5768aba279c8904037925bbed6a02a2166a0a01fb730875
+size 398759
diff --git a/DynamicIsland/BluetoothHUDAnimations/beatssolo.mov b/DynamicIsland/BluetoothHUDAnimations/beatssolo.mov
new file mode 100644
index 0000000..5e1cbb7
--- /dev/null
+++ b/DynamicIsland/BluetoothHUDAnimations/beatssolo.mov
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:4c59f43e4f3446a163dde871035971eb1482475051dbc67e5f6a771b5fb04f13
+size 393932
diff --git a/DynamicIsland/BluetoothHUDAnimations/beatsstudio.mov b/DynamicIsland/BluetoothHUDAnimations/beatsstudio.mov
new file mode 100644
index 0000000..2a772ba
--- /dev/null
+++ b/DynamicIsland/BluetoothHUDAnimations/beatsstudio.mov
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:835ba4373e8f3dd85e2ff77655eb9464ed07a58687b3b79b51a4535c5febd26a
+size 443917
diff --git a/DynamicIsland/ContentView.swift b/DynamicIsland/ContentView.swift
index cc795e4..033e69a 100644
--- a/DynamicIsland/ContentView.swift
+++ b/DynamicIsland/ContentView.swift
@@ -583,7 +583,7 @@ struct ContentView: View {
.frame(width: 76, alignment: .trailing)
}
.frame(height: vm.effectiveClosedNotchHeight + (isHovering ? 8 : 0), alignment: .center)
- } else if coordinator.sneakPeek.show && Defaults[.inlineHUD] && (coordinator.sneakPeek.type != .music) && (coordinator.sneakPeek.type != .battery) && (coordinator.sneakPeek.type != .timer) && (coordinator.sneakPeek.type != .reminder) && !coordinator.sneakPeek.type.isExtensionPayload && (coordinator.sneakPeek.type != .volume || vm.notchState == .closed) {
+ } else if coordinator.sneakPeek.show && Defaults[.inlineHUD] && (coordinator.sneakPeek.type != .music) && (coordinator.sneakPeek.type != .battery) && (coordinator.sneakPeek.type != .timer) && (coordinator.sneakPeek.type != .reminder) && !coordinator.sneakPeek.type.isExtensionPayload && ((coordinator.sneakPeek.type != .volume && coordinator.sneakPeek.type != .brightness && coordinator.sneakPeek.type != .backlight) || vm.notchState == .closed) {
InlineHUD(type: $coordinator.sneakPeek.type, value: $coordinator.sneakPeek.value, icon: $coordinator.sneakPeek.icon, hoverAnimation: $isHovering, gestureProgress: $gestureProgress)
.transition(
coordinator.sneakPeek.type == .capsLock
@@ -631,7 +631,7 @@ struct ContentView: View {
}
if coordinator.sneakPeek.show {
- if (coordinator.sneakPeek.type != .music) && (coordinator.sneakPeek.type != .battery) && (coordinator.sneakPeek.type != .timer) && !Defaults[.inlineHUD] && (coordinator.sneakPeek.type != .volume || vm.notchState == .closed) {
+ if (coordinator.sneakPeek.type != .music) && (coordinator.sneakPeek.type != .battery) && (coordinator.sneakPeek.type != .timer) && !Defaults[.inlineHUD] && ((coordinator.sneakPeek.type != .volume && coordinator.sneakPeek.type != .brightness && coordinator.sneakPeek.type != .backlight) || vm.notchState == .closed) {
SystemEventIndicatorModifier(eventType: $coordinator.sneakPeek.type, value: $coordinator.sneakPeek.value, icon: $coordinator.sneakPeek.icon, sendEventBack: { _ in
//
})
diff --git a/DynamicIsland/DynamicIslandApp.swift b/DynamicIsland/DynamicIslandApp.swift
index fd91921..9422ba7 100644
--- a/DynamicIsland/DynamicIslandApp.swift
+++ b/DynamicIsland/DynamicIslandApp.swift
@@ -636,8 +636,6 @@ class AppDelegate: NSObject, NSApplicationDelegate {
let timerWidgetManager = LockScreenTimerWidgetManager.shared
timerWidgetManager.handleLockStateChange(isLocked: LockScreenManager.shared.currentLockStatus)
- // Ensure the reminder widget mirrors live activity snapshots as soon as they exist.
- _ = LockScreenReminderWidgetManager.shared
}
private func registerOptionalShortcutHandlers() {
diff --git a/DynamicIsland/Localizable.xcstrings b/DynamicIsland/Localizable.xcstrings
index 0806b97..43742e8 100644
--- a/DynamicIsland/Localizable.xcstrings
+++ b/DynamicIsland/Localizable.xcstrings
@@ -99,8 +99,7 @@
"value" : ""
}
}
- },
- "shouldTranslate" : false
+ }
},
" – %lld" : {
"localizations" : {
@@ -214,6 +213,19 @@
}
}
},
+ "-%@" : {
+ "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,
@@ -644,6 +656,107 @@
}
}
},
+ "%@" : {
+ "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,
@@ -714,6 +827,18 @@
}
}
},
+ "%@. Focus active: %@" : {
+ "comment" : "A row that combines a calendar event with a focus indicator. The first argument is the text of the calendar event. The second argument is the name of the focus.",
+ "isCommentAutoGenerated" : true,
+ "localizations" : {
+ "en" : {
+ "stringUnit" : {
+ "state" : "new",
+ "value" : "%1$@. Focus active: %2$@"
+ }
+ }
+ }
+ },
"%@°" : {
"comment" : "A label inside the temperature gauge that shows the current temperature. The value is shown in degrees Celsius (or Fahrenheit, if specified in the snapshot).",
"isCommentAutoGenerated" : true,
@@ -888,59 +1013,11 @@
}
}
},
- "%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,
@@ -1052,42 +1129,6 @@
},
"shouldTranslate" : false
},
- "%lldd ago" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "%lldd atrás"
- }
- }
- }
- },
- "%lldh" : {
- "shouldTranslate" : false
- },
- "%lldh ago" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "%lldh atrás"
- }
- }
- }
- },
- "%lldm" : {
- "shouldTranslate" : false
- },
- "%lldm ago" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "%lldm atrás"
- }
- }
- }
- },
"%lldx" : {
"localizations" : {
"fr" : {
@@ -1464,6 +1505,17 @@
}
}
},
+ "• Updated %@" : {
+ "extractionState" : "stale",
+ "localizations" : {
+ "fr" : {
+ "stringUnit" : {
+ "state" : "needs_review",
+ "value" : "• Mis à jour %@"
+ }
+ }
+ }
+ },
"••••••••" : {
"shouldTranslate" : false
},
@@ -1483,19 +1535,6 @@
}
}
},
- "±10" : {
- "shouldTranslate" : false
- },
- "±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,
@@ -1510,6 +1549,26 @@
"comment" : "A time displayed in the timer panel on a lock screen.",
"isCommentAutoGenerated" : true,
"shouldTranslate" : false
+ },
+ "1 hour" : {
+
+ },
+ "1 min" : {
+
+ },
+ "1x" : {
+ "extractionState" : "stale",
+ "localizations" : {
+ "fr" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "1x"
+ }
+ }
+ }
+ },
+ "2 hours" : {
+
},
"3 items" : {
"localizations" : {
@@ -1558,6 +1617,9 @@
}
}
}
+ },
+ "5 mins" : {
+
},
"7 items" : {
"localizations" : {
@@ -1606,6 +1668,9 @@
}
}
}
+ },
+ "10 mins" : {
+
},
"15 colors" : {
"localizations" : {
@@ -1623,6 +1688,20 @@
}
}
},
+ "15 mins" : {
+
+ },
+ "20" : {
+ "extractionState" : "stale",
+ "localizations" : {
+ "fr" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "20"
+ }
+ }
+ }
+ },
"20 colors" : {
"localizations" : {
"fr" : {
@@ -1638,6 +1717,23 @@
}
}
}
+ },
+ "30" : {
+ "extractionState" : "stale",
+ "localizations" : {
+ "fr" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "30"
+ }
+ }
+ }
+ },
+ "30 mins" : {
+
+ },
+ "45 mins" : {
+
},
"100" : {
"comment" : "The text displayed below a 100% battery level in the lock screen.",
@@ -1755,33 +1851,104 @@
}
}
},
- "accent" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "destaque"
- }
- }
- }
- },
- "Accent" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "Destaque"
- }
- }
- }
- },
"Accent color" : {
+ "extractionState" : "stale",
"localizations" : {
- "pt-BR" : {
+ "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" : "首选颜色"
+ }
}
}
},
@@ -1907,26 +2074,6 @@
}
}
},
- "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" : {
@@ -1943,6 +2090,57 @@
}
}
},
+ "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" : {
@@ -1960,7 +2158,7 @@
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
- "value" : "Ativo"
+ "value" : "Ativar"
}
}
}
@@ -1999,16 +2197,6 @@
}
}
},
- "Adaptive gradient" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "Gradiente Adaptativo"
- }
- }
- }
- },
"Add" : {
"localizations" : {
"ar" : {
@@ -2168,11 +2356,105 @@
}
},
"Add icon" : {
+
+ },
+ "Add manually" : {
+ "extractionState" : "stale",
"localizations" : {
- "pt-BR" : {
+ "ar" : {
+ "stringUnit" : {
+ "state" : "needs_review",
+ "value" : "Add manually"
+ }
+ },
+ "cs" : {
+ "stringUnit" : {
+ "state" : "needs_review",
+ "value" : "Přidat manuálně"
+ }
+ },
+ "de" : {
"stringUnit" : {
"state" : "translated",
- "value" : "Adicionar ícone"
+ "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" : "手动添加"
}
}
}
@@ -2439,26 +2721,6 @@
}
}
},
- "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" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "ia"
- }
- }
- }
- },
"AI Assistant" : {
"localizations" : {
"fr" : {
@@ -2545,16 +2807,6 @@
}
}
},
- "air quality" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "qualidade do r"
- }
- }
- }
- },
"Air quality index %d, %@" : {
"comment" : "Air quality accessibility label",
"localizations" : {
@@ -2592,9 +2844,6 @@
}
}
},
- "airdrop" : {
- "shouldTranslate" : false
- },
"AirDrop" : {
"localizations" : {
"ar" : {
@@ -2796,28 +3045,8 @@
}
}
},
- "airplay" : {
- "shouldTranslate" : false
- },
- "album art" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "capa do álbum"
- }
- }
- }
- },
- "alert" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "alerta"
- }
- }
- }
+ "Alignment" : {
+
},
"All" : {
"localizations" : {
@@ -2829,16 +3058,6 @@
}
}
},
- "all-day" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "dia todo"
- }
- }
- }
- },
"All-day" : {
"localizations" : {
"ar" : {
@@ -3051,56 +3270,6 @@
}
}
},
- "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"
- }
- }
- }
- },
- "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,
@@ -3318,6 +3487,23 @@
}
}
},
+ "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,
@@ -3331,7 +3517,7 @@
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
- "value" : "Nome da Animação"
+ "value" : "Nome da Animaçãp"
}
}
}
@@ -3368,16 +3554,6 @@
}
}
},
- "app icon" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "ícone do app"
- }
- }
- }
- },
"App icon" : {
"localizations" : {
"ar" : {
@@ -3490,16 +3666,6 @@
}
}
},
- "appearance" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "aparência"
- }
- }
- }
- },
"Appearance" : {
"localizations" : {
"ar" : {
@@ -3600,9 +3766,6 @@
}
}
},
- "Apple Music" : {
- "shouldTranslate" : false
- },
"Applies the notch-style parallax effect to the lock screen media widget album art." : {
"localizations" : {
"pt-BR" : {
@@ -3613,9 +3776,6 @@
}
}
},
- "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,
@@ -3628,26 +3788,6 @@
}
}
},
- "aqi" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "iqa"
- }
- }
- }
- },
- "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" : {
@@ -3709,6 +3849,7 @@
"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" : {
@@ -3719,11 +3860,23 @@
}
},
"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 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."
+ "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."
}
}
}
@@ -3744,9 +3897,6 @@
}
}
},
- "audio" : {
- "shouldTranslate" : false
- },
"Audio feedback" : {
"comment" : "A section header that lists audio feedback settings.",
"isCommentAutoGenerated" : true,
@@ -3759,16 +3909,6 @@
}
}
},
- "authorization" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "autorização"
- }
- }
- }
- },
"Authorize" : {
"comment" : "A button that authorizes an app extension.",
"isCommentAutoGenerated" : true,
@@ -3793,36 +3933,6 @@
}
}
},
- "auto open" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "abrir automaticamente"
- }
- }
- }
- },
- "auto stop" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "parar 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,
@@ -4035,26 +4145,6 @@
}
}
},
- "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,
@@ -4073,16 +4163,6 @@
}
}
},
- "backlight" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "luz de fundo"
- }
- }
- }
- },
"Backlight" : {
"comment" : "A control for adjusting the keyboard backlight intensity.",
"isCommentAutoGenerated" : true,
@@ -4095,36 +4175,6 @@
}
}
},
- "bar" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "barraa"
- }
- }
- }
- },
- "Bar" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "Barra"
- }
- }
- }
- },
- "battery" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "bateria"
- }
- }
- }
- },
"Battery" : {
"localizations" : {
"ar" : {
@@ -4269,26 +4319,6 @@
}
}
},
- "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,
@@ -4401,16 +4431,6 @@
}
}
},
- "battery percent" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "porcentagem de bateria"
- }
- }
- }
- },
"Battery Settings" : {
"localizations" : {
"ar" : {
@@ -4621,16 +4641,6 @@
}
}
},
- "battery text" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "texto da bateria"
- }
- }
- }
- },
"Battery Widget" : {
"localizations" : {
"pt-BR" : {
@@ -4656,12 +4666,19 @@
"isCommentAutoGenerated" : true,
"shouldTranslate" : false
},
- "black" : {
+ "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" : "preto"
+ "value" : "A caixa tracelhada azul mostra o tamanho real no Atol"
}
}
}
@@ -4678,9 +4695,6 @@
}
}
},
- "bluetooth" : {
- "shouldTranslate" : false
- },
"Bluetooth Audio Devices" : {
"comment" : "A section header that lists Bluetooth audio devices.",
"isCommentAutoGenerated" : true,
@@ -4716,16 +4730,6 @@
}
}
},
- "blur" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "desfoque"
- }
- }
- }
- },
"Boost your productivity with Clipboard Manager" : {
"localizations" : {
"ar" : {
@@ -4826,12 +4830,25 @@
}
}
},
- "Break" : {
+ "Both" : {
+ "extractionState" : "stale",
"localizations" : {
+ "en" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Both"
+ }
+ },
+ "fr" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Les deux"
+ }
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
- "value" : "Descanso"
+ "value" : "Ambos"
}
}
}
@@ -4854,18 +4871,8 @@
},
"pt-BR" : {
"stringUnit" : {
- "state" : "translated",
- "value" : "Detalhes"
- }
- }
- }
- },
- "brightness" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "brilho"
+ "state" : "needs_review",
+ "value" : "Breakdown"
}
}
}
@@ -4921,9 +4928,37 @@
}
},
"pt-BR" : {
+ "stringUnit" : {
+ "state" : "needs_review",
+ "value" : "Built-in"
+ }
+ }
+ }
+ },
+ "Built-in System Monitoring" : {
+ "extractionState" : "stale",
+ "localizations" : {
+ "fr" : {
"stringUnit" : {
"state" : "translated",
- "value" : "Integrada"
+ "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."
}
}
}
@@ -4942,17 +4977,6 @@
"value" : "Achetez-nous un café"
}
}
- },
- "shouldTranslate" : false
- },
- "calendar" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "calendário"
- }
- }
}
},
"Calendar" : {
@@ -5055,6 +5079,107 @@
}
}
},
+ "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,
@@ -5072,6 +5197,9 @@
}
}
}
+ },
+ "Calendar Widget" : {
+
},
"Calendars" : {
"localizations" : {
@@ -5286,8 +5414,28 @@
}
}
},
- "celsius" : {
- "shouldTranslate" : false
+ "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" : {
@@ -5305,26 +5453,6 @@
}
}
},
- "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" : {
@@ -5426,26 +5554,6 @@
}
}
},
- "Charging battery" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "Carregando Bateria"
- }
- }
- }
- },
- "charging icon" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "ícone de carregamento"
- }
- }
- }
- },
"Charging on Hold: Desktop Mode" : {
"localizations" : {
"ar" : {
@@ -5546,16 +5654,6 @@
}
}
},
- "charging percentage" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "porcentagem de carregamento"
- }
- }
- }
- },
"Check for Updates…" : {
"localizations" : {
"ar" : {
@@ -5656,28 +5754,35 @@
}
}
},
- "chime" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "toque de notificação"
- }
- }
- }
- },
"Chip color" : {
"comment" : "A label for the color of the chip in the lock screen reminder widget.",
"isCommentAutoGenerated" : true,
"localizations" : {
"pt-BR" : {
"stringUnit" : {
- "state" : "translated",
+ "state" : "needs_review",
"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" : {
@@ -5861,7 +5966,7 @@
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
- "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."
+ "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."
}
}
}
@@ -5873,7 +5978,7 @@
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
- "value" : "Escolha quais controles de sistema devem exibir janelas OSD customizadas."
+ "value" : "Escolha quais controles de sistema devem exibir janelas OSD personalizadas."
}
}
}
@@ -5924,16 +6029,6 @@
}
}
},
- "circle" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "círculo"
- }
- }
- }
- },
"Circle" : {
"localizations" : {
"ar" : {
@@ -6034,32 +6129,6 @@
}
}
},
- "circular" : {
- "shouldTranslate" : false
- },
- "Circular" : {
- "shouldTranslate" : false
- },
- "classic" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "clássico"
- }
- }
- }
- },
- "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,
@@ -6072,6 +6141,23 @@
}
}
},
+ "Clear" : {
+ "extractionState" : "stale",
+ "localizations" : {
+ "fr" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Effacer"
+ }
+ },
+ "pt-BR" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Limpar"
+ }
+ }
+ }
+ },
"Clear All Files" : {
"localizations" : {
"fr" : {
@@ -6300,16 +6386,6 @@
}
}
},
- "clipboard" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "área de transferência"
- }
- }
- }
- },
"Clipboard" : {
"localizations" : {
"fr" : {
@@ -6390,26 +6466,6 @@
}
}
},
- "clock app" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "app do relógio"
- }
- }
- }
- },
- "close" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "fechar"
- }
- }
- }
- },
"Close" : {
"localizations" : {
"ar" : {
@@ -6510,16 +6566,6 @@
}
}
},
- "close animation" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "animação de fechar"
- }
- }
- }
- },
"Close assistant" : {
"localizations" : {
"fr" : {
@@ -6536,26 +6582,6 @@
}
}
},
- "Close gesture" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "Gesto de fechar"
- }
- }
- }
- },
- "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,
@@ -6568,16 +6594,6 @@
}
}
},
- "color" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "cor"
- }
- }
- }
- },
"Color Details" : {
"localizations" : {
"fr" : {
@@ -6594,16 +6610,6 @@
}
}
},
- "color formats" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "formatos de cores"
- }
- }
- }
- },
"Color Formats" : {
"localizations" : {
"fr" : {
@@ -6620,16 +6626,6 @@
}
}
},
- "color history" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "histórico de cores"
- }
- }
- }
- },
"Color History" : {
"localizations" : {
"fr" : {
@@ -6646,16 +6642,6 @@
}
}
},
- "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,
@@ -6684,16 +6670,6 @@
}
}
},
- "color picker" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "selecionar cor"
- }
- }
- }
- },
"Color Picker" : {
"localizations" : {
"fr" : {
@@ -6742,16 +6718,6 @@
}
}
},
- "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,
@@ -6776,16 +6742,6 @@
}
}
},
- "Color-coded volume display" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "Exibição de volume codificada por cores"
- }
- }
- }
- },
"ColorPicker Disabled" : {
"localizations" : {
"fr" : {
@@ -6902,26 +6858,6 @@
}
}
},
- "compact" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "compacto"
- }
- }
- }
- },
- "completed" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "completo"
- }
- }
- }
- },
"Configuration" : {
"localizations" : {
"fr" : {
@@ -6965,7 +6901,7 @@
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
- "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."
+ "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."
}
}
}
@@ -6994,22 +6930,13 @@
}
}
},
- "Connects directly to the Apple Music app." : {
+ "Connected" : {
+ "extractionState" : "stale",
"localizations" : {
- "pt-BR" : {
+ "fr" : {
"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."
+ "value" : "Connecté"
}
}
}
@@ -7136,26 +7063,6 @@
}
}
},
- "controller" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "controlador"
- }
- }
- }
- },
- "controls" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "controles"
- }
- }
- }
- },
"Controls" : {
"localizations" : {
"fr" : {
@@ -7181,6 +7088,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" : {
@@ -7202,16 +7112,6 @@
}
}
},
- "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,
@@ -7309,26 +7209,6 @@
},
"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,
@@ -7341,12 +7221,6 @@
}
}
},
- "cpu" : {
- "shouldTranslate" : false
- },
- "CPU" : {
- "shouldTranslate" : false
- },
"CPU Usage" : {
"localizations" : {
"fr" : {
@@ -7363,16 +7237,6 @@
}
}
},
- "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" : {
@@ -7383,6 +7247,17 @@
}
}
},
+ "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,
@@ -7469,25 +7344,30 @@
}
}
},
- "cursor" : {
- "shouldTranslate" : false
- },
- "custom" : {
+ "Custom" : {
+ "extractionState" : "stale",
"localizations" : {
- "pt-BR" : {
+ "fr" : {
"stringUnit" : {
"state" : "translated",
- "value" : "customizado"
+ "value" : "Personnalisé"
}
}
}
},
- "Custom Focus metadata" : {
+ "Custom color" : {
+ "extractionState" : "stale",
"localizations" : {
- "pt-BR" : {
+ "en" : {
"stringUnit" : {
"state" : "translated",
- "value" : "Metadados de Foco Customizado"
+ "value" : "Custom color"
+ }
+ },
+ "fr" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Couleur personnalisée"
}
}
}
@@ -7592,26 +7472,6 @@
}
}
},
- "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,
@@ -7834,16 +7694,6 @@
}
}
},
- "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,
@@ -7851,7 +7701,7 @@
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
- "value" : "OSD Customizado"
+ "value" : "OSD personalizado"
}
}
}
@@ -7863,7 +7713,7 @@
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
- "value" : "O recurso OSD customizado requer o macOS 15 ou posterior."
+ "value" : "O recurso OSD personalizado requer o macOS 15 ou posterior."
}
}
}
@@ -7879,7 +7729,18 @@
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
- "value" : "Temporizador Customizado"
+ "value" : "Temporizador Personalizado"
+ }
+ }
+ }
+ },
+ "Custom Timer Duration" : {
+ "extractionState" : "stale",
+ "localizations" : {
+ "fr" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Durée du minuteur personnalisée"
}
}
}
@@ -7954,7 +7815,7 @@
},
"pt-BR" : {
"stringUnit" : {
- "state" : "translated",
+ "state" : "needs_review",
"value" : "Vizualizadores personalizados (Lottie)"
}
},
@@ -8140,16 +8001,6 @@
}
}
},
- "Deep Work" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "Trabalho Focado"
- }
- }
- }
- },
"Default" : {
"localizations" : {
"ar" : {
@@ -8257,7 +8108,7 @@
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
- "value" : "Temporizador Customizado Padrão"
+ "value" : "Temporizador Personalizado Padrão"
}
}
}
@@ -8338,16 +8189,6 @@
}
}
},
- "Denied" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "Negado"
- }
- }
- }
- },
"Denied/Revoked" : {
"comment" : "A label describing an extension with denied or revoked permissions.",
"isCommentAutoGenerated" : true,
@@ -8372,8 +8213,109 @@
}
}
},
- "Designer" : {
- "shouldTranslate" : false
+ "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" : "描述"
+ }
+ }
+ }
+ },
+ "Deselect All" : {
+
},
"Detection Status" : {
"comment" : "The header for a section that displays whether the screen recording detection feature is currently active or inactive.",
@@ -8393,26 +8335,6 @@
}
}
},
- "Developer" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "Desenvolvedor"
- }
- }
- }
- },
- "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,
@@ -8425,16 +8347,6 @@
}
}
},
- "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,
@@ -8447,9 +8359,6 @@
}
}
},
- "Digital" : {
- "shouldTranslate" : false
- },
"Dimensions" : {
"localizations" : {
"pt-BR" : {
@@ -8460,15 +8369,109 @@
}
}
},
- "Disable Minimalistic UI to configure the standard notch media controls." : {
+ "Disable" : {
+ "extractionState" : "stale",
"localizations" : {
- "pt-BR" : {
+ "ar" : {
+ "stringUnit" : {
+ "state" : "needs_review",
+ "value" : "Disable"
+ }
+ },
+ "cs" : {
+ "stringUnit" : {
+ "state" : "needs_review",
+ "value" : "Vypnout"
+ }
+ },
+ "de" : {
"stringUnit" : {
"state" : "translated",
- "value" : "Desatile a interface do usuário minimalista para configurar os controles de mídia no notch padrão."
+ "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." : {
+
},
"Disabled" : {
"localizations" : {
@@ -8582,36 +8585,6 @@
}
}
},
- "disk" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "disco"
- }
- }
- }
- },
- "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" : {
@@ -8644,16 +8617,6 @@
}
}
},
- "display height" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "altura da tela"
- }
- }
- }
- },
"Display Mode" : {
"localizations" : {
"fr" : {
@@ -8670,12 +8633,13 @@
}
}
},
- "displays" : {
+ "Display Options" : {
+ "extractionState" : "stale",
"localizations" : {
- "pt-BR" : {
+ "fr" : {
"stringUnit" : {
"state" : "translated",
- "value" : "telas"
+ "value" : "Options d’affichage"
}
}
}
@@ -8712,11 +8676,14 @@
"localizations" : {
"pt-BR" : {
"stringUnit" : {
- "state" : "translated",
- "value" : "Exibe o estado atual do Foco acima da cápsula de clima quando a detecção de Foco estiver ativada."
+ "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."
}
}
}
+ },
+ "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" : {
@@ -8728,20 +8695,9 @@
}
}
},
- "dock" : {
- "shouldTranslate" : false
- },
"Donate" : {
"comment" : "A button label that says \"Donate\".",
- "isCommentAutoGenerated" : true,
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "Doar"
- }
- }
- }
+ "isCommentAutoGenerated" : true
},
"Done" : {
"comment" : "A button label that indicates that the user has finished editing a note.",
@@ -8868,6 +8824,29 @@
}
}
},
+ "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" : {
@@ -8890,6 +8869,17 @@
}
}
},
+ "Download indicators" : {
+ "extractionState" : "stale",
+ "localizations" : {
+ "fr" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Télécharger les indicateurs"
+ }
+ }
+ }
+ },
"Downloads" : {
"localizations" : {
"ar" : {
@@ -8991,16 +8981,6 @@
},
"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,
@@ -9038,14 +9018,7 @@
}
},
"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" : {
@@ -9147,12 +9120,6 @@
}
}
},
- "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,
@@ -9166,14 +9133,7 @@
}
},
"Dynamic Island Visibility" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "Visibilidade da Dynamic Island"
- }
- }
- }
+
},
"dynamic.island" : {
"localizations" : {
@@ -9202,9 +9162,6 @@
}
}
},
- "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" : {
@@ -9421,12 +9378,13 @@
}
}
},
- "enable" : {
+ "Email address" : {
+ "extractionState" : "stale",
"localizations" : {
- "pt-BR" : {
+ "fr" : {
"stringUnit" : {
"state" : "translated",
- "value" : "ativar"
+ "value" : "Adresse e-mail"
}
}
}
@@ -9437,28 +9395,8 @@
"localizations" : {
"pt-BR" : {
"stringUnit" : {
- "state" : "translated",
- "value" : "Ative \"Mostrar animações divertidas enquanto inativo\" para personalizar as animações"
- }
- }
- }
- },
- "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"
+ "state" : "needs_review",
+ "value" : "Ative \"Mostrar animação de rosto legal durante a inatividade\" para personalizar as animações"
}
}
}
@@ -9475,17 +9413,30 @@
}
}
},
- "Enable blur effect behind album art" : {
+ "Enable Built-in System HUD" : {
+ "extractionState" : "stale",
"localizations" : {
- "pt-BR" : {
+ "fr" : {
"stringUnit" : {
"state" : "translated",
- "value" : "Habilitar o efeito de desfoque atrás da arte do álbum"
+ "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" : {
@@ -9496,6 +9447,7 @@
}
},
"Enable Camera Access" : {
+ "extractionState" : "stale",
"localizations" : {
"pt-BR" : {
"stringUnit" : {
@@ -9505,52 +9457,103 @@
}
}
},
- "Enable Camera Detection" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "Ativar Detecção de Câmera"
- }
- }
- }
- },
- "Enable Clipboard Manager" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "Ativar Gerenciador da Área de Transferência"
- }
- }
- }
- },
- "Enable Color Filtering" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "Habilitar Filtragem por Cores"
- }
- }
- }
- },
- "Enable Color Picker" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "Ativar Seletor de Cor"
- }
- }
- }
- },
"Enable colored spectrograms" : {
+ "extractionState" : "stale",
"localizations" : {
- "pt-BR" : {
+ "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" : "Ativar espectrogramas coloridos"
+ "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" : "启用彩色谱图"
}
}
}
@@ -9571,26 +9574,6 @@
}
}
},
- "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" : {
- "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,
@@ -9603,45 +9586,8 @@
}
}
},
- "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" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "Ative os controles de mídia Dynamic Island para gerenciar o painel da tela de bloqueio."
- }
- }
- }
- },
- "Enable Dynamic mirror" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "Ativar Espelho Dinâmico"
- }
- }
- }
- },
- "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.",
@@ -9655,36 +9601,6 @@
}
}
},
- "Enable Focus Detection" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "Ativar Detecção de Foco"
- }
- }
- }
- },
- "Enable gestures" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "Habilitar gestos"
- }
- }
- }
- },
- "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" : {
@@ -9695,16 +9611,6 @@
}
}
},
- "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,
@@ -9718,6 +9624,7 @@
}
},
"Enable haptics" : {
+ "extractionState" : "stale",
"localizations" : {
"ar" : {
"stringUnit" : {
@@ -9787,8 +9694,8 @@
},
"pt-BR" : {
"stringUnit" : {
- "state" : "translated",
- "value" : "Ativar feedback tátil"
+ "state" : "needs_review",
+ "value" : "Enable haptics"
}
},
"ru" : {
@@ -9817,22 +9724,103 @@
}
}
},
- "Enable lock screen live activity" : {
+ "Enable HUD replacement" : {
+ "extractionState" : "stale",
"localizations" : {
- "pt-BR" : {
+ "ar" : {
"stringUnit" : {
- "state" : "translated",
- "value" : "Ativar a atividade ao vivo da tela de bloqueio"
+ "state" : "needs_review",
+ "value" : "Enable HUD replacement"
}
- }
- }
- },
- "Enable lyrics" : {
- "localizations" : {
- "pt-BR" : {
+ },
+ "cs" : {
+ "stringUnit" : {
+ "state" : "needs_review",
+ "value" : "Povolit nahrazení HUD"
+ }
+ },
+ "de" : {
"stringUnit" : {
"state" : "translated",
- "value" : "Ativar letras"
+ "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 替换"
}
}
}
@@ -9849,26 +9837,6 @@
}
}
},
- "Enable Microphone Detection" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "Habilitar Detecção de Microfone"
- }
- }
- }
- },
- "Enable Minimalistic UI" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "Habilitar UI Minimalista"
- }
- }
- }
- },
"Enable music live activity" : {
"localizations" : {
"ar" : {
@@ -9969,56 +9937,6 @@
}
}
},
- "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" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "Ativar lembrete de atividade ao vivo"
- }
- }
- }
- },
- "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" : {
@@ -10029,26 +9947,6 @@
}
}
},
- "Enable Screen Recording Detection" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "Ativar Detecção de Gravação de Tela"
- }
- }
- }
- },
- "Enable shelf" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "Ativar mesa"
- }
- }
- }
- },
"Enable sneak peek" : {
"localizations" : {
"fr" : {
@@ -10075,22 +9973,12 @@
}
}
},
- "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" : {
"stringUnit" : {
- "state" : "translated",
- "value" : "Ative a cápsula da bateria e configura seu layout."
+ "state" : "needs_review",
+ "value" : "Ative a cápsula da bateria e configure seu layout."
}
}
}
@@ -10129,26 +10017,6 @@
}
}
},
- "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" : {
@@ -10169,16 +10037,6 @@
}
}
},
- "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,
@@ -10191,8 +10049,8 @@
},
"pt-BR" : {
"stringUnit" : {
- "state" : "translated",
- "value" : "Utilização da GPU"
+ "state" : "needs_review",
+ "value" : "Utilização do motor"
}
}
}
@@ -10513,16 +10371,6 @@
}
}
},
- "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,
@@ -10535,12 +10383,19 @@
}
}
},
- "events" : {
+ "Exclude apps" : {
+ "extractionState" : "stale",
"localizations" : {
- "pt-BR" : {
+ "en" : {
"stringUnit" : {
"state" : "translated",
- "value" : "eventos"
+ "value" : "Exclude apps"
+ }
+ },
+ "fr" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Exclure des applications"
}
}
}
@@ -10661,18 +10516,8 @@
"localizations" : {
"pt-BR" : {
"stringUnit" : {
- "state" : "translated",
- "value" : "Área de detecção expandida"
- }
- }
- }
- },
- "expanded notch" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "notch expandido"
+ "state" : "needs_review",
+ "value" : "Área de detecção quando expandido"
}
}
}
@@ -10689,26 +10534,6 @@
}
}
},
- "Extend hover area" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "Expandir a área de hover"
- }
- }
- }
- },
- "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,
@@ -10721,16 +10546,6 @@
}
}
},
- "extensions" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "extensões"
- }
- }
- }
- },
"Extensions" : {
"localizations" : {
"ar" : {
@@ -10849,52 +10664,6 @@
}
}
},
- "eyedropper" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "conta-gotas"
- }
- }
- }
- },
- "face animation" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "animações de rosto"
- }
- }
- }
- },
- "fahrenheit" : {
- "shouldTranslate" : false
- },
- "Favorites" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "Favoritos"
- }
- }
- }
- },
- "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,
@@ -10902,7 +10671,7 @@
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
- "value" : "Os arquivos deixados na mesa serão compartilhados através deste serviço"
+ "value" : "Os arquivos deixados na prateleira serão compartilhados através deste serviço"
}
}
}
@@ -11039,16 +10808,6 @@
}
}
},
- "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,
@@ -11099,48 +10858,13 @@
}
}
},
- "frosted" : {
- "shouldTranslate" : false
- },
- "Frosted Glass" : {
- "shouldTranslate" : false
- },
- "Full Access" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "Acesso Total"
- }
- }
- }
- },
- "Full charge" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "Bateria Completa"
- }
- }
- }
- },
"Full Disk Access required" : {
+ "extractionState" : "stale",
"localizations" : {
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
- "value" : "Acesso Completo ao Disco Necessário"
- }
- }
- }
- },
- "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."
+ "value" : "Acesso completo ao disco necessário"
}
}
}
@@ -11156,26 +10880,6 @@
}
}
},
- "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" : {
@@ -11192,16 +10896,6 @@
}
}
},
- "general" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "Geral"
- }
- }
- }
- },
"General" : {
"localizations" : {
"ar" : {
@@ -11514,16 +11208,6 @@
}
}
},
- "gestures" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "gestos"
- }
- }
- }
- },
"Get started" : {
"localizations" : {
"ar" : {
@@ -11741,26 +11425,6 @@
},
"shouldTranslate" : false
},
- "glass" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "vidro"
- }
- }
- }
- },
- "Glass" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "Vidro"
- }
- }
- }
- },
"Glass mode" : {
"localizations" : {
"pt-BR" : {
@@ -11783,16 +11447,6 @@
}
}
},
- "glow" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "brilho"
- }
- }
- }
- },
"Got it!" : {
"localizations" : {
"ar" : {
@@ -11893,12 +11547,6 @@
}
}
},
- "gpu" : {
- "shouldTranslate" : false
- },
- "GPU" : {
- "shouldTranslate" : false
- },
"GPU Usage" : {
"localizations" : {
"fr" : {
@@ -11915,16 +11563,6 @@
}
}
},
- "gradient" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "gradiente"
- }
- }
- }
- },
"Gradient" : {
"localizations" : {
"ar" : {
@@ -12025,26 +11663,6 @@
}
}
},
- "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" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "gráfico"
- }
- }
- }
- },
"Graph Visibility" : {
"localizations" : {
"fr" : {
@@ -12061,52 +11679,19 @@
}
}
},
- "graphics" : {
+ "Height:" : {
+ "extractionState" : "stale",
"localizations" : {
- "pt-BR" : {
+ "fr" : {
"stringUnit" : {
"state" : "translated",
- "value" : "gráficos"
+ "value" : "Hauteur :"
}
- }
- }
- },
- "gray" : {
- "localizations" : {
+ },
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
- "value" : "cinza"
- }
- }
- }
- },
- "Green" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "Verde"
- }
- }
- }
- },
- "grid" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "grade"
- }
- }
- }
- },
- "haptic" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "tátil"
+ "value" : "Altura:"
}
}
}
@@ -12121,9 +11706,6 @@
}
}
},
- "hex" : {
- "shouldTranslate" : false
- },
"Hide" : {
"localizations" : {
"fr" : {
@@ -12164,16 +11746,6 @@
}
}
},
- "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" : {
@@ -12501,26 +12073,6 @@
}
}
},
- "history" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "histórico"
- }
- }
- }
- },
- "History" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "Histórico"
- }
- }
- }
- },
"History Size" : {
"localizations" : {
"fr" : {
@@ -12549,32 +12101,6 @@
},
"shouldTranslate" : false
},
- "Hours" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "Horas"
- }
- }
- }
- },
- "hover" : {
- "shouldTranslate" : false
- },
- "hover to open" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "hover para abrir"
- }
- }
- }
- },
- "hsl" : {
- "shouldTranslate" : false
- },
"https://example.com/animation.json" : {
"comment" : "A placeholder text for a Lottie JSON URL input field.",
"isCommentAutoGenerated" : true,
@@ -12689,9 +12215,6 @@
},
"shouldTranslate" : false
},
- "hud" : {
- "shouldTranslate" : false
- },
"HUD Position" : {
"localizations" : {
"pt-BR" : {
@@ -12904,16 +12427,6 @@
},
"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,
@@ -12926,16 +12439,6 @@
}
}
},
- "idle" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "inativo"
- }
- }
- }
- },
"Idle" : {
"comment" : "A label displayed alongside the status of a GPU device.",
"isCommentAutoGenerated" : true,
@@ -12972,16 +12475,6 @@
}
}
},
- "Image" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "Imagem"
- }
- }
- }
- },
"Import" : {
"localizations" : {
"fr" : {
@@ -13150,26 +12643,6 @@
}
}
},
- "indicator" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "indicador"
- }
- }
- }
- },
- "inline" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "em linha"
- }
- }
- }
- },
"Inline" : {
"localizations" : {
"ar" : {
@@ -13240,8 +12713,8 @@
},
"pt-BR" : {
"stringUnit" : {
- "state" : "translated",
- "value" : "Em linha"
+ "state" : "needs_review",
+ "value" : "Inline"
}
},
"ru" : {
@@ -13273,9 +12746,127 @@
"Inline snapshot preview" : {
"localizations" : {
"pt-BR" : {
+ "stringUnit" : {
+ "state" : "needs_review",
+ "value" : "Inline snapshot preview"
+ }
+ }
+ }
+ },
+ "Install updates automatically" : {
+ "extractionState" : "stale",
+ "localizations" : {
+ "en" : {
"stringUnit" : {
"state" : "translated",
- "value" : "Pré-visualização de snapshot em linha"
+ "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" : "已安装扩展"
}
}
}
@@ -13290,9 +12881,6 @@
}
}
},
- "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,
@@ -13329,36 +12917,6 @@
}
}
},
- "just now" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "agora mesmo"
- }
- }
- }
- },
- "Just now" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "Agora mesmo"
- }
- }
- }
- },
- "keyboard" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "teclado"
- }
- }
- }
- },
"Keyboard Backlight HUD" : {
"localizations" : {
"fr" : {
@@ -13409,18 +12967,8 @@
"localizations" : {
"pt-BR" : {
"stringUnit" : {
- "state" : "translated",
- "value" : "Os rótulos usam textos compactos de ligado/desligado enquanto o modo de notificação breve estiver ativado."
- }
- }
- }
- },
- "laptop icon" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "ícone do laptop"
+ "state" : "needs_review",
+ "value" : "Os rótulos são forçados a compactar o texto ligado/desligado enquanto o modo brief toast está ativado."
}
}
}
@@ -13448,7 +12996,7 @@
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
- "value" : "Última Atualização Há"
+ "value" : "Atualizado pelo Última vez"
}
}
}
@@ -13553,16 +13101,6 @@
}
}
},
- "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,
@@ -13588,12 +13126,13 @@
}
}
},
- "Light Use" : {
+ "License key" : {
+ "extractionState" : "stale",
"localizations" : {
- "pt-BR" : {
+ "fr" : {
"stringUnit" : {
"state" : "translated",
- "value" : "Uso Leve"
+ "value" : "Clé de license"
}
}
}
@@ -13620,19 +13159,6 @@
},
"shouldTranslate" : false
},
- "liquid" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "líquido"
- }
- }
- }
- },
- "Liquid Glass" : {
- "shouldTranslate" : false
- },
"Liquid Glass requires macOS 26 or later." : {
"localizations" : {
"fr" : {
@@ -13649,16 +13175,6 @@
}
}
},
- "list" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "lista"
- }
- }
- }
- },
"Listens for Focus session changes via distributed notifications" : {
"localizations" : {
"pt-BR" : {
@@ -13681,16 +13197,6 @@
}
}
},
- "live activities" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "atividade ao vivo"
- }
- }
- }
- },
"Live Activities" : {
"comment" : "The title of the \"Live Activities\" screen.",
"isCommentAutoGenerated" : true,
@@ -13703,16 +13209,6 @@
}
}
},
- "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,
@@ -13725,6 +13221,17 @@
}
}
},
+ "Live Monitoring" : {
+ "extractionState" : "stale",
+ "localizations" : {
+ "fr" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Suivi en directe"
+ }
+ }
+ }
+ },
"Live Performance Data" : {
"localizations" : {
"fr" : {
@@ -13783,26 +13290,6 @@
}
}
},
- "location" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "localização"
- }
- }
- }
- },
- "lock screen" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "tela de bloqueio"
- }
- }
- }
- },
"Lock Screen" : {
"localizations" : {
"fr" : {
@@ -13861,16 +13348,6 @@
}
}
},
- "lock screen media" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "mídia da tela de bloqueio"
- }
- }
- }
- },
"Lock Screen Media" : {
"localizations" : {
"pt-BR" : {
@@ -13917,16 +13394,6 @@
}
}
},
- "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,
@@ -13939,16 +13406,6 @@
}
}
},
- "logging" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "relatório"
- }
- }
- }
- },
"Loop Mode" : {
"localizations" : {
"pt-BR" : {
@@ -14057,8 +13514,7 @@
"value" : "Lottie JSON 链接"
}
}
- },
- "shouldTranslate" : false
+ }
},
"Low" : {
"comment" : "Low battery level label",
@@ -14161,26 +13617,6 @@
}
}
},
- "low battery" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "bateria baixa"
- }
- }
- }
- },
- "Low battery" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "Bateria baixa"
- }
- }
- }
- },
"Low Power Mode" : {
"localizations" : {
"ar" : {
@@ -14281,26 +13717,6 @@
}
}
},
- "Low Power: %@" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "Pouca Energia: %@"
- }
- }
- }
- },
- "lyrics" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "letras"
- }
- }
- }
- },
"Mac battery at %d percent" : {
"comment" : "Mac battery gauge accessibility label",
"localizations" : {
@@ -14336,16 +13752,6 @@
}
}
},
- "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,
@@ -14358,16 +13764,6 @@
}
}
},
- "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,
@@ -14392,16 +13788,6 @@
}
}
},
- "marquee" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "texto rolante"
- }
- }
- }
- },
"Match menubar height" : {
"localizations" : {
"ar" : {
@@ -14473,7 +13859,7 @@
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
- "value" : "Corresponder à altura da barra de menus"
+ "value" : "Corresponder à altura da barra de menu"
}
},
"ru" : {
@@ -14602,9 +13988,6 @@
}
}
},
- "material" : {
- "shouldTranslate" : false
- },
"Material" : {
"comment" : "A picker that lets the user select the material of the lock screen glass.",
"isCommentAutoGenerated" : true,
@@ -14722,16 +14105,6 @@
}
}
},
- "media" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "mídia"
- }
- }
- }
- },
"Media" : {
"localizations" : {
"ar" : {
@@ -14834,6 +14207,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" : {
@@ -14904,8 +14278,8 @@
},
"pt-BR" : {
"stringUnit" : {
- "state" : "translated",
- "value" : "Mudar a mídia com gestos horizontais"
+ "state" : "needs_review",
+ "value" : "Media change with horizontal gestures"
}
},
"ru" : {
@@ -15146,16 +14520,6 @@
}
}
},
- "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,
@@ -15168,16 +14532,6 @@
}
}
},
- "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,
@@ -15190,16 +14544,6 @@
}
}
},
- "Media Panel Width" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "Largura do Painel de Mídia"
- }
- }
- }
- },
"Media playback live activity" : {
"localizations" : {
"ar" : {
@@ -15270,7 +14614,7 @@
},
"pt-BR" : {
"stringUnit" : {
- "state" : "translated",
+ "state" : "needs_review",
"value" : "Atividade ao vivo da reprodução de mídia"
}
},
@@ -15300,16 +14644,6 @@
}
}
},
- "media source" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "fonte de mídia"
- }
- }
- }
- },
"Media Source" : {
"localizations" : {
"ar" : {
@@ -15521,26 +14855,6 @@
}
}
},
- "memory" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "memória"
- }
- }
- }
- },
- "Memory" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "Memória"
- }
- }
- }
- },
"Memory Usage" : {
"localizations" : {
"fr" : {
@@ -15557,27 +14871,8 @@
}
}
},
- "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" : {
@@ -15647,8 +14942,8 @@
},
"pt-BR" : {
"stringUnit" : {
- "state" : "translated",
- "value" : "ícone da barra de menus"
+ "state" : "needs_review",
+ "value" : "Menubar icon"
}
},
"ru" : {
@@ -15677,12 +14972,116 @@
}
}
},
- "Mic" : {
+ "Messages" : {
+ "comment" : "The title of the \"Messages\" settings page.",
+ "extractionState" : "stale",
+ "isCommentAutoGenerated" : true,
"localizations" : {
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
- "value" : "Microfone"
+ "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" : "麦克风 %@"
}
}
}
@@ -15705,8 +15104,8 @@
"localizations" : {
"pt-BR" : {
"stringUnit" : {
- "state" : "translated",
- "value" : "Microfone ativado"
+ "state" : "needs_review",
+ "value" : "Microfone fora do mudo"
}
}
}
@@ -15773,12 +15172,13 @@
}
}
},
- "minimalistic" : {
+ "min" : {
+ "extractionState" : "stale",
"localizations" : {
- "pt-BR" : {
+ "fr" : {
"stringUnit" : {
"state" : "translated",
- "value" : "minimaalista"
+ "value" : "min"
}
}
}
@@ -15894,21 +15294,12 @@
}
},
"Minutes" : {
+ "extractionState" : "stale",
"localizations" : {
- "pt-BR" : {
+ "fr" : {
"stringUnit" : {
"state" : "translated",
- "value" : "Minutos"
- }
- }
- }
- },
- "mirror" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "espelho"
+ "value" : "Minutes"
}
}
}
@@ -16025,16 +15416,6 @@
}
}
},
- "mirror shape" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "formato do espelho"
- }
- }
- }
- },
"Mirror shape" : {
"localizations" : {
"ar" : {
@@ -16106,7 +15487,7 @@
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
- "value" : "Formato do espelho"
+ "value" : "Espelhar o formato"
}
},
"ru" : {
@@ -16145,16 +15526,6 @@
}
}
},
- "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" : {
@@ -16177,16 +15548,6 @@
}
}
},
- "monitoring" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "monitoramento"
- }
- }
- }
- },
"Monitoring Behavior" : {
"localizations" : {
"pt-BR" : {
@@ -16208,17 +15569,18 @@
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
- "value" : "Status de Monitoramento"
+ "value" : "Status de Monitoramente"
}
}
}
},
- "monochrome" : {
+ "Monitoring Stopped" : {
+ "extractionState" : "stale",
"localizations" : {
- "pt-BR" : {
+ "fr" : {
"stringUnit" : {
"state" : "translated",
- "value" : "monocromático"
+ "value" : "Le suivi a pris fin"
}
}
}
@@ -16347,16 +15709,6 @@
}
}
},
- "Music" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "Música"
- }
- }
- }
- },
"Music panel variant" : {
"localizations" : {
"pt-BR" : {
@@ -16801,36 +16153,6 @@
}
}
},
- "network" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "rede"
- }
- }
- }
- },
- "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" : {
@@ -17375,6 +16697,118 @@
}
}
},
+ "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,
@@ -17432,7 +16866,7 @@
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
- "value" : "Nenhuma predefinição configurada. Adicione uma predefinição para que ela apareça no menu suspenso do temporizador."
+ "value" : "Nenhuma predefinição configurada. Adicione uma predefinição para que ela apareça no pop-over do temporizador."
}
}
}
@@ -17611,26 +17045,6 @@
}
}
},
- "Not charging" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "Carregamento Parado"
- }
- }
- }
- },
- "Not Determined" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "Não Determinado"
- }
- }
- }
- },
"Not Now" : {
"localizations" : {
"ar" : {
@@ -17741,9 +17155,6 @@
}
}
},
- "notch" : {
- "shouldTranslate" : false
- },
"Notch behavior" : {
"localizations" : {
"ar" : {
@@ -18073,16 +17484,6 @@
}
}
},
- "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,
@@ -18095,26 +17496,6 @@
}
}
},
- "Now Playing" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "Tocando Agora"
- }
- }
- }
- },
- "Off" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "Desligado"
- }
- }
- }
- },
"OK" : {
"localizations" : {
"ar" : {
@@ -18216,26 +17597,6 @@
},
"shouldTranslate" : false
},
- "On" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "Ligado"
- }
- }
- }
- },
- "on-screen display" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "Exibição na tela"
- }
- }
- }
- },
"One or more files failed to load" : {
"localizations" : {
"ar" : {
@@ -18336,6 +17697,17 @@
}
}
},
+ "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,
@@ -18360,12 +17732,13 @@
}
}
},
- "open" : {
+ "Only download icon" : {
+ "extractionState" : "stale",
"localizations" : {
- "pt-BR" : {
+ "en" : {
"stringUnit" : {
"state" : "translated",
- "value" : "abrir"
+ "value" : "Only download icon"
}
}
}
@@ -18392,17 +17765,6 @@
}
}
},
- "open meteo" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "needs_review",
- "value" : "open meteo"
- }
- }
- },
- "shouldTranslate" : false
- },
"Open Model Settings" : {
"localizations" : {
"pt-BR" : {
@@ -18413,46 +17775,6 @@
}
}
},
- "Open notch on hover" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "Abrir notch com hover"
- }
- }
- }
- },
- "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" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "Abra a guia da mesa por padrão se os itens forem adicionados"
- }
- }
- }
- },
"Open System Settings" : {
"localizations" : {
"pt-BR" : {
@@ -18493,9 +17815,6 @@
}
}
},
- "osd" : {
- "shouldTranslate" : false
- },
"Output devices" : {
"comment" : "Section title for the list of available audio output devices in the media output selector.",
"isCommentAutoGenerated" : true,
@@ -18532,26 +17851,6 @@
}
}
},
- "Panel" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "Painel"
- }
- }
- }
- },
- "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,
@@ -18584,19 +17883,6 @@
}
}
},
- "parallax" : {
- "shouldTranslate" : false
- },
- "parallax effect" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "efeito parallax"
- }
- }
- }
- },
"Pause" : {
"shouldTranslate" : false
},
@@ -18613,21 +17899,12 @@
}
},
"Percentage" : {
+ "extractionState" : "stale",
"localizations" : {
- "pt-BR" : {
+ "en" : {
"stringUnit" : {
"state" : "translated",
- "value" : "Porcentagem"
- }
- }
- }
- },
- "percentages" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "porcentagem"
+ "value" : "Percentage"
}
}
}
@@ -18644,16 +17921,6 @@
}
}
},
- "permissions" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "permissões"
- }
- }
- }
- },
"Permissions" : {
"localizations" : {
"pt-BR" : {
@@ -18744,16 +18011,6 @@
}
}
},
- "pinch" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "pinça"
- }
- }
- }
- },
"Pinned Items" : {
"localizations" : {
"pt-BR" : {
@@ -18764,46 +18021,6 @@
}
}
},
- "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" : {
- "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" : {
- "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,
@@ -18926,16 +18143,6 @@
}
}
},
- "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,
@@ -18943,7 +18150,7 @@
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
- "value" : "O modo Menu Suspenso mostra a área de transferência como um menu suspenso anexado ao botão da área de transferência."
+ "value" : "O modo popover mostra a área de transferência como um menu suspenso anexado ao botão da área de transferência."
}
}
}
@@ -18953,7 +18160,7 @@
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
- "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."
+ "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."
}
}
}
@@ -18963,7 +18170,7 @@
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
- "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."
+ "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."
}
}
}
@@ -18984,36 +18191,6 @@
}
}
},
- "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,
@@ -19021,7 +18198,7 @@
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
- "value" : "Nome da predefinição"
+ "value" : "Nome da predefinições"
}
}
}
@@ -19045,7 +18222,7 @@
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
- "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."
+ "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."
}
}
}
@@ -19068,16 +18245,6 @@
}
}
},
- "preview" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "pré-vizualização"
- }
- }
- }
- },
"Preview" : {
"localizations" : {
"fr" : {
@@ -19106,16 +18273,6 @@
}
}
},
- "privacy" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "privacidade"
- }
- }
- }
- },
"Privacy Indicators" : {
"comment" : "A heading for the section that lists privacy indicators.",
"isCommentAutoGenerated" : true,
@@ -19140,22 +18297,13 @@
}
}
},
- "progress" : {
+ "Progress bar" : {
+ "extractionState" : "stale",
"localizations" : {
- "pt-BR" : {
+ "en" : {
"stringUnit" : {
"state" : "translated",
- "value" : "progresso"
- }
- }
- }
- },
- "Progress" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "Progresso"
+ "value" : "Progress bar"
}
}
}
@@ -19503,20 +18651,23 @@
}
}
},
- "R " : {
- "comment" : "Abbreviation for “Disk Read”",
+ "Quit boring.notch" : {
+ "extractionState" : "stale",
"localizations" : {
- "pt-BR" : {
+ "en" : {
"stringUnit" : {
"state" : "translated",
- "value" : "L"
+ "value" : "Quit boring.notch"
+ }
+ },
+ "fr" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Quitter boring.notch"
}
}
}
},
- "ram" : {
- "shouldTranslate" : false
- },
"Re-authorize" : {
"comment" : "A button that re-authorizes an app when pressed.",
"isCommentAutoGenerated" : true,
@@ -19607,16 +18758,6 @@
}
}
},
- "recording" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "gravação"
- }
- }
- }
- },
"Recording" : {
"localizations" : {
"fr" : {
@@ -19667,26 +18808,6 @@
}
}
},
- "rectangle" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "retângulo"
- }
- }
- }
- },
- "reflection" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "reflexo"
- }
- }
- }
- },
"Release name" : {
"localizations" : {
"ar" : {
@@ -19887,36 +19008,6 @@
}
}
},
- "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,
@@ -19929,15 +19020,8 @@
}
}
},
- "reminder widget" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "widget de lembrete"
- }
- }
- }
+ "Reminder Widget" : {
+
},
"Reminders" : {
"localizations" : {
@@ -19955,16 +19039,6 @@
}
}
},
- "remove" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "remover"
- }
- }
- }
- },
"Remove" : {
"comment" : "A button that removes an extension from the authorized list.",
"isCommentAutoGenerated" : true,
@@ -20004,20 +19078,13 @@
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
- "value" : "Remova da mesa depois de arrastar"
+ "value" : "Remova da prateleira depois de arrastar"
}
}
}
},
"Remove selected" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "Remover selecionado"
- }
- }
- }
+
},
"Request Access" : {
"localizations" : {
@@ -20030,27 +19097,7 @@
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
- "value" : "Solicitar Acesso"
- }
- }
- }
- },
- "Request Full Disk Access" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "Solicitar Acesso Completo ao Disco"
- }
- }
- }
- },
- "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."
+ "value" : "Requer Acesso"
}
}
}
@@ -20121,26 +19168,6 @@
}
}
},
- "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,
@@ -20165,26 +19192,6 @@
}
}
},
- "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" : {
@@ -20213,16 +19220,6 @@
}
}
},
- "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,
@@ -20235,12 +19232,103 @@
}
}
},
- "resize" : {
+ "Restart" : {
+ "extractionState" : "stale",
"localizations" : {
- "pt-BR" : {
+ "ar" : {
+ "stringUnit" : {
+ "state" : "needs_review",
+ "value" : "Restart"
+ }
+ },
+ "cs" : {
+ "stringUnit" : {
+ "state" : "needs_review",
+ "value" : "Restart"
+ }
+ },
+ "de" : {
"stringUnit" : {
"state" : "translated",
- "value" : "redimensionar"
+ "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" : "重启"
}
}
}
@@ -20297,16 +19385,6 @@
}
}
},
- "Restricted" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "Restrito"
- }
- }
- }
- },
"Resume" : {
"localizations" : {
"fr" : {
@@ -20323,46 +19401,6 @@
}
}
},
- "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,
@@ -20375,9 +19413,6 @@
}
}
},
- "Rich Text" : {
- "shouldTranslate" : false
- },
"Right" : {
"localizations" : {
"pt-BR" : {
@@ -20388,32 +19423,114 @@
}
}
},
- "ring" : {
+ "Rotation:" : {
+ "extractionState" : "stale",
"localizations" : {
- "pt-BR" : {
+ "fr" : {
"stringUnit" : {
"state" : "translated",
- "value" : "círculo"
+ "value" : "Rotation:"
}
}
}
},
- "Ring" : {
+ "Running" : {
+ "extractionState" : "stale",
"localizations" : {
- "pt-BR" : {
+ "ar" : {
"stringUnit" : {
- "state" : "translated",
- "value" : "Círculo"
+ "state" : "needs_review",
+ "value" : "Running"
}
- }
- }
- },
- "route picker" : {
- "localizations" : {
- "pt-BR" : {
+ },
+ "cs" : {
+ "stringUnit" : {
+ "state" : "needs_review",
+ "value" : "Running"
+ }
+ },
+ "de" : {
"stringUnit" : {
"state" : "translated",
- "value" : "seletor de rota"
+ "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" : "运行中"
}
}
}
@@ -20476,16 +19593,6 @@
}
}
},
- "scale" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "escala"
- }
- }
- }
- },
"Scale Down" : {
"localizations" : {
"fr" : {
@@ -20518,12 +19625,13 @@
}
}
},
- "screen assistant" : {
+ "Scale:" : {
+ "extractionState" : "stale",
"localizations" : {
- "pt-BR" : {
+ "fr" : {
"stringUnit" : {
"state" : "translated",
- "value" : "assistente de tela"
+ "value" : "Échelle :"
}
}
}
@@ -20568,8 +19676,8 @@
"localizations" : {
"pt-BR" : {
"stringUnit" : {
- "state" : "translated",
- "value" : "Espaçamento da tela: %lldpx"
+ "state" : "needs_review",
+ "value" : "Screen Padding: %lldpx"
}
}
}
@@ -20584,16 +19692,6 @@
}
}
},
- "screenshot" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "captura de tela"
- }
- }
- }
- },
"Screenshot options" : {
"localizations" : {
"fr" : {
@@ -20626,9 +19724,6 @@
}
}
},
- "scroll" : {
- "shouldTranslate" : false
- },
"Scroll" : {
"comment" : "A hint text that appears when scrolling horizontally in the control palette.",
"isCommentAutoGenerated" : true,
@@ -20641,16 +19736,6 @@
}
}
},
- "Scroll device name in HUD" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "Rolar o nome do dispositivo no HUD"
- }
- }
- }
- },
"Search clipboard..." : {
"localizations" : {
"fr" : {
@@ -20735,12 +19820,30 @@
}
}
},
- "Seconds" : {
+ "seconds" : {
+ "extractionState" : "stale",
"localizations" : {
- "pt-BR" : {
+ "en" : {
"stringUnit" : {
"state" : "translated",
- "value" : "Segundos"
+ "value" : "seconds"
+ }
+ },
+ "fr" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "secondes"
+ }
+ }
+ }
+ },
+ "Seconds" : {
+ "extractionState" : "stale",
+ "localizations" : {
+ "fr" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Secondes"
}
}
}
@@ -20778,7 +19881,7 @@
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
- "value" : "Selecione um som Customizado para reproduzir quando um cronômetro terminar. Os formatos suportados incluem MP3, M4A, WAV e AIFF."
+ "value" : "Selecione um som personalizado para reproduzir quando um cronômetro terminar. Os formatos suportados incluem MP3, M4A, WAV e AIFF."
}
}
}
@@ -21129,12 +20232,13 @@
}
}
},
- "Separate Tab" : {
+ "Sensitivity" : {
+ "extractionState" : "stale",
"localizations" : {
- "pt-BR" : {
+ "fr" : {
"stringUnit" : {
"state" : "translated",
- "value" : "Aba Separada"
+ "value" : "Sensibilité"
}
}
}
@@ -21291,26 +20395,6 @@
}
}
},
- "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,
@@ -21323,46 +20407,6 @@
}
}
},
- "shadow" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "sombra"
- }
- }
- }
- },
- "shape" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "formato"
- }
- }
- }
- },
- "share" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "compartilhar"
- }
- }
- }
- },
- "shelf" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "mesa"
- }
- }
- }
- },
"Shelf" : {
"localizations" : {
"ar" : {
@@ -21434,7 +20478,7 @@
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
- "value" : "Mesa"
+ "value" : "Prateleira"
}
},
"ru" : {
@@ -21463,26 +20507,6 @@
}
}
},
- "shelf tab" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "aba da mesa"
- }
- }
- }
- },
- "shortcut" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "atalho"
- }
- }
- }
- },
"Shortcuts" : {
"localizations" : {
"ar" : {
@@ -21583,162 +20607,120 @@
}
}
},
- "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" : {
- "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" : {
+ "extractionState" : "stale",
"localizations" : {
- "pt-BR" : {
+ "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" : "Mostrar indicador de bateria"
+ "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 battery percentage" : {
+ "Show charging indicator" : {
+ "extractionState" : "stale",
"localizations" : {
- "pt-BR" : {
+ "en" : {
"stringUnit" : {
"state" : "translated",
- "value" : "Mostrar porcentagem da bateria"
+ "value" : "Show charging indicator"
}
- }
- }
- },
- "Show battery percentage text in HUD" : {
- "localizations" : {
- "pt-BR" : {
+ },
+ "fr" : {
"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" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "Mostrar Calendário"
- }
- }
- }
- },
- "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" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "Mostrar Mudança no Controle De Saída De Mídia"
- }
- }
- }
- },
- "Show Character Count" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "Mostrar Contagem de Caracteres"
- }
- }
- }
- },
- "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"
+ "value" : "Afficher l’indicateur de charge"
}
}
}
@@ -21759,16 +20741,6 @@
}
}
},
- "Show Color Picker Icon" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "Mostrar ícone do seletor de cores"
- }
- }
- }
- },
"Show Color Picker Panel" : {
"localizations" : {
"pt-BR" : {
@@ -21780,11 +20752,102 @@
}
},
"Show cool face animation while inactivity" : {
+ "extractionState" : "stale",
"localizations" : {
- "pt-BR" : {
+ "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" : "Mostrar animações divertidas enquanto inativo"
+ "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" : "不活动时显示动画"
}
}
}
@@ -21799,25 +20862,37 @@
}
}
},
- "Show extension tabs" : {
+ "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 aba de extensão"
+ "value" : "Mostrar o progresso do download"
}
}
}
},
- "Show floating media controls" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "Mostrar controles de mídia flutuantes"
- }
- }
- }
+ "Show event after it starts" : {
+
+ },
+ "Show events from all calendars" : {
+
+ },
+ "Show events within the next" : {
+
},
"Show floating pause/stop controls" : {
"localizations" : {
@@ -21829,46 +20904,6 @@
}
}
},
- "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 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,
@@ -21881,86 +20916,6 @@
}
}
},
- "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" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "Mostrar lembrete na tela de bloqueio"
- }
- }
- }
- },
- "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 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" : {
@@ -22161,16 +21116,6 @@
}
}
},
- "Show panel border" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "Mostrar borda do painel "
- }
- }
- }
- },
"Show Percentage" : {
"localizations" : {
"pt-BR" : {
@@ -22181,36 +21126,6 @@
}
}
},
- "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,
@@ -22233,12 +21148,103 @@
}
}
},
- "Show Recording Indicator" : {
+ "Show shuffle and repeat buttons" : {
+ "extractionState" : "stale",
"localizations" : {
- "pt-BR" : {
+ "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" : "Mostrar Indicador de Gravação"
+ "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" : "显示随机播放和重复按钮"
}
}
}
@@ -22255,16 +21261,6 @@
}
}
},
- "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,
@@ -22297,26 +21293,6 @@
}
}
},
- "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" : {
@@ -22343,22 +21319,13 @@
}
}
},
- "Shrinks the lock screen media panel while keeping the expanded view full width." : {
+ "Size & Scale" : {
+ "extractionState" : "stale",
"localizations" : {
- "pt-BR" : {
+ "fr" : {
"stringUnit" : {
"state" : "translated",
- "value" : "Encolhe o painel de mídia da tela de bloqueio, mantendo a largura total da visualização expandida."
- }
- }
- }
- },
- "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."
+ "value" : "Taille et échelle"
}
}
}
@@ -22373,16 +21340,6 @@
}
}
},
- "skip" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "pular"
- }
- }
- }
- },
"Skip buttons" : {
"comment" : "A section header that lists the skip behaviour options.",
"isCommentAutoGenerated" : true,
@@ -22395,26 +21352,6 @@
}
}
},
- "Skip forward or backward by ten seconds" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "Pular dez segundos para frente ou para trás"
- }
- }
- }
- },
- "slider" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "controle deslizante"
- }
- }
- }
- },
"Slider color" : {
"localizations" : {
"ar" : {
@@ -22515,26 +21452,6 @@
}
}
},
- "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,
@@ -22557,16 +21474,6 @@
}
}
},
- "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,
@@ -22749,8 +21656,8 @@
},
"pt-BR" : {
"stringUnit" : {
- "state" : "translated",
- "value" : "Estilo de prévia rápida"
+ "state" : "needs_review",
+ "value" : "Sneak Peek Style"
}
},
"ru" : {
@@ -22891,16 +21798,6 @@
}
}
},
- "solid" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "sólido"
- }
- }
- }
- },
"Solid colour" : {
"localizations" : {
"pt-BR" : {
@@ -22911,36 +21808,6 @@
}
}
},
- "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" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "espectrogramas"
- }
- }
- }
- },
"Speed" : {
"localizations" : {
"ar" : {
@@ -23041,8 +21908,16 @@
}
}
},
- "Spotify" : {
- "shouldTranslate" : false
+ "Speed:" : {
+ "extractionState" : "stale",
+ "localizations" : {
+ "fr" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Vitesse:"
+ }
+ }
+ }
},
"Square" : {
"localizations" : {
@@ -23144,55 +22019,11 @@
}
}
},
- "standard" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "padrão"
- }
- }
- }
- },
- "Standard" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "Padrão"
- }
- }
- }
- },
"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."
- }
- }
- }
- },
- "Standard previous/next track controls" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "Controles anterior/próxima padrão "
- }
- }
- }
+
},
"Start" : {
"localizations" : {
@@ -23319,7 +22150,7 @@
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
- "value" : "Comece a digitar…"
+ "value" : "Comece a digital…"
}
}
}
@@ -23334,26 +22165,6 @@
}
}
},
- "startup" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "inicializar"
- }
- }
- }
- },
- "stats" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "status"
- }
- }
- }
- },
"Stats" : {
"localizations" : {
"fr" : {
@@ -23386,6 +22197,62 @@
}
}
},
+ "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" : {
@@ -23412,31 +22279,11 @@
}
}
},
- "status bar" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "barra de status"
- }
- }
- }
- },
"Status:" : {
"comment" : "A label for the status of an extension.",
"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" : {
@@ -23469,16 +22316,6 @@
}
}
},
- "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" : {
@@ -23595,26 +22432,6 @@
}
}
},
- "Student" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "Estudante"
- }
- }
- }
- },
- "style" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "estilo"
- }
- }
- }
- },
"Style" : {
"localizations" : {
"pt-BR" : {
@@ -23637,6 +22454,107 @@
}
}
},
+ "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" : {
@@ -23684,16 +22602,6 @@
}
}
},
- "swipe" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "arrastar"
- }
- }
- }
- },
"System" : {
"comment" : "A label displayed above the system, load average, and uptime information.",
"isCommentAutoGenerated" : true,
@@ -23812,22 +22720,13 @@
}
}
},
- "system timer" : {
+ "System Performance Monitor" : {
+ "extractionState" : "stale",
"localizations" : {
- "pt-BR" : {
+ "fr" : {
"stringUnit" : {
"state" : "translated",
- "value" : "timer do sistema"
- }
- }
- }
- },
- "Tab" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "Aba"
+ "value" : "Suivi des Performances Système"
}
}
}
@@ -23858,28 +22757,11 @@
}
}
},
- "Text" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "Texto"
- }
- }
- }
- },
"TheDynamicIsland" : {
"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" : {
@@ -23901,16 +22783,6 @@
}
}
},
- "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,
@@ -23930,7 +22802,7 @@
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
- "value" : "Essa duração alimenta a opção \"Personalizado\" dentro do menu suspenso do temporizador para acesso rápido."
+ "value" : "Essa duração alimenta a opção \"Personalizado\" dentro do popover do temporizador para acesso rápido."
}
}
}
@@ -23957,6 +22829,17 @@
}
}
},
+ "Time Range" : {
+ "extractionState" : "stale",
+ "localizations" : {
+ "fr" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Période de temps"
+ }
+ }
+ }
+ },
"Time to Full Charge: %lld min" : {
"localizations" : {
"ar" : {
@@ -24057,16 +22940,6 @@
}
}
},
- "timer" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "temporizador"
- }
- }
- }
- },
"Timer" : {
"localizations" : {
"fr" : {
@@ -24083,16 +22956,6 @@
}
}
},
- "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,
@@ -24153,24 +23016,14 @@
}
}
},
- "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,
"localizations" : {
"pt-BR" : {
"stringUnit" : {
- "state" : "translated",
- "value" : "Material do vidro do temporizador"
+ "state" : "needs_review",
+ "value" : "Timer glass material"
}
}
}
@@ -24181,18 +23034,8 @@
"localizations" : {
"pt-BR" : {
"stringUnit" : {
- "state" : "translated",
- "value" : "Modo fluido do temporizador"
- }
- }
- }
- },
- "timer material" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "material do temporizador"
+ "state" : "needs_review",
+ "value" : "Timer liquid mode"
}
}
}
@@ -24204,7 +23047,7 @@
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
- "value" : "Pré-Definições do Temporizador"
+ "value" : "Presets do Temporizador"
}
}
}
@@ -24242,27 +23085,7 @@
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
- "value" : "Luz de fundo do temporizador"
- }
- }
- }
- },
- "timer variant" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "variante do temporizador"
- }
- }
- }
- },
- "timer widget" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "widget do temporizador"
+ "value" : "Tom do temporizador"
}
}
}
@@ -24289,16 +23112,6 @@
}
}
},
- "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,
@@ -24311,16 +23124,6 @@
}
}
},
- "titles" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "títulos"
- }
- }
- }
- },
"Toggle Notch Open:" : {
"localizations" : {
"ar" : {
@@ -24533,16 +23336,6 @@
}
}
},
- "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,
@@ -24562,18 +23355,27 @@
},
"shouldTranslate" : false
},
- "Track Skip" : {
+ "Transform" : {
+ "extractionState" : "stale",
"localizations" : {
- "pt-BR" : {
+ "fr" : {
"stringUnit" : {
"state" : "translated",
- "value" : "Pular Música"
+ "value" : "Transformez"
}
}
}
},
- "trackpad" : {
- "shouldTranslate" : false
+ "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" : {
@@ -24606,6 +23408,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.",
@@ -24733,16 +23538,6 @@
}
}
},
- "ui mode" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "Modo UI"
- }
- }
- }
- },
"UI Mode" : {
"localizations" : {
"fr" : {
@@ -24759,12 +23554,103 @@
}
}
},
- "Unknown" : {
+ "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" : "Desconhecido"
+ "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" : "卸载"
}
}
}
@@ -24969,16 +23855,6 @@
}
}
},
- "Unplugged" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "Desconectado"
- }
- }
- }
- },
"Update interval" : {
"localizations" : {
"pt-BR" : {
@@ -24989,6 +23865,23 @@
}
}
},
+ "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" : {
@@ -25108,9 +24001,6 @@
},
"shouldTranslate" : false
},
- "URL" : {
- "shouldTranslate" : false
- },
"Usage" : {
"comment" : "A label displayed above the CPU usage statistics.",
"isCommentAutoGenerated" : true,
@@ -25147,16 +24037,6 @@
}
}
},
- "Use accent color" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "Usar cor de destaque"
- }
- }
- }
- },
"Use Accent Color" : {
"localizations" : {
"pt-BR" : {
@@ -25167,36 +24047,6 @@
}
}
},
- "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" : {
@@ -25267,8 +24117,8 @@
},
"pt-BR" : {
"stringUnit" : {
- "state" : "translated",
- "value" : "Usar espectrograma no visualizador de música"
+ "state" : "needs_review",
+ "value" : "Use o espectrograma visualizador de música"
}
},
"ru" : {
@@ -25297,16 +24147,6 @@
}
}
},
- "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,
@@ -25381,8 +24221,8 @@
"localizations" : {
"pt-BR" : {
"stringUnit" : {
- "state" : "translated",
- "value" : "Aplica o efeito de desfoque fosco quando o modo vidro está ativado."
+ "state" : "needs_review",
+ "value" : "Usa o tratamento de desfoque fosco enquanto o modo de vidro está ativado."
}
}
}
@@ -25616,15 +24456,8 @@
}
}
},
- "Vertical Bar" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "Barra Vertical"
- }
- }
- }
+ "Vertical offset" : {
+
},
"Vertical:" : {
"extractionState" : "stale",
@@ -25744,9 +24577,6 @@
}
}
},
- "volume" : {
- "shouldTranslate" : false
- },
"Volume" : {
"comment" : "A button that sets the preview to show a volume OSD.",
"isCommentAutoGenerated" : true,
@@ -25787,27 +24617,6 @@
}
}
},
- "W " : {
- "comment" : "Abbreviation for “Disk Write”",
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "G"
- }
- }
- }
- },
- "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,
@@ -25830,26 +24639,6 @@
}
}
},
- "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,
@@ -26133,27 +24922,7 @@
"pt-BR" : {
"stringUnit" : {
"state" : "translated",
- "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."
- }
- }
- }
- },
- "white" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "branco"
- }
- }
- }
- },
- "White" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "Branco"
+ "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."
}
}
}
@@ -26170,25 +24939,19 @@
}
}
},
- "widgets" : {
- "shouldTranslate" : false
- },
- "width" : {
+ "Width:" : {
+ "extractionState" : "stale",
"localizations" : {
- "pt-BR" : {
+ "fr" : {
"stringUnit" : {
"state" : "translated",
- "value" : "largura"
+ "value" : "Largueur :"
}
- }
- }
- },
- "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."
+ "value" : "Largura:"
}
}
}
@@ -26213,16 +24976,6 @@
}
}
},
- "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,
@@ -26241,19 +24994,6 @@
}
}
},
- "Write Only" : {
- "localizations" : {
- "pt-BR" : {
- "stringUnit" : {
- "state" : "translated",
- "value" : "Apenas Escrita"
- }
- }
- }
- },
- "wttr" : {
- "shouldTranslate" : false
- },
"You" : {
"localizations" : {
"fr" : {
@@ -26471,6 +25211,7 @@
}
},
"Your calendar data is only used to show your events and is never shared." : {
+ "extractionState" : "stale",
"localizations" : {
"pt-BR" : {
"stringUnit" : {
@@ -26481,6 +25222,7 @@
}
},
"Your camera is never used without your consent, and nothing is recorded or stored." : {
+ "extractionState" : "stale",
"localizations" : {
"pt-BR" : {
"stringUnit" : {
@@ -26492,18 +25234,7 @@
},
"Your support funds software development learning for students in 9th–12th grade." : {
"comment" : "A footer note explaining the app's funding.",
- "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" : {
- "shouldTranslate" : false
+ "isCommentAutoGenerated" : true
},
"YouTube Music requires this third-party app to be installed: " : {
"localizations" : {
diff --git a/DynamicIsland/components/Live activities/InlineHUD.swift b/DynamicIsland/components/Live activities/InlineHUD.swift
index 5c591d4..079bb7e 100644
--- a/DynamicIsland/components/Live activities/InlineHUD.swift
+++ b/DynamicIsland/components/Live activities/InlineHUD.swift
@@ -21,8 +21,65 @@
*/
import SwiftUI
+import AppKit
+import AVFoundation
import Defaults
+// MARK: - Inline HUD looping .mov icon
+
+private final class LoopingPlayerController {
+ let player: AVQueuePlayer
+ private var looper: AVPlayerLooper?
+
+ init(url: URL) {
+ let item = AVPlayerItem(url: url)
+ self.player = AVQueuePlayer()
+ self.player.isMuted = true
+ self.player.actionAtItemEnd = .none
+ self.looper = AVPlayerLooper(player: self.player, templateItem: item)
+ self.player.play()
+ }
+
+ deinit {
+ player.pause()
+ looper = nil
+ }
+}
+
+private struct LoopingVideoIcon: NSViewRepresentable {
+ let url: URL
+ let size: CGSize
+
+ func makeNSView(context: Context) -> NSView {
+ let view = NSView(frame: NSRect(origin: .zero, size: size))
+ view.wantsLayer = true
+
+ let layer = AVPlayerLayer()
+ layer.videoGravity = .resizeAspect
+ layer.frame = view.bounds
+
+ view.layer?.addSublayer(layer)
+
+ context.coordinator.attach(layer: layer, url: url)
+ return view
+ }
+
+ func updateNSView(_ nsView: NSView, context: Context) {
+ // No-op; the animation loops via AVPlayerLooper.
+ }
+
+ func makeCoordinator() -> Coordinator { Coordinator() }
+
+ final class Coordinator {
+ private var controller: LoopingPlayerController?
+
+ func attach(layer: AVPlayerLayer, url: URL) {
+ controller = LoopingPlayerController(url: url)
+ layer.player = controller?.player
+ }
+ }
+}
+
struct InlineHUD: View {
@EnvironmentObject var vm: DynamicIslandViewModel
@Binding var type: SneakContentType
@@ -39,6 +96,7 @@ struct InlineHUD: View {
@Default(.useCircularBluetoothBatteryIndicator) var useCircularBluetoothBatteryIndicator
@Default(.showBluetoothBatteryPercentageText) var showBluetoothBatteryPercentageText
@Default(.showBluetoothDeviceNameMarquee) var showBluetoothDeviceNameMarquee
+ @Default(.useBluetoothHUD3DIcon) var useBluetoothHUD3DIcon
@Default(.enableMinimalisticUI) var enableMinimalisticUI
@Default(.showCapsLockLabel) var showCapsLockLabel
@Default(.capsLockIndicatorTintMode) var capsLockTintMode
@@ -173,10 +231,17 @@ struct InlineHUD: View {
.contentTransition(.interpolate)
.frame(width: 20, height: 15, alignment: .center)
case .bluetoothAudio:
- Image(systemName: icon.isEmpty ? "bluetooth" : icon)
- .symbolRenderingMode(.hierarchical)
- .contentTransition(.interpolate)
- .frame(width: 20, height: 15, alignment: .center)
+ if useBluetoothHUD3DIcon,
+ let deviceType = bluetoothManager.lastConnectedDevice?.deviceType,
+ let url = Bundle.main.url(forResource: deviceType.inlineHUDAnimationBaseName, withExtension: "mov") {
+ LoopingVideoIcon(url: url, size: CGSize(width: 20, height: 20))
+ .frame(width: 20, height: 20, alignment: .center)
+ } else {
+ Image(systemName: icon.isEmpty ? "bluetooth" : icon)
+ .symbolRenderingMode(.hierarchical)
+ .contentTransition(.interpolate)
+ .frame(width: 20, height: 15, alignment: .center)
+ }
case .capsLock:
Image(systemName: "capslock.fill")
.symbolRenderingMode(.hierarchical)
diff --git a/DynamicIsland/components/LockScreen/LockScreenCalendarEventRow.swift b/DynamicIsland/components/LockScreen/LockScreenCalendarEventRow.swift
new file mode 100644
index 0000000..3f45be2
--- /dev/null
+++ b/DynamicIsland/components/LockScreen/LockScreenCalendarEventRow.swift
@@ -0,0 +1,79 @@
+/*
+ * Atoll (DynamicIsland)
+ * Copyright (C) 2024-2026 Atoll Contributors
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+import SwiftUI
+
+struct LockScreenCalendarEventRow: View {
+ let line: String
+ let isVisible: Bool
+ let renderToken: Int
+ let font: Font
+ let alignment: Alignment
+ let iconName: String
+ let iconRenderingMode: SymbolRenderingMode
+ let iconColors: [Color]
+
+ var body: some View {
+ HStack(alignment: .center, spacing: 6) {
+ calendarIcon
+ .frame(width: 26, height: 26)
+
+ Text(line)
+ .font(font)
+ .lineLimit(1)
+ .truncationMode(.tail)
+ .minimumScaleFactor(0.85)
+ .allowsTightening(true)
+ .layoutPriority(10)
+ }
+ .frame(maxWidth: .infinity, alignment: alignment)
+ .padding(.horizontal, 2)
+ .id(renderToken)
+ .opacity(isVisible ? 1 : 0)
+ .accessibilityHidden(!isVisible)
+ .allowsHitTesting(false)
+ }
+
+ @ViewBuilder
+ private var calendarIcon: some View {
+ let baseImage = Image(systemName: iconName)
+ .font(.system(size: 20, weight: .semibold))
+ .id(iconRenderingModeIdentifier)
+
+ if iconRenderingModeIdentifier.lowercased().contains("palette"), iconColors.count >= 2 {
+ baseImage
+ .symbolRenderingMode(.palette)
+ .foregroundStyle(iconColors[0], iconColors[1])
+ } else if iconColors.count >= 2 {
+ baseImage
+ .symbolRenderingMode(iconRenderingMode)
+ .foregroundStyle(iconColors[0], iconColors[1])
+ } else if iconColors.count == 1 {
+ baseImage
+ .symbolRenderingMode(iconRenderingMode)
+ .foregroundStyle(iconColors[0])
+ } else {
+ baseImage
+ .symbolRenderingMode(iconRenderingMode)
+ }
+ }
+
+ private var iconRenderingModeIdentifier: String {
+ String(describing: iconRenderingMode)
+ }
+}
diff --git a/DynamicIsland/components/LockScreen/LockScreenWeatherWidget.swift b/DynamicIsland/components/LockScreen/LockScreenWeatherWidget.swift
index c335394..5a31718 100644
--- a/DynamicIsland/components/LockScreen/LockScreenWeatherWidget.swift
+++ b/DynamicIsland/components/LockScreen/LockScreenWeatherWidget.swift
@@ -18,14 +18,40 @@
import SwiftUI
import Defaults
+import AppKit
+import CoreGraphics
struct LockScreenWeatherWidget: View {
let snapshot: LockScreenWeatherSnapshot
@ObservedObject private var focusManager = DoNotDisturbManager.shared
+ @ObservedObject private var calendarManager = CalendarManager.shared
@Default(.enableDoNotDisturbDetection) private var focusDetectionEnabled
@Default(.showDoNotDisturbIndicator) private var focusIndicatorEnabled
@Default(.enableLockScreenFocusWidget) private var lockScreenFocusWidgetEnabled
+ @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(.lockScreenWeatherWidgetRowOrder) private var lockScreenWeatherWidgetRowOrder
+ @Default(.lockScreenCalendarSelectionMode) private var lockScreenCalendarSelectionMode
+ @Default(.lockScreenSelectedCalendarIDs) private var lockScreenSelectedCalendarIDs
+ @Default(.lockScreenShowCalendarEventAfterStartEnabled) private var lockScreenShowCalendarEventAfterStartEnabled
+ @Default(.lockScreenReminderChipStyle) private var lockScreenReminderChipStyle
+ @Default(.reminderSneakPeekDuration) private var reminderSneakPeekDuration
+
+ @State private var currentTime = Date()
+ @State private var calendarRowVisible: Bool = false
+ @State private var lastCalendarLine: String = ""
+ @State private var calendarRowRenderToken: Int = 0
+ @State private var widgetWidthRemeasureToken: Int = 0
+ @State private var lastBadgeLogKey: String = ""
+ private var currentCalendarEventID: String {
+ nextCalendarEvent?.id ?? "no_event"
+ }
private let inlinePrimaryFont = Font.system(size: 22, weight: .semibold, design: .rounded)
private let inlineSecondaryFont = Font.system(size: 13, weight: .medium, design: .rounded)
@@ -38,9 +64,422 @@ struct LockScreenWeatherWidget: View {
return formatter
}()
+ // MARK: - Refresh
+ /// Refreshes every 15 seconds (general refresh), and optionally also ticks exactly on minute boundaries
+ /// *only when the screen is locked* and the calendar widget is enabled.
+ private final class LockAwareTicker: ObservableObject {
+ @Published var now: Date = Date()
+
+ private var refreshTimer: Timer?
+ private var minuteTimer: Timer?
+
+ private var lockObserver: NSObjectProtocol?
+ private var unlockObserver: NSObjectProtocol?
+
+ private var isLocked: Bool = false
+ private var minuteAlignedEnabled: Bool = false
+
+ func start() {
+ stop()
+ installLockObservers()
+ refreshLockStateFromSystem()
+ startGeneralRefresh()
+ fireNow()
+ updateMinuteAlignedTimer()
+ }
+
+ func stop() {
+ refreshTimer?.invalidate()
+ refreshTimer = nil
+
+ minuteTimer?.invalidate()
+ minuteTimer = nil
+
+ if let lockObserver { DistributedNotificationCenter.default().removeObserver(lockObserver) }
+ if let unlockObserver { DistributedNotificationCenter.default().removeObserver(unlockObserver) }
+ lockObserver = nil
+ unlockObserver = nil
+ }
+
+ func fireNow() {
+ now = Date()
+ }
+
+ /// Enable/disable the minute-aligned ticker (minute boundary ticks).
+ /// It will only actually run when the screen is locked.
+ func setMinuteAlignedEnabled(_ enabled: Bool) {
+ minuteAlignedEnabled = enabled
+ updateMinuteAlignedTimer()
+ }
+
+ private func startGeneralRefresh() {
+ refreshTimer = Timer.scheduledTimer(withTimeInterval: 15.0, repeats: true) { [weak self] _ in
+ self?.fireNow()
+ }
+ refreshTimer?.tolerance = 0
+ if let refreshTimer {
+ RunLoop.main.add(refreshTimer, forMode: .common)
+ }
+ }
+
+ private func refreshLockStateFromSystem() {
+ if let dict = CGSessionCopyCurrentDictionary() as? [String: Any] {
+ if let locked = dict["CGSSessionScreenIsLocked"] as? Bool {
+ isLocked = locked
+ }
+ }
+ }
+
+ private func installLockObservers() {
+ lockObserver = DistributedNotificationCenter.default().addObserver(
+ forName: NSNotification.Name("com.apple.screenIsLocked"),
+ object: nil,
+ queue: .main
+ ) { [weak self] _ in
+ guard let self else { return }
+ self.isLocked = true
+ self.fireNow()
+ self.updateMinuteAlignedTimer()
+ }
+
+ unlockObserver = DistributedNotificationCenter.default().addObserver(
+ forName: NSNotification.Name("com.apple.screenIsUnlocked"),
+ object: nil,
+ queue: .main
+ ) { [weak self] _ in
+ guard let self else { return }
+ self.isLocked = false
+ self.fireNow()
+ self.updateMinuteAlignedTimer()
+ }
+ }
+
+ private func updateMinuteAlignedTimer() {
+ let shouldRun = isLocked && minuteAlignedEnabled
+ if !shouldRun {
+ minuteTimer?.invalidate()
+ minuteTimer = nil
+ return
+ }
+
+ if minuteTimer != nil {
+ return
+ }
+
+ scheduleNextBoundaryAndRepeat()
+ }
+
+ private func scheduleNextBoundaryAndRepeat() {
+ let current = Date()
+ let calendar = Calendar.current
+
+ var components = calendar.dateComponents([.year, .month, .day, .hour, .minute], from: current)
+ components.second = 0
+ let thisMinute = calendar.date(from: components) ?? current
+ let nextMinute = calendar.date(byAdding: .minute, value: 1, to: thisMinute) ?? current.addingTimeInterval(60)
+
+ let initialDelay = max(0.0, nextMinute.timeIntervalSince(current))
+ minuteTimer = Timer.scheduledTimer(withTimeInterval: initialDelay, repeats: false) { [weak self] _ in
+ guard let self else { return }
+ self.fireNow()
+
+ self.minuteTimer?.invalidate()
+ self.minuteTimer = Timer.scheduledTimer(withTimeInterval: 60.0, repeats: true) { [weak self] _ in
+ self?.fireNow()
+ }
+ self.minuteTimer?.tolerance = 0
+ if let minuteTimer {
+ RunLoop.main.add(minuteTimer, forMode: .common)
+ }
+ }
+ minuteTimer?.tolerance = 0
+ if let minuteTimer {
+ RunLoop.main.add(minuteTimer, forMode: .common)
+ }
+ }
+
+ deinit {
+ stop()
+ }
+ }
+
+ @StateObject private var minuteTicker = LockAwareTicker()
+
+ private enum CalendarLookaheadWindow: String {
+ 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 minutes: Int? {
+ switch self {
+ case .mins15: return 15
+ case .mins30: return 30
+ case .hour1: return 60
+ case .hours3: return 180
+ case .hours6: return 360
+ case .hours12: return 720
+ case .restOfDay, .allTime: return nil
+ }
+ }
+ }
+
+ private enum CalendarAfterStartWindow: String {
+ case min1 = "1m"
+ case mins5 = "5m"
+ case mins10 = "10m"
+ case mins15 = "15m"
+ case mins30 = "30m"
+ case mins45 = "45m"
+ case hour1 = "1h"
+ case hours2 = "2h"
+
+ var minutes: Int {
+ switch self {
+ case .min1: return 1
+ case .mins5: return 5
+ case .mins10: return 10
+ case .mins15: return 15
+ case .mins30: return 30
+ case .mins45: return 45
+ case .hour1: return 60
+ case .hours2: return 120
+ }
+ }
+ }
+
+ private var selectedLookaheadWindow: CalendarLookaheadWindow {
+ let raw = lockScreenCalendarEventLookaheadWindow
+ .trimmingCharacters(in: .whitespacesAndNewlines)
+ .lowercased()
+
+ switch raw {
+ case "all time", "all_time", "alltime":
+ return .allTime
+ case "rest of the day", "rest_of_day", "restofday":
+ return .restOfDay
+ case "15m", "15 mins", "15min", "15mins":
+ return .mins15
+ case "30m", "30 mins", "30min", "30mins":
+ return .mins30
+ case "1h", "1 hour", "1hour":
+ return .hour1
+ case "3h", "3 hours", "3hours":
+ return .hours3
+ case "6h", "6 hours", "6hours":
+ return .hours6
+ case "12h", "12 hours", "12hours":
+ return .hours12
+ default:
+ return CalendarLookaheadWindow(rawValue: lockScreenCalendarEventLookaheadWindow) ?? .hours3
+ }
+ }
+
+ private var selectedAfterStartWindow: CalendarAfterStartWindow {
+ let raw = lockScreenShowCalendarEventAfterStartWindow
+ .trimmingCharacters(in: .whitespacesAndNewlines)
+ .lowercased()
+
+ switch raw {
+ case "1m", "1 min", "1 minute", "1min":
+ return .min1
+ case "5m", "5 min", "5 mins", "5 minutes", "5min":
+ return .mins5
+ case "10m", "10 min", "10 mins", "10 minutes", "10min":
+ return .mins10
+ case "15m", "15 min", "15 mins", "15 minutes", "15min":
+ return .mins15
+ case "30m", "30 min", "30 mins", "30 minutes", "30min":
+ return .mins30
+ case "45m", "45 min", "45 mins", "45 minutes", "45min":
+ return .mins45
+ case "1h", "1 hr", "1 hour", "1hour":
+ return .hour1
+ case "2h", "2 hrs", "2 hours", "2hours", "2hour":
+ return .hours2
+ default:
+ return CalendarAfterStartWindow(rawValue: lockScreenShowCalendarEventAfterStartWindow) ?? .mins5
+ }
+ }
+
+ private func lookaheadEndDate(from now: Date) -> Date? {
+ switch selectedLookaheadWindow {
+ case .allTime:
+ return nil
+ case .restOfDay:
+ let calendar = Calendar.current
+ let startOfToday = calendar.startOfDay(for: now)
+ return calendar.date(byAdding: .day, value: 1, to: startOfToday)
+ default:
+ if let minutes = selectedLookaheadWindow.minutes {
+ return Calendar.current.date(byAdding: .minute, value: minutes, to: now)
+ }
+ return nil
+ }
+ }
+
+ private func isEventEligibleForLookahead(_ event: EventModel, now: Date) -> Bool {
+ if event.isAllDay {
+ return false
+ }
+ if lockScreenShowCalendarEventEntireDuration, event.start <= now, event.end >= now {
+ return true
+ }
+ guard event.start > now else { return false }
+ guard let endDate = lookaheadEndDate(from: now) else {
+ return true
+ }
+ return event.start <= endDate
+ }
+
+ private var lockScreenAllowedCalendarIDs: Set? {
+ guard lockScreenCalendarSelectionMode != "all" else { return nil }
+ return lockScreenSelectedCalendarIDs
+ }
+
+ private func passesLockScreenCalendarFilter(_ event: EventModel) -> Bool {
+ guard let allowed = lockScreenAllowedCalendarIDs else { return true }
+ guard !allowed.isEmpty else { return false }
+ return allowed.contains(event.calendar.id)
+ }
+
+ private var nextCalendarEvent: EventModel? {
+ let now = currentTime
+
+ if lockScreenShowCalendarEventEntireDuration {
+ let candidates = calendarManager.lockScreenEvents
+ .filter { $0.end >= now }
+ .filter(passesLockScreenCalendarFilter)
+ .filter { isEventEligibleForLookahead($0, now: now) }
+ .sorted { $0.start < $1.start }
+ return candidates.first
+ }
+
+ let graceMinutes = lockScreenShowCalendarEventAfterStartEnabled
+ ? selectedAfterStartWindow.minutes
+ : 0
+
+ if graceMinutes > 0 {
+ let graceEndForEvent: (EventModel) -> Date = { event in
+ Calendar.current.date(byAdding: .minute, value: graceMinutes, to: event.start) ?? event.start
+ }
+
+ let activeCandidates = calendarManager.lockScreenEvents
+ .filter { !$0.isAllDay }
+ .filter(passesLockScreenCalendarFilter)
+ .filter { $0.start <= now && $0.end >= now }
+ .filter { now <= graceEndForEvent($0) }
+ .sorted { $0.start < $1.start }
+
+ if let active = activeCandidates.first {
+ return active
+ }
+ }
+
+ let upcoming = calendarManager.lockScreenEvents
+ .filter { $0.start > now }
+ .filter(passesLockScreenCalendarFilter)
+ .filter { isEventEligibleForLookahead($0, now: now) }
+ .sorted { $0.start < $1.start }
+
+ return upcoming.first
+ }
+
+ private var shouldShowCalendarRow: Bool {
+ lockScreenShowCalendarEvent && nextCalendarEvent != nil
+ }
+
+ private var shouldShowFocusInCalendarSlot: Bool {
+ shouldShowFocusWidget && !shouldShowCalendarRow
+ }
+
+ private var shouldCombineFocusAndCalendar: Bool {
+ shouldShowFocusWidget && shouldShowCalendarRow
+ }
+
+ private enum RowKind {
+ case weather
+ case focus
+ case calendar
+ }
+
+ private var orderedRowKinds: [RowKind] {
+ switch lockScreenWeatherWidgetRowOrder {
+ case "weather_focus_calendar":
+ return [.weather, .focus, .calendar]
+ case "weather_calendar_focus":
+ return [.weather, .calendar, .focus]
+ case "focus_weather_calendar":
+ return [.focus, .weather, .calendar]
+ case "focus_calendar_weather":
+ return [.focus, .calendar, .weather]
+ case "calendar_weather_focus":
+ return [.calendar, .weather, .focus]
+ case "calendar_focus_weather":
+ return [.calendar, .focus, .weather]
+ default:
+ return [.weather, .calendar, .focus]
+ }
+ }
+
+ private var enabledRowKinds: [RowKind] {
+ var enabled: Set = [.weather]
+ if lockScreenShowCalendarEvent { enabled.insert(.calendar) }
+ if shouldShowFocusWidget { enabled.insert(.focus) }
+ if shouldShowFocusInCalendarSlot { enabled.insert(.calendar); enabled.remove(.focus) }
+ if shouldCombineFocusAndCalendar { enabled.remove(.focus) }
+ return orderedRowKinds.filter { enabled.contains($0) }
+ }
+
+ private var fullRowOrder: [RowKind] {
+ orderedRowKinds
+ }
+
+ private func isRowActive(_ kind: RowKind) -> Bool {
+ switch kind {
+ case .weather:
+ return true
+ case .focus:
+ return shouldShowFocusWidget
+ case .calendar:
+ return nextCalendarEvent != nil
+ }
+ }
+
+ private var shouldCollapseGap: Bool {
+ fullRowOrder.count == 3
+ }
+
+ private var collapseDistance: CGFloat {
+ 26 + focusWidgetSpacing
+ }
+
+ private var collapseOffsetForBottomRow: CGFloat {
+ guard shouldCollapseGap else { return 0 }
+ let middleKind = fullRowOrder[1]
+ let bottomKind = fullRowOrder[2]
+
+ let middleActive = isRowActive(middleKind)
+ let bottomActive = isRowActive(bottomKind)
+
+ return (!middleActive && bottomActive) ? -collapseDistance : 0
+ }
+
private var isInline: Bool { snapshot.widgetStyle == .inline }
private var stackAlignment: VerticalAlignment { isInline ? .firstTextBaseline : .top }
private var stackSpacing: CGFloat { isInline ? 14 : 22 }
+ private var mainRowAlignment: Alignment {
+ if isInline {
+ return shouldCombineFocusAndCalendar ? .center : .leading
+ }
+ return .center
+ }
+ private var secondaryRowAlignment: Alignment { .center }
+ private var focusRowAlignment: Alignment { .center }
private var gaugeDiameter: CGFloat { 64 }
private var topPadding: CGFloat { isInline ? 6 : 22 }
private var bottomPadding: CGFloat { isInline ? 6 : 10 }
@@ -51,11 +490,13 @@ struct LockScreenWeatherWidget: View {
var body: some View {
VStack(alignment: .leading, spacing: focusWidgetSpacing) {
- if shouldShowFocusWidget {
- focusWidget
+ ForEach(Array(enabledRowKinds.enumerated()), id: \.offset) { index, kind in
+ rowView(for: kind)
+ .offset(y: offsetForRow(index: index))
+ .animation(.easeInOut(duration: 0.3), value: collapseOffsetForBottomRow)
}
- mainWidgetRow
}
+ .id(widgetWidthRemeasureToken)
.frame(maxWidth: .infinity, alignment: .leading)
.foregroundStyle(Color.white.opacity(0.65))
.padding(.horizontal, 10)
@@ -63,10 +504,125 @@ struct LockScreenWeatherWidget: View {
.padding(.bottom, bottomPadding)
.background(Color.clear)
.shadow(color: .black.opacity(0.35), radius: 8, x: 0, y: 3)
+ .onReceive(minuteTicker.$now) { currentTime = $0 }
+ .onAppear {
+ minuteTicker.start()
+ minuteTicker.setMinuteAlignedEnabled(lockScreenShowCalendarEvent)
+ currentTime = Date()
+ calendarRowVisible = shouldShowCalendarRow
+
+ Task {
+ await calendarManager.checkCalendarAuthorization()
+ await calendarManager.checkReminderAuthorization()
+ await calendarManager.updateLockScreenEvents(force: true)
+ }
+
+ if let event = nextCalendarEvent {
+ lastCalendarLine = eventLineText(for: event)
+ logBadgeColor(event: event, reason: "on-appear")
+ }
+ }
+ .onChange(of: lockScreenShowCalendarEvent) { _, enabled in
+ minuteTicker.setMinuteAlignedEnabled(enabled)
+ }
+ .onChange(of: lockScreenCalendarEventLookaheadWindow) { _, _ in
+ Task { await calendarManager.updateLockScreenEvents(force: true) }
+ }
+ .onChange(of: lockScreenCalendarSelectionMode) { _, _ in
+ Task { await calendarManager.updateLockScreenEvents(force: true) }
+ }
+ .onChange(of: lockScreenSelectedCalendarIDs) { _, _ in
+ Task { await calendarManager.updateLockScreenEvents(force: true) }
+ }
+ .onDisappear { minuteTicker.stop() }
+ .onChange(of: currentCalendarEventID) { _, _ in
+ calendarRowRenderToken &+= 1
+ if nextCalendarEvent != nil {
+ widgetWidthRemeasureToken &+= 1
+ }
+
+ DispatchQueue.main.asyncAfter(deadline: .now() + 0.20) {
+ calendarRowRenderToken &+= 1
+ if nextCalendarEvent != nil {
+ widgetWidthRemeasureToken &+= 1
+ }
+ }
+ }
+ .onChange(of: currentCalendarEventID) { _, _ in
+ if let event = nextCalendarEvent {
+ let newLine = eventLineText(for: event)
+ if !newLine.isEmpty {
+ lastCalendarLine = newLine
+ }
+ logBadgeColor(event: event, reason: "event-change")
+ }
+ }
+ .onChange(of: lockScreenReminderChipStyle) { _, _ in
+ if let event = nextCalendarEvent {
+ logBadgeColor(event: event, reason: "chip-style-change")
+ }
+ }
+ .onChange(of: shouldShowCalendarRow) { _, newValue in
+ withAnimation(.easeInOut(duration: 0.25)) {
+ calendarRowVisible = newValue
+ }
+ }
.accessibilityElement(children: .ignore)
.accessibilityLabel(accessibilityLabel)
}
+ private func offsetForRow(index: Int) -> CGFloat {
+ if enabledRowKinds.count != 3 { return 0 }
+ if index == 2 {
+ return collapseOffsetForBottomRow
+ }
+ return 0
+ }
+
+ @ViewBuilder
+ private func rowView(for kind: RowKind) -> some View {
+ switch kind {
+ case .weather:
+ mainWidgetRow
+ case .calendar:
+ if shouldCombineFocusAndCalendar {
+ combinedFocusCalendarRow
+ } else if shouldShowFocusInCalendarSlot {
+ focusRowInCalendarSlot
+ } else {
+ nextEventRow
+ }
+ case .focus:
+ if shouldCombineFocusAndCalendar {
+ EmptyView()
+ } else {
+ focusWidget
+ .opacity(shouldShowFocusWidget ? 1 : 0)
+ .accessibilityHidden(!shouldShowFocusWidget)
+ .allowsHitTesting(false)
+ }
+ }
+ }
+
+ private var focusRowInCalendarSlot: some View {
+ HStack(alignment: .center, spacing: 8) {
+ focusIcon
+ .font(.system(size: 20, weight: .semibold))
+ .frame(width: 26, height: 26)
+
+ Text(focusDisplayName)
+ .font(inlinePrimaryFont)
+ .lineLimit(1)
+ .minimumScaleFactor(0.85)
+ .allowsTightening(true)
+ }
+ .frame(maxWidth: .infinity, alignment: secondaryRowAlignment)
+ .padding(.horizontal, 2)
+ .opacity(shouldShowFocusWidget ? 1 : 0)
+ .accessibilityLabel("Focus active: \(focusDisplayName)")
+ .allowsHitTesting(false)
+ }
+
private var mainWidgetRow: some View {
HStack(alignment: stackAlignment, spacing: stackSpacing) {
if let charging = snapshot.charging {
@@ -95,6 +651,214 @@ struct LockScreenWeatherWidget: View {
locationSegment
}
}
+ .frame(maxWidth: .infinity, alignment: mainRowAlignment)
+ }
+
+ private var nextEventRow: some View {
+ let event = nextCalendarEvent
+ let line = shouldShowCalendarRow ? eventLineText(for: event) : lastCalendarLine
+ let iconConfig = calendarRowIconConfig(for: event)
+
+ return LockScreenCalendarEventRow(
+ line: line,
+ isVisible: calendarRowVisible,
+ renderToken: calendarRowRenderToken,
+ font: inlinePrimaryFont,
+ alignment: secondaryRowAlignment,
+ iconName: iconConfig.name,
+ iconRenderingMode: iconConfig.renderingMode,
+ iconColors: iconConfig.colors
+ )
+ }
+
+ private var combinedFocusCalendarRow: some View {
+ let event = nextCalendarEvent
+ let line = shouldShowCalendarRow ? eventLineText(for: event) : lastCalendarLine
+ let iconConfig = calendarRowIconConfig(for: event)
+
+ return HStack(alignment: .center, spacing: 10) {
+ HStack(alignment: .center, spacing: 6) {
+ calendarIconView(iconConfig)
+ .frame(width: 26, height: 26)
+
+ Text(line)
+ .font(inlinePrimaryFont)
+ .lineLimit(1)
+ .minimumScaleFactor(0.85)
+ .allowsTightening(true)
+ }
+ .layoutPriority(2)
+
+ Text("•")
+ .font(inlinePrimaryFont)
+ .foregroundStyle(secondaryLabelColor)
+ .accessibilityHidden(true)
+
+ HStack(alignment: .center, spacing: 8) {
+ focusIcon
+ .font(.system(size: 20, weight: .semibold))
+ .frame(width: 26, height: 26)
+
+ Text(focusDisplayName)
+ .font(inlinePrimaryFont)
+ .lineLimit(1)
+ .minimumScaleFactor(0.85)
+ .allowsTightening(true)
+ }
+ .layoutPriority(1)
+ }
+ .frame(maxWidth: .infinity, alignment: .center)
+ .padding(.horizontal, 2)
+ .id(calendarRowRenderToken)
+ .opacity(shouldShowFocusWidget && shouldShowCalendarRow ? 1 : 0)
+ .accessibilityLabel("\(line). Focus active: \(focusDisplayName)")
+ .allowsHitTesting(false)
+ }
+
+ @ViewBuilder
+ private func calendarIconView(_ iconConfig: (name: String, renderingMode: SymbolRenderingMode, colors: [Color])) -> some View {
+ let image = Image(systemName: iconConfig.name)
+ .font(.system(size: 20, weight: .semibold))
+
+ let isPalette = String(describing: iconConfig.renderingMode)
+ .lowercased()
+ .contains("palette")
+
+ if isPalette, iconConfig.colors.count >= 2 {
+ image
+ .symbolRenderingMode(.palette)
+ .foregroundStyle(iconConfig.colors[0], iconConfig.colors[1])
+ } else if iconConfig.colors.count >= 2 {
+ image
+ .symbolRenderingMode(iconConfig.renderingMode)
+ .foregroundStyle(iconConfig.colors[0], iconConfig.colors[1])
+ } else if iconConfig.colors.count == 1 {
+ image
+ .symbolRenderingMode(iconConfig.renderingMode)
+ .foregroundStyle(iconConfig.colors[0])
+ } else {
+ image
+ .symbolRenderingMode(iconConfig.renderingMode)
+ }
+ }
+
+ private func calendarRowIconConfig(for event: EventModel?) -> (name: String, renderingMode: SymbolRenderingMode, colors: [Color]) {
+ guard let event else {
+ return (name: "calendar.badge", renderingMode: .hierarchical, colors: [Color.white.opacity(0.9)])
+ }
+
+ let badgeColor = reminderChipColor(for: event)
+ logBadgeColor(event: event, reason: "icon-config")
+
+ if event.type.isReminder || event.calendar.isReminder {
+ if isReminderCritical(event) {
+ return (name: "exclamationmark.triangle.fill", renderingMode: .multicolor, colors: [])
+ }
+ return (
+ name: "calendar.badge",
+ renderingMode: .palette,
+ colors: [badgeColor, Color.white.opacity(0.6)]
+ )
+ }
+
+ let eventBadgeColor = eventAccentColor(for: event)
+ return (
+ name: "calendar.badge",
+ renderingMode: .palette,
+ colors: [eventBadgeColor, Color.white.opacity(0.6)]
+ )
+ }
+
+ private func logBadgeColor(event: EventModel, reason: String) {
+ let key = "\(event.id)|\(lockScreenReminderChipStyle.rawValue)|\(isReminderCritical(event))|\(reason)"
+ lastBadgeLogKey = key
+
+ let color = reminderChipColor(for: event)
+ let nsColor = NSColor(color).usingColorSpace(.deviceRGB)
+ if let nsColor {
+ var red: CGFloat = 0
+ var green: CGFloat = 0
+ var blue: CGFloat = 0
+ var alpha: CGFloat = 0
+ nsColor.getRed(&red, green: &green, blue: &blue, alpha: &alpha)
+ let hex = String(format: "#%02X%02X%02X", Int(red * 255), Int(green * 255), Int(blue * 255))
+ let alphaText = String(format: "%.2f", alpha)
+ NSLog("LockScreenCalendarRow badge color: %@ alpha=%@ style=%@ critical=%@ reason=%@", hex, alphaText, lockScreenReminderChipStyle.rawValue, String(isReminderCritical(event)), reason)
+ } else {
+ NSLog("LockScreenCalendarRow badge color: style=%@ critical=%@ reason=%@", lockScreenReminderChipStyle.rawValue, String(isReminderCritical(event)), reason)
+ }
+ }
+
+ private func reminderChipColor(for event: EventModel) -> Color {
+ if isReminderCritical(event) { return .red }
+ switch lockScreenReminderChipStyle {
+ case .monochrome:
+ return Color.white.opacity(0.85)
+ case .eventColor:
+ let color = reminderAccentColor(for: event)
+ return color.ensureMinimumBrightness(factor: 0.7)
+ }
+ }
+
+ private func reminderAccentColor(for event: EventModel) -> Color {
+ Color(event.calendar.color)
+ }
+
+ private func eventAccentColor(for event: EventModel) -> Color {
+ Color(event.calendar.color).ensureMinimumBrightness(factor: 0.7)
+ }
+
+ private func isReminderCritical(_ event: EventModel) -> Bool {
+ guard event.type.isReminder || event.calendar.isReminder else { return false }
+ let window = TimeInterval(reminderSneakPeekDuration)
+ guard window > 0 else { return false }
+ let remaining = event.start.timeIntervalSince(currentTime)
+ return remaining > 0 && remaining <= window
+ }
+
+ private func eventLineText(for event: EventModel?) -> String {
+ guard let event else { return "" }
+ let now = currentTime
+
+ if event.isAllDay {
+ return "All day • \(event.title)"
+ }
+
+ let timeString = event.start.formatted(date: .omitted, time: .shortened)
+
+ if event.start <= now && event.end >= now {
+ let leading = lockScreenShowCalendarStartTimeAfterBegins ? "\(timeString) • " : ""
+ let suffix: String
+ if lockScreenShowCalendarTimeRemaining {
+ let secondsLeft = event.end.timeIntervalSince(now)
+ let minutesLeft = max(0, Int(ceil(secondsLeft / 60.0)))
+ suffix = " • \(countdownText(fromMinutes: minutesLeft)) left"
+ } else {
+ suffix = ""
+ }
+ return "\(leading)\(event.title)\(suffix)"
+ }
+
+ guard lockScreenShowCalendarCountdown else {
+ return "\(timeString) • \(event.title)"
+ }
+
+ let secondsUntilStart = event.start.timeIntervalSince(now)
+ let totalMinutes = max(0, Int(ceil(secondsUntilStart / 60.0)))
+ return "\(timeString) • \(event.title) • in \(countdownText(fromMinutes: totalMinutes))"
+ }
+
+ private func countdownText(fromMinutes minutes: Int) -> String {
+ if minutes < 60 {
+ return "\(minutes)m"
+ }
+
+ let hours = minutes / 60
+ let mins = minutes % 60
+ if mins == 0 {
+ return "\(hours)h"
+ }
+ return "\(hours)h \(mins)m"
}
private var sunriseTimeText: String? {
@@ -399,7 +1163,7 @@ struct LockScreenWeatherWidget: View {
}
private var focusWidgetSpacing: CGFloat {
- guard shouldShowFocusWidget else { return 0 }
+ guard lockScreenShowCalendarEvent || lockScreenFocusWidgetEnabled else { return 0 }
return isInline ? 14 : 20
}
@@ -447,8 +1211,7 @@ struct LockScreenWeatherWidget: View {
.lineLimit(1)
.minimumScaleFactor(0.85)
}
- .frame(maxWidth: .infinity, alignment: .center)
- .multilineTextAlignment(.center)
+ .frame(maxWidth: .infinity, alignment: focusRowAlignment)
.padding(.horizontal, 2)
.accessibilityLabel("Focus active: \(focusDisplayName)")
}
@@ -670,6 +1433,13 @@ struct LockScreenWeatherWidget: View {
components.append("Focus active: \(focusDisplayName)")
}
+ if lockScreenShowCalendarEvent, let event = nextCalendarEvent {
+ let line = eventLineText(for: event)
+ if !line.isEmpty {
+ components.append("Calendar: \(line)")
+ }
+ }
+
return components.joined(separator: ". ")
}
diff --git a/DynamicIsland/components/Notch/MinimalisticMusicPlayerView.swift b/DynamicIsland/components/Notch/MinimalisticMusicPlayerView.swift
index f5cf76a..6fa3009 100644
--- a/DynamicIsland/components/Notch/MinimalisticMusicPlayerView.swift
+++ b/DynamicIsland/components/Notch/MinimalisticMusicPlayerView.swift
@@ -35,6 +35,9 @@ struct MinimalisticMusicPlayerView: View {
@ObservedObject private var reminderManager = ReminderLiveActivityManager.shared
@ObservedObject private var timerManager = TimerManager.shared
@ObservedObject private var coordinator = DynamicIslandViewCoordinator.shared
+ @State private var hudValue: Double = 0
+ @State private var hudDragging: Bool = false
+ @State private var hudLastDragged: Date = .distantPast
@Default(.enableReminderLiveActivity) private var enableReminderLiveActivity
@Default(.enableLyrics) private var enableLyrics
@Default(.timerPresets) private var timerPresets
@@ -85,8 +88,13 @@ struct MinimalisticMusicPlayerView: View {
.padding(.top, 6)
// Compact playback controls
- playbackControls
- .padding(.top, 4)
+ if shouldShowControlHUDRow {
+ controlHUDRow
+ .padding(.top, 4)
+ } else {
+ playbackControls
+ .padding(.top, 4)
+ }
if enableLyrics {
lyricsView
@@ -672,6 +680,122 @@ private struct MinimalisticReminderDetailsView: View {
.frame(maxWidth: .infinity, alignment: .center)
.padding(.top, 2)
}
+
+ private var shouldShowControlHUDRow: Bool {
+ guard vm.notchState == .open else { return false }
+ guard coordinator.sneakPeek.show else { return false }
+ guard Defaults[.enableSystemHUD] else { return false }
+ guard !Defaults[.enableCustomOSD] && !Defaults[.enableVerticalHUD] && !Defaults[.enableCircularHUD] else { return false }
+
+ switch coordinator.sneakPeek.type {
+ case .volume:
+ return Defaults[.enableVolumeHUD]
+ case .brightness:
+ return Defaults[.enableBrightnessHUD]
+ case .backlight:
+ return Defaults[.enableKeyboardBacklightHUD]
+ default:
+ return false
+ }
+ }
+
+ private var controlHUDRow: some View {
+ HStack(alignment: .center, spacing: 10) {
+ if !controlLeftIconName.isEmpty {
+ Image(systemName: controlLeftIconName)
+ .font(.system(size: 16, weight: .semibold))
+ .frame(width: 22, height: 22, alignment: .center)
+ }
+
+ controlHUDSlider
+
+ if !controlRightIconName.isEmpty {
+ Image(systemName: controlRightIconName)
+ .font(.system(size: 16, weight: .semibold))
+ .frame(width: 22, height: 22, alignment: .center)
+ }
+ }
+ .frame(maxWidth: .infinity, alignment: .center)
+ .frame(height: 60, alignment: .center)
+ .onAppear { syncHUDValueIfNeeded(force: true) }
+ .onChange(of: coordinator.sneakPeek.value) { _, _ in
+ syncHUDValueIfNeeded(force: false)
+ }
+ }
+
+ private var controlHUDSlider: some View {
+ VStack(spacing: 0) {
+ Spacer(minLength: 0)
+ CustomSlider(
+ value: Binding(
+ get: { hudValue },
+ set: { newValue in
+ hudValue = newValue
+ updateControlHUDValue(newValue)
+ }
+ ),
+ range: 0...1,
+ color: .white,
+ dragging: $hudDragging,
+ lastDragged: $hudLastDragged,
+ onValueChange: { newValue in
+ updateControlHUDValue(newValue)
+ },
+ thumbSize: 10,
+ restingTrackHeight: 4,
+ draggingTrackHeight: 7
+ )
+ .frame(height: 7)
+ Spacer(minLength: 0)
+ }
+ .frame(height: 22)
+ }
+
+ private func syncHUDValueIfNeeded(force: Bool) {
+ guard shouldShowControlHUDRow else { return }
+ guard force || !hudDragging else { return }
+ hudValue = Double(coordinator.sneakPeek.value)
+ }
+
+ private func updateControlHUDValue(_ newValue: Double) {
+ let clamped = max(0, min(1, newValue))
+ switch coordinator.sneakPeek.type {
+ case .volume:
+ SystemVolumeController.shared.setVolume(Float(clamped))
+ case .brightness:
+ SystemBrightnessController.shared.setBrightness(Float(clamped))
+ case .backlight:
+ SystemKeyboardBacklightController.shared.setLevel(Float(clamped))
+ default:
+ break
+ }
+ }
+
+ private var controlLeftIconName: String {
+ switch coordinator.sneakPeek.type {
+ case .volume:
+ return SystemVolumeController.shared.isMuted ? "speaker.slash" : "speaker.wave.1"
+ case .brightness:
+ return "sun.min.fill"
+ case .backlight:
+ return "light.min"
+ default:
+ return ""
+ }
+ }
+
+ private var controlRightIconName: String {
+ switch coordinator.sneakPeek.type {
+ case .volume:
+ return SystemVolumeController.shared.isMuted ? "" : "speaker.wave.3"
+ case .brightness:
+ return "sun.max.fill"
+ case .backlight:
+ return "light.max"
+ default:
+ return ""
+ }
+ }
private var playPauseButton: some View {
MinimalisticSquircircleButton(
diff --git a/DynamicIsland/components/Notch/NotchHomeView.swift b/DynamicIsland/components/Notch/NotchHomeView.swift
index 9cc8f9b..7e68b84 100644
--- a/DynamicIsland/components/Notch/NotchHomeView.swift
+++ b/DynamicIsland/components/Notch/NotchHomeView.swift
@@ -129,10 +129,15 @@ struct AlbumArtView: View {
}
struct MusicControlsView: View {
+ @EnvironmentObject var vm: DynamicIslandViewModel
@ObservedObject var musicManager = MusicManager.shared
+ @ObservedObject var coordinator = DynamicIslandViewCoordinator.shared
@State private var sliderValue: Double = 0
@State private var dragging: Bool = false
@State private var lastDragged: Date = .distantPast
+ @State private var hudValue: Double = 0
+ @State private var hudDragging: Bool = false
+ @State private var hudLastDragged: Date = .distantPast
@Default(.showShuffleAndRepeat) private var showCustomControls
@Default(.musicControlSlots) private var slotConfig
@Default(.showMediaOutputControl) private var showMediaOutputControl
@@ -144,7 +149,11 @@ struct MusicControlsView: View {
var body: some View {
VStack(alignment: .leading) {
songInfoAndSlider
- playbackControls
+ if shouldShowControlHUDRow {
+ controlHUDRow
+ } else {
+ playbackControls
+ }
}
.buttonStyle(PlainButtonStyle())
.frame(maxWidth: .infinity, alignment: .leading)
@@ -238,6 +247,121 @@ struct MusicControlsView: View {
.frame(maxWidth: .infinity, alignment: .center)
}
+ private var shouldShowControlHUDRow: Bool {
+ guard vm.notchState == .open else { return false }
+ guard coordinator.sneakPeek.show else { return false }
+ guard Defaults[.enableSystemHUD] else { return false }
+ guard !Defaults[.enableCustomOSD] && !Defaults[.enableVerticalHUD] && !Defaults[.enableCircularHUD] else { return false }
+
+ switch coordinator.sneakPeek.type {
+ case .volume:
+ return Defaults[.enableVolumeHUD]
+ case .brightness:
+ return Defaults[.enableBrightnessHUD]
+ case .backlight:
+ return Defaults[.enableKeyboardBacklightHUD]
+ default:
+ return false
+ }
+ }
+
+ private var controlHUDRow: some View {
+ HStack(alignment: .center, spacing: 10) {
+ if !controlLeftIconName.isEmpty {
+ Image(systemName: controlLeftIconName)
+ .font(.system(size: 16, weight: .semibold))
+ .frame(width: 22, height: 22, alignment: .center)
+ }
+
+ controlHUDSlider
+
+ if !controlRightIconName.isEmpty {
+ Image(systemName: controlRightIconName)
+ .font(.system(size: 16, weight: .semibold))
+ .frame(width: 22, height: 22, alignment: .center)
+ }
+ }
+ .frame(maxWidth: .infinity, alignment: .center)
+ .onAppear { syncHUDValueIfNeeded(force: true) }
+ .onChange(of: coordinator.sneakPeek.value) { _, _ in
+ syncHUDValueIfNeeded(force: false)
+ }
+ }
+
+ private var controlHUDSlider: some View {
+ VStack(spacing: 0) {
+ Spacer(minLength: 0)
+ CustomSlider(
+ value: Binding(
+ get: { hudValue },
+ set: { newValue in
+ hudValue = newValue
+ updateControlHUDValue(newValue)
+ }
+ ),
+ range: 0...1,
+ color: .white,
+ dragging: $hudDragging,
+ lastDragged: $hudLastDragged,
+ onValueChange: { newValue in
+ updateControlHUDValue(newValue)
+ },
+ thumbSize: 10,
+ restingTrackHeight: 4,
+ draggingTrackHeight: 7
+ )
+ .frame(height: 7)
+ Spacer(minLength: 0)
+ }
+ .frame(height: 22)
+ }
+
+ private func syncHUDValueIfNeeded(force: Bool) {
+ guard shouldShowControlHUDRow else { return }
+ guard force || !hudDragging else { return }
+ hudValue = Double(coordinator.sneakPeek.value)
+ }
+
+ private func updateControlHUDValue(_ newValue: Double) {
+ let clamped = max(0, min(1, newValue))
+ switch coordinator.sneakPeek.type {
+ case .volume:
+ SystemVolumeController.shared.setVolume(Float(clamped))
+ case .brightness:
+ SystemBrightnessController.shared.setBrightness(Float(clamped))
+ case .backlight:
+ SystemKeyboardBacklightController.shared.setLevel(Float(clamped))
+ default:
+ break
+ }
+ }
+
+ private var controlLeftIconName: String {
+ switch coordinator.sneakPeek.type {
+ case .volume:
+ return SystemVolumeController.shared.isMuted ? "speaker.slash" : "speaker.wave.1"
+ case .brightness:
+ return "sun.min.fill"
+ case .backlight:
+ return "light.min"
+ default:
+ return ""
+ }
+ }
+
+ private var controlRightIconName: String {
+ switch coordinator.sneakPeek.type {
+ case .volume:
+ return SystemVolumeController.shared.isMuted ? "" : "speaker.wave.3"
+ case .brightness:
+ return "sun.max.fill"
+ case .backlight:
+ return "light.max"
+ default:
+ return ""
+ }
+ }
+
private var brandAccentColor: Color {
musicManager.brandAccentColor
}
diff --git a/DynamicIsland/managers/BluetoothAudioManager.swift b/DynamicIsland/managers/BluetoothAudioManager.swift
index a7d3d30..869abf6 100644
--- a/DynamicIsland/managers/BluetoothAudioManager.swift
+++ b/DynamicIsland/managers/BluetoothAudioManager.swift
@@ -43,6 +43,25 @@ class BluetoothAudioManager: ObservableObject {
private let batteryReader = BluetoothLEBatteryReader()
private var isLiveBatteryRefreshInFlight = false
+ private let appleVendorID: UInt16 = 0x05AC
+ private let devicePIDMap: [UInt16: BluetoothAudioDeviceType] = [
+ 0x2002: .airpods, // Gen 1 AirPods
+ 0x200F: .airpods, // Gen 2 AirPods
+ 0x2013: .airpodsGen3, // Gen 3 AirPods
+ 0x2019: .airpodsGen4, // Gen 4 AirPods
+ 0x201B: .airpodsGen4, // Gen 4 AirPods ANC
+ 0x200A: .airpodsMax, // AirPods Max Lightning
+ 0x201F: .airpodsMax, // AirPods Max USB-C
+ 0x200E: .airpodsPro, // AirPods Pro Gen 1
+ 0x2014: .airpodsPro, // AirPods Pro Gen 2 Lightning
+ 0x2024: .airpodsPro, // AirPods Pro Gen 2 USB-C
+ 0x2027: .airpodsPro3, // AirPods Pro Gen 3
+ 0x2017: .beatsstudio, // Beats Studio Pro
+ 0x2009: .beatsstudio, // Beats Studio 3
+ 0x2006: .beatssolo, // Beats Solo 3
+ 0x200C: .beatssolo // Beats Solo Pro
+ ]
+
@Published private(set) var batteryStatus: [String: String] = [:]
private var batteryStatusByAddress: [String: Int] = [:]
@@ -396,24 +415,247 @@ class BluetoothAudioManager: ObservableObject {
logMissingBatteryInfo(for: device)
return nil
}
+
+ // MARK: - PID-based device detection
+
+ /// Extract a UInt16 from common payload formats (Int/NSNumber/String including hex like "0x201B").
+ private func extractUInt16(from payload: [String: Any], keys: [String]) -> UInt16? {
+ for key in keys {
+ guard let raw = payload[key] else { continue }
+
+ if let number = raw as? NSNumber {
+ return UInt16(truncatingIfNeeded: number.uint16Value)
+ }
+ if let intValue = raw as? Int {
+ return UInt16(truncatingIfNeeded: intValue)
+ }
+ if let string = raw as? String {
+ let trimmed = string.trimmingCharacters(in: .whitespacesAndNewlines).lowercased()
+ if trimmed.hasPrefix("0x") {
+ let hex = trimmed.dropFirst(2)
+ if let value = UInt16(hex, radix: 16) { return value }
+ } else if let value = UInt16(trimmed, radix: 10) {
+ return value
+ }
+ }
+ }
+ return nil
+ }
+
+ /// Recursively search nested dictionaries/arrays for the first UInt16 value whose key matches `predicate`.
+ private func deepSearchUInt16(in value: Any, predicate: (String) -> Bool) -> UInt16? {
+ if let dict = value as? [String: Any] {
+ for (key, entry) in dict {
+ if predicate(key) {
+ if let found = extractUInt16(from: dict, keys: [key]) {
+ return found
+ }
+ if let number = entry as? NSNumber { return UInt16(truncatingIfNeeded: number.uint16Value) }
+ if let intValue = entry as? Int { return UInt16(truncatingIfNeeded: intValue) }
+ if let string = entry as? String {
+ let trimmed = string.trimmingCharacters(in: .whitespacesAndNewlines).lowercased()
+ if trimmed.hasPrefix("0x"), let value = UInt16(trimmed.dropFirst(2), radix: 16) { return value }
+ if let value = UInt16(trimmed, radix: 10) { return value }
+ }
+ }
+ }
+
+ for entry in dict.values {
+ if let found = deepSearchUInt16(in: entry, predicate: predicate) { return found }
+ }
+ return nil
+ }
+
+ if let array = value as? [Any] {
+ for entry in array {
+ if let found = deepSearchUInt16(in: entry, predicate: predicate) { return found }
+ }
+ return nil
+ }
+
+ return nil
+ }
+
+ /// Fallback: attempt to get VendorID/ProductID from system_profiler SPBluetoothDataType JSON.
+ private func vendorProductIDsFromSystemProfiler(forNormalizedAddress target: String) -> (vendor: UInt16, product: UInt16)? {
+ guard !target.isEmpty else { return nil }
+ guard let root = systemProfilerBluetoothDictionary() else { return nil }
+ guard let deviceConnected = root["device_connected"] as? [Any] else { return nil }
+
+ func pidFromPayload(_ payload: [String: Any]) -> UInt16? {
+ if let raw = payload["device_productID"] as? String {
+ let trimmed = raw.trimmingCharacters(in: .whitespacesAndNewlines).lowercased()
+ if trimmed.hasPrefix("0x"), let value = UInt16(trimmed.dropFirst(2), radix: 16) { return value }
+ if let value = UInt16(trimmed, radix: 16) { return value }
+ }
+ let productKeys = ["device_productID", "ProductID", "product_id", "productID", "DeviceProductID", "ProductId", "Product ID"]
+ return extractUInt16(from: payload, keys: productKeys)
+ ?? deepSearchUInt16(in: payload) { $0.lowercased().contains("productid") }
+ }
+
+ func vidFromPayload(_ payload: [String: Any]) -> UInt16? {
+ let vendorKeys = ["device_vendorID", "VendorID", "vendor_id", "vendorID", "DeviceVendorID", "VendorId", "Vendor ID"]
+ return extractUInt16(from: payload, keys: vendorKeys)
+ ?? deepSearchUInt16(in: payload) { $0.lowercased().contains("vendorid") }
+ }
+
+ for item in deviceConnected {
+ guard let dict = item as? [String: Any],
+ let nameKey = dict.keys.first,
+ let infoAny = dict[nameKey],
+ let payload = infoAny as? [String: Any] else {
+ continue
+ }
+
+ if let address = payload["device_address"] as? String {
+ if normalizeBluetoothIdentifier(address) != target { continue }
+ } else {
+ let candidates = profilerAddressCandidates(from: payload).map(normalizeBluetoothIdentifier)
+ if !candidates.contains(target) { continue }
+ }
+
+ if let pid = pidFromPayload(payload) {
+ if let vid = vidFromPayload(payload) {
+ return (vendor: vid, product: pid)
+ }
+ if devicePIDMap[pid] != nil {
+ return (vendor: appleVendorID, product: pid)
+ }
+ }
+ }
+
+ return nil
+ }
+
+ /// Attempts to find VendorID/ProductID for a device using Bluetooth caches.
+ private func vendorProductIDs(for device: IOBluetoothDevice) -> (vendor: UInt16, product: UInt16)? {
+ guard let preferences = UserDefaults(suiteName: bluetoothPreferencesSuite),
+ let deviceCache = preferences.object(forKey: "DeviceCache") as? [String: Any] else {
+ return nil
+ }
+
+ let target = normalizeBluetoothIdentifier(device.addressString ?? "")
+ guard !target.isEmpty else { return nil }
+
+ let vendorKeys = [
+ "VendorID", "vendor_id", "vendorID",
+ "device_vendorID", "DeviceVendorID", "device_vendor_id",
+ "device_vendorId", "DeviceVendorId",
+ "VendorId", "Vendor ID",
+ "VendorIDSource", "VendorIDSourceLocal", "VendorIDSourceRemote"
+ ]
+ let productKeys = [
+ "ProductID", "product_id", "productID",
+ "device_productID", "DeviceProductID", "device_product_id",
+ "device_productId", "DeviceProductId",
+ "ProductId", "Product ID",
+ "ProductIDSource", "ProductIDSourceLocal", "ProductIDSourceRemote"
+ ]
+
+ for (key, value) in deviceCache {
+ guard let payload = value as? [String: Any] else { continue }
+ if matchesBluetoothIdentifier(target, key: key, payload: payload) {
+ let vendor = extractUInt16(from: payload, keys: vendorKeys)
+ ?? deepSearchUInt16(in: payload) { $0.lowercased().contains("vendorid") }
+
+ let product = extractUInt16(from: payload, keys: productKeys)
+ ?? deepSearchUInt16(in: payload) { $0.lowercased().contains("productid") }
+
+ if let product {
+ if let vendor {
+ return (vendor: vendor, product: product)
+ }
+ if devicePIDMap[product] != nil {
+ return (vendor: appleVendorID, product: product)
+ }
+ }
+ }
+ }
+
+ if let coreCache = preferences.object(forKey: "CoreBluetoothCache") as? [String: [String: Any]] {
+ for payload in coreCache.values {
+ if let addressValue = payload["DeviceAddress"]
+ ?? payload["Address"]
+ ?? payload["BD_ADDR"]
+ ?? payload["device_address"],
+ let address = normalizeBluetoothIdentifier(from: addressValue),
+ address == target {
+ let vendor = extractUInt16(from: payload, keys: vendorKeys)
+ ?? deepSearchUInt16(in: payload) { $0.lowercased().contains("vendorid") }
+
+ let product = extractUInt16(from: payload, keys: productKeys)
+ ?? deepSearchUInt16(in: payload) { $0.lowercased().contains("productid") }
+
+ if let product {
+ if let vendor {
+ return (vendor: vendor, product: product)
+ }
+ if devicePIDMap[product] != nil {
+ return (vendor: appleVendorID, product: product)
+ }
+ }
+ }
+ }
+ }
+
+ if let fromProfiler = vendorProductIDsFromSystemProfiler(forNormalizedAddress: target) {
+ return fromProfiler
+ }
+
+ return nil
+ }
+
+ /// Attempts to detect AirPods/Beats type using vendor/product IDs.
+ private func airPodsTypeFromPID(_ device: IOBluetoothDevice) -> BluetoothAudioDeviceType? {
+ if let ids = vendorProductIDs(for: device) {
+ return devicePIDMap[ids.product]
+ }
+ return nil
+ }
/// Detects the type of audio device based on name and properties
private func detectDeviceType(from device: IOBluetoothDevice, name: String) -> BluetoothAudioDeviceType {
let lowercaseName = name.lowercased()
+
+ if let pidBasedType = airPodsTypeFromPID(device) {
+ return pidBasedType
+ }
// Check for specific AirPods models
if lowercaseName.contains("airpods") {
if lowercaseName.contains("max") {
return .airpodsMax
} else if lowercaseName.contains("pro") {
+ if lowercaseName.contains("3") || lowercaseName.contains("gen 3") || lowercaseName.contains("gen3") {
+ return .airpodsPro3
+ }
return .airpodsPro
+ } else if lowercaseName.contains("gen 4")
+ || lowercaseName.contains("gen4")
+ || lowercaseName.contains("4th")
+ || lowercaseName.contains("airpods 4")
+ || lowercaseName.contains("airpods4") {
+ return .airpodsGen4
+ } else if lowercaseName.contains("gen 3")
+ || lowercaseName.contains("gen3")
+ || lowercaseName.contains("3rd")
+ || lowercaseName.contains("third")
+ || lowercaseName.contains("airpods 3")
+ || lowercaseName.contains("airpods3") {
+ return .airpodsGen3
}
return .airpods
}
// Check for other brands
if lowercaseName.contains("beats") {
- return .beats
+ if lowercaseName.contains("studio") {
+ return .beatsstudio
+ }
+ if lowercaseName.contains("solo") {
+ return .beatssolo
+ }
+ return .beatssolo
} else if lowercaseName.contains("speaker") || lowercaseName.contains("boombox") {
return .speaker
} else if lowercaseName.contains("headphone") || lowercaseName.contains("headset") ||
@@ -1770,9 +2012,14 @@ extension BluetoothAudioDevice {
enum BluetoothAudioDeviceType {
case airpods
+ case airpodsGen3
+ case airpodsGen4
case airpodsPro
+ case airpodsPro3
case airpodsMax
case beats
+ case beatsstudio
+ case beatssolo
case headphones
case speaker
case generic
@@ -1781,12 +2028,22 @@ enum BluetoothAudioDeviceType {
switch self {
case .airpods:
return "airpods"
+ case .airpodsGen3:
+ return "airpods.gen3"
+ case .airpodsGen4:
+ return "airpods.gen4"
case .airpodsPro:
- return "airpodspro"
+ return "airpods.pro"
+ case .airpodsPro3:
+ return "airpods.pro"
case .airpodsMax:
return "airpodsmax"
case .beats:
return "beats.headphones"
+ case .beatsstudio:
+ return "beats.headphones"
+ case .beatssolo:
+ return "beats.headphones"
case .headphones:
return "headphones"
case .speaker:
@@ -1799,14 +2056,24 @@ enum BluetoothAudioDeviceType {
var displayName: String {
switch self {
case .airpods: return "AirPods"
+ case .airpodsGen3: return "AirPods (Gen 3)"
+ case .airpodsGen4: return "AirPods (Gen 4)"
case .airpodsPro: return "AirPods Pro"
+ case .airpodsPro3: return "AirPods Pro 3"
case .airpodsMax: return "AirPods Max"
case .beats: return "Beats"
+ case .beatsstudio: return "Beats Studio"
+ case .beatssolo: return "Beats Solo"
case .headphones: return "Headphones"
case .speaker: return "Speaker"
case .generic: return "Bluetooth Device"
}
}
+
+ /// Inline HUD only: base filename (no extension) for a looping .mov animation.
+ var inlineHUDAnimationBaseName: String {
+ String(describing: self)
+ }
}
// MARK: - Notification Name Constants
diff --git a/DynamicIsland/managers/CalendarManager.swift b/DynamicIsland/managers/CalendarManager.swift
index 5584461..80b47fd 100644
--- a/DynamicIsland/managers/CalendarManager.swift
+++ b/DynamicIsland/managers/CalendarManager.swift
@@ -38,6 +38,7 @@ class CalendarManager: ObservableObject {
@Published var selectedCalendarIDs: Set = []
@Published var calendarAuthorizationStatus: EKAuthorizationStatus = .notDetermined
@Published var reminderAuthorizationStatus: EKAuthorizationStatus = .notDetermined
+ @Published var lockScreenEvents: [EventModel] = []
private var selectedCalendars: [CalendarModel] = []
private let calendarService = CalendarService()
@@ -50,6 +51,9 @@ class CalendarManager: ObservableObject {
private let eventStoreChangeThrottle: TimeInterval = 20
private let selfInducedChangeSuppression: TimeInterval = 6
private let eventFetchLimiter = EventFetchLimiter()
+ private var lastLockScreenEventsFetchDate: Date?
+ private let lockScreenRefreshInterval: TimeInterval = 15
+ private var lockScreenRefreshTask: Task?
var hasCalendarAccess: Bool { isAuthorized(calendarAuthorizationStatus) }
var hasReminderAccess: Bool { isAuthorized(reminderAuthorizationStatus) }
@@ -57,6 +61,7 @@ class CalendarManager: ObservableObject {
private init() {
currentWeekStartDate = CalendarManager.startOfDay(Date())
setupEventStoreChangedObserver()
+ startLockScreenRefreshLoop()
Task {
await reloadCalendarAndReminderLists()
}
@@ -67,6 +72,7 @@ class CalendarManager: ObservableObject {
NotificationCenter.default.removeObserver(observer)
}
pendingEventStoreRefreshTask?.cancel()
+ lockScreenRefreshTask?.cancel()
}
private func setupEventStoreChangedObserver() {
@@ -111,6 +117,7 @@ class CalendarManager: ObservableObject {
pendingEventStoreRefreshTask = nil
await reloadCalendarAndReminderLists()
await maybeRefreshEventsAfterReload()
+ await updateLockScreenEvents(force: true)
nextAllowedEventStoreRefresh = Date().addingTimeInterval(eventStoreChangeThrottle)
ignoreEventStoreChangesUntil = Date().addingTimeInterval(selfInducedChangeSuppression)
}
@@ -154,12 +161,14 @@ class CalendarManager: ObservableObject {
if granted {
await reloadCalendarAndReminderLists()
await updateEvents(force: true)
+ await updateLockScreenEvents(force: true)
}
case .restricted, .denied:
NSLog("Calendar access denied or restricted")
case .authorized, .fullAccess:
await reloadCalendarAndReminderLists()
await updateEvents(force: true)
+ await updateLockScreenEvents(force: true)
case .writeOnly:
NSLog("Calendar write only")
@unknown default:
@@ -230,6 +239,7 @@ class CalendarManager: ObservableObject {
Defaults[.calendarSelectionState] = selectionState
updateSelectedCalendars()
await updateEvents(force: true)
+ await updateLockScreenEvents(force: true)
}
static func startOfDay(_ date: Date) -> Date {
@@ -239,6 +249,88 @@ class CalendarManager: ObservableObject {
func updateCurrentDate(_ date: Date) async {
currentWeekStartDate = Calendar.current.startOfDay(for: date)
await updateEvents(force: true)
+ await updateLockScreenEvents(force: true)
+ }
+
+ func updateLockScreenEvents(force: Bool = false) async {
+ let now = Date()
+
+ if !force,
+ let lastFetch = lastLockScreenEventsFetchDate,
+ now.timeIntervalSince(lastFetch) < lockScreenRefreshInterval {
+ return
+ }
+
+ let lookaheadRaw = Defaults[.lockScreenCalendarEventLookaheadWindow]
+ .trimmingCharacters(in: .whitespacesAndNewlines)
+ .lowercased()
+
+ let isAllTimeLookahead =
+ lookaheadRaw == "all_time" ||
+ lookaheadRaw == "all time" ||
+ lookaheadRaw == "alltime"
+
+ let isRestOfDay =
+ lookaheadRaw == "rest_of_day" ||
+ lookaheadRaw == "rest of the day" ||
+ lookaheadRaw == "restofday"
+
+ func lookaheadMinutes(from raw: String) -> Int? {
+ switch raw {
+ case "15m", "15 min", "15 mins", "15min", "15mins": return 15
+ case "30m", "30 min", "30 mins", "30min", "30mins": return 30
+ case "1h", "1 hr", "1 hour", "1hour": return 60
+ case "3h", "3 hr", "3 hours", "3hours": return 180
+ case "6h", "6 hr", "6 hours", "6hours": return 360
+ case "12h", "12 hr", "12 hours", "12hours": return 720
+ default: return nil
+ }
+ }
+
+ let calendar = Calendar.current
+ let startOfToday = calendar.startOfDay(for: now)
+ let startDate = calendar.date(byAdding: .day, value: -1, to: startOfToday) ?? startOfToday
+
+ let endDate: Date
+ if isAllTimeLookahead {
+ endDate = calendar.date(byAdding: .day, value: 365, to: now) ?? now.addingTimeInterval(365 * 24 * 3600)
+ } else if isRestOfDay {
+ endDate = calendar.date(byAdding: .day, value: 1, to: startOfToday) ?? startOfToday.addingTimeInterval(24 * 3600)
+ } else if let minutes = lookaheadMinutes(from: lookaheadRaw) {
+ endDate = calendar.date(byAdding: .minute, value: minutes, to: now) ?? now.addingTimeInterval(TimeInterval(minutes * 60))
+ } else {
+ endDate = calendar.date(byAdding: .minute, value: 180, to: now) ?? now.addingTimeInterval(180 * 60)
+ }
+
+ let calendarIDs = allCalendars.map { $0.id }
+ let service = calendarService
+
+ let fetched = await eventFetchLimiter.run {
+ await service.events(from: startDate, to: endDate, calendars: calendarIDs)
+ }
+
+ if lockScreenEvents == fetched {
+ lastLockScreenEventsFetchDate = Date()
+ return
+ }
+
+ withAnimation(.smooth(duration: 0.25)) {
+ lockScreenEvents = fetched
+ }
+ lastLockScreenEventsFetchDate = Date()
+ }
+
+ private func startLockScreenRefreshLoop() {
+ lockScreenRefreshTask?.cancel()
+ lockScreenRefreshTask = Task { [weak self] in
+ guard let self else { return }
+ while !Task.isCancelled {
+ try? await Task.sleep(nanoseconds: 60 * 1_000_000_000)
+ if Task.isCancelled { break }
+ guard self.hasCalendarAccess else { continue }
+ await self.updateLockScreenEvents(force: false)
+ }
+ }
}
private func updateEvents(force: Bool = false) async {
diff --git a/DynamicIsland/managers/LockScreenReminderWidgetManager.swift b/DynamicIsland/managers/LockScreenReminderWidgetManager.swift
index 464e413..04b58cb 100644
--- a/DynamicIsland/managers/LockScreenReminderWidgetManager.swift
+++ b/DynamicIsland/managers/LockScreenReminderWidgetManager.swift
@@ -94,6 +94,18 @@ final class LockScreenReminderWidgetManager: ObservableObject {
self.handleSnapshotUpdate(self.reminderManager.lockScreenSnapshot)
}
.store(in: &cancellables)
+
+ Defaults.publisher(.lockScreenReminderWidgetHorizontalAlignment, options: [])
+ .sink { _ in
+ LockScreenReminderWidgetPanelManager.shared.refreshPosition(animated: true)
+ }
+ .store(in: &cancellables)
+
+ Defaults.publisher(.lockScreenReminderWidgetVerticalOffset, options: [])
+ .sink { _ in
+ LockScreenReminderWidgetPanelManager.shared.refreshPosition(animated: true)
+ }
+ .store(in: &cancellables)
}
private func handleSnapshotUpdate(_ newSnapshot: LockScreenReminderWidgetSnapshot?) {
diff --git a/DynamicIsland/managers/LockScreenReminderWidgetPanelManager.swift b/DynamicIsland/managers/LockScreenReminderWidgetPanelManager.swift
index b258c73..32df8f2 100644
--- a/DynamicIsland/managers/LockScreenReminderWidgetPanelManager.swift
+++ b/DynamicIsland/managers/LockScreenReminderWidgetPanelManager.swift
@@ -20,6 +20,7 @@ import AppKit
import SwiftUI
import SkyLightWindow
import QuartzCore
+import Defaults
@MainActor
final class LockScreenReminderWidgetPanelManager {
@@ -119,7 +120,18 @@ final class LockScreenReminderWidgetPanelManager {
private func frame(for size: CGSize, on screen: NSScreen) -> NSRect {
let screenFrame = screen.frame
- let originX = screenFrame.midX - (size.width / 2)
+ let horizontalPadding: CGFloat = 24
+ let alignment = Defaults[.lockScreenReminderWidgetHorizontalAlignment].lowercased()
+ let originX: CGFloat
+
+ switch alignment {
+ case "leading", "left":
+ originX = screenFrame.minX + horizontalPadding
+ case "trailing", "right":
+ originX = screenFrame.maxX - size.width - horizontalPadding
+ default:
+ originX = screenFrame.midX - (size.width / 2)
+ }
let musicTop = LockScreenPanelManager.shared.latestFrame?.maxY ?? (screenFrame.midY - 32)
let timerFrame = LockScreenTimerWidgetPanelManager.shared.latestFrame
@@ -148,7 +160,9 @@ final class LockScreenReminderWidgetPanelManager {
proposedY = (lowerBound + clampedUpperBound) / 2
}
- proposedY = max(lowerBound, min(proposedY, clampedUpperBound))
+ let rawOffset = CGFloat(Defaults[.lockScreenReminderWidgetVerticalOffset])
+ let clampedOffset = min(max(rawOffset, -160), 160)
+ proposedY = max(lowerBound, min(proposedY + clampedOffset, clampedUpperBound))
return NSRect(x: originX, y: proposedY, width: size.width, height: size.height)
}
diff --git a/DynamicIsland/managers/LockScreenWeatherPanelManager.swift b/DynamicIsland/managers/LockScreenWeatherPanelManager.swift
index 78f019b..9b6b5b1 100644
--- a/DynamicIsland/managers/LockScreenWeatherPanelManager.swift
+++ b/DynamicIsland/managers/LockScreenWeatherPanelManager.swift
@@ -31,6 +31,7 @@ final class LockScreenWeatherPanelManager {
private(set) var latestFrame: NSRect?
private var lastSnapshot: LockScreenWeatherSnapshot?
private var lastContentSize: CGSize?
+ private var lastInlineBaselineHeight: CGFloat = 0
private var screenChangeObserver: NSObjectProtocol?
private var workspaceObservers: [NSObjectProtocol] = []
@@ -64,6 +65,9 @@ final class LockScreenWeatherPanelManager {
let view = LockScreenWeatherWidget(snapshot: snapshot)
let hostingView = NSHostingView(rootView: view)
let fittingSize = hostingView.fittingSize
+ if snapshot.widgetStyle == .inline {
+ lastInlineBaselineHeight = max(lastInlineBaselineHeight, fittingSize.height)
+ }
hostingView.frame = NSRect(origin: .zero, size: fittingSize)
let targetFrame = frame(for: fittingSize, snapshot: snapshot, on: screen)
@@ -114,14 +118,23 @@ final class LockScreenWeatherPanelManager {
let screenFrame = screen.frame
let originX = screenFrame.midX - (size.width / 2)
let verticalOffset = screenFrame.height * 0.15
- let maxY = screenFrame.maxY - size.height - 48
+ let isCircular = snapshot.widgetStyle == .circular
+ let topMargin: CGFloat = isCircular ? 120 : 48
+ let inlineBaselineHeight: CGFloat = max(lastInlineBaselineHeight, 80)
+ let positionHeight = snapshot.widgetStyle == .inline
+ ? max(size.height, inlineBaselineHeight)
+ : size.height
+ let maxY = screenFrame.maxY - positionHeight - topMargin
let baseY = min(maxY, screenFrame.midY + verticalOffset)
let loweredY = baseY - 36
let inlineLift: CGFloat = snapshot.widgetStyle == .inline ? 44 : 0
+ let circularDrop: CGFloat = isCircular ? 28 : 0
+ let sizeDropHeight = positionHeight
+ let sizeDrop = max(0, sizeDropHeight - 80) * 0.35
let userOffset = CGFloat(Defaults[.lockScreenWeatherVerticalOffset])
let clampedOffset = min(max(userOffset, -160), 160)
- let adjustedY = loweredY + inlineLift + clampedOffset
+ let adjustedY = loweredY + inlineLift + clampedOffset - circularDrop - sizeDrop
let upperClampedY = min(maxY, adjustedY)
let clampedY = max(screenFrame.minY + 80, upperClampedY)
return NSRect(x: originX, y: clampedY, width: size.width, height: size.height)
diff --git a/DynamicIsland/models/Constants.swift b/DynamicIsland/models/Constants.swift
index a92a790..c77f251 100644
--- a/DynamicIsland/models/Constants.swift
+++ b/DynamicIsland/models/Constants.swift
@@ -800,6 +800,19 @@ extension Defaults.Keys {
static let lockScreenPanelUsesBlur = Key("lockScreenPanelUsesBlur", default: true)
static let lockScreenTimerWidgetUsesBlur = Key("lockScreenTimerWidgetUsesBlur", default: false)
static let lockScreenReminderChipStyle = Key("lockScreenReminderChipStyle", default: .eventColor)
+ static let lockScreenReminderWidgetHorizontalAlignment = Key("lockScreenReminderWidgetHorizontalAlignment", default: "center")
+ static let lockScreenReminderWidgetVerticalOffset = Key("lockScreenReminderWidgetVerticalOffset", default: 0)
+ static let lockScreenShowCalendarEvent = Key("lockScreenShowCalendarEvent", default: true)
+ static let lockScreenCalendarEventLookaheadWindow = Key("lockScreenCalendarEventLookaheadWindow", default: "3h")
+ static let lockScreenCalendarSelectionMode = Key("lockScreenCalendarSelectionMode", default: "all")
+ static let lockScreenSelectedCalendarIDs = Key>("lockScreenSelectedCalendarIDs", default: [])
+ static let lockScreenShowCalendarCountdown = Key("lockScreenShowCalendarCountdown", default: true)
+ static let lockScreenShowCalendarEventEntireDuration = Key("lockScreenShowCalendarEventEntireDuration", default: true)
+ static let lockScreenShowCalendarEventAfterStartEnabled = Key("lockScreenShowCalendarEventAfterStartEnabled", default: false)
+ static let lockScreenShowCalendarEventAfterStartWindow = Key("lockScreenShowCalendarEventAfterStartWindow", default: "5m")
+ static let lockScreenShowCalendarTimeRemaining = Key("lockScreenShowCalendarTimeRemaining", default: true)
+ static let lockScreenShowCalendarStartTimeAfterBegins = Key("lockScreenShowCalendarStartTimeAfterBegins", default: true)
+ static let lockScreenWeatherWidgetRowOrder = Key("lockScreenWeatherWidgetRowOrder", default: "weather_calendar_focus")
// MARK: Battery
static let showPowerStatusNotifications = Key("showPowerStatusNotifications", default: true)
@@ -864,6 +877,7 @@ extension Defaults.Keys {
static let useCircularBluetoothBatteryIndicator = Key("useCircularBluetoothBatteryIndicator", default: true)
static let showBluetoothBatteryPercentageText = Key("showBluetoothBatteryPercentageText", default: false)
static let showBluetoothDeviceNameMarquee = Key("showBluetoothDeviceNameMarquee", default: false)
+ static let useBluetoothHUD3DIcon = Key("useBluetoothHUD3DIcon", default: true)
// MARK: Stats Feature
static let enableStatsFeature = Key("enableStatsFeature", default: false)