Browse Source

Improve checkpoint menu translations for PR #7841 (#8796)

Co-authored-by: Bruno Bergher <[email protected]>
Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com>
Co-authored-by: NaccOll <[email protected]>
Daniel 2 months ago
parent
commit
485b551cf3
44 changed files with 326 additions and 57 deletions
  1. 7 7
      src/core/checkpoints/__tests__/checkpoint.test.ts
  2. 48 15
      src/core/checkpoints/index.ts
  3. 6 0
      src/i18n/locales/ca/common.json
  4. 6 0
      src/i18n/locales/de/common.json
  5. 6 0
      src/i18n/locales/en/common.json
  6. 6 0
      src/i18n/locales/es/common.json
  7. 6 0
      src/i18n/locales/fr/common.json
  8. 8 3
      src/i18n/locales/hi/common.json
  9. 6 0
      src/i18n/locales/id/common.json
  10. 6 0
      src/i18n/locales/it/common.json
  11. 6 0
      src/i18n/locales/ja/common.json
  12. 6 0
      src/i18n/locales/ko/common.json
  13. 6 0
      src/i18n/locales/nl/common.json
  14. 6 0
      src/i18n/locales/pl/common.json
  15. 6 0
      src/i18n/locales/pt-BR/common.json
  16. 6 0
      src/i18n/locales/ru/common.json
  17. 6 0
      src/i18n/locales/tr/common.json
  18. 6 0
      src/i18n/locales/vi/common.json
  19. 7 1
      src/i18n/locales/zh-CN/common.json
  20. 6 0
      src/i18n/locales/zh-TW/common.json
  21. 2 2
      src/shared/WebviewMessage.ts
  22. 1 0
      webview-ui/src/components/chat/ChatRow.tsx
  23. 2 0
      webview-ui/src/components/chat/ChatView.tsx
  24. 88 19
      webview-ui/src/components/chat/checkpoints/CheckpointMenu.tsx
  25. 2 2
      webview-ui/src/components/chat/checkpoints/CheckpointSaved.tsx
  26. 10 7
      webview-ui/src/components/chat/checkpoints/__tests__/CheckpointSaved.spec.tsx
  27. 3 0
      webview-ui/src/i18n/locales/ca/chat.json
  28. 3 0
      webview-ui/src/i18n/locales/de/chat.json
  29. 4 1
      webview-ui/src/i18n/locales/en/chat.json
  30. 3 0
      webview-ui/src/i18n/locales/es/chat.json
  31. 3 0
      webview-ui/src/i18n/locales/fr/chat.json
  32. 3 0
      webview-ui/src/i18n/locales/hi/chat.json
  33. 3 0
      webview-ui/src/i18n/locales/id/chat.json
  34. 3 0
      webview-ui/src/i18n/locales/it/chat.json
  35. 3 0
      webview-ui/src/i18n/locales/ja/chat.json
  36. 3 0
      webview-ui/src/i18n/locales/ko/chat.json
  37. 3 0
      webview-ui/src/i18n/locales/nl/chat.json
  38. 3 0
      webview-ui/src/i18n/locales/pl/chat.json
  39. 3 0
      webview-ui/src/i18n/locales/pt-BR/chat.json
  40. 3 0
      webview-ui/src/i18n/locales/ru/chat.json
  41. 3 0
      webview-ui/src/i18n/locales/tr/chat.json
  42. 3 0
      webview-ui/src/i18n/locales/vi/chat.json
  43. 3 0
      webview-ui/src/i18n/locales/zh-CN/chat.json
  44. 3 0
      webview-ui/src/i18n/locales/zh-TW/chat.json

+ 7 - 7
src/core/checkpoints/__tests__/checkpoint.test.ts

@@ -304,7 +304,7 @@ describe("Checkpoint functionality", () => {
 			]
 		})
 
