Browse Source

Merge branch 'main' into support_project_mcp

aheizi 11 months ago
parent
commit
d3a09787d8
49 changed files with 1697 additions and 128 deletions
  1. 24 14
      .roomodes
  2. 30 29
      webview-ui/src/components/chat/AutoApproveMenu.tsx
  3. 18 17
      webview-ui/src/components/chat/ChatTextArea.tsx
  4. 6 9
      webview-ui/src/components/chat/ChatView.tsx
  5. 3 1
      webview-ui/src/components/history/CopyButton.tsx
  6. 6 6
      webview-ui/src/components/history/DeleteTaskDialog.tsx
  7. 18 13
      webview-ui/src/components/history/ExportButton.tsx
  8. 13 8
      webview-ui/src/components/history/HistoryPreview.tsx
  9. 14 12
      webview-ui/src/components/history/HistoryView.tsx
  10. 1 0
      webview-ui/src/components/history/__tests__/HistoryView.test.tsx
  11. 63 0
      webview-ui/src/i18n/__mocks__/TranslationContext.tsx
  12. 54 1
      webview-ui/src/i18n/locales/ar/chat.json
  13. 25 0
      webview-ui/src/i18n/locales/ar/history.json
  14. 54 1
      webview-ui/src/i18n/locales/ca/chat.json
  15. 25 0
      webview-ui/src/i18n/locales/ca/history.json
  16. 54 1
      webview-ui/src/i18n/locales/cs/chat.json
  17. 25 0
      webview-ui/src/i18n/locales/cs/history.json
  18. 54 1
      webview-ui/src/i18n/locales/de/chat.json
  19. 25 0
      webview-ui/src/i18n/locales/de/history.json
  20. 54 1
      webview-ui/src/i18n/locales/en/chat.json
  21. 25 0
      webview-ui/src/i18n/locales/en/history.json
  22. 54 1
      webview-ui/src/i18n/locales/es/chat.json
  23. 25 0
      webview-ui/src/i18n/locales/es/history.json
  24. 54 1
      webview-ui/src/i18n/locales/fr/chat.json
  25. 25 0
      webview-ui/src/i18n/locales/fr/history.json
  26. 54 1
      webview-ui/src/i18n/locales/hi/chat.json
  27. 25 0
      webview-ui/src/i18n/locales/hi/history.json
  28. 54 1
      webview-ui/src/i18n/locales/hu/chat.json
  29. 25 0
      webview-ui/src/i18n/locales/hu/history.json
  30. 54 1
      webview-ui/src/i18n/locales/it/chat.json
  31. 25 0
      webview-ui/src/i18n/locales/it/history.json
  32. 54 1
      webview-ui/src/i18n/locales/ja/chat.json
  33. 25 0
      webview-ui/src/i18n/locales/ja/history.json
  34. 54 1
      webview-ui/src/i18n/locales/ko/chat.json
  35. 25 0
      webview-ui/src/i18n/locales/ko/history.json
  36. 54 1
      webview-ui/src/i18n/locales/pl/chat.json
  37. 25 0
      webview-ui/src/i18n/locales/pl/history.json
  38. 54 1
      webview-ui/src/i18n/locales/pt-BR/chat.json
  39. 25 0
      webview-ui/src/i18n/locales/pt-BR/history.json
  40. 54 1
      webview-ui/src/i18n/locales/pt/chat.json
  41. 25 0
      webview-ui/src/i18n/locales/pt/history.json
  42. 54 1
      webview-ui/src/i18n/locales/ru/chat.json
  43. 25 0
      webview-ui/src/i18n/locales/ru/history.json
  44. 54 1
      webview-ui/src/i18n/locales/tr/chat.json
  45. 25 0
      webview-ui/src/i18n/locales/tr/history.json
  46. 54 1
      webview-ui/src/i18n/locales/zh-CN/chat.json
  47. 25 0
      webview-ui/src/i18n/locales/zh-CN/history.json
  48. 54 1
      webview-ui/src/i18n/locales/zh-TW/chat.json
  49. 25 0
      webview-ui/src/i18n/locales/zh-TW/history.json

+ 24 - 14
.roomodes

@@ -1,15 +1,5 @@
 {
   "customModes": [
-    {
-      "slug": "translate",
-      "name": "Translate",
-      "roleDefinition": "You are Roo, a linguistic specialist focused on translating and managing localization files. Your responsibility is to help maintain and update translation files for the application, ensuring consistency and accuracy across all language resources.",
-      "groups": [
-        "read",
-        ["edit", { "fileRegex": "src/i18n/locales/", "description": "Translation files only" }]
-      ],
-      "customInstructions": "When translating content:\n- Maintain consistent terminology across all translations\n- Respect the JSON structure of translation files\n- Consider context when translating UI strings\n- Watch for placeholders (like {{variable}}) and preserve them in translations\n- Be mindful of text length in UI elements when translating to languages that might require more characters\n- If you need context for a translation, use read_file to examine the components using these strings"
-    },
     {
       "slug": "test",
       "name": "Test",
@@ -18,12 +8,32 @@
         "read",
         "browser",
         "command",
-        ["edit", {
-          "fileRegex": "(__tests__/.*|__mocks__/.*|\\.test\\.(ts|tsx|js|jsx)$|/test/.*|jest\\.config\\.(js|ts)$)",
-          "description": "Test files, mocks, and Jest configuration"
-        }]
+        [
+          "edit",
+          {
+            "fileRegex": "(__tests__/.*|__mocks__/.*|\\.test\\.(ts|tsx|js|jsx)$|/test/.*|jest\\.config\\.(js|ts)$)",
+            "description": "Test files, mocks, and Jest configuration"
+          }
+        ]
       ],
       "customInstructions": "When writing tests:\n- Always use describe/it blocks for clear test organization\n- Include meaningful test descriptions\n- Use beforeEach/afterEach for proper test isolation\n- Implement proper error cases\n- Add JSDoc comments for complex test scenarios\n- Ensure mocks are properly typed\n- Verify both positive and negative test cases"
+    },
+    {
+      "slug": "translate",
+      "name": "Translate",
+      "roleDefinition": "You are Roo, a linguistic specialist focused on translating and managing localization files. Your responsibility is to help maintain and update translation files for the application, ensuring consistency and accuracy across all language resources.",
+      "customInstructions": "When internationalizing and translating content:\n\n# Translation Style and Tone\n- Maintain a direct and concise style that mirrors the tone of the original text\n- Carefully account for colloquialisms and idiomatic expressions in both source and target languages\n- Aim for culturally relevant and meaningful translations rather than literal translations\n- Adapt the formality level to match the original content (whether formal or informal)\n- Preserve the personality and voice of the original content\n- Use natural-sounding language that feels native to speakers of the target language\n- Don't translate the word \"token\" as it means something specific in English that all languages will understand\n\n# Technical Implementation\n- Use namespaces to organize translations logically\n- Handle pluralization using i18next's built-in capabilities\n- Implement proper interpolation for variables using {{variable}} syntax\n- Don't include defaultValue. The `en` translations are the fallback.\n\n# Quality Assurance\n- Maintain consistent terminology across all translations\n- Respect the JSON structure of translation files\n- Watch for placeholders and preserve them in translations\n- Be mindful of text length in UI elements when translating to languages that might require more characters\n- Use context-aware translations when the same string has different meanings\n\n# Supported Languages\n- Localize all strings into the following locale files: ar, ca, cs, de, en, es, fr, hi, hu, it, ja, ko, pl, pt, pt-BR, ru, tr, zh-CN, zh-TW",
+      "groups": [
+        "read",
+        [
+          "edit",
+          {
+            "fileRegex": "(.*\\.(md|ts|tsx|js|jsx)$|.*\\.json$)",
+            "description": "Source code, translation files, and documentation"
+          }
+        ]
+      ],
+      "source": "project"
     }
   ]
 }

+ 30 - 29
webview-ui/src/components/chat/AutoApproveMenu.tsx

@@ -1,6 +1,7 @@
 import { VSCodeCheckbox } from "@vscode/webview-ui-toolkit/react"
 import { useCallback, useState } from "react"
 import { useExtensionState } from "../../context/ExtensionStateContext"
+import { useAppTranslation } from "../../i18n/TranslationContext"
 import { vscode } from "../../utils/vscode"
 
 interface AutoApproveAction {
@@ -38,63 +39,64 @@ const AutoApproveMenu = ({ style }: AutoApproveMenuProps) => {
 		setAutoApprovalEnabled,
 	} = useExtensionState()
 
+	const { t } = useAppTranslation()
+
 	const actions: AutoApproveAction[] = [
 		{
 			id: "readFiles",
-			label: "Read files and directories",
-			shortName: "Read",
+			label: t("chat:autoApprove.actions.readFiles.label"),
+			shortName: t("chat:autoApprove.actions.readFiles.shortName"),
 			enabled: alwaysAllowReadOnly ?? false,
-			description: "Allows access to read any file on your computer.",
+			description: t("chat:autoApprove.actions.readFiles.description"),
 		},
 		{
 			id: "editFiles",
-			label: "Edit files",
-			shortName: "Edit",
+			label: t("chat:autoApprove.actions.editFiles.label"),
+			shortName: t("chat:autoApprove.actions.editFiles.shortName"),
 			enabled: alwaysAllowWrite ?? false,
-			description: "Allows modification of any files on your computer.",
+			description: t("chat:autoApprove.actions.editFiles.description"),
 		},
 		{
 			id: "executeCommands",
-			label: "Execute approved commands",
-			shortName: "Commands",
+			label: t("chat:autoApprove.actions.executeCommands.label"),
+			shortName: t("chat:autoApprove.actions.executeCommands.shortName"),
 			enabled: alwaysAllowExecute ?? false,
-			description:
-				"Allows execution of approved terminal commands. You can configure this in the settings panel.",
+			description: t("chat:autoApprove.actions.executeCommands.description"),
 		},
 		{
 			id: "useBrowser",
-			label: "Use the browser",
-			shortName: "Browser",
+			label: t("chat:autoApprove.actions.useBrowser.label"),
+			shortName: t("chat:autoApprove.actions.useBrowser.shortName"),
 			enabled: alwaysAllowBrowser ?? false,
-			description: "Allows ability to launch and interact with any website in a headless browser.",
+			description: t("chat:autoApprove.actions.useBrowser.description"),
 		},
 		{
 			id: "useMcp",
-			label: "Use MCP servers",
-			shortName: "MCP",
+			label: t("chat:autoApprove.actions.useMcp.label"),
+			shortName: t("chat:autoApprove.actions.useMcp.shortName"),
 			enabled: alwaysAllowMcp ?? false,
-			description: "Allows use of configured MCP servers which may modify filesystem or interact with APIs.",
+			description: t("chat:autoApprove.actions.useMcp.description"),
 		},
 		{
 			id: "switchModes",
-			label: "Switch modes",
-			shortName: "Modes",
+			label: t("chat:autoApprove.actions.switchModes.label"),
+			shortName: t("chat:autoApprove.actions.switchModes.shortName"),
 			enabled: alwaysAllowModeSwitch ?? false,
-			description: "Allows automatic switching between different modes without requiring approval.",
+			description: t("chat:autoApprove.actions.switchModes.description"),
 		},
 		{
 			id: "subtasks",
-			label: "Create & complete subtasks",
-			shortName: "Subtasks",
+			label: t("chat:autoApprove.actions.subtasks.label"),
+			shortName: t("chat:autoApprove.actions.subtasks.shortName"),
 			enabled: alwaysAllowSubtasks ?? false,
-			description: "Allow creation and completion of subtasks without requiring approval.",
+			description: t("chat:autoApprove.actions.subtasks.description"),
 		},
 		{
 			id: "retryRequests",
-			label: "Retry failed requests",
-			shortName: "Retries",
+			label: t("chat:autoApprove.actions.retryRequests.label"),
+			shortName: t("chat:autoApprove.actions.retryRequests.shortName"),
 			enabled: alwaysApproveResubmit ?? false,
-			description: "Automatically retry failed API requests when the provider returns an error response.",
+			description: t("chat:autoApprove.actions.retryRequests.description"),
 		},
 	]
 
@@ -211,7 +213,7 @@ const AutoApproveMenu = ({ style }: AutoApproveMenuProps) => {
 							color: "var(--vscode-foreground)",
 							flexShrink: 0,
 						}}>
-						Auto-approve:
+						{t("chat:autoApprove.title")}
 					</span>
 					<span
 						style={{
@@ -222,7 +224,7 @@ const AutoApproveMenu = ({ style }: AutoApproveMenuProps) => {
 							flex: 1,
 							minWidth: 0,
 						}}>
-						{enabledActionsList || "None"}
+						{enabledActionsList || t("chat:autoApprove.none")}
 					</span>
 					<span
 						className={`codicon codicon-chevron-${isExpanded ? "down" : "right"}`}
@@ -241,8 +243,7 @@ const AutoApproveMenu = ({ style }: AutoApproveMenuProps) => {
 							color: "var(--vscode-descriptionForeground)",
 							fontSize: "12px",
 						}}>
