feat: improve retention UX with confirmation dialog and friendly messaging

- Add confirmation dialog before changing retention settings to prevent accidental changes
- Move task count display from About tab to History View settings popover
- Combine redundant description/warning into single, clear warning message
- Update task count display to be more human-friendly ('X tasks in history')
- Update all 18 locale files with consistent messaging
- Revert About.tsx to original state (no retention UI there)
This commit is contained in:
Hannes Rudolph 2026-01-26 18:11:45 -07:00
parent 739f6c1989
commit fea999b3b5
21 changed files with 409 additions and 282 deletions

View file

@ -1,5 +1,5 @@
import React, { memo, useState, useMemo } from "react"
import { ArrowLeft, Settings } from "lucide-react"
import React, { memo, useState, useMemo, useCallback, useEffect } from "react"
import { ArrowLeft, Settings, FolderOpen, RefreshCw, Loader2 } from "lucide-react"
import { DeleteTaskDialog } from "./DeleteTaskDialog"
import { BatchDeleteTaskDialog } from "./BatchDeleteTaskDialog"
import { Virtuoso } from "react-virtuoso"
@ -11,6 +11,14 @@ import { VSCodeTextField } from "@vscode/webview-ui-toolkit/react"
import { vscode } from "@/utils/vscode"
import { useExtensionState } from "@/context/ExtensionStateContext"
import {
AlertDialog,
AlertDialogAction,
AlertDialogCancel,
AlertDialogContent,
AlertDialogDescription,
AlertDialogFooter,
AlertDialogHeader,
AlertDialogTitle,
Button,
Checkbox,
Popover,
@ -48,7 +56,7 @@ const HistoryView = ({ onDone }: HistoryViewProps) => {
showAllWorkspaces,
setShowAllWorkspaces,
} = useTaskSearch()
const { taskHistoryRetention } = useExtensionState()
const { taskHistoryRetention, taskHistorySize } = useExtensionState()
const { t } = useAppTranslation()
// Use grouped tasks hook
@ -60,6 +68,39 @@ const HistoryView = ({ onDone }: HistoryViewProps) => {
const [selectedTaskIds, setSelectedTaskIds] = useState<string[]>([])
const [showBatchDeleteDialog, setShowBatchDeleteDialog] = useState<boolean>(false)
const [isRetentionPopoverOpen, setIsRetentionPopoverOpen] = useState(false)
const [pendingRetention, setPendingRetention] = useState<TaskHistoryRetentionSetting | null>(null)
const [showRetentionConfirmDialog, setShowRetentionConfirmDialog] = useState(false)
const [isRefreshingTaskCount, setIsRefreshingTaskCount] = useState(false)
const [cachedTaskCount, setCachedTaskCount] = useState<number | undefined>(taskHistorySize?.taskCount)
// Update cached task count when taskHistorySize changes
useEffect(() => {
if (taskHistorySize) {
setCachedTaskCount(taskHistorySize.taskCount)
setIsRefreshingTaskCount(false)
}
}, [taskHistorySize])
// Handle refresh task count
const handleRefreshTaskCount = useCallback(() => {
setIsRefreshingTaskCount(true)
vscode.postMessage({ type: "refreshTaskHistorySize" })
}, [])
// Get task count display text
const getTaskCountDisplayText = (): string => {
const count = taskHistorySize?.taskCount ?? cachedTaskCount
if (count === undefined) {
return t("settings:taskHistoryStorage.clickToCount")
}
if (count === 0) {
return t("settings:taskHistoryStorage.empty")
}
if (count === 1) {
return t("settings:taskHistoryStorage.countSingular")
}
return t("settings:taskHistoryStorage.count", { count })
}
// Normalize retention setting to ensure it's valid
const normalizedRetention: TaskHistoryRetentionSetting = TASK_HISTORY_RETENTION_OPTIONS.includes(
@ -68,9 +109,31 @@ const HistoryView = ({ onDone }: HistoryViewProps) => {
? (taskHistoryRetention as TaskHistoryRetentionSetting)
: "never"
// Handle retention setting change
// Handle retention setting change - show confirmation dialog first
const handleRetentionChange = (value: TaskHistoryRetentionSetting) => {
vscode.postMessage({ type: "updateSettings", updatedSettings: { taskHistoryRetention: value } })
// If selecting the same value, do nothing
if (value === normalizedRetention) {
return
}
// Show confirmation dialog for any change
setPendingRetention(value)
setShowRetentionConfirmDialog(true)
}
// Confirm retention change
const confirmRetentionChange = () => {
if (pendingRetention !== null) {
vscode.postMessage({ type: "updateSettings", updatedSettings: { taskHistoryRetention: pendingRetention } })
}
setShowRetentionConfirmDialog(false)
setPendingRetention(null)
setIsRetentionPopoverOpen(false)
}
// Cancel retention change
const cancelRetentionChange = () => {
setShowRetentionConfirmDialog(false)
setPendingRetention(null)
}
// Get subtask count for a task
@ -148,7 +211,28 @@ const HistoryView = ({ onDone }: HistoryViewProps) => {
</StandardTooltip>
<PopoverContent className="w-72" align="end">
<div className="space-y-3">
<h4 className="font-medium text-sm">{t("settings:aboutRetention.label")}</h4>
{/* Task count display */}
<div className="flex items-center gap-2">
<FolderOpen className="size-4 text-vscode-descriptionForeground shrink-0" />
<span className="text-sm">{getTaskCountDisplayText()}</span>
<Button
variant="ghost"
size="sm"
onClick={handleRefreshTaskCount}
disabled={isRefreshingTaskCount}
className="h-6 w-6 p-0 ml-auto"
title={t("settings:taskHistoryStorage.refresh")}>
{isRefreshingTaskCount ? (
<Loader2 className="size-3.5 animate-spin" />
) : (
<RefreshCw className="size-3.5" />
)}
</Button>
</div>
<div className="border-t border-vscode-settings-headerBorder pt-3">
<h4 className="font-medium text-sm">{t("settings:aboutRetention.label")}</h4>
</div>
<Select
value={normalizedRetention}
onValueChange={(value: TaskHistoryRetentionSetting) => {
@ -175,9 +259,8 @@ const HistoryView = ({ onDone }: HistoryViewProps) => {
</SelectContent>
</Select>
<p className="text-vscode-descriptionForeground text-xs">
{t("settings:aboutRetention.description")}
{t("settings:aboutRetention.warning")}
</p>
<p className="text-red-500 text-xs">{t("settings:aboutRetention.warning")}</p>
</div>
</PopoverContent>
</Popover>
@ -421,6 +504,32 @@ const HistoryView = ({ onDone }: HistoryViewProps) => {
}}
/>
)}
{/* Retention change confirmation dialog */}
<AlertDialog open={showRetentionConfirmDialog} onOpenChange={setShowRetentionConfirmDialog}>
<AlertDialogContent>
<AlertDialogHeader>
<AlertDialogTitle>{t("settings:aboutRetention.confirmDialog.title")}</AlertDialogTitle>
<AlertDialogDescription>
{pendingRetention === "never"
? t("settings:aboutRetention.confirmDialog.descriptionNever")
: t("settings:aboutRetention.confirmDialog.description", {
period: pendingRetention,
})}
</AlertDialogDescription>
</AlertDialogHeader>
<AlertDialogFooter>
<AlertDialogCancel onClick={cancelRetentionChange}>
{t("settings:aboutRetention.confirmDialog.cancel")}
</AlertDialogCancel>
<AlertDialogAction onClick={confirmRetentionChange}>
{pendingRetention === "never"
? t("settings:aboutRetention.confirmDialog.confirmNever")
: t("settings:aboutRetention.confirmDialog.confirm")}
</AlertDialogAction>
</AlertDialogFooter>
</AlertDialogContent>
</AlertDialog>
</Tab>
)
}

View file

@ -1,19 +1,7 @@
import { HTMLAttributes, useState, useCallback, useEffect } from "react"
import { HTMLAttributes } from "react"
import { useAppTranslation } from "@/i18n/TranslationContext"
import { Trans } from "react-i18next"
import {
Download,
Upload,
TriangleAlert,
Bug,
Lightbulb,
Shield,
MessageCircle,
MessagesSquare,
RefreshCw,
FolderOpen,
Loader2,
} from "lucide-react"
import { Download, Upload, TriangleAlert, Bug, Lightbulb, Shield, MessageCircle, MessagesSquare } from "lucide-react"
import { VSCodeCheckbox, VSCodeLink } from "@vscode/webview-ui-toolkit/react"
import type { TelemetrySetting } from "@roo-code/types"
@ -28,63 +16,15 @@ import { SectionHeader } from "./SectionHeader"
import { Section } from "./Section"
import { SearchableSetting } from "./SearchableSetting"
type TaskHistorySize = {
taskCount: number
}
type AboutProps = HTMLAttributes<HTMLDivElement> & {
telemetrySetting: TelemetrySetting
setTelemetrySetting: (setting: TelemetrySetting) => void
debug?: boolean
setDebug?: (debug: boolean) => void
taskHistorySize?: TaskHistorySize
}
export const About = ({
telemetrySetting,
setTelemetrySetting,
debug,
setDebug,
taskHistorySize,
className,
...props
}: AboutProps) => {
export const About = ({ telemetrySetting, setTelemetrySetting, debug, setDebug, className, ...props }: AboutProps) => {
const { t } = useAppTranslation()
const [isRefreshing, setIsRefreshing] = useState(false)
const [cachedSize, setCachedSize] = useState<TaskHistorySize | undefined>(taskHistorySize)
// Update cached size when taskHistorySize changes and reset refreshing state
useEffect(() => {
if (taskHistorySize) {
setCachedSize(taskHistorySize)
setIsRefreshing(false)
}
}, [taskHistorySize])
// NOTE: No auto-trigger on mount - user must click refresh button
// This is intentional for performance with large task counts (e.g., 9000+ tasks)
const handleRefreshTaskCount = useCallback(() => {
setIsRefreshing(true)
vscode.postMessage({ type: "refreshTaskHistorySize" })
}, [])
const getTaskCountDisplayText = (): string => {
// Use cached size if available, otherwise prompt user to click refresh
const displaySize = taskHistorySize || cachedSize
if (!displaySize) {
return t("settings:taskHistoryStorage.clickToCount")
}
if (displaySize.taskCount === 0) {
return t("settings:taskHistoryStorage.empty")
}
if (displaySize.taskCount === 1) {
return t("settings:taskHistoryStorage.countSingular")
}
return t("settings:taskHistoryStorage.count", {
count: displaySize.taskCount,
})
}
return (
<div className={cn("flex flex-col gap-2", className)} {...props}>
@ -191,37 +131,10 @@ export const About = ({
</Section>
<Section className="space-y-0">
<SearchableSetting
settingId="about-task-history-count"
section="about"
label={t("settings:taskHistoryStorage.label")}
className="mt-4">
<div className="flex items-center gap-2">
<FolderOpen className="size-4 text-vscode-descriptionForeground shrink-0" />
<span className="text-sm">
{t("settings:taskHistoryStorage.label")}: {getTaskCountDisplayText()}
</span>
<Button
variant="ghost"
size="sm"
onClick={handleRefreshTaskCount}
disabled={isRefreshing}
className="h-6 w-6 p-0"
title={t("settings:taskHistoryStorage.refresh")}>
{isRefreshing ? (
<Loader2 className="size-3.5 animate-spin" />
) : (
<RefreshCw className="size-3.5" />
)}
</Button>
</div>
</SearchableSetting>
<SearchableSetting
settingId="about-manage-settings"
section="about"
label={t("settings:about.manageSettings")}
className="mt-4 pt-4 border-t border-vscode-settings-headerBorder">
label={t("settings:about.manageSettings")}>
<h3>{t("settings:about.manageSettings")}</h3>
<div className="flex flex-wrap items-center gap-2">
<Button onClick={() => vscode.postMessage({ type: "exportSettings" })} className="w-28">

View file

@ -218,9 +218,6 @@ const SettingsView = forwardRef<SettingsViewRef, SettingsViewProps>(({ onDone, t
taskHistoryRetention,
} = cachedState
// taskHistorySize is read-only (not a saveable setting) so we use extensionState directly
const taskHistorySize = extensionState.taskHistorySize
const apiConfiguration = useMemo(() => cachedState.apiConfiguration ?? {}, [cachedState.apiConfiguration])
useEffect(() => {
@ -974,7 +971,6 @@ const SettingsView = forwardRef<SettingsViewRef, SettingsViewProps>(({ onDone, t
setTelemetrySetting={setTelemetrySetting}
debug={cachedState.debug}
setDebug={setDebug}
taskHistorySize={taskHistorySize}
/>
)}
</SearchIndexProvider>

View file

@ -898,10 +898,17 @@
},
"aboutRetention": {
"label": "Eliminar automàticament l'historial de tasques",
"description": "Elimina les tasques anteriors al període seleccionat quan s'activa l'extensió.",
"warning": "Advertència: Aquesta acció elimina permanentment les tasques antigues i s'executa quan s'activa l'extensió.",
"warning": "Quan estigui activat, les tasques anteriors al període seleccionat s'eliminen permanentment en reiniciar VS Code.",
"confirmDialog": {
"title": "Activar l'eliminació automàtica?",
"description": "Això eliminarà permanentment les tasques de més de {{period}} dies cada vegada que es reiniciï VS Code. Aquesta acció no es pot desfer.",
"descriptionNever": "L'eliminació automàtica es desactivarà. El teu historial de tasques es conservarà.",
"confirm": "Activar eliminació automàtica",
"confirmNever": "Desactivar eliminació automàtica",
"cancel": "Cancel·lar"
},
"options": {
"never": "Mai",
"never": "Mai (per defecte)",
"90": "90 dies",
"60": "60 dies",
"30": "30 dies",
@ -910,13 +917,12 @@
}
},
"taskHistoryStorage": {
"label": "Ús d'emmagatzematge",
"calculating": "Calculant...",
"format": "{{size}} ({{count}} tasques)",
"formatSingular": "{{size}} (1 tasca)",
"empty": "Cap tasca emmagatzemada",
"refresh": "Actualitzar",
"error": "No es pot calcular"
"label": "Historial de tasques",
"clickToCount": "Clica per comptar",
"count": "{{count}} tasques a l'historial",
"countSingular": "1 tasca a l'historial",
"empty": "Encara no hi ha tasques",
"refresh": "Actualitzar"
},
"footer": {
"feedback": "Si teniu qualsevol pregunta o comentari, no dubteu a obrir un issue a <githubLink>github.com/RooCodeInc/Roo-Code</githubLink> o unir-vos a <redditLink>reddit.com/r/RooCode</redditLink> o <discordLink>discord.gg/roocode</discordLink>",

View file

@ -898,10 +898,17 @@
},
"aboutRetention": {
"label": "Aufgabenverlauf automatisch löschen",
"description": "Löscht Aufgaben, die älter als der ausgewählte Zeitraum sind, wenn die Erweiterung aktiviert wird.",
"warning": "Warnung: Diese Aktion löscht alte Aufgaben dauerhaft und wird ausgeführt, wenn die Erweiterung aktiviert wird.",
"warning": "Wenn aktiviert, werden Aufgaben, die älter als der ausgewählte Zeitraum sind, beim Neustart von VS Code dauerhaft gelöscht.",
"confirmDialog": {
"title": "Automatisches Löschen aktivieren?",
"description": "Dies löscht dauerhaft Aufgaben, die älter als {{period}} Tage sind, bei jedem Neustart von VS Code. Diese Aktion kann nicht rückgängig gemacht werden.",
"descriptionNever": "Das automatische Löschen wird deaktiviert. Dein Aufgabenverlauf bleibt erhalten.",
"confirm": "Automatisches Löschen aktivieren",
"confirmNever": "Automatisches Löschen deaktivieren",
"cancel": "Abbrechen"
},
"options": {
"never": "Nie",
"never": "Nie (Standard)",
"90": "90 Tage",
"60": "60 Tage",
"30": "30 Tage",
@ -910,13 +917,12 @@
}
},
"taskHistoryStorage": {
"label": "Speichernutzung",
"calculating": "Berechne...",
"format": "{{size}} ({{count}} Aufgaben)",
"formatSingular": "{{size}} (1 Aufgabe)",
"empty": "Keine Aufgaben gespeichert",
"refresh": "Aktualisieren",
"error": "Berechnung nicht möglich"
"label": "Aufgabenverlauf",
"clickToCount": "Klicken zum Zählen",
"count": "{{count}} Aufgaben im Verlauf",
"countSingular": "1 Aufgabe im Verlauf",
"empty": "Noch keine Aufgaben",
"refresh": "Aktualisieren"
},
"footer": {
"feedback": "Wenn du Fragen oder Feedback hast, kannst du gerne ein Issue auf <githubLink>github.com/RooCodeInc/Roo-Code</githubLink> eröffnen oder <redditLink>reddit.com/r/RooCode</redditLink> oder <discordLink>discord.gg/roocode</discordLink> beitreten",

View file

@ -907,10 +907,17 @@
},
"aboutRetention": {
"label": "Auto-delete task history",
"description": "Deletes tasks older than the selected period when the extension is activated.",
"warning": "Warning: This action permanently deletes old tasks and runs when the extension is activated.",
"warning": "When enabled, tasks older than the selected period are permanently deleted when VS Code restarts.",
"confirmDialog": {
"title": "Enable Auto-Delete?",
"description": "This will permanently delete tasks older than {{period}} days whenever VS Code restarts. This action cannot be undone.",
"descriptionNever": "Auto-delete will be disabled. Your task history will be preserved.",
"confirm": "Enable Auto-Delete",
"confirmNever": "Disable Auto-Delete",
"cancel": "Cancel"
},
"options": {
"never": "Never",
"never": "Never (default)",
"90": "90 days",
"60": "60 days",
"30": "30 days",
@ -919,12 +926,12 @@
}
},
"taskHistoryStorage": {
"label": "Task count",
"clickToCount": "Click refresh to count",
"count": "{{count}} tasks",
"countSingular": "1 task",
"empty": "No tasks stored",
"refresh": "Count tasks"
"label": "Task history",
"clickToCount": "Click to count tasks",
"count": "{{count}} tasks in history",
"countSingular": "1 task in history",
"empty": "No tasks yet",
"refresh": "Refresh count"
},
"footer": {
"telemetry": {

View file

@ -898,10 +898,17 @@
},
"aboutRetention": {
"label": "Eliminar automáticamente el historial de tareas",
"description": "Elimina las tareas anteriores al período seleccionado cuando se activa la extensión.",
"warning": "Advertencia: Esta acción elimina permanentemente las tareas antiguas y se ejecuta cuando se activa la extensión.",
"warning": "Cuando está habilitado, las tareas anteriores al período seleccionado se eliminan permanentemente al reiniciar VS Code.",
"confirmDialog": {
"title": "¿Activar eliminación automática?",
"description": "Esto eliminará permanentemente las tareas de más de {{period}} días cada vez que VS Code se reinicie. Esta acción no se puede deshacer.",
"descriptionNever": "La eliminación automática se desactivará. Tu historial de tareas se conservará.",
"confirm": "Activar eliminación automática",
"confirmNever": "Desactivar eliminación automática",
"cancel": "Cancelar"
},
"options": {
"never": "Nunca",
"never": "Nunca (predeterminado)",
"90": "90 días",
"60": "60 días",
"30": "30 días",
@ -910,13 +917,12 @@
}
},
"taskHistoryStorage": {
"label": "Uso de almacenamiento",
"calculating": "Calculando...",
"format": "{{size}} ({{count}} tareas)",
"formatSingular": "{{size}} (1 tarea)",
"empty": "No hay tareas almacenadas",
"refresh": "Actualizar",
"error": "No se puede calcular"
"label": "Historial de tareas",
"clickToCount": "Clic para contar",
"count": "{{count}} tareas en el historial",
"countSingular": "1 tarea en el historial",
"empty": "Sin tareas aún",
"refresh": "Actualizar"
},
"footer": {
"feedback": "Si tiene alguna pregunta o comentario, no dude en abrir un issue en <githubLink>github.com/RooCodeInc/Roo-Code</githubLink> o unirse a <redditLink>reddit.com/r/RooCode</redditLink> o <discordLink>discord.gg/roocode</discordLink>",

View file

@ -898,10 +898,17 @@
},
"aboutRetention": {
"label": "Supprimer automatiquement l'historique des tâches",
"description": "Supprime les tâches antérieures à la période sélectionnée lorsque l'extension est activée.",
"warning": "Avertissement : Cette action supprime définitivement les anciennes tâches et s'exécute lorsque l'extension est activée.",
"warning": "Si activé, les tâches antérieures à la période sélectionnée sont définitivement supprimées au redémarrage de VS Code.",
"confirmDialog": {
"title": "Activer la suppression automatique ?",
"description": "Cela supprimera définitivement les tâches de plus de {{period}} jours à chaque redémarrage de VS Code. Cette action ne peut pas être annulée.",
"descriptionNever": "La suppression automatique sera désactivée. Votre historique des tâches sera conservé.",
"confirm": "Activer la suppression automatique",
"confirmNever": "Désactiver la suppression automatique",
"cancel": "Annuler"
},
"options": {
"never": "Jamais",
"never": "Jamais (par défaut)",
"90": "90 jours",
"60": "60 jours",
"30": "30 jours",
@ -910,13 +917,12 @@
}
},
"taskHistoryStorage": {
"label": "Utilisation du stockage",
"calculating": "Calcul en cours...",
"format": "{{size}} ({{count}} tâches)",
"formatSingular": "{{size}} (1 tâche)",
"empty": "Aucune tâche stockée",
"refresh": "Actualiser",
"error": "Impossible de calculer"
"label": "Historique des tâches",
"clickToCount": "Cliquer pour compter",
"count": "{{count}} tâches dans l'historique",
"countSingular": "1 tâche dans l'historique",
"empty": "Aucune tâche pour l'instant",
"refresh": "Actualiser"
},
"footer": {
"feedback": "Si vous avez des questions ou des commentaires, n'hésitez pas à ouvrir un problème sur <githubLink>github.com/RooCodeInc/Roo-Code</githubLink> ou à rejoindre <redditLink>reddit.com/r/RooCode</redditLink> ou <discordLink>discord.gg/roocode</discordLink>",

View file

@ -899,10 +899,17 @@
},
"aboutRetention": {
"label": "कार्य इतिहास स्वचालित रूप से हटाएं",
"description": "एक्सटेंशन सक्रिय होने पर चयनित अवधि से पुराने कार्यों को हटा देता है।",
"warning": "चेतावनी: यह क्रिया स्थायी रूप से पुराने कार्यों को हटा देती है और एक्सटेंशन सक्रिय होने पर चलती है।",
"warning": "सक्षम होने पर, चयनित अवधि से पुराने कार्य VS Code के पुनः आरंभ होने पर स्थायी रूप से हटा दिए जाते हैं।",
"confirmDialog": {
"title": "स्वचालित हटाना सक्षम करें?",
"description": "यह VS Code के हर पुनः आरंभ पर {{period}} दिनों से पुराने कार्यों को स्थायी रूप से हटा देगा। इस क्रिया को पूर्ववत नहीं किया जा सकता।",
"descriptionNever": "स्वचालित हटाना अक्षम किया जाएगा। आपका कार्य इतिहास संरक्षित रहेगा।",
"confirm": "स्वचालित हटाना सक्षम करें",
"confirmNever": "स्वचालित हटाना अक्षम करें",
"cancel": "रद्द करें"
},
"options": {
"never": "कभी नहीं",
"never": "कभी नहीं (डिफ़ॉल्ट)",
"90": "90 दिन",
"60": "60 दिन",
"30": "30 दिन",
@ -911,13 +918,12 @@
}
},
"taskHistoryStorage": {
"label": "स्टोरेज उपयोग",
"calculating": "गणना हो रही है...",
"format": "{{size}} ({{count}} कार्य)",
"formatSingular": "{{size}} (1 कार्य)",
"empty": "कोई कार्य संग्रहीत नहीं",
"refresh": "रिफ्रेश करें",
"error": "गणना करने में असमर्थ"
"label": "कार्य इतिहास",
"clickToCount": "गिनने के लिए क्लिक करें",
"count": "इतिहास में {{count}} कार्य",
"countSingular": "इतिहास में 1 कार्य",
"empty": "अभी तक कोई कार्य नहीं",
"refresh": "रिफ्रेश करें"
},
"footer": {
"feedback": "यदि आपके कोई प्रश्न या प्रतिक्रिया है, तो <githubLink>github.com/RooCodeInc/Roo-Code</githubLink> पर एक मुद्दा खोलने या <redditLink>reddit.com/r/RooCode</redditLink> या <discordLink>discord.gg/roocode</discordLink> में शामिल होने में संकोच न करें",

View file

@ -928,10 +928,17 @@
},
"aboutRetention": {
"label": "Hapus otomatis riwayat tugas",
"description": "Menghapus tugas yang lebih lama dari periode yang dipilih saat ekstensi diaktifkan.",
"warning": "Peringatan: Tindakan ini menghapus tugas lama secara permanen dan berjalan saat ekstensi diaktifkan.",
"warning": "Saat diaktifkan, tugas yang lebih lama dari periode yang dipilih akan dihapus secara permanen saat VS Code dimulai ulang.",
"confirmDialog": {
"title": "Aktifkan hapus otomatis?",
"description": "Ini akan menghapus tugas yang lebih lama dari {{period}} hari secara permanen setiap kali VS Code dimulai ulang. Tindakan ini tidak dapat dibatalkan.",
"descriptionNever": "Hapus otomatis akan dinonaktifkan. Riwayat tugas Anda akan dipertahankan.",
"confirm": "Aktifkan hapus otomatis",
"confirmNever": "Nonaktifkan hapus otomatis",
"cancel": "Batal"
},
"options": {
"never": "Tidak pernah",
"never": "Tidak pernah (default)",
"90": "90 hari",
"60": "60 hari",
"30": "30 hari",
@ -940,13 +947,12 @@
}
},
"taskHistoryStorage": {
"label": "Penggunaan penyimpanan",
"calculating": "Menghitung...",
"format": "{{size}} ({{count}} tugas)",
"formatSingular": "{{size}} (1 tugas)",
"empty": "Tidak ada tugas tersimpan",
"refresh": "Segarkan",
"error": "Tidak dapat menghitung"
"label": "Riwayat tugas",
"clickToCount": "Klik untuk menghitung",
"count": "{{count}} tugas dalam riwayat",
"countSingular": "1 tugas dalam riwayat",
"empty": "Belum ada tugas",
"refresh": "Segarkan"
},
"footer": {
"feedback": "Jika kamu punya pertanyaan atau feedback, jangan ragu untuk membuka issue di <githubLink>github.com/RooCodeInc/Roo-Code</githubLink> atau bergabung <redditLink>reddit.com/r/RooCode</redditLink> atau <discordLink>discord.gg/roocode</discordLink>",

View file

@ -899,10 +899,17 @@
},
"aboutRetention": {
"label": "Elimina automaticamente la cronologia delle attività",
"description": "Elimina le attività più vecchie del periodo selezionato quando l'estensione viene attivata.",
"warning": "Avviso: Questa azione elimina permanentemente le attività vecchie e viene eseguita quando l'estensione viene attivata.",
"warning": "Se abilitato, le attività più vecchie del periodo selezionato vengono eliminate permanentemente al riavvio di VS Code.",
"confirmDialog": {
"title": "Attivare l'eliminazione automatica?",
"description": "Questo eliminerà permanentemente le attività più vecchie di {{period}} giorni ogni volta che VS Code viene riavviato. Questa azione non può essere annullata.",
"descriptionNever": "L'eliminazione automatica sarà disattivata. La cronologia delle attività sarà conservata.",
"confirm": "Attiva eliminazione automatica",
"confirmNever": "Disattiva eliminazione automatica",
"cancel": "Annulla"
},
"options": {
"never": "Mai",
"never": "Mai (predefinito)",
"90": "90 giorni",
"60": "60 giorni",
"30": "30 giorni",
@ -911,13 +918,12 @@
}
},
"taskHistoryStorage": {
"label": "Utilizzo dello spazio di archiviazione",
"calculating": "Calcolo in corso...",
"format": "{{size}} ({{count}} attività)",
"formatSingular": "{{size}} (1 attività)",
"empty": "Nessuna attività archiviata",
"refresh": "Aggiorna",
"error": "Impossibile calcolare"
"label": "Cronologia attività",
"clickToCount": "Clicca per contare",
"count": "{{count}} attività nella cronologia",
"countSingular": "1 attività nella cronologia",
"empty": "Nessuna attività ancora",
"refresh": "Aggiorna"
},
"footer": {
"feedback": "Se hai domande o feedback, sentiti libero di aprire un issue su <githubLink>github.com/RooCodeInc/Roo-Code</githubLink> o unirti a <redditLink>reddit.com/r/RooCode</redditLink> o <discordLink>discord.gg/roocode</discordLink>",

View file

@ -899,10 +899,17 @@
},
"aboutRetention": {
"label": "タスク履歴を自動削除",
"description": "拡張機能が起動したときに、選択された期間より古いタスクを削除します。",
"warning": "警告:この操作は古いタスクを完全に削除し、拡張機能が起動したときに実行されます。",
"warning": "有効にすると、選択した期間より古いタスクはVS Code再起動時に完全に削除されます。",
"confirmDialog": {
"title": "自動削除を有効にしますか?",
"description": "VS Codeを再起動するたびに、{{period}}日以上経過したタスクが完全に削除されます。この操作は取り消せません。",
"descriptionNever": "自動削除が無効になります。タスク履歴は保持されます。",
"confirm": "自動削除を有効にする",
"confirmNever": "自動削除を無効にする",
"cancel": "キャンセル"
},
"options": {
"never": "削除しない",
"never": "削除しない(デフォルト)",
"90": "90日",
"60": "60日",
"30": "30日",
@ -911,13 +918,12 @@
}
},
"taskHistoryStorage": {
"label": "ストレージ使用量",
"calculating": "計算中...",
"format": "{{size}} ({{count}} タスク)",
"formatSingular": "{{size}} (1 タスク)",
"empty": "保存されたタスクがありません",
"refresh": "更新",
"error": "計算できません"
"label": "タスク履歴",
"clickToCount": "クリックしてカウント",
"count": "履歴に{{count}}件のタスク",
"countSingular": "履歴に1件のタスク",
"empty": "タスクはまだありません",
"refresh": "更新"
},
"footer": {
"feedback": "質問やフィードバックがある場合は、<githubLink>github.com/RooCodeInc/Roo-Code</githubLink>で問題を開くか、<redditLink>reddit.com/r/RooCode</redditLink>や<discordLink>discord.gg/roocode</discordLink>に参加してください",

View file

@ -899,10 +899,17 @@
},
"aboutRetention": {
"label": "작업 기록 자동 삭제",
"description": "확장 프로그램이 활성화될 때 선택한 기간보다 오래된 작업을 삭제합니다.",
"warning": "경고: 이 작업은 오래된 작업을 영구적으로 삭제하며 확장 프로그램이 활성화될 때 실행됩니다.",
"warning": "활성화하면 선택한 기간보다 오래된 작업이 VS Code 재시작 시 영구적으로 삭제됩니다.",
"confirmDialog": {
"title": "자동 삭제를 활성화하시겠습니까?",
"description": "VS Code가 재시작될 때마다 {{period}}일 이상 된 작업이 영구적으로 삭제됩니다. 이 작업은 취소할 수 없습니다.",
"descriptionNever": "자동 삭제가 비활성화됩니다. 작업 기록이 보존됩니다.",
"confirm": "자동 삭제 활성화",
"confirmNever": "자동 삭제 비활성화",
"cancel": "취소"
},
"options": {
"never": "삭제 안 함",
"never": "삭제 안 함 (기본값)",
"90": "90일",
"60": "60일",
"30": "30일",
@ -911,13 +918,12 @@
}
},
"taskHistoryStorage": {
"label": "저장소 사용량",
"calculating": "계산 중...",
"format": "{{size}} ({{count}}개 작업)",
"formatSingular": "{{size}} (1개 작업)",
"empty": "저장된 작업 없음",
"refresh": "새로고침",
"error": "계산할 수 없음"
"label": "작업 기록",
"clickToCount": "클릭하여 계산",
"count": "기록에 {{count}}개 작업",
"countSingular": "기록에 1개 작업",
"empty": "아직 작업 없음",
"refresh": "새로고침"
},
"footer": {
"feedback": "질문이나 피드백이 있으시면 <githubLink>github.com/RooCodeInc/Roo-Code</githubLink>에서 이슈를 열거나 <redditLink>reddit.com/r/RooCode</redditLink> 또는 <discordLink>discord.gg/roocode</discordLink>에 가입하세요",

View file

@ -899,10 +899,17 @@
},
"aboutRetention": {
"label": "Taakgeschiedenis automatisch verwijderen",
"description": "Verwijdert taken ouder dan de geselecteerde periode wanneer de extensie wordt geactiveerd.",
"warning": "Waarschuwing: Deze actie verwijdert oude taken permanent en wordt uitgevoerd wanneer de extensie wordt geactiveerd.",
"warning": "Wanneer ingeschakeld, worden taken ouder dan de geselecteerde periode permanent verwijderd bij het herstarten van VS Code.",
"confirmDialog": {
"title": "Automatisch verwijderen activeren?",
"description": "Dit verwijdert permanent taken ouder dan {{period}} dagen telkens wanneer VS Code opnieuw wordt gestart. Deze actie kan niet ongedaan worden gemaakt.",
"descriptionNever": "Automatisch verwijderen wordt uitgeschakeld. Je taakgeschiedenis wordt bewaard.",
"confirm": "Automatisch verwijderen activeren",
"confirmNever": "Automatisch verwijderen uitschakelen",
"cancel": "Annuleren"
},
"options": {
"never": "Nooit",
"never": "Nooit (standaard)",
"90": "90 dagen",
"60": "60 dagen",
"30": "30 dagen",
@ -911,13 +918,12 @@
}
},
"taskHistoryStorage": {
"label": "Opslaggebruik",
"calculating": "Berekenen...",
"format": "{{size}} ({{count}} taken)",
"formatSingular": "{{size}} (1 taak)",
"empty": "Geen opgeslagen taken",
"refresh": "Vernieuwen",
"error": "Kan niet berekenen"
"label": "Taakgeschiedenis",
"clickToCount": "Klik om te tellen",
"count": "{{count}} taken in geschiedenis",
"countSingular": "1 taak in geschiedenis",
"empty": "Nog geen taken",
"refresh": "Vernieuwen"
},
"footer": {
"feedback": "Heb je vragen of feedback? Open gerust een issue op <githubLink>github.com/RooCodeInc/Roo-Code</githubLink> of sluit je aan bij <redditLink>reddit.com/r/RooCode</redditLink> of <discordLink>discord.gg/roocode</discordLink>",

View file

@ -899,10 +899,17 @@
},
"aboutRetention": {
"label": "Automatyczne usuwanie historii zadań",
"description": "Usuwa zadania starsze niż wybrany okres po aktywacji rozszerzenia.",
"warning": "Ostrzeżenie: Ta akcja trwale usuwa stare zadania i działa po aktywacji rozszerzenia.",
"warning": "Po włączeniu, zadania starsze niż wybrany okres są trwale usuwane przy ponownym uruchomieniu VS Code.",
"confirmDialog": {
"title": "Włączyć automatyczne usuwanie?",
"description": "To trwale usunie zadania starsze niż {{period}} dni przy każdym ponownym uruchomieniu VS Code. Tej akcji nie można cofnąć.",
"descriptionNever": "Automatyczne usuwanie zostanie wyłączone. Historia zadań zostanie zachowana.",
"confirm": "Włącz automatyczne usuwanie",
"confirmNever": "Wyłącz automatyczne usuwanie",
"cancel": "Anuluj"
},
"options": {
"never": "Nigdy",
"never": "Nigdy (domyślnie)",
"90": "90 dni",
"60": "60 dni",
"30": "30 dni",
@ -911,13 +918,12 @@
}
},
"taskHistoryStorage": {
"label": "Wykorzystanie pamięci",
"calculating": "Obliczanie...",
"format": "{{size}} ({{count}} zadań)",
"formatSingular": "{{size}} (1 zadanie)",
"empty": "Brak zapisanych zadań",
"refresh": "Odśwież",
"error": "Nie można obliczyć"
"label": "Historia zadań",
"clickToCount": "Kliknij, aby policzyć",
"count": "{{count}} zadań w historii",
"countSingular": "1 zadanie w historii",
"empty": "Brak zadań",
"refresh": "Odśwież"
},
"footer": {
"feedback": "Jeśli masz jakiekolwiek pytania lub opinie, śmiało otwórz zgłoszenie na <githubLink>github.com/RooCodeInc/Roo-Code</githubLink> lub dołącz do <redditLink>reddit.com/r/RooCode</redditLink> lub <discordLink>discord.gg/roocode</discordLink>",

View file

@ -899,10 +899,17 @@
},
"aboutRetention": {
"label": "Excluir automaticamente o histórico de tarefas",
"description": "Exclui tarefas mais antigas que o período selecionado quando a extensão é ativada.",
"warning": "Aviso: Esta ação exclui permanentemente as tarefas antigas e é executada quando a extensão é ativada.",
"warning": "Quando ativado, tarefas mais antigas que o período selecionado são excluídas permanentemente ao reiniciar o VS Code.",
"confirmDialog": {
"title": "Ativar exclusão automática?",
"description": "Isso excluirá permanentemente tarefas com mais de {{period}} dias sempre que o VS Code for reiniciado. Esta ação não pode ser desfeita.",
"descriptionNever": "A exclusão automática será desativada. Seu histórico de tarefas será preservado.",
"confirm": "Ativar exclusão automática",
"confirmNever": "Desativar exclusão automática",
"cancel": "Cancelar"
},
"options": {
"never": "Nunca",
"never": "Nunca (padrão)",
"90": "90 dias",
"60": "60 dias",
"30": "30 dias",
@ -911,13 +918,12 @@
}
},
"taskHistoryStorage": {
"label": "Uso de armazenamento",
"calculating": "Calculando...",
"format": "{{size}} ({{count}} tarefas)",
"formatSingular": "{{size}} (1 tarefa)",
"empty": "Nenhuma tarefa armazenada",
"refresh": "Atualizar",
"error": "Não foi possível calcular"
"label": "Histórico de tarefas",
"clickToCount": "Clique para contar",
"count": "{{count}} tarefas no histórico",
"countSingular": "1 tarefa no histórico",
"empty": "Nenhuma tarefa ainda",
"refresh": "Atualizar"
},
"footer": {
"feedback": "Se tiver alguma dúvida ou feedback, sinta-se à vontade para abrir um problema em <githubLink>github.com/RooCodeInc/Roo-Code</githubLink> ou juntar-se a <redditLink>reddit.com/r/RooCode</redditLink> ou <discordLink>discord.gg/roocode</discordLink>",

View file

@ -899,10 +899,17 @@
},
"aboutRetention": {
"label": "Автоматически удалять историю задач",
"description": "Удаляет задачи старше выбранного периода при активации расширения.",
"warning": "Внимание: Это действие безвозвратно удаляет старые задачи и выполняется при активации расширения.",
"warning": "При включении задачи старше выбранного периода безвозвратно удаляются при перезапуске VS Code.",
"confirmDialog": {
"title": "Включить автоудаление?",
"description": "Это безвозвратно удалит задачи старше {{period}} дней при каждом перезапуске VS Code. Это действие нельзя отменить.",
"descriptionNever": "Автоудаление будет отключено. История задач будет сохранена.",
"confirm": "Включить автоудаление",
"confirmNever": "Отключить автоудаление",
"cancel": "Отмена"
},
"options": {
"never": "Никогда",
"never": "Никогда (по умолчанию)",
"90": "90 дней",
"60": "60 дней",
"30": "30 дней",
@ -911,13 +918,12 @@
}
},
"taskHistoryStorage": {
"label": "Использование хранилища",
"calculating": "Подсчет...",
"format": "{{size}} ({{count}} задач)",
"formatSingular": "{{size}} (1 задача)",
"empty": "Нет сохраненных задач",
"refresh": "Обновить",
"error": "Невозможно подсчитать"
"label": "История задач",
"clickToCount": "Нажмите для подсчета",
"count": "{{count}} задач в истории",
"countSingular": "1 задача в истории",
"empty": "Задач пока нет",
"refresh": "Обновить"
},
"footer": {
"feedback": "Если у вас есть вопросы или предложения, откройте issue на <githubLink>github.com/RooCodeInc/Roo-Code</githubLink> или присоединяйтесь к <redditLink>reddit.com/r/RooCode</redditLink> или <discordLink>discord.gg/roocode</discordLink>",

View file

@ -899,10 +899,17 @@
},
"aboutRetention": {
"label": "Görev geçmişini otomatik sil",
"description": "Uzantı etkinleştirildiğinde seçilen döneme göre daha eski görevleri siler.",
"warning": "Uyarı: Bu işlem eski görevleri kalıcı olarak siler ve uzantı etkinleştirildiğinde çalışır.",
"warning": "Etkinleştirildiğinde, seçilen döneme göre daha eski görevler VS Code yeniden başlatıldığında kalıcı olarak silinir.",
"confirmDialog": {
"title": "Otomatik silmeyi etkinleştir?",
"description": "Bu, VS Code her yeniden başlatıldığında {{period}} günden eski görevleri kalıcı olarak silecek. Bu işlem geri alınamaz.",
"descriptionNever": "Otomatik silme devre dışı bırakılacak. Görev geçmişiniz korunacak.",
"confirm": "Otomatik silmeyi etkinleştir",
"confirmNever": "Otomatik silmeyi devre dışı bırak",
"cancel": "İptal"
},
"options": {
"never": "Asla",
"never": "Asla (varsayılan)",
"90": "90 gün",
"60": "60 gün",
"30": "30 gün",
@ -911,13 +918,12 @@
}
},
"taskHistoryStorage": {
"label": "Depolama kullanımı",
"calculating": "Hesaplanıyor...",
"format": "{{size}} ({{count}} görev)",
"formatSingular": "{{size}} (1 görev)",
"empty": "Depolanmış görev yok",
"refresh": "Yenile",
"error": "Hesaplanamıyor"
"label": "Görev geçmişi",
"clickToCount": "Saymak için tıklayın",
"count": "Geçmişte {{count}} görev",
"countSingular": "Geçmişte 1 görev",
"empty": "Henüz görev yok",
"refresh": "Yenile"
},
"footer": {
"feedback": "Herhangi bir sorunuz veya geri bildiriminiz varsa, <githubLink>github.com/RooCodeInc/Roo-Code</githubLink> adresinde bir konu açmaktan veya <redditLink>reddit.com/r/RooCode</redditLink> ya da <discordLink>discord.gg/roocode</discordLink>'a katılmaktan çekinmeyin",

View file

@ -899,10 +899,17 @@
},
"aboutRetention": {
"label": "Tự động xóa lịch sử tác vụ",
"description": "Xóa các tác vụ cũ hơn khoảng thời gian đã chọn khi tiện ích được kích hoạt.",
"warning": "Cảnh báo: Hành động này xóa vĩnh viễn các tác vụ cũ và chạy khi tiện ích được kích hoạt.",
"warning": "Khi được bật, các tác vụ cũ hơn khoảng thời gian đã chọn sẽ bị xóa vĩnh viễn khi VS Code khởi động lại.",
"confirmDialog": {
"title": "Bật tự động xóa?",
"description": "Điều này sẽ xóa vĩnh viễn các tác vụ cũ hơn {{period}} ngày mỗi khi VS Code khởi động lại. Hành động này không thể hoàn tác.",
"descriptionNever": "Tự động xóa sẽ bị tắt. Lịch sử tác vụ của bạn sẽ được bảo tồn.",
"confirm": "Bật tự động xóa",
"confirmNever": "Tắt tự động xóa",
"cancel": "Hủy"
},
"options": {
"never": "Không bao giờ",
"never": "Không bao giờ (mặc định)",
"90": "90 ngày",
"60": "60 ngày",
"30": "30 ngày",
@ -911,13 +918,12 @@
}
},
"taskHistoryStorage": {
"label": "Dung lượng lưu trữ",
"calculating": "Đang tính toán...",
"format": "{{size}} ({{count}} tác vụ)",
"formatSingular": "{{size}} (1 tác vụ)",
"empty": "Không có tác vụ được lưu trữ",
"refresh": "Làm mới",
"error": "Không thể tính toán"
"label": "Lịch sử tác vụ",
"clickToCount": "Nhấp để đếm",
"count": "{{count}} tác vụ trong lịch sử",
"countSingular": "1 tác vụ trong lịch sử",
"empty": "Chưa có tác vụ nào",
"refresh": "Làm mới"
},
"footer": {
"feedback": "Nếu bạn có bất kỳ câu hỏi hoặc phản hồi nào, vui lòng mở một vấn đề tại <githubLink>github.com/RooCodeInc/Roo-Code</githubLink> hoặc tham gia <redditLink>reddit.com/r/RooCode</redditLink> hoặc <discordLink>discord.gg/roocode</discordLink>",

View file

@ -899,10 +899,17 @@
},
"aboutRetention": {
"label": "自动删除任务历史",
"description": "扩展激活时删除早于所选时段的任务。",
"warning": "警告:此操作永久删除旧任务,并在扩展激活时运行。",
"warning": "启用后早于所选时段的任务将在VS Code重启时被永久删除。",
"confirmDialog": {
"title": "启用自动删除?",
"description": "每次VS Code重启时将永久删除超过{{period}}天的任务。此操作无法撤销。",
"descriptionNever": "自动删除将被禁用。您的任务历史将被保留。",
"confirm": "启用自动删除",
"confirmNever": "禁用自动删除",
"cancel": "取消"
},
"options": {
"never": "永不",
"never": "永不(默认)",
"90": "90天",
"60": "60天",
"30": "30天",
@ -911,13 +918,12 @@
}
},
"taskHistoryStorage": {
"label": "存储使用量",
"calculating": "计算中...",
"format": "{{size}} ({{count}} 个任务)",
"formatSingular": "{{size}} (1 个任务)",
"empty": "无任务存储",
"refresh": "刷新",
"error": "无法计算"
"label": "任务历史",
"clickToCount": "点击计数",
"count": "历史中有 {{count}} 个任务",
"countSingular": "历史中有 1 个任务",
"empty": "暂无任务",
"refresh": "刷新"
},
"footer": {
"feedback": "如果您有任何问题或反馈,请随时在 <githubLink>github.com/RooCodeInc/Roo-Code</githubLink> 上提出问题或加入 <redditLink>reddit.com/r/RooCode</redditLink> 或 <discordLink>discord.gg/roocode</discordLink>",

View file

@ -907,10 +907,17 @@
},
"aboutRetention": {
"label": "自動刪除工作歷程記錄",
"description": "擴充功能啟動時刪除早於所選時段的工作。",
"warning": "警告:此操作永久刪除舊工作,並在擴充功能啟動時執行。",
"warning": "啟用後早於所選時段的工作將在VS Code重新啟動時被永久刪除。",
"confirmDialog": {
"title": "啟用自動刪除?",
"description": "每次VS Code重新啟動時將永久刪除超過{{period}}天的工作。此操作無法復原。",
"descriptionNever": "自動刪除將被停用。您的工作歷程記錄將被保留。",
"confirm": "啟用自動刪除",
"confirmNever": "停用自動刪除",
"cancel": "取消"
},
"options": {
"never": "永不",
"never": "永不(預設)",
"90": "90天",
"60": "60天",
"30": "30天",
@ -919,13 +926,12 @@
}
},
"taskHistoryStorage": {
"label": "儲存空間使用量",
"calculating": "計算中...",
"format": "{{size}} ({{count}} 個工作)",
"formatSingular": "{{size}} (1 個工作)",
"empty": "無已儲存工作",
"refresh": "重新整理",
"error": "無法計算"
"label": "工作歷程",
"clickToCount": "點擊計數",
"count": "歷程中有 {{count}} 個工作",
"countSingular": "歷程中有 1 個工作",
"empty": "尚無工作",
"refresh": "重新整理"
},
"footer": {
"telemetry": {