-		it("should show diff for full mode", async () => {
+		it("should show diff for to-current mode", async () => {
 			const mockChanges = [
 				{
 					paths: { absolute: "/test/file.ts", relative: "file.ts" },
@@ -316,7 +316,7 @@ describe("Checkpoint functionality", () => {
 			await checkpointDiff(mockTask, {
 				ts: 4,
 				commitHash: "commit2",
-				mode: "full",
+				mode: "to-current",
 			})
 
 			expect(mockCheckpointService.getDiff).toHaveBeenCalledWith({
@@ -325,7 +325,7 @@ describe("Checkpoint functionality", () => {
 			})
 			expect(vscode.commands.executeCommand).toHaveBeenCalledWith(
 				"vscode.changes",
-				"Changes since task started",
+				"errors.checkpoint_diff_to_current",
 				expect.any(Array),
 			)
 		})
@@ -350,7 +350,7 @@ describe("Checkpoint functionality", () => {
 			})
 			expect(vscode.commands.executeCommand).toHaveBeenCalledWith(
 				"vscode.changes",
-				"Changes compare with next checkpoint",
+				"errors.checkpoint_diff_with_next",
 				expect.any(Array),
 			)
 		})
@@ -382,10 +382,10 @@ describe("Checkpoint functionality", () => {
 			await checkpointDiff(mockTask, {
 				ts: 4,
 				commitHash: "commit2",
-				mode: "full",
+				mode: "to-current",
 			})
 
-			expect(vscode.window.showInformationMessage).toHaveBeenCalledWith("No changes found.")
+			expect(vscode.window.showInformationMessage).toHaveBeenCalledWith("errors.checkpoint_no_changes")
 			expect(vscode.commands.executeCommand).not.toHaveBeenCalled()
 		})
 
@@ -395,7 +395,7 @@ describe("Checkpoint functionality", () => {
 			await checkpointDiff(mockTask, {
 				ts: 4,
 				commitHash: "commit2",
-				mode: "full",
+				mode: "to-current",
 			})
 
 			expect(mockTask.enableCheckpoints).toBe(false)

+ 48 - 15
src/core/checkpoints/index.ts

@@ -302,10 +302,16 @@ export async function checkpointRestore(
 }
 
 export type CheckpointDiffOptions = {
-	ts: number
+	ts?: number
 	previousCommitHash?: string
 	commitHash: string
-	mode: "full" | "checkpoint"
+	/**
+	 * from-init: Compare from the first checkpoint to the selected checkpoint.
+	 * checkpoint: Compare the selected checkpoint to the next checkpoint.
+	 * to-current: Compare the selected checkpoint to the current workspace.
+	 * full: Compare from the first checkpoint to the current workspace.
+	 */
+	mode: "from-init" | "checkpoint" | "to-current" | "full"
 }
 
 export async function checkpointDiff(task: Task, { ts, previousCommitHash, commitHash, mode }: CheckpointDiffOptions) {
@@ -317,30 +323,57 @@ export async function checkpointDiff(task: Task, { ts, previousCommitHash, commi
 
 	TelemetryService.instance.captureCheckpointDiffed(task.taskId)
 
-	let prevHash = commitHash
-	let nextHash: string | undefined = undefined
+	let fromHash: string | undefined
+	let toHash: string | undefined
+	let title: string
 
-	if (mode !== "full") {
-		const checkpoints = task.clineMessages.filter(({ say }) => say === "checkpoint_saved").map(({ text }) => text!)
-		const idx = checkpoints.indexOf(commitHash)
-		if (idx !== -1 && idx < checkpoints.length - 1) {
-			nextHash = checkpoints[idx + 1]
-		} else {
-			nextHash = undefined
-		}
+	const checkpoints = task.clineMessages.filter(({ say }) => say === "checkpoint_saved").map(({ text }) => text!)
+
+	if (["from-init", "full"].includes(mode) && checkpoints.length < 1) {
+		vscode.window.showInformationMessage(t("common:errors.checkpoint_no_first"))
+		return
+	}
+
+	const idx = checkpoints.indexOf(commitHash)
+	switch (mode) {
+		case "checkpoint":
+			fromHash = commitHash
+			toHash = idx !== -1 && idx < checkpoints.length - 1 ? checkpoints[idx + 1] : undefined
+			title = t("common:errors.checkpoint_diff_with_next")
+			break
+		case "from-init":
+			fromHash = checkpoints[0]
+			toHash = commitHash
+			title = t("common:errors.checkpoint_diff_since_first")
+			break
+		case "to-current":
+			fromHash = commitHash
+			toHash = undefined
+			title = t("common:errors.checkpoint_diff_to_current")
+			break
+		case "full":
+			fromHash = checkpoints[0]
+			toHash = undefined
+			title = t("common:errors.checkpoint_diff_since_first")
+			break
+	}
+
+	if (!fromHash) {
+		vscode.window.showInformationMessage(t("common:errors.checkpoint_no_previous"))
+		return
 	}
 
 	try {
-		const changes = await service.getDiff({ from: prevHash, to: nextHash })
+		const changes = await service.getDiff({ from: fromHash, to: toHash })
 
 		if (!changes?.length) {
-			vscode.window.showInformationMessage("No changes found.")
+			vscode.window.showInformationMessage(t("common:errors.checkpoint_no_changes"))
 			return
 		}
 
 		await vscode.commands.executeCommand(
 			"vscode.changes",
-			mode === "full" ? "Changes since task started" : "Changes compare with next checkpoint",
+			title,
 			changes.map((change) => [
 				vscode.Uri.file(change.paths.absolute),
 				vscode.Uri.parse(`${DIFF_VIEW_URI_SCHEME}:${change.paths.relative}`).with({

+ 6 - 0
src/i18n/locales/ca/common.json

@@ -33,6 +33,12 @@
 		"checkpoint_timeout": "S'ha esgotat el temps en intentar restaurar el punt de control.",
 		"checkpoint_failed": "Ha fallat la restauració del punt de control.",
 		"git_not_installed": "Git és necessari per a la funció de punts de control. Si us plau, instal·la Git per activar els punts de control.",
+		"checkpoint_no_first": "No hi ha un primer punt de control per comparar.",
+		"checkpoint_no_previous": "No hi ha un punt de control anterior per comparar.",
+		"checkpoint_no_changes": "No s'han trobat canvis.",
+		"checkpoint_diff_with_next": "Canvis comparats amb el següent punt de control",
+		"checkpoint_diff_since_first": "Canvis des del primer punt de control",
+		"checkpoint_diff_to_current": "Canvis a l'espai de treball actual",
 		"nested_git_repos_warning": "Els punts de control estan deshabilitats perquè s'ha detectat un repositori git niat a: {{path}}. Per utilitzar punts de control, si us plau elimina o reubica aquest repositori git niat.",
 		"no_workspace": "Si us plau, obre primer una carpeta de projecte",
 		"update_support_prompt": "Ha fallat l'actualització del missatge de suport",

+ 6 - 0
src/i18n/locales/de/common.json

@@ -29,6 +29,12 @@
 		"checkpoint_timeout": "Zeitüberschreitung beim Versuch, den Checkpoint wiederherzustellen.",
 		"checkpoint_failed": "Fehler beim Wiederherstellen des Checkpoints.",
 		"git_not_installed": "Git ist für die Checkpoint-Funktion erforderlich. Bitte installiere Git, um Checkpoints zu aktivieren.",
+		"checkpoint_no_first": "Kein erster Checkpoint zum Vergleich vorhanden.",
+		"checkpoint_no_previous": "Kein vorheriger Checkpoint zum Vergleich vorhanden.",
+		"checkpoint_no_changes": "Keine Änderungen gefunden.",
+		"checkpoint_diff_with_next": "Änderungen im Vergleich zum nächsten Checkpoint",
+		"checkpoint_diff_since_first": "Änderungen seit dem ersten Checkpoint",
+		"checkpoint_diff_to_current": "Änderungen am aktuellen Arbeitsbereich",
 		"nested_git_repos_warning": "Checkpoints sind deaktiviert, da ein verschachteltes Git-Repository erkannt wurde unter: {{path}}. Um Checkpoints zu verwenden, entferne oder verschiebe bitte dieses verschachtelte Git-Repository.",
 		"no_workspace": "Bitte öffne zuerst einen Projektordner",
 		"update_support_prompt": "Fehler beim Aktualisieren der Support-Nachricht",

+ 6 - 0
src/i18n/locales/en/common.json

@@ -29,6 +29,12 @@
 		"checkpoint_timeout": "Timed out when attempting to restore checkpoint.",
 		"checkpoint_failed": "Failed to restore checkpoint.",
 		"git_not_installed": "Git is required for the checkpoints feature. Please install Git to enable checkpoints.",
+		"checkpoint_no_first": "No first checkpoint to compare.",
+		"checkpoint_no_previous": "No previous checkpoint to compare.",
+		"checkpoint_no_changes": "No changes found.",
+		"checkpoint_diff_with_next": "Changes compared with next checkpoint",
+		"checkpoint_diff_since_first": "Changes since first checkpoint",
+		"checkpoint_diff_to_current": "Changes to current workspace",
 		"nested_git_repos_warning": "Checkpoints are disabled because a nested git repository was detected at: {{path}}. To use checkpoints, please remove or relocate this nested git repository.",
 		"no_workspace": "Please open a project folder first",
 		"update_support_prompt": "Failed to update support prompt",

+ 6 - 0
src/i18n/locales/es/common.json

@@ -29,6 +29,12 @@
 		"checkpoint_timeout": "Se agotó el tiempo al intentar restaurar el punto de control.",
 		"checkpoint_failed": "Error al restaurar el punto de control.",
 		"git_not_installed": "Git es necesario para la función de puntos de control. Por favor, instala Git para activar los puntos de control.",
+		"checkpoint_no_first": "No hay primer punto de control para comparar.",
+		"checkpoint_no_previous": "No hay punto de control anterior para comparar.",
+		"checkpoint_no_changes": "No se encontraron cambios.",
+		"checkpoint_diff_with_next": "Cambios comparados con el siguiente punto de control",
+		"checkpoint_diff_since_first": "Cambios desde el primer punto de control",
+		"checkpoint_diff_to_current": "Cambios en el espacio de trabajo actual",
 		"nested_git_repos_warning": "Los puntos de control están deshabilitados porque se detectó un repositorio git anidado en: {{path}}. Para usar puntos de control, por favor elimina o reubica este repositorio git anidado.",
 		"no_workspace": "Por favor, abre primero una carpeta de proyecto",
 		"update_support_prompt": "Error al actualizar el mensaje de soporte",

+ 6 - 0
src/i18n/locales/fr/common.json

@@ -29,6 +29,12 @@
 		"checkpoint_timeout": "Expiration du délai lors de la tentative de rétablissement du checkpoint.",
 		"checkpoint_failed": "Échec du rétablissement du checkpoint.",
 		"git_not_installed": "Git est requis pour la fonctionnalité des points de contrôle. Veuillez installer Git pour activer les points de contrôle.",
+		"checkpoint_no_first": "Aucun premier point de contrôle à comparer.",
+		"checkpoint_no_previous": "Aucun point de contrôle précédent à comparer.",
+		"checkpoint_no_changes": "Aucun changement trouvé.",
+		"checkpoint_diff_with_next": "Modifications comparées au prochain point de contrôle",
+		"checkpoint_diff_since_first": "Modifications depuis le premier point de contrôle",
+		"checkpoint_diff_to_current": "Modifications de l'espace de travail actuel",
 		"nested_git_repos_warning": "Les points de contrôle sont désactivés car un dépôt git imbriqué a été détecté à : {{path}}. Pour utiliser les points de contrôle, veuillez supprimer ou déplacer ce dépôt git imbriqué.",
 		"no_workspace": "Veuillez d'abord ouvrir un espace de travail",
 		"update_support_prompt": "Erreur lors de la mise à jour du prompt de support",

+ 8 - 3
src/i18n/locales/hi/common.json

@@ -28,7 +28,13 @@
 		"could_not_open_file_generic": "फ़ाइल नहीं खोली जा सकी!",
 		"checkpoint_timeout": "चेकपॉइंट को पुनर्स्थापित करने का प्रयास करते समय टाइमआउट हो गया।",
 		"checkpoint_failed": "चेकपॉइंट पुनर्स्थापित करने में विफल।",
-		"git_not_installed": "चेकपॉइंट सुविधा के लिए Git आवश्यक है। कृपया चेकपॉइंट সক্ষম करने के लिए Git इंस्टॉल करें।",
+		"git_not_installed": "चेकपॉइंट सुविधा के लिए Git आवश्यक है। कृपया चेकपॉइंट सक्षम करने के लिए Git इंस्टॉल करें।",
+		"checkpoint_no_first": "तुलना करने के लिए कोई पहला चेकपॉइंट नहीं है।",
+		"checkpoint_no_previous": "तुलना करने के लिए कोई पिछला चेकपॉइंट नहीं है।",
+		"checkpoint_no_changes": "कोई बदलाव नहीं मिला।",
+		"checkpoint_diff_with_next": "अगले चेकपॉइंट के साथ तुलना किए गए बदलाव",
+		"checkpoint_diff_since_first": "पहले चेकपॉइंट के बाद से बदलाव",
+		"checkpoint_diff_to_current": "वर्तमान कार्यक्षेत्र में बदलाव",
 		"nested_git_repos_warning": "चेकपॉइंट अक्षम हैं क्योंकि {{path}} पर नेस्टेड git रिपॉजिटरी का पता चला है। चेकपॉइंट का उपयोग करने के लिए, कृपया इस नेस्टेड git रिपॉजिटरी को हटाएं या स्थानांतरित करें।",
 		"no_workspace": "कृपया पहले प्रोजेक्ट फ़ोल्डर खोलें",
 		"update_support_prompt": "सपोर्ट प्रॉम्प्ट अपडेट करने में विफल",
@@ -181,8 +187,7 @@
 			"getGroqApiKey": "ग्रोक एपीआई कुंजी प्राप्त करें",
 			"claudeCode": {
 				"pathLabel": "क्लाउड कोड पाथ",
-				"description": "आपके क्लाउड कोड CLI का वैकल्पिक पाथ। सेट न होने पर डिफ़ॉल्ट रूप से 'claude'।",
-				"placeholder": "डिफ़ॉल्ट: claude"
+				"description": "आपके क्लाउड कोड CLI का वैकल्पिक पाथ। सेट न होने पर डिफ़ॉल्ट रूप से 'claude'।"
 			}
 		}
 	},

+ 6 - 0
src/i18n/locales/id/common.json

@@ -29,6 +29,12 @@
 		"checkpoint_timeout": "Timeout saat mencoba memulihkan checkpoint.",
 		"checkpoint_failed": "Gagal memulihkan checkpoint.",
 		"git_not_installed": "Git diperlukan untuk fitur checkpoint. Silakan instal Git untuk mengaktifkan checkpoint.",
+		"checkpoint_no_first": "Tidak ada checkpoint pertama untuk dibandingkan.",
+		"checkpoint_no_previous": "Tidak ada checkpoint sebelumnya untuk dibandingkan.",
+		"checkpoint_no_changes": "Tidak ada perubahan yang ditemukan.",
+		"checkpoint_diff_with_next": "Perubahan dibandingkan dengan checkpoint berikutnya",
+		"checkpoint_diff_since_first": "Perubahan sejak checkpoint pertama",
+		"checkpoint_diff_to_current": "Perubahan ke ruang kerja saat ini",
 		"nested_git_repos_warning": "Checkpoint dinonaktifkan karena repositori git bersarang terdeteksi di: {{path}}. Untuk menggunakan checkpoint, silakan hapus atau pindahkan repositori git bersarang ini.",
 		"no_workspace": "Silakan buka folder proyek terlebih dahulu",
 		"update_support_prompt": "Gagal memperbarui support prompt",

+ 6 - 0
src/i18n/locales/it/common.json

@@ -29,6 +29,12 @@
 		"checkpoint_timeout": "Timeout durante il tentativo di ripristinare il checkpoint.",
 		"checkpoint_failed": "Impossibile ripristinare il checkpoint.",
 		"git_not_installed": "Git è richiesto per la funzione di checkpoint. Per favore, installa Git per abilitare i checkpoint.",
+		"checkpoint_no_first": "Nessun primo checkpoint da confrontare.",
+		"checkpoint_no_previous": "Nessun checkpoint precedente da confrontare.",
+		"checkpoint_no_changes": "Nessuna modifica trovata.",
+		"checkpoint_diff_with_next": "Modifiche confrontate con il checkpoint successivo",
+		"checkpoint_diff_since_first": "Modifiche dal primo checkpoint",
+		"checkpoint_diff_to_current": "Modifiche all'area di lavoro corrente",
 		"nested_git_repos_warning": "I checkpoint sono disabilitati perché è stato rilevato un repository git annidato in: {{path}}. Per utilizzare i checkpoint, rimuovi o sposta questo repository git annidato.",
 		"no_workspace": "Per favore, apri prima una cartella di progetto",
 		"update_support_prompt": "Errore durante l'aggiornamento del messaggio di supporto",

+ 6 - 0
src/i18n/locales/ja/common.json

@@ -29,6 +29,12 @@
 		"checkpoint_timeout": "チェックポイントの復元を試みる際にタイムアウトしました。",
 		"checkpoint_failed": "チェックポイントの復元に失敗しました。",
 		"git_not_installed": "チェックポイント機能にはGitが必要です。チェックポイントを有効にするにはGitをインストールしてください。",
+		"checkpoint_no_first": "比較する最初のチェックポイントがありません。",
+		"checkpoint_no_previous": "比較する前のチェックポイントがありません。",
+		"checkpoint_no_changes": "変更は見つかりませんでした。",
+		"checkpoint_diff_with_next": "次のチェックポイントと比較した変更点",
+		"checkpoint_diff_since_first": "最初のチェックポイントからの変更点",
+		"checkpoint_diff_to_current": "現在のワークスペースへの変更点",
 		"nested_git_repos_warning": "{{path}} でネストされたgitリポジトリが検出されたため、チェックポイントが無効になっています。チェックポイントを使用するには、このネストされたgitリポジトリを削除または移動してください。",
 		"no_workspace": "まずプロジェクトフォルダを開いてください",
 		"update_support_prompt": "サポートメッセージの更新に失敗しました",

+ 6 - 0
src/i18n/locales/ko/common.json

@@ -29,6 +29,12 @@
 		"checkpoint_timeout": "체크포인트 복원을 시도하는 중 시간 초과되었습니다.",
 		"checkpoint_failed": "체크포인트 복원에 실패했습니다.",
 		"git_not_installed": "체크포인트 기능을 사용하려면 Git이 필요합니다. 체크포인트를 활성화하려면 Git을 설치하세요.",
+		"checkpoint_no_first": "비교할 첫 번째 체크포인트가 없습니다.",
+		"checkpoint_no_previous": "비교할 이전 체크포인트가 없습니다.",
+		"checkpoint_no_changes": "변경된 내용이 없습니다.",
+		"checkpoint_diff_with_next": "다음 체크포인트와 비교한 변경 사항",
+		"checkpoint_diff_since_first": "첫 번째 체크포인트 이후의 변경 사항",
+		"checkpoint_diff_to_current": "현재 작업 공간으로의 변경 사항",
 		"nested_git_repos_warning": "{{path}}에서 중첩된 git 저장소가 감지되어 체크포인트가 비활성화되었습니다. 체크포인트를 사용하려면 이 중첩된 git 저장소를 제거하거나 이동해주세요.",
 		"no_workspace": "먼저 프로젝트 폴더를 열어주세요",
 		"update_support_prompt": "지원 프롬프트 업데이트에 실패했습니다",

+ 6 - 0
src/i18n/locales/nl/common.json

@@ -29,6 +29,12 @@
 		"checkpoint_timeout": "Time-out bij het herstellen van checkpoint.",
 		"checkpoint_failed": "Herstellen van checkpoint mislukt.",
 		"git_not_installed": "Git is vereist voor de checkpoint-functie. Installeer Git om checkpoints in te schakelen.",
+		"checkpoint_no_first": "Geen eerste checkpoint om mee te vergelijken.",
+		"checkpoint_no_previous": "Geen vorig checkpoint om mee te vergelijken.",
+		"checkpoint_no_changes": "Geen wijzigingen gevonden.",
+		"checkpoint_diff_with_next": "Wijzigingen vergeleken met volgend checkpoint",
+		"checkpoint_diff_since_first": "Wijzigingen sinds eerste checkpoint",
+		"checkpoint_diff_to_current": "Wijzigingen in huidige werkruimte",
 		"nested_git_repos_warning": "Checkpoints zijn uitgeschakeld omdat een geneste git-repository is gedetecteerd op: {{path}}. Om checkpoints te gebruiken, verwijder of verplaats deze geneste git-repository.",
 		"no_workspace": "Open eerst een projectmap",
 		"update_support_prompt": "Bijwerken van ondersteuningsprompt mislukt",

+ 6 - 0
src/i18n/locales/pl/common.json

@@ -29,6 +29,12 @@
 		"checkpoint_timeout": "Upłynął limit czasu podczas próby przywrócenia punktu kontrolnego.",
 		"checkpoint_failed": "Nie udało się przywrócić punktu kontrolnego.",
 		"git_not_installed": "Funkcja punktów kontrolnych wymaga oprogramowania Git. Zainstaluj Git, aby włączyć punkty kontrolne.",
+		"checkpoint_no_first": "Brak pierwszego punktu kontrolnego do porównania.",
+		"checkpoint_no_previous": "Brak poprzedniego punktu kontrolnego do porównania.",
+		"checkpoint_no_changes": "Nie znaleziono zmian.",
+		"checkpoint_diff_with_next": "Zmiany w porównaniu z następnym punktem kontrolnym",
+		"checkpoint_diff_since_first": "Zmiany od pierwszego punktu kontrolnego",
+		"checkpoint_diff_to_current": "Zmiany w bieżącym obszarze roboczym",
 		"nested_git_repos_warning": "Punkty kontrolne są wyłączone, ponieważ wykryto zagnieżdżone repozytorium git w: {{path}}. Aby używać punktów kontrolnych, usuń lub przenieś to zagnieżdżone repozytorium git.",
 		"no_workspace": "Najpierw otwórz folder projektu",
 		"update_support_prompt": "Nie udało się zaktualizować komunikatu wsparcia",

+ 6 - 0
src/i18n/locales/pt-BR/common.json

@@ -33,6 +33,12 @@
 		"checkpoint_timeout": "Tempo esgotado ao tentar restaurar o ponto de verificação.",
 		"checkpoint_failed": "Falha ao restaurar o ponto de verificação.",
 		"git_not_installed": "O Git é necessário para o recurso de checkpoints. Por favor, instale o Git para habilitar os checkpoints.",
+		"checkpoint_no_first": "Nenhum primeiro ponto de verificação para comparar.",
+		"checkpoint_no_previous": "Nenhum ponto de verificação anterior para comparar.",
+		"checkpoint_no_changes": "Nenhuma alteração encontrada.",
+		"checkpoint_diff_with_next": "Alterações comparadas com o próximo ponto de verificação",
+		"checkpoint_diff_since_first": "Alterações desde o primeiro ponto de verificação",
+		"checkpoint_diff_to_current": "Alterações no espaço de trabalho atual",
 		"nested_git_repos_warning": "Os checkpoints estão desabilitados porque um repositório git aninhado foi detectado em: {{path}}. Para usar checkpoints, por favor remova ou realoque este repositório git aninhado.",
 		"no_workspace": "Por favor, abra primeiro uma pasta de projeto",
 		"update_support_prompt": "Falha ao atualizar o prompt de suporte",

+ 6 - 0
src/i18n/locales/ru/common.json

@@ -29,6 +29,12 @@
 		"checkpoint_timeout": "Превышено время ожидания при попытке восстановления контрольной точки.",
 		"checkpoint_failed": "Не удалось восстановить контрольную точку.",
 		"git_not_installed": "Для функции контрольных точек требуется Git. Пожалуйста, установите Git, чтобы включить контрольные точки.",
+		"checkpoint_no_first": "Нет первой контрольной точки для сравнения.",
+		"checkpoint_no_previous": "Нет предыдущей контрольной точки для сравнения.",
+		"checkpoint_no_changes": "Изменений не найдено.",
+		"checkpoint_diff_with_next": "Изменения по сравнению со следующей контрольной точкой",
+		"checkpoint_diff_since_first": "Изменения с первой контрольной точки",
+		"checkpoint_diff_to_current": "Изменения в текущем рабочем пространстве",
 		"nested_git_repos_warning": "Контрольные точки отключены, поскольку обнаружен вложенный git-репозиторий в: {{path}}. Чтобы использовать контрольные точки, пожалуйста, удалите или переместите этот вложенный git-репозиторий.",
 		"no_workspace": "Пожалуйста, сначала откройте папку проекта",
 		"update_support_prompt": "Не удалось обновить промпт поддержки",

+ 6 - 0
src/i18n/locales/tr/common.json

@@ -29,6 +29,12 @@
 		"checkpoint_timeout": "Kontrol noktasını geri yüklemeye çalışırken zaman aşımına uğradı.",
 		"checkpoint_failed": "Kontrol noktası geri yüklenemedi.",
 		"git_not_installed": "Kontrol noktaları özelliği için Git gereklidir. Kontrol noktalarını etkinleştirmek için lütfen Git'i yükleyin.",
+		"checkpoint_no_first": "Karşılaştırılacak ilk kontrol noktası yok.",
+		"checkpoint_no_previous": "Karşılaştırılacak önceki kontrol noktası yok.",
+		"checkpoint_no_changes": "Değişiklik bulunamadı.",
+		"checkpoint_diff_with_next": "Sonraki kontrol noktasıyla karşılaştırılan değişiklikler",
+		"checkpoint_diff_since_first": "İlk kontrol noktasından bu yana yapılan değişiklikler",
+		"checkpoint_diff_to_current": "Mevcut çalışma alanındaki değişiklikler",
 		"nested_git_repos_warning": "{{path}} konumunda iç içe git deposu tespit edildiği için kontrol noktaları devre dışı bırakıldı. Kontrol noktalarını kullanmak için lütfen bu iç içe git deposunu kaldırın veya taşıyın.",
 		"no_workspace": "Lütfen önce bir proje klasörü açın",
 		"update_support_prompt": "Destek istemi güncellenemedi",

+ 6 - 0
src/i18n/locales/vi/common.json

@@ -29,6 +29,12 @@
 		"checkpoint_timeout": "Đã hết thời gian khi cố gắng khôi phục điểm kiểm tra.",
 		"checkpoint_failed": "Không thể khôi phục điểm kiểm tra.",
 		"git_not_installed": "Yêu cầu Git cho tính năng điểm kiểm tra. Vui lòng cài đặt Git để bật điểm kiểm tra.",
+		"checkpoint_no_first": "Không có điểm kiểm tra đầu tiên để so sánh.",
+		"checkpoint_no_previous": "Không có điểm kiểm tra trước đó để so sánh.",
+		"checkpoint_no_changes": "Không tìm thấy thay đổi.",
+		"checkpoint_diff_with_next": "Các thay đổi được so sánh với điểm kiểm tra tiếp theo",
+		"checkpoint_diff_since_first": "Các thay đổi kể từ điểm kiểm tra đầu tiên",
+		"checkpoint_diff_to_current": "Các thay đổi đối với không gian làm việc hiện tại",
 		"nested_git_repos_warning": "Điểm kiểm tra bị vô hiệu hóa vì phát hiện kho git lồng nhau tại: {{path}}. Để sử dụng điểm kiểm tra, vui lòng xóa hoặc di chuyển kho git lồng nhau này.",
 		"no_workspace": "Vui lòng mở thư mục dự án trước",
 		"update_support_prompt": "Không thể cập nhật lời nhắc hỗ trợ",

+ 7 - 1
src/i18n/locales/zh-CN/common.json

@@ -33,7 +33,13 @@
 		"could_not_open_file_generic": "无法打开文件!",
 		"checkpoint_timeout": "尝试恢复检查点时超时。",
 		"checkpoint_failed": "恢复检查点失败。",
-		"git_not_installed": "存档点功能需要 Git。请安装 Git 以启用存档点。",
+		"git_not_installed": "检查点功能需要 Git。请安装 Git 以启用检查点。",
+		"checkpoint_no_first": "没有第一个存档点可供比较。",
+		"checkpoint_no_previous": "没有上一个存档点可供比较。",
+		"checkpoint_no_changes": "未发现任何更改。",
+		"checkpoint_diff_with_next": "与下一个存档点比较的更改",
+		"checkpoint_diff_since_first": "自第一个存档点以来的更改",
+		"checkpoint_diff_to_current": "对当前工作区的更改",
 		"nested_git_repos_warning": "存档点已禁用,因为在 {{path}} 检测到嵌套的 git 仓库。要使用存档点,请移除或重新定位此嵌套的 git 仓库。",
 		"no_workspace": "请先打开项目文件夹",
 		"update_support_prompt": "更新支持消息失败",

+ 6 - 0
src/i18n/locales/zh-TW/common.json

@@ -29,6 +29,12 @@
 		"checkpoint_timeout": "嘗試恢復檢查點時超時。",
 		"checkpoint_failed": "恢復檢查點失敗。",
 		"git_not_installed": "存檔點功能需要 Git。請安裝 Git 以啟用存檔點。",
+		"checkpoint_no_first": "沒有第一個存檔點可供比較。",
+		"checkpoint_no_previous": "沒有上一個存檔點可供比較。",
+		"checkpoint_no_changes": "未發現任何變更。",
+		"checkpoint_diff_with_next": "與下一個存檔點比較的變更",
+		"checkpoint_diff_since_first": "自第一個存檔點以來的變更",
+		"checkpoint_diff_to_current": "對目前工作區的變更",
 		"nested_git_repos_warning": "存檔點已停用,因為在 {{path}} 偵測到巢狀的 git 儲存庫。要使用存檔點,請移除或重新配置此巢狀的 git 儲存庫。",
 		"no_workspace": "請先開啟專案資料夾",
 		"update_support_prompt": "更新支援訊息失敗",

+ 2 - 2
src/shared/WebviewMessage.ts

@@ -308,10 +308,10 @@ export interface WebviewMessage {
 }
 
 export const checkoutDiffPayloadSchema = z.object({
-	ts: z.number(),
+	ts: z.number().optional(),
 	previousCommitHash: z.string().optional(),
 	commitHash: z.string(),
-	mode: z.enum(["full", "checkpoint"]),
+	mode: z.enum(["full", "checkpoint", "from-init", "to-current"]),
 })
 
 export type CheckpointDiffPayload = z.infer<typeof checkoutDiffPayloadSchema>

+ 1 - 0
webview-ui/src/components/chat/ChatRow.tsx

@@ -75,6 +75,7 @@ interface ChatRowProps {
 	onFollowUpUnmount?: () => void
 	isFollowUpAnswered?: boolean
 	editable?: boolean
+	hasCheckpoint?: boolean
 }
 
 // eslint-disable-next-line @typescript-eslint/no-empty-object-type

+ 2 - 0
webview-ui/src/components/chat/ChatView.tsx

@@ -1517,6 +1517,7 @@ const ChatViewComponent: React.ForwardRefRenderFunction<ChatViewRef, ChatViewPro
 					/>
 				)
 			}
+			const hasCheckpoint = modifiedMessages.some((message) => message.say === "checkpoint_saved")
 
 			// regular message
 			return (
@@ -1551,6 +1552,7 @@ const ChatViewComponent: React.ForwardRefRenderFunction<ChatViewRef, ChatViewPro
 							return tool.tool === "updateTodoList" && enableButtons && !!primaryButtonText
 						})()
 					}
+					hasCheckpoint={hasCheckpoint}
 				/>
 			)
 		},

+ 88 - 19
webview-ui/src/components/chat/checkpoints/CheckpointMenu.tsx

@@ -14,25 +14,43 @@ type CheckpointMenuBaseProps = {
 	checkpoint: Checkpoint
 }
 type CheckpointMenuControlledProps = {
-	open: boolean
 	onOpenChange: (open: boolean) => void
 }
 type CheckpointMenuUncontrolledProps = {
-	open?: undefined
 	onOpenChange?: undefined
 }
 type CheckpointMenuProps = CheckpointMenuBaseProps & (CheckpointMenuControlledProps | CheckpointMenuUncontrolledProps)
 
-export const CheckpointMenu = ({ ts, commitHash, checkpoint, open, onOpenChange }: CheckpointMenuProps) => {
+export const CheckpointMenu = ({ ts, commitHash, checkpoint, onOpenChange }: CheckpointMenuProps) => {
 	const { t } = useTranslation()
-	const [internalOpen, setInternalOpen] = useState(false)
-	const [isConfirming, setIsConfirming] = useState(false)
+	const [internalRestoreOpen, setInternalRestoreOpen] = useState(false)
+	const [restoreConfirming, setRestoreConfirming] = useState(false)
+	const [internalMoreOpen, setInternalMoreOpen] = useState(false)
 	const portalContainer = useRooPortal("roo-portal")
 
 	const previousCommitHash = checkpoint?.from
 
-	const isOpen = open ?? internalOpen
-	const setOpen = onOpenChange ?? setInternalOpen
+	const restoreOpen = internalRestoreOpen
+	const moreOpen = internalMoreOpen
+	const setRestoreOpen = useCallback(
+		(open: boolean) => {
+			setInternalRestoreOpen(open)
+			if (onOpenChange) {
+				onOpenChange(open)
+			}
+		},
+		[onOpenChange],
+	)
+
+	const setMoreOpen = useCallback(
+		(open: boolean) => {
+			setInternalMoreOpen(open)
+			if (onOpenChange) {
+				onOpenChange(open)
+			}
+		},
+		[onOpenChange],
+	)
 
 	const onCheckpointDiff = useCallback(() => {
 		vscode.postMessage({
@@ -41,24 +59,38 @@ export const CheckpointMenu = ({ ts, commitHash, checkpoint, open, onOpenChange
 		})
 	}, [ts, previousCommitHash, commitHash])
 
+	const onDiffFromInit = useCallback(() => {
+		vscode.postMessage({
+			type: "checkpointDiff",
+			payload: { ts, commitHash, mode: "from-init" },
+		})
+	}, [ts, commitHash])
+
+	const onDiffWithCurrent = useCallback(() => {
+		vscode.postMessage({
+			type: "checkpointDiff",
+			payload: { ts, commitHash, mode: "to-current" },
+		})
+	}, [ts, commitHash])
+
 	const onPreview = useCallback(() => {
 		vscode.postMessage({ type: "checkpointRestore", payload: { ts, commitHash, mode: "preview" } })
-		setOpen(false)
-	}, [ts, commitHash, setOpen])
+		setRestoreOpen(false)
+	}, [ts, commitHash, setRestoreOpen])
 
 	const onRestore = useCallback(() => {
 		vscode.postMessage({ type: "checkpointRestore", payload: { ts, commitHash, mode: "restore" } })
-		setOpen(false)
-	}, [ts, commitHash, setOpen])
+		setRestoreOpen(false)
+	}, [ts, commitHash, setRestoreOpen])
 
 	const handleOpenChange = useCallback(
 		(open: boolean) => {
-			setOpen(open)
+			setRestoreOpen(open)
 			if (!open) {
-				setIsConfirming(false)
+				setRestoreConfirming(false)
 			}
 		},
-		[setOpen],
+		[setRestoreOpen],
 	)
 
 	return (
@@ -68,7 +100,13 @@ export const CheckpointMenu = ({ ts, commitHash, checkpoint, open, onOpenChange
 					<span className="codicon codicon-diff-single" />
 				</Button>
 			</StandardTooltip>
-			<Popover open={isOpen} onOpenChange={handleOpenChange}>
+			<Popover
+				open={restoreOpen}
+				onOpenChange={(open) => {
+					handleOpenChange(open)
+					setRestoreConfirming(false)
+				}}
+				data-testid="restore-popover">
 				<StandardTooltip content={t("chat:checkpoint.menu.restore")}>
 					<PopoverTrigger asChild>
 						<Button variant="ghost" size="icon" aria-label={t("chat:checkpoint.menu.restore")}>
@@ -87,10 +125,10 @@ export const CheckpointMenu = ({ ts, commitHash, checkpoint, open, onOpenChange
 							</div>
 						</div>
 						<div className="flex flex-col gap-1 group hover:text-foreground">
-							{!isConfirming ? (
+							{!restoreConfirming ? (
 								<Button
 									variant="secondary"
-									onClick={() => setIsConfirming(true)}
+									onClick={() => setRestoreConfirming(true)}
 									data-testid="restore-files-and-task-btn">
 									{t("chat:checkpoint.menu.restoreFilesAndTask")}
 								</Button>
@@ -106,7 +144,7 @@ export const CheckpointMenu = ({ ts, commitHash, checkpoint, open, onOpenChange
 											<div>{t("chat:checkpoint.menu.confirm")}</div>
 										</div>
 									</Button>
-									<Button variant="secondary" onClick={() => setIsConfirming(false)}>
+									<Button variant="secondary" onClick={() => setRestoreConfirming(false)}>
 										<div className="flex flex-row gap-1">
 											<Cross2Icon />
 											<div>{t("chat:checkpoint.menu.cancel")}</div>
@@ -114,7 +152,7 @@ export const CheckpointMenu = ({ ts, commitHash, checkpoint, open, onOpenChange
 									</Button>
 								</>
 							)}
-							{isConfirming ? (
+							{restoreConfirming ? (
 								<div data-testid="checkpoint-confirm-warning" className="text-destructive font-bold">
 									{t("chat:checkpoint.menu.cannotUndo")}
 								</div>
@@ -127,6 +165,37 @@ export const CheckpointMenu = ({ ts, commitHash, checkpoint, open, onOpenChange
 					</div>
 				</PopoverContent>
 			</Popover>
+			<Popover open={moreOpen} onOpenChange={(open) => setMoreOpen(open)} data-testid="more-popover">
+				<StandardTooltip content={t("chat:task.seeMore")}>
+					<PopoverTrigger asChild>
+						<Button variant="ghost" size="icon" aria-label={t("chat:checkpoint.menu.more")}>
+							<span className="codicon codicon-kebab-vertical" />
+						</Button>
+					</PopoverTrigger>
+				</StandardTooltip>
+				<PopoverContent align="end" container={portalContainer}>
+					<div className="flex flex-col gap-2">
+						<Button
+							variant="secondary"
+							onClick={() => {
+								onDiffFromInit()
+								setMoreOpen(false)
+							}}>
+							<span className="codicon codicon-versions mr-2" />
+							{t("chat:checkpoint.menu.viewDiffFromInit")}
+						</Button>
+						<Button
+							variant="secondary"
+							onClick={() => {
+								onDiffWithCurrent()
+								setMoreOpen(false)
+							}}>
+							<span className="codicon codicon-diff mr-2" />
+							{t("chat:checkpoint.menu.viewDiffWithCurrent")}
+						</Button>
+					</div>
+				</PopoverContent>
+			</Popover>
 		</div>
 	)
 }

+ 2 - 2
webview-ui/src/components/chat/checkpoints/CheckpointSaved.tsx

@@ -85,9 +85,9 @@ export const CheckpointSaved = ({ checkpoint, currentHash, ...props }: Checkpoin
 				data-testid="checkpoint-menu-container"
 				className={cn("h-4 -mt-2", menuVisible ? "block" : "hidden group-hover:block")}>
 				<CheckpointMenu
-					{...props}
+					ts={props.ts}
+					commitHash={props.commitHash}
 					checkpoint={metadata}
-					open={isPopoverOpen}
 					onOpenChange={handlePopoverOpenChange}
 				/>
 			</div>

+ 10 - 7
webview-ui/src/components/chat/checkpoints/__tests__/CheckpointSaved.spec.tsx

@@ -1,14 +1,20 @@
 // npx vitest run src/components/chat/checkpoints/__tests__/CheckpointSaved.spec.tsx
 
+// Capture onOpenChange from Popover to control open/close in tests
+let lastOnOpenChange: ((open: boolean) => void) | undefined
+
 vi.mock("@/components/ui", () => {
 	// Minimal UI primitives to ensure deterministic behavior in tests
 	return {
 		Button: ({ children, ...rest }: any) => <button {...rest}>{children}</button>,
 		StandardTooltip: ({ children }: any) => <>{children}</>,
-		Popover: ({ children, onOpenChange, open }: any) => {
-			lastOnOpenChange = onOpenChange
+		Popover: (props: any) => {
+			const { children, onOpenChange, open, ...rest } = props
+			if (rest["data-testid"] === "restore-popover") {
+				lastOnOpenChange = onOpenChange
+			}
 			return (
-				<div data-testid="popover-root" data-open={open}>
+				<div data-testid={rest["data-testid"]} data-open={open}>
 					{children}
 				</div>
 			)
@@ -23,9 +29,6 @@ import React from "react"
 import userEvent from "@testing-library/user-event"
 import { CheckpointSaved } from "../CheckpointSaved"
 
-// Capture onOpenChange from Popover to control open/close in tests
-let lastOnOpenChange: ((open: boolean) => void) | undefined
-
 const waitForOpenHandler = async () => {
 	await waitFor(() => {
 		// ensure Popover mock captured the onOpenChange handler before using it
@@ -101,7 +104,7 @@ describe("CheckpointSaved popover visibility", () => {
 	it("closes popover after preview and after confirm restore", async () => {
 		const { getByTestId } = render(<CheckpointSaved {...baseProps} />)
 
-		const popoverRoot = () => getByTestId("popover-root")
+		const popoverRoot = () => getByTestId("restore-popover")
 		const menuContainer = () => getByTestId("checkpoint-menu-container")
 
 		// Open

+ 3 - 0
webview-ui/src/i18n/locales/ca/chat.json

@@ -148,6 +148,9 @@
 		"initializingWarning": "Encara s'està inicialitzant el punt de control... Si això triga massa, pots desactivar els punts de control a la <settingsLink>configuració</settingsLink> i reiniciar la teva tasca.",
 		"menu": {
 			"viewDiff": "Veure diferències",
+			"more": "Més opcions",
+			"viewDiffFromInit": "Veure tots els canvis",
+			"viewDiffWithCurrent": "Veure els canvis des d'aquest punt de control",
 			"restore": "Restaurar punt de control",
 			"restoreFiles": "Restaurar arxius",
 			"restoreFilesDescription": "Restaura els arxius del teu projecte a una instantània presa en aquest punt.",

+ 3 - 0
webview-ui/src/i18n/locales/de/chat.json

@@ -148,6 +148,9 @@
 		"initializingWarning": "Checkpoint wird noch initialisiert... Falls dies zu lange dauert, kannst du Checkpoints in den <settingsLink>Einstellungen</settingsLink> deaktivieren und deine Aufgabe neu starten.",
 		"menu": {
 			"viewDiff": "Unterschiede anzeigen",
+			"more": "Weitere Optionen",
+			"viewDiffFromInit": "Alle Änderungen anzeigen",
+			"viewDiffWithCurrent": "Änderungen seit diesem Checkpoint anzeigen",
 			"restore": "Checkpoint wiederherstellen",
 			"restoreFiles": "Dateien wiederherstellen",
 			"restoreFilesDescription": "Stellt die Dateien deines Projekts auf einen Snapshot zurück, der an diesem Punkt erstellt wurde.",

+ 4 - 1
webview-ui/src/i18n/locales/en/chat.json

@@ -154,6 +154,8 @@
 		"initializingWarning": "Still initializing checkpoint... If this takes too long, you can disable checkpoints in <settingsLink>settings</settingsLink> and restart your task.",
 		"menu": {
 			"viewDiff": "View Diff",
+			"viewDiffFromInit": "View All Changes",
+			"viewDiffWithCurrent": "View Changes Since This Checkpoint",
 			"restore": "Restore Checkpoint",
 			"restoreFiles": "Restore Files",
 			"restoreFilesDescription": "Restores your project's files back to a snapshot taken at this point.",
@@ -161,7 +163,8 @@
 			"confirm": "Confirm",
 			"cancel": "Cancel",
 			"cannotUndo": "This action cannot be undone.",
-			"restoreFilesAndTaskDescription": "Restores your project's files back to a snapshot taken at this point and deletes all messages after this point."
+			"restoreFilesAndTaskDescription": "Restores your project's files back to a snapshot taken at this point and deletes all messages after this point.",
+			"more": "More options"
 		},
 		"current": "Current"
 	},

+ 3 - 0
webview-ui/src/i18n/locales/es/chat.json

@@ -148,6 +148,9 @@
 		"initializingWarning": "Todavía inicializando el punto de control... Si esto tarda demasiado, puedes desactivar los puntos de control en la <settingsLink>configuración</settingsLink> y reiniciar tu tarea.",
 		"menu": {
 			"viewDiff": "Ver diferencias",
+			"more": "Más opciones",
+			"viewDiffFromInit": "Ver todos los cambios",
+			"viewDiffWithCurrent": "Ver cambios desde este punto de control",
 			"restore": "Restaurar punto de control",
 			"restoreFiles": "Restaurar archivos",
 			"restoreFilesDescription": "Restaura los archivos de tu proyecto a una instantánea tomada en este punto.",

+ 3 - 0
webview-ui/src/i18n/locales/fr/chat.json

@@ -148,6 +148,9 @@
 		"initializingWarning": "Initialisation du point de contrôle en cours... Si cela prend trop de temps, tu peux désactiver les points de contrôle dans les <settingsLink>paramètres</settingsLink> et redémarrer ta tâche.",
 		"menu": {
 			"viewDiff": "Voir les différences",
+			"more": "Plus d'options",
+			"viewDiffFromInit": "Voir toutes les modifications",
+			"viewDiffWithCurrent": "Voir les modifications depuis ce point de contrôle",
 			"restore": "Restaurer le point de contrôle",
 			"restoreFiles": "Restaurer les fichiers",
 			"restoreFilesDescription": "Restaure les fichiers de votre projet à un instantané pris à ce moment.",

+ 3 - 0
webview-ui/src/i18n/locales/hi/chat.json

@@ -148,6 +148,9 @@
 		"initializingWarning": "चेकपॉइंट अभी भी आरंभ हो रहा है... अगर यह बहुत समय ले रहा है, तो आप <settingsLink>सेटिंग्स</settingsLink> में चेकपॉइंट को अक्षम कर सकते हैं और अपने कार्य को पुनः आरंभ कर सकते हैं।",
 		"menu": {
 			"viewDiff": "अंतर देखें",
+			"more": "अधिक विकल्प",
+			"viewDiffFromInit": "सभी परिवर्तन देखें",
+			"viewDiffWithCurrent": "इस चेकपॉइंट के बाद से परिवर्तन देखें",
 			"restore": "चेकपॉइंट पुनर्स्थापित करें",
 			"restoreFiles": "फ़ाइलें पुनर्स्थापित करें",
 			"restoreFilesDescription": "आपके प्रोजेक्ट की फ़ाइलों को इस बिंदु पर लिए गए स्नैपशॉट पर पुनर्स्थापित करता है।",

+ 3 - 0
webview-ui/src/i18n/locales/id/chat.json

@@ -157,6 +157,9 @@
 		"initializingWarning": "Masih menginisialisasi checkpoint... Jika ini terlalu lama, kamu bisa menonaktifkan checkpoint di <settingsLink>pengaturan</settingsLink> dan restart tugas.",
 		"menu": {
 			"viewDiff": "Lihat Diff",
+			"more": "Opsi lainnya",
+			"viewDiffFromInit": "Lihat Semua Perubahan",
+			"viewDiffWithCurrent": "Lihat Perubahan Sejak Checkpoint Ini",
 			"restore": "Pulihkan Checkpoint",
 			"restoreFiles": "Pulihkan File",
 			"restoreFilesDescription": "Mengembalikan file proyek kamu ke snapshot yang diambil pada titik ini.",

+ 3 - 0
webview-ui/src/i18n/locales/it/chat.json

@@ -151,6 +151,9 @@
 		"initializingWarning": "Inizializzazione del checkpoint in corso... Se questa operazione richiede troppo tempo, puoi disattivare i checkpoint nelle <settingsLink>impostazioni</settingsLink> e riavviare l'attività.",
 		"menu": {
 			"viewDiff": "Visualizza differenze",
+			"more": "Altre opzioni",
+			"viewDiffFromInit": "Visualizza tutte le modifiche",
+			"viewDiffWithCurrent": "Visualizza le modifiche da questo checkpoint",
 			"restore": "Ripristina checkpoint",
 			"restoreFiles": "Ripristina file",
 			"restoreFilesDescription": "Ripristina i file del tuo progetto a uno snapshot catturato in questo punto.",

+ 3 - 0
webview-ui/src/i18n/locales/ja/chat.json

@@ -148,6 +148,9 @@
 		"initializingWarning": "チェックポイントの初期化中... 時間がかかりすぎる場合は、<settingsLink>設定</settingsLink>でチェックポイントを無効にしてタスクを再開できます。",
 		"menu": {
 			"viewDiff": "差分を表示",
+			"more": "その他のオプション",
+			"viewDiffFromInit": "すべての変更を表示",
+			"viewDiffWithCurrent": "このチェックポイント以降の変更を表示",
 			"restore": "チェックポイントを復元",
 			"restoreFiles": "ファイルを復元",
 			"restoreFilesDescription": "この時点で撮影されたスナップショットにプロジェクトのファイルを復元します。",

+ 3 - 0
webview-ui/src/i18n/locales/ko/chat.json

@@ -148,6 +148,9 @@
 		"initializingWarning": "체크포인트 초기화 중... 시간이 너무 오래 걸리면 <settingsLink>설정</settingsLink>에서 체크포인트를 비활성화하고 작업을 다시 시작할 수 있습니다.",
 		"menu": {
 			"viewDiff": "차이점 보기",
+			"more": "더 많은 옵션",
+			"viewDiffFromInit": "모든 변경 사항 보기",
+			"viewDiffWithCurrent": "이 체크포인트 이후 변경 사항 보기",
 			"restore": "체크포인트 복원",
 			"restoreFiles": "파일 복원",
 			"restoreFilesDescription": "프로젝트 파일을 이 시점에 찍힌 스냅샷으로 복원합니다.",

+ 3 - 0
webview-ui/src/i18n/locales/nl/chat.json

@@ -143,6 +143,9 @@
 		"initializingWarning": "Checkpoint wordt nog steeds geïnitialiseerd... Als dit te lang duurt, kun je checkpoints uitschakelen in de <settingsLink>instellingen</settingsLink> en je taak opnieuw starten.",
 		"menu": {
 			"viewDiff": "Bekijk verschil",
+			"more": "Meer opties",
+			"viewDiffFromInit": "Bekijk alle wijzigingen",
+			"viewDiffWithCurrent": "Bekijk wijzigingen sinds dit checkpoint",
 			"restore": "Herstel checkpoint",
 			"restoreFiles": "Bestanden herstellen",
 			"restoreFilesDescription": "Herstelt de bestanden van je project naar een momentopname die op dit punt is gemaakt.",

+ 3 - 0
webview-ui/src/i18n/locales/pl/chat.json

@@ -148,6 +148,9 @@
 		"initializingWarning": "Trwa inicjalizacja punktu kontrolnego... Jeśli to trwa zbyt długo, możesz wyłączyć punkty kontrolne w <settingsLink>ustawieniach</settingsLink> i uruchomić zadanie ponownie.",
 		"menu": {
 			"viewDiff": "Zobacz różnice",
+			"more": "Więcej opcji",
+			"viewDiffFromInit": "Zobacz wszystkie zmiany",
+			"viewDiffWithCurrent": "Zobacz zmiany od tego punktu kontrolnego",
 			"restore": "Przywróć punkt kontrolny",
 			"restoreFiles": "Przywróć pliki",
 			"restoreFilesDescription": "Przywraca pliki Twojego projektu do zrzutu wykonanego w tym punkcie.",

+ 3 - 0
webview-ui/src/i18n/locales/pt-BR/chat.json

@@ -148,6 +148,9 @@
 		"initializingWarning": "Ainda inicializando ponto de verificação... Se isso demorar muito, você pode desativar os pontos de verificação nas <settingsLink>configurações</settingsLink> e reiniciar sua tarefa.",
 		"menu": {
 			"viewDiff": "Ver diferenças",
+			"more": "Mais opções",
+			"viewDiffFromInit": "Ver todas as alterações",
+			"viewDiffWithCurrent": "Ver alterações desde este ponto de verificação",
 			"restore": "Restaurar ponto de verificação",
 			"restoreFiles": "Restaurar arquivos",
 			"restoreFilesDescription": "Restaura os arquivos do seu projeto para um snapshot feito neste ponto.",

+ 3 - 0
webview-ui/src/i18n/locales/ru/chat.json

@@ -143,6 +143,9 @@
 		"initializingWarning": "Точка сохранения еще инициализируется... Если это занимает слишком много времени, вы можете отключить точки сохранения в <settingsLink>настройках</settingsLink> и перезапустить задачу.",
 		"menu": {
 			"viewDiff": "Просмотреть различия",
+			"more": "Больше опций",
+			"viewDiffFromInit": "Просмотреть все изменения",
+			"viewDiffWithCurrent": "Просмотреть изменения с этой точки сохранения",
 			"restore": "Восстановить точку сохранения",
 			"restoreFiles": "Восстановить файлы",
 			"restoreFilesDescription": "Восстанавливает файлы вашего проекта до состояния на момент этой точки.",

+ 3 - 0
webview-ui/src/i18n/locales/tr/chat.json

@@ -148,6 +148,9 @@
 		"initializingWarning": "Kontrol noktası hala başlatılıyor... Bu çok uzun sürerse, <settingsLink>ayarlar</settingsLink> bölümünden kontrol noktalarını devre dışı bırakabilir ve görevinizi yeniden başlatabilirsiniz.",
 		"menu": {
 			"viewDiff": "Farkları Görüntüle",
+			"more": "Daha fazla seçenek",
+			"viewDiffFromInit": "Tüm Değişiklikleri Görüntüle",
+			"viewDiffWithCurrent": "Bu Kontrol Noktasından Bu Yana Değişiklikleri Görüntüle",
 			"restore": "Kontrol Noktasını Geri Yükle",
 			"restoreFiles": "Dosyaları Geri Yükle",
 			"restoreFilesDescription": "Projenizin dosyalarını bu noktada alınan bir anlık görüntüye geri yükler.",

+ 3 - 0
webview-ui/src/i18n/locales/vi/chat.json

@@ -148,6 +148,9 @@
 		"initializingWarning": "Đang khởi tạo điểm kiểm tra... Nếu quá trình này mất quá nhiều thời gian, bạn có thể vô hiệu hóa điểm kiểm tra trong <settingsLink>cài đặt</settingsLink> và khởi động lại tác vụ của bạn.",
 		"menu": {
 			"viewDiff": "Xem khác biệt",
+			"more": "Thêm tùy chọn",
+			"viewDiffFromInit": "Xem tất cả các thay đổi",
+			"viewDiffWithCurrent": "Xem các thay đổi kể từ điểm kiểm tra này",
 			"restore": "Khôi phục điểm kiểm tra",
 			"restoreFiles": "Khôi phục tệp",
 			"restoreFilesDescription": "Khôi phục các tệp dự án của bạn về bản chụp được thực hiện tại thời điểm này.",

+ 3 - 0
webview-ui/src/i18n/locales/zh-CN/chat.json

@@ -148,6 +148,9 @@
 		"initializingWarning": "正在初始化检查点...如果耗时过长,你可以在<settingsLink>设置</settingsLink>中禁用检查点并重新启动任务。",
 		"menu": {
 			"viewDiff": "查看差异",
+			"more": "更多选项",
+			"viewDiffFromInit": "查看所有更改",
+			"viewDiffWithCurrent": "查看自此检查点以来的更改",
 			"restore": "恢复检查点",
 			"restoreFiles": "恢复文件",
 			"restoreFilesDescription": "将项目文件恢复到此检查点状态",

+ 3 - 0
webview-ui/src/i18n/locales/zh-TW/chat.json

@@ -154,6 +154,9 @@
 		"initializingWarning": "正在初始化檢查點... 如果耗時過長,您可以在<settingsLink>設定</settingsLink>中停用檢查點並重新啟動工作。",
 		"menu": {
 			"viewDiff": "檢視差異",
+			"more": "更多選項",
+			"viewDiffFromInit": "檢視所有變更",
+			"viewDiffWithCurrent": "檢視自此檢查點以來的變更",
 			"restore": "還原檢查點",
 			"restoreFiles": "還原檔案",
 			"restoreFilesDescription": "將您的專案檔案還原到此時的快照。",