-						Auto-approve allows Roo Code to perform actions without asking for permission. Only enable for
-						actions you fully trust.
+						{t("chat:autoApprove.description")}
 					</div>
 					{actions.map((action) => (
 						<div key={action.id} style={{ margin: "6px 0" }}>

+ 18 - 17
webview-ui/src/components/chat/ChatTextArea.tsx

@@ -20,6 +20,7 @@ import Thumbnails from "../common/Thumbnails"
 import { convertToMentionPath } from "../../utils/path-mentions"
 import { MAX_IMAGES_PER_MESSAGE } from "./ChatView"
 import ContextMenu from "./ContextMenu"
+import { useAppTranslation } from "../../i18n/TranslationContext"
 
 interface ChatTextAreaProps {
 	inputValue: string
@@ -56,6 +57,7 @@ const ChatTextArea = forwardRef<HTMLTextAreaElement, ChatTextAreaProps>(
 		},
 		ref,
 	) => {
+		const { t } = useAppTranslation()
 		const { filePaths, openedTabs, currentApiConfigName, listApiConfigMeta, customModes, cwd } = useExtensionState()
 		const [gitCommits, setGitCommits] = useState<any[]>([])
 		const [showDropdown, setShowDropdown] = useState(false)
@@ -133,12 +135,11 @@ const ChatTextArea = forwardRef<HTMLTextAreaElement, ChatTextAreaProps>(
 					}
 					vscode.postMessage(message)
 				} else {
-					const promptDescription =
-						"The 'Enhance Prompt' button helps improve your prompt by providing additional context, clarification, or rephrasing. Try typing a prompt in here and clicking the button again to see how it works."
+					const promptDescription = t("chat:enhancePromptDescription")
 					setInputValue(promptDescription)
 				}
 			}
-		}, [inputValue, textAreaDisabled, setInputValue])
+		}, [inputValue, textAreaDisabled, setInputValue, t])
 
 		const queryItems = useMemo(() => {
 			return [
@@ -475,7 +476,7 @@ const ChatTextArea = forwardRef<HTMLTextAreaElement, ChatTextAreaProps>(
 							const reader = new FileReader()
 							reader.onloadend = () => {
 								if (reader.error) {
-									console.error("Error reading file:", reader.error)
+									console.error(t("chat:errorReadingFile"), reader.error)
 									resolve(null)
 								} else {
 									const result = reader.result
@@ -490,11 +491,11 @@ const ChatTextArea = forwardRef<HTMLTextAreaElement, ChatTextAreaProps>(
 					if (dataUrls.length > 0) {
 						setSelectedImages((prevImages) => [...prevImages, ...dataUrls].slice(0, MAX_IMAGES_PER_MESSAGE))
 					} else {
-						console.warn("No valid images were processed")
+						console.warn(t("chat:noValidImages"))
 					}
 				}
 			},
-			[shouldDisableImages, setSelectedImages, cursorPosition, setInputValue, inputValue],
+			[shouldDisableImages, setSelectedImages, cursorPosition, setInputValue, inputValue, t],
 		)
 
 		const handleThumbnailsHeightChange = useCallback((height: number) => {
@@ -611,7 +612,7 @@ const ChatTextArea = forwardRef<HTMLTextAreaElement, ChatTextAreaProps>(
 								const reader = new FileReader()
 								reader.onloadend = () => {
 									if (reader.error) {
-										console.error("Error reading file:", reader.error)
+										console.error(t("chat:errorReadingFile"), reader.error)
 										resolve(null)
 									} else {
 										const result = reader.result
@@ -634,7 +635,7 @@ const ChatTextArea = forwardRef<HTMLTextAreaElement, ChatTextAreaProps>(
 								})
 							}
 						} else {
-							console.warn("No valid images were processed")
+							console.warn(t("chat:noValidImages"))
 						}
 					}
 				}}
@@ -779,7 +780,7 @@ const ChatTextArea = forwardRef<HTMLTextAreaElement, ChatTextAreaProps>(
 							<SelectDropdown
 								value={mode}
 								disabled={textAreaDisabled}
-								title="Select mode for interaction"
+								title={t("chat:selectMode")}
 								options={[
 									// Add the shortcut text as a disabled option at the top
 									{
@@ -797,13 +798,13 @@ const ChatTextArea = forwardRef<HTMLTextAreaElement, ChatTextAreaProps>(
 									// Add separator
 									{
 										value: "sep-1",
-										label: "Separator",
+										label: t("chat:separator"),
 										type: DropdownOptionType.SEPARATOR,
 									},
 									// Add Edit option
 									{
 										value: "promptsButtonClicked",
-										label: "Edit...",
+										label: t("chat:edit"),
 										type: DropdownOptionType.ACTION,
 									},
 								]}
@@ -829,7 +830,7 @@ const ChatTextArea = forwardRef<HTMLTextAreaElement, ChatTextAreaProps>(
 							<SelectDropdown
 								value={currentApiConfigName || ""}
 								disabled={textAreaDisabled}
-								title="Select API configuration"
+								title={t("chat:selectApiConfig")}
 								options={[
 									// Add all API configurations
 									...(listApiConfigMeta || []).map((config) => ({
@@ -840,13 +841,13 @@ const ChatTextArea = forwardRef<HTMLTextAreaElement, ChatTextAreaProps>(
 									// Add separator
 									{
 										value: "sep-2",
-										label: "Separator",
+										label: t("chat:separator"),
 										type: DropdownOptionType.SEPARATOR,
 									},
 									// Add Edit option
 									{
 										value: "settingsButtonClicked",
-										label: "Edit...",
+										label: t("chat:edit"),
 										type: DropdownOptionType.ACTION,
 									},
 								]}
@@ -886,7 +887,7 @@ const ChatTextArea = forwardRef<HTMLTextAreaElement, ChatTextAreaProps>(
 									role="button"
 									aria-label="enhance prompt"
 									data-testid="enhance-prompt-button"
-									title="Enhance prompt with additional context"
+									title={t("chat:enhancePrompt")}
 									className={`input-icon-button ${
 										textAreaDisabled ? "disabled" : ""
 									} codicon codicon-sparkle`}
@@ -899,13 +900,13 @@ const ChatTextArea = forwardRef<HTMLTextAreaElement, ChatTextAreaProps>(
 							className={`input-icon-button ${
 								shouldDisableImages ? "disabled" : ""
 							} codicon codicon-device-camera`}
-							title="Add images to message"
+							title={t("chat:addImages")}
 							onClick={() => !shouldDisableImages && onSelectImages()}
 							style={{ fontSize: 16.5 }}
 						/>
 						<span
 							className={`input-icon-button ${textAreaDisabled ? "disabled" : ""} codicon codicon-send`}
-							title="Send message"
+							title={t("chat:sendMessage")}
 							onClick={() => !textAreaDisabled && onSend()}
 							style={{ fontSize: 15 }}
 						/>

+ 6 - 9
webview-ui/src/components/chat/ChatView.tsx

@@ -42,9 +42,10 @@ interface ChatViewProps {
 export const MAX_IMAGES_PER_MESSAGE = 20 // Anthropic limits to 20 images
 
 const isMac = navigator.platform.toUpperCase().indexOf("MAC") >= 0
-const modeShortcutText = `${isMac ? "⌘" : "Ctrl"} + . for next mode`
 
 const ChatView = ({ isHidden, showAnnouncement, hideAnnouncement, showHistoryView }: ChatViewProps) => {
+	const { t } = useAppTranslation()
+	const modeShortcutText = `${isMac ? "⌘" : "Ctrl"} + . ${t("chat:forNextMode")}`
 	const {
 		version,
 		clineMessages: messages,
@@ -67,8 +68,6 @@ const ChatView = ({ isHidden, showAnnouncement, hideAnnouncement, showHistoryVie
 		telemetrySetting,
 	} = useExtensionState()
 
-	const { t } = useAppTranslation()
-
 	//const task = messages.length > 0 ? (messages[0].say === "task" ? messages[0] : undefined) : undefined) : undefined
 	const task = useMemo(() => messages.at(0), [messages]) // leaving this less safe version here since if the first message is not a task, then the extension is in a bad state and needs to be debugged (see Cline.abort)
 	const modifiedMessages = useMemo(() => combineApiRequests(combineCommandSequences(messages.slice(1))), [messages])
@@ -941,12 +940,10 @@ const ChatView = ({ isHidden, showAnnouncement, hideAnnouncement, showHistoryVie
 		[],
 	)
 
-	const placeholderText = useMemo(() => {
-		const baseText = task ? t("chat:typeMessage") : t("chat:typeTask")
-		const contextText = t("chat:addContext")
-		const imageText = shouldDisableImages ? `, ${t("chat:dragFiles")}` : `, ${t("chat:dragFilesImages")}`
-		return baseText + `\n(${contextText}${imageText})`
-	}, [task, shouldDisableImages, t])
+	const baseText = task ? t("chat:typeMessage") : t("chat:typeTask")
+	const placeholderText =
+		baseText +
+		`\n(${t("chat:addContext")}${shouldDisableImages ? `, ${t("chat:dragFiles")}` : `, ${t("chat:dragFilesImages")}`})`
 
 	const itemContent = useCallback(
 		(index: number, messageOrGroup: ClineMessage | ClineMessage[]) => {

+ 3 - 1
webview-ui/src/components/history/CopyButton.tsx

@@ -3,6 +3,7 @@ import { useCallback } from "react"
 import { useClipboard } from "@/components/ui/hooks"
 import { Button } from "@/components/ui"
 import { cn } from "@/lib/utils"
+import { useAppTranslation } from "@/i18n/TranslationContext"
 
 type CopyButtonProps = {
 	itemTask: string
@@ -10,6 +11,7 @@ type CopyButtonProps = {
 
 export const CopyButton = ({ itemTask }: CopyButtonProps) => {
 	const { isCopied, copy } = useClipboard()
+	const { t } = useAppTranslation()
 
 	const onCopy = useCallback(
 		(e: React.MouseEvent) => {
@@ -23,7 +25,7 @@ export const CopyButton = ({ itemTask }: CopyButtonProps) => {
 		<Button
 			variant="ghost"
 			size="icon"
-			title="Copy Prompt"
+			title={t("history:copyPrompt")}
 			onClick={onCopy}
 			className="opacity-50 hover:opacity-100">
 			<span className={cn("codicon scale-80", { "codicon-check": isCopied, "codicon-copy": !isCopied })} />

+ 6 - 6
webview-ui/src/components/history/DeleteTaskDialog.tsx

@@ -13,6 +13,7 @@ import {
 	AlertDialogTitle,
 	Button,
 } from "@/components/ui"
+import { useAppTranslation } from "@/i18n/TranslationContext"
 
 import { vscode } from "@/utils/vscode"
 
@@ -21,6 +22,7 @@ interface DeleteTaskDialogProps extends AlertDialogProps {
 }
 
 export const DeleteTaskDialog = ({ taskId, ...props }: DeleteTaskDialogProps) => {
+	const { t } = useAppTranslation()
 	const [isEnterPressed] = useKeyPress("Enter")
 
 	const { onOpenChange } = props
@@ -42,18 +44,16 @@ export const DeleteTaskDialog = ({ taskId, ...props }: DeleteTaskDialogProps) =>
 		<AlertDialog {...props}>
 			<AlertDialogContent onEscapeKeyDown={() => onOpenChange?.(false)}>
 				<AlertDialogHeader>
-					<AlertDialogTitle>Delete Task</AlertDialogTitle>
-					<AlertDialogDescription>
-						Are you sure you want to delete this task? This action cannot be undone.
-					</AlertDialogDescription>
+					<AlertDialogTitle>{t("history:deleteTask")}</AlertDialogTitle>
+					<AlertDialogDescription>{t("history:deleteTaskMessage")}</AlertDialogDescription>
 				</AlertDialogHeader>
 				<AlertDialogFooter>
 					<AlertDialogCancel asChild>
-						<Button variant="secondary">Cancel</Button>
+						<Button variant="secondary">{t("history:cancel")}</Button>
 					</AlertDialogCancel>
 					<AlertDialogAction asChild>
 						<Button variant="destructive" onClick={onDelete}>
-							Delete
+							{t("history:delete")}
 						</Button>
 					</AlertDialogAction>
 				</AlertDialogFooter>

+ 18 - 13
webview-ui/src/components/history/ExportButton.tsx

@@ -1,16 +1,21 @@
 import { vscode } from "@/utils/vscode"
 import { Button } from "@/components/ui"
+import { useAppTranslation } from "@/i18n/TranslationContext"
 
-export const ExportButton = ({ itemId }: { itemId: string }) => (
-	<Button
-		data-testid="export"
-		variant="ghost"
-		size="icon"
-		title="Export Task"
-		onClick={(e) => {
-			e.stopPropagation()
-			vscode.postMessage({ type: "exportTaskWithId", text: itemId })
-		}}>
-		<span className="codicon codicon-cloud-download" />
-	</Button>
-)
+export const ExportButton = ({ itemId }: { itemId: string }) => {
+	const { t } = useAppTranslation()
+
+	return (
+		<Button
+			data-testid="export"
+			variant="ghost"
+			size="icon"
+			title={t("history:exportTask")}
+			onClick={(e) => {
+				e.stopPropagation()
+				vscode.postMessage({ type: "exportTaskWithId", text: itemId })
+			}}>
+			<span className="codicon codicon-cloud-download" />
+		</Button>
+	)
+}

+ 13 - 8
webview-ui/src/components/history/HistoryPreview.tsx

@@ -5,24 +5,25 @@ import { formatLargeNumber, formatDate } from "@/utils/format"
 import { Button } from "@/components/ui"
 
 import { useExtensionState } from "../../context/ExtensionStateContext"
+import { useAppTranslation } from "../../i18n/TranslationContext"
 import { CopyButton } from "./CopyButton"
 
 type HistoryPreviewProps = {
 	showHistoryView: () => void
 }
-
 const HistoryPreview = ({ showHistoryView }: HistoryPreviewProps) => {
 	const { taskHistory } = useExtensionState()
+	const { t } = useAppTranslation()
 
 	return (
 		<div className="flex flex-col gap-3 shrink-0 mx-5">
 			<div className="flex items-center justify-between text-vscode-descriptionForeground">
 				<div className="flex items-center gap-1">
 					<span className="codicon codicon-comment-discussion scale-90 mr-1" />
-					<span className="font-medium text-xs uppercase">Recent Tasks</span>
+					<span className="font-medium text-xs uppercase">{t("history:recentTasks")}</span>
 				</div>
 				<Button variant="ghost" size="sm" onClick={() => showHistoryView()} className="uppercase">
-					View All
+					{t("history:viewAll")}
 				</Button>
 			</div>
 			{taskHistory.slice(0, 3).map((item) => (
@@ -50,22 +51,26 @@ const HistoryPreview = ({ showHistoryView }: HistoryPreviewProps) => {
 						</div>
 						<div className="text-xs text-vscode-descriptionForeground">
 							<span>
-								Tokens: ↑{formatLargeNumber(item.tokensIn || 0)} ↓
-								{formatLargeNumber(item.tokensOut || 0)}
+								{t("history:tokens", {
+									in: formatLargeNumber(item.tokensIn || 0),
+									out: formatLargeNumber(item.tokensOut || 0),
+								})}
 							</span>
 							{!!item.cacheWrites && (
 								<>
 									{" • "}
 									<span>
-										Cache: +{formatLargeNumber(item.cacheWrites || 0)} →{" "}
-										{formatLargeNumber(item.cacheReads || 0)}
+										{t("history:cache", {
+											writes: formatLargeNumber(item.cacheWrites || 0),
+											reads: formatLargeNumber(item.cacheReads || 0),
+										})}
 									</span>
 								</>
 							)}
 							{!!item.totalCost && (
 								<>
 									{" • "}
-									<span>API Cost: ${item.totalCost?.toFixed(4)}</span>
+									<span>{t("history:apiCost", { cost: item.totalCost?.toFixed(4) })}</span>
 								</>
 							)}
 						</div>

+ 14 - 12
webview-ui/src/components/history/HistoryView.tsx

@@ -8,6 +8,7 @@ import { vscode } from "@/utils/vscode"
 import { formatLargeNumber, formatDate } from "@/utils/format"
 import { cn } from "@/lib/utils"
 import { Button } from "@/components/ui"
+import { useAppTranslation } from "@/i18n/TranslationContext"
 
 import { Tab, TabContent, TabHeader } from "../common/Tab"
 import { useTaskSearch } from "./useTaskSearch"
@@ -22,6 +23,7 @@ type SortOption = "newest" | "oldest" | "mostExpensive" | "mostTokens" | "mostRe
 
 const HistoryView = ({ onDone }: HistoryViewProps) => {
 	const { tasks, searchQuery, setSearchQuery, sortOption, setSortOption, setLastNonRelevantSort } = useTaskSearch()
+	const { t } = useAppTranslation()
 
 	const [deleteTaskId, setDeleteTaskId] = useState<string | null>(null)
 
@@ -29,13 +31,13 @@ const HistoryView = ({ onDone }: HistoryViewProps) => {
 		<Tab>
 			<TabHeader className="flex flex-col gap-2">
 				<div className="flex justify-between items-center">
-					<h3 className="text-vscode-foreground m-0">History</h3>
-					<VSCodeButton onClick={onDone}>Done</VSCodeButton>
+					<h3 className="text-vscode-foreground m-0">{t("history:history")}</h3>
+					<VSCodeButton onClick={onDone}>{t("history:done")}</VSCodeButton>
 				</div>
 				<div className="flex flex-col gap-2">
 					<VSCodeTextField
 						style={{ width: "100%" }}
-						placeholder="Fuzzy search history..."
+						placeholder={t("history:searchPlaceholder")}
 						value={searchQuery}
 						onInput={(e) => {
 							const newValue = (e.target as HTMLInputElement)?.value
@@ -70,15 +72,15 @@ const HistoryView = ({ onDone }: HistoryViewProps) => {
 						value={sortOption}
 						role="radiogroup"
 						onChange={(e) => setSortOption((e.target as HTMLInputElement).value as SortOption)}>
-						<VSCodeRadio value="newest">Newest</VSCodeRadio>
-						<VSCodeRadio value="oldest">Oldest</VSCodeRadio>
-						<VSCodeRadio value="mostExpensive">Most Expensive</VSCodeRadio>
-						<VSCodeRadio value="mostTokens">Most Tokens</VSCodeRadio>
+						<VSCodeRadio value="newest">{t("history:newest")}</VSCodeRadio>
+						<VSCodeRadio value="oldest">{t("history:oldest")}</VSCodeRadio>
+						<VSCodeRadio value="mostExpensive">{t("history:mostExpensive")}</VSCodeRadio>
+						<VSCodeRadio value="mostTokens">{t("history:mostTokens")}</VSCodeRadio>
 						<VSCodeRadio
 							value="mostRelevant"
 							disabled={!searchQuery}
 							style={{ opacity: searchQuery ? 1 : 0.5 }}>
-							Most Relevant
+							{t("history:mostRelevant")}
 						</VSCodeRadio>
 					</VSCodeRadioGroup>
 				</div>
@@ -132,7 +134,7 @@ const HistoryView = ({ onDone }: HistoryViewProps) => {
 										<Button
 											variant="ghost"
 											size="sm"
-											title="Delete Task (Shift + Click to skip confirmation)"
+											title={t("history:deleteTaskTitle")}
 											onClick={(e) => {
 												e.stopPropagation()
 
@@ -181,7 +183,7 @@ const HistoryView = ({ onDone }: HistoryViewProps) => {
 													fontWeight: 500,
 													color: "var(--vscode-descriptionForeground)",
 												}}>
-												Tokens:
+												{t("history:tokensLabel")}
 											</span>
 											<span
 												data-testid="tokens-in"
@@ -242,7 +244,7 @@ const HistoryView = ({ onDone }: HistoryViewProps) => {
 													fontWeight: 500,
 													color: "var(--vscode-descriptionForeground)",
 												}}>
-												Cache:
+												{t("history:cacheLabel")}
 											</span>
 											<span
 												data-testid="cache-writes"
@@ -297,7 +299,7 @@ const HistoryView = ({ onDone }: HistoryViewProps) => {
 														fontWeight: 500,
 														color: "var(--vscode-descriptionForeground)",
 													}}>
-													API Cost:
+													{t("history:apiCostLabel")}
 												</span>
 												<span style={{ color: "var(--vscode-descriptionForeground)" }}>
 													${item.totalCost?.toFixed(4)}

+ 1 - 0
webview-ui/src/components/history/__tests__/HistoryView.test.tsx

@@ -7,6 +7,7 @@ import { vscode } from "../../../utils/vscode"
 
 jest.mock("../../../context/ExtensionStateContext")
 jest.mock("../../../utils/vscode")
+jest.mock("../../../i18n/TranslationContext")
 
 jest.mock("react-virtuoso", () => ({
 	Virtuoso: ({ data, itemContent }: any) => (

+ 63 - 0
webview-ui/src/i18n/__mocks__/TranslationContext.tsx

@@ -0,0 +1,63 @@
+import React from "react"
+
+// Create a mock for the useAppTranslation hook
+export const useAppTranslation = () => {
+	return {
+		t: (key: string, options?: Record<string, any>) => {
+			const translations: Record<string, string> = {
+				// History translations
+				"history:recentTasks": "Recent Tasks",
+				"history:viewAll": "View All",
+				"history:history": "History",
+				"history:done": "Done",
+				"history:searchPlaceholder": "Fuzzy search history...",
+				"history:newest": "Newest",
+				"history:oldest": "Oldest",
+				"history:mostExpensive": "Most Expensive",
+				"history:mostTokens": "Most Tokens",
+				"history:mostRelevant": "Most Relevant",
+				"history:deleteTaskTitle": "Delete Task (Shift + Click to skip confirmation)",
+				"history:tokensLabel": "Tokens:",
+				"history:cacheLabel": "Cache:",
+				"history:apiCostLabel": "API Cost:",
+				"history:copyPrompt": "Copy Prompt",
+				"history:exportTask": "Export Task",
+				"history:deleteTask": "Delete Task",
+				"history:deleteTaskMessage": "Are you sure you want to delete this task? This action cannot be undone.",
+				"history:cancel": "Cancel",
+				"history:delete": "Delete",
+			}
+
+			// Handle interpolation
+			if (options && key === "history:tokens") {
+				return `Tokens: ↑${options.in} ↓${options.out}`
+			}
+
+			if (options && key === "history:cache") {
+				return `Cache: +${options.writes} → ${options.reads}`
+			}
+
+			if (options && key === "history:apiCost") {
+				return `API Cost: $${options.cost}`
+			}
+
+			return translations[key] || key
+		},
+		i18n: {
+			language: "en",
+			changeLanguage: jest.fn(),
+		},
+	}
+}
+
+export const withTranslation = (Component: React.ComponentType<any>) => {
+	return (props: any) => <Component {...props} />
+}
+
+// Mock provider component
+export const AppTranslationProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => {
+	return <>{children}</>
+}
+
+const TranslationContext = { AppTranslationProvider, useAppTranslation, withTranslation }
+export default TranslationContext

+ 54 - 1
webview-ui/src/i18n/locales/ar/chat.json

@@ -56,5 +56,58 @@
 	"typeTask": "اكتب مهمتك هنا...",
 	"addContext": "@ لإضافة سياق، / لتبديل الأوضاع",
 	"dragFiles": "اضغط على shift لسحب الملفات",
-	"dragFilesImages": "اضغط على shift لسحب الملفات/الصور"
+	"dragFilesImages": "اضغط على shift لسحب الملفات/الصور",
+	"enhancePromptDescription": "يساعد زر 'تحسين المطالبة' على تحسين طلبك من خلال توفير سياق إضافي أو توضيحات أو إعادة صياغة. جرب كتابة طلب هنا وانقر على الزر مرة أخرى لمعرفة كيفية عمله.",
+	"errorReadingFile": "خطأ في قراءة الملف:",
+	"noValidImages": "لم تتم معالجة أي صور صالحة",
+	"separator": "فاصل",
+	"edit": "تعديل...",
+	"forNextMode": "للوضع التالي",
+	"autoApprove": {
+		"title": "الموافقة التلقائية:",
+		"none": "لا شيء",
+		"description": "الموافقة التلقائية تسمح لـ Roo Code بتنفيذ الإجراءات دون طلب إذن. قم بتمكينها فقط للإجراءات التي تثق بها تمامًا.",
+		"actions": {
+			"readFiles": {
+				"label": "قراءة الملفات والمجلدات",
+				"shortName": "قراءة",
+				"description": "يسمح بالوصول لقراءة أي ملف على جهاز الكمبيوتر الخاص بك."
+			},
+			"editFiles": {
+				"label": "تعديل الملفات",
+				"shortName": "تعديل",
+				"description": "يسمح بتعديل أي ملفات على جهاز الكمبيوتر الخاص بك."
+			},
+			"executeCommands": {
+				"label": "تنفيذ الأوامر المعتمدة",
+				"shortName": "أوامر",
+				"description": "يسمح بتنفيذ أوامر الطرفية المعتمدة. يمكنك تكوين ذلك في لوحة الإعدادات."
+			},
+			"useBrowser": {
+				"label": "استخدام المتصفح",
+				"shortName": "متصفح",
+				"description": "يسمح بالقدرة على تشغيل والتفاعل مع أي موقع ويب في متصفح بدون واجهة."
+			},
+			"useMcp": {
+				"label": "استخدام خوادم MCP",
+				"shortName": "MCP",
+				"description": "يسمح باستخدام خوادم MCP المكونة التي قد تعدل نظام الملفات أو تتفاعل مع واجهات برمجة التطبيقات."
+			},
+			"switchModes": {
+				"label": "تبديل الأوضاع",
+				"shortName": "أوضاع",
+				"description": "يسمح بالتبديل التلقائي بين الأوضاع المختلفة دون الحاجة إلى موافقة."
+			},
+			"subtasks": {
+				"label": "إنشاء وإكمال المهام الفرعية",
+				"shortName": "مهام فرعية",
+				"description": "يسمح بإنشاء وإكمال المهام الفرعية دون الحاجة إلى موافقة."
+			},
+			"retryRequests": {
+				"label": "إعادة محاولة الطلبات الفاشلة",
+				"shortName": "إعادة المحاولات",
+				"description": "إعادة محاولة طلبات API الفاشلة تلقائيًا عندما يُرجع المزود استجابة خطأ."
+			}
+		}
+	}
 }

+ 25 - 0
webview-ui/src/i18n/locales/ar/history.json

@@ -0,0 +1,25 @@
+{
+	"recentTasks": "المهام الأخيرة",
+	"viewAll": "عرض الكل",
+	"tokens": "الرموز: ↑{{in}} ↓{{out}}",
+	"cache": "التخزين المؤقت: +{{writes}} → {{reads}}",
+	"apiCost": "تكلفة API: ${{cost}}",
+	"history": "السجل",
+	"done": "تم",
+	"searchPlaceholder": "البحث في السجل...",
+	"newest": "الأحدث",
+	"oldest": "الأقدم",
+	"mostExpensive": "الأكثر تكلفة",
+	"mostTokens": "الأكثر رموزًا",
+	"mostRelevant": "الأكثر صلة",
+	"deleteTaskTitle": "حذف المهمة (Shift + نقرة لتخطي التأكيد)",
+	"tokensLabel": "الرموز:",
+	"cacheLabel": "التخزين المؤقت:",
+	"apiCostLabel": "تكلفة API:",
+	"copyPrompt": "نسخ السؤال",
+	"exportTask": "تصدير المهمة",
+	"deleteTask": "حذف المهمة",
+	"deleteTaskMessage": "هل أنت متأكد من حذف هذه المهمة؟ لا يمكن التراجع عن هذا الإجراء.",
+	"cancel": "إلغاء",
+	"delete": "حذف"
+}

+ 54 - 1
webview-ui/src/i18n/locales/ca/chat.json

@@ -56,5 +56,58 @@
 	"typeTask": "Escriu la teva tasca aquí...",
 	"addContext": "@ per afegir context, / per canviar de mode",
 	"dragFiles": "manté premut shift per arrossegar fitxers",
-	"dragFilesImages": "manté premut shift per arrossegar fitxers/imatges"
+	"dragFilesImages": "manté premut shift per arrossegar fitxers/imatges",
+	"enhancePromptDescription": "El botó 'Millora la sol·licitud' ajuda a millorar la teva sol·licitud proporcionant context addicional, aclariments o reformulacions. Prova d'escriure una sol·licitud aquí i fes clic al botó de nou per veure com funciona.",
+	"errorReadingFile": "Error en llegir el fitxer:",
+	"noValidImages": "No s'ha processat cap imatge vàlida",
+	"separator": "Separador",
+	"edit": "Edita...",
+	"forNextMode": "per al següent mode",
+	"autoApprove": {
+		"title": "Aprovació automàtica:",
+		"none": "Cap",
+		"description": "L'aprovació automàtica permet a Roo Code realitzar accions sense demanar permís. Activa-la només per a accions en les que confies plenament.",
+		"actions": {
+			"readFiles": {
+				"label": "Llegir fitxers i directoris",
+				"shortName": "Lectura",
+				"description": "Permet l'accés per llegir qualsevol fitxer al teu ordinador."
+			},
+			"editFiles": {
+				"label": "Editar fitxers",
+				"shortName": "Edició",
+				"description": "Permet la modificació de qualsevol fitxer al teu ordinador."
+			},
+			"executeCommands": {
+				"label": "Executar ordres aprovades",
+				"shortName": "Ordres",
+				"description": "Permet l'execució d'ordres de terminal aprovades. Pots configurar-ho al panell de configuració."
+			},
+			"useBrowser": {
+				"label": "Utilitzar el navegador",
+				"shortName": "Navegador",
+				"description": "Permet la capacitat d'iniciar i interactuar amb qualsevol lloc web en un navegador headless."
+			},
+			"useMcp": {
+				"label": "Utilitzar servidors MCP",
+				"shortName": "MCP",
+				"description": "Permet l'ús de servidors MCP configurats que poden modificar el sistema de fitxers o interactuar amb APIs."
+			},
+			"switchModes": {
+				"label": "Canviar modes",
+				"shortName": "Modes",
+				"description": "Permet el canvi automàtic entre diferents modes sense requerir aprovació."
+			},
+			"subtasks": {
+				"label": "Crear i completar subtasques",
+				"shortName": "Subtasques",
+				"description": "Permet la creació i finalització de subtasques sense requerir aprovació."
+			},
+			"retryRequests": {
+				"label": "Reintentar sol·licituds fallides",
+				"shortName": "Reintents",
+				"description": "Reintenta automàticament les sol·licituds API fallides quan el proveïdor retorna una resposta d'error."
+			}
+		}
+	}
 }

+ 25 - 0
webview-ui/src/i18n/locales/ca/history.json

@@ -0,0 +1,25 @@
+{
+	"recentTasks": "Tasques recents",
+	"viewAll": "Veure tot",
+	"tokens": "Tokens: ↑{{in}} ↓{{out}}",
+	"cache": "Cau: +{{writes}} → {{reads}}",
+	"apiCost": "Cost d'API: ${{cost}}",
+	"history": "Historial",
+	"done": "Fet",
+	"searchPlaceholder": "Cerca a l'historial...",
+	"newest": "Més recents",
+	"oldest": "Més antigues",
+	"mostExpensive": "Més cares",
+	"mostTokens": "Més tokens",
+	"mostRelevant": "Més rellevants",
+	"deleteTaskTitle": "Eliminar tasca (Maj + Clic per ometre confirmació)",
+	"tokensLabel": "Tokens:",
+	"cacheLabel": "Cau:",
+	"apiCostLabel": "Cost d'API:",
+	"copyPrompt": "Copiar prompt",
+	"exportTask": "Exportar tasca",
+	"deleteTask": "Eliminar tasca",
+	"deleteTaskMessage": "Estàs segur que vols eliminar aquesta tasca? Aquesta acció no es pot desfer.",
+	"cancel": "Cancel·lar",
+	"delete": "Eliminar"
+}

+ 54 - 1
webview-ui/src/i18n/locales/cs/chat.json

@@ -56,5 +56,58 @@
 	"typeTask": "Napište svůj úkol zde...",
 	"addContext": "@ pro přidání kontextu, / pro přepnutí režimů",
 	"dragFiles": "podržte shift pro přetažení souborů",
-	"dragFilesImages": "podržte shift pro přetažení souborů/obrázků"
+	"dragFilesImages": "podržte shift pro přetažení souborů/obrázků",
+	"enhancePromptDescription": "Tlačítko 'Vylepšit výzvu' pomáhá zlepšit vaši výzvu poskytnutím dalšího kontextu, objasnění nebo přeformulování. Zkuste zde napsat výzvu a znovu klikněte na tlačítko pro zobrazení, jak to funguje.",
+	"errorReadingFile": "Chyba při čtení souboru:",
+	"noValidImages": "Nebyly zpracovány žádné platné obrázky",
+	"separator": "Oddělovač",
+	"edit": "Upravit...",
+	"forNextMode": "pro další režim",
+	"autoApprove": {
+		"title": "Automatické schválení:",
+		"none": "Žádné",
+		"description": "Automatické schválení umožňuje Roo Code provádět akce bez vyžádání povolení. Povolte pouze pro akce, kterým plně důvěřujete.",
+		"actions": {
+			"readFiles": {
+				"label": "Číst soubory a adresáře",
+				"shortName": "Čtení",
+				"description": "Umožňuje přístup ke čtení jakéhokoli souboru na vašem počítači."
+			},
+			"editFiles": {
+				"label": "Upravovat soubory",
+				"shortName": "Úpravy",
+				"description": "Umožňuje úpravy jakýchkoli souborů na vašem počítači."
+			},
+			"executeCommands": {
+				"label": "Spouštět schválené příkazy",
+				"shortName": "Příkazy",
+				"description": "Umožňuje spouštění schválených terminálových příkazů. Toto můžete nakonfigurovat v panelu nastavení."
+			},
+			"useBrowser": {
+				"label": "Používat prohlížeč",
+				"shortName": "Prohlížeč",
+				"description": "Umožňuje spuštění a interakci s jakýmkoli webem v headless prohlížeči."
+			},
+			"useMcp": {
+				"label": "Používat MCP servery",
+				"shortName": "MCP",
+				"description": "Umožňuje použití nakonfigurovaných MCP serverů, které mohou upravovat souborový systém nebo komunikovat s API."
+			},
+			"switchModes": {
+				"label": "Přepínat režimy",
+				"shortName": "Režimy",
+				"description": "Umožňuje automatické přepínání mezi různými režimy bez nutnosti schválení."
+			},
+			"subtasks": {
+				"label": "Vytvářet a dokončovat dílčí úkoly",
+				"shortName": "Dílčí úkoly",
+				"description": "Umožňuje vytváření a dokončování dílčích úkolů bez nutnosti schválení."
+			},
+			"retryRequests": {
+				"label": "Opakovat neúspěšné požadavky",
+				"shortName": "Opakování",
+				"description": "Automaticky opakuje neúspěšné API požadavky, když poskytovatel vrátí chybovou odpověď."
+			}
+		}
+	}
 }

+ 25 - 0
webview-ui/src/i18n/locales/cs/history.json

@@ -0,0 +1,25 @@
+{
+	"recentTasks": "Nedávné úkoly",
+	"viewAll": "Zobrazit vše",
+	"tokens": "Tokens: ↑{{in}} ↓{{out}}",
+	"cache": "Mezipaměť: +{{writes}} → {{reads}}",
+	"apiCost": "Náklady API: ${{cost}}",
+	"history": "Historie",
+	"done": "Hotovo",
+	"searchPlaceholder": "Vyhledat v historii...",
+	"newest": "Nejnovější",
+	"oldest": "Nejstarší",
+	"mostExpensive": "Nejdražší",
+	"mostTokens": "Nejvíce tokenů",
+	"mostRelevant": "Nejrelevantnější",
+	"deleteTaskTitle": "Smazat úkol (Shift + klik pro přeskočení potvrzení)",
+	"tokensLabel": "Tokens:",
+	"cacheLabel": "Mezipaměť:",
+	"apiCostLabel": "Náklady API:",
+	"copyPrompt": "Kopírovat prompt",
+	"exportTask": "Exportovat úkol",
+	"deleteTask": "Smazat úkol",
+	"deleteTaskMessage": "Opravdu chcete smazat tento úkol? Tuto akci nelze vrátit zpět.",
+	"cancel": "Zrušit",
+	"delete": "Smazat"
+}

+ 54 - 1
webview-ui/src/i18n/locales/de/chat.json

@@ -56,5 +56,58 @@
 	"typeTask": "Geben Sie hier Ihre Aufgabe ein...",
 	"addContext": "@ um Kontext hinzuzufügen, / um Modi zu wechseln",
 	"dragFiles": "Halten Sie die Umschalttaste gedrückt, um Dateien zu ziehen",
-	"dragFilesImages": "Halten Sie die Umschalttaste gedrückt, um Dateien/Bilder zu ziehen"
+	"dragFilesImages": "Halten Sie die Umschalttaste gedrückt, um Dateien/Bilder zu ziehen",
+	"enhancePromptDescription": "Die Schaltfläche 'Eingabeaufforderung verbessern' hilft, Ihre Anfrage durch zusätzlichen Kontext, Klarstellungen oder Umformulierungen zu verbessern. Geben Sie eine Anfrage ein und klicken Sie erneut auf die Schaltfläche, um zu sehen, wie es funktioniert.",
+	"errorReadingFile": "Fehler beim Lesen der Datei:",
+	"noValidImages": "Es wurden keine gültigen Bilder verarbeitet",
+	"separator": "Trennlinie",
+	"edit": "Bearbeiten...",
+	"forNextMode": "für nächsten Modus",
+	"autoApprove": {
+		"title": "Auto-Genehmigung:",
+		"none": "Keine",
+		"description": "Auto-Genehmigung erlaubt Roo Code, Aktionen ohne Nachfrage auszuführen. Aktivieren Sie dies nur für Aktionen, denen Sie vollständig vertrauen.",
+		"actions": {
+			"readFiles": {
+				"label": "Dateien und Verzeichnisse lesen",
+				"shortName": "Lesen",
+				"description": "Ermöglicht den Zugriff zum Lesen jeder Datei auf Ihrem Computer."
+			},
+			"editFiles": {
+				"label": "Dateien bearbeiten",
+				"shortName": "Bearbeiten",
+				"description": "Ermöglicht die Bearbeitung beliebiger Dateien auf Ihrem Computer."
+			},
+			"executeCommands": {
+				"label": "Genehmigte Befehle ausführen",
+				"shortName": "Befehle",
+				"description": "Erlaubt die Ausführung genehmigter Terminalbefehle. Sie können dies im Einstellungsbereich konfigurieren."
+			},
+			"useBrowser": {
+				"label": "Browser verwenden",
+				"shortName": "Browser",
+				"description": "Ermöglicht das Starten und Interagieren mit jeder Website in einem Headless-Browser."
+			},
+			"useMcp": {
+				"label": "MCP-Server verwenden",
+				"shortName": "MCP",
+				"description": "Erlaubt die Verwendung konfigurierter MCP-Server, die das Dateisystem ändern oder mit APIs interagieren können."
+			},
+			"switchModes": {
+				"label": "Modi wechseln",
+				"shortName": "Modi",
+				"description": "Ermöglicht automatisches Wechseln zwischen verschiedenen Modi ohne Genehmigung."
+			},
+			"subtasks": {
+				"label": "Teilaufgaben erstellen & abschließen",
+				"shortName": "Teilaufgaben",
+				"description": "Erlaubt die Erstellung und den Abschluss von Teilaufgaben ohne Genehmigung."
+			},
+			"retryRequests": {
+				"label": "Fehlgeschlagene Anfragen wiederholen",
+				"shortName": "Wiederholungen",
+				"description": "Wiederholt automatisch fehlgeschlagene API-Anfragen, wenn der Anbieter eine Fehlermeldung zurückgibt."
+			}
+		}
+	}
 }

+ 25 - 0
webview-ui/src/i18n/locales/de/history.json

@@ -0,0 +1,25 @@
+{
+	"recentTasks": "Neueste Aufgaben",
+	"viewAll": "Alle anzeigen",
+	"tokens": "Tokens: ↑{{in}} ↓{{out}}",
+	"cache": "Cache: +{{writes}} → {{reads}}",
+	"apiCost": "API-Kosten: ${{cost}}",
+	"history": "Verlauf",
+	"done": "Fertig",
+	"searchPlaceholder": "Verlauf durchsuchen...",
+	"newest": "Neueste",
+	"oldest": "Älteste",
+	"mostExpensive": "Teuerste",
+	"mostTokens": "Meiste Tokens",
+	"mostRelevant": "Relevanteste",
+	"deleteTaskTitle": "Aufgabe löschen (Umschalt + Klick um Bestätigung zu überspringen)",
+	"tokensLabel": "Tokens:",
+	"cacheLabel": "Cache:",
+	"apiCostLabel": "API-Kosten:",
+	"copyPrompt": "Prompt kopieren",
+	"exportTask": "Aufgabe exportieren",
+	"deleteTask": "Aufgabe löschen",
+	"deleteTaskMessage": "Sind Sie sicher, dass Sie diese Aufgabe löschen möchten? Diese Aktion kann nicht rückgängig gemacht werden.",
+	"cancel": "Abbrechen",
+	"delete": "Löschen"
+}

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

@@ -50,11 +50,64 @@
 	"selectMode": "Select mode for interaction",
 	"selectApiConfig": "Select API configuration",
 	"enhancePrompt": "Enhance prompt with additional context",
+	"enhancePromptDescription": "The 'Enhance Prompt' button helps improve your prompt by providing additional context, clarification, or rephrasing. Try typing a prompt in here and clicking the button again to see how it works.",
 	"addImages": "Add images to message",
 	"sendMessage": "Send message",
 	"typeMessage": "Type a message...",
 	"typeTask": "Type your task here...",
 	"addContext": "@ to add context, / to switch modes",
 	"dragFiles": "hold shift to drag in files",
-	"dragFilesImages": "hold shift to drag in files/images"
+	"dragFilesImages": "hold shift to drag in files/images",
+	"errorReadingFile": "Error reading file:",
+	"noValidImages": "No valid images were processed",
+	"separator": "Separator",
+	"edit": "Edit...",
+	"forNextMode": "for next mode",
+	"autoApprove": {
+		"title": "Auto-approve:",
+		"none": "None",
+		"description": "Auto-approve allows Roo Code to perform actions without asking for permission. Only enable for actions you fully trust.",
+		"actions": {
+			"readFiles": {
+				"label": "Read files and directories",
+				"shortName": "Read",
+				"description": "Allows access to read any file on your computer."
+			},
+			"editFiles": {
+				"label": "Edit files",
+				"shortName": "Edit",
+				"description": "Allows modification of any files on your computer."
+			},
+			"executeCommands": {
+				"label": "Execute approved commands",
+				"shortName": "Commands",
+				"description": "Allows execution of approved terminal commands. You can configure this in the settings panel."
+			},
+			"useBrowser": {
+				"label": "Use the browser",
+				"shortName": "Browser",
+				"description": "Allows ability to launch and interact with any website in a headless browser."
+			},
+			"useMcp": {
+				"label": "Use MCP servers",
+				"shortName": "MCP",
+				"description": "Allows use of configured MCP servers which may modify filesystem or interact with APIs."
+			},
+			"switchModes": {
+				"label": "Switch modes",
+				"shortName": "Modes",
+				"description": "Allows automatic switching between different modes without requiring approval."
+			},
+			"subtasks": {
+				"label": "Create & complete subtasks",
+				"shortName": "Subtasks",
+				"description": "Allow creation and completion of subtasks without requiring approval."
+			},
+			"retryRequests": {
+				"label": "Retry failed requests",
+				"shortName": "Retries",
+				"description": "Automatically retry failed API requests when the provider returns an error response."
+			}
+		}
+	}
 }

+ 25 - 0
webview-ui/src/i18n/locales/en/history.json

@@ -0,0 +1,25 @@
+{
+	"recentTasks": "Recent Tasks",
+	"viewAll": "View All",
+	"tokens": "Tokens: ↑{{in}} ↓{{out}}",
+	"cache": "Cache: +{{writes}} → {{reads}}",
+	"apiCost": "API Cost: ${{cost}}",
+	"history": "History",
+	"done": "Done",
+	"searchPlaceholder": "Fuzzy search history...",
+	"newest": "Newest",
+	"oldest": "Oldest",
+	"mostExpensive": "Most Expensive",
+	"mostTokens": "Most Tokens",
+	"mostRelevant": "Most Relevant",
+	"deleteTaskTitle": "Delete Task (Shift + Click to skip confirmation)",
+	"tokensLabel": "Tokens:",
+	"cacheLabel": "Cache:",
+	"apiCostLabel": "API Cost:",
+	"copyPrompt": "Copy Prompt",
+	"exportTask": "Export Task",
+	"deleteTask": "Delete Task",
+	"deleteTaskMessage": "Are you sure you want to delete this task? This action cannot be undone.",
+	"cancel": "Cancel",
+	"delete": "Delete"
+}

+ 54 - 1
webview-ui/src/i18n/locales/es/chat.json

@@ -56,5 +56,58 @@
 	"typeTask": "Escribe tu tarea aquí...",
 	"addContext": "@ para agregar contexto, / para cambiar modos",
 	"dragFiles": "mantén shift para arrastrar archivos",
-	"dragFilesImages": "mantén shift para arrastrar archivos/imágenes"
+	"dragFilesImages": "mantén shift para arrastrar archivos/imágenes",
+	"enhancePromptDescription": "El botón 'Mejorar el mensaje' ayuda a mejorar tu petición proporcionando contexto adicional, aclaraciones o reformulaciones. Intenta escribir una petición aquí y haz clic en el botón nuevamente para ver cómo funciona.",
+	"errorReadingFile": "Error al leer el archivo:",
+	"noValidImages": "No se procesaron imágenes válidas",
+	"separator": "Separador",
+	"edit": "Editar...",
+	"forNextMode": "para el siguiente modo",
+	"autoApprove": {
+		"title": "Auto-aprobar:",
+		"none": "Ninguno",
+		"description": "Auto-aprobar permite a Roo Code realizar acciones sin pedir permiso. Habilita solo para acciones en las que confíes plenamente.",
+		"actions": {
+			"readFiles": {
+				"label": "Leer archivos y directorios",
+				"shortName": "Leer",
+				"description": "Permite acceso para leer cualquier archivo en tu computadora."
+			},
+			"editFiles": {
+				"label": "Editar archivos",
+				"shortName": "Editar",
+				"description": "Permite la modificación de cualquier archivo en tu computadora."
+			},
+			"executeCommands": {
+				"label": "Ejecutar comandos aprobados",
+				"shortName": "Comandos",
+				"description": "Permite la ejecución de comandos de terminal aprobados. Puedes configurar esto en el panel de configuración."
+			},
+			"useBrowser": {
+				"label": "Usar el navegador",
+				"shortName": "Navegador",
+				"description": "Permite la capacidad de iniciar e interactuar con cualquier sitio web en un navegador sin interfaz."
+			},
+			"useMcp": {
+				"label": "Usar servidores MCP",
+				"shortName": "MCP",
+				"description": "Permite el uso de servidores MCP configurados que pueden modificar el sistema de archivos o interactuar con APIs."
+			},
+			"switchModes": {
+				"label": "Cambiar modos",
+				"shortName": "Modos",
+				"description": "Permite el cambio automático entre diferentes modos sin requerir aprobación."
+			},
+			"subtasks": {
+				"label": "Crear y completar subtareas",
+				"shortName": "Subtareas",
+				"description": "Permite la creación y finalización de subtareas sin requerir aprobación."
+			},
+			"retryRequests": {
+				"label": "Reintentar solicitudes fallidas",
+				"shortName": "Reintentos",
+				"description": "Reintenta automáticamente las solicitudes API fallidas cuando el proveedor devuelve una respuesta de error."
+			}
+		}
+	}
 }

+ 25 - 0
webview-ui/src/i18n/locales/es/history.json

@@ -0,0 +1,25 @@
+{
+	"recentTasks": "Tareas recientes",
+	"viewAll": "Ver todas",
+	"tokens": "Tokens: ↑{{in}} ↓{{out}}",
+	"cache": "Caché: +{{writes}} → {{reads}}",
+	"apiCost": "Costo de API: ${{cost}}",
+	"history": "Historial",
+	"done": "Listo",
+	"searchPlaceholder": "Buscar en el historial...",
+	"newest": "Más recientes",
+	"oldest": "Más antiguas",
+	"mostExpensive": "Más costosas",
+	"mostTokens": "Más tokens",
+	"mostRelevant": "Más relevantes",
+	"deleteTaskTitle": "Eliminar tarea (Shift + Clic para omitir confirmación)",
+	"tokensLabel": "Tokens:",
+	"cacheLabel": "Caché:",
+	"apiCostLabel": "Costo de API:",
+	"copyPrompt": "Copiar prompt",
+	"exportTask": "Exportar tarea",
+	"deleteTask": "Eliminar tarea",
+	"deleteTaskMessage": "¿Estás seguro de que quieres eliminar esta tarea? Esta acción no se puede deshacer.",
+	"cancel": "Cancelar",
+	"delete": "Eliminar"
+}

+ 54 - 1
webview-ui/src/i18n/locales/fr/chat.json

@@ -56,5 +56,58 @@
 	"typeTask": "Tapez votre tâche ici...",
 	"addContext": "@ pour ajouter du contexte, / pour changer de mode",
 	"dragFiles": "maintenez shift pour glisser des fichiers",
-	"dragFilesImages": "maintenez shift pour glisser des fichiers/images"
+	"dragFilesImages": "maintenez shift pour glisser des fichiers/images",
+	"enhancePromptDescription": "Le bouton 'Améliorer l'invite' aide à améliorer votre demande en fournissant un contexte supplémentaire, des clarifications ou des reformulations. Essayez de taper une demande ici et cliquez à nouveau sur le bouton pour voir comment cela fonctionne.",
+	"errorReadingFile": "Erreur lors de la lecture du fichier :",
+	"noValidImages": "Aucune image valide n'a été traitée",
+	"separator": "Séparateur",
+	"edit": "Modifier...",
+	"forNextMode": "pour le mode suivant",
+	"autoApprove": {
+		"title": "Auto-approbation :",
+		"none": "Aucune",
+		"description": "L'auto-approbation permet à Roo Code d'effectuer des actions sans demander d'autorisation. Activez uniquement pour les actions auxquelles vous faites entièrement confiance.",
+		"actions": {
+			"readFiles": {
+				"label": "Lire les fichiers et répertoires",
+				"shortName": "Lecture",
+				"description": "Permet d'accéder en lecture à n'importe quel fichier sur votre ordinateur."
+			},
+			"editFiles": {
+				"label": "Modifier les fichiers",
+				"shortName": "Édition",
+				"description": "Permet la modification de n'importe quel fichier sur votre ordinateur."
+			},
+			"executeCommands": {
+				"label": "Exécuter des commandes approuvées",
+				"shortName": "Commandes",
+				"description": "Permet l'exécution de commandes terminal approuvées. Vous pouvez configurer cela dans le panneau des paramètres."
+			},
+			"useBrowser": {
+				"label": "Utiliser le navigateur",
+				"shortName": "Navigateur",
+				"description": "Permet de lancer et d'interagir avec n'importe quel site web dans un navigateur headless."
+			},
+			"useMcp": {
+				"label": "Utiliser les serveurs MCP",
+				"shortName": "MCP",
+				"description": "Permet l'utilisation de serveurs MCP configurés qui peuvent modifier le système de fichiers ou interagir avec des API."
+			},
+			"switchModes": {
+				"label": "Changer de modes",
+				"shortName": "Modes",
+				"description": "Permet le passage automatique entre différents modes sans nécessiter d'approbation."
+			},
+			"subtasks": {
+				"label": "Créer et compléter des sous-tâches",
+				"shortName": "Sous-tâches",
+				"description": "Permet la création et l'achèvement de sous-tâches sans nécessiter d'approbation."
+			},
+			"retryRequests": {
+				"label": "Réessayer les requêtes échouées",
+				"shortName": "Réessais",
+				"description": "Réessaie automatiquement les requêtes API échouées lorsque le fournisseur renvoie une réponse d'erreur."
+			}
+		}
+	}
 }

+ 25 - 0
webview-ui/src/i18n/locales/fr/history.json

@@ -0,0 +1,25 @@
+{
+	"recentTasks": "Tâches récentes",
+	"viewAll": "Voir tout",
+	"tokens": "Tokens: ↑{{in}} ↓{{out}}",
+	"cache": "Cache: +{{writes}} → {{reads}}",
+	"apiCost": "Coût API: ${{cost}}",
+	"history": "Historique",
+	"done": "Terminé",
+	"searchPlaceholder": "Rechercher dans l'historique...",
+	"newest": "Plus récentes",
+	"oldest": "Plus anciennes",
+	"mostExpensive": "Plus coûteuses",
+	"mostTokens": "Plus de tokens",
+	"mostRelevant": "Plus pertinentes",
+	"deleteTaskTitle": "Supprimer la tâche (Maj + Clic pour ignorer la confirmation)",
+	"tokensLabel": "Tokens:",
+	"cacheLabel": "Cache:",
+	"apiCostLabel": "Coût API:",
+	"copyPrompt": "Copier le prompt",
+	"exportTask": "Exporter la tâche",
+	"deleteTask": "Supprimer la tâche",
+	"deleteTaskMessage": "Êtes-vous sûr de vouloir supprimer cette tâche ? Cette action ne peut pas être annulée.",
+	"cancel": "Annuler",
+	"delete": "Supprimer"
+}

+ 54 - 1
webview-ui/src/i18n/locales/hi/chat.json

@@ -56,5 +56,58 @@
 	"typeTask": "अपना कार्य यहां टाइप करें...",
 	"addContext": "@ संदर्भ जोड़ने के लिए, / मोड बदलने के लिए",
 	"dragFiles": "फ़ाइलों को खींचने के लिए shift दबाए रखें",
-	"dragFilesImages": "फ़ाइलों/छवियों को खींचने के लिए shift दबाए रखें"
+	"dragFilesImages": "फ़ाइलों/छवियों को खींचने के लिए shift दबाए रखें",
+	"enhancePromptDescription": "'प्रॉम्प्ट बढ़ाएं' बटन अतिरिक्त संदर्भ, स्पष्टीकरण, या पुनर्कथन प्रदान करके आपके प्रॉम्प्ट को बेहतर बनाने में मदद करता है। यहां एक प्रॉम्प्ट टाइप करके और बटन पर फिर से क्लिक करके देखें कि यह कैसे काम करता है।",
+	"errorReadingFile": "फ़ाइल पढ़ने में त्रुटि:",
+	"noValidImages": "कोई वैध छवियां संसाधित नहीं की गईं",
+	"separator": "विभाजक",
+	"edit": "संपादित करें...",
+	"forNextMode": "अगले मोड के लिए",
+	"autoApprove": {
+		"title": "स्वत: स्वीकृति:",
+		"none": "कोई नहीं",
+		"description": "स्वत: स्वीकृति Roo Code को अनुमति मांगे बिना क्रियाएँ करने की अनुमति देती है। केवल उन क्रियाओं के लिए सक्षम करें जिन पर आप पूरी तरह से विश्वास करते हैं।",
+		"actions": {
+			"readFiles": {
+				"label": "फ़ाइलें और डायरेक्टरी पढ़ें",
+				"shortName": "पढ़ना",
+				"description": "आपके कंप्यूटर पर किसी भी फ़ाइल को पढ़ने के लिए पहुंच की अनुमति देता है।"
+			},
+			"editFiles": {
+				"label": "फ़ाइलें संपादित करें",
+				"shortName": "संपादन",
+				"description": "आपके कंप्यूटर पर किसी भी फ़ाइल को संशोधित करने की अनुमति देता है।"
+			},
+			"executeCommands": {
+				"label": "स्वीकृत कमांड निष्पादित करें",
+				"shortName": "कमांड",
+				"description": "स्वीकृत टर्मिनल कमांड के निष्पादन की अनुमति देता है। आप इसे सेटिंग्स पैनल में कॉन्फ़िगर कर सकते हैं।"
+			},
+			"useBrowser": {
+				"label": "ब्राउज़र का उपयोग करें",
+				"shortName": "ब्राउज़र",
+				"description": "हेडलेस ब्राउज़र में किसी भी वेबसाइट को लॉन्च करने और उसके साथ इंटरैक्ट करने की क्षमता की अनुमति देता है।"
+			},
+			"useMcp": {
+				"label": "MCP सर्वर का उपयोग करें",
+				"shortName": "MCP",
+				"description": "कॉन्फ़िगर किए गए MCP सर्वर के उपयोग की अनुमति देता है जो फ़ाइल सिस्टम को संशोधित कर सकते हैं या API के साथ इंटरैक्ट कर सकते हैं।"
+			},
+			"switchModes": {
+				"label": "मोड बदलें",
+				"shortName": "मोड",
+				"description": "स्वीकृति की आवश्यकता के बिना विभिन्न मोड के बीच स्वचालित स्विचिंग की अनुमति देता है।"
+			},
+			"subtasks": {
+				"label": "उपकार्य बनाएं और पूरा करें",
+				"shortName": "उपकार्य",
+				"description": "स्वीकृति की आवश्यकता के बिना उपकार्यों के निर्माण और पूर्णता की अनुमति देता है।"
+			},
+			"retryRequests": {
+				"label": "विफल अनुरोधों को पुनः प्रयास करें",
+				"shortName": "पुनर्प्रयास",
+				"description": "जब प्रदाता त्रुटि प्रतिक्रिया देता है तो विफल API अनुरोधों को स्वचालित रूप से पुनः प्रयास करता है।"
+			}
+		}
+	}
 }

+ 25 - 0
webview-ui/src/i18n/locales/hi/history.json

@@ -0,0 +1,25 @@
+{
+	"recentTasks": "हालिया कार्य",
+	"viewAll": "सभी देखें",
+	"tokens": "Tokens: ↑{{in}} ↓{{out}}",
+	"cache": "कैश: +{{writes}} → {{reads}}",
+	"apiCost": "API लागत: ${{cost}}",
+	"history": "इतिहास",
+	"done": "पूर्ण",
+	"searchPlaceholder": "इतिहास खोजें...",
+	"newest": "नवीनतम",
+	"oldest": "सबसे पुराना",
+	"mostExpensive": "सबसे महंगा",
+	"mostTokens": "सबसे अधिक टोकन",
+	"mostRelevant": "सबसे प्रासंगिक",
+	"deleteTaskTitle": "कार्य हटाएं (Shift + क्लिक पुष्टि छोड़ने के लिए)",
+	"tokensLabel": "Tokens:",
+	"cacheLabel": "कैश:",
+	"apiCostLabel": "API लागत:",
+	"copyPrompt": "प्रॉम्प्ट कॉपी करें",
+	"exportTask": "कार्य निर्यात करें",
+	"deleteTask": "कार्य हटाएं",
+	"deleteTaskMessage": "क्या आप वाकई इस कार्य को हटाना चाहते हैं? यह क्रिया पूर्ववत नहीं की जा सकती है।",
+	"cancel": "रद्द करें",
+	"delete": "हटाएं"
+}

+ 54 - 1
webview-ui/src/i18n/locales/hu/chat.json

@@ -56,5 +56,58 @@
 	"typeTask": "Írja ide a feladatát...",
 	"addContext": "@ kontextus hozzáadásához, / módváltáshoz",
 	"dragFiles": "tartsa lenyomva a shift billentyűt a fájlok húzásához",
-	"dragFilesImages": "tartsa lenyomva a shift billentyűt a fájlok/képek húzásához"
+	"dragFilesImages": "tartsa lenyomva a shift billentyűt a fájlok/képek húzásához",
+	"enhancePromptDescription": "A 'Kérés fokozása' gomb segít a kérése javításában azáltal, hogy további környezetet, magyarázatot vagy újrafogalmazást ad. Írjon be egy kérést ide, majd kattintson újra a gombra, hogy lássa, hogyan működik.",
+	"errorReadingFile": "Hiba a fájl olvasása közben:",
+	"noValidImages": "Nem történt érvényes kép feldolgozása",
+	"separator": "Elválasztó",
+	"edit": "Szerkesztés...",
+	"forNextMode": "a következő módhoz",
+	"autoApprove": {
+		"title": "Automatikus jóváhagyás:",
+		"none": "Nincs",
+		"description": "Az automatikus jóváhagyás lehetővé teszi a Roo Code számára, hogy engedélykérés nélkül hajtson végre műveleteket. Csak olyan műveletekhez engedélyezze, amelyekben teljesen megbízik.",
+		"actions": {
+			"readFiles": {
+				"label": "Fájlok és könyvtárak olvasása",
+				"shortName": "Olvasás",
+				"description": "Hozzáférést biztosít bármely fájl olvasásához a számítógépén."
+			},
+			"editFiles": {
+				"label": "Fájlok szerkesztése",
+				"shortName": "Szerkesztés",
+				"description": "Lehetővé teszi bármely fájl módosítását a számítógépén."
+			},
+			"executeCommands": {
+				"label": "Jóváhagyott parancsok végrehajtása",
+				"shortName": "Parancsok",
+				"description": "Lehetővé teszi a jóváhagyott terminálparancsok végrehajtását. Ezt a beállítások panelen konfigurálhatja."
+			},
+			"useBrowser": {
+				"label": "Böngésző használata",
+				"shortName": "Böngésző",
+				"description": "Lehetővé teszi bármely weboldal elindítását és a vele való interakciót fejléc nélküli böngészőben."
+			},
+			"useMcp": {
+				"label": "MCP szerverek használata",
+				"shortName": "MCP",
+				"description": "Lehetővé teszi olyan konfigurált MCP szerverek használatát, amelyek módosíthatják a fájlrendszert vagy API-kkal léphetnek kapcsolatba."
+			},
+			"switchModes": {
+				"label": "Módok váltása",
+				"shortName": "Módok",
+				"description": "Lehetővé teszi a különböző módok közötti automatikus váltást jóváhagyás nélkül."
+			},
+			"subtasks": {
+				"label": "Alfeladatok létrehozása és befejezése",
+				"shortName": "Alfeladatok",
+				"description": "Lehetővé teszi alfeladatok létrehozását és befejezését jóváhagyás nélkül."
+			},
+			"retryRequests": {
+				"label": "Sikertelen kérések újrapróbálása",
+				"shortName": "Újrapróbálások",
+				"description": "Automatikusan újrapróbálja a sikertelen API kéréseket, amikor a szolgáltató hibaüzenetet ad vissza."
+			}
+		}
+	}
 }

+ 25 - 0
webview-ui/src/i18n/locales/hu/history.json

@@ -0,0 +1,25 @@
+{
+	"recentTasks": "Legutóbbi feladatok",
+	"viewAll": "Összes megtekintése",
+	"tokens": "Tokens: ↑{{in}} ↓{{out}}",
+	"cache": "Gyorsítótár: +{{writes}} → {{reads}}",
+	"apiCost": "API költség: ${{cost}}",
+	"history": "Előzmények",
+	"done": "Kész",
+	"searchPlaceholder": "Előzmények keresése...",
+	"newest": "Legújabb",
+	"oldest": "Legrégebbi",
+	"mostExpensive": "Legdrágább",
+	"mostTokens": "Legtöbb token",
+	"mostRelevant": "Legrelevánsabb",
+	"deleteTaskTitle": "Feladat törlése (Shift + kattintás a megerősítés kihagyásához)",
+	"tokensLabel": "Tokens:",
+	"cacheLabel": "Gyorsítótár:",
+	"apiCostLabel": "API költség:",
+	"copyPrompt": "Prompt másolása",
+	"exportTask": "Feladat exportálása",
+	"deleteTask": "Feladat törlése",
+	"deleteTaskMessage": "Biztosan törölni szeretné ezt a feladatot? Ez a művelet nem vonható vissza.",
+	"cancel": "Mégsem",
+	"delete": "Törlés"
+}

+ 54 - 1
webview-ui/src/i18n/locales/it/chat.json

@@ -56,5 +56,58 @@
 	"typeTask": "Scrivi qui la tua attività...",
 	"addContext": "@ per aggiungere contesto, / per cambiare modalità",
 	"dragFiles": "tieni premuto shift per trascinare i file",
-	"dragFilesImages": "tieni premuto shift per trascinare file/immagini"
+	"dragFilesImages": "tieni premuto shift per trascinare file/immagini",
+	"enhancePromptDescription": "Il pulsante 'Migliora il prompt' aiuta a migliorare la tua richiesta fornendo contesto aggiuntivo, chiarimenti o riformulazioni. Prova a digitare una richiesta qui e clicca nuovamente il pulsante per vedere come funziona.",
+	"errorReadingFile": "Errore durante la lettura del file:",
+	"noValidImages": "Nessuna immagine valida è stata elaborata",
+	"separator": "Separatore",
+	"edit": "Modifica...",
+	"forNextMode": "per la modalità successiva",
+	"autoApprove": {
+		"title": "Approvazione automatica:",
+		"none": "Nessuna",
+		"description": "L'approvazione automatica consente a Roo Code di eseguire azioni senza chiedere permesso. Abilita solo per azioni di cui ti fidi completamente.",
+		"actions": {
+			"readFiles": {
+				"label": "Leggere file e directory",
+				"shortName": "Lettura",
+				"description": "Consente l'accesso in lettura a qualsiasi file sul tuo computer."
+			},
+			"editFiles": {
+				"label": "Modificare file",
+				"shortName": "Modifica",
+				"description": "Consente la modifica di qualsiasi file sul tuo computer."
+			},
+			"executeCommands": {
+				"label": "Eseguire comandi approvati",
+				"shortName": "Comandi",
+				"description": "Consente l'esecuzione di comandi terminal approvati. Puoi configurare questo nel pannello delle impostazioni."
+			},
+			"useBrowser": {
+				"label": "Usare il browser",
+				"shortName": "Browser",
+				"description": "Consente la possibilità di avviare e interagire con qualsiasi sito web in un browser headless."
+			},
+			"useMcp": {
+				"label": "Usare server MCP",
+				"shortName": "MCP",
+				"description": "Consente l'uso di server MCP configurati che potrebbero modificare il filesystem o interagire con API."
+			},
+			"switchModes": {
+				"label": "Cambiare modalità",
+				"shortName": "Modalità",
+				"description": "Consente il passaggio automatico tra diverse modalità senza richiedere approvazione."
+			},
+			"subtasks": {
+				"label": "Creare e completare sottoattività",
+				"shortName": "Sottoattività",
+				"description": "Consente la creazione e il completamento di sottoattività senza richiedere approvazione."
+			},
+			"retryRequests": {
+				"label": "Riprovare richieste fallite",
+				"shortName": "Tentativi",
+				"description": "Riprova automaticamente le richieste API fallite quando il provider restituisce una risposta di errore."
+			}
+		}
+	}
 }

+ 25 - 0
webview-ui/src/i18n/locales/it/history.json

@@ -0,0 +1,25 @@
+{
+	"recentTasks": "Attività recenti",
+	"viewAll": "Vedi tutto",
+	"tokens": "Tokens: ↑{{in}} ↓{{out}}",
+	"cache": "Cache: +{{writes}} → {{reads}}",
+	"apiCost": "Costo API: ${{cost}}",
+	"history": "Cronologia",
+	"done": "Fatto",
+	"searchPlaceholder": "Ricerca nella cronologia...",
+	"newest": "Più recenti",
+	"oldest": "Più vecchie",
+	"mostExpensive": "Più costose",
+	"mostTokens": "Più token",
+	"mostRelevant": "Più rilevanti",
+	"deleteTaskTitle": "Elimina attività (Shift + Clic per saltare conferma)",
+	"tokensLabel": "Tokens:",
+	"cacheLabel": "Cache:",
+	"apiCostLabel": "Costo API:",
+	"copyPrompt": "Copia prompt",
+	"exportTask": "Esporta attività",
+	"deleteTask": "Elimina attività",
+	"deleteTaskMessage": "Sei sicuro di voler eliminare questa attività? Questa azione non può essere annullata.",
+	"cancel": "Annulla",
+	"delete": "Elimina"
+}

+ 54 - 1
webview-ui/src/i18n/locales/ja/chat.json

@@ -56,5 +56,58 @@
 	"typeTask": "ここにタスクを入力...",
 	"addContext": "@ コンテキストを追加, / モードを切り替え",
 	"dragFiles": "ファイルをドラッグするにはshiftを押したままにします",
-	"dragFilesImages": "ファイル/画像をドラッグするにはshiftを押したままにします"
+	"dragFilesImages": "ファイル/画像をドラッグするにはshiftを押したままにします",
+	"enhancePromptDescription": "「プロンプト強化」ボタンは、追加のコンテキスト、説明、または言い換えを提供することで、あなたのプロンプトを改善するのに役立ちます。ここにプロンプトを入力して、もう一度ボタンをクリックするとどのように機能するかが分かります。",
+	"errorReadingFile": "ファイルの読み込み中にエラーが発生しました:",
+	"noValidImages": "有効な画像が処理されませんでした",
+	"separator": "区切り線",
+	"edit": "編集...",
+	"forNextMode": "次のモードへ",
+	"autoApprove": {
+		"title": "自動承認:",
+		"none": "なし",
+		"description": "自動承認は、Roo Codeに許可を求めずに操作を実行することを許可します。完全に信頼できる操作のみを有効にしてください。",
+		"actions": {
+			"readFiles": {
+				"label": "ファイルとディレクトリの読み取り",
+				"shortName": "読取",
+				"description": "あなたのコンピューター上の任意のファイルを読み取るアクセスを許可します。"
+			},
+			"editFiles": {
+				"label": "ファイルの編集",
+				"shortName": "編集",
+				"description": "あなたのコンピューター上の任意のファイルを変更することを許可します。"
+			},
+			"executeCommands": {
+				"label": "承認されたコマンドの実行",
+				"shortName": "コマンド",
+				"description": "承認されたターミナルコマンドの実行を許可します。設定パネルでこれを構成できます。"
+			},
+			"useBrowser": {
+				"label": "ブラウザの使用",
+				"shortName": "ブラウザ",
+				"description": "ヘッドレスブラウザで任意のウェブサイトを起動し対話する機能を許可します。"
+			},
+			"useMcp": {
+				"label": "MCPサーバーの使用",
+				"shortName": "MCP",
+				"description": "ファイルシステムを変更したりAPIと対話したりする可能性のある構成済みMCPサーバーの使用を許可します。"
+			},
+			"switchModes": {
+				"label": "モードの切り替え",
+				"shortName": "モード",
+				"description": "承認を必要とせず、異なるモード間の自動切り替えを許可します。"
+			},
+			"subtasks": {
+				"label": "サブタスクの作成と完了",
+				"shortName": "サブタスク",
+				"description": "承認を必要とせずにサブタスクの作成と完了を許可します。"
+			},
+			"retryRequests": {
+				"label": "失敗したリクエストの再試行",
+				"shortName": "再試行",
+				"description": "プロバイダーがエラー応答を返した場合に、失敗したAPIリクエストを自動的に再試行します。"
+			}
+		}
+	}
 }

+ 25 - 0
webview-ui/src/i18n/locales/ja/history.json

@@ -0,0 +1,25 @@
+{
+	"recentTasks": "最近のタスク",
+	"viewAll": "すべて表示",
+	"tokens": "Tokens: ↑{{in}} ↓{{out}}",
+	"cache": "キャッシュ: +{{writes}} → {{reads}}",
+	"apiCost": "API コスト: ${{cost}}",
+	"history": "履歴",
+	"done": "完了",
+	"searchPlaceholder": "履歴をあいまい検索...",
+	"newest": "最新",
+	"oldest": "最古",
+	"mostExpensive": "最も高価",
+	"mostTokens": "最多トークン",
+	"mostRelevant": "最も関連性の高い",
+	"deleteTaskTitle": "タスクを削除(Shift + クリックで確認をスキップ)",
+	"tokensLabel": "Tokens:",
+	"cacheLabel": "キャッシュ:",
+	"apiCostLabel": "API コスト:",
+	"copyPrompt": "プロンプトをコピー",
+	"exportTask": "タスクをエクスポート",
+	"deleteTask": "タスクを削除",
+	"deleteTaskMessage": "このタスクを削除してもよろしいですか?この操作は元に戻せません。",
+	"cancel": "キャンセル",
+	"delete": "削除"
+}

+ 54 - 1
webview-ui/src/i18n/locales/ko/chat.json

@@ -56,5 +56,58 @@
 	"typeTask": "여기에 작업을 입력하세요...",
 	"addContext": "@ 컨텍스트 추가, / 모드 전환",
 	"dragFiles": "파일을 드래그하려면 shift를 누르세요",
-	"dragFilesImages": "파일/이미지를 드래그하려면 shift를 누르세요"
+	"dragFilesImages": "파일/이미지를 드래그하려면 shift를 누르세요",
+	"enhancePromptDescription": "'프롬프트 강화' 버튼은 추가 컨텍스트, 설명 또는 재구성을 제공하여 프롬프트를 개선하는 데 도움을 줍니다. 여기에 프롬프트를 입력하고 버튼을 다시 클릭하여 작동 방식을 확인하세요.",
+	"errorReadingFile": "파일 읽기 오류:",
+	"noValidImages": "유효한 이미지가 처리되지 않았습니다",
+	"separator": "구분선",
+	"edit": "편집...",
+	"forNextMode": "다음 모드로",
+	"autoApprove": {
+		"title": "자동 승인:",
+		"none": "없음",
+		"description": "자동 승인을 사용하면 Roo Code가 권한 요청 없이 작업을 수행할 수 있습니다. 완전히 신뢰하는 작업에만 활성화하세요.",
+		"actions": {
+			"readFiles": {
+				"label": "파일 및 디렉터리 읽기",
+				"shortName": "읽기",
+				"description": "컴퓨터의 모든 파일에 대한 읽기 액세스를 허용합니다."
+			},
+			"editFiles": {
+				"label": "파일 편집",
+				"shortName": "편집",
+				"description": "컴퓨터의 모든 파일을 수정할 수 있도록 허용합니다."
+			},
+			"executeCommands": {
+				"label": "승인된 명령 실행",
+				"shortName": "명령",
+				"description": "승인된 터미널 명령의 실행을 허용합니다. 설정 패널에서 이를 구성할 수 있습니다."
+			},
+			"useBrowser": {
+				"label": "브라우저 사용",
+				"shortName": "브라우저",
+				"description": "헤드리스 브라우저에서 모든 웹사이트를 시작하고 상호 작용할 수 있는 기능을 허용합니다."
+			},
+			"useMcp": {
+				"label": "MCP 서버 사용",
+				"shortName": "MCP",
+				"description": "파일 시스템을 수정하거나 API와 상호 작용할 수 있는 구성된 MCP 서버 사용을 허용합니다."
+			},
+			"switchModes": {
+				"label": "모드 전환",
+				"shortName": "모드",
+				"description": "승인 요청 없이 다양한 모드 간의 자동 전환을 허용합니다."
+			},
+			"subtasks": {
+				"label": "하위 작업 생성 및 완료",
+				"shortName": "하위 작업",
+				"description": "승인 요청 없이 하위 작업 생성 및 완료를 허용합니다."
+			},
+			"retryRequests": {
+				"label": "실패한 요청 재시도",
+				"shortName": "재시도",
+				"description": "제공자가 오류 응답을 반환할 때 실패한 API 요청을 자동으로 재시도합니다."
+			}
+		}
+	}
 }

+ 25 - 0
webview-ui/src/i18n/locales/ko/history.json

@@ -0,0 +1,25 @@
+{
+	"recentTasks": "최근 작업",
+	"viewAll": "모두 보기",
+	"tokens": "Tokens: ↑{{in}} ↓{{out}}",
+	"cache": "캐시: +{{writes}} → {{reads}}",
+	"apiCost": "API 비용: ${{cost}}",
+	"history": "기록",
+	"done": "완료",
+	"searchPlaceholder": "기록 검색...",
+	"newest": "최신순",
+	"oldest": "오래된순",
+	"mostExpensive": "가장 비싼순",
+	"mostTokens": "토큰 많은순",
+	"mostRelevant": "관련성 높은순",
+	"deleteTaskTitle": "작업 삭제 (Shift + 클릭으로 확인 생략)",
+	"tokensLabel": "Tokens:",
+	"cacheLabel": "캐시:",
+	"apiCostLabel": "API 비용:",
+	"copyPrompt": "프롬프트 복사",
+	"exportTask": "작업 내보내기",
+	"deleteTask": "작업 삭제",
+	"deleteTaskMessage": "이 작업을 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다.",
+	"cancel": "취소",
+	"delete": "삭제"
+}

+ 54 - 1
webview-ui/src/i18n/locales/pl/chat.json

@@ -56,5 +56,58 @@
 	"typeTask": "Wpisz tutaj swoje zadanie...",
 	"addContext": "@ aby dodać kontekst, / aby przełączyć tryby",
 	"dragFiles": "przytrzymaj shift, aby przeciągnąć pliki",
-	"dragFilesImages": "przytrzymaj shift, aby przeciągnąć pliki/obrazy"
+	"dragFilesImages": "przytrzymaj shift, aby przeciągnąć pliki/obrazy",
+	"enhancePromptDescription": "Przycisk 'Ulepsz monit' pomaga poprawić twój monit, dostarczając dodatkowy kontekst, wyjaśnienia lub przeformułowania. Spróbuj wpisać monit tutaj i kliknij przycisk ponownie, aby zobaczyć, jak to działa.",
+	"errorReadingFile": "Błąd odczytu pliku:",
+	"noValidImages": "Nie przetworzono żadnych prawidłowych obrazów",
+	"separator": "Separator",
+	"edit": "Edytuj...",
+	"forNextMode": "dla następnego trybu",
+	"autoApprove": {
+		"title": "Automatyczne zatwierdzanie:",
+		"none": "Brak",
+		"description": "Automatyczne zatwierdzanie pozwala Roo Code na wykonywanie działań bez proszenia o pozwolenie. Włącz tylko dla działań, którym w pełni ufasz.",
+		"actions": {
+			"readFiles": {
+				"label": "Odczyt plików i katalogów",
+				"shortName": "Odczyt",
+				"description": "Pozwala na dostęp do odczytu dowolnego pliku na twoim komputerze."
+			},
+			"editFiles": {
+				"label": "Edycja plików",
+				"shortName": "Edycja",
+				"description": "Pozwala na modyfikację dowolnych plików na twoim komputerze."
+			},
+			"executeCommands": {
+				"label": "Wykonywanie zatwierdzonych poleceń",
+				"shortName": "Polecenia",
+				"description": "Pozwala na wykonywanie zatwierdzonych poleceń terminalowych. Możesz to skonfigurować w panelu ustawień."
+			},
+			"useBrowser": {
+				"label": "Używanie przeglądarki",
+				"shortName": "Przeglądarka",
+				"description": "Pozwala na uruchamianie i interakcję z dowolną stroną internetową w przeglądarce headless."
+			},
+			"useMcp": {
+				"label": "Używanie serwerów MCP",
+				"shortName": "MCP",
+				"description": "Pozwala na używanie skonfigurowanych serwerów MCP, które mogą modyfikować system plików lub wchodzić w interakcję z API."
+			},
+			"switchModes": {
+				"label": "Przełączanie trybów",
+				"shortName": "Tryby",
+				"description": "Pozwala na automatyczne przełączanie między różnymi trybami bez konieczności zatwierdzania."
+			},
+			"subtasks": {
+				"label": "Tworzenie i kończenie podzadań",
+				"shortName": "Podzadania",
+				"description": "Pozwala na tworzenie i kończenie podzadań bez konieczności zatwierdzania."
+			},
+			"retryRequests": {
+				"label": "Ponowne próby nieudanych żądań",
+				"shortName": "Ponowne próby",
+				"description": "Automatycznie ponawia nieudane żądania API, gdy dostawca zwraca odpowiedź z błędem."
+			}
+		}
+	}
 }

+ 25 - 0
webview-ui/src/i18n/locales/pl/history.json

@@ -0,0 +1,25 @@
+{
+	"recentTasks": "Ostatnie zadania",
+	"viewAll": "Zobacz wszystkie",
+	"tokens": "Tokens: ↑{{in}} ↓{{out}}",
+	"cache": "Pamięć podręczna: +{{writes}} → {{reads}}",
+	"apiCost": "Koszt API: ${{cost}}",
+	"history": "Historia",
+	"done": "Gotowe",
+	"searchPlaceholder": "Szukaj w historii...",
+	"newest": "Najnowsze",
+	"oldest": "Najstarsze",
+	"mostExpensive": "Najdroższe",
+	"mostTokens": "Najwięcej tokenów",
+	"mostRelevant": "Najbardziej trafne",
+	"deleteTaskTitle": "Usuń zadanie (Shift + Klik, aby pominąć potwierdzenie)",
+	"tokensLabel": "Tokens:",
+	"cacheLabel": "Pamięć podręczna:",
+	"apiCostLabel": "Koszt API:",
+	"copyPrompt": "Kopiuj prompt",
+	"exportTask": "Eksportuj zadanie",
+	"deleteTask": "Usuń zadanie",
+	"deleteTaskMessage": "Czy na pewno chcesz usunąć to zadanie? Tej akcji nie można cofnąć.",
+	"cancel": "Anuluj",
+	"delete": "Usuń"
+}

+ 54 - 1
webview-ui/src/i18n/locales/pt-BR/chat.json

@@ -56,5 +56,58 @@
 	"typeTask": "Digite sua tarefa aqui...",
 	"addContext": "@ para adicionar contexto, / para mudar modos",
 	"dragFiles": "segure shift para arrastar arquivos",
-	"dragFilesImages": "segure shift para arrastar arquivos/imagens"
+	"dragFilesImages": "segure shift para arrastar arquivos/imagens",
+	"enhancePromptDescription": "O botão 'Melhorar o prompt' ajuda a aprimorar seu pedido fornecendo contexto adicional, esclarecimentos ou reformulações. Tente digitar um pedido aqui e clique no botão novamente para ver como funciona.",
+	"errorReadingFile": "Erro ao ler o arquivo:",
+	"noValidImages": "Nenhuma imagem válida foi processada",
+	"separator": "Separador",
+	"edit": "Editar...",
+	"forNextMode": "para o próximo modo",
+	"autoApprove": {
+		"title": "Aprovação automática:",
+		"none": "Nenhum",
+		"description": "A aprovação automática permite que o Roo Code execute ações sem pedir permissão. Ative apenas para ações nas quais você confia totalmente.",
+		"actions": {
+			"readFiles": {
+				"label": "Ler arquivos e diretórios",
+				"shortName": "Leitura",
+				"description": "Permite acesso para ler qualquer arquivo em seu computador."
+			},
+			"editFiles": {
+				"label": "Editar arquivos",
+				"shortName": "Edição",
+				"description": "Permite a modificação de quaisquer arquivos em seu computador."
+			},
+			"executeCommands": {
+				"label": "Executar comandos aprovados",
+				"shortName": "Comandos",
+				"description": "Permite a execução de comandos de terminal aprovados. Você pode configurar isso no painel de configurações."
+			},
+			"useBrowser": {
+				"label": "Usar o navegador",
+				"shortName": "Navegador",
+				"description": "Permite a capacidade de iniciar e interagir com qualquer site em um navegador headless."
+			},
+			"useMcp": {
+				"label": "Usar servidores MCP",
+				"shortName": "MCP",
+				"description": "Permite o uso de servidores MCP configurados que podem modificar o sistema de arquivos ou interagir com APIs."
+			},
+			"switchModes": {
+				"label": "Alternar modos",
+				"shortName": "Modos",
+				"description": "Permite a alternância automática entre diferentes modos sem exigir aprovação."
+			},
+			"subtasks": {
+				"label": "Criar e concluir subtarefas",
+				"shortName": "Subtarefas",
+				"description": "Permite a criação e conclusão de subtarefas sem exigir aprovação."
+			},
+			"retryRequests": {
+				"label": "Tentar novamente solicitações com falha",
+				"shortName": "Novas tentativas",
+				"description": "Tenta automaticamente solicitações de API com falha quando o provedor retorna uma resposta de erro."
+			}
+		}
+	}
 }

+ 25 - 0
webview-ui/src/i18n/locales/pt-BR/history.json

@@ -0,0 +1,25 @@
+{
+	"recentTasks": "Tarefas recentes",
+	"viewAll": "Ver todas",
+	"tokens": "Tokens: ↑{{in}} ↓{{out}}",
+	"cache": "Cache: +{{writes}} → {{reads}}",
+	"apiCost": "Custo da API: ${{cost}}",
+	"history": "Histórico",
+	"done": "Concluído",
+	"searchPlaceholder": "Pesquisar no histórico...",
+	"newest": "Mais recentes",
+	"oldest": "Mais antigas",
+	"mostExpensive": "Mais caras",
+	"mostTokens": "Mais tokens",
+	"mostRelevant": "Mais relevantes",
+	"deleteTaskTitle": "Excluir tarefa (Shift + Clique para pular confirmação)",
+	"tokensLabel": "Tokens:",
+	"cacheLabel": "Cache:",
+	"apiCostLabel": "Custo da API:",
+	"copyPrompt": "Copiar prompt",
+	"exportTask": "Exportar tarefa",
+	"deleteTask": "Excluir tarefa",
+	"deleteTaskMessage": "Tem certeza que deseja excluir esta tarefa? Esta ação não pode ser desfeita.",
+	"cancel": "Cancelar",
+	"delete": "Excluir"
+}

+ 54 - 1
webview-ui/src/i18n/locales/pt/chat.json

@@ -56,5 +56,58 @@
 	"typeTask": "Digite sua tarefa aqui...",
 	"addContext": "@ para adicionar contexto, / para mudar modos",
 	"dragFiles": "segure shift para arrastar arquivos",
-	"dragFilesImages": "segure shift para arrastar arquivos/imagens"
+	"dragFilesImages": "segure shift para arrastar arquivos/imagens",
+	"enhancePromptDescription": "O botão 'Melhorar o prompt' ajuda a aprimorar seu pedido fornecendo contexto adicional, esclarecimentos ou reformulações. Tente digitar um pedido aqui e clique no botão novamente para ver como funciona.",
+	"errorReadingFile": "Erro ao ler o arquivo:",
+	"noValidImages": "Nenhuma imagem válida foi processada",
+	"separator": "Separador",
+	"edit": "Editar...",
+	"forNextMode": "para o próximo modo",
+	"autoApprove": {
+		"title": "Aprovação automática:",
+		"none": "Nenhum",
+		"description": "A aprovação automática permite que o Roo Code execute ações sem pedir permissão. Ative apenas para ações nas quais você confia totalmente.",
+		"actions": {
+			"readFiles": {
+				"label": "Ler arquivos e diretórios",
+				"shortName": "Leitura",
+				"description": "Permite acesso para ler qualquer arquivo em seu computador."
+			},
+			"editFiles": {
+				"label": "Editar arquivos",
+				"shortName": "Edição",
+				"description": "Permite a modificação de quaisquer arquivos em seu computador."
+			},
+			"executeCommands": {
+				"label": "Executar comandos aprovados",
+				"shortName": "Comandos",
+				"description": "Permite a execução de comandos de terminal aprovados. Você pode configurar isso no painel de configurações."
+			},
+			"useBrowser": {
+				"label": "Usar o navegador",
+				"shortName": "Navegador",
+				"description": "Permite a capacidade de iniciar e interagir com qualquer site em um navegador headless."
+			},
+			"useMcp": {
+				"label": "Usar servidores MCP",
+				"shortName": "MCP",
+				"description": "Permite o uso de servidores MCP configurados que podem modificar o sistema de arquivos ou interagir com APIs."
+			},
+			"switchModes": {
+				"label": "Alternar modos",
+				"shortName": "Modos",
+				"description": "Permite a alternância automática entre diferentes modos sem exigir aprovação."
+			},
+			"subtasks": {
+				"label": "Criar e concluir subtarefas",
+				"shortName": "Subtarefas",
+				"description": "Permite a criação e conclusão de subtarefas sem exigir aprovação."
+			},
+			"retryRequests": {
+				"label": "Tentar novamente solicitações com falha",
+				"shortName": "Novas tentativas",
+				"description": "Tenta automaticamente solicitações de API com falha quando o provedor retorna uma resposta de erro."
+			}
+		}
+	}
 }

+ 25 - 0
webview-ui/src/i18n/locales/pt/history.json

@@ -0,0 +1,25 @@
+{
+	"recentTasks": "Tarefas recentes",
+	"viewAll": "Ver todas",
+	"tokens": "Tokens: ↑{{in}} ↓{{out}}",
+	"cache": "Cache: +{{writes}} → {{reads}}",
+	"apiCost": "Custo da API: ${{cost}}",
+	"history": "Histórico",
+	"done": "Concluído",
+	"searchPlaceholder": "Pesquisar no histórico...",
+	"newest": "Mais recentes",
+	"oldest": "Mais antigas",
+	"mostExpensive": "Mais caras",
+	"mostTokens": "Mais tokens",
+	"mostRelevant": "Mais relevantes",
+	"deleteTaskTitle": "Eliminar tarefa (Shift + Clique para ignorar confirmação)",
+	"tokensLabel": "Tokens:",
+	"cacheLabel": "Cache:",
+	"apiCostLabel": "Custo da API:",
+	"copyPrompt": "Copiar prompt",
+	"exportTask": "Exportar tarefa",
+	"deleteTask": "Eliminar tarefa",
+	"deleteTaskMessage": "Tem a certeza que pretende eliminar esta tarefa? Esta ação não pode ser desfeita.",
+	"cancel": "Cancelar",
+	"delete": "Eliminar"
+}

+ 54 - 1
webview-ui/src/i18n/locales/ru/chat.json

@@ -56,5 +56,58 @@
 	"typeTask": "Введите вашу задачу здесь...",
 	"addContext": "@ чтобы добавить контекст, / чтобы переключить режимы",
 	"dragFiles": "удерживайте shift, чтобы перетащить файлы",
-	"dragFilesImages": "удерживайте shift, чтобы перетащить файлы/изображения"
+	"dragFilesImages": "удерживайте shift, чтобы перетащить файлы/изображения",
+	"enhancePromptDescription": "Кнопка 'Улучшить запрос' помогает улучшить ваш запрос, предоставляя дополнительный контекст, разъяснения или переформулировки. Попробуйте ввести запрос здесь и нажмите кнопку еще раз, чтобы увидеть, как это работает.",
+	"errorReadingFile": "Ошибка чтения файла:",
+	"noValidImages": "Не обработано ни одного действительного изображения",
+	"separator": "Разделитель",
+	"edit": "Редактировать...",
+	"forNextMode": "для следующего режима",
+	"autoApprove": {
+		"title": "Автоматическое одобрение:",
+		"none": "Нет",
+		"description": "Автоматическое одобрение позволяет Roo Code выполнять действия без запроса разрешения. Включайте только для действий, которым вы полностью доверяете.",
+		"actions": {
+			"readFiles": {
+				"label": "Чтение файлов и директорий",
+				"shortName": "Чтение",
+				"description": "Разрешает доступ к чтению любого файла на вашем компьютере."
+			},
+			"editFiles": {
+				"label": "Редактирование файлов",
+				"shortName": "Редактирование",
+				"description": "Разрешает изменение любых файлов на вашем компьютере."
+			},
+			"executeCommands": {
+				"label": "Выполнение одобренных команд",
+				"shortName": "Команды",
+				"description": "Разрешает выполнение одобренных терминальных команд. Вы можете настроить это в панели настроек."
+			},
+			"useBrowser": {
+				"label": "Использование браузера",
+				"shortName": "Браузер",
+				"description": "Разрешает возможность запускать и взаимодействовать с любым веб-сайтом в браузере без интерфейса."
+			},
+			"useMcp": {
+				"label": "Использование серверов MCP",
+				"shortName": "MCP",
+				"description": "Разрешает использование настроенных серверов MCP, которые могут изменять файловую систему или взаимодействовать с API."
+			},
+			"switchModes": {
+				"label": "Переключение режимов",
+				"shortName": "Режимы",
+				"description": "Разрешает автоматическое переключение между различными режимами без необходимости одобрения."
+			},
+			"subtasks": {
+				"label": "Создание и выполнение подзадач",
+				"shortName": "Подзадачи",
+				"description": "Разрешает создание и выполнение подзадач без необходимости одобрения."
+			},
+			"retryRequests": {
+				"label": "Повторные попытки неудачных запросов",
+				"shortName": "Повторы",
+				"description": "Автоматически повторяет неудачные API-запросы, когда провайдер возвращает ответ с ошибкой."
+			}
+		}
+	}
 }

+ 25 - 0
webview-ui/src/i18n/locales/ru/history.json

@@ -0,0 +1,25 @@
+{
+	"recentTasks": "Недавние задачи",
+	"viewAll": "Показать все",
+	"tokens": "Tokens: ↑{{in}} ↓{{out}}",
+	"cache": "Кэш: +{{writes}} → {{reads}}",
+	"apiCost": "Стоимость API: ${{cost}}",
+	"history": "История",
+	"done": "Готово",
+	"searchPlaceholder": "Поиск по истории...",
+	"newest": "Новейшие",
+	"oldest": "Старейшие",
+	"mostExpensive": "Самые дорогие",
+	"mostTokens": "Больше всего токенов",
+	"mostRelevant": "Наиболее релевантные",
+	"deleteTaskTitle": "Удалить задачу (Shift + Клик для пропуска подтверждения)",
+	"tokensLabel": "Tokens:",
+	"cacheLabel": "Кэш:",
+	"apiCostLabel": "Стоимость API:",
+	"copyPrompt": "Копировать запрос",
+	"exportTask": "Экспортировать задачу",
+	"deleteTask": "Удалить задачу",
+	"deleteTaskMessage": "Вы уверены, что хотите удалить эту задачу? Это действие нельзя отменить.",
+	"cancel": "Отмена",
+	"delete": "Удалить"
+}

+ 54 - 1
webview-ui/src/i18n/locales/tr/chat.json

@@ -56,5 +56,58 @@
 	"typeTask": "Görevinizi buraya yazın...",
 	"addContext": "@ bağlam eklemek için, / modları değiştirmek için",
 	"dragFiles": "dosyaları sürüklemek için shift tuşunu basılı tutun",
-	"dragFilesImages": "dosyaları/resimleri sürüklemek için shift tuşunu basılı tutun"
+	"dragFilesImages": "dosyaları/resimleri sürüklemek için shift tuşunu basılı tutun",
+	"enhancePromptDescription": "'İstemi geliştir' düğmesi, ek bağlam, açıklama veya yeniden ifade sağlayarak istemlerinizi iyileştirmenize yardımcı olur. Buraya bir istem yazın ve nasıl çalıştığını görmek için düğmeye tekrar tıklayın.",
+	"errorReadingFile": "Dosya okuma hatası:",
+	"noValidImages": "Hiçbir geçerli resim işlenmedi",
+	"separator": "Ayırıcı",
+	"edit": "Düzenle...",
+	"forNextMode": "sonraki mod için",
+	"autoApprove": {
+		"title": "Otomatik onaylama:",
+		"none": "Yok",
+		"description": "Otomatik onaylama, Roo Code'un izin istemeden işlemler gerçekleştirmesine olanak tanır. Sadece tamamen güvendiğiniz işlemler için etkinleştirin.",
+		"actions": {
+			"readFiles": {
+				"label": "Dosya ve dizinleri oku",
+				"shortName": "Okuma",
+				"description": "Bilgisayarınızdaki herhangi bir dosyayı okuma erişimi sağlar."
+			},
+			"editFiles": {
+				"label": "Dosyaları düzenle",
+				"shortName": "Düzenleme",
+				"description": "Bilgisayarınızdaki herhangi bir dosyanın değiştirilmesine izin verir."
+			},
+			"executeCommands": {
+				"label": "Onaylanmış komutları çalıştır",
+				"shortName": "Komutlar",
+				"description": "Onaylanmış terminal komutlarının çalıştırılmasına izin verir. Bunu ayarlar panelinden yapılandırabilirsiniz."
+			},
+			"useBrowser": {
+				"label": "Tarayıcıyı kullan",
+				"shortName": "Tarayıcı",
+				"description": "Başsız bir tarayıcıda herhangi bir web sitesini başlatma ve etkileşimde bulunma yeteneği sağlar."
+			},
+			"useMcp": {
+				"label": "MCP sunucularını kullan",
+				"shortName": "MCP",
+				"description": "Dosya sistemini değiştirebilen veya API'lerle etkileşimde bulunabilen yapılandırılmış MCP sunucularının kullanımına izin verir."
+			},
+			"switchModes": {
+				"label": "Modları değiştir",
+				"shortName": "Modlar",
+				"description": "Onay gerektirmeden farklı modlar arasında otomatik geçiş yapılmasına izin verir."
+			},
+			"subtasks": {
+				"label": "Alt görevler oluştur ve tamamla",
+				"shortName": "Alt görevler",
+				"description": "Onay gerektirmeden alt görevlerin oluşturulmasına ve tamamlanmasına izin verir."
+			},
+			"retryRequests": {
+				"label": "Başarısız istekleri yeniden dene",
+				"shortName": "Yeniden Denemeler",
+				"description": "Sağlayıcı bir hata yanıtı döndürdüğünde başarısız API isteklerini otomatik olarak yeniden dener."
+			}
+		}
+	}
 }

+ 25 - 0
webview-ui/src/i18n/locales/tr/history.json

@@ -0,0 +1,25 @@
+{
+	"recentTasks": "Son Görevler",
+	"viewAll": "Tümünü Gör",
+	"tokens": "Tokens: ↑{{in}} ↓{{out}}",
+	"cache": "Önbellek: +{{writes}} → {{reads}}",
+	"apiCost": "API Maliyeti: ${{cost}}",
+	"history": "Geçmiş",
+	"done": "Tamam",
+	"searchPlaceholder": "Geçmişte ara...",
+	"newest": "En Yeni",
+	"oldest": "En Eski",
+	"mostExpensive": "En Pahalı",
+	"mostTokens": "En Çok Token",
+	"mostRelevant": "En İlgili",
+	"deleteTaskTitle": "Görevi Sil (Onayı atlamak için Shift + Tıkla)",
+	"tokensLabel": "Tokens:",
+	"cacheLabel": "Önbellek:",
+	"apiCostLabel": "API Maliyeti:",
+	"copyPrompt": "Promptu Kopyala",
+	"exportTask": "Görevi Dışa Aktar",
+	"deleteTask": "Görevi Sil",
+	"deleteTaskMessage": "Bu görevi silmek istediğinizden emin misiniz? Bu işlem geri alınamaz.",
+	"cancel": "İptal",
+	"delete": "Sil"
+}

+ 54 - 1
webview-ui/src/i18n/locales/zh-CN/chat.json

@@ -56,5 +56,58 @@
 	"typeTask": "输入您的任务...",
 	"addContext": "@ 添加上下文, / 切换模式",
 	"dragFiles": "按住 shift 拖入文件",
-	"dragFilesImages": "按住 shift 拖入文件/图片"
+	"dragFilesImages": "按住 shift 拖入文件/图片",
+	"enhancePromptDescription": "\"增强提示\"按钮通过提供额外的上下文、解释或重新表述来帮助改进你的提示。在此处输入提示,然后再次点击按钮查看其工作方式。",
+	"errorReadingFile": "读取文件时出错:",
+	"noValidImages": "没有处理有效图片",
+	"separator": "分隔线",
+	"edit": "编辑...",
+	"forNextMode": "切换至下一模式",
+	"autoApprove": {
+		"title": "自动批准:",
+		"none": "无",
+		"description": "自动批准允许 Roo Code 无需请求权限即可执行操作。仅对您完全信任的操作启用此功能。",
+		"actions": {
+			"readFiles": {
+				"label": "读取文件和目录",
+				"shortName": "读取",
+				"description": "允许访问并读取您计算机上的任何文件。"
+			},
+			"editFiles": {
+				"label": "编辑文件",
+				"shortName": "编辑",
+				"description": "允许修改您计算机上的任何文件。"
+			},
+			"executeCommands": {
+				"label": "执行已批准的命令",
+				"shortName": "命令",
+				"description": "允许执行已批准的终端命令。您可以在设置面板中配置此功能。"
+			},
+			"useBrowser": {
+				"label": "使用浏览器",
+				"shortName": "浏览器",
+				"description": "允许在无头浏览器中启动并与任何网站交互。"
+			},
+			"useMcp": {
+				"label": "使用 MCP 服务器",
+				"shortName": "MCP",
+				"description": "允许使用配置的 MCP 服务器,这些服务器可能会修改文件系统或与 API 交互。"
+			},
+			"switchModes": {
+				"label": "切换模式",
+				"shortName": "模式",
+				"description": "允许在不同模式之间自动切换,无需批准。"
+			},
+			"subtasks": {
+				"label": "创建和完成子任务",
+				"shortName": "子任务",
+				"description": "允许创建和完成子任务,无需批准。"
+			},
+			"retryRequests": {
+				"label": "重试失败的请求",
+				"shortName": "重试",
+				"description": "当提供者返回错误响应时,自动重试失败的 API 请求。"
+			}
+		}
+	}
 }

+ 25 - 0
webview-ui/src/i18n/locales/zh-CN/history.json

@@ -0,0 +1,25 @@
+{
+	"recentTasks": "最近任务",
+	"viewAll": "查看全部",
+	"tokens": "Tokens: ↑{{in}} ↓{{out}}",
+	"cache": "缓存: +{{writes}} → {{reads}}",
+	"apiCost": "API 成本: ${{cost}}",
+	"history": "历史记录",
+	"done": "完成",
+	"searchPlaceholder": "模糊搜索历史...",
+	"newest": "最新",
+	"oldest": "最早",
+	"mostExpensive": "最贵",
+	"mostTokens": "最多令牌",
+	"mostRelevant": "最相关",
+	"deleteTaskTitle": "删除任务(Shift + 点击跳过确认)",
+	"tokensLabel": "Tokens:",
+	"cacheLabel": "缓存:",
+	"apiCostLabel": "API 成本:",
+	"copyPrompt": "复制提示词",
+	"exportTask": "导出任务",
+	"deleteTask": "删除任务",
+	"deleteTaskMessage": "确定要删除此任务吗?此操作无法撤销。",
+	"cancel": "取消",
+	"delete": "删除"
+}

+ 54 - 1
webview-ui/src/i18n/locales/zh-TW/chat.json

@@ -56,5 +56,58 @@
 	"typeTask": "在此輸入您的任務...",
 	"addContext": "@ 添加上下文, / 切換模式",
 	"dragFiles": "按住 shift 拖動文件",
-	"dragFilesImages": "按住 shift 拖動文件/圖片"
+	"dragFilesImages": "按住 shift 拖動文件/圖片",
+	"enhancePromptDescription": "「增強提示」按鈕通過提供額外的上下文、解釋或重新表述來幫助改進你的提示。在此處輸入提示,然後再次點擊按鈕查看其工作方式。",
+	"errorReadingFile": "讀取檔案時出錯:",
+	"noValidImages": "沒有處理有效圖片",
+	"separator": "分隔線",
+	"edit": "編輯...",
+	"forNextMode": "切換至下一模式",
+	"autoApprove": {
+		"title": "自動批准:",
+		"none": "無",
+		"description": "自動批准允許 Roo Code 無需請求權限即可執行操作。僅對您完全信任的操作啟用此功能。",
+		"actions": {
+			"readFiles": {
+				"label": "讀取檔案和目錄",
+				"shortName": "讀取",
+				"description": "允許存取並讀取您電腦上的任何檔案。"
+			},
+			"editFiles": {
+				"label": "編輯檔案",
+				"shortName": "編輯",
+				"description": "允許修改您電腦上的任何檔案。"
+			},
+			"executeCommands": {
+				"label": "執行已批准的命令",
+				"shortName": "命令",
+				"description": "允許執行已批准的終端命令。您可以在設定面板中設定此功能。"
+			},
+			"useBrowser": {
+				"label": "使用瀏覽器",
+				"shortName": "瀏覽器",
+				"description": "允許在無頭瀏覽器中啟動並與任何網站互動。"
+			},
+			"useMcp": {
+				"label": "使用 MCP 伺服器",
+				"shortName": "MCP",
+				"description": "允許使用已設定的 MCP 伺服器,這些伺服器可能會修改檔案系統或與 API 互動。"
+			},
+			"switchModes": {
+				"label": "切換模式",
+				"shortName": "模式",
+				"description": "允許在不同模式之間自動切換,無需批准。"
+			},
+			"subtasks": {
+				"label": "建立和完成子任務",
+				"shortName": "子任務",
+				"description": "允許建立和完成子任務,無需批准。"
+			},
+			"retryRequests": {
+				"label": "重試失敗的請求",
+				"shortName": "重試",
+				"description": "當提供者返回錯誤回應時,自動重試失敗的 API 請求。"
+			}
+		}
+	}
 }

+ 25 - 0
webview-ui/src/i18n/locales/zh-TW/history.json

@@ -0,0 +1,25 @@
+{
+	"recentTasks": "最近任務",
+	"viewAll": "查看全部",
+	"tokens": "Tokens: ↑{{in}} ↓{{out}}",
+	"cache": "快取: +{{writes}} → {{reads}}",
+	"apiCost": "API 費用: ${{cost}}",
+	"history": "歷史記錄",
+	"done": "完成",
+	"searchPlaceholder": "模糊搜尋歷史...",
+	"newest": "最新",
+	"oldest": "最舊",
+	"mostExpensive": "最昂貴",
+	"mostTokens": "最多令牌",
+	"mostRelevant": "最相關",
+	"deleteTaskTitle": "刪除任務(Shift + 點擊跳過確認)",
+	"tokensLabel": "Tokens:",
+	"cacheLabel": "快取:",
+	"apiCostLabel": "API 費用:",
+	"copyPrompt": "複製提示詞",
+	"exportTask": "匯出任務",
+	"deleteTask": "刪除任務",
+	"deleteTaskMessage": "確定要刪除此任務嗎?此操作無法復原。",
+	"cancel": "取消",
+	"delete": "刪除"
+}