From 4106ca4a19cf1d3a04dcd09618bbb219aafac078 Mon Sep 17 00:00:00 2001 From: aheizi Date: Thu, 13 Mar 2025 20:55:32 +0800 Subject: [PATCH 01/58] support project-level mcp config --- src/core/webview/ClineProvider.ts | 22 ++++ .../webview/__tests__/ClineProvider.test.ts | 124 ++++++++++++++++++ src/services/mcp/McpHub.ts | 122 ++++++++++++++++- src/shared/WebviewMessage.ts | 1 + src/shared/mcp.ts | 2 + webview-ui/src/components/mcp/McpView.tsx | 34 ++++- 6 files changed, 293 insertions(+), 12 deletions(-) diff --git a/src/core/webview/ClineProvider.ts b/src/core/webview/ClineProvider.ts index b98934400d..403c6794df 100644 --- a/src/core/webview/ClineProvider.ts +++ b/src/core/webview/ClineProvider.ts @@ -1114,6 +1114,28 @@ export class ClineProvider implements vscode.WebviewViewProvider { } break } + case "openProjectMcpSettings": { + if (!vscode.workspace.workspaceFolders?.length) { + vscode.window.showErrorMessage("Please open a project folder first") + return + } + + const workspaceFolder = vscode.workspace.workspaceFolders[0] + const rooDir = path.join(workspaceFolder.uri.fsPath, ".roo") + const mcpPath = path.join(rooDir, "mcp.json") + + try { + await fs.mkdir(rooDir, { recursive: true }) + const exists = await fileExistsAtPath(mcpPath) + if (!exists) { + await fs.writeFile(mcpPath, JSON.stringify({ mcpServers: {} }, null, 2)) + } + await openFile(mcpPath) + } catch (error) { + vscode.window.showErrorMessage(`Failed to create or open .roo/mcp.json: ${error}`) + } + break + } case "openCustomModesSettings": { const customModesFilePath = await this.customModesManager.getCustomModesFilePath() if (customModesFilePath) { diff --git a/src/core/webview/__tests__/ClineProvider.test.ts b/src/core/webview/__tests__/ClineProvider.test.ts index abe7a8475a..6d75c01c69 100644 --- a/src/core/webview/__tests__/ClineProvider.test.ts +++ b/src/core/webview/__tests__/ClineProvider.test.ts @@ -1950,6 +1950,130 @@ describe("ClineProvider", () => { }) }) +describe("Project MCP Settings", () => { + let provider: ClineProvider + let mockContext: vscode.ExtensionContext + let mockOutputChannel: vscode.OutputChannel + let mockWebviewView: vscode.WebviewView + let mockPostMessage: jest.Mock + + beforeEach(() => { + jest.clearAllMocks() + + mockContext = { + extensionPath: "/test/path", + extensionUri: {} as vscode.Uri, + globalState: { + get: jest.fn(), + update: jest.fn(), + keys: jest.fn().mockReturnValue([]), + }, + secrets: { + get: jest.fn(), + store: jest.fn(), + delete: jest.fn(), + }, + subscriptions: [], + extension: { + packageJSON: { version: "1.0.0" }, + }, + globalStorageUri: { + fsPath: "/test/storage/path", + }, + } as unknown as vscode.ExtensionContext + + mockOutputChannel = { + appendLine: jest.fn(), + clear: jest.fn(), + dispose: jest.fn(), + } as unknown as vscode.OutputChannel + + mockPostMessage = jest.fn() + mockWebviewView = { + webview: { + postMessage: mockPostMessage, + html: "", + options: {}, + onDidReceiveMessage: jest.fn(), + asWebviewUri: jest.fn(), + }, + visible: true, + onDidDispose: jest.fn(), + onDidChangeVisibility: jest.fn(), + } as unknown as vscode.WebviewView + + provider = new ClineProvider(mockContext, mockOutputChannel) + }) + + test("handles openProjectMcpSettings message", async () => { + await provider.resolveWebviewView(mockWebviewView) + const messageHandler = (mockWebviewView.webview.onDidReceiveMessage as jest.Mock).mock.calls[0][0] + + // Mock workspace folders + ;(vscode.workspace as any).workspaceFolders = [{ uri: { fsPath: "/test/workspace" } }] + + // Mock fs functions + const fs = require("fs/promises") + fs.mkdir.mockResolvedValue(undefined) + fs.writeFile.mockResolvedValue(undefined) + + // Trigger openProjectMcpSettings + await messageHandler({ + type: "openProjectMcpSettings", + }) + + // Verify directory was created + expect(fs.mkdir).toHaveBeenCalledWith( + expect.stringContaining(".roo"), + expect.objectContaining({ recursive: true }), + ) + + // Verify file was created with default content + expect(fs.writeFile).toHaveBeenCalledWith( + expect.stringContaining("mcp.json"), + JSON.stringify({ mcpServers: {} }, null, 2), + ) + }) + + test("handles openProjectMcpSettings when workspace is not open", async () => { + await provider.resolveWebviewView(mockWebviewView) + const messageHandler = (mockWebviewView.webview.onDidReceiveMessage as jest.Mock).mock.calls[0][0] + + // Mock no workspace folders + ;(vscode.workspace as any).workspaceFolders = [] + + // Trigger openProjectMcpSettings + await messageHandler({ + type: "openProjectMcpSettings", + }) + + // Verify error message was shown + expect(vscode.window.showErrorMessage).toHaveBeenCalledWith("Please open a project folder first") + }) + + test("handles openProjectMcpSettings file creation error", async () => { + await provider.resolveWebviewView(mockWebviewView) + const messageHandler = (mockWebviewView.webview.onDidReceiveMessage as jest.Mock).mock.calls[0][0] + + // Mock workspace folders + ;(vscode.workspace as any).workspaceFolders = [{ uri: { fsPath: "/test/workspace" } }] + + // Mock fs functions to fail + const fs = require("fs/promises") + fs.mkdir.mockRejectedValue(new Error("Failed to create directory")) + + // Trigger openProjectMcpSettings + await messageHandler({ + type: "openProjectMcpSettings", + }) + + // Verify error message was shown + expect(vscode.window.showErrorMessage).toHaveBeenCalledWith( + expect.stringContaining("Failed to create or open .roo/mcp.json"), + ) + }) +}) + describe("ContextProxy integration", () => { let provider: ClineProvider let mockContext: vscode.ExtensionContext diff --git a/src/services/mcp/McpHub.ts b/src/services/mcp/McpHub.ts index 7dc1fb8531..bd0ccd5e1f 100644 --- a/src/services/mcp/McpHub.ts +++ b/src/services/mcp/McpHub.ts @@ -73,6 +73,7 @@ export class McpHub { private providerRef: WeakRef private disposables: vscode.Disposable[] = [] private settingsWatcher?: vscode.FileSystemWatcher + private projectMcpWatcher?: vscode.FileSystemWatcher private fileWatchers: Map = new Map() private isDisposed: boolean = false connections: McpConnection[] = [] @@ -81,9 +82,55 @@ export class McpHub { constructor(provider: ClineProvider) { this.providerRef = new WeakRef(provider) this.watchMcpSettingsFile() + this.watchProjectMcpFile() + this.setupWorkspaceFoldersWatcher() this.initializeMcpServers() } + private setupWorkspaceFoldersWatcher(): void { + this.disposables.push( + vscode.workspace.onDidChangeWorkspaceFolders(async () => { + await this.updateProjectMcpServers() + this.watchProjectMcpFile() + }), + ) + } + + private watchProjectMcpFile(): void { + this.projectMcpWatcher?.dispose() + + this.projectMcpWatcher = vscode.workspace.createFileSystemWatcher("**/.roo/mcp.json", false, false, false) + + this.disposables.push( + this.projectMcpWatcher.onDidChange(async () => { + await this.updateProjectMcpServers() + }), + this.projectMcpWatcher.onDidCreate(async () => { + await this.updateProjectMcpServers() + }), + this.projectMcpWatcher.onDidDelete(async () => { + await this.cleanupProjectMcpServers() + }), + ) + + this.disposables.push(this.projectMcpWatcher) + } + + private async updateProjectMcpServers(): Promise { + await this.cleanupProjectMcpServers() + await this.initializeProjectMcpServers() + } + + private async cleanupProjectMcpServers(): Promise { + const projectServers = this.connections.filter((conn) => conn.server.source === "project") + + for (const conn of projectServers) { + await this.deleteConnection(conn.server.name) + } + + await this.notifyWebviewOfServerChanges() + } + getServers(): McpServer[] { // Only return enabled servers return this.connections.filter((conn) => !conn.server.disabled).map((conn) => conn.server) @@ -158,16 +205,68 @@ export class McpHub { private async initializeMcpServers(): Promise { try { + // 1. Initialize global MCP servers const settingsPath = await this.getMcpSettingsFilePath() const content = await fs.readFile(settingsPath, "utf-8") const config = JSON.parse(content) - await this.updateServerConnections(config.mcpServers || {}) + await this.updateServerConnections(config.mcpServers || {}, "global") + + // 2. Initialize project-level MCP servers + await this.initializeProjectMcpServers() } catch (error) { console.error("Failed to initialize MCP servers:", error) } } - private async connectToServer(name: string, config: z.infer): Promise { + // Get project-level MCP configuration path + private async getProjectMcpPath(): Promise { + if (!vscode.workspace.workspaceFolders?.length) { + return null + } + + const workspaceFolder = vscode.workspace.workspaceFolders[0] + const projectMcpDir = path.join(workspaceFolder.uri.fsPath, ".roo") + const projectMcpPath = path.join(projectMcpDir, "mcp.json") + + try { + await fs.access(projectMcpPath) + return projectMcpPath + } catch { + return null + } + } + + // Initialize project-level MCP servers + private async initializeProjectMcpServers(): Promise { + const projectMcpPath = await this.getProjectMcpPath() + if (!projectMcpPath) { + return + } + + try { + const content = await fs.readFile(projectMcpPath, "utf-8") + const config = JSON.parse(content) + + // Validate configuration structure + const result = McpSettingsSchema.safeParse(config) + if (!result.success) { + vscode.window.showErrorMessage("项目 MCP 配置格式无效") + return + } + + // Update server connections + await this.updateServerConnections(result.data.mcpServers || {}, "project") + } catch (error) { + console.error("Failed to initialize project MCP servers:", error) + vscode.window.showErrorMessage(`初始化项目 MCP 服务器失败: ${error}`) + } + } + + private async connectToServer( + name: string, + config: z.infer, + source: "global" | "project" = "global", + ): Promise { // Remove existing connection if it exists await this.deleteConnection(name) @@ -272,6 +371,8 @@ export class McpHub { config: JSON.stringify(config), status: "connecting", disabled: config.disabled, + source, + projectPath: source === "project" ? vscode.workspace.workspaceFolders?.[0]?.uri.fsPath : undefined, }, client, transport, @@ -366,10 +467,17 @@ export class McpHub { } } - async updateServerConnections(newServers: Record): Promise { + async updateServerConnections( + newServers: Record, + source: "global" | "project" = "global", + ): Promise { this.isConnecting = true this.removeAllFileWatchers() - const currentNames = new Set(this.connections.map((conn) => conn.server.name)) + // Filter connections by source + const currentConnections = this.connections.filter( + (conn) => conn.server.source === source || (!conn.server.source && source === "global"), + ) + const currentNames = new Set(currentConnections.map((conn) => conn.server.name)) const newNames = new Set(Object.keys(newServers)) // Delete removed servers @@ -388,7 +496,7 @@ export class McpHub { // New server try { this.setupFileWatcher(name, config) - await this.connectToServer(name, config) + await this.connectToServer(name, config, source) } catch (error) { console.error(`Failed to connect to new MCP server ${name}:`, error) } @@ -397,8 +505,8 @@ export class McpHub { try { this.setupFileWatcher(name, config) await this.deleteConnection(name) - await this.connectToServer(name, config) - console.log(`Reconnected MCP server with updated config: ${name}`) + await this.connectToServer(name, config, source) + console.log(`Reconnected ${source} MCP server with updated config: ${name}`) } catch (error) { console.error(`Failed to reconnect MCP server ${name}:`, error) } diff --git a/src/shared/WebviewMessage.ts b/src/shared/WebviewMessage.ts index e9a64d891b..f00a9edd11 100644 --- a/src/shared/WebviewMessage.ts +++ b/src/shared/WebviewMessage.ts @@ -59,6 +59,7 @@ export interface WebviewMessage { | "screenshotQuality" | "remoteBrowserHost" | "openMcpSettings" + | "openProjectMcpSettings" | "restartMcpServer" | "toggleToolAlwaysAllow" | "toggleMcpServer" diff --git a/src/shared/mcp.ts b/src/shared/mcp.ts index 2bc38a12a8..7a490851bc 100644 --- a/src/shared/mcp.ts +++ b/src/shared/mcp.ts @@ -8,6 +8,8 @@ export type McpServer = { resourceTemplates?: McpResourceTemplate[] disabled?: boolean timeout?: number + source?: "global" | "project" + projectPath?: string } export type McpTool = { diff --git a/webview-ui/src/components/mcp/McpView.tsx b/webview-ui/src/components/mcp/McpView.tsx index ce37a4c09d..b615f96d08 100644 --- a/webview-ui/src/components/mcp/McpView.tsx +++ b/webview-ui/src/components/mcp/McpView.tsx @@ -94,16 +94,25 @@ const McpView = ({ onDone }: McpViewProps) => { )} - {/* Edit Settings Button */} -
+ {/* Edit Settings Buttons */} +
{ vscode.postMessage({ type: "openMcpSettings" }) }}> - Edit MCP Settings + Edit Global MCP + + { + vscode.postMessage({ type: "openProjectMcpSettings" }) + }}> + + Edit Project MCP
@@ -193,7 +202,22 @@ const ServerRow = ({ server, alwaysAllowMcp }: { server: McpServer; alwaysAllowM style={{ marginRight: "8px" }} /> )} - {server.name} + + {server.name} + {server.source && ( + + {server.source} + + )} +
e.stopPropagation()}> From f77606996f6a1a6ab420bbce7507f4993d772872 Mon Sep 17 00:00:00 2001 From: aheizi Date: Fri, 14 Mar 2025 20:59:21 +0800 Subject: [PATCH 02/58] Merge branch 'main' into support_project_mcp --- src/services/mcp/McpHub.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/mcp/McpHub.ts b/src/services/mcp/McpHub.ts index 4c904d0d24..46becd97a7 100644 --- a/src/services/mcp/McpHub.ts +++ b/src/services/mcp/McpHub.ts @@ -244,7 +244,7 @@ export class McpHub { private async connectToServer( name: string, - config: z.infer, + config: z.infer, source: "global" | "project" = "global", ): Promise { // Remove existing connection if it exists (should never happen, the connection should be deleted beforehand) From 26941dcaae32554a9b83d5935d05ca895d0006ed Mon Sep 17 00:00:00 2001 From: aheizi Date: Sat, 15 Mar 2025 17:33:04 +0800 Subject: [PATCH 03/58] switch the toasts to English fix test --- src/services/mcp/McpHub.ts | 10 +++++++--- src/services/mcp/__tests__/McpHub.test.ts | 22 +++++++++++++++++++++- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/src/services/mcp/McpHub.ts b/src/services/mcp/McpHub.ts index 46becd97a7..488e77b80a 100644 --- a/src/services/mcp/McpHub.ts +++ b/src/services/mcp/McpHub.ts @@ -67,7 +67,11 @@ export class McpHub { this.initializeMcpServers() } - private setupWorkspaceFoldersWatcher(): void { + public setupWorkspaceFoldersWatcher(): void { + // Skip if test environment is detected + if (process.env.NODE_ENV === "test" || process.env.JEST_WORKER_ID !== undefined) { + return + } this.disposables.push( vscode.workspace.onDidChangeWorkspaceFolders(async () => { await this.updateProjectMcpServers() @@ -230,7 +234,7 @@ export class McpHub { // Validate configuration structure const result = McpSettingsSchema.safeParse(config) if (!result.success) { - vscode.window.showErrorMessage("项目 MCP 配置格式无效") + vscode.window.showErrorMessage("Invalid project MCP configuration format") return } @@ -238,7 +242,7 @@ export class McpHub { await this.updateServerConnections(result.data.mcpServers || {}, "project") } catch (error) { console.error("Failed to initialize project MCP servers:", error) - vscode.window.showErrorMessage(`初始化项目 MCP 服务器失败: ${error}`) + vscode.window.showErrorMessage(`Failed to initialize project MCP server: ${error}`) } } diff --git a/src/services/mcp/__tests__/McpHub.test.ts b/src/services/mcp/__tests__/McpHub.test.ts index b418bae21a..cd0f6e3eb2 100644 --- a/src/services/mcp/__tests__/McpHub.test.ts +++ b/src/services/mcp/__tests__/McpHub.test.ts @@ -7,7 +7,27 @@ import { StdioConfigSchema } from "../McpHub" const fs = require("fs/promises") const { McpHub } = require("../McpHub") -jest.mock("vscode") +jest.mock("vscode", () => ({ + workspace: { + createFileSystemWatcher: jest.fn().mockReturnValue({ + onDidChange: jest.fn(), + onDidCreate: jest.fn(), + onDidDelete: jest.fn(), + dispose: jest.fn(), + }), + onDidSaveTextDocument: jest.fn(), + onDidChangeWorkspaceFolders: jest.fn(), + workspaceFolders: [], + }, + window: { + showErrorMessage: jest.fn(), + showInformationMessage: jest.fn(), + showWarningMessage: jest.fn(), + }, + Disposable: { + from: jest.fn(), + }, +})) jest.mock("fs/promises") jest.mock("../../../core/webview/ClineProvider") From 3b5b34012f02de2e1fbfe78b9159dfc524a1ee25 Mon Sep 17 00:00:00 2001 From: Wojciech Kordalski Date: Sat, 15 Mar 2025 12:05:55 +0100 Subject: [PATCH 04/58] Expose task IDs on the Cline stack --- src/core/webview/ClineProvider.ts | 4 ++++ src/exports/api.ts | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/src/core/webview/ClineProvider.ts b/src/core/webview/ClineProvider.ts index 87f33dc418..67bb03d585 100644 --- a/src/core/webview/ClineProvider.ts +++ b/src/core/webview/ClineProvider.ts @@ -169,6 +169,10 @@ export class ClineProvider implements vscode.WebviewViewProvider { return this.clineStack.length } + public getCurrentTaskStack(): string[] { + return this.clineStack.map((cline) => cline.taskId) + } + // remove the current task/cline instance (at the top of the stack), ao this task is finished // and resume the previous task/cline instance (if it exists) // this is used when a sub task is finished and the parent task needs to be resumed diff --git a/src/exports/api.ts b/src/exports/api.ts index 91817fcc58..9590f9cbf8 100644 --- a/src/exports/api.ts +++ b/src/exports/api.ts @@ -79,4 +79,8 @@ export class API extends EventEmitter implements RooCodeAPI { public getMessages(taskId: string) { return this.history.getMessages(taskId) } + + public getCurrentTaskStack(): string[] { + return this.provider.getCurrentTaskStack() + } } From bf497119c8369f745ab5c71951445c6cec6a534e Mon Sep 17 00:00:00 2001 From: Wojciech Kordalski Date: Sat, 15 Mar 2025 12:16:18 +0100 Subject: [PATCH 05/58] Expose event that informs that user responded to "ask" request --- src/core/Cline.ts | 2 ++ src/exports/api.ts | 1 + src/exports/roo-code.d.ts | 1 + 3 files changed, 4 insertions(+) diff --git a/src/core/Cline.ts b/src/core/Cline.ts index 8b5afe9806..37824acb8b 100644 --- a/src/core/Cline.ts +++ b/src/core/Cline.ts @@ -89,6 +89,7 @@ export type ClineEvents = { taskStarted: [] taskPaused: [] taskUnpaused: [] + taskAskResponded: [] taskAborted: [] taskSpawned: [taskId: string] } @@ -495,6 +496,7 @@ export class Cline extends EventEmitter { this.askResponse = undefined this.askResponseText = undefined this.askResponseImages = undefined + this.emit("taskAskResponded") return result } diff --git a/src/exports/api.ts b/src/exports/api.ts index 91817fcc58..415cf8e004 100644 --- a/src/exports/api.ts +++ b/src/exports/api.ts @@ -42,6 +42,7 @@ export class API extends EventEmitter implements RooCodeAPI { cline.on("taskStarted", () => this.emit("taskStarted", cline.taskId)) cline.on("taskPaused", () => this.emit("taskPaused", cline.taskId)) cline.on("taskUnpaused", () => this.emit("taskUnpaused", cline.taskId)) + cline.on("taskAskResponded", () => this.emit("taskAskResponded", cline.taskId)) cline.on("taskAborted", () => this.emit("taskAborted", cline.taskId)) cline.on("taskSpawned", (taskId) => this.emit("taskSpawned", cline.taskId, taskId)) diff --git a/src/exports/roo-code.d.ts b/src/exports/roo-code.d.ts index 1c45dec84b..380762368c 100644 --- a/src/exports/roo-code.d.ts +++ b/src/exports/roo-code.d.ts @@ -5,6 +5,7 @@ export interface RooCodeEvents { taskStarted: [taskId: string] taskPaused: [taskId: string] taskUnpaused: [taskId: string] + taskAskResponded: [taskId: string] taskAborted: [taskId: string] taskSpawned: [taskId: string, childTaskId: string] } From c4559b7d0f1c8020cad7f0ae6416e16a2f98b40a Mon Sep 17 00:00:00 2001 From: Wojciech Kordalski Date: Sat, 15 Mar 2025 13:17:50 +0100 Subject: [PATCH 06/58] Add the `getCurrentTaskStack` method to public API interface --- src/exports/roo-code.d.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/exports/roo-code.d.ts b/src/exports/roo-code.d.ts index 1c45dec84b..6128e4a7c4 100644 --- a/src/exports/roo-code.d.ts +++ b/src/exports/roo-code.d.ts @@ -62,6 +62,12 @@ export interface RooCodeAPI extends EventEmitter { * @returns An array of ClineMessage objects. */ getMessages(taskId: string): ClineMessage[] + + /** + * Returns the current task stack. + * @returns An array of task IDs. + */ + getCurrentTaskStack(): string[] } export type ClineAsk = From 66c6dbb680ff562e4cfd57844e9570fa65b7c21d Mon Sep 17 00:00:00 2001 From: feifei Date: Sun, 16 Mar 2025 01:11:26 +0800 Subject: [PATCH 07/58] implemented i18n for Internationalization of Conversation Buttons and Prompts Signed-off-by: feifei --- webview-ui/src/components/chat/ChatView.tsx | 107 +++++++++--------- .../src/components/common/TelemetryBanner.tsx | 15 +-- webview-ui/src/i18n/locales/ar/chat.json | 60 ++++++++++ webview-ui/src/i18n/locales/ar/common.json | 8 ++ webview-ui/src/i18n/locales/ca/chat.json | 60 ++++++++++ webview-ui/src/i18n/locales/ca/common.json | 8 ++ webview-ui/src/i18n/locales/cs/chat.json | 60 ++++++++++ webview-ui/src/i18n/locales/cs/common.json | 8 ++ webview-ui/src/i18n/locales/de/chat.json | 60 ++++++++++ webview-ui/src/i18n/locales/de/common.json | 8 ++ webview-ui/src/i18n/locales/en/chat.json | 59 +++++++++- webview-ui/src/i18n/locales/en/common.json | 8 ++ webview-ui/src/i18n/locales/es/chat.json | 60 ++++++++++ webview-ui/src/i18n/locales/es/common.json | 8 ++ webview-ui/src/i18n/locales/fr/chat.json | 60 ++++++++++ webview-ui/src/i18n/locales/fr/common.json | 8 ++ webview-ui/src/i18n/locales/hi/chat.json | 60 ++++++++++ webview-ui/src/i18n/locales/hi/common.json | 8 ++ webview-ui/src/i18n/locales/hu/chat.json | 60 ++++++++++ webview-ui/src/i18n/locales/hu/common.json | 8 ++ webview-ui/src/i18n/locales/it/chat.json | 60 ++++++++++ webview-ui/src/i18n/locales/it/common.json | 8 ++ webview-ui/src/i18n/locales/ja/chat.json | 60 ++++++++++ webview-ui/src/i18n/locales/ja/common.json | 8 ++ webview-ui/src/i18n/locales/ko/chat.json | 60 ++++++++++ webview-ui/src/i18n/locales/ko/common.json | 8 ++ webview-ui/src/i18n/locales/pl/chat.json | 60 ++++++++++ webview-ui/src/i18n/locales/pl/common.json | 8 ++ webview-ui/src/i18n/locales/pt-BR/chat.json | 60 ++++++++++ webview-ui/src/i18n/locales/pt-BR/common.json | 8 ++ webview-ui/src/i18n/locales/pt/chat.json | 60 ++++++++++ webview-ui/src/i18n/locales/pt/common.json | 8 ++ webview-ui/src/i18n/locales/ru/chat.json | 60 ++++++++++ webview-ui/src/i18n/locales/ru/common.json | 8 ++ webview-ui/src/i18n/locales/tr/chat.json | 60 ++++++++++ webview-ui/src/i18n/locales/tr/common.json | 8 ++ webview-ui/src/i18n/locales/zh-CN/chat.json | 60 ++++++++++ webview-ui/src/i18n/locales/zh-CN/common.json | 8 ++ webview-ui/src/i18n/locales/zh-TW/chat.json | 60 ++++++++++ webview-ui/src/i18n/locales/zh-TW/common.json | 8 ++ 40 files changed, 1349 insertions(+), 64 deletions(-) create mode 100644 webview-ui/src/i18n/locales/ar/chat.json create mode 100644 webview-ui/src/i18n/locales/ar/common.json create mode 100644 webview-ui/src/i18n/locales/ca/chat.json create mode 100644 webview-ui/src/i18n/locales/ca/common.json create mode 100644 webview-ui/src/i18n/locales/cs/chat.json create mode 100644 webview-ui/src/i18n/locales/cs/common.json create mode 100644 webview-ui/src/i18n/locales/de/chat.json create mode 100644 webview-ui/src/i18n/locales/de/common.json create mode 100644 webview-ui/src/i18n/locales/en/common.json create mode 100644 webview-ui/src/i18n/locales/es/chat.json create mode 100644 webview-ui/src/i18n/locales/es/common.json create mode 100644 webview-ui/src/i18n/locales/fr/chat.json create mode 100644 webview-ui/src/i18n/locales/fr/common.json create mode 100644 webview-ui/src/i18n/locales/hi/chat.json create mode 100644 webview-ui/src/i18n/locales/hi/common.json create mode 100644 webview-ui/src/i18n/locales/hu/chat.json create mode 100644 webview-ui/src/i18n/locales/hu/common.json create mode 100644 webview-ui/src/i18n/locales/it/chat.json create mode 100644 webview-ui/src/i18n/locales/it/common.json create mode 100644 webview-ui/src/i18n/locales/ja/chat.json create mode 100644 webview-ui/src/i18n/locales/ja/common.json create mode 100644 webview-ui/src/i18n/locales/ko/chat.json create mode 100644 webview-ui/src/i18n/locales/ko/common.json create mode 100644 webview-ui/src/i18n/locales/pl/chat.json create mode 100644 webview-ui/src/i18n/locales/pl/common.json create mode 100644 webview-ui/src/i18n/locales/pt-BR/chat.json create mode 100644 webview-ui/src/i18n/locales/pt-BR/common.json create mode 100644 webview-ui/src/i18n/locales/pt/chat.json create mode 100644 webview-ui/src/i18n/locales/pt/common.json create mode 100644 webview-ui/src/i18n/locales/ru/chat.json create mode 100644 webview-ui/src/i18n/locales/ru/common.json create mode 100644 webview-ui/src/i18n/locales/tr/chat.json create mode 100644 webview-ui/src/i18n/locales/tr/common.json create mode 100644 webview-ui/src/i18n/locales/zh-CN/chat.json create mode 100644 webview-ui/src/i18n/locales/zh-CN/common.json create mode 100644 webview-ui/src/i18n/locales/zh-TW/chat.json create mode 100644 webview-ui/src/i18n/locales/zh-TW/common.json diff --git a/webview-ui/src/components/chat/ChatView.tsx b/webview-ui/src/components/chat/ChatView.tsx index 10e310d441..aa179e7557 100644 --- a/webview-ui/src/components/chat/ChatView.tsx +++ b/webview-ui/src/components/chat/ChatView.tsx @@ -119,16 +119,16 @@ const ChatView = ({ isHidden, showAnnouncement, hideAnnouncement, showHistoryVie setTextAreaDisabled(true) setClineAsk("api_req_failed") setEnableButtons(true) - setPrimaryButtonText("Retry") - setSecondaryButtonText("Start New Task") + setPrimaryButtonText(t("chat:retry.title")) + setSecondaryButtonText(t("chat:startNewTask.title")) break case "mistake_limit_reached": playSound("progress_loop") setTextAreaDisabled(false) setClineAsk("mistake_limit_reached") setEnableButtons(true) - setPrimaryButtonText("Proceed Anyways") - setSecondaryButtonText("Start New Task") + setPrimaryButtonText(t("chat:proceedAnyways.title")) + setSecondaryButtonText(t("chat:startNewTask.title")) break case "followup": setTextAreaDisabled(isPartial) @@ -149,16 +149,16 @@ const ChatView = ({ isHidden, showAnnouncement, hideAnnouncement, showHistoryVie case "editedExistingFile": case "appliedDiff": case "newFileCreated": - setPrimaryButtonText("Save") - setSecondaryButtonText("Reject") + setPrimaryButtonText(t("chat:save.title")) + setSecondaryButtonText(t("chat:reject.title")) break case "finishTask": - setPrimaryButtonText("Complete Subtask and Return") + setPrimaryButtonText(t("chat:completeSubtaskAndReturn.title")) setSecondaryButtonText(undefined) break default: - setPrimaryButtonText("Approve") - setSecondaryButtonText("Reject") + setPrimaryButtonText(t("chat:approve.title")) + setSecondaryButtonText(t("chat:reject.title")) break } break @@ -169,8 +169,8 @@ const ChatView = ({ isHidden, showAnnouncement, hideAnnouncement, showHistoryVie setTextAreaDisabled(isPartial) setClineAsk("browser_action_launch") setEnableButtons(!isPartial) - setPrimaryButtonText("Approve") - setSecondaryButtonText("Reject") + setPrimaryButtonText(t("chat:approve.title")) + setSecondaryButtonText(t("chat:reject.title")) break case "command": if (!isAutoApproved(lastMessage)) { @@ -179,22 +179,22 @@ const ChatView = ({ isHidden, showAnnouncement, hideAnnouncement, showHistoryVie setTextAreaDisabled(isPartial) setClineAsk("command") setEnableButtons(!isPartial) - setPrimaryButtonText("Run Command") - setSecondaryButtonText("Reject") + setPrimaryButtonText(t("chat:runCommand.title")) + setSecondaryButtonText(t("chat:reject.title")) break case "command_output": setTextAreaDisabled(false) setClineAsk("command_output") setEnableButtons(true) - setPrimaryButtonText("Proceed While Running") + setPrimaryButtonText(t("chat:proceedWhileRunning.title")) setSecondaryButtonText(undefined) break case "use_mcp_server": setTextAreaDisabled(isPartial) setClineAsk("use_mcp_server") setEnableButtons(!isPartial) - setPrimaryButtonText("Approve") - setSecondaryButtonText("Reject") + setPrimaryButtonText(t("chat:approve.title")) + setSecondaryButtonText(t("chat:reject.title")) break case "completion_result": // extension waiting for feedback. but we can just present a new task button @@ -202,22 +202,22 @@ const ChatView = ({ isHidden, showAnnouncement, hideAnnouncement, showHistoryVie setTextAreaDisabled(isPartial) setClineAsk("completion_result") setEnableButtons(!isPartial) - setPrimaryButtonText("Start New Task") + setPrimaryButtonText(t("chat:startNewTask.title")) setSecondaryButtonText(undefined) break case "resume_task": setTextAreaDisabled(false) setClineAsk("resume_task") setEnableButtons(true) - setPrimaryButtonText("Resume Task") - setSecondaryButtonText("Terminate") + setPrimaryButtonText(t("chat:resumeTask.title")) + setSecondaryButtonText(t("chat:terminate.title")) setDidClickCancel(false) // special case where we reset the cancel button state break case "resume_completed_task": setTextAreaDisabled(false) setClineAsk("resume_completed_task") setEnableButtons(true) - setPrimaryButtonText("Start New Task") + setPrimaryButtonText(t("chat:startNewTask.title")) setSecondaryButtonText(undefined) setDidClickCancel(false) break @@ -942,11 +942,11 @@ const ChatView = ({ isHidden, showAnnouncement, hideAnnouncement, showHistoryVie ) const placeholderText = useMemo(() => { - const baseText = task ? "Type a message..." : "Type your task here..." - const contextText = "(@ to add context, / to switch modes" - const imageText = shouldDisableImages ? ", hold shift to drag in files" : ", hold shift to drag in files/images" + 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]) + }, [task, shouldDisableImages, t]) const itemContent = useCallback( (index: number, messageOrGroup: ClineMessage | ClineMessage[]) => { @@ -1107,13 +1107,7 @@ const ChatView = ({ isHidden, showAnnouncement, hideAnnouncement, showHistoryVie {showAnnouncement && }

{t("chat:greeting")}

-

- Thanks to the latest breakthroughs in agentic coding capabilities, I can handle complex - software development tasks step-by-step. With tools that let me create & edit files, explore - complex projects, use the browser, and execute terminal commands (after you grant - permission), I can assist you in ways that go beyond code completion or tech support. I can - even use MCP to create new tools and extend my own capabilities. -

+

{t("chat:aboutMe")}

{taskHistory.length > 0 && }
@@ -1185,7 +1179,7 @@ const ChatView = ({ isHidden, showAnnouncement, hideAnnouncement, showHistoryVie scrollToBottomSmooth() disableAutoScrollRef.current = false }} - title="Scroll to bottom of chat"> + title={t("chat:scrollToBottom")}>
@@ -1210,22 +1204,23 @@ const ChatView = ({ isHidden, showAnnouncement, hideAnnouncement, showHistoryVie marginRight: secondaryButtonText ? "6px" : "0", }} title={ - primaryButtonText === "Retry" - ? "Try the operation again" - : primaryButtonText === "Save" - ? "Save the file changes" - : primaryButtonText === "Approve" - ? "Approve this action" - : primaryButtonText === "Run Command" - ? "Execute this command" - : primaryButtonText === "Start New Task" - ? "Begin a new task" - : primaryButtonText === "Resume Task" - ? "Continue the current task" - : primaryButtonText === "Proceed Anyways" - ? "Continue despite warnings" - : primaryButtonText === "Proceed While Running" - ? "Continue while command executes" + primaryButtonText === t("chat:retry.title") + ? t("chat:retry.tooltip") + : primaryButtonText === t("chat:save.title") + ? t("chat:save.tooltip") + : primaryButtonText === t("chat:approve.title") + ? t("chat:approve.tooltip") + : primaryButtonText === t("chat:runCommand.title") + ? t("chat:runCommand.tooltip") + : primaryButtonText === t("chat:startNewTask.title") + ? t("chat:startNewTask.tooltip") + : primaryButtonText === t("chat:resumeTask.title") + ? t("chat:resumeTask.tooltip") + : primaryButtonText === t("chat:proceedAnyways.title") + ? t("chat:proceedAnyways.tooltip") + : primaryButtonText === + t("chat:proceedWhileRunning.title") + ? t("chat:proceedWhileRunning.tooltip") : undefined } onClick={(e) => handlePrimaryButtonClick(inputValue, selectedImages)}> @@ -1242,17 +1237,17 @@ const ChatView = ({ isHidden, showAnnouncement, hideAnnouncement, showHistoryVie }} title={ isStreaming - ? "Cancel the current operation" - : secondaryButtonText === "Start New Task" - ? "Begin a new task" - : secondaryButtonText === "Reject" - ? "Reject this action" - : secondaryButtonText === "Terminate" - ? "End the current task" + ? t("chat:cancel.tooltip") + : secondaryButtonText === t("chat:startNewTask.title") + ? t("chat:startNewTask.tooltip") + : secondaryButtonText === t("chat:reject.title") + ? t("chat:reject.tooltip") + : secondaryButtonText === t("chat:terminate.title") + ? t("chat:terminate.tooltip") : undefined } onClick={(e) => handleSecondaryButtonClick(inputValue, selectedImages)}> - {isStreaming ? "Cancel" : secondaryButtonText} + {isStreaming ? t("chat:cancel.title") : secondaryButtonText} )} diff --git a/webview-ui/src/components/common/TelemetryBanner.tsx b/webview-ui/src/components/common/TelemetryBanner.tsx index ee09e20b2d..e6f52ce2d6 100644 --- a/webview-ui/src/components/common/TelemetryBanner.tsx +++ b/webview-ui/src/components/common/TelemetryBanner.tsx @@ -3,6 +3,7 @@ import { memo, useState } from "react" import styled from "styled-components" import { vscode } from "../../utils/vscode" import { TelemetrySetting } from "../../../../src/shared/TelemetrySetting" +import { useAppTranslation } from "../../i18n/TranslationContext" const BannerContainer = styled.div` background-color: var(--vscode-banner-background); @@ -24,6 +25,7 @@ const ButtonContainer = styled.div` ` const TelemetryBanner = () => { + const { t } = useAppTranslation() const [hasChosen, setHasChosen] = useState(false) const handleAllow = () => { @@ -43,14 +45,13 @@ const TelemetryBanner = () => { return (
- Help Improve Roo Code + {t("common:telemetryTitle")}
- Send anonymous error and usage data to help us fix bugs and improve the extension. No code, prompts, - or personal information is ever sent. + {t("common:anonymousTelemetry")}
- You can always change this at the bottom of the{" "} + {t("common:changeSettings")}{" "} - settings + {t("common:settings")} .
@@ -58,10 +59,10 @@ const TelemetryBanner = () => {
- Allow + {t("common:allow")} - Deny + {t("common:deny")} diff --git a/webview-ui/src/i18n/locales/ar/chat.json b/webview-ui/src/i18n/locales/ar/chat.json new file mode 100644 index 0000000000..caef10a830 --- /dev/null +++ b/webview-ui/src/i18n/locales/ar/chat.json @@ -0,0 +1,60 @@ +{ + "greeting": "ماذا يمكن أن يفعل Roo من أجلك؟", + "retry": { + "title": "إعادة المحاولة", + "tooltip": "حاول العملية مرة أخرى" + }, + "startNewTask": { + "title": "بدء مهمة جديدة", + "tooltip": "ابدأ مهمة جديدة" + }, + "proceedAnyways": { + "title": "المتابعة على أي حال", + "tooltip": "استمر أثناء تنفيذ الأمر" + }, + "save": { + "title": "حفظ", + "tooltip": "حفظ تغييرات الملف" + }, + "reject": { + "title": "رفض", + "tooltip": "رفض هذا الإجراء" + }, + "completeSubtaskAndReturn": "إكمال المهمة الفرعية والعودة", + "approve": { + "title": "موافقة", + "tooltip": "الموافقة على هذا الإجراء" + }, + "runCommand": { + "title": "تنفيذ الأمر", + "tooltip": "تنفيذ هذا الأمر" + }, + "proceedWhileRunning": { + "title": "المتابعة أثناء التشغيل", + "tooltip": "استمر على الرغم من التحذيرات" + }, + "resumeTask": { + "title": "استئناف المهمة", + "tooltip": "استئناف المهمة الحالية" + }, + "terminate": { + "title": "إنهاء", + "tooltip": "إنهاء المهمة الحالية" + }, + "cancel": { + "title": "إلغاء", + "tooltip": "إلغاء العملية الحالية" + }, + "scrollToBottom": "التمرير إلى أسفل الدردشة", + "aboutMe": "بفضل أحدث التطورات في قدرات الترميز الذكية، يمكنني التعامل مع مهام تطوير البرمجيات المعقدة خطوة بخطوة. باستخدام الأدوات التي تتيح لي إنشاء وتحرير الملفات، واستكشاف المشاريع المعقدة، واستخدام المتصفح، وتنفيذ أوامر الطرفية (بعد منحك الإذن)، يمكنني مساعدتك بطرق تتجاوز إكمال التعليمات البرمجية أو الدعم الفني. يمكنني حتى استخدام MCP لإنشاء أدوات جديدة وتوسيع قدراتي الخاصة.", + "selectMode": "اختر وضع التفاعل", + "selectApiConfig": "اختر تكوين API", + "enhancePrompt": "تحسين المطالبة بسياق إضافي", + "addImages": "إضافة صور إلى الرسالة", + "sendMessage": "إرسال الرسالة", + "typeMessage": "اكتب رسالة...", + "typeTask": "اكتب مهمتك هنا...", + "addContext": "(@ لإضافة سياق، / لتبديل الأوضاع", + "dragFiles": "اضغط على shift لسحب الملفات", + "dragFilesImages": "اضغط على shift لسحب الملفات/الصور" +} diff --git a/webview-ui/src/i18n/locales/ar/common.json b/webview-ui/src/i18n/locales/ar/common.json new file mode 100644 index 0000000000..212235bd90 --- /dev/null +++ b/webview-ui/src/i18n/locales/ar/common.json @@ -0,0 +1,8 @@ +{ + "title": "ساعد في تحسين Roo Code", + "anonymousTelemetry": "إرسال بيانات الاستخدام والأخطاء المجهولة للمساعدة في إصلاح الأخطاء وتحسين الامتداد. لا يتم إرسال أي كود أو نصوص أو معلومات شخصية.", + "changeSettings": "يمكنك دائمًا تغيير هذا في أسفل الإعدادات", + "settings": "الإعدادات", + "allow": "السماح", + "deny": "رفض" +} diff --git a/webview-ui/src/i18n/locales/ca/chat.json b/webview-ui/src/i18n/locales/ca/chat.json new file mode 100644 index 0000000000..192d8ed7dd --- /dev/null +++ b/webview-ui/src/i18n/locales/ca/chat.json @@ -0,0 +1,60 @@ +{ + "greeting": "Què pot fer Roo per tu?", + "retry": { + "title": "Tornar a intentar", + "tooltip": "Torna a provar l'operació" + }, + "startNewTask": { + "title": "Començar una nova tasca", + "tooltip": "Comença una nova tasca" + }, + "proceedAnyways": { + "title": "Continuar de totes maneres", + "tooltip": "Continua mentre s'executa l'ordre" + }, + "save": { + "title": "Desar", + "tooltip": "Desa els canvis del fitxer" + }, + "reject": { + "title": "Rebutjar", + "tooltip": "Rebutja aquesta acció" + }, + "completeSubtaskAndReturn": "Completar la subtasca i tornar", + "approve": { + "title": "Aprovar", + "tooltip": "Aprova aquesta acció" + }, + "runCommand": { + "title": "Executar ordre", + "tooltip": "Executa aquesta ordre" + }, + "proceedWhileRunning": { + "title": "Continuar mentre s'executa", + "tooltip": "Continua malgrat els advertiments" + }, + "resumeTask": { + "title": "Reprendre la tasca", + "tooltip": "Repren la tasca actual" + }, + "terminate": { + "title": "Finalitzar", + "tooltip": "Finalitza la tasca actual" + }, + "cancel": { + "title": "Cancel·lar", + "tooltip": "Cancel·la l'operació actual" + }, + "scrollToBottom": "Desplaça't al final del xat", + "aboutMe": "Gràcies als últims avenços en capacitats de codificació intel·ligent, puc gestionar tasques complexes de desenvolupament de programari pas a pas. Amb eines que em permeten crear i editar fitxers, explorar projectes complexos, utilitzar el navegador i executar ordres de terminal (després que em donis permís), puc ajudar-te de maneres que van més enllà de la finalització de codi o el suport tècnic. Fins i tot puc utilitzar MCP per crear noves eines i ampliar les meves capacitats.", + "selectMode": "Selecciona el mode d'interacció", + "selectApiConfig": "Selecciona la configuració de l'API", + "enhancePrompt": "Millora la sol·licitud amb context addicional", + "addImages": "Afegeix imatges al missatge", + "sendMessage": "Envia el missatge", + "typeMessage": "Escriu un missatge...", + "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" +} diff --git a/webview-ui/src/i18n/locales/ca/common.json b/webview-ui/src/i18n/locales/ca/common.json new file mode 100644 index 0000000000..3674fd8a8e --- /dev/null +++ b/webview-ui/src/i18n/locales/ca/common.json @@ -0,0 +1,8 @@ +{ + "title": "Ajuda a millorar Roo Code", + "anonymousTelemetry": "Envia dades d'ús i errors anònims per ajudar-nos a corregir errors i millorar l'extensió. No s'envia mai cap codi, text o informació personal.", + "changeSettings": "Sempre pots canviar això a la part inferior de la configuració", + "settings": "configuració", + "allow": "Permetre", + "deny": "Denegar" +} diff --git a/webview-ui/src/i18n/locales/cs/chat.json b/webview-ui/src/i18n/locales/cs/chat.json new file mode 100644 index 0000000000..4ab1963d8c --- /dev/null +++ b/webview-ui/src/i18n/locales/cs/chat.json @@ -0,0 +1,60 @@ +{ + "greeting": "Co pro vás může Roo udělat?", + "retry": { + "title": "Zkusit znovu", + "tooltip": "Zkuste operaci znovu" + }, + "startNewTask": { + "title": "Zahájit nový úkol", + "tooltip": "Začněte nový úkol" + }, + "proceedAnyways": { + "title": "Pokračovat i tak", + "tooltip": "Pokračujte během provádění příkazu" + }, + "save": { + "title": "Uložit", + "tooltip": "Uložit změny souboru" + }, + "reject": { + "title": "Odmítnout", + "tooltip": "Odmítnout tuto akci" + }, + "completeSubtaskAndReturn": "Dokončit dílčí úkol a vrátit se", + "approve": { + "title": "Schválit", + "tooltip": "Schválit tuto akci" + }, + "runCommand": { + "title": "Spustit příkaz", + "tooltip": "Spustit tento příkaz" + }, + "proceedWhileRunning": { + "title": "Pokračovat během provádění", + "tooltip": "Pokračujte navzdory varováním" + }, + "resumeTask": { + "title": "Pokračovat v úkolu", + "tooltip": "Pokračujte v aktuálním úkolu" + }, + "terminate": { + "title": "Ukončit", + "tooltip": "Ukončit aktuální úkol" + }, + "cancel": { + "title": "Zrušit", + "tooltip": "Zrušit aktuální operaci" + }, + "scrollToBottom": "Přejít na konec chatu", + "aboutMe": "Díky nejnovějším průlomům v agentních kódovacích schopnostech mohu řešit složité úkoly vývoje softwaru krok za krokem. S nástroji, které mi umožňují vytvářet a upravovat soubory, prozkoumávat složité projekty, používat prohlížeč a provádět terminálové příkazy (po vašem schválení), vám mohu pomoci způsoby, které přesahují dokončování kódu nebo technickou podporu. Mohu dokonce použít MCP k vytváření nových nástrojů a rozšiřování svých vlastních schopností.", + "selectMode": "Vyberte režim interakce", + "selectApiConfig": "Vyberte konfiguraci API", + "enhancePrompt": "Vylepšit výzvu o další kontext", + "addImages": "Přidat obrázky do zprávy", + "sendMessage": "Odeslat zprávu", + "typeMessage": "Napište zprávu...", + "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ů" +} diff --git a/webview-ui/src/i18n/locales/cs/common.json b/webview-ui/src/i18n/locales/cs/common.json new file mode 100644 index 0000000000..1ab32ff19b --- /dev/null +++ b/webview-ui/src/i18n/locales/cs/common.json @@ -0,0 +1,8 @@ +{ + "title": "Pomozte vylepšit Roo Code", + "anonymousTelemetry": "Odesílejte anonymní data o chybách a používání, abychom mohli opravovat chyby a vylepšovat rozšíření. Nikdy nejsou odesílány žádné kódy, výzvy ani osobní údaje.", + "changeSettings": "Toto nastavení můžete vždy změnit v dolní části nastavení", + "settings": "nastavení", + "allow": "Povolit", + "deny": "Zakázat" +} diff --git a/webview-ui/src/i18n/locales/de/chat.json b/webview-ui/src/i18n/locales/de/chat.json new file mode 100644 index 0000000000..5e0450bd85 --- /dev/null +++ b/webview-ui/src/i18n/locales/de/chat.json @@ -0,0 +1,60 @@ +{ + "greeting": "Was kann Roo für Sie tun?", + "retry": { + "title": "Wiederholen", + "tooltip": "Versuchen Sie den Vorgang erneut" + }, + "startNewTask": { + "title": "Neue Aufgabe starten", + "tooltip": "Beginnen Sie eine neue Aufgabe" + }, + "proceedAnyways": { + "title": "Trotzdem fortfahren", + "tooltip": "Fortfahren, während der Befehl ausgeführt wird" + }, + "save": { + "title": "Speichern", + "tooltip": "Dateiänderungen speichern" + }, + "reject": { + "title": "Ablehnen", + "tooltip": "Diese Aktion ablehnen" + }, + "completeSubtaskAndReturn": "Teilaufgabe abschließen und zurückkehren", + "approve": { + "title": "Genehmigen", + "tooltip": "Diese Aktion genehmigen" + }, + "runCommand": { + "title": "Befehl ausführen", + "tooltip": "Diesen Befehl ausführen" + }, + "proceedWhileRunning": { + "title": "Während der Ausführung fortfahren", + "tooltip": "Trotz Warnungen fortfahren" + }, + "resumeTask": { + "title": "Aufgabe fortsetzen", + "tooltip": "Aktuelle Aufgabe fortsetzen" + }, + "terminate": { + "title": "Beenden", + "tooltip": "Aktuelle Aufgabe beenden" + }, + "cancel": { + "title": "Abbrechen", + "tooltip": "Aktuellen Vorgang abbrechen" + }, + "scrollToBottom": "Zum Ende des Chats scrollen", + "aboutMe": "Dank der neuesten Durchbrüche in der agentenbasierten Codierung kann ich komplexe Softwareentwicklungsaufgaben Schritt für Schritt bearbeiten. Mit Tools, die es mir ermöglichen, Dateien zu erstellen und zu bearbeiten, komplexe Projekte zu erkunden, den Browser zu verwenden und Terminalbefehle auszuführen (nach Ihrer Genehmigung), kann ich Ihnen auf eine Weise helfen, die über Code-Vervollständigung oder technischen Support hinausgeht. Ich kann sogar MCP verwenden, um neue Tools zu erstellen und meine eigenen Fähigkeiten zu erweitern.", + "selectMode": "Interaktionsmodus auswählen", + "selectApiConfig": "API-Konfiguration auswählen", + "enhancePrompt": "Eingabeaufforderung mit zusätzlichem Kontext verbessern", + "addImages": "Bilder zur Nachricht hinzufügen", + "sendMessage": "Nachricht senden", + "typeMessage": "Nachricht eingeben...", + "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" +} diff --git a/webview-ui/src/i18n/locales/de/common.json b/webview-ui/src/i18n/locales/de/common.json new file mode 100644 index 0000000000..fefcc86752 --- /dev/null +++ b/webview-ui/src/i18n/locales/de/common.json @@ -0,0 +1,8 @@ +{ + "title": "Helfen Sie, Roo Code zu verbessern", + "anonymousTelemetry": "Senden Sie anonyme Fehler- und Nutzungsdaten, um uns bei der Fehlerbehebung und Verbesserung der Erweiterung zu helfen. Es werden niemals Code, Texte oder persönliche Informationen gesendet.", + "changeSettings": "Sie können dies jederzeit unten in den Einstellungen ändern", + "settings": "Einstellungen", + "allow": "Erlauben", + "deny": "Ablehnen" +} diff --git a/webview-ui/src/i18n/locales/en/chat.json b/webview-ui/src/i18n/locales/en/chat.json index 1b742bb11f..805faaf375 100644 --- a/webview-ui/src/i18n/locales/en/chat.json +++ b/webview-ui/src/i18n/locales/en/chat.json @@ -1,3 +1,60 @@ { - "greeting": "What can Roo do for you?" + "greeting": "What can Roo do for you?", + "retry": { + "title": "Retry", + "tooltip": "Try the operation again" + }, + "startNewTask": { + "title": "Start New Task", + "tooltip": "Begin a new task" + }, + "proceedAnyways": { + "title": "Proceed Anyways", + "tooltip": "Continue while command executes" + }, + "save": { + "title": "Save", + "tooltip": "Save the file changes" + }, + "reject": { + "title": "Reject", + "tooltip": "Reject this action" + }, + "completeSubtaskAndReturn": "Complete Subtask and Return", + "approve": { + "title": "Approve", + "tooltip": "Approve this action" + }, + "runCommand": { + "title": "Run Command", + "tooltip": "Execute this command" + }, + "proceedWhileRunning": { + "title": "Proceed While Running", + "tooltip": "Continue despite warnings" + }, + "resumeTask": { + "title": "Resume Task", + "tooltip": "Continue the current task" + }, + "terminate": { + "title": "Terminate", + "tooltip": "End the current task" + }, + "cancel": { + "title": "Cancel", + "tooltip": "Cancel the current operation" + }, + "scrollToBottom": "Scroll to bottom of chat", + "aboutMe": "Thanks to the latest breakthroughs in agentic coding capabilities, I can handle complex software development tasks step-by-step. With tools that let me create & edit files, explore complex projects, use the browser, and execute terminal commands (after you grant permission), I can assist you in ways that go beyond code completion or tech support. I can even use MCP to create new tools and extend my own capabilities.", + "selectMode": "Select mode for interaction", + "selectApiConfig": "Select API configuration", + "enhancePrompt": "Enhance prompt with additional context", + "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" } diff --git a/webview-ui/src/i18n/locales/en/common.json b/webview-ui/src/i18n/locales/en/common.json new file mode 100644 index 0000000000..f09807becc --- /dev/null +++ b/webview-ui/src/i18n/locales/en/common.json @@ -0,0 +1,8 @@ +{ + "title": "Help Improve Roo Code", + "anonymousTelemetry": "Send anonymous error and usage data to help us fix bugs and improve the extension. No code, prompts, or personal information is ever sent.", + "changeSettings": "You can always change this at the bottom of the settings", + "settings": "settings", + "allow": "Allow", + "deny": "Deny" +} diff --git a/webview-ui/src/i18n/locales/es/chat.json b/webview-ui/src/i18n/locales/es/chat.json new file mode 100644 index 0000000000..e038b1969d --- /dev/null +++ b/webview-ui/src/i18n/locales/es/chat.json @@ -0,0 +1,60 @@ +{ + "greeting": "¿Qué puede hacer Roo por ti?", + "retry": { + "title": "Reintentar", + "tooltip": "Intenta la operación de nuevo" + }, + "startNewTask": { + "title": "Iniciar nueva tarea", + "tooltip": "Comienza una nueva tarea" + }, + "proceedAnyways": { + "title": "Continuar de todos modos", + "tooltip": "Continuar mientras se ejecuta el comando" + }, + "save": { + "title": "Guardar", + "tooltip": "Guardar los cambios del archivo" + }, + "reject": { + "title": "Rechazar", + "tooltip": "Rechazar esta acción" + }, + "completeSubtaskAndReturn": "Completar subtarea y regresar", + "approve": { + "title": "Aprobar", + "tooltip": "Aprobar esta acción" + }, + "runCommand": { + "title": "Ejecutar comando", + "tooltip": "Ejecutar este comando" + }, + "proceedWhileRunning": { + "title": "Continuar mientras se ejecuta", + "tooltip": "Continuar a pesar de las advertencias" + }, + "resumeTask": { + "title": "Reanudar tarea", + "tooltip": "Reanudar la tarea actual" + }, + "terminate": { + "title": "Terminar", + "tooltip": "Terminar la tarea actual" + }, + "cancel": { + "title": "Cancelar", + "tooltip": "Cancelar la operación actual" + }, + "scrollToBottom": "Desplazarse al final del chat", + "aboutMe": "Gracias a los últimos avances en capacidades de codificación agentiva, puedo manejar tareas complejas de desarrollo de software paso a paso. Con herramientas que me permiten crear y editar archivos, explorar proyectos complejos, usar el navegador y ejecutar comandos de terminal (después de tu aprobación), puedo ayudarte de maneras que van más allá de la finalización de código o el soporte técnico. Incluso puedo usar MCP para crear nuevas herramientas y ampliar mis propias capacidades.", + "selectMode": "Seleccionar modo de interacción", + "selectApiConfig": "Seleccionar configuración de API", + "enhancePrompt": "Mejorar el mensaje con contexto adicional", + "addImages": "Agregar imágenes al mensaje", + "sendMessage": "Enviar mensaje", + "typeMessage": "Escribe un mensaje...", + "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" +} diff --git a/webview-ui/src/i18n/locales/es/common.json b/webview-ui/src/i18n/locales/es/common.json new file mode 100644 index 0000000000..18c3d9998c --- /dev/null +++ b/webview-ui/src/i18n/locales/es/common.json @@ -0,0 +1,8 @@ +{ + "title": "Ayuda a mejorar Roo Code", + "anonymousTelemetry": "Envía datos de uso y errores anónimos para ayudarnos a corregir errores y mejorar la extensión. Nunca se envía código, texto o información personal.", + "changeSettings": "Siempre puedes cambiar esto en la parte inferior de la configuración", + "settings": "configuración", + "allow": "Permitir", + "deny": "Denegar" +} diff --git a/webview-ui/src/i18n/locales/fr/chat.json b/webview-ui/src/i18n/locales/fr/chat.json new file mode 100644 index 0000000000..0decca4471 --- /dev/null +++ b/webview-ui/src/i18n/locales/fr/chat.json @@ -0,0 +1,60 @@ +{ + "greeting": "Que peut faire Roo pour vous ?", + "retry": { + "title": "Réessayer", + "tooltip": "Réessayez l'opération" + }, + "startNewTask": { + "title": "Démarrer une nouvelle tâche", + "tooltip": "Commencez une nouvelle tâche" + }, + "proceedAnyways": { + "title": "Continuer quand même", + "tooltip": "Continuer pendant l'exécution de la commande" + }, + "save": { + "title": "Enregistrer", + "tooltip": "Enregistrer les modifications du fichier" + }, + "reject": { + "title": "Rejeter", + "tooltip": "Rejeter cette action" + }, + "completeSubtaskAndReturn": "Terminer la sous-tâche et revenir", + "approve": { + "title": "Approuver", + "tooltip": "Approuver cette action" + }, + "runCommand": { + "title": "Exécuter la commande", + "tooltip": "Exécuter cette commande" + }, + "proceedWhileRunning": { + "title": "Continuer pendant l'exécution", + "tooltip": "Continuer malgré les avertissements" + }, + "resumeTask": { + "title": "Reprendre la tâche", + "tooltip": "Reprendre la tâche en cours" + }, + "terminate": { + "title": "Terminer", + "tooltip": "Terminer la tâche en cours" + }, + "cancel": { + "title": "Annuler", + "tooltip": "Annuler l'opération en cours" + }, + "scrollToBottom": "Faire défiler jusqu'en bas du chat", + "aboutMe": "Grâce aux dernières avancées en matière de capacités de codage agentique, je peux gérer des tâches complexes de développement de logiciels étape par étape. Avec des outils qui me permettent de créer et de modifier des fichiers, d'explorer des projets complexes, d'utiliser le navigateur et d'exécuter des commandes terminal (après votre approbation), je peux vous aider de manière qui va au-delà de la complétion de code ou du support technique. Je peux même utiliser MCP pour créer de nouveaux outils et étendre mes propres capacités.", + "selectMode": "Sélectionner le mode d'interaction", + "selectApiConfig": "Sélectionner la configuration de l'API", + "enhancePrompt": "Améliorer l'invite avec un contexte supplémentaire", + "addImages": "Ajouter des images au message", + "sendMessage": "Envoyer le message", + "typeMessage": "Tapez un message...", + "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" +} diff --git a/webview-ui/src/i18n/locales/fr/common.json b/webview-ui/src/i18n/locales/fr/common.json new file mode 100644 index 0000000000..e12844ff75 --- /dev/null +++ b/webview-ui/src/i18n/locales/fr/common.json @@ -0,0 +1,8 @@ +{ + "title": "Aidez à améliorer Roo Code", + "anonymousTelemetry": "Envoyez des données d'utilisation et d'erreurs anonymes pour nous aider à corriger les bugs et améliorer l'extension. Aucun code, texte ou information personnelle n'est jamais envoyé.", + "changeSettings": "Vous pouvez toujours modifier cela en bas des paramètres", + "settings": "paramètres", + "allow": "Autoriser", + "deny": "Refuser" +} diff --git a/webview-ui/src/i18n/locales/hi/chat.json b/webview-ui/src/i18n/locales/hi/chat.json new file mode 100644 index 0000000000..6896d7844b --- /dev/null +++ b/webview-ui/src/i18n/locales/hi/chat.json @@ -0,0 +1,60 @@ +{ + "greeting": "Roo आपके लिए क्या कर सकता है?", + "retry": { + "title": "पुनः प्रयास करें", + "tooltip": "ऑपरेशन को फिर से आज़माएं" + }, + "startNewTask": { + "title": "नया कार्य शुरू करें", + "tooltip": "एक नया कार्य शुरू करें" + }, + "proceedAnyways": { + "title": "फिर भी आगे बढ़ें", + "tooltip": "कमांड के निष्पादित होने के दौरान जारी रखें" + }, + "save": { + "title": "सहेजें", + "tooltip": "फ़ाइल परिवर्तनों को सहेजें" + }, + "reject": { + "title": "अस्वीकार करें", + "tooltip": "इस क्रिया को अस्वीकार करें" + }, + "completeSubtaskAndReturn": "उपकार्य पूरा करें और वापस लौटें", + "approve": { + "title": "स्वीकृत करें", + "tooltip": "इस क्रिया को स्वीकृत करें" + }, + "runCommand": { + "title": "कमांड चलाएं", + "tooltip": "इस कमांड को निष्पादित करें" + }, + "proceedWhileRunning": { + "title": "चलते समय आगे बढ़ें", + "tooltip": "चेतावनियों के बावजूद जारी रखें" + }, + "resumeTask": { + "title": "कार्य फिर से शुरू करें", + "tooltip": "वर्तमान कार्य फिर से शुरू करें" + }, + "terminate": { + "title": "समाप्त करें", + "tooltip": "वर्तमान कार्य समाप्त करें" + }, + "cancel": { + "title": "रद्द करें", + "tooltip": "वर्तमान ऑपरेशन रद्द करें" + }, + "scrollToBottom": "चैट के निचले भाग पर स्क्रॉल करें", + "aboutMe": "एजेंटिक कोडिंग क्षमताओं में नवीनतम सफलताओं के लिए धन्यवाद, मैं जटिल सॉफ्टवेयर विकास कार्यों को चरणबद्ध तरीके से संभाल सकता हूं। उन उपकरणों के साथ जो मुझे फ़ाइलें बनाने और संपादित करने, जटिल परियोजनाओं का पता लगाने, ब्राउज़र का उपयोग करने और टर्मिनल कमांड निष्पादित करने (आपकी अनुमति के बाद) की अनुमति देते हैं, मैं आपकी कोड पूर्णता या तकनीकी सहायता से परे तरीकों से मदद कर सकता हूं। मैं MCP का उपयोग करके नए उपकरण बना सकता हूं और अपनी क्षमताओं का विस्तार कर सकता हूं।", + "selectMode": "इंटरैक्शन के लिए मोड चुनें", + "selectApiConfig": "API कॉन्फ़िगरेशन चुनें", + "enhancePrompt": "अतिरिक्त संदर्भ के साथ प्रॉम्प्ट को बढ़ाएं", + "addImages": "संदेश में छवियां जोड़ें", + "sendMessage": "संदेश भेजें", + "typeMessage": "एक संदेश टाइप करें...", + "typeTask": "अपना कार्य यहां टाइप करें...", + "addContext": "(@ संदर्भ जोड़ने के लिए, / मोड बदलने के लिए", + "dragFiles": "फ़ाइलों को खींचने के लिए shift दबाए रखें", + "dragFilesImages": "फ़ाइलों/छवियों को खींचने के लिए shift दबाए रखें" +} diff --git a/webview-ui/src/i18n/locales/hi/common.json b/webview-ui/src/i18n/locales/hi/common.json new file mode 100644 index 0000000000..b36b70146a --- /dev/null +++ b/webview-ui/src/i18n/locales/hi/common.json @@ -0,0 +1,8 @@ +{ + "title": "Roo Code को बेहतर बनाने में मदद करें", + "anonymousTelemetry": "बग ठीक करने और एक्सटेंशन को बेहतर बनाने में हमारी मदद करने के लिए गुमनाम त्रुटि और उपयोग डेटा भेजें। कोड, संकेत या व्यक्तिगत जानकारी कभी नहीं भेजी जाती है।", + "changeSettings": "आप इसे हमेशा सेटिंग्स के निचले भाग में बदल सकते हैं", + "settings": "सेटिंग्स", + "allow": "अनुमति दें", + "deny": "अस्वीकार करें" +} diff --git a/webview-ui/src/i18n/locales/hu/chat.json b/webview-ui/src/i18n/locales/hu/chat.json new file mode 100644 index 0000000000..3ca01f840a --- /dev/null +++ b/webview-ui/src/i18n/locales/hu/chat.json @@ -0,0 +1,60 @@ +{ + "greeting": "Mit tehet Roo Önért?", + "retry": { + "title": "Újrapróbálás", + "tooltip": "Próbálja meg újra a műveletet" + }, + "startNewTask": { + "title": "Új feladat indítása", + "tooltip": "Kezdjen egy új feladatot" + }, + "proceedAnyways": { + "title": "Folytatás mindenképp", + "tooltip": "Folytatás a parancs végrehajtása közben" + }, + "save": { + "title": "Mentés", + "tooltip": "Fájl változtatások mentése" + }, + "reject": { + "title": "Elutasítás", + "tooltip": "Elutasítja ezt a műveletet" + }, + "completeSubtaskAndReturn": "Alfeladat befejezése és visszatérés", + "approve": { + "title": "Jóváhagyás", + "tooltip": "Jóváhagyja ezt a műveletet" + }, + "runCommand": { + "title": "Parancs futtatása", + "tooltip": "Futtassa ezt a parancsot" + }, + "proceedWhileRunning": { + "title": "Folytatás futás közben", + "tooltip": "Folytatás a figyelmeztetések ellenére" + }, + "resumeTask": { + "title": "Feladat folytatása", + "tooltip": "Folytassa az aktuális feladatot" + }, + "terminate": { + "title": "Leállítás", + "tooltip": "Az aktuális feladat leállítása" + }, + "cancel": { + "title": "Mégse", + "tooltip": "Az aktuális művelet megszakítása" + }, + "scrollToBottom": "Görgessen a csevegés aljára", + "aboutMe": "Az ügynök-alapú kódolási képességek legújabb áttöréseinek köszönhetően képes vagyok lépésről lépésre kezelni a komplex szoftverfejlesztési feladatokat. Azokkal az eszközökkel, amelyek lehetővé teszik számomra a fájlok létrehozását és szerkesztését, a komplex projektek felfedezését, a böngésző használatát és a terminálparancsok végrehajtását (az Ön engedélye után), olyan módon segíthetek Önnek, amely túlmutat a kódkiegészítésen vagy a technikai támogatáson. Még az MCP-t is használhatom új eszközök létrehozására és saját képességeim bővítésére.", + "selectMode": "Válassza ki az interakció módját", + "selectApiConfig": "Válassza ki az API konfigurációt", + "enhancePrompt": "A kérés fokozása további kontextussal", + "addImages": "Képek hozzáadása az üzenethez", + "sendMessage": "Üzenet küldése", + "typeMessage": "Írjon egy üzenetet...", + "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" +} diff --git a/webview-ui/src/i18n/locales/hu/common.json b/webview-ui/src/i18n/locales/hu/common.json new file mode 100644 index 0000000000..9f111a85c7 --- /dev/null +++ b/webview-ui/src/i18n/locales/hu/common.json @@ -0,0 +1,8 @@ +{ + "title": "Segítsd fejleszteni a Roo Code-ot", + "anonymousTelemetry": "Küldj névtelen hibákat és használati adatokat, hogy segíts nekünk hibákat javítani és a bővítményt fejleszteni. Soha nem küldünk kódot, szöveget vagy személyes adatokat.", + "changeSettings": "Ezt bármikor megváltoztathatod a beállítások alján", + "settings": "beállítások", + "allow": "Engedélyez", + "deny": "Elutasít" +} diff --git a/webview-ui/src/i18n/locales/it/chat.json b/webview-ui/src/i18n/locales/it/chat.json new file mode 100644 index 0000000000..16612a26ac --- /dev/null +++ b/webview-ui/src/i18n/locales/it/chat.json @@ -0,0 +1,60 @@ +{ + "greeting": "Cosa può fare Roo per te?", + "retry": { + "title": "Riprova", + "tooltip": "Riprova l'operazione" + }, + "startNewTask": { + "title": "Inizia nuova attività", + "tooltip": "Inizia una nuova attività" + }, + "proceedAnyways": { + "title": "Prosegui comunque", + "tooltip": "Continua durante l'esecuzione del comando" + }, + "save": { + "title": "Salva", + "tooltip": "Salva le modifiche al file" + }, + "reject": { + "title": "Rifiuta", + "tooltip": "Rifiuta questa azione" + }, + "completeSubtaskAndReturn": "Completa sottoattività e ritorna", + "approve": { + "title": "Approva", + "tooltip": "Approva questa azione" + }, + "runCommand": { + "title": "Esegui comando", + "tooltip": "Esegui questo comando" + }, + "proceedWhileRunning": { + "title": "Prosegui durante l'esecuzione", + "tooltip": "Continua nonostante gli avvisi" + }, + "resumeTask": { + "title": "Riprendi attività", + "tooltip": "Riprendi l'attività corrente" + }, + "terminate": { + "title": "Termina", + "tooltip": "Termina l'attività corrente" + }, + "cancel": { + "title": "Annulla", + "tooltip": "Annulla l'operazione corrente" + }, + "scrollToBottom": "Scorri in fondo alla chat", + "aboutMe": "Grazie alle ultime innovazioni nelle capacità di codifica agentica, posso gestire complesse attività di sviluppo software passo dopo passo. Con strumenti che mi permettono di creare e modificare file, esplorare progetti complessi, utilizzare il browser ed eseguire comandi terminal (dopo la tua approvazione), posso aiutarti in modi che vanno oltre il completamento del codice o il supporto tecnico. Posso persino usare MCP per creare nuovi strumenti ed estendere le mie capacità.", + "selectMode": "Seleziona modalità di interazione", + "selectApiConfig": "Seleziona configurazione API", + "enhancePrompt": "Migliora il prompt con ulteriore contesto", + "addImages": "Aggiungi immagini al messaggio", + "sendMessage": "Invia messaggio", + "typeMessage": "Scrivi un messaggio...", + "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" +} diff --git a/webview-ui/src/i18n/locales/it/common.json b/webview-ui/src/i18n/locales/it/common.json new file mode 100644 index 0000000000..5dc0034356 --- /dev/null +++ b/webview-ui/src/i18n/locales/it/common.json @@ -0,0 +1,8 @@ +{ + "title": "Aiuta a migliorare Roo Code", + "anonymousTelemetry": "Invia dati di utilizzo ed errori anonimi per aiutarci a correggere bug e migliorare l'estensione. Non viene mai inviato codice, testo o informazioni personali.", + "changeSettings": "Puoi sempre cambiare questo in fondo alle impostazioni", + "settings": "impostazioni", + "allow": "Consenti", + "deny": "Nega" +} diff --git a/webview-ui/src/i18n/locales/ja/chat.json b/webview-ui/src/i18n/locales/ja/chat.json new file mode 100644 index 0000000000..88ee7afd27 --- /dev/null +++ b/webview-ui/src/i18n/locales/ja/chat.json @@ -0,0 +1,60 @@ +{ + "greeting": "Rooはあなたのために何ができますか?", + "retry": { + "title": "再試行", + "tooltip": "操作を再試行してください" + }, + "startNewTask": { + "title": "新しいタスクを開始", + "tooltip": "新しいタスクを開始します" + }, + "proceedAnyways": { + "title": "とにかく続行", + "tooltip": "コマンドの実行中に続行します" + }, + "save": { + "title": "保存", + "tooltip": "ファイルの変更を保存します" + }, + "reject": { + "title": "拒否", + "tooltip": "このアクションを拒否します" + }, + "completeSubtaskAndReturn": "サブタスクを完了して戻る", + "approve": { + "title": "承認", + "tooltip": "このアクションを承認します" + }, + "runCommand": { + "title": "コマンドを実行", + "tooltip": "このコマンドを実行します" + }, + "proceedWhileRunning": { + "title": "実行中に続行", + "tooltip": "警告にもかかわらず続行します" + }, + "resumeTask": { + "title": "タスクを再開", + "tooltip": "現在のタスクを再開します" + }, + "terminate": { + "title": "終了", + "tooltip": "現在のタスクを終了します" + }, + "cancel": { + "title": "キャンセル", + "tooltip": "現在の操作をキャンセルします" + }, + "scrollToBottom": "チャットの最下部にスクロール", + "aboutMe": "エージェント型コーディング能力の最新の進歩により、複雑なソフトウェア開発タスクを段階的に処理できます。ファイルの作成と編集、複雑なプロジェクトの探索、ブラウザの使用、ターミナルコマンドの実行(あなたの許可を得た後)を可能にするツールを使用して、コード補完やテクニカルサポートを超えた方法であなたを支援できます。MCPを使用して新しいツールを作成し、自分の能力を拡張することもできます。", + "selectMode": "インタラクションモードを選択", + "selectApiConfig": "API設定を選択", + "enhancePrompt": "追加のコンテキストでプロンプトを強化", + "addImages": "メッセージに画像を追加", + "sendMessage": "メッセージを送信", + "typeMessage": "メッセージを入力...", + "typeTask": "ここにタスクを入力...", + "addContext": "(@ コンテキストを追加, / モードを切り替え", + "dragFiles": "ファイルをドラッグするにはshiftを押したままにします", + "dragFilesImages": "ファイル/画像をドラッグするにはshiftを押したままにします" +} diff --git a/webview-ui/src/i18n/locales/ja/common.json b/webview-ui/src/i18n/locales/ja/common.json new file mode 100644 index 0000000000..50139e453e --- /dev/null +++ b/webview-ui/src/i18n/locales/ja/common.json @@ -0,0 +1,8 @@ +{ + "title": "Roo Codeの改善にご協力ください", + "anonymousTelemetry": "バグの修正と拡張機能の改善のため、匿名のエラーと使用データを送信してください。コード、プロンプト、個人情報は一切送信されません。", + "changeSettings": "設定の下部でいつでも変更できます", + "settings": "設定", + "allow": "許可", + "deny": "拒否" +} diff --git a/webview-ui/src/i18n/locales/ko/chat.json b/webview-ui/src/i18n/locales/ko/chat.json new file mode 100644 index 0000000000..c004106d11 --- /dev/null +++ b/webview-ui/src/i18n/locales/ko/chat.json @@ -0,0 +1,60 @@ +{ + "greeting": "Roo가 당신을 위해 무엇을 할 수 있나요?", + "retry": { + "title": "다시 시도", + "tooltip": "작업을 다시 시도하세요" + }, + "startNewTask": { + "title": "새 작업 시작", + "tooltip": "새 작업을 시작하세요" + }, + "proceedAnyways": { + "title": "어쨌든 계속", + "tooltip": "명령이 실행되는 동안 계속하세요" + }, + "save": { + "title": "저장", + "tooltip": "파일 변경 사항을 저장하세요" + }, + "reject": { + "title": "거부", + "tooltip": "이 작업을 거부하세요" + }, + "completeSubtaskAndReturn": "하위 작업 완료 및 돌아가기", + "approve": { + "title": "승인", + "tooltip": "이 작업을 승인하세요" + }, + "runCommand": { + "title": "명령 실행", + "tooltip": "이 명령을 실행하세요" + }, + "proceedWhileRunning": { + "title": "실행 중 계속", + "tooltip": "경고에도 불구하고 계속하세요" + }, + "resumeTask": { + "title": "작업 재개", + "tooltip": "현재 작업을 재개하세요" + }, + "terminate": { + "title": "종료", + "tooltip": "현재 작업을 종료하세요" + }, + "cancel": { + "title": "취소", + "tooltip": "현재 작업을 취소하세요" + }, + "scrollToBottom": "채팅 하단으로 스크롤", + "aboutMe": "에이전트 코딩 능력의 최신 혁신 덕분에 복잡한 소프트웨어 개발 작업을 단계적으로 처리할 수 있습니다. 파일 생성 및 편집, 복잡한 프로젝트 탐색, 브라우저 사용, 터미널 명령 실행(귀하의 승인 후)을 가능하게 하는 도구를 사용하여 코드 완성이나 기술 지원을 넘어서는 방식으로 도움을 드릴 수 있습니다. MCP를 사용하여 새로운 도구를 만들고 내 능력을 확장할 수도 있습니다.", + "selectMode": "상호 작용 모드 선택", + "selectApiConfig": "API 구성 선택", + "enhancePrompt": "추가 컨텍스트로 프롬프트 강화", + "addImages": "메시지에 이미지 추가", + "sendMessage": "메시지 보내기", + "typeMessage": "메시지를 입력하세요...", + "typeTask": "여기에 작업을 입력하세요...", + "addContext": "(@ 컨텍스트 추가, / 모드 전환", + "dragFiles": "파일을 드래그하려면 shift를 누르세요", + "dragFilesImages": "파일/이미지를 드래그하려면 shift를 누르세요" +} diff --git a/webview-ui/src/i18n/locales/ko/common.json b/webview-ui/src/i18n/locales/ko/common.json new file mode 100644 index 0000000000..35a1684681 --- /dev/null +++ b/webview-ui/src/i18n/locales/ko/common.json @@ -0,0 +1,8 @@ +{ + "title": "Roo Code 개선에 도움 주세요", + "anonymousTelemetry": "버그 수정 및 확장 기능 개선을 위해 익명의 오류 및 사용 데이터를 보내주세요. 코드, 프롬프트 또는 개인 정보는 절대 전송되지 않습니다.", + "changeSettings": "설정 하단에서 언제든지 변경할 수 있습니다", + "settings": "설정", + "allow": "허용", + "deny": "거부" +} diff --git a/webview-ui/src/i18n/locales/pl/chat.json b/webview-ui/src/i18n/locales/pl/chat.json new file mode 100644 index 0000000000..b5f65d1b3d --- /dev/null +++ b/webview-ui/src/i18n/locales/pl/chat.json @@ -0,0 +1,60 @@ +{ + "greeting": "Co Roo może dla Ciebie zrobić?", + "retry": { + "title": "Ponów próbę", + "tooltip": "Spróbuj ponownie wykonać operację" + }, + "startNewTask": { + "title": "Rozpocznij nowe zadanie", + "tooltip": "Rozpocznij nowe zadanie" + }, + "proceedAnyways": { + "title": "Kontynuuj mimo to", + "tooltip": "Kontynuuj podczas wykonywania polecenia" + }, + "save": { + "title": "Zapisz", + "tooltip": "Zapisz zmiany w pliku" + }, + "reject": { + "title": "Odrzuć", + "tooltip": "Odrzuć tę akcję" + }, + "completeSubtaskAndReturn": "Zakończ podzadanie i wróć", + "approve": { + "title": "Zatwierdź", + "tooltip": "Zatwierdź tę akcję" + }, + "runCommand": { + "title": "Wykonaj polecenie", + "tooltip": "Wykonaj to polecenie" + }, + "proceedWhileRunning": { + "title": "Kontynuuj podczas wykonywania", + "tooltip": "Kontynuuj pomimo ostrzeżeń" + }, + "resumeTask": { + "title": "Wznów zadanie", + "tooltip": "Wznów bieżące zadanie" + }, + "terminate": { + "title": "Zakończ", + "tooltip": "Zakończ bieżące zadanie" + }, + "cancel": { + "title": "Anuluj", + "tooltip": "Anuluj bieżącą operację" + }, + "scrollToBottom": "Przewiń na dół czatu", + "aboutMe": "Dzięki najnowszym przełomom w zakresie możliwości kodowania agentowego mogę krok po kroku obsługiwać złożone zadania związane z rozwojem oprogramowania. Dzięki narzędziom, które pozwalają mi tworzyć i edytować pliki, eksplorować złożone projekty, korzystać z przeglądarki i wykonywać polecenia terminalowe (po Twojej aprobacie), mogę pomóc Ci w sposób wykraczający poza uzupełnianie kodu lub wsparcie techniczne. Mogę nawet używać MCP do tworzenia nowych narzędzi i rozszerzania moich własnych możliwości.", + "selectMode": "Wybierz tryb interakcji", + "selectApiConfig": "Wybierz konfigurację API", + "enhancePrompt": "Ulepsz monit o dodatkowy kontekst", + "addImages": "Dodaj obrazy do wiadomości", + "sendMessage": "Wyślij wiadomość", + "typeMessage": "Wpisz wiadomość...", + "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" +} diff --git a/webview-ui/src/i18n/locales/pl/common.json b/webview-ui/src/i18n/locales/pl/common.json new file mode 100644 index 0000000000..d8ab3108b5 --- /dev/null +++ b/webview-ui/src/i18n/locales/pl/common.json @@ -0,0 +1,8 @@ +{ + "title": "Pomóż ulepszyć Roo Code", + "anonymousTelemetry": "Wyślij anonimowe dane o błędach i użyciu, aby pomóc nam w naprawianiu błędów i ulepszaniu rozszerzenia. Nigdy nie są wysyłane żadne kody, teksty ani informacje osobiste.", + "changeSettings": "Zawsze możesz to zmienić na dole ustawień", + "settings": "ustawienia", + "allow": "Zezwól", + "deny": "Odmów" +} diff --git a/webview-ui/src/i18n/locales/pt-BR/chat.json b/webview-ui/src/i18n/locales/pt-BR/chat.json new file mode 100644 index 0000000000..25aca91257 --- /dev/null +++ b/webview-ui/src/i18n/locales/pt-BR/chat.json @@ -0,0 +1,60 @@ +{ + "greeting": "O que o Roo pode fazer por você?", + "retry": { + "title": "Tentar novamente", + "tooltip": "Tente a operação novamente" + }, + "startNewTask": { + "title": "Iniciar nova tarefa", + "tooltip": "Comece uma nova tarefa" + }, + "proceedAnyways": { + "title": "Continuar mesmo assim", + "tooltip": "Continue enquanto o comando é executado" + }, + "save": { + "title": "Salvar", + "tooltip": "Salvar alterações do arquivo" + }, + "reject": { + "title": "Rejeitar", + "tooltip": "Rejeitar esta ação" + }, + "completeSubtaskAndReturn": "Concluir subtarefa e retornar", + "approve": { + "title": "Aprovar", + "tooltip": "Aprovar esta ação" + }, + "runCommand": { + "title": "Executar comando", + "tooltip": "Execute este comando" + }, + "proceedWhileRunning": { + "title": "Continuar durante a execução", + "tooltip": "Continue apesar dos avisos" + }, + "resumeTask": { + "title": "Retomar tarefa", + "tooltip": "Retome a tarefa atual" + }, + "terminate": { + "title": "Terminar", + "tooltip": "Terminar a tarefa atual" + }, + "cancel": { + "title": "Cancelar", + "tooltip": "Cancelar a operação atual" + }, + "scrollToBottom": "Rolar até o final do chat", + "aboutMe": "Graças aos últimos avanços nas capacidades de codificação agentiva, posso lidar com tarefas complexas de desenvolvimento de software passo a passo. Com ferramentas que me permitem criar e editar arquivos, explorar projetos complexos, usar o navegador e executar comandos de terminal (após sua aprovação), posso ajudá-lo de maneiras que vão além da conclusão de código ou suporte técnico. Posso até usar o MCP para criar novas ferramentas e expandir minhas próprias capacidades.", + "selectMode": "Selecionar modo de interação", + "selectApiConfig": "Selecionar configuração da API", + "enhancePrompt": "Melhorar o prompt com contexto adicional", + "addImages": "Adicionar imagens à mensagem", + "sendMessage": "Enviar mensagem", + "typeMessage": "Digite uma mensagem...", + "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" +} diff --git a/webview-ui/src/i18n/locales/pt-BR/common.json b/webview-ui/src/i18n/locales/pt-BR/common.json new file mode 100644 index 0000000000..5627322a3a --- /dev/null +++ b/webview-ui/src/i18n/locales/pt-BR/common.json @@ -0,0 +1,8 @@ +{ + "title": "Ajude a melhorar o Roo Code", + "anonymousTelemetry": "Envie dados de uso e erros anônimos para nos ajudar a corrigir bugs e melhorar a extensão. Nenhum código, texto ou informação pessoal é enviado.", + "changeSettings": "Você sempre pode mudar isso na parte inferior das configurações", + "settings": "configurações", + "allow": "Permitir", + "deny": "Negar" +} diff --git a/webview-ui/src/i18n/locales/pt/chat.json b/webview-ui/src/i18n/locales/pt/chat.json new file mode 100644 index 0000000000..25aca91257 --- /dev/null +++ b/webview-ui/src/i18n/locales/pt/chat.json @@ -0,0 +1,60 @@ +{ + "greeting": "O que o Roo pode fazer por você?", + "retry": { + "title": "Tentar novamente", + "tooltip": "Tente a operação novamente" + }, + "startNewTask": { + "title": "Iniciar nova tarefa", + "tooltip": "Comece uma nova tarefa" + }, + "proceedAnyways": { + "title": "Continuar mesmo assim", + "tooltip": "Continue enquanto o comando é executado" + }, + "save": { + "title": "Salvar", + "tooltip": "Salvar alterações do arquivo" + }, + "reject": { + "title": "Rejeitar", + "tooltip": "Rejeitar esta ação" + }, + "completeSubtaskAndReturn": "Concluir subtarefa e retornar", + "approve": { + "title": "Aprovar", + "tooltip": "Aprovar esta ação" + }, + "runCommand": { + "title": "Executar comando", + "tooltip": "Execute este comando" + }, + "proceedWhileRunning": { + "title": "Continuar durante a execução", + "tooltip": "Continue apesar dos avisos" + }, + "resumeTask": { + "title": "Retomar tarefa", + "tooltip": "Retome a tarefa atual" + }, + "terminate": { + "title": "Terminar", + "tooltip": "Terminar a tarefa atual" + }, + "cancel": { + "title": "Cancelar", + "tooltip": "Cancelar a operação atual" + }, + "scrollToBottom": "Rolar até o final do chat", + "aboutMe": "Graças aos últimos avanços nas capacidades de codificação agentiva, posso lidar com tarefas complexas de desenvolvimento de software passo a passo. Com ferramentas que me permitem criar e editar arquivos, explorar projetos complexos, usar o navegador e executar comandos de terminal (após sua aprovação), posso ajudá-lo de maneiras que vão além da conclusão de código ou suporte técnico. Posso até usar o MCP para criar novas ferramentas e expandir minhas próprias capacidades.", + "selectMode": "Selecionar modo de interação", + "selectApiConfig": "Selecionar configuração da API", + "enhancePrompt": "Melhorar o prompt com contexto adicional", + "addImages": "Adicionar imagens à mensagem", + "sendMessage": "Enviar mensagem", + "typeMessage": "Digite uma mensagem...", + "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" +} diff --git a/webview-ui/src/i18n/locales/pt/common.json b/webview-ui/src/i18n/locales/pt/common.json new file mode 100644 index 0000000000..5627322a3a --- /dev/null +++ b/webview-ui/src/i18n/locales/pt/common.json @@ -0,0 +1,8 @@ +{ + "title": "Ajude a melhorar o Roo Code", + "anonymousTelemetry": "Envie dados de uso e erros anônimos para nos ajudar a corrigir bugs e melhorar a extensão. Nenhum código, texto ou informação pessoal é enviado.", + "changeSettings": "Você sempre pode mudar isso na parte inferior das configurações", + "settings": "configurações", + "allow": "Permitir", + "deny": "Negar" +} diff --git a/webview-ui/src/i18n/locales/ru/chat.json b/webview-ui/src/i18n/locales/ru/chat.json new file mode 100644 index 0000000000..5c435c1278 --- /dev/null +++ b/webview-ui/src/i18n/locales/ru/chat.json @@ -0,0 +1,60 @@ +{ + "greeting": "Что Roo может сделать для вас?", + "retry": { + "title": "Повторить", + "tooltip": "Попробуйте операцию снова" + }, + "startNewTask": { + "title": "Начать новую задачу", + "tooltip": "Начните новую задачу" + }, + "proceedAnyways": { + "title": "Продолжить в любом случае", + "tooltip": "Продолжайте во время выполнения команды" + }, + "save": { + "title": "Сохранить", + "tooltip": "Сохранить изменения файла" + }, + "reject": { + "title": "Отклонить", + "tooltip": "Отклонить это действие" + }, + "completeSubtaskAndReturn": "Завершить подзадачу и вернуться", + "approve": { + "title": "Одобрить", + "tooltip": "Одобрить это действие" + }, + "runCommand": { + "title": "Выполнить команду", + "tooltip": "Выполнить эту команду" + }, + "proceedWhileRunning": { + "title": "Продолжить во время выполнения", + "tooltip": "Продолжайте, несмотря на предупреждения" + }, + "resumeTask": { + "title": "Возобновить задачу", + "tooltip": "Возобновите текущую задачу" + }, + "terminate": { + "title": "Завершить", + "tooltip": "Завершить текущую задачу" + }, + "cancel": { + "title": "Отменить", + "tooltip": "Отменить текущую операцию" + }, + "scrollToBottom": "Прокрутить до конца чата", + "aboutMe": "Благодаря последним прорывам в возможностях агентного кодирования я могу шаг за шагом справляться со сложными задачами разработки программного обеспечения. С помощью инструментов, которые позволяют мне создавать и редактировать файлы, исследовать сложные проекты, использовать браузер и выполнять команды терминала (после вашего одобрения), я могу помочь вам способами, выходящими за рамки завершения кода или технической поддержки. Я даже могу использовать MCP для создания новых инструментов и расширения своих собственных возможностей.", + "selectMode": "Выбрать режим взаимодействия", + "selectApiConfig": "Выбрать конфигурацию API", + "enhancePrompt": "Улучшить запрос с дополнительным контекстом", + "addImages": "Добавить изображения в сообщение", + "sendMessage": "Отправить сообщение", + "typeMessage": "Введите сообщение...", + "typeTask": "Введите вашу задачу здесь...", + "addContext": "(@ чтобы добавить контекст, / чтобы переключить режимы", + "dragFiles": "удерживайте shift, чтобы перетащить файлы", + "dragFilesImages": "удерживайте shift, чтобы перетащить файлы/изображения" +} diff --git a/webview-ui/src/i18n/locales/ru/common.json b/webview-ui/src/i18n/locales/ru/common.json new file mode 100644 index 0000000000..b422a8f450 --- /dev/null +++ b/webview-ui/src/i18n/locales/ru/common.json @@ -0,0 +1,8 @@ +{ + "title": "Помогите улучшить Roo Code", + "anonymousTelemetry": "Отправляйте анонимные данные об ошибках и использовании, чтобы помочь нам исправлять ошибки и улучшать расширение. Никогда не отправляется код, текст или личная информация.", + "changeSettings": "Вы всегда можете изменить это внизу настроек", + "settings": "настройки", + "allow": "Разрешить", + "deny": "Отклонить" +} diff --git a/webview-ui/src/i18n/locales/tr/chat.json b/webview-ui/src/i18n/locales/tr/chat.json new file mode 100644 index 0000000000..2e33249a8e --- /dev/null +++ b/webview-ui/src/i18n/locales/tr/chat.json @@ -0,0 +1,60 @@ +{ + "greeting": "Roo sizin için ne yapabilir?", + "retry": { + "title": "Yeniden Dene", + "tooltip": "İşlemi tekrar deneyin" + }, + "startNewTask": { + "title": "Yeni Görev Başlat", + "tooltip": "Yeni bir görev başlatın" + }, + "proceedAnyways": { + "title": "Yine de Devam Et", + "tooltip": "Komut çalışırken devam edin" + }, + "save": { + "title": "Kaydet", + "tooltip": "Dosya değişikliklerini kaydedin" + }, + "reject": { + "title": "Reddet", + "tooltip": "Bu eylemi reddedin" + }, + "completeSubtaskAndReturn": "Alt görevi tamamla ve geri dön", + "approve": { + "title": "Onayla", + "tooltip": "Bu eylemi onaylayın" + }, + "runCommand": { + "title": "Komut Çalıştır", + "tooltip": "Bu komutu çalıştırın" + }, + "proceedWhileRunning": { + "title": "Çalışırken Devam Et", + "tooltip": "Uyarılara rağmen devam edin" + }, + "resumeTask": { + "title": "Göreve Devam Et", + "tooltip": "Mevcut göreve devam edin" + }, + "terminate": { + "title": "Sonlandır", + "tooltip": "Mevcut görevi sonlandırın" + }, + "cancel": { + "title": "İptal", + "tooltip": "Mevcut işlemi iptal edin" + }, + "scrollToBottom": "Sohbetin en altına kaydır", + "aboutMe": "Ajan tabanlı kodlama yeteneklerindeki son gelişmeler sayesinde, karmaşık yazılım geliştirme görevlerini adım adım ele alabiliyorum. Dosya oluşturma ve düzenleme, karmaşık projeleri keşfetme, tarayıcı kullanma ve terminal komutları çalıştırma (sizin onayınızla) gibi araçlarla, kod tamamlama veya teknik destek ötesinde size yardımcı olabilirim. Hatta MCP'yi kullanarak yeni araçlar oluşturabilir ve kendi yeteneklerimi genişletebilirim.", + "selectMode": "Etkileşim modunu seçin", + "selectApiConfig": "API yapılandırmasını seçin", + "enhancePrompt": "Ek bağlamla istemi geliştirin", + "addImages": "Mesaja resim ekle", + "sendMessage": "Mesaj gönder", + "typeMessage": "Bir mesaj yazın...", + "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" +} diff --git a/webview-ui/src/i18n/locales/tr/common.json b/webview-ui/src/i18n/locales/tr/common.json new file mode 100644 index 0000000000..0a1c0e57c2 --- /dev/null +++ b/webview-ui/src/i18n/locales/tr/common.json @@ -0,0 +1,8 @@ +{ + "title": "Roo Code'u Geliştirmeye Yardım Edin", + "anonymousTelemetry": "Hataları düzeltmemize ve eklentiyi geliştirmemize yardımcı olmak için anonim hata ve kullanım verileri gönderin. Hiçbir zaman kod, metin veya kişisel bilgi gönderilmez.", + "changeSettings": "Bunu her zaman ayarların altından değiştirebilirsiniz", + "settings": "ayarlar", + "allow": "İzin Ver", + "deny": "Reddet" +} diff --git a/webview-ui/src/i18n/locales/zh-CN/chat.json b/webview-ui/src/i18n/locales/zh-CN/chat.json new file mode 100644 index 0000000000..c117ad281c --- /dev/null +++ b/webview-ui/src/i18n/locales/zh-CN/chat.json @@ -0,0 +1,60 @@ +{ + "greeting": "Roo能为您做什么?", + "retry": { + "title": "重试", + "tooltip": "重试此操作" + }, + "startNewTask": { + "title": "开始新任务", + "tooltip": "开始新任务" + }, + "proceedAnyways": { + "title": "继续执行", + "tooltip": "继续执行(尽管有警告)" + }, + "save": { + "title": "保存", + "tooltip": "保存文件更改" + }, + "reject": { + "title": "拒绝", + "tooltip": "拒绝此操作" + }, + "completeSubtaskAndReturn": "完成子任务并返回", + "approve": { + "title": "批准", + "tooltip": "批准此操作" + }, + "runCommand": { + "title": "运行命令", + "tooltip": "执行此命令" + }, + "proceedWhileRunning": { + "title": "继续执行", + "tooltip": "在命令执行时继续" + }, + "resumeTask": { + "title": "恢复任务", + "tooltip": "继续当前任务" + }, + "terminate": { + "title": "终止", + "tooltip": "结束当前任务" + }, + "cancel": { + "title": "取消", + "tooltip": "取消当前操作" + }, + "scrollToBottom": "滚动到底部", + "aboutMe": "得益于最新的智能编码技术突破,我可以一步一步处理复杂的软件开发任务。通过允许我创建和编辑文件、探索复杂项目、使用浏览器以及执行终端命令(在您授权后),我能够以超越代码补全或技术支持的方式协助您。我甚至可以使用MCP创建新工具并扩展自身能力。", + "selectMode": "选择模式", + "selectApiConfig": "选择大模型配置", + "enhancePrompt": "增强提示内容", + "addImages": "添加图片", + "sendMessage": "发送消息", + "typeMessage": "输入消息...", + "typeTask": "输入您的任务...", + "addContext": "(@ 添加上下文, / 切换模式", + "dragFiles": "按住 shift 拖入文件", + "dragFilesImages": "按住 shift 拖入文件/图片" +} diff --git a/webview-ui/src/i18n/locales/zh-CN/common.json b/webview-ui/src/i18n/locales/zh-CN/common.json new file mode 100644 index 0000000000..298126f12d --- /dev/null +++ b/webview-ui/src/i18n/locales/zh-CN/common.json @@ -0,0 +1,8 @@ +{ + "telemetryTitle": "帮助改进 Roo 代码", + "changeSettings": "可以随时在设置页面底部更改此设置", + "settings": "设置", + "anonymousTelemetry": "发送匿名的错误和使用数据,以帮助我们修复错误并改进扩展程序。不会发送任何代码、提示或个人信息。", + "allow": "允许", + "deny": "拒绝" +} diff --git a/webview-ui/src/i18n/locales/zh-TW/chat.json b/webview-ui/src/i18n/locales/zh-TW/chat.json new file mode 100644 index 0000000000..1c6f589325 --- /dev/null +++ b/webview-ui/src/i18n/locales/zh-TW/chat.json @@ -0,0 +1,60 @@ +{ + "greeting": "Roo 能為您做什麼?", + "retry": { + "title": "重試", + "tooltip": "再次嘗試操作" + }, + "startNewTask": { + "title": "開始新任務", + "tooltip": "開始一個新任務" + }, + "proceedAnyways": { + "title": "繼續執行", + "tooltip": "在命令執行期間繼續" + }, + "save": { + "title": "儲存", + "tooltip": "儲存檔案變更" + }, + "reject": { + "title": "拒絕", + "tooltip": "拒絕此操作" + }, + "completeSubtaskAndReturn": "完成子任務並返回", + "approve": { + "title": "批准", + "tooltip": "批准此操作" + }, + "runCommand": { + "title": "執行命令", + "tooltip": "執行此命令" + }, + "proceedWhileRunning": { + "title": "執行期間繼續", + "tooltip": "無視警告繼續" + }, + "resumeTask": { + "title": "恢復任務", + "tooltip": "恢復當前任務" + }, + "terminate": { + "title": "終止", + "tooltip": "終止當前任務" + }, + "cancel": { + "title": "取消", + "tooltip": "取消當前操作" + }, + "scrollToBottom": "滾動到聊天底部", + "aboutMe": "得益於代理編碼能力的最新突破,我可以逐步處理複雜的軟體開發任務。通過允許我創建和編輯文件、探索複雜項目、使用瀏覽器和執行終端命令(在您批准後)的工具,我可以以超越代碼完成或技術支持的方式幫助您。我甚至可以使用 MCP 創建新工具並擴展自己的能力。", + "selectMode": "選擇互動模式", + "selectApiConfig": "選擇 API 配置", + "enhancePrompt": "使用額外上下文增強提示", + "addImages": "添加圖片到消息", + "sendMessage": "發送消息", + "typeMessage": "輸入消息...", + "typeTask": "在此輸入您的任務...", + "addContext": "(@ 添加上下文, / 切換模式", + "dragFiles": "按住 shift 拖動文件", + "dragFilesImages": "按住 shift 拖動文件/圖片" +} diff --git a/webview-ui/src/i18n/locales/zh-TW/common.json b/webview-ui/src/i18n/locales/zh-TW/common.json new file mode 100644 index 0000000000..f1b1f81759 --- /dev/null +++ b/webview-ui/src/i18n/locales/zh-TW/common.json @@ -0,0 +1,8 @@ +{ + "title": "幫助改進 Roo Code", + "anonymousTelemetry": "發送匿名的錯誤和使用數據,以幫助我們修復錯誤並改進擴展功能。不會發送任何代碼、提示或個人信息。", + "changeSettings": "您隨時可以在設置底部更改此選項", + "settings": "設置", + "allow": "允許", + "deny": "拒絕" +} From 0ca64a95e29d677c11e3fa086f3ed3196c2a9eaf Mon Sep 17 00:00:00 2001 From: Benson Date: Sun, 16 Mar 2025 00:11:52 +0530 Subject: [PATCH 08/58] Update README.md Discord link in the bottom was broken now fixed with the correct link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a6301b2bac..e78d7d4932 100644 --- a/README.md +++ b/README.md @@ -195,4 +195,4 @@ Thanks to all our contributors who have helped make Roo Code better! --- -**Enjoy Roo Code!** Whether you keep it on a short leash or let it roam autonomously, we can’t wait to see what you build. If you have questions or feature ideas, drop by our [Reddit community](https://www.reddit.com/r/RooCode/) or [Discord](https://roocode.com/discord). Happy coding! +**Enjoy Roo Code!** Whether you keep it on a short leash or let it roam autonomously, we can’t wait to see what you build. If you have questions or feature ideas, drop by our [Reddit community](https://www.reddit.com/r/RooCode/) or [Discord](https://discord.gg/roocode). Happy coding! From d7a63e1a264596686ea1ac6bcfd03c3883f4a36b Mon Sep 17 00:00:00 2001 From: mrubens Date: Sat, 15 Mar 2025 18:57:04 +0000 Subject: [PATCH 09/58] docs: update contributors list [skip ci] --- README.md | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index e78d7d4932..051d4e99b3 100644 --- a/README.md +++ b/README.md @@ -171,21 +171,21 @@ We love community contributions! Get started by reading our [CONTRIBUTING.md](CO Thanks to all our contributors who have helped make Roo Code better! -| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| -| :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| jquanton
jquanton
| nissa-seru
nissa-seru
| -| hannesrudolph
hannesrudolph
| MuriloFP
MuriloFP
| NyxJae
NyxJae
| punkpeye
punkpeye
| d-oit
d-oit
| monotykamary
monotykamary
| -| lloydchang
lloydchang
| vigneshsubbiah16
vigneshsubbiah16
| Szpadel
Szpadel
| lupuletic
lupuletic
| cannuri
cannuri
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| -| Premshay
Premshay
| psv2522
psv2522
| olweraltuve
olweraltuve
| RaySinner
RaySinner
| qdaxb
qdaxb
| afshawnlotfi
afshawnlotfi
| -| emshvac
emshvac
| Lunchb0ne
Lunchb0ne
| sammcj
sammcj
| dtrugman
dtrugman
| aitoroses
aitoroses
| yt3trees
yt3trees
| -| yongjer
yongjer
| vincentsong
vincentsong
| pugazhendhi-m
pugazhendhi-m
| eonghk
eonghk
| philfung
philfung
| pdecat
pdecat
| -| napter
napter
| mdp
mdp
| jcbdev
jcbdev
| anton-otee
anton-otee
| bannzai
bannzai
| dairui1
dairui1
| -| dqroid
dqroid
| feifei325
feifei325
| kinandan
kinandan
| kohii
kohii
| lightrabbit
lightrabbit
| olup
olup
| -| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| oprstchn
oprstchn
| philipnext
philipnext
| refactorthis
refactorthis
| samir-nimbly
samir-nimbly
| -| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| student20880
student20880
| PretzelVector
PretzelVector
| AMHesch
AMHesch
| adamwlarson
adamwlarson
| -| alarno
alarno
| andreastempsch
andreastempsch
| Atlogit
Atlogit
| dleen
dleen
| dbasclpy
dbasclpy
| celestial-vault
celestial-vault
| -| DeXtroTip
DeXtroTip
| hesara
hesara
| eltociear
eltociear
| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| marvijo-code
marvijo-code
| -| Sarke
Sarke
| tgfjt
tgfjt
| vladstudio
vladstudio
| ashktn
ashktn
| | | +| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| +| :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| jquanton
jquanton
| nissa-seru
nissa-seru
| +| hannesrudolph
hannesrudolph
| MuriloFP
MuriloFP
| NyxJae
NyxJae
| punkpeye
punkpeye
| d-oit
d-oit
| monotykamary
monotykamary
| +| lloydchang
lloydchang
| vigneshsubbiah16
vigneshsubbiah16
| Szpadel
Szpadel
| lupuletic
lupuletic
| cannuri
cannuri
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| +| Premshay
Premshay
| psv2522
psv2522
| olweraltuve
olweraltuve
| RaySinner
RaySinner
| qdaxb
qdaxb
| afshawnlotfi
afshawnlotfi
| +| emshvac
emshvac
| Lunchb0ne
Lunchb0ne
| sammcj
sammcj
| dtrugman
dtrugman
| aitoroses
aitoroses
| yt3trees
yt3trees
| +| yongjer
yongjer
| vincentsong
vincentsong
| pugazhendhi-m
pugazhendhi-m
| eonghk
eonghk
| philfung
philfung
| pdecat
pdecat
| +| napter
napter
| mdp
mdp
| jcbdev
jcbdev
| benzntech
benzntech
| anton-otee
anton-otee
| bannzai
bannzai
| +| dairui1
dairui1
| dqroid
dqroid
| feifei325
feifei325
| kinandan
kinandan
| kohii
kohii
| lightrabbit
lightrabbit
| +| olup
olup
| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| oprstchn
oprstchn
| philipnext
philipnext
| refactorthis
refactorthis
| +| samir-nimbly
samir-nimbly
| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| student20880
student20880
| PretzelVector
PretzelVector
| AMHesch
AMHesch
| +| adamwlarson
adamwlarson
| alarno
alarno
| andreastempsch
andreastempsch
| Atlogit
Atlogit
| dleen
dleen
| dbasclpy
dbasclpy
| +| celestial-vault
celestial-vault
| DeXtroTip
DeXtroTip
| hesara
hesara
| eltociear
eltociear
| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| +| marvijo-code
marvijo-code
| Sarke
Sarke
| tgfjt
tgfjt
| vladstudio
vladstudio
| ashktn
ashktn
| | From 51abb860a0ef9a15d9dca132b6b2cb00653c761c Mon Sep 17 00:00:00 2001 From: mrubens Date: Sun, 16 Mar 2025 02:56:05 +0000 Subject: [PATCH 10/58] docs: update contributors list [skip ci] --- README.md | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 051d4e99b3..d1231a90f5 100644 --- a/README.md +++ b/README.md @@ -171,21 +171,21 @@ We love community contributions! Get started by reading our [CONTRIBUTING.md](CO Thanks to all our contributors who have helped make Roo Code better! -| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| -| :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| jquanton
jquanton
| nissa-seru
nissa-seru
| -| hannesrudolph
hannesrudolph
| MuriloFP
MuriloFP
| NyxJae
NyxJae
| punkpeye
punkpeye
| d-oit
d-oit
| monotykamary
monotykamary
| -| lloydchang
lloydchang
| vigneshsubbiah16
vigneshsubbiah16
| Szpadel
Szpadel
| lupuletic
lupuletic
| cannuri
cannuri
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| -| Premshay
Premshay
| psv2522
psv2522
| olweraltuve
olweraltuve
| RaySinner
RaySinner
| qdaxb
qdaxb
| afshawnlotfi
afshawnlotfi
| -| emshvac
emshvac
| Lunchb0ne
Lunchb0ne
| sammcj
sammcj
| dtrugman
dtrugman
| aitoroses
aitoroses
| yt3trees
yt3trees
| -| yongjer
yongjer
| vincentsong
vincentsong
| pugazhendhi-m
pugazhendhi-m
| eonghk
eonghk
| philfung
philfung
| pdecat
pdecat
| -| napter
napter
| mdp
mdp
| jcbdev
jcbdev
| benzntech
benzntech
| anton-otee
anton-otee
| bannzai
bannzai
| -| dairui1
dairui1
| dqroid
dqroid
| feifei325
feifei325
| kinandan
kinandan
| kohii
kohii
| lightrabbit
lightrabbit
| -| olup
olup
| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| oprstchn
oprstchn
| philipnext
philipnext
| refactorthis
refactorthis
| -| samir-nimbly
samir-nimbly
| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| student20880
student20880
| PretzelVector
PretzelVector
| AMHesch
AMHesch
| -| adamwlarson
adamwlarson
| alarno
alarno
| andreastempsch
andreastempsch
| Atlogit
Atlogit
| dleen
dleen
| dbasclpy
dbasclpy
| -| celestial-vault
celestial-vault
| DeXtroTip
DeXtroTip
| hesara
hesara
| eltociear
eltociear
| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| -| marvijo-code
marvijo-code
| Sarke
Sarke
| tgfjt
tgfjt
| vladstudio
vladstudio
| ashktn
ashktn
| | +| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| +| :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| jquanton
jquanton
| nissa-seru
nissa-seru
| +| hannesrudolph
hannesrudolph
| MuriloFP
MuriloFP
| NyxJae
NyxJae
| punkpeye
punkpeye
| d-oit
d-oit
| monotykamary
monotykamary
| +| lloydchang
lloydchang
| vigneshsubbiah16
vigneshsubbiah16
| Szpadel
Szpadel
| lupuletic
lupuletic
| cannuri
cannuri
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| +| Premshay
Premshay
| psv2522
psv2522
| olweraltuve
olweraltuve
| RaySinner
RaySinner
| qdaxb
qdaxb
| afshawnlotfi
afshawnlotfi
| +| emshvac
emshvac
| Lunchb0ne
Lunchb0ne
| sammcj
sammcj
| dtrugman
dtrugman
| aitoroses
aitoroses
| yt3trees
yt3trees
| +| yongjer
yongjer
| vincentsong
vincentsong
| pugazhendhi-m
pugazhendhi-m
| feifei325
feifei325
| eonghk
eonghk
| philfung
philfung
| +| pdecat
pdecat
| napter
napter
| mdp
mdp
| jcbdev
jcbdev
| benzntech
benzntech
| anton-otee
anton-otee
| +| AMHesch
AMHesch
| bannzai
bannzai
| dairui1
dairui1
| dqroid
dqroid
| kinandan
kinandan
| kohii
kohii
| +| lightrabbit
lightrabbit
| olup
olup
| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| oprstchn
oprstchn
| philipnext
philipnext
| +| refactorthis
refactorthis
| samir-nimbly
samir-nimbly
| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| student20880
student20880
| PretzelVector
PretzelVector
| +| adamwlarson
adamwlarson
| alarno
alarno
| andreastempsch
andreastempsch
| Atlogit
Atlogit
| dleen
dleen
| dbasclpy
dbasclpy
| +| celestial-vault
celestial-vault
| DeXtroTip
DeXtroTip
| hesara
hesara
| eltociear
eltociear
| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| +| marvijo-code
marvijo-code
| Sarke
Sarke
| tgfjt
tgfjt
| vladstudio
vladstudio
| ashktn
ashktn
| | From 435e135481eac0e947a1faa420d789e5f21d653c Mon Sep 17 00:00:00 2001 From: Matt Rubens Date: Sat, 15 Mar 2025 22:54:07 -0400 Subject: [PATCH 11/58] Fix paren --- webview-ui/src/components/chat/ChatView.tsx | 2 +- webview-ui/src/i18n/locales/ar/chat.json | 2 +- webview-ui/src/i18n/locales/ca/chat.json | 2 +- webview-ui/src/i18n/locales/cs/chat.json | 2 +- webview-ui/src/i18n/locales/de/chat.json | 2 +- webview-ui/src/i18n/locales/en/chat.json | 2 +- webview-ui/src/i18n/locales/es/chat.json | 2 +- webview-ui/src/i18n/locales/fr/chat.json | 2 +- webview-ui/src/i18n/locales/hi/chat.json | 2 +- webview-ui/src/i18n/locales/hu/chat.json | 2 +- webview-ui/src/i18n/locales/it/chat.json | 2 +- webview-ui/src/i18n/locales/ja/chat.json | 2 +- webview-ui/src/i18n/locales/ko/chat.json | 2 +- webview-ui/src/i18n/locales/pl/chat.json | 2 +- webview-ui/src/i18n/locales/pt-BR/chat.json | 2 +- webview-ui/src/i18n/locales/pt/chat.json | 2 +- webview-ui/src/i18n/locales/ru/chat.json | 2 +- webview-ui/src/i18n/locales/tr/chat.json | 2 +- webview-ui/src/i18n/locales/zh-CN/chat.json | 2 +- webview-ui/src/i18n/locales/zh-TW/chat.json | 2 +- 20 files changed, 20 insertions(+), 20 deletions(-) diff --git a/webview-ui/src/components/chat/ChatView.tsx b/webview-ui/src/components/chat/ChatView.tsx index aa179e7557..fc38a6f5f2 100644 --- a/webview-ui/src/components/chat/ChatView.tsx +++ b/webview-ui/src/components/chat/ChatView.tsx @@ -945,7 +945,7 @@ const ChatView = ({ isHidden, showAnnouncement, hideAnnouncement, showHistoryVie 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})` + return baseText + `\n(${contextText}${imageText})` }, [task, shouldDisableImages, t]) const itemContent = useCallback( diff --git a/webview-ui/src/i18n/locales/ar/chat.json b/webview-ui/src/i18n/locales/ar/chat.json index caef10a830..84b4f75834 100644 --- a/webview-ui/src/i18n/locales/ar/chat.json +++ b/webview-ui/src/i18n/locales/ar/chat.json @@ -54,7 +54,7 @@ "sendMessage": "إرسال الرسالة", "typeMessage": "اكتب رسالة...", "typeTask": "اكتب مهمتك هنا...", - "addContext": "(@ لإضافة سياق، / لتبديل الأوضاع", + "addContext": "@ لإضافة سياق، / لتبديل الأوضاع", "dragFiles": "اضغط على shift لسحب الملفات", "dragFilesImages": "اضغط على shift لسحب الملفات/الصور" } diff --git a/webview-ui/src/i18n/locales/ca/chat.json b/webview-ui/src/i18n/locales/ca/chat.json index 192d8ed7dd..90e6e41d9b 100644 --- a/webview-ui/src/i18n/locales/ca/chat.json +++ b/webview-ui/src/i18n/locales/ca/chat.json @@ -54,7 +54,7 @@ "sendMessage": "Envia el missatge", "typeMessage": "Escriu un missatge...", "typeTask": "Escriu la teva tasca aquí...", - "addContext": "(@ per afegir context, / per canviar de mode", + "addContext": "@ per afegir context, / per canviar de mode", "dragFiles": "manté premut shift per arrossegar fitxers", "dragFilesImages": "manté premut shift per arrossegar fitxers/imatges" } diff --git a/webview-ui/src/i18n/locales/cs/chat.json b/webview-ui/src/i18n/locales/cs/chat.json index 4ab1963d8c..7243e7af9b 100644 --- a/webview-ui/src/i18n/locales/cs/chat.json +++ b/webview-ui/src/i18n/locales/cs/chat.json @@ -54,7 +54,7 @@ "sendMessage": "Odeslat zprávu", "typeMessage": "Napište zprávu...", "typeTask": "Napište svůj úkol zde...", - "addContext": "(@ pro přidání kontextu, / pro přepnutí režimů", + "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ů" } diff --git a/webview-ui/src/i18n/locales/de/chat.json b/webview-ui/src/i18n/locales/de/chat.json index 5e0450bd85..98120f0bc9 100644 --- a/webview-ui/src/i18n/locales/de/chat.json +++ b/webview-ui/src/i18n/locales/de/chat.json @@ -54,7 +54,7 @@ "sendMessage": "Nachricht senden", "typeMessage": "Nachricht eingeben...", "typeTask": "Geben Sie hier Ihre Aufgabe ein...", - "addContext": "(@ um Kontext hinzuzufügen, / um Modi zu wechseln", + "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" } diff --git a/webview-ui/src/i18n/locales/en/chat.json b/webview-ui/src/i18n/locales/en/chat.json index 805faaf375..cf1d4047d8 100644 --- a/webview-ui/src/i18n/locales/en/chat.json +++ b/webview-ui/src/i18n/locales/en/chat.json @@ -54,7 +54,7 @@ "sendMessage": "Send message", "typeMessage": "Type a message...", "typeTask": "Type your task here...", - "addContext": "(@ to add context, / to switch modes", + "addContext": "@ to add context, / to switch modes", "dragFiles": "hold shift to drag in files", "dragFilesImages": "hold shift to drag in files/images" } diff --git a/webview-ui/src/i18n/locales/es/chat.json b/webview-ui/src/i18n/locales/es/chat.json index e038b1969d..a24ec2afe0 100644 --- a/webview-ui/src/i18n/locales/es/chat.json +++ b/webview-ui/src/i18n/locales/es/chat.json @@ -54,7 +54,7 @@ "sendMessage": "Enviar mensaje", "typeMessage": "Escribe un mensaje...", "typeTask": "Escribe tu tarea aquí...", - "addContext": "(@ para agregar contexto, / para cambiar modos", + "addContext": "@ para agregar contexto, / para cambiar modos", "dragFiles": "mantén shift para arrastrar archivos", "dragFilesImages": "mantén shift para arrastrar archivos/imágenes" } diff --git a/webview-ui/src/i18n/locales/fr/chat.json b/webview-ui/src/i18n/locales/fr/chat.json index 0decca4471..858c0451c3 100644 --- a/webview-ui/src/i18n/locales/fr/chat.json +++ b/webview-ui/src/i18n/locales/fr/chat.json @@ -54,7 +54,7 @@ "sendMessage": "Envoyer le message", "typeMessage": "Tapez un message...", "typeTask": "Tapez votre tâche ici...", - "addContext": "(@ pour ajouter du contexte, / pour changer de mode", + "addContext": "@ pour ajouter du contexte, / pour changer de mode", "dragFiles": "maintenez shift pour glisser des fichiers", "dragFilesImages": "maintenez shift pour glisser des fichiers/images" } diff --git a/webview-ui/src/i18n/locales/hi/chat.json b/webview-ui/src/i18n/locales/hi/chat.json index 6896d7844b..1b85151dfd 100644 --- a/webview-ui/src/i18n/locales/hi/chat.json +++ b/webview-ui/src/i18n/locales/hi/chat.json @@ -54,7 +54,7 @@ "sendMessage": "संदेश भेजें", "typeMessage": "एक संदेश टाइप करें...", "typeTask": "अपना कार्य यहां टाइप करें...", - "addContext": "(@ संदर्भ जोड़ने के लिए, / मोड बदलने के लिए", + "addContext": "@ संदर्भ जोड़ने के लिए, / मोड बदलने के लिए", "dragFiles": "फ़ाइलों को खींचने के लिए shift दबाए रखें", "dragFilesImages": "फ़ाइलों/छवियों को खींचने के लिए shift दबाए रखें" } diff --git a/webview-ui/src/i18n/locales/hu/chat.json b/webview-ui/src/i18n/locales/hu/chat.json index 3ca01f840a..d2454b9bfd 100644 --- a/webview-ui/src/i18n/locales/hu/chat.json +++ b/webview-ui/src/i18n/locales/hu/chat.json @@ -54,7 +54,7 @@ "sendMessage": "Üzenet küldése", "typeMessage": "Írjon egy üzenetet...", "typeTask": "Írja ide a feladatát...", - "addContext": "(@ kontextus hozzáadásához, / módváltáshoz", + "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" } diff --git a/webview-ui/src/i18n/locales/it/chat.json b/webview-ui/src/i18n/locales/it/chat.json index 16612a26ac..494a82f277 100644 --- a/webview-ui/src/i18n/locales/it/chat.json +++ b/webview-ui/src/i18n/locales/it/chat.json @@ -54,7 +54,7 @@ "sendMessage": "Invia messaggio", "typeMessage": "Scrivi un messaggio...", "typeTask": "Scrivi qui la tua attività...", - "addContext": "(@ per aggiungere contesto, / per cambiare modalità", + "addContext": "@ per aggiungere contesto, / per cambiare modalità", "dragFiles": "tieni premuto shift per trascinare i file", "dragFilesImages": "tieni premuto shift per trascinare file/immagini" } diff --git a/webview-ui/src/i18n/locales/ja/chat.json b/webview-ui/src/i18n/locales/ja/chat.json index 88ee7afd27..cc3ed08c89 100644 --- a/webview-ui/src/i18n/locales/ja/chat.json +++ b/webview-ui/src/i18n/locales/ja/chat.json @@ -54,7 +54,7 @@ "sendMessage": "メッセージを送信", "typeMessage": "メッセージを入力...", "typeTask": "ここにタスクを入力...", - "addContext": "(@ コンテキストを追加, / モードを切り替え", + "addContext": "@ コンテキストを追加, / モードを切り替え", "dragFiles": "ファイルをドラッグするにはshiftを押したままにします", "dragFilesImages": "ファイル/画像をドラッグするにはshiftを押したままにします" } diff --git a/webview-ui/src/i18n/locales/ko/chat.json b/webview-ui/src/i18n/locales/ko/chat.json index c004106d11..2d7dbb361e 100644 --- a/webview-ui/src/i18n/locales/ko/chat.json +++ b/webview-ui/src/i18n/locales/ko/chat.json @@ -54,7 +54,7 @@ "sendMessage": "메시지 보내기", "typeMessage": "메시지를 입력하세요...", "typeTask": "여기에 작업을 입력하세요...", - "addContext": "(@ 컨텍스트 추가, / 모드 전환", + "addContext": "@ 컨텍스트 추가, / 모드 전환", "dragFiles": "파일을 드래그하려면 shift를 누르세요", "dragFilesImages": "파일/이미지를 드래그하려면 shift를 누르세요" } diff --git a/webview-ui/src/i18n/locales/pl/chat.json b/webview-ui/src/i18n/locales/pl/chat.json index b5f65d1b3d..e862c2cdaa 100644 --- a/webview-ui/src/i18n/locales/pl/chat.json +++ b/webview-ui/src/i18n/locales/pl/chat.json @@ -54,7 +54,7 @@ "sendMessage": "Wyślij wiadomość", "typeMessage": "Wpisz wiadomość...", "typeTask": "Wpisz tutaj swoje zadanie...", - "addContext": "(@ aby dodać kontekst, / aby przełączyć tryby", + "addContext": "@ aby dodać kontekst, / aby przełączyć tryby", "dragFiles": "przytrzymaj shift, aby przeciągnąć pliki", "dragFilesImages": "przytrzymaj shift, aby przeciągnąć pliki/obrazy" } diff --git a/webview-ui/src/i18n/locales/pt-BR/chat.json b/webview-ui/src/i18n/locales/pt-BR/chat.json index 25aca91257..7f3238b8a0 100644 --- a/webview-ui/src/i18n/locales/pt-BR/chat.json +++ b/webview-ui/src/i18n/locales/pt-BR/chat.json @@ -54,7 +54,7 @@ "sendMessage": "Enviar mensagem", "typeMessage": "Digite uma mensagem...", "typeTask": "Digite sua tarefa aqui...", - "addContext": "(@ para adicionar contexto, / para mudar modos", + "addContext": "@ para adicionar contexto, / para mudar modos", "dragFiles": "segure shift para arrastar arquivos", "dragFilesImages": "segure shift para arrastar arquivos/imagens" } diff --git a/webview-ui/src/i18n/locales/pt/chat.json b/webview-ui/src/i18n/locales/pt/chat.json index 25aca91257..7f3238b8a0 100644 --- a/webview-ui/src/i18n/locales/pt/chat.json +++ b/webview-ui/src/i18n/locales/pt/chat.json @@ -54,7 +54,7 @@ "sendMessage": "Enviar mensagem", "typeMessage": "Digite uma mensagem...", "typeTask": "Digite sua tarefa aqui...", - "addContext": "(@ para adicionar contexto, / para mudar modos", + "addContext": "@ para adicionar contexto, / para mudar modos", "dragFiles": "segure shift para arrastar arquivos", "dragFilesImages": "segure shift para arrastar arquivos/imagens" } diff --git a/webview-ui/src/i18n/locales/ru/chat.json b/webview-ui/src/i18n/locales/ru/chat.json index 5c435c1278..b3b286ac8a 100644 --- a/webview-ui/src/i18n/locales/ru/chat.json +++ b/webview-ui/src/i18n/locales/ru/chat.json @@ -54,7 +54,7 @@ "sendMessage": "Отправить сообщение", "typeMessage": "Введите сообщение...", "typeTask": "Введите вашу задачу здесь...", - "addContext": "(@ чтобы добавить контекст, / чтобы переключить режимы", + "addContext": "@ чтобы добавить контекст, / чтобы переключить режимы", "dragFiles": "удерживайте shift, чтобы перетащить файлы", "dragFilesImages": "удерживайте shift, чтобы перетащить файлы/изображения" } diff --git a/webview-ui/src/i18n/locales/tr/chat.json b/webview-ui/src/i18n/locales/tr/chat.json index 2e33249a8e..15ff336e7e 100644 --- a/webview-ui/src/i18n/locales/tr/chat.json +++ b/webview-ui/src/i18n/locales/tr/chat.json @@ -54,7 +54,7 @@ "sendMessage": "Mesaj gönder", "typeMessage": "Bir mesaj yazın...", "typeTask": "Görevinizi buraya yazın...", - "addContext": "(@ bağlam eklemek için, / modları değiştirmek için", + "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" } diff --git a/webview-ui/src/i18n/locales/zh-CN/chat.json b/webview-ui/src/i18n/locales/zh-CN/chat.json index c117ad281c..d84118e41d 100644 --- a/webview-ui/src/i18n/locales/zh-CN/chat.json +++ b/webview-ui/src/i18n/locales/zh-CN/chat.json @@ -54,7 +54,7 @@ "sendMessage": "发送消息", "typeMessage": "输入消息...", "typeTask": "输入您的任务...", - "addContext": "(@ 添加上下文, / 切换模式", + "addContext": "@ 添加上下文, / 切换模式", "dragFiles": "按住 shift 拖入文件", "dragFilesImages": "按住 shift 拖入文件/图片" } diff --git a/webview-ui/src/i18n/locales/zh-TW/chat.json b/webview-ui/src/i18n/locales/zh-TW/chat.json index 1c6f589325..446900e39b 100644 --- a/webview-ui/src/i18n/locales/zh-TW/chat.json +++ b/webview-ui/src/i18n/locales/zh-TW/chat.json @@ -54,7 +54,7 @@ "sendMessage": "發送消息", "typeMessage": "輸入消息...", "typeTask": "在此輸入您的任務...", - "addContext": "(@ 添加上下文, / 切換模式", + "addContext": "@ 添加上下文, / 切換模式", "dragFiles": "按住 shift 拖動文件", "dragFilesImages": "按住 shift 拖動文件/圖片" } From c7868cf111d80ce7eaa4c5a7e8923e058b943d67 Mon Sep 17 00:00:00 2001 From: Matt Rubens Date: Sat, 15 Mar 2025 23:17:53 -0400 Subject: [PATCH 12/58] Fix getWorkspaceProblems to use an await --- src/core/mentions/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/mentions/index.ts b/src/core/mentions/index.ts index e5f2785eba..caa239168e 100644 --- a/src/core/mentions/index.ts +++ b/src/core/mentions/index.ts @@ -104,7 +104,7 @@ export async function parseMentions(text: string, cwd: string, urlContentFetcher } } else if (mention === "problems") { try { - const problems = getWorkspaceProblems(cwd) + const problems = await getWorkspaceProblems(cwd) parsedText += `\n\n\n${problems}\n` } catch (error) { parsedText += `\n\n\nError fetching diagnostics: ${error.message}\n` From a2be45e27e654f5d44d018f76659a5d9bac41310 Mon Sep 17 00:00:00 2001 From: Matt Rubens Date: Sat, 15 Mar 2025 23:40:59 -0400 Subject: [PATCH 13/58] i18n for chattextarea --- .roomodes | 38 ++++++++++++------- .../src/components/chat/ChatTextArea.tsx | 35 ++++++++--------- webview-ui/src/components/chat/ChatView.tsx | 5 +-- webview-ui/src/i18n/locales/ar/chat.json | 8 +++- webview-ui/src/i18n/locales/ca/chat.json | 8 +++- webview-ui/src/i18n/locales/cs/chat.json | 8 +++- webview-ui/src/i18n/locales/de/chat.json | 8 +++- webview-ui/src/i18n/locales/en/chat.json | 8 +++- webview-ui/src/i18n/locales/es/chat.json | 8 +++- webview-ui/src/i18n/locales/fr/chat.json | 8 +++- webview-ui/src/i18n/locales/hi/chat.json | 8 +++- webview-ui/src/i18n/locales/hu/chat.json | 8 +++- webview-ui/src/i18n/locales/it/chat.json | 8 +++- webview-ui/src/i18n/locales/ja/chat.json | 8 +++- webview-ui/src/i18n/locales/ko/chat.json | 8 +++- webview-ui/src/i18n/locales/pl/chat.json | 8 +++- webview-ui/src/i18n/locales/pt-BR/chat.json | 8 +++- webview-ui/src/i18n/locales/pt/chat.json | 8 +++- webview-ui/src/i18n/locales/ru/chat.json | 8 +++- webview-ui/src/i18n/locales/tr/chat.json | 8 +++- webview-ui/src/i18n/locales/zh-CN/chat.json | 8 +++- webview-ui/src/i18n/locales/zh-TW/chat.json | 8 +++- 22 files changed, 177 insertions(+), 53 deletions(-) diff --git a/.roomodes b/.roomodes index f10ca32056..c74aba7c78 100644 --- a/.roomodes +++ b/.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\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" } ] } \ No newline at end of file diff --git a/webview-ui/src/components/chat/ChatTextArea.tsx b/webview-ui/src/components/chat/ChatTextArea.tsx index 1002788dbc..be0ddd0b0e 100644 --- a/webview-ui/src/components/chat/ChatTextArea.tsx +++ b/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( }, ref, ) => { + const { t } = useAppTranslation() const { filePaths, openedTabs, currentApiConfigName, listApiConfigMeta, customModes, cwd } = useExtensionState() const [gitCommits, setGitCommits] = useState([]) const [showDropdown, setShowDropdown] = useState(false) @@ -133,12 +135,11 @@ const ChatTextArea = forwardRef( } 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( 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( 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( 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( }) } } else { - console.warn("No valid images were processed") + console.warn(t("chat:noValidImages")) } } }} @@ -779,7 +780,7 @@ const ChatTextArea = forwardRef( ( // 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( ({ @@ -840,13 +841,13 @@ const ChatTextArea = forwardRef( // 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( 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( 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 }} /> !textAreaDisabled && onSend()} style={{ fontSize: 15 }} /> diff --git a/webview-ui/src/components/chat/ChatView.tsx b/webview-ui/src/components/chat/ChatView.tsx index fc38a6f5f2..d0c33a1189 100644 --- a/webview-ui/src/components/chat/ChatView.tsx +++ b/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]) diff --git a/webview-ui/src/i18n/locales/ar/chat.json b/webview-ui/src/i18n/locales/ar/chat.json index 84b4f75834..5c047c3c16 100644 --- a/webview-ui/src/i18n/locales/ar/chat.json +++ b/webview-ui/src/i18n/locales/ar/chat.json @@ -56,5 +56,11 @@ "typeTask": "اكتب مهمتك هنا...", "addContext": "@ لإضافة سياق، / لتبديل الأوضاع", "dragFiles": "اضغط على shift لسحب الملفات", - "dragFilesImages": "اضغط على shift لسحب الملفات/الصور" + "dragFilesImages": "اضغط على shift لسحب الملفات/الصور", + "enhancePromptDescription": "يساعد زر 'تحسين المطالبة' على تحسين طلبك من خلال توفير سياق إضافي أو توضيحات أو إعادة صياغة. جرب كتابة طلب هنا وانقر على الزر مرة أخرى لمعرفة كيفية عمله.", + "errorReadingFile": "خطأ في قراءة الملف:", + "noValidImages": "لم تتم معالجة أي صور صالحة", + "separator": "فاصل", + "edit": "تعديل...", + "forNextMode": "للوضع التالي" } diff --git a/webview-ui/src/i18n/locales/ca/chat.json b/webview-ui/src/i18n/locales/ca/chat.json index 90e6e41d9b..c7ed21c654 100644 --- a/webview-ui/src/i18n/locales/ca/chat.json +++ b/webview-ui/src/i18n/locales/ca/chat.json @@ -56,5 +56,11 @@ "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" } diff --git a/webview-ui/src/i18n/locales/cs/chat.json b/webview-ui/src/i18n/locales/cs/chat.json index 7243e7af9b..9a78c47294 100644 --- a/webview-ui/src/i18n/locales/cs/chat.json +++ b/webview-ui/src/i18n/locales/cs/chat.json @@ -56,5 +56,11 @@ "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" } diff --git a/webview-ui/src/i18n/locales/de/chat.json b/webview-ui/src/i18n/locales/de/chat.json index 98120f0bc9..251d875dc8 100644 --- a/webview-ui/src/i18n/locales/de/chat.json +++ b/webview-ui/src/i18n/locales/de/chat.json @@ -56,5 +56,11 @@ "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" } diff --git a/webview-ui/src/i18n/locales/en/chat.json b/webview-ui/src/i18n/locales/en/chat.json index cf1d4047d8..9b76543a1b 100644 --- a/webview-ui/src/i18n/locales/en/chat.json +++ b/webview-ui/src/i18n/locales/en/chat.json @@ -50,11 +50,17 @@ "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" } diff --git a/webview-ui/src/i18n/locales/es/chat.json b/webview-ui/src/i18n/locales/es/chat.json index a24ec2afe0..9e43d1c8e3 100644 --- a/webview-ui/src/i18n/locales/es/chat.json +++ b/webview-ui/src/i18n/locales/es/chat.json @@ -56,5 +56,11 @@ "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" } diff --git a/webview-ui/src/i18n/locales/fr/chat.json b/webview-ui/src/i18n/locales/fr/chat.json index 858c0451c3..c4015dbd09 100644 --- a/webview-ui/src/i18n/locales/fr/chat.json +++ b/webview-ui/src/i18n/locales/fr/chat.json @@ -56,5 +56,11 @@ "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" } diff --git a/webview-ui/src/i18n/locales/hi/chat.json b/webview-ui/src/i18n/locales/hi/chat.json index 1b85151dfd..55a927a3b5 100644 --- a/webview-ui/src/i18n/locales/hi/chat.json +++ b/webview-ui/src/i18n/locales/hi/chat.json @@ -56,5 +56,11 @@ "typeTask": "अपना कार्य यहां टाइप करें...", "addContext": "@ संदर्भ जोड़ने के लिए, / मोड बदलने के लिए", "dragFiles": "फ़ाइलों को खींचने के लिए shift दबाए रखें", - "dragFilesImages": "फ़ाइलों/छवियों को खींचने के लिए shift दबाए रखें" + "dragFilesImages": "फ़ाइलों/छवियों को खींचने के लिए shift दबाए रखें", + "enhancePromptDescription": "'प्रॉम्प्ट बढ़ाएं' बटन अतिरिक्त संदर्भ, स्पष्टीकरण, या पुनर्कथन प्रदान करके आपके प्रॉम्प्ट को बेहतर बनाने में मदद करता है। यहां एक प्रॉम्प्ट टाइप करके और बटन पर फिर से क्लिक करके देखें कि यह कैसे काम करता है।", + "errorReadingFile": "फ़ाइल पढ़ने में त्रुटि:", + "noValidImages": "कोई वैध छवियां संसाधित नहीं की गईं", + "separator": "विभाजक", + "edit": "संपादित करें...", + "forNextMode": "अगले मोड के लिए" } diff --git a/webview-ui/src/i18n/locales/hu/chat.json b/webview-ui/src/i18n/locales/hu/chat.json index d2454b9bfd..97b7daa359 100644 --- a/webview-ui/src/i18n/locales/hu/chat.json +++ b/webview-ui/src/i18n/locales/hu/chat.json @@ -56,5 +56,11 @@ "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" } diff --git a/webview-ui/src/i18n/locales/it/chat.json b/webview-ui/src/i18n/locales/it/chat.json index 494a82f277..009bcf5041 100644 --- a/webview-ui/src/i18n/locales/it/chat.json +++ b/webview-ui/src/i18n/locales/it/chat.json @@ -56,5 +56,11 @@ "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" } diff --git a/webview-ui/src/i18n/locales/ja/chat.json b/webview-ui/src/i18n/locales/ja/chat.json index cc3ed08c89..6d3b21e1b7 100644 --- a/webview-ui/src/i18n/locales/ja/chat.json +++ b/webview-ui/src/i18n/locales/ja/chat.json @@ -56,5 +56,11 @@ "typeTask": "ここにタスクを入力...", "addContext": "@ コンテキストを追加, / モードを切り替え", "dragFiles": "ファイルをドラッグするにはshiftを押したままにします", - "dragFilesImages": "ファイル/画像をドラッグするにはshiftを押したままにします" + "dragFilesImages": "ファイル/画像をドラッグするにはshiftを押したままにします", + "enhancePromptDescription": "「プロンプト強化」ボタンは、追加のコンテキスト、説明、または言い換えを提供することで、あなたのプロンプトを改善するのに役立ちます。ここにプロンプトを入力して、もう一度ボタンをクリックするとどのように機能するかが分かります。", + "errorReadingFile": "ファイルの読み込み中にエラーが発生しました:", + "noValidImages": "有効な画像が処理されませんでした", + "separator": "区切り線", + "edit": "編集...", + "forNextMode": "次のモードへ" } diff --git a/webview-ui/src/i18n/locales/ko/chat.json b/webview-ui/src/i18n/locales/ko/chat.json index 2d7dbb361e..316ff47613 100644 --- a/webview-ui/src/i18n/locales/ko/chat.json +++ b/webview-ui/src/i18n/locales/ko/chat.json @@ -56,5 +56,11 @@ "typeTask": "여기에 작업을 입력하세요...", "addContext": "@ 컨텍스트 추가, / 모드 전환", "dragFiles": "파일을 드래그하려면 shift를 누르세요", - "dragFilesImages": "파일/이미지를 드래그하려면 shift를 누르세요" + "dragFilesImages": "파일/이미지를 드래그하려면 shift를 누르세요", + "enhancePromptDescription": "'프롬프트 강화' 버튼은 추가 컨텍스트, 설명 또는 재구성을 제공하여 프롬프트를 개선하는 데 도움을 줍니다. 여기에 프롬프트를 입력하고 버튼을 다시 클릭하여 작동 방식을 확인하세요.", + "errorReadingFile": "파일 읽기 오류:", + "noValidImages": "유효한 이미지가 처리되지 않았습니다", + "separator": "구분선", + "edit": "편집...", + "forNextMode": "다음 모드로" } diff --git a/webview-ui/src/i18n/locales/pl/chat.json b/webview-ui/src/i18n/locales/pl/chat.json index e862c2cdaa..9fdbd012da 100644 --- a/webview-ui/src/i18n/locales/pl/chat.json +++ b/webview-ui/src/i18n/locales/pl/chat.json @@ -56,5 +56,11 @@ "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" } diff --git a/webview-ui/src/i18n/locales/pt-BR/chat.json b/webview-ui/src/i18n/locales/pt-BR/chat.json index 7f3238b8a0..787b037551 100644 --- a/webview-ui/src/i18n/locales/pt-BR/chat.json +++ b/webview-ui/src/i18n/locales/pt-BR/chat.json @@ -56,5 +56,11 @@ "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" } diff --git a/webview-ui/src/i18n/locales/pt/chat.json b/webview-ui/src/i18n/locales/pt/chat.json index 7f3238b8a0..787b037551 100644 --- a/webview-ui/src/i18n/locales/pt/chat.json +++ b/webview-ui/src/i18n/locales/pt/chat.json @@ -56,5 +56,11 @@ "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" } diff --git a/webview-ui/src/i18n/locales/ru/chat.json b/webview-ui/src/i18n/locales/ru/chat.json index b3b286ac8a..a69a769ead 100644 --- a/webview-ui/src/i18n/locales/ru/chat.json +++ b/webview-ui/src/i18n/locales/ru/chat.json @@ -56,5 +56,11 @@ "typeTask": "Введите вашу задачу здесь...", "addContext": "@ чтобы добавить контекст, / чтобы переключить режимы", "dragFiles": "удерживайте shift, чтобы перетащить файлы", - "dragFilesImages": "удерживайте shift, чтобы перетащить файлы/изображения" + "dragFilesImages": "удерживайте shift, чтобы перетащить файлы/изображения", + "enhancePromptDescription": "Кнопка 'Улучшить запрос' помогает улучшить ваш запрос, предоставляя дополнительный контекст, разъяснения или переформулировки. Попробуйте ввести запрос здесь и нажмите кнопку еще раз, чтобы увидеть, как это работает.", + "errorReadingFile": "Ошибка чтения файла:", + "noValidImages": "Не обработано ни одного действительного изображения", + "separator": "Разделитель", + "edit": "Редактировать...", + "forNextMode": "для следующего режима" } diff --git a/webview-ui/src/i18n/locales/tr/chat.json b/webview-ui/src/i18n/locales/tr/chat.json index 15ff336e7e..03e653a99f 100644 --- a/webview-ui/src/i18n/locales/tr/chat.json +++ b/webview-ui/src/i18n/locales/tr/chat.json @@ -56,5 +56,11 @@ "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" } diff --git a/webview-ui/src/i18n/locales/zh-CN/chat.json b/webview-ui/src/i18n/locales/zh-CN/chat.json index d84118e41d..d3947ff21f 100644 --- a/webview-ui/src/i18n/locales/zh-CN/chat.json +++ b/webview-ui/src/i18n/locales/zh-CN/chat.json @@ -56,5 +56,11 @@ "typeTask": "输入您的任务...", "addContext": "@ 添加上下文, / 切换模式", "dragFiles": "按住 shift 拖入文件", - "dragFilesImages": "按住 shift 拖入文件/图片" + "dragFilesImages": "按住 shift 拖入文件/图片", + "enhancePromptDescription": "\"增强提示\"按钮通过提供额外的上下文、解释或重新表述来帮助改进你的提示。在此处输入提示,然后再次点击按钮查看其工作方式。", + "errorReadingFile": "读取文件时出错:", + "noValidImages": "没有处理有效图片", + "separator": "分隔线", + "edit": "编辑...", + "forNextMode": "切换至下一模式" } diff --git a/webview-ui/src/i18n/locales/zh-TW/chat.json b/webview-ui/src/i18n/locales/zh-TW/chat.json index 446900e39b..2774b41967 100644 --- a/webview-ui/src/i18n/locales/zh-TW/chat.json +++ b/webview-ui/src/i18n/locales/zh-TW/chat.json @@ -56,5 +56,11 @@ "typeTask": "在此輸入您的任務...", "addContext": "@ 添加上下文, / 切換模式", "dragFiles": "按住 shift 拖動文件", - "dragFilesImages": "按住 shift 拖動文件/圖片" + "dragFilesImages": "按住 shift 拖動文件/圖片", + "enhancePromptDescription": "「增強提示」按鈕通過提供額外的上下文、解釋或重新表述來幫助改進你的提示。在此處輸入提示,然後再次點擊按鈕查看其工作方式。", + "errorReadingFile": "讀取檔案時出錯:", + "noValidImages": "沒有處理有效圖片", + "separator": "分隔線", + "edit": "編輯...", + "forNextMode": "切換至下一模式" } From 747c3bd5521dea585ba2b640ea29778be20695b0 Mon Sep 17 00:00:00 2001 From: Matt Rubens Date: Sun, 16 Mar 2025 00:12:29 -0400 Subject: [PATCH 14/58] Remove memo that was interfering with translations --- webview-ui/src/components/chat/ChatView.tsx | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/webview-ui/src/components/chat/ChatView.tsx b/webview-ui/src/components/chat/ChatView.tsx index d0c33a1189..d0569e6f91 100644 --- a/webview-ui/src/components/chat/ChatView.tsx +++ b/webview-ui/src/components/chat/ChatView.tsx @@ -940,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[]) => { From 6cdd10251a6714d300114f447e526edd26dd16fa Mon Sep 17 00:00:00 2001 From: Matt Rubens Date: Sun, 16 Mar 2025 00:34:11 -0400 Subject: [PATCH 15/58] Translate history preview and view --- .roomodes | 2 +- .../src/components/history/CopyButton.tsx | 4 +- .../components/history/DeleteTaskDialog.tsx | 12 ++-- .../src/components/history/ExportButton.tsx | 31 +++++---- .../src/components/history/HistoryPreview.tsx | 21 ++++--- .../src/components/history/HistoryView.tsx | 26 ++++---- .../history/__tests__/HistoryView.test.tsx | 1 + .../src/i18n/__mocks__/TranslationContext.tsx | 63 +++++++++++++++++++ webview-ui/src/i18n/locales/ar/history.json | 25 ++++++++ webview-ui/src/i18n/locales/ca/history.json | 25 ++++++++ webview-ui/src/i18n/locales/cs/history.json | 25 ++++++++ webview-ui/src/i18n/locales/de/history.json | 25 ++++++++ webview-ui/src/i18n/locales/en/history.json | 25 ++++++++ webview-ui/src/i18n/locales/es/history.json | 25 ++++++++ webview-ui/src/i18n/locales/fr/history.json | 25 ++++++++ webview-ui/src/i18n/locales/hi/history.json | 25 ++++++++ webview-ui/src/i18n/locales/hu/history.json | 25 ++++++++ webview-ui/src/i18n/locales/it/history.json | 25 ++++++++ webview-ui/src/i18n/locales/ja/history.json | 25 ++++++++ webview-ui/src/i18n/locales/ko/history.json | 25 ++++++++ webview-ui/src/i18n/locales/pl/history.json | 25 ++++++++ .../src/i18n/locales/pt-BR/history.json | 25 ++++++++ webview-ui/src/i18n/locales/pt/history.json | 25 ++++++++ webview-ui/src/i18n/locales/ru/history.json | 25 ++++++++ webview-ui/src/i18n/locales/tr/history.json | 25 ++++++++ .../src/i18n/locales/zh-CN/history.json | 25 ++++++++ .../src/i18n/locales/zh-TW/history.json | 25 ++++++++ 27 files changed, 594 insertions(+), 41 deletions(-) create mode 100644 webview-ui/src/i18n/__mocks__/TranslationContext.tsx create mode 100644 webview-ui/src/i18n/locales/ar/history.json create mode 100644 webview-ui/src/i18n/locales/ca/history.json create mode 100644 webview-ui/src/i18n/locales/cs/history.json create mode 100644 webview-ui/src/i18n/locales/de/history.json create mode 100644 webview-ui/src/i18n/locales/en/history.json create mode 100644 webview-ui/src/i18n/locales/es/history.json create mode 100644 webview-ui/src/i18n/locales/fr/history.json create mode 100644 webview-ui/src/i18n/locales/hi/history.json create mode 100644 webview-ui/src/i18n/locales/hu/history.json create mode 100644 webview-ui/src/i18n/locales/it/history.json create mode 100644 webview-ui/src/i18n/locales/ja/history.json create mode 100644 webview-ui/src/i18n/locales/ko/history.json create mode 100644 webview-ui/src/i18n/locales/pl/history.json create mode 100644 webview-ui/src/i18n/locales/pt-BR/history.json create mode 100644 webview-ui/src/i18n/locales/pt/history.json create mode 100644 webview-ui/src/i18n/locales/ru/history.json create mode 100644 webview-ui/src/i18n/locales/tr/history.json create mode 100644 webview-ui/src/i18n/locales/zh-CN/history.json create mode 100644 webview-ui/src/i18n/locales/zh-TW/history.json diff --git a/.roomodes b/.roomodes index c74aba7c78..8dc2492f64 100644 --- a/.roomodes +++ b/.roomodes @@ -22,7 +22,7 @@ "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\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", + "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", [ diff --git a/webview-ui/src/components/history/CopyButton.tsx b/webview-ui/src/components/history/CopyButton.tsx index 0e693b4470..17964cc37e 100644 --- a/webview-ui/src/components/history/CopyButton.tsx +++ b/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) => { + diff --git a/webview-ui/src/components/history/ExportButton.tsx b/webview-ui/src/components/history/ExportButton.tsx index 6617e475bd..14b312470b 100644 --- a/webview-ui/src/components/history/ExportButton.tsx +++ b/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 }) => ( - -) +export const ExportButton = ({ itemId }: { itemId: string }) => { + const { t } = useAppTranslation() + + return ( + + ) +} diff --git a/webview-ui/src/components/history/HistoryPreview.tsx b/webview-ui/src/components/history/HistoryPreview.tsx index f81d8ddacf..64af37ed64 100644 --- a/webview-ui/src/components/history/HistoryPreview.tsx +++ b/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 (
- Recent Tasks + {t("history:recentTasks")}
{taskHistory.slice(0, 3).map((item) => ( @@ -50,22 +51,26 @@ const HistoryPreview = ({ showHistoryView }: HistoryPreviewProps) => {
- Tokens: ↑{formatLargeNumber(item.tokensIn || 0)} ↓ - {formatLargeNumber(item.tokensOut || 0)} + {t("history:tokens", { + in: formatLargeNumber(item.tokensIn || 0), + out: formatLargeNumber(item.tokensOut || 0), + })} {!!item.cacheWrites && ( <> {" • "} - Cache: +{formatLargeNumber(item.cacheWrites || 0)} →{" "} - {formatLargeNumber(item.cacheReads || 0)} + {t("history:cache", { + writes: formatLargeNumber(item.cacheWrites || 0), + reads: formatLargeNumber(item.cacheReads || 0), + })} )} {!!item.totalCost && ( <> {" • "} - API Cost: ${item.totalCost?.toFixed(4)} + {t("history:apiCost", { cost: item.totalCost?.toFixed(4) })} )}
diff --git a/webview-ui/src/components/history/HistoryView.tsx b/webview-ui/src/components/history/HistoryView.tsx index ec44f8eaca..c82fd0b92a 100644 --- a/webview-ui/src/components/history/HistoryView.tsx +++ b/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(null) @@ -29,13 +31,13 @@ const HistoryView = ({ onDone }: HistoryViewProps) => {
-

History

- Done +

{t("history:history")}

+ {t("history:done")}
{ 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)}> - Newest - Oldest - Most Expensive - Most Tokens + {t("history:newest")} + {t("history:oldest")} + {t("history:mostExpensive")} + {t("history:mostTokens")} - Most Relevant + {t("history:mostRelevant")}
@@ -132,7 +134,7 @@ const HistoryView = ({ onDone }: HistoryViewProps) => {
{actions.map((action) => (
diff --git a/webview-ui/src/i18n/locales/ar/chat.json b/webview-ui/src/i18n/locales/ar/chat.json index 5c047c3c16..ac90b1d284 100644 --- a/webview-ui/src/i18n/locales/ar/chat.json +++ b/webview-ui/src/i18n/locales/ar/chat.json @@ -62,5 +62,52 @@ "noValidImages": "لم تتم معالجة أي صور صالحة", "separator": "فاصل", "edit": "تعديل...", - "forNextMode": "للوضع التالي" + "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 الفاشلة تلقائيًا عندما يُرجع المزود استجابة خطأ." + } + } + } } diff --git a/webview-ui/src/i18n/locales/ca/chat.json b/webview-ui/src/i18n/locales/ca/chat.json index c7ed21c654..9be59b5363 100644 --- a/webview-ui/src/i18n/locales/ca/chat.json +++ b/webview-ui/src/i18n/locales/ca/chat.json @@ -62,5 +62,52 @@ "noValidImages": "No s'ha processat cap imatge vàlida", "separator": "Separador", "edit": "Edita...", - "forNextMode": "per al següent mode" + "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." + } + } + } } diff --git a/webview-ui/src/i18n/locales/cs/chat.json b/webview-ui/src/i18n/locales/cs/chat.json index 9a78c47294..3c445f8147 100644 --- a/webview-ui/src/i18n/locales/cs/chat.json +++ b/webview-ui/src/i18n/locales/cs/chat.json @@ -62,5 +62,52 @@ "noValidImages": "Nebyly zpracovány žádné platné obrázky", "separator": "Oddělovač", "edit": "Upravit...", - "forNextMode": "pro další režim" + "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ěď." + } + } + } } diff --git a/webview-ui/src/i18n/locales/de/chat.json b/webview-ui/src/i18n/locales/de/chat.json index 251d875dc8..4e9d784373 100644 --- a/webview-ui/src/i18n/locales/de/chat.json +++ b/webview-ui/src/i18n/locales/de/chat.json @@ -62,5 +62,52 @@ "noValidImages": "Es wurden keine gültigen Bilder verarbeitet", "separator": "Trennlinie", "edit": "Bearbeiten...", - "forNextMode": "für nächsten Modus" + "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." + } + } + } } diff --git a/webview-ui/src/i18n/locales/en/chat.json b/webview-ui/src/i18n/locales/en/chat.json index 9b76543a1b..dcd62faf10 100644 --- a/webview-ui/src/i18n/locales/en/chat.json +++ b/webview-ui/src/i18n/locales/en/chat.json @@ -62,5 +62,52 @@ "noValidImages": "No valid images were processed", "separator": "Separator", "edit": "Edit...", - "forNextMode": "for next mode" + "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." + } + } + } } diff --git a/webview-ui/src/i18n/locales/es/chat.json b/webview-ui/src/i18n/locales/es/chat.json index 9e43d1c8e3..96f38440a1 100644 --- a/webview-ui/src/i18n/locales/es/chat.json +++ b/webview-ui/src/i18n/locales/es/chat.json @@ -62,5 +62,52 @@ "noValidImages": "No se procesaron imágenes válidas", "separator": "Separador", "edit": "Editar...", - "forNextMode": "para el siguiente modo" + "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." + } + } + } } diff --git a/webview-ui/src/i18n/locales/fr/chat.json b/webview-ui/src/i18n/locales/fr/chat.json index c4015dbd09..2145eb15a2 100644 --- a/webview-ui/src/i18n/locales/fr/chat.json +++ b/webview-ui/src/i18n/locales/fr/chat.json @@ -62,5 +62,52 @@ "noValidImages": "Aucune image valide n'a été traitée", "separator": "Séparateur", "edit": "Modifier...", - "forNextMode": "pour le mode suivant" + "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." + } + } + } } diff --git a/webview-ui/src/i18n/locales/hi/chat.json b/webview-ui/src/i18n/locales/hi/chat.json index 55a927a3b5..971af2023f 100644 --- a/webview-ui/src/i18n/locales/hi/chat.json +++ b/webview-ui/src/i18n/locales/hi/chat.json @@ -62,5 +62,52 @@ "noValidImages": "कोई वैध छवियां संसाधित नहीं की गईं", "separator": "विभाजक", "edit": "संपादित करें...", - "forNextMode": "अगले मोड के लिए" + "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 अनुरोधों को स्वचालित रूप से पुनः प्रयास करता है।" + } + } + } } diff --git a/webview-ui/src/i18n/locales/hu/chat.json b/webview-ui/src/i18n/locales/hu/chat.json index 97b7daa359..f3c6d922a4 100644 --- a/webview-ui/src/i18n/locales/hu/chat.json +++ b/webview-ui/src/i18n/locales/hu/chat.json @@ -62,5 +62,52 @@ "noValidImages": "Nem történt érvényes kép feldolgozása", "separator": "Elválasztó", "edit": "Szerkesztés...", - "forNextMode": "a következő módhoz" + "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." + } + } + } } diff --git a/webview-ui/src/i18n/locales/it/chat.json b/webview-ui/src/i18n/locales/it/chat.json index 009bcf5041..9a08a84252 100644 --- a/webview-ui/src/i18n/locales/it/chat.json +++ b/webview-ui/src/i18n/locales/it/chat.json @@ -62,5 +62,52 @@ "noValidImages": "Nessuna immagine valida è stata elaborata", "separator": "Separatore", "edit": "Modifica...", - "forNextMode": "per la modalità successiva" + "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." + } + } + } } diff --git a/webview-ui/src/i18n/locales/ja/chat.json b/webview-ui/src/i18n/locales/ja/chat.json index 6d3b21e1b7..c820d9748b 100644 --- a/webview-ui/src/i18n/locales/ja/chat.json +++ b/webview-ui/src/i18n/locales/ja/chat.json @@ -62,5 +62,52 @@ "noValidImages": "有効な画像が処理されませんでした", "separator": "区切り線", "edit": "編集...", - "forNextMode": "次のモードへ" + "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リクエストを自動的に再試行します。" + } + } + } } diff --git a/webview-ui/src/i18n/locales/ko/chat.json b/webview-ui/src/i18n/locales/ko/chat.json index 316ff47613..fc6683e4bb 100644 --- a/webview-ui/src/i18n/locales/ko/chat.json +++ b/webview-ui/src/i18n/locales/ko/chat.json @@ -62,5 +62,52 @@ "noValidImages": "유효한 이미지가 처리되지 않았습니다", "separator": "구분선", "edit": "편집...", - "forNextMode": "다음 모드로" + "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 요청을 자동으로 재시도합니다." + } + } + } } diff --git a/webview-ui/src/i18n/locales/pl/chat.json b/webview-ui/src/i18n/locales/pl/chat.json index 9fdbd012da..676529f1e6 100644 --- a/webview-ui/src/i18n/locales/pl/chat.json +++ b/webview-ui/src/i18n/locales/pl/chat.json @@ -62,5 +62,52 @@ "noValidImages": "Nie przetworzono żadnych prawidłowych obrazów", "separator": "Separator", "edit": "Edytuj...", - "forNextMode": "dla następnego trybu" + "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." + } + } + } } diff --git a/webview-ui/src/i18n/locales/pt-BR/chat.json b/webview-ui/src/i18n/locales/pt-BR/chat.json index 787b037551..9d9ffba47c 100644 --- a/webview-ui/src/i18n/locales/pt-BR/chat.json +++ b/webview-ui/src/i18n/locales/pt-BR/chat.json @@ -62,5 +62,52 @@ "noValidImages": "Nenhuma imagem válida foi processada", "separator": "Separador", "edit": "Editar...", - "forNextMode": "para o próximo modo" + "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." + } + } + } } diff --git a/webview-ui/src/i18n/locales/pt/chat.json b/webview-ui/src/i18n/locales/pt/chat.json index 787b037551..9d9ffba47c 100644 --- a/webview-ui/src/i18n/locales/pt/chat.json +++ b/webview-ui/src/i18n/locales/pt/chat.json @@ -62,5 +62,52 @@ "noValidImages": "Nenhuma imagem válida foi processada", "separator": "Separador", "edit": "Editar...", - "forNextMode": "para o próximo modo" + "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." + } + } + } } diff --git a/webview-ui/src/i18n/locales/ru/chat.json b/webview-ui/src/i18n/locales/ru/chat.json index a69a769ead..9cd4545259 100644 --- a/webview-ui/src/i18n/locales/ru/chat.json +++ b/webview-ui/src/i18n/locales/ru/chat.json @@ -62,5 +62,52 @@ "noValidImages": "Не обработано ни одного действительного изображения", "separator": "Разделитель", "edit": "Редактировать...", - "forNextMode": "для следующего режима" + "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-запросы, когда провайдер возвращает ответ с ошибкой." + } + } + } } diff --git a/webview-ui/src/i18n/locales/tr/chat.json b/webview-ui/src/i18n/locales/tr/chat.json index 03e653a99f..c8fb7011a8 100644 --- a/webview-ui/src/i18n/locales/tr/chat.json +++ b/webview-ui/src/i18n/locales/tr/chat.json @@ -62,5 +62,52 @@ "noValidImages": "Hiçbir geçerli resim işlenmedi", "separator": "Ayırıcı", "edit": "Düzenle...", - "forNextMode": "sonraki mod için" + "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." + } + } + } } diff --git a/webview-ui/src/i18n/locales/zh-CN/chat.json b/webview-ui/src/i18n/locales/zh-CN/chat.json index d3947ff21f..8c422c1c96 100644 --- a/webview-ui/src/i18n/locales/zh-CN/chat.json +++ b/webview-ui/src/i18n/locales/zh-CN/chat.json @@ -62,5 +62,52 @@ "noValidImages": "没有处理有效图片", "separator": "分隔线", "edit": "编辑...", - "forNextMode": "切换至下一模式" + "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 请求。" + } + } + } } diff --git a/webview-ui/src/i18n/locales/zh-TW/chat.json b/webview-ui/src/i18n/locales/zh-TW/chat.json index 2774b41967..71756db404 100644 --- a/webview-ui/src/i18n/locales/zh-TW/chat.json +++ b/webview-ui/src/i18n/locales/zh-TW/chat.json @@ -62,5 +62,52 @@ "noValidImages": "沒有處理有效圖片", "separator": "分隔線", "edit": "編輯...", - "forNextMode": "切換至下一模式" + "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 請求。" + } + } + } } From 06341fd7b4cd8f4c0d0c5e8889c6bcbc4d0732c7 Mon Sep 17 00:00:00 2001 From: Matt Rubens Date: Sun, 16 Mar 2025 02:25:38 -0400 Subject: [PATCH 17/58] Localize the prompts tab --- .../src/components/prompts/PromptsView.tsx | 241 ++++++++---------- webview-ui/src/i18n/locales/ar/prompts.json | 140 ++++++++++ webview-ui/src/i18n/locales/ca/prompts.json | 140 ++++++++++ webview-ui/src/i18n/locales/cs/prompts.json | 140 ++++++++++ webview-ui/src/i18n/locales/de/prompts.json | 140 ++++++++++ webview-ui/src/i18n/locales/en/prompts.json | 140 ++++++++++ webview-ui/src/i18n/locales/es/prompts.json | 140 ++++++++++ webview-ui/src/i18n/locales/fr/prompts.json | 140 ++++++++++ webview-ui/src/i18n/locales/hi/prompts.json | 140 ++++++++++ webview-ui/src/i18n/locales/hu/prompts.json | 140 ++++++++++ webview-ui/src/i18n/locales/it/prompts.json | 140 ++++++++++ webview-ui/src/i18n/locales/ja/prompts.json | 140 ++++++++++ webview-ui/src/i18n/locales/ko/prompts.json | 140 ++++++++++ webview-ui/src/i18n/locales/pl/prompts.json | 140 ++++++++++ .../src/i18n/locales/pt-BR/prompts.json | 106 ++++++++ webview-ui/src/i18n/locales/pt/prompts.json | 140 ++++++++++ webview-ui/src/i18n/locales/ru/prompts.json | 106 ++++++++ webview-ui/src/i18n/locales/tr/prompts.json | 106 ++++++++ .../src/i18n/locales/zh-CN/prompts.json | 140 ++++++++++ .../src/i18n/locales/zh-TW/prompts.json | 140 ++++++++++ 20 files changed, 2659 insertions(+), 140 deletions(-) create mode 100644 webview-ui/src/i18n/locales/ar/prompts.json create mode 100644 webview-ui/src/i18n/locales/ca/prompts.json create mode 100644 webview-ui/src/i18n/locales/cs/prompts.json create mode 100644 webview-ui/src/i18n/locales/de/prompts.json create mode 100644 webview-ui/src/i18n/locales/en/prompts.json create mode 100644 webview-ui/src/i18n/locales/es/prompts.json create mode 100644 webview-ui/src/i18n/locales/fr/prompts.json create mode 100644 webview-ui/src/i18n/locales/hi/prompts.json create mode 100644 webview-ui/src/i18n/locales/hu/prompts.json create mode 100644 webview-ui/src/i18n/locales/it/prompts.json create mode 100644 webview-ui/src/i18n/locales/ja/prompts.json create mode 100644 webview-ui/src/i18n/locales/ko/prompts.json create mode 100644 webview-ui/src/i18n/locales/pl/prompts.json create mode 100644 webview-ui/src/i18n/locales/pt-BR/prompts.json create mode 100644 webview-ui/src/i18n/locales/pt/prompts.json create mode 100644 webview-ui/src/i18n/locales/ru/prompts.json create mode 100644 webview-ui/src/i18n/locales/tr/prompts.json create mode 100644 webview-ui/src/i18n/locales/zh-CN/prompts.json create mode 100644 webview-ui/src/i18n/locales/zh-TW/prompts.json diff --git a/webview-ui/src/components/prompts/PromptsView.tsx b/webview-ui/src/components/prompts/PromptsView.tsx index ef1282b4c2..391a6c9dca 100644 --- a/webview-ui/src/components/prompts/PromptsView.tsx +++ b/webview-ui/src/components/prompts/PromptsView.tsx @@ -20,17 +20,13 @@ import { GroupEntry, } from "../../../../src/shared/modes" import { CustomModeSchema } from "../../../../src/core/config/CustomModesSchema" -import { - supportPrompt, - SupportPromptType, - supportPromptLabels, - supportPromptDescriptions, -} from "../../../../src/shared/support-prompt" +import { supportPrompt, SupportPromptType } from "../../../../src/shared/support-prompt" import { TOOL_GROUPS, GROUP_DISPLAY_NAMES, ToolGroup } from "../../../../src/shared/tool-groups" import { vscode } from "../../utils/vscode" import { Tab, TabContent, TabHeader } from "../common/Tab" import i18next from "i18next" +import { useAppTranslation } from "../../i18n/TranslationContext" // Get all available groups that should show in prompts view const availableGroups = (Object.keys(TOOL_GROUPS) as ToolGroup[]).filter((group) => !TOOL_GROUPS[group].alwaysAvailable) @@ -47,6 +43,7 @@ function getGroupName(group: GroupEntry): ToolGroup { } const PromptsView = ({ onDone }: PromptsViewProps) => { + const { t } = useAppTranslation() const { customModePrompts, customSupportPrompts, @@ -405,22 +402,25 @@ const PromptsView = ({ onDone }: PromptsViewProps) => { return ( -

Prompts

- Done +

{t("prompts:title")}

+ {t("prompts:done")}
e.stopPropagation()} className="flex justify-between items-center mb-3"> -

Modes

+

{t("prompts:modes.title")}

- +
{ e.preventDefault() @@ -448,7 +448,7 @@ const PromptsView = ({ onDone }: PromptsViewProps) => { setShowConfigMenu(false) }} onClick={(e) => e.preventDefault()}> - Edit Global Modes + {t("prompts:modes.editGlobalModes")}
{ setShowConfigMenu(false) }} onClick={(e) => e.preventDefault()}> - Edit Project Modes (.roomodes) + {t("prompts:modes.editProjectModes")}
)} @@ -474,7 +474,7 @@ const PromptsView = ({ onDone }: PromptsViewProps) => {
- Hit the + to create a new custom mode, or just ask Roo in chat to create one for you! + {t("prompts:modes.createModeHelpText")}
@@ -503,7 +503,7 @@ const PromptsView = ({ onDone }: PromptsViewProps) => { {mode && findModeBySlug(mode, customModes) && (
-
Name
+
{t("prompts:createModeDialog.name.label")}
{ /> { vscode.postMessage({ type: "deleteCustomMode", @@ -539,7 +539,7 @@ const PromptsView = ({ onDone }: PromptsViewProps) => { )}
-
Role Definition
+
{t("prompts:roleDefinition.title")}
{!findModeBySlug(mode, customModes) && ( { handleAgentReset(currentMode.slug, "roleDefinition") } }} - title="Reset to default" + title={t("prompts:roleDefinition.resetToDefault")} data-testid="role-definition-reset"> )}
- Define Roo's expertise and personality for this mode. This description shapes how Roo - presents itself and approaches tasks. + {t("prompts:roleDefinition.description")}
{ @@ -593,7 +592,9 @@ const PromptsView = ({ onDone }: PromptsViewProps) => { {/* Mode settings */} <>
-
API Configuration
+
+ {t("prompts:apiConfiguration.title")} +
{ ))}
- Select which API configuration to use for this mode + {t("prompts:apiConfiguration.select")}
@@ -620,12 +621,16 @@ const PromptsView = ({ onDone }: PromptsViewProps) => { {/* Show tools for all modes */}
-
Available Tools
+
{t("prompts:tools.title")}
{findModeBySlug(mode, customModes) && ( setIsToolsEditMode(!isToolsEditMode)} - title={isToolsEditMode ? "Done editing" : "Edit tools"}> + title={ + isToolsEditMode + ? t("prompts:tools.doneEditing") + : t("prompts:tools.editTools") + }> @@ -633,7 +638,7 @@ const PromptsView = ({ onDone }: PromptsViewProps) => {
{!findModeBySlug(mode, customModes) && (
- Tools for built-in modes cannot be modified + {t("prompts:tools.builtInModesText")}
)} {isToolsEditMode && findModeBySlug(mode, customModes) ? ( @@ -655,7 +660,7 @@ const PromptsView = ({ onDone }: PromptsViewProps) => { {GROUP_DISPLAY_NAMES[group]} {group === "edit" && (
- Allowed files:{" "} + {t("prompts:tools.allowedFiles")}{" "} {(() => { const currentMode = getCurrentMode() const editGroup = currentMode?.groups?.find( @@ -664,7 +669,7 @@ const PromptsView = ({ onDone }: PromptsViewProps) => { g[0] === "edit" && g[1]?.fileRegex, ) - if (!Array.isArray(editGroup)) return "all files" + if (!Array.isArray(editGroup)) return t("prompts:allFiles") return ( editGroup[1].description || `/${editGroup[1].fileRegex}/` @@ -708,7 +713,7 @@ const PromptsView = ({ onDone }: PromptsViewProps) => { alignItems: "center", marginBottom: "4px", }}> -
Mode-specific Custom Instructions (optional)
+
{t("prompts:customInstructions.title")}
{!findModeBySlug(mode, customModes) && ( { handleAgentReset(currentMode.slug, "customInstructions") } }} - title="Reset to default" + title={t("prompts:customInstructions.resetToDefault")} data-testid="custom-instructions-reset"> @@ -730,7 +735,9 @@ const PromptsView = ({ onDone }: PromptsViewProps) => { color: "var(--vscode-descriptionForeground)", marginBottom: "8px", }}> - Add behavioral guidelines specific to {getCurrentMode()?.name || "Code"} mode. + {t("prompts:customInstructions.description", { + modeName: getCurrentMode()?.name || "Code", + })}
{ @@ -774,31 +781,10 @@ const PromptsView = ({ onDone }: PromptsViewProps) => { color: "var(--vscode-descriptionForeground)", marginTop: "5px", }}> - Custom instructions specific to {getCurrentMode()?.name || "Code"} mode can also be loaded - from{" "} - { - const currentMode = getCurrentMode() - if (!currentMode) return - - // Open or create an empty file - vscode.postMessage({ - type: "openFile", - text: `./.clinerules-${currentMode.slug}`, - values: { - create: true, - content: "", - }, - }) - }}> - .clinerules-{getCurrentMode()?.slug || "code"} - {" "} - in your workspace. + {t("prompts:customInstructions.loadFromFile", { + modeName: getCurrentMode()?.name || "Code", + modeSlug: getCurrentMode()?.slug || "code", + })}
@@ -822,11 +808,11 @@ const PromptsView = ({ onDone }: PromptsViewProps) => { } }} data-testid="preview-prompt-button"> - Preview System Prompt + {t("prompts:systemPrompt.preview")} { const currentMode = getCurrentMode() if (currentMode) { @@ -855,7 +841,7 @@ const PromptsView = ({ onDone }: PromptsViewProps) => { // The React context will update the global state setEnableCustomModeCreation(e.target.checked) }}> - Enable Custom Mode Creation Through Prompts + {t("prompts:customModeCreation.enableTitle")}

{ marginTop: "5px", color: "var(--vscode-descriptionForeground)", }}> - When enabled, Roo allows you to create custom modes using prompts like ‘Make me a custom - mode that…’. Disabling this reduces your system prompt by about 700 tokens when this feature - isn’t needed. When disabled you can still manually create custom modes using the + button - above or by editing the related config JSON. + {t("prompts:customModeCreation.description")}

@@ -878,33 +861,14 @@ const PromptsView = ({ onDone }: PromptsViewProps) => { aria-expanded={isSystemPromptDisclosureOpen}> - Advanced: Override System Prompt + {t("prompts:advancedSystemPrompt.title")} {isSystemPromptDisclosureOpen && (
- You can completely replace the system prompt for this mode (aside from the role - definition and custom instructions) by creating a file at{" "} - { - const currentMode = getCurrentMode() - if (!currentMode) return - - // Open or create an empty file - vscode.postMessage({ - type: "openFile", - text: `./.roo/system-prompt-${currentMode.slug}`, - values: { - create: true, - content: "", - }, - }) - }}> - .roo/system-prompt-{getCurrentMode()?.slug || "code"} - {" "} - in your workspace. This is a very advanced feature that bypasses built-in safeguards and - consistency checks (especially around tool usage), so be careful! + {t("prompts:advancedSystemPrompt.description", { + modeSlug: getCurrentMode()?.slug || "code", + })}
)}
@@ -912,15 +876,11 @@ const PromptsView = ({ onDone }: PromptsViewProps) => {

- Custom Instructions for All Modes + {t("prompts:globalCustomInstructions.title")}

- These instructions apply to all modes. They provide a base set of behaviors that can be enhanced - by mode-specific instructions below. -
- If you would like Roo to think and speak in a different language than your editor display - language ({i18next.language}), you can specify it here. + {t("prompts:globalCustomInstructions.description", { language: i18next.language })}
{ data-testid="global-custom-instructions-textarea" />
- Instructions can also be loaded from{" "} - - vscode.postMessage({ - type: "openFile", - text: "./.clinerules", - values: { - create: true, - content: "", - }, - }) - }> - .clinerules - {" "} - in your workspace. + {t("prompts:globalCustomInstructions.loadFromFile")}
@@ -965,7 +910,9 @@ const PromptsView = ({ onDone }: PromptsViewProps) => { paddingBottom: "60px", borderBottom: "1px solid var(--vscode-input-border)", }}> -

Support Prompts

+

+ {t("prompts:supportPrompts.title")} +

{ borderRadius: "3px", fontWeight: "bold", }}> - {supportPromptLabels[type as SupportPromptType]} + {t(`prompts:supportPrompts.types.${type}.label`)} ))}
@@ -1006,7 +953,7 @@ const PromptsView = ({ onDone }: PromptsViewProps) => { color: "var(--vscode-descriptionForeground)", margin: "8px 0 16px", }}> - {supportPromptDescriptions[activeSupportTab]} + {t(`prompts:supportPrompts.types.${activeSupportTab}.description`)}
{/* Show active tab content */} @@ -1018,11 +965,11 @@ const PromptsView = ({ onDone }: PromptsViewProps) => { alignItems: "center", marginBottom: "4px", }}> -
Prompt
+
{t("prompts:supportPrompts.prompt")}
handleSupportReset(activeSupportTab)} - title={`Reset ${activeSupportTab} prompt to default`}> + title={t("prompts:supportPrompts.resetPrompt", { promptType: activeSupportTab })}>
@@ -1054,15 +1001,14 @@ const PromptsView = ({ onDone }: PromptsViewProps) => {
- API Configuration + {t("prompts:supportPrompts.enhance.apiConfiguration")}
- You can select an API configuration to always use for enhancing prompts, - or just use whatever is currently selected + {t("prompts:supportPrompts.enhance.apiConfigDescription")}
{ }} style={{ width: "300px" }}> - Use currently selected API configuration + {t("prompts:supportPrompts.enhance.useCurrentConfig")} {(listApiConfigMeta || []).map((config) => ( @@ -1093,7 +1039,7 @@ const PromptsView = ({ onDone }: PromptsViewProps) => { setTestPrompt((e.target as HTMLTextAreaElement).value)} - placeholder="Enter a prompt to test the enhancement" + placeholder={t("prompts:supportPrompts.enhance.testPromptPlaceholder")} rows={3} resize="vertical" style={{ width: "100%" }} @@ -1111,7 +1057,7 @@ const PromptsView = ({ onDone }: PromptsViewProps) => { onClick={handleTestEnhancement} disabled={isEnhancing} appearance="primary"> - Preview Prompt Enhancement + {t("prompts:supportPrompts.enhance.previewButton")}
@@ -1158,9 +1104,11 @@ const PromptsView = ({ onDone }: PromptsViewProps) => { }}> -

Create New Mode

+

{t("prompts:createModeDialog.title")}

-
Name
+
+ {t("prompts:createModeDialog.name.label")} +
) => { @@ -1176,7 +1124,9 @@ const PromptsView = ({ onDone }: PromptsViewProps) => { )}
-
Slug
+
+ {t("prompts:createModeDialog.slug.label")} +
) => { @@ -1193,18 +1143,18 @@ const PromptsView = ({ onDone }: PromptsViewProps) => { color: "var(--vscode-descriptionForeground)", marginTop: "4px", }}> - The slug is used in URLs and file names. It should be lowercase and contain only - letters, numbers, and hyphens. + {t("prompts:createModeDialog.slug.description")}
{slugError && (
{slugError}
)}
-
Save Location
+
+ {t("prompts:createModeDialog.saveLocation.label")} +
- Choose where to save this mode. Project-specific modes take precedence over global - modes. + {t("prompts:createModeDialog.saveLocation.description")}
{ setNewModeSource(target.value as ModeSource) }}> - Global + {t("prompts:createModeDialog.saveLocation.global.label")}
- Available in all workspaces + {t("prompts:createModeDialog.saveLocation.global.description")}
- Project-specific (.roomodes) + {t("prompts:createModeDialog.saveLocation.project.label")}
- Only available in this workspace, takes precedence over global + {t("prompts:createModeDialog.saveLocation.project.description")}
-
Role Definition
+
+ {t("prompts:createModeDialog.roleDefinition.label")} +
- Define Roo's expertise and personality for this mode. + {t("prompts:createModeDialog.roleDefinition.description")}
{ )}
-
Available Tools
+
+ {t("prompts:createModeDialog.tools.label")} +
- Select which tools this mode can use. + {t("prompts:createModeDialog.tools.description")}
{
- Custom Instructions (optional) + {t("prompts:createModeDialog.customInstructions.label")}
{ color: "var(--vscode-descriptionForeground)", marginBottom: "8px", }}> - Add behavioral guidelines specific to this mode. + {t("prompts:createModeDialog.customInstructions.description")}
{ borderTop: "1px solid var(--vscode-editor-lineHighlightBorder)", backgroundColor: "var(--vscode-editor-background)", }}> - setIsCreateModeDialogOpen(false)}>Cancel + setIsCreateModeDialogOpen(false)}> + {t("prompts:createModeDialog.buttons.cancel")} + - Create Mode + {t("prompts:createModeDialog.buttons.create")}
@@ -1382,7 +1338,10 @@ const PromptsView = ({ onDone }: PromptsViewProps) => { }}> -

{selectedPromptTitle}

+

+ {selectedPromptTitle || + t("prompts:systemPrompt.title", { modeName: getCurrentMode()?.name || "Code" })} +

 {
 								borderTop: "1px solid var(--vscode-editor-lineHighlightBorder)",
 								backgroundColor: "var(--vscode-editor-background)",
 							}}>
-							 setIsDialogOpen(false)}>Close
+							 setIsDialogOpen(false)}>
+								{t("prompts:createModeDialog.close")}
+							
 						
 					
 				
diff --git a/webview-ui/src/i18n/locales/ar/prompts.json b/webview-ui/src/i18n/locales/ar/prompts.json
new file mode 100644
index 0000000000..10bcbfbe36
--- /dev/null
+++ b/webview-ui/src/i18n/locales/ar/prompts.json
@@ -0,0 +1,140 @@
+{
+	"title": "الإيحاءات",
+	"done": "تم",
+	"modes": {
+		"title": "الأوضاع",
+		"createNewMode": "إنشاء وضع جديد",
+		"editModesConfig": "تعديل إعدادات الأوضاع",
+		"editGlobalModes": "تعديل الأوضاع العامة",
+		"editProjectModes": "تعديل أوضاع المشروع (.roomodes)",
+		"createModeHelpText": "انقر على + لإنشاء وضع مخصص جديد، أو اطلب من Roo في المحادثة أن ينشئ واحدًا لك!"
+	},
+	"apiConfiguration": {
+		"title": "إعدادات API",
+		"select": "اختر إعدادات API التي ستستخدم لهذا الوضع"
+	},
+	"tools": {
+		"title": "الأدوات المتاحة",
+		"builtInModesText": "لا يمكن تعديل أدوات الأوضاع المدمجة",
+		"editTools": "تعديل الأدوات",
+		"doneEditing": "انتهاء التعديل",
+		"allowedFiles": "الملفات المسموحة:"
+	},
+	"roleDefinition": {
+		"title": "تعريف الدور",
+		"resetToDefault": "إعادة تعيين إلى الإعدادات الافتراضية",
+		"description": "حدد خبرة وشخصية Roo لهذا الوضع. هذا الوصف يحدد كيف يقدم Roo نفسه ويتعامل مع المهام."
+	},
+	"customInstructions": {
+		"title": "تعليمات مخصصة خاصة بالوضع (اختياري)",
+		"resetToDefault": "إعادة تعيين إلى الإعدادات الافتراضية",
+		"description": "أضف إرشادات سلوكية محددة لوضع {{modeName}}.",
+		"loadFromFile": "يمكن أيضًا تحميل التعليمات المخصصة الخاصة بوضع {{modeName}} من .clinerules-{{modeSlug}} في مساحة العمل الخاصة بك."
+	},
+	"globalCustomInstructions": {
+		"title": "تعليمات مخصصة لجميع الأوضاع",
+		"description": "تنطبق هذه التعليمات على جميع الأوضاع. توفر مجموعة أساسية من السلوكيات التي يمكن تعزيزها بتعليمات خاصة بكل وضع أدناه.\nإذا كنت ترغب في أن يفكر Roo ويتحدث بلغة مختلفة عن لغة العرض في المحرر الخاص بك ({{language}})، يمكنك تحديد ذلك هنا.",
+		"loadFromFile": "يمكن أيضًا تحميل التعليمات من .clinerules في مساحة العمل الخاصة بك."
+	},
+	"systemPrompt": {
+		"preview": "معاينة إيحاء النظام",
+		"copy": "نسخ إيحاء النظام إلى الحافظة",
+		"title": "إيحاء النظام (وضع {{modeName}})"
+	},
+	"supportPrompts": {
+		"title": "إيحاءات الدعم",
+		"resetPrompt": "إعادة تعيين إيحاء {{promptType}} إلى الوضع الافتراضي",
+		"prompt": "إيحاء",
+		"enhance": {
+			"apiConfiguration": "إعدادات API",
+			"apiConfigDescription": "يمكنك تحديد إعدادات API لاستخدامها دائمًا لتحسين الإيحاءات، أو استخدام الإعدادات المحددة حاليًا",
+			"useCurrentConfig": "استخدام إعدادات API المحددة حاليًا",
+			"testPromptPlaceholder": "أدخل إيحاءًا لاختبار التحسين",
+			"previewButton": "معاينة تحسين الإيحاء"
+		},
+		"types": {
+			"ENHANCE": {
+				"label": "تحسين الإيحاء",
+				"description": "استخدم تحسين الإيحاءات للحصول على اقتراحات أو تحسينات مخصصة لمدخلاتك. هذا يضمن أن Roo يفهم قصدك ويقدم أفضل الردود الممكنة. متاح عبر أيقونة ✨ في الدردشة."
+			},
+			"EXPLAIN": {
+				"label": "شرح الكود",
+				"description": "احصل على شروحات مفصلة لمقتطفات الكود أو الوظائف أو الملفات الكاملة. مفيد لفهم الكود المعقد أو تعلم أنماط جديدة. متاح في إجراءات الكود (أيقونة المصباح في المحرر) وفي قائمة سياق المحرر (النقر بزر الماوس الأيمن على الكود المحدد)."
+			},
+			"FIX": {
+				"label": "إصلاح المشكلات",
+				"description": "احصل على مساعدة في تحديد وحل الأخطاء أو المشكلات أو قضايا جودة الكود. يوفر إرشادات خطوة بخطوة لإصلاح المشكلات. متاح في إجراءات الكود (أيقونة المصباح في المحرر) وفي قائمة سياق المحرر (النقر بزر الماوس الأيمن على الكود المحدد)."
+			},
+			"IMPROVE": {
+				"label": "تحسين الكود",
+				"description": "تلقي اقتراحات لتحسين الكود وأفضل الممارسات والتحسينات المعمارية مع الحفاظ على الوظائف. متاح في إجراءات الكود (أيقونة المصباح في المحرر) وفي قائمة سياق المحرر (النقر بزر الماوس الأيمن على الكود المحدد)."
+			},
+			"ADD_TO_CONTEXT": {
+				"label": "إضافة إلى السياق",
+				"description": "أضف سياقًا إلى مهمتك أو محادثتك الحالية. مفيد لتوفير معلومات إضافية أو توضيحات. متاح في إجراءات الكود (أيقونة المصباح في المحرر) وفي قائمة سياق المحرر (النقر بزر الماوس الأيمن على الكود المحدد)."
+			},
+			"TERMINAL_ADD_TO_CONTEXT": {
+				"label": "إضافة محتوى الطرفية إلى السياق",
+				"description": "أضف مخرجات الطرفية إلى مهمتك أو محادثتك الحالية. مفيد لتوفير مخرجات الأوامر أو السجلات. متاح في قائمة سياق الطرفية (النقر بزر الماوس الأيمن على المحتوى المحدد في الطرفية)."
+			},
+			"TERMINAL_FIX": {
+				"label": "إصلاح أمر الطرفية",
+				"description": "احصل على مساعدة في إصلاح أوامر الطرفية التي فشلت أو تحتاج إلى تحسين. متاح في قائمة سياق الطرفية (النقر بزر الماوس الأيمن على المحتوى المحدد في الطرفية)."
+			},
+			"TERMINAL_EXPLAIN": {
+				"label": "شرح أمر الطرفية",
+				"description": "احصل على شروحات مفصلة لأوامر الطرفية ومخرجاتها. متاح في قائمة سياق الطرفية (النقر بزر الماوس الأيمن على المحتوى المحدد في الطرفية)."
+			}
+		}
+	},
+	"customModeCreation": {
+		"enableTitle": "تمكين إنشاء الوضع المخصص من خلال الإيحاءات",
+		"description": "عند التمكين، يسمح لك Roo بإنشاء أوضاع مخصصة باستخدام إيحاءات مثل 'اصنع لي وضعًا مخصصًا يقوم بـ...'. يؤدي تعطيل هذه الميزة إلى تقليل إيحاء النظام بحوالي 700 token عندما لا تكون هذه الميزة ضرورية. عند التعطيل، لا يزال بإمكانك إنشاء أوضاع مخصصة يدويًا باستخدام زر + أعلاه أو عن طريق تعديل ملف JSON المرتبط."
+	},
+	"advancedSystemPrompt": {
+		"title": "متقدم: تجاوز إيحاء النظام",
+		"description": "يمكنك استبدال إيحاء النظام لهذا الوضع بالكامل (باستثناء تعريف الدور والتعليمات المخصصة) عن طريق إنشاء ملف في .roo/system-prompt-{{modeSlug}} في مساحة العمل الخاصة بك. هذه ميزة متقدمة جدًا تتجاوز الضمانات المدمجة وفحوصات الاتساق (خاصة حول استخدام الأدوات)، لذا كن حذرًا!"
+	},
+	"createModeDialog": {
+		"title": "إنشاء وضع جديد",
+		"close": "إغلاق",
+		"name": {
+			"label": "الاسم",
+			"placeholder": "أدخل اسم الوضع"
+		},
+		"slug": {
+			"label": "المعرّف",
+			"description": "يُستخدم المعرّف في عناوين URL وأسماء الملفات. يجب أن يكون بأحرف صغيرة ويحتوي فقط على أحرف وأرقام وشرطات."
+		},
+		"saveLocation": {
+			"label": "موقع الحفظ",
+			"description": "اختر مكان حفظ هذا الوضع. تأخذ الأوضاع الخاصة بالمشروع الأولوية على الأوضاع العامة.",
+			"global": {
+				"label": "عام",
+				"description": "متاح في جميع مساحات العمل"
+			},
+			"project": {
+				"label": "خاص بالمشروع (.roomodes)",
+				"description": "متاح فقط في مساحة العمل هذه، يأخذ الأولوية على الوضع العام"
+			}
+		},
+		"roleDefinition": {
+			"label": "تعريف الدور",
+			"description": "حدد خبرة وشخصية Roo لهذا الوضع."
+		},
+		"tools": {
+			"label": "الأدوات المتاحة",
+			"description": "حدد الأدوات التي يمكن لهذا الوضع استخدامها."
+		},
+		"customInstructions": {
+			"label": "تعليمات مخصصة (اختياري)",
+			"description": "أضف إرشادات سلوكية محددة لهذا الوضع."
+		},
+		"buttons": {
+			"cancel": "إلغاء",
+			"create": "إنشاء الوضع"
+		},
+		"deleteMode": "حذف الوضع"
+	},
+	"allFiles": "جميع الملفات"
+}
diff --git a/webview-ui/src/i18n/locales/ca/prompts.json b/webview-ui/src/i18n/locales/ca/prompts.json
new file mode 100644
index 0000000000..925ab5a390
--- /dev/null
+++ b/webview-ui/src/i18n/locales/ca/prompts.json
@@ -0,0 +1,140 @@
+{
+	"title": "Prompts",
+	"done": "Fet",
+	"modes": {
+		"title": "Modes",
+		"createNewMode": "Crear nou mode",
+		"editModesConfig": "Editar configuració de modes",
+		"editGlobalModes": "Editar modes globals",
+		"editProjectModes": "Editar modes de projecte (.roomodes)",
+		"createModeHelpText": "Feu clic a + per crear un nou mode personalitzat, o simplement demaneu a Roo al xat que en creï un per a vostè!"
+	},
+	"apiConfiguration": {
+		"title": "Configuració d'API",
+		"select": "Seleccioneu quina configuració d'API utilitzar per a aquest mode"
+	},
+	"tools": {
+		"title": "Eines disponibles",
+		"builtInModesText": "Les eines per a modes integrats no es poden modificar",
+		"editTools": "Editar eines",
+		"doneEditing": "Finalitzar edició",
+		"allowedFiles": "Fitxers permesos:"
+	},
+	"roleDefinition": {
+		"title": "Definició de rol",
+		"resetToDefault": "Restablir a valors predeterminats",
+		"description": "Definiu l'experiència i personalitat de Roo per a aquest mode. Aquesta descripció determina com Roo es presenta i aborda les tasques."
+	},
+	"customInstructions": {
+		"title": "Instruccions personalitzades específiques del mode (opcional)",
+		"resetToDefault": "Restablir a valors predeterminats",
+		"description": "Afegiu directrius de comportament específiques per al mode {{modeName}}.",
+		"loadFromFile": "Les instruccions personalitzades específiques per al mode {{modeName}} també es poden carregar des de .clinerules-{{modeSlug}} al vostre espai de treball."
+	},
+	"globalCustomInstructions": {
+		"title": "Instruccions personalitzades per a tots els modes",
+		"description": "Aquestes instruccions s'apliquen a tots els modes. Proporcionen un conjunt bàsic de comportaments que es poden millorar amb instruccions específiques de cada mode a continuació.\nSi voleu que Roo pensi i parli en un idioma diferent al de la visualització del vostre editor ({{language}}), podeu especificar-ho aquí.",
+		"loadFromFile": "Les instruccions també es poden carregar des de .clinerules al vostre espai de treball."
+	},
+	"systemPrompt": {
+		"preview": "Previsualització del prompt del sistema",
+		"copy": "Copiar prompt del sistema al portapapers",
+		"title": "Prompt del sistema (mode {{modeName}})"
+	},
+	"supportPrompts": {
+		"title": "Prompts de suport",
+		"resetPrompt": "Restablir el prompt {{promptType}} a valors predeterminats",
+		"prompt": "Prompt",
+		"enhance": {
+			"apiConfiguration": "Configuració d'API",
+			"apiConfigDescription": "Podeu seleccionar una configuració d'API per utilitzar sempre per millorar els prompts, o simplement utilitzar la que està seleccionada actualment",
+			"useCurrentConfig": "Utilitzar la configuració d'API seleccionada actualment",
+			"testPromptPlaceholder": "Introduïu un prompt per provar la millora",
+			"previewButton": "Previsualització de la millora del prompt"
+		},
+		"types": {
+			"ENHANCE": {
+				"label": "Millorar prompt",
+				"description": "Utilitzeu la millora de prompts per obtenir suggeriments o millores personalitzades per a les vostres entrades. Això assegura que Roo entengui la vostra intenció i proporcioni les millors respostes possibles. Disponible a través de la icona ✨ al xat."
+			},
+			"EXPLAIN": {
+				"label": "Explicar codi",
+				"description": "Obtingueu explicacions detallades de fragments de codi, funcions o fitxers sencers. Útil per entendre codi complex o aprendre nous patrons. Disponible a les accions de codi (icona de bombeta a l'editor) i al menú contextual de l'editor (clic dret al codi seleccionat)."
+			},
+			"FIX": {
+				"label": "Corregir problemes",
+				"description": "Obtingueu ajuda per identificar i resoldre errors, fallades o problemes de qualitat del codi. Proporciona una guia pas a pas per solucionar problemes. Disponible a les accions de codi (icona de bombeta a l'editor) i al menú contextual de l'editor (clic dret al codi seleccionat)."
+			},
+			"IMPROVE": {
+				"label": "Millorar codi",
+				"description": "Rebeu suggeriments per optimitzar el codi, millors pràctiques i millores arquitectòniques mentre es manté la funcionalitat. Disponible a les accions de codi (icona de bombeta a l'editor) i al menú contextual de l'editor (clic dret al codi seleccionat)."
+			},
+			"ADD_TO_CONTEXT": {
+				"label": "Afegir al context",
+				"description": "Afegiu context a la vostra tasca o conversa actual. Útil per proporcionar informació addicional o aclariments. Disponible a les accions de codi (icona de bombeta a l'editor) i al menú contextual de l'editor (clic dret al codi seleccionat)."
+			},
+			"TERMINAL_ADD_TO_CONTEXT": {
+				"label": "Afegir contingut del terminal al context",
+				"description": "Afegiu la sortida del terminal a la vostra tasca o conversa actual. Útil per proporcionar sortides de comandes o registres. Disponible al menú contextual del terminal (clic dret al contingut seleccionat del terminal)."
+			},
+			"TERMINAL_FIX": {
+				"label": "Corregir comanda del terminal",
+				"description": "Obtingueu ajuda per corregir comandes del terminal que han fallat o necessiten millores. Disponible al menú contextual del terminal (clic dret al contingut seleccionat del terminal)."
+			},
+			"TERMINAL_EXPLAIN": {
+				"label": "Explicar comanda del terminal",
+				"description": "Obtingueu explicacions detallades de les comandes del terminal i les seves sortides. Disponible al menú contextual del terminal (clic dret al contingut seleccionat del terminal)."
+			}
+		}
+	},
+	"customModeCreation": {
+		"enableTitle": "Habilitar la creació de modes personalitzats a través de prompts",
+		"description": "Quan està habilitat, Roo us permet crear modes personalitzats utilitzant prompts com 'Crea'm un mode personalitzat que...'. Desactivar-ho redueix el vostre prompt del sistema en aproximadament 700 tokens quan aquesta funcionalitat no és necessària. Quan està desactivat, encara podeu crear modes personalitzats manualment utilitzant el botó + de dalt o editant el JSON de configuració relacionat."
+	},
+	"advancedSystemPrompt": {
+		"title": "Avançat: Sobreescriure prompt del sistema",
+		"description": "Podeu reemplaçar completament el prompt del sistema per a aquest mode (a part de la definició de rol i instruccions personalitzades) creant un fitxer a .roo/system-prompt-{{modeSlug}} al vostre espai de treball. Aquesta és una funcionalitat molt avançada que eludeix les salvaguardes integrades i les comprovacions de consistència (especialment al voltant de l'ús d'eines), així que aneu amb compte!"
+	},
+	"createModeDialog": {
+		"title": "Crear nou mode",
+		"close": "Tancar",
+		"name": {
+			"label": "Nom",
+			"placeholder": "Introduïu nom del mode"
+		},
+		"slug": {
+			"label": "Slug",
+			"description": "El slug s'utilitza en URLs i noms de fitxers. Ha d'estar en minúscules i contenir només lletres, números i guions."
+		},
+		"saveLocation": {
+			"label": "Ubicació per desar",
+			"description": "Trieu on desar aquest mode. Els modes específics del projecte tenen prioritat sobre els modes globals.",
+			"global": {
+				"label": "Global",
+				"description": "Disponible a tots els espais de treball"
+			},
+			"project": {
+				"label": "Específic del projecte (.roomodes)",
+				"description": "Només disponible en aquest espai de treball, té prioritat sobre el global"
+			}
+		},
+		"roleDefinition": {
+			"label": "Definició de rol",
+			"description": "Definiu l'experiència i personalitat de Roo per a aquest mode."
+		},
+		"tools": {
+			"label": "Eines disponibles",
+			"description": "Seleccioneu quines eines pot utilitzar aquest mode."
+		},
+		"customInstructions": {
+			"label": "Instruccions personalitzades (opcional)",
+			"description": "Afegiu directrius de comportament específiques per a aquest mode."
+		},
+		"buttons": {
+			"cancel": "Cancel·lar",
+			"create": "Crear mode"
+		},
+		"deleteMode": "Eliminar mode"
+	},
+	"allFiles": "tots els fitxers"
+}
diff --git a/webview-ui/src/i18n/locales/cs/prompts.json b/webview-ui/src/i18n/locales/cs/prompts.json
new file mode 100644
index 0000000000..6aa26ac6b3
--- /dev/null
+++ b/webview-ui/src/i18n/locales/cs/prompts.json
@@ -0,0 +1,140 @@
+{
+	"title": "Prompty",
+	"done": "Hotovo",
+	"modes": {
+		"title": "Režimy",
+		"createNewMode": "Vytvořit nový režim",
+		"editModesConfig": "Upravit konfiguraci režimů",
+		"editGlobalModes": "Upravit globální režimy",
+		"editProjectModes": "Upravit projektové režimy (.roomodes)",
+		"createModeHelpText": "Klikněte na + pro vytvoření nového vlastního režimu, nebo jednoduše požádejte Roo v chatu, aby vám ho vytvořil!"
+	},
+	"apiConfiguration": {
+		"title": "Konfigurace API",
+		"select": "Vyberte, kterou konfiguraci API použít pro tento režim"
+	},
+	"tools": {
+		"title": "Dostupné nástroje",
+		"builtInModesText": "Nástroje pro vestavěné režimy nelze upravovat",
+		"editTools": "Upravit nástroje",
+		"doneEditing": "Dokončit úpravy",
+		"allowedFiles": "Povolené soubory:"
+	},
+	"roleDefinition": {
+		"title": "Definice role",
+		"resetToDefault": "Obnovit výchozí",
+		"description": "Definujte odbornost a osobnost Roo pro tento režim. Tento popis formuje, jak se Roo prezentuje a jak přistupuje k úkolům."
+	},
+	"customInstructions": {
+		"title": "Vlastní instrukce specifické pro režim (volitelné)",
+		"resetToDefault": "Obnovit výchozí",
+		"description": "Přidejte pokyny specifické pro chování v režimu {{modeName}}.",
+		"loadFromFile": "Vlastní instrukce specifické pro režim {{modeName}} mohou být také načteny ze souboru .clinerules-{{modeSlug}} ve vašem pracovním prostoru."
+	},
+	"globalCustomInstructions": {
+		"title": "Vlastní instrukce pro všechny režimy",
+		"description": "Tyto instrukce se vztahují na všechny režimy. Poskytují základní sadu chování, které mohou být vylepšeny specifickými instrukcemi pro režimy níže.\nPokud chcete, aby Roo přemýšlel a mluvil v jiném jazyce, než je jazyk zobrazení vašeho editoru ({{language}}), můžete to zde specifikovat.",
+		"loadFromFile": "Instrukce mohou být také načteny ze souboru .clinerules ve vašem pracovním prostoru."
+	},
+	"systemPrompt": {
+		"preview": "Náhled systémového promptu",
+		"copy": "Kopírovat systémový prompt do schránky",
+		"title": "Systémový prompt (režim {{modeName}})"
+	},
+	"supportPrompts": {
+		"title": "Podpůrné prompty",
+		"resetPrompt": "Obnovit {{promptType}} prompt na výchozí",
+		"prompt": "Prompt",
+		"enhance": {
+			"apiConfiguration": "Konfigurace API",
+			"apiConfigDescription": "Můžete vybrat konfiguraci API, která se bude vždy používat pro vylepšení promptů, nebo použít aktuálně vybranou",
+			"useCurrentConfig": "Použít aktuálně vybranou konfiguraci API",
+			"testPromptPlaceholder": "Zadejte prompt pro testování vylepšení",
+			"previewButton": "Náhled vylepšení promptu"
+		},
+		"types": {
+			"ENHANCE": {
+				"label": "Vylepšit prompt",
+				"description": "Použijte vylepšení promptu k získání upravených návrhů nebo zlepšení pro vaše vstupy. To zajišťuje, že Roo pochopí váš záměr a poskytne co nejlepší možné odpovědi. Dostupné přes ikonu ✨ v chatu."
+			},
+			"EXPLAIN": {
+				"label": "Vysvětlit kód",
+				"description": "Získejte podrobná vysvětlení úryvků kódu, funkcí nebo celých souborů. Užitečné pro pochopení složitého kódu nebo učení se nových vzorů. Dostupné v akcích kódu (ikona žárovky v editoru) a v kontextovém menu editoru (pravý klik na vybraný kód)."
+			},
+			"FIX": {
+				"label": "Opravit problémy",
+				"description": "Získejte pomoc při identifikaci a řešení chyb, problémů nebo problémů s kvalitou kódu. Poskytuje krok za krokem návod k řešení problémů. Dostupné v akcích kódu (ikona žárovky v editoru) a v kontextovém menu editoru (pravý klik na vybraný kód)."
+			},
+			"IMPROVE": {
+				"label": "Vylepšit kód",
+				"description": "Získejte návrhy na optimalizaci kódu, lepší postupy a architektonická vylepšení při zachování funkčnosti. Dostupné v akcích kódu (ikona žárovky v editoru) a v kontextovém menu editoru (pravý klik na vybraný kód)."
+			},
+			"ADD_TO_CONTEXT": {
+				"label": "Přidat do kontextu",
+				"description": "Přidejte kontext k vašemu aktuálnímu úkolu nebo konverzaci. Užitečné pro poskytnutí dodatečných informací nebo vysvětlení. Dostupné v akcích kódu (ikona žárovky v editoru) a v kontextovém menu editoru (pravý klik na vybraný kód)."
+			},
+			"TERMINAL_ADD_TO_CONTEXT": {
+				"label": "Přidat obsah terminálu do kontextu",
+				"description": "Přidejte výstup terminálu do vašeho aktuálního úkolu nebo konverzace. Užitečné pro poskytnutí výstupů příkazů nebo logů. Dostupné v kontextovém menu terminálu (pravý klik na vybraný obsah terminálu)."
+			},
+			"TERMINAL_FIX": {
+				"label": "Opravit příkaz terminálu",
+				"description": "Získejte pomoc při opravě příkazů terminálu, které selhaly nebo potřebují vylepšení. Dostupné v kontextovém menu terminálu (pravý klik na vybraný obsah terminálu)."
+			},
+			"TERMINAL_EXPLAIN": {
+				"label": "Vysvětlit příkaz terminálu",
+				"description": "Získejte podrobná vysvětlení příkazů terminálu a jejich výstupů. Dostupné v kontextovém menu terminálu (pravý klik na vybraný obsah terminálu)."
+			}
+		}
+	},
+	"customModeCreation": {
+		"enableTitle": "Povolit vytváření vlastních režimů pomocí promptů",
+		"description": "Pokud je povoleno, Roo vám umožňuje vytvářet vlastní režimy pomocí promptů jako 'Vytvoř mi vlastní režim, který...'. Zakázání této funkce sníží váš systémový prompt přibližně o 700 tokenů, když tato funkce není potřeba. Když je zakázáno, stále můžete manuálně vytvářet vlastní režimy pomocí tlačítka + výše nebo úpravou souvisejícího konfiguračního JSONu."
+	},
+	"advancedSystemPrompt": {
+		"title": "Pokročilé: Přepsat systémový prompt",
+		"description": "Můžete zcela nahradit systémový prompt pro tento režim (kromě definice role a vlastních instrukcí) vytvořením souboru v .roo/system-prompt-{{modeSlug}} ve vašem pracovním prostoru. Toto je velmi pokročilá funkce, která obchází vestavěné ochrany a kontroly konzistence (zejména kolem používání nástrojů), takže buďte opatrní!"
+	},
+	"createModeDialog": {
+		"title": "Vytvořit nový režim",
+		"close": "Zavřít",
+		"name": {
+			"label": "Název",
+			"placeholder": "Zadejte název režimu"
+		},
+		"slug": {
+			"label": "Slug",
+			"description": "Slug se používá v URL a názvech souborů. Měl by být malými písmeny a obsahovat pouze písmena, čísla a pomlčky."
+		},
+		"saveLocation": {
+			"label": "Umístění uložení",
+			"description": "Vyberte, kam se má tento režim uložit. Režimy specifické pro projekt mají přednost před globálními režimy.",
+			"global": {
+				"label": "Globální",
+				"description": "Dostupné ve všech pracovních prostorech"
+			},
+			"project": {
+				"label": "Specifické pro projekt (.roomodes)",
+				"description": "Dostupné pouze v tomto pracovním prostoru, má přednost před globálním"
+			}
+		},
+		"roleDefinition": {
+			"label": "Definice role",
+			"description": "Definujte odbornost a osobnost Roo pro tento režim."
+		},
+		"tools": {
+			"label": "Dostupné nástroje",
+			"description": "Vyberte, které nástroje může tento režim používat."
+		},
+		"customInstructions": {
+			"label": "Vlastní instrukce (volitelné)",
+			"description": "Přidejte pokyny specifické pro chování v tomto režimu."
+		},
+		"buttons": {
+			"cancel": "Zrušit",
+			"create": "Vytvořit režim"
+		},
+		"deleteMode": "Smazat režim"
+	},
+	"allFiles": "všechny soubory"
+}
diff --git a/webview-ui/src/i18n/locales/de/prompts.json b/webview-ui/src/i18n/locales/de/prompts.json
new file mode 100644
index 0000000000..b448f07de0
--- /dev/null
+++ b/webview-ui/src/i18n/locales/de/prompts.json
@@ -0,0 +1,140 @@
+{
+	"title": "Prompts",
+	"done": "Fertig",
+	"modes": {
+		"title": "Modi",
+		"createNewMode": "Neuen Modus erstellen",
+		"editModesConfig": "Moduskonfiguration bearbeiten",
+		"editGlobalModes": "Globale Modi bearbeiten",
+		"editProjectModes": "Projektmodi bearbeiten (.roomodes)",
+		"createModeHelpText": "Klicken Sie auf +, um einen neuen benutzerdefinierten Modus zu erstellen, oder bitten Sie Roo einfach im Chat, einen für Sie zu erstellen!"
+	},
+	"apiConfiguration": {
+		"title": "API-Konfiguration",
+		"select": "Wählen Sie, welche API-Konfiguration für diesen Modus verwendet werden soll"
+	},
+	"tools": {
+		"title": "Verfügbare Werkzeuge",
+		"builtInModesText": "Werkzeuge für eingebaute Modi können nicht geändert werden",
+		"editTools": "Werkzeuge bearbeiten",
+		"doneEditing": "Bearbeitung abschließen",
+		"allowedFiles": "Erlaubte Dateien:"
+	},
+	"roleDefinition": {
+		"title": "Rollendefinition",
+		"resetToDefault": "Auf Standardwerte zurücksetzen",
+		"description": "Definieren Sie Roos Expertise und Persönlichkeit für diesen Modus. Diese Beschreibung prägt, wie Roo sich präsentiert und an Aufgaben herangeht."
+	},
+	"customInstructions": {
+		"title": "Modusspezifische benutzerdefinierte Anweisungen (optional)",
+		"resetToDefault": "Auf Standardwerte zurücksetzen",
+		"description": "Fügen Sie verhaltensspezifische Richtlinien für den Modus {{modeName}} hinzu.",
+		"loadFromFile": "Benutzerdefinierte Anweisungen für den Modus {{modeName}} können auch aus .clinerules-{{modeSlug}} in Ihrem Arbeitsbereich geladen werden."
+	},
+	"globalCustomInstructions": {
+		"title": "Benutzerdefinierte Anweisungen für alle Modi",
+		"description": "Diese Anweisungen gelten für alle Modi. Sie bieten einen grundlegenden Satz von Verhaltensweisen, die durch modusspezifische Anweisungen unten erweitert werden können.\nWenn Sie möchten, dass Roo in einer anderen Sprache als Ihrer Editor-Anzeigesprache ({{language}}) denkt und spricht, können Sie das hier angeben.",
+		"loadFromFile": "Anweisungen können auch aus .clinerules in Ihrem Arbeitsbereich geladen werden."
+	},
+	"systemPrompt": {
+		"preview": "System-Prompt Vorschau",
+		"copy": "System-Prompt in Zwischenablage kopieren",
+		"title": "System-Prompt (Modus {{modeName}})"
+	},
+	"supportPrompts": {
+		"title": "Support-Prompts",
+		"resetPrompt": "{{promptType}}-Prompt auf Standardwerte zurücksetzen",
+		"prompt": "Prompt",
+		"enhance": {
+			"apiConfiguration": "API-Konfiguration",
+			"apiConfigDescription": "Sie können eine API-Konfiguration auswählen, die immer zur Verbesserung von Prompts verwendet wird, oder einfach die aktuell ausgewählte verwenden",
+			"useCurrentConfig": "Aktuell ausgewählte API-Konfiguration verwenden",
+			"testPromptPlaceholder": "Geben Sie einen Prompt ein, um die Verbesserung zu testen",
+			"previewButton": "Vorschau der Prompt-Verbesserung"
+		},
+		"types": {
+			"ENHANCE": {
+				"label": "Prompt verbessern",
+				"description": "Verwenden Sie die Prompt-Verbesserung, um maßgeschneiderte Vorschläge oder Verbesserungen für Ihre Eingaben zu erhalten. Dies stellt sicher, dass Roo Ihre Absicht versteht und die bestmöglichen Antworten liefert. Verfügbar über das ✨-Symbol im Chat."
+			},
+			"EXPLAIN": {
+				"label": "Code erklären",
+				"description": "Erhalten Sie detaillierte Erklärungen zu Code-Schnipseln, Funktionen oder ganzen Dateien. Nützlich zum Verständnis komplexen Codes oder zum Erlernen neuer Muster. Verfügbar in Code-Aktionen (Glühbirnen-Symbol im Editor) und im Kontextmenü des Editors (Rechtsklick auf ausgewählten Code)."
+			},
+			"FIX": {
+				"label": "Probleme beheben",
+				"description": "Erhalten Sie Hilfe beim Identifizieren und Lösen von Bugs, Fehlern oder Problemen mit der Code-Qualität. Bietet Schritt-für-Schritt-Anleitungen zur Problemlösung. Verfügbar in Code-Aktionen (Glühbirnen-Symbol im Editor) und im Kontextmenü des Editors (Rechtsklick auf ausgewählten Code)."
+			},
+			"IMPROVE": {
+				"label": "Code verbessern",
+				"description": "Erhalten Sie Vorschläge zur Code-Optimierung, bessere Praktiken und architektonische Verbesserungen bei gleichzeitiger Beibehaltung der Funktionalität. Verfügbar in Code-Aktionen (Glühbirnen-Symbol im Editor) und im Kontextmenü des Editors (Rechtsklick auf ausgewählten Code)."
+			},
+			"ADD_TO_CONTEXT": {
+				"label": "Zum Kontext hinzufügen",
+				"description": "Fügen Sie Kontext zu Ihrer aktuellen Aufgabe oder Konversation hinzu. Nützlich für die Bereitstellung zusätzlicher Informationen oder Klarstellungen. Verfügbar in Code-Aktionen (Glühbirnen-Symbol im Editor) und im Kontextmenü des Editors (Rechtsklick auf ausgewählten Code)."
+			},
+			"TERMINAL_ADD_TO_CONTEXT": {
+				"label": "Terminal-Inhalt zum Kontext hinzufügen",
+				"description": "Fügen Sie Terminal-Ausgaben zu Ihrer aktuellen Aufgabe oder Konversation hinzu. Nützlich für die Bereitstellung von Befehlsausgaben oder Protokollen. Verfügbar im Kontextmenü des Terminals (Rechtsklick auf ausgewählten Terminal-Inhalt)."
+			},
+			"TERMINAL_FIX": {
+				"label": "Terminal-Befehl korrigieren",
+				"description": "Erhalten Sie Hilfe bei der Korrektur fehlgeschlagener Terminal-Befehle oder solcher, die Verbesserungen benötigen. Verfügbar im Kontextmenü des Terminals (Rechtsklick auf ausgewählten Terminal-Inhalt)."
+			},
+			"TERMINAL_EXPLAIN": {
+				"label": "Terminal-Befehl erklären",
+				"description": "Erhalten Sie detaillierte Erklärungen zu Terminal-Befehlen und deren Ausgaben. Verfügbar im Kontextmenü des Terminals (Rechtsklick auf ausgewählten Terminal-Inhalt)."
+			}
+		}
+	},
+	"customModeCreation": {
+		"enableTitle": "Erstellung benutzerdefinierter Modi über Prompts aktivieren",
+		"description": "Wenn aktiviert, ermöglicht Roo Ihnen, benutzerdefinierte Modi mit Prompts wie 'Erstelle mir einen benutzerdefinierten Modus, der...' zu erstellen. Die Deaktivierung reduziert Ihren System-Prompt um etwa 700 Tokens, wenn diese Funktion nicht benötigt wird. Bei Deaktivierung können Sie immer noch manuell benutzerdefinierte Modi mit der +-Schaltfläche oben erstellen oder durch Bearbeiten der zugehörigen Konfigurations-JSON."
+	},
+	"advancedSystemPrompt": {
+		"title": "Erweitert: System-Prompt überschreiben",
+		"description": "Sie können den System-Prompt für diesen Modus vollständig ersetzen (abgesehen von der Rollendefinition und benutzerdefinierten Anweisungen), indem Sie eine Datei unter .roo/system-prompt-{{modeSlug}} in Ihrem Arbeitsbereich erstellen. Dies ist eine sehr fortgeschrittene Funktion, die eingebaute Schutzmaßnahmen und Konsistenzprüfungen umgeht (besonders bei der Werkzeugnutzung), also seien Sie vorsichtig!"
+	},
+	"createModeDialog": {
+		"title": "Neuen Modus erstellen",
+		"close": "Schließen",
+		"name": {
+			"label": "Name",
+			"placeholder": "Modusnamen eingeben"
+		},
+		"slug": {
+			"label": "Slug",
+			"description": "Der Slug wird in URLs und Dateinamen verwendet. Er sollte in Kleinbuchstaben sein und nur Buchstaben, Zahlen und Bindestriche enthalten."
+		},
+		"saveLocation": {
+			"label": "Speicherort",
+			"description": "Wählen Sie, wo dieser Modus gespeichert werden soll. Projektspezifische Modi haben Vorrang vor globalen Modi.",
+			"global": {
+				"label": "Global",
+				"description": "Verfügbar in allen Arbeitsbereichen"
+			},
+			"project": {
+				"label": "Projektspezifisch (.roomodes)",
+				"description": "Nur in diesem Arbeitsbereich verfügbar, hat Vorrang vor global"
+			}
+		},
+		"roleDefinition": {
+			"label": "Rollendefinition",
+			"description": "Definieren Sie Roos Expertise und Persönlichkeit für diesen Modus."
+		},
+		"tools": {
+			"label": "Verfügbare Werkzeuge",
+			"description": "Wählen Sie, welche Werkzeuge dieser Modus verwenden kann."
+		},
+		"customInstructions": {
+			"label": "Benutzerdefinierte Anweisungen (optional)",
+			"description": "Fügen Sie verhaltensspezifische Richtlinien für diesen Modus hinzu."
+		},
+		"buttons": {
+			"cancel": "Abbrechen",
+			"create": "Modus erstellen"
+		},
+		"deleteMode": "Modus löschen"
+	},
+	"allFiles": "alle Dateien"
+}
diff --git a/webview-ui/src/i18n/locales/en/prompts.json b/webview-ui/src/i18n/locales/en/prompts.json
new file mode 100644
index 0000000000..83e4a6bada
--- /dev/null
+++ b/webview-ui/src/i18n/locales/en/prompts.json
@@ -0,0 +1,140 @@
+{
+	"title": "Prompts",
+	"done": "Done",
+	"modes": {
+		"title": "Modes",
+		"createNewMode": "Create new mode",
+		"editModesConfig": "Edit modes configuration",
+		"editGlobalModes": "Edit Global Modes",
+		"editProjectModes": "Edit Project Modes (.roomodes)",
+		"createModeHelpText": "Hit the + to create a new custom mode, or just ask Roo in chat to create one for you!"
+	},
+	"apiConfiguration": {
+		"title": "API Configuration",
+		"select": "Select which API configuration to use for this mode"
+	},
+	"tools": {
+		"title": "Available Tools",
+		"builtInModesText": "Tools for built-in modes cannot be modified",
+		"editTools": "Edit tools",
+		"doneEditing": "Done editing",
+		"allowedFiles": "Allowed files:"
+	},
+	"roleDefinition": {
+		"title": "Role Definition",
+		"resetToDefault": "Reset to default",
+		"description": "Define Roo's expertise and personality for this mode. This description shapes how Roo presents itself and approaches tasks."
+	},
+	"customInstructions": {
+		"title": "Mode-specific Custom Instructions (optional)",
+		"resetToDefault": "Reset to default",
+		"description": "Add behavioral guidelines specific to {{modeName}} mode.",
+		"loadFromFile": "Custom instructions specific to {{modeName}} mode can also be loaded from .clinerules-{{modeSlug}} in your workspace."
+	},
+	"globalCustomInstructions": {
+		"title": "Custom Instructions for All Modes",
+		"description": "These instructions apply to all modes. They provide a base set of behaviors that can be enhanced by mode-specific instructions below.\nIf you would like Roo to think and speak in a different language than your editor display language ({{language}}), you can specify it here.",
+		"loadFromFile": "Instructions can also be loaded from .clinerules in your workspace."
+	},
+	"systemPrompt": {
+		"preview": "Preview System Prompt",
+		"copy": "Copy system prompt to clipboard",
+		"title": "System Prompt ({{modeName}} mode)"
+	},
+	"supportPrompts": {
+		"title": "Support Prompts",
+		"resetPrompt": "Reset {{promptType}} prompt to default",
+		"prompt": "Prompt",
+		"enhance": {
+			"apiConfiguration": "API Configuration",
+			"apiConfigDescription": "You can select an API configuration to always use for enhancing prompts, or just use whatever is currently selected",
+			"useCurrentConfig": "Use currently selected API configuration",
+			"testPromptPlaceholder": "Enter a prompt to test the enhancement",
+			"previewButton": "Preview Prompt Enhancement"
+		},
+		"types": {
+			"ENHANCE": {
+				"label": "Enhance Prompt",
+				"description": "Use prompt enhancement to get tailored suggestions or improvements for your inputs. This ensures Roo understands your intent and provides the best possible responses. Available via the ✨ icon in chat."
+			},
+			"EXPLAIN": {
+				"label": "Explain Code",
+				"description": "Get detailed explanations of code snippets, functions, or entire files. Useful for understanding complex code or learning new patterns. Available in code actions (lightbulb icon in the editor) and the editor context menu (right-click on selected code)."
+			},
+			"FIX": {
+				"label": "Fix Issues",
+				"description": "Get help identifying and resolving bugs, errors, or code quality issues. Provides step-by-step guidance for fixing problems. Available in code actions (lightbulb icon in the editor) and the editor context menu (right-click on selected code)."
+			},
+			"IMPROVE": {
+				"label": "Improve Code",
+				"description": "Receive suggestions for code optimization, better practices, and architectural improvements while maintaining functionality. Available in code actions (lightbulb icon in the editor) and the editor context menu (right-click on selected code)."
+			},
+			"ADD_TO_CONTEXT": {
+				"label": "Add to Context",
+				"description": "Add context to your current task or conversation. Useful for providing additional information or clarifications. Available in code actions (lightbulb icon in the editor) and the editor context menu (right-click on selected code)."
+			},
+			"TERMINAL_ADD_TO_CONTEXT": {
+				"label": "Add Terminal Content to Context",
+				"description": "Add terminal output to your current task or conversation. Useful for providing command outputs or logs. Available in the terminal context menu (right-click on selected terminal content)."
+			},
+			"TERMINAL_FIX": {
+				"label": "Fix Terminal Command",
+				"description": "Get help fixing terminal commands that failed or need improvement. Available in the terminal context menu (right-click on selected terminal content)."
+			},
+			"TERMINAL_EXPLAIN": {
+				"label": "Explain Terminal Command",
+				"description": "Get detailed explanations of terminal commands and their outputs. Available in the terminal context menu (right-click on selected terminal content)."
+			}
+		}
+	},
+	"customModeCreation": {
+		"enableTitle": "Enable Custom Mode Creation Through Prompts",
+		"description": "When enabled, Roo allows you to create custom modes using prompts like 'Make me a custom mode that…'. Disabling this reduces your system prompt by about 700 tokens when this feature isn't needed. When disabled you can still manually create custom modes using the + button above or by editing the related config JSON."
+	},
+	"advancedSystemPrompt": {
+		"title": "Advanced: Override System Prompt",
+		"description": "You can completely replace the system prompt for this mode (aside from the role definition and custom instructions) by creating a file at .roo/system-prompt-{{modeSlug}} in your workspace. This is a very advanced feature that bypasses built-in safeguards and consistency checks (especially around tool usage), so be careful!"
+	},
+	"createModeDialog": {
+		"title": "Create New Mode",
+		"close": "Close",
+		"name": {
+			"label": "Name",
+			"placeholder": "Enter mode name"
+		},
+		"slug": {
+			"label": "Slug",
+			"description": "The slug is used in URLs and file names. It should be lowercase and contain only letters, numbers, and hyphens."
+		},
+		"saveLocation": {
+			"label": "Save Location",
+			"description": "Choose where to save this mode. Project-specific modes take precedence over global modes.",
+			"global": {
+				"label": "Global",
+				"description": "Available in all workspaces"
+			},
+			"project": {
+				"label": "Project-specific (.roomodes)",
+				"description": "Only available in this workspace, takes precedence over global"
+			}
+		},
+		"roleDefinition": {
+			"label": "Role Definition",
+			"description": "Define Roo's expertise and personality for this mode."
+		},
+		"tools": {
+			"label": "Available Tools",
+			"description": "Select which tools this mode can use."
+		},
+		"customInstructions": {
+			"label": "Custom Instructions (optional)",
+			"description": "Add behavioral guidelines specific to this mode."
+		},
+		"buttons": {
+			"cancel": "Cancel",
+			"create": "Create Mode"
+		},
+		"deleteMode": "Delete mode"
+	},
+	"allFiles": "all files"
+}
diff --git a/webview-ui/src/i18n/locales/es/prompts.json b/webview-ui/src/i18n/locales/es/prompts.json
new file mode 100644
index 0000000000..07694835e5
--- /dev/null
+++ b/webview-ui/src/i18n/locales/es/prompts.json
@@ -0,0 +1,140 @@
+{
+	"title": "Solicitudes",
+	"done": "Listo",
+	"modes": {
+		"title": "Modos",
+		"createNewMode": "Crear nuevo modo",
+		"editModesConfig": "Editar configuración de modos",
+		"editGlobalModes": "Editar modos globales",
+		"editProjectModes": "Editar modos del proyecto (.roomodes)",
+		"createModeHelpText": "¡Haz clic en + para crear un nuevo modo personalizado, o simplemente pídele a Roo en el chat que te cree uno!"
+	},
+	"apiConfiguration": {
+		"title": "Configuración de API",
+		"select": "Selecciona qué configuración de API usar para este modo"
+	},
+	"tools": {
+		"title": "Herramientas disponibles",
+		"builtInModesText": "Las herramientas para modos integrados no se pueden modificar",
+		"editTools": "Editar herramientas",
+		"doneEditing": "Terminar edición",
+		"allowedFiles": "Archivos permitidos:"
+	},
+	"roleDefinition": {
+		"title": "Definición de rol",
+		"resetToDefault": "Restablecer a valores predeterminados",
+		"description": "Define la experiencia y personalidad de Roo para este modo. Esta descripción determina cómo Roo se presenta y aborda las tareas."
+	},
+	"customInstructions": {
+		"title": "Instrucciones personalizadas para el modo (opcional)",
+		"resetToDefault": "Restablecer a valores predeterminados",
+		"description": "Agrega directrices de comportamiento específicas para el modo {{modeName}}.",
+		"loadFromFile": "Las instrucciones personalizadas para el modo {{modeName}} también se pueden cargar desde .clinerules-{{modeSlug}} en tu espacio de trabajo."
+	},
+	"globalCustomInstructions": {
+		"title": "Instrucciones personalizadas para todos los modos",
+		"description": "Estas instrucciones se aplican a todos los modos. Proporcionan un conjunto base de comportamientos que pueden ser mejorados por instrucciones específicas de cada modo.\nSi quieres que Roo piense y hable en un idioma diferente al idioma de visualización de tu editor ({{language}}), puedes especificarlo aquí.",
+		"loadFromFile": "Las instrucciones también se pueden cargar desde .clinerules en tu espacio de trabajo."
+	},
+	"systemPrompt": {
+		"preview": "Vista previa de la solicitud del sistema",
+		"copy": "Copiar solicitud del sistema al portapapeles",
+		"title": "Solicitud del sistema (modo {{modeName}})"
+	},
+	"supportPrompts": {
+		"title": "Solicitudes de soporte",
+		"resetPrompt": "Restablecer la solicitud {{promptType}} a valores predeterminados",
+		"prompt": "Solicitud",
+		"enhance": {
+			"apiConfiguration": "Configuración de API",
+			"apiConfigDescription": "Puedes seleccionar una configuración de API para usar siempre en la mejora de solicitudes, o simplemente usar la que esté seleccionada actualmente",
+			"useCurrentConfig": "Usar la configuración de API actualmente seleccionada",
+			"testPromptPlaceholder": "Ingresa una solicitud para probar la mejora",
+			"previewButton": "Vista previa de la mejora de solicitud"
+		},
+		"types": {
+			"ENHANCE": {
+				"label": "Mejorar solicitud",
+				"description": "Utiliza la mejora de solicitudes para obtener sugerencias o mejoras personalizadas para tus entradas. Esto asegura que Roo entienda tu intención y proporcione las mejores respuestas posibles. Disponible a través del icono ✨ en el chat."
+			},
+			"EXPLAIN": {
+				"label": "Explicar código",
+				"description": "Obtén explicaciones detalladas de fragmentos de código, funciones o archivos completos. Útil para entender código complejo o aprender nuevos patrones. Disponible en acciones de código (icono de bombilla en el editor) y en el menú contextual del editor (clic derecho en el código seleccionado)."
+			},
+			"FIX": {
+				"label": "Corregir problemas",
+				"description": "Obtén ayuda para identificar y resolver errores, fallos o problemas de calidad del código. Proporciona una guía paso a paso para solucionar problemas. Disponible en acciones de código (icono de bombilla en el editor) y en el menú contextual del editor (clic derecho en el código seleccionado)."
+			},
+			"IMPROVE": {
+				"label": "Mejorar código",
+				"description": "Recibe sugerencias para optimización de código, mejores prácticas y mejoras arquitectónicas manteniendo la funcionalidad. Disponible en acciones de código (icono de bombilla en el editor) y en el menú contextual del editor (clic derecho en el código seleccionado)."
+			},
+			"ADD_TO_CONTEXT": {
+				"label": "Añadir al contexto",
+				"description": "Añade contexto a tu tarea o conversación actual. Útil para proporcionar información adicional o aclaraciones. Disponible en acciones de código (icono de bombilla en el editor) y en el menú contextual del editor (clic derecho en el código seleccionado)."
+			},
+			"TERMINAL_ADD_TO_CONTEXT": {
+				"label": "Añadir contenido de terminal al contexto",
+				"description": "Añade la salida de la terminal a tu tarea o conversación actual. Útil para proporcionar salidas de comandos o registros. Disponible en el menú contextual de la terminal (clic derecho en el contenido seleccionado de la terminal)."
+			},
+			"TERMINAL_FIX": {
+				"label": "Corregir comando de terminal",
+				"description": "Obtén ayuda para corregir comandos de terminal que fallaron o necesitan mejoras. Disponible en el menú contextual de la terminal (clic derecho en el contenido seleccionado de la terminal)."
+			},
+			"TERMINAL_EXPLAIN": {
+				"label": "Explicar comando de terminal",
+				"description": "Obtén explicaciones detalladas de comandos de terminal y sus salidas. Disponible en el menú contextual de la terminal (clic derecho en el contenido seleccionado de la terminal)."
+			}
+		}
+	},
+	"customModeCreation": {
+		"enableTitle": "Habilitar la creación de modos personalizados a través de solicitudes",
+		"description": "Cuando está habilitado, Roo te permite crear modos personalizados usando solicitudes como 'Hazme un modo personalizado que...'. Deshabilitarlo reduce tu solicitud del sistema en aproximadamente 700 tokens cuando esta función no es necesaria. Cuando está deshabilitado, aún puedes crear modos personalizados manualmente usando el botón + de arriba o editando el JSON de configuración relacionado."
+	},
+	"advancedSystemPrompt": {
+		"title": "Avanzado: Anular solicitud del sistema",
+		"description": "Puedes reemplazar completamente la solicitud del sistema para este modo (aparte de la definición de rol e instrucciones personalizadas) creando un archivo en .roo/system-prompt-{{modeSlug}} en tu espacio de trabajo. ¡Esta es una función muy avanzada que omite las salvaguardas integradas y las verificaciones de consistencia (especialmente en torno al uso de herramientas), así que ten cuidado!"
+	},
+	"createModeDialog": {
+		"title": "Crear nuevo modo",
+		"close": "Cerrar",
+		"name": {
+			"label": "Nombre",
+			"placeholder": "Ingresa nombre del modo"
+		},
+		"slug": {
+			"label": "Slug",
+			"description": "El slug se usa en URLs y nombres de archivos. Debe estar en minúscula y contener solo letras, números y guiones."
+		},
+		"saveLocation": {
+			"label": "Ubicación para guardar",
+			"description": "Elige dónde guardar este modo. Los modos específicos del proyecto tienen prioridad sobre los modos globales.",
+			"global": {
+				"label": "Global",
+				"description": "Disponible en todos los espacios de trabajo"
+			},
+			"project": {
+				"label": "Específico del proyecto (.roomodes)",
+				"description": "Solo disponible en este espacio de trabajo, tiene prioridad sobre el global"
+			}
+		},
+		"roleDefinition": {
+			"label": "Definición de rol",
+			"description": "Define la experiencia y personalidad de Roo para este modo."
+		},
+		"tools": {
+			"label": "Herramientas disponibles",
+			"description": "Selecciona qué herramientas puede usar este modo."
+		},
+		"customInstructions": {
+			"label": "Instrucciones personalizadas (opcional)",
+			"description": "Agrega directrices de comportamiento específicas para este modo."
+		},
+		"buttons": {
+			"cancel": "Cancelar",
+			"create": "Crear modo"
+		},
+		"deleteMode": "Eliminar modo"
+	},
+	"allFiles": "todos los archivos"
+}
diff --git a/webview-ui/src/i18n/locales/fr/prompts.json b/webview-ui/src/i18n/locales/fr/prompts.json
new file mode 100644
index 0000000000..89f99a62ea
--- /dev/null
+++ b/webview-ui/src/i18n/locales/fr/prompts.json
@@ -0,0 +1,140 @@
+{
+	"title": "Prompts",
+	"done": "Terminé",
+	"modes": {
+		"title": "Modes",
+		"createNewMode": "Créer un nouveau mode",
+		"editModesConfig": "Modifier la configuration des modes",
+		"editGlobalModes": "Modifier les modes globaux",
+		"editProjectModes": "Modifier les modes du projet (.roomodes)",
+		"createModeHelpText": "Cliquez sur + pour créer un nouveau mode personnalisé, ou demandez simplement à Roo dans le chat de vous en créer un !"
+	},
+	"apiConfiguration": {
+		"title": "Configuration API",
+		"select": "Sélectionnez la configuration API à utiliser pour ce mode"
+	},
+	"tools": {
+		"title": "Outils disponibles",
+		"builtInModesText": "Les outils pour les modes intégrés ne peuvent pas être modifiés",
+		"editTools": "Modifier les outils",
+		"doneEditing": "Terminer la modification",
+		"allowedFiles": "Fichiers autorisés :"
+	},
+	"roleDefinition": {
+		"title": "Définition du rôle",
+		"resetToDefault": "Réinitialiser aux valeurs par défaut",
+		"description": "Définissez l'expertise et la personnalité de Roo pour ce mode. Cette description façonne la manière dont Roo se présente et aborde les tâches."
+	},
+	"customInstructions": {
+		"title": "Instructions personnalisées spécifiques au mode (optionnel)",
+		"resetToDefault": "Réinitialiser aux valeurs par défaut",
+		"description": "Ajoutez des directives comportementales spécifiques au mode {{modeName}}.",
+		"loadFromFile": "Les instructions personnalisées spécifiques au mode {{modeName}} peuvent également être chargées depuis .clinerules-{{modeSlug}} dans votre espace de travail."
+	},
+	"globalCustomInstructions": {
+		"title": "Instructions personnalisées pour tous les modes",
+		"description": "Ces instructions s'appliquent à tous les modes. Elles fournissent un ensemble de comportements de base qui peuvent être améliorés par des instructions spécifiques au mode ci-dessous.\nSi vous souhaitez que Roo pense et parle dans une langue différente de celle de votre éditeur ({{language}}), vous pouvez le spécifier ici.",
+		"loadFromFile": "Les instructions peuvent également être chargées depuis .clinerules dans votre espace de travail."
+	},
+	"systemPrompt": {
+		"preview": "Aperçu du prompt système",
+		"copy": "Copier le prompt système dans le presse-papiers",
+		"title": "Prompt système (mode {{modeName}})"
+	},
+	"supportPrompts": {
+		"title": "Prompts de support",
+		"resetPrompt": "Réinitialiser le prompt {{promptType}} aux valeurs par défaut",
+		"prompt": "Prompt",
+		"enhance": {
+			"apiConfiguration": "Configuration API",
+			"apiConfigDescription": "Vous pouvez sélectionner une configuration API à toujours utiliser pour améliorer les prompts, ou simplement utiliser celle qui est actuellement sélectionnée",
+			"useCurrentConfig": "Utiliser la configuration API actuellement sélectionnée",
+			"testPromptPlaceholder": "Entrez un prompt pour tester l'amélioration",
+			"previewButton": "Aperçu de l'amélioration du prompt"
+		},
+		"types": {
+			"ENHANCE": {
+				"label": "Améliorer le prompt",
+				"description": "Utilisez l'amélioration de prompt pour obtenir des suggestions ou des améliorations personnalisées pour vos entrées. Cela garantit que Roo comprend votre intention et fournit les meilleures réponses possibles. Disponible via l'icône ✨ dans le chat."
+			},
+			"EXPLAIN": {
+				"label": "Expliquer le code",
+				"description": "Obtenez des explications détaillées sur des extraits de code, des fonctions ou des fichiers entiers. Utile pour comprendre un code complexe ou apprendre de nouveaux modèles. Disponible dans les actions de code (icône d'ampoule dans l'éditeur) et dans le menu contextuel de l'éditeur (clic droit sur le code sélectionné)."
+			},
+			"FIX": {
+				"label": "Corriger les problèmes",
+				"description": "Obtenez de l'aide pour identifier et résoudre les bugs, les erreurs ou les problèmes de qualité du code. Fournit des conseils étape par étape pour résoudre les problèmes. Disponible dans les actions de code (icône d'ampoule dans l'éditeur) et dans le menu contextuel de l'éditeur (clic droit sur le code sélectionné)."
+			},
+			"IMPROVE": {
+				"label": "Améliorer le code",
+				"description": "Recevez des suggestions pour l'optimisation du code, de meilleures pratiques et des améliorations architecturales tout en maintenant la fonctionnalité. Disponible dans les actions de code (icône d'ampoule dans l'éditeur) et dans le menu contextuel de l'éditeur (clic droit sur le code sélectionné)."
+			},
+			"ADD_TO_CONTEXT": {
+				"label": "Ajouter au contexte",
+				"description": "Ajoutez du contexte à votre tâche ou conversation actuelle. Utile pour fournir des informations supplémentaires ou des clarifications. Disponible dans les actions de code (icône d'ampoule dans l'éditeur) et dans le menu contextuel de l'éditeur (clic droit sur le code sélectionné)."
+			},
+			"TERMINAL_ADD_TO_CONTEXT": {
+				"label": "Ajouter le contenu du terminal au contexte",
+				"description": "Ajoutez la sortie du terminal à votre tâche ou conversation actuelle. Utile pour fournir des sorties de commandes ou des journaux. Disponible dans le menu contextuel du terminal (clic droit sur le contenu sélectionné du terminal)."
+			},
+			"TERMINAL_FIX": {
+				"label": "Corriger la commande du terminal",
+				"description": "Obtenez de l'aide pour corriger les commandes du terminal qui ont échoué ou qui nécessitent des améliorations. Disponible dans le menu contextuel du terminal (clic droit sur le contenu sélectionné du terminal)."
+			},
+			"TERMINAL_EXPLAIN": {
+				"label": "Expliquer la commande du terminal",
+				"description": "Obtenez des explications détaillées sur les commandes du terminal et leurs sorties. Disponible dans le menu contextuel du terminal (clic droit sur le contenu sélectionné du terminal)."
+			}
+		}
+	},
+	"customModeCreation": {
+		"enableTitle": "Activer la création de modes personnalisés via les prompts",
+		"description": "Lorsque cette option est activée, Roo vous permet de créer des modes personnalisés en utilisant des prompts comme 'Crée-moi un mode personnalisé qui...'. La désactivation réduit votre prompt système d'environ 700 tokens lorsque cette fonctionnalité n'est pas nécessaire. Lorsqu'elle est désactivée, vous pouvez toujours créer manuellement des modes personnalisés en utilisant le bouton + ci-dessus ou en modifiant le JSON de configuration associé."
+	},
+	"advancedSystemPrompt": {
+		"title": "Avancé : Remplacer le prompt système",
+		"description": "Vous pouvez complètement remplacer le prompt système pour ce mode (en dehors de la définition du rôle et des instructions personnalisées) en créant un fichier à .roo/system-prompt-{{modeSlug}} dans votre espace de travail. Il s'agit d'une fonctionnalité très avancée qui contourne les garanties intégrées et les vérifications de cohérence (notamment concernant l'utilisation des outils), alors soyez prudent !"
+	},
+	"createModeDialog": {
+		"title": "Créer un nouveau mode",
+		"close": "Fermer",
+		"name": {
+			"label": "Nom",
+			"placeholder": "Entrez le nom du mode"
+		},
+		"slug": {
+			"label": "Slug",
+			"description": "Le slug est utilisé dans les URL et les noms de fichiers. Il doit être en minuscules et ne contenir que des lettres, des chiffres et des tirets."
+		},
+		"saveLocation": {
+			"label": "Emplacement d'enregistrement",
+			"description": "Choisissez où enregistrer ce mode. Les modes spécifiques au projet ont priorité sur les modes globaux.",
+			"global": {
+				"label": "Global",
+				"description": "Disponible dans tous les espaces de travail"
+			},
+			"project": {
+				"label": "Spécifique au projet (.roomodes)",
+				"description": "Disponible uniquement dans cet espace de travail, a priorité sur le global"
+			}
+		},
+		"roleDefinition": {
+			"label": "Définition du rôle",
+			"description": "Définissez l'expertise et la personnalité de Roo pour ce mode."
+		},
+		"tools": {
+			"label": "Outils disponibles",
+			"description": "Sélectionnez quels outils ce mode peut utiliser."
+		},
+		"customInstructions": {
+			"label": "Instructions personnalisées (optionnel)",
+			"description": "Ajoutez des directives comportementales spécifiques à ce mode."
+		},
+		"buttons": {
+			"cancel": "Annuler",
+			"create": "Créer le mode"
+		},
+		"deleteMode": "Supprimer le mode"
+	},
+	"allFiles": "tous les fichiers"
+}
diff --git a/webview-ui/src/i18n/locales/hi/prompts.json b/webview-ui/src/i18n/locales/hi/prompts.json
new file mode 100644
index 0000000000..ee96611fb7
--- /dev/null
+++ b/webview-ui/src/i18n/locales/hi/prompts.json
@@ -0,0 +1,140 @@
+{
+	"title": "प्रॉम्प्ट्स",
+	"done": "हो गया",
+	"modes": {
+		"title": "मोड्स",
+		"createNewMode": "नया मोड बनाएँ",
+		"editModesConfig": "मोड कॉन्फ़िगरेशन संपादित करें",
+		"editGlobalModes": "ग्लोबल मोड्स संपादित करें",
+		"editProjectModes": "प्रोजेक्ट मोड्स संपादित करें (.roomodes)",
+		"createModeHelpText": "नया कस्टम मोड बनाने के लिए + पर क्लिक करें, या बस चैट में Roo से आपके लिए एक बनाने को कहें!"
+	},
+	"apiConfiguration": {
+		"title": "API कॉन्फ़िगरेशन",
+		"select": "इस मोड के लिए किस API कॉन्फ़िगरेशन का उपयोग करना है, चुनें"
+	},
+	"tools": {
+		"title": "उपलब्ध टूल्स",
+		"builtInModesText": "अंतर्निहित मोड्स के लिए टूल्स को संशोधित नहीं किया जा सकता",
+		"editTools": "टूल्स संपादित करें",
+		"doneEditing": "संपादन पूरा हुआ",
+		"allowedFiles": "अनुमत फाइलें:"
+	},
+	"roleDefinition": {
+		"title": "भूमिका परिभाषा",
+		"resetToDefault": "डिफ़ॉल्ट पर रीसेट करें",
+		"description": "इस मोड के लिए Roo की विशेषज्ञता और व्यक्तित्व परिभाषित करें। यह विवरण Roo के स्वयं को प्रस्तुत करने और कार्यों से निपटने के तरीके को आकार देता है।"
+	},
+	"customInstructions": {
+		"title": "मोड-विशिष्ट कस्टम निर्देश (वैकल्पिक)",
+		"resetToDefault": "डिफ़ॉल्ट पर रीसेट करें",
+		"description": "{{modeName}} मोड के लिए विशिष्ट व्यवहार दिशानिर्देश जोड़ें।",
+		"loadFromFile": "{{modeName}} मोड के लिए विशिष्ट कस्टम निर्देश आपके वर्कस्पेस में .clinerules-{{modeSlug}} से भी लोड किए जा सकते हैं।"
+	},
+	"globalCustomInstructions": {
+		"title": "सभी मोड्स के लिए कस्टम निर्देश",
+		"description": "ये निर्देश सभी मोड्स पर लागू होते हैं। वे व्यवहारों का एक आधार सेट प्रदान करते हैं जिन्हें नीचे दिए गए मोड-विशिष्ट निर्देशों द्वारा बढ़ाया जा सकता है।\nयदि आप चाहते हैं कि Roo आपके एडिटर की प्रदर्शन भाषा ({{language}}) से अलग भाषा में सोचे और बोले, तो आप यहां इसे निर्दिष्ट कर सकते हैं।",
+		"loadFromFile": "निर्देश आपके वर्कस्पेस में .clinerules से भी लोड किए जा सकते हैं।"
+	},
+	"systemPrompt": {
+		"preview": "सिस्टम प्रॉम्प्ट का पूर्वावलोकन",
+		"copy": "सिस्टम प्रॉम्प्ट को क्लिपबोर्ड पर कॉपी करें",
+		"title": "सिस्टम प्रॉम्प्ट ({{modeName}} मोड)"
+	},
+	"supportPrompts": {
+		"title": "सहायता प्रॉम्प्ट्स",
+		"resetPrompt": "{{promptType}} प्रॉम्प्ट को डिफ़ॉल्ट पर रीसेट करें",
+		"prompt": "प्रॉम्प्ट",
+		"enhance": {
+			"apiConfiguration": "API कॉन्फ़िगरेशन",
+			"apiConfigDescription": "आप प्रॉम्प्ट्स को बढ़ाने के लिए हमेशा उपयोग करने के लिए एक API कॉन्फ़िगरेशन चुन सकते हैं, या बस वर्तमान में चयनित का उपयोग कर सकते हैं",
+			"useCurrentConfig": "वर्तमान में चयनित API कॉन्फ़िगरेशन का उपयोग करें",
+			"testPromptPlaceholder": "वृद्धि का परीक्षण करने के लिए एक प्रॉम्प्ट दर्ज करें",
+			"previewButton": "प्रॉम्प्ट वृद्धि का पूर्वावलोकन"
+		},
+		"types": {
+			"ENHANCE": {
+				"label": "प्रॉम्प्ट बढ़ाएँ",
+				"description": "अपने इनपुट के लिए अनुकूलित सुझाव या सुधार प्राप्त करने के लिए प्रॉम्प्ट वृद्धि का उपयोग करें। यह सुनिश्चित करता है कि Roo आपके इरादे को समझता है और सर्वोत्तम संभव प्रतिक्रियाएँ प्रदान करता है। चैट में ✨ आइकन के माध्यम से उपलब्ध है।"
+			},
+			"EXPLAIN": {
+				"label": "कोड समझाएँ",
+				"description": "कोड स्निपेट, फंक्शन या पूरी फाइलों के विस्तृत स्पष्टीकरण प्राप्त करें। जटिल कोड को समझने या नए पैटर्न सीखने के लिए उपयोगी। कोड कार्रवाइयों (एडिटर में बल्ब आइकन) और एडिटर के कंटेक्स्ट मेनू (चयनित कोड पर राइट-क्लिक) में उपलब्ध है।"
+			},
+			"FIX": {
+				"label": "समस्याएँ ठीक करें",
+				"description": "बग्स, त्रुटियों या कोड गुणवत्ता के मुद्दों की पहचान और समाधान में मदद प्राप्त करें। समस्याओं को ठीक करने के लिए चरण-दर-चरण मार्गदर्शन प्रदान करता है। कोड कार्रवाइयों (एडिटर में बल्ब आइकन) और एडिटर के कंटेक्स्ट मेनू (चयनित कोड पर राइट-क्लिक) में उपलब्ध है।"
+			},
+			"IMPROVE": {
+				"label": "कोड में सुधार करें",
+				"description": "कार्यक्षमता बनाए रखते हुए कोड अनुकूलन, बेहतर प्रथाओं और वास्तुकला सुधारों के लिए सुझाव प्राप्त करें। कोड कार्रवाइयों (एडिटर में बल्ब आइकन) और एडिटर के कंटेक्स्ट मेनू (चयनित कोड पर राइट-क्लिक) में उपलब्ध है।"
+			},
+			"ADD_TO_CONTEXT": {
+				"label": "संदर्भ में जोड़ें",
+				"description": "अपने वर्तमान कार्य या वार्तालाप में संदर्भ जोड़ें। अतिरिक्त जानकारी या स्पष्टीकरण प्रदान करने के लिए उपयोगी। कोड कार्रवाइयों (एडिटर में बल्ब आइकन) और एडिटर के कंटेक्स्ट मेनू (चयनित कोड पर राइट-क्लिक) में उपलब्ध है।"
+			},
+			"TERMINAL_ADD_TO_CONTEXT": {
+				"label": "टर्मिनल सामग्री को संदर्भ में जोड़ें",
+				"description": "अपने वर्तमान कार्य या वार्तालाप में टर्मिनल आउटपुट जोड़ें। कमांड आउटपुट या लॉग प्रदान करने के लिए उपयोगी। टर्मिनल के कंटेक्स्ट मेनू (चयनित टर्मिनल सामग्री पर राइट-क्लिक) में उपलब्ध है।"
+			},
+			"TERMINAL_FIX": {
+				"label": "टर्मिनल कमांड ठीक करें",
+				"description": "विफल हुए या सुधार की आवश्यकता वाले टर्मिनल कमांड को ठीक करने में मदद प्राप्त करें। टर्मिनल के कंटेक्स्ट मेनू (चयनित टर्मिनल सामग्री पर राइट-क्लिक) में उपलब्ध है।"
+			},
+			"TERMINAL_EXPLAIN": {
+				"label": "टर्मिनल कमांड समझाएँ",
+				"description": "टर्मिनल कमांड और उनके आउटपुट के विस्तृत स्पष्टीकरण प्राप्त करें। टर्मिनल के कंटेक्स्ट मेनू (चयनित टर्मिनल सामग्री पर राइट-क्लिक) में उपलब्ध है।"
+			}
+		}
+	},
+	"customModeCreation": {
+		"enableTitle": "प्रॉम्प्ट्स के माध्यम से कस्टम मोड निर्माण सक्षम करें",
+		"description": "सक्षम होने पर, Roo आपको 'मेरे लिए एक कस्टम मोड बनाएँ जो...' जैसे प्रॉम्प्ट्स का उपयोग करके कस्टम मोड बनाने की अनुमति देता है। इस सुविधा की आवश्यकता न होने पर इसे अक्षम करने से आपका सिस्टम प्रॉम्प्ट लगभग 700 token कम हो जाता है। अक्षम होने पर भी आप ऊपर दिए गए + बटन का उपयोग करके या संबंधित कॉन्फिग JSON को संपादित करके मैन्युअल रूप से कस्टम मोड बना सकते हैं।"
+	},
+	"advancedSystemPrompt": {
+		"title": "उन्नत: सिस्टम प्रॉम्प्ट ओवरराइड करें",
+		"description": "आप अपने वर्कस्पेस में .roo/system-prompt-{{modeSlug}} पर एक फाइल बनाकर इस मोड के लिए सिस्टम प्रॉम्प्ट को पूरी तरह से बदल सकते हैं (भूमिका परिभाषा और कस्टम निर्देशों को छोड़कर)। यह एक बहुत उन्नत सुविधा है जो अंतर्निहित सुरक्षा उपायों और सामंजस्यता जांचों को बायपास करती है (विशेष रूप से टूल उपयोग के आसपास), इसलिए सावधान रहें!"
+	},
+	"createModeDialog": {
+		"title": "नया मोड बनाएँ",
+		"close": "बंद करें",
+		"name": {
+			"label": "नाम",
+			"placeholder": "मोड का नाम दर्ज करें"
+		},
+		"slug": {
+			"label": "स्लग",
+			"description": "स्लग URL और फाइल नामों में उपयोग किया जाता है। यह लोअरकेस में होना चाहिए और केवल अक्षर, संख्याएँ और हाइफन शामिल होने चाहिए।"
+		},
+		"saveLocation": {
+			"label": "सहेजने का स्थान",
+			"description": "इस मोड को कहां सहेजना है, चुनें। प्रोजेक्ट-विशिष्ट मोड्स को ग्लोबल मोड्स पर प्राथमिकता मिलती है।",
+			"global": {
+				"label": "ग्लोबल",
+				"description": "सभी वर्कस्पेस में उपलब्ध"
+			},
+			"project": {
+				"label": "प्रोजेक्ट-विशिष्ट (.roomodes)",
+				"description": "केवल इस वर्कस्पेस में उपलब्ध, ग्लोबल पर प्राथमिकता रखता है"
+			}
+		},
+		"roleDefinition": {
+			"label": "भूमिका परिभाषा",
+			"description": "इस मोड के लिए Roo की विशेषज्ञता और व्यक्तित्व परिभाषित करें।"
+		},
+		"tools": {
+			"label": "उपलब्ध टूल्स",
+			"description": "चुनें कि यह मोड कौन से टूल्स उपयोग कर सकता है।"
+		},
+		"customInstructions": {
+			"label": "कस्टम निर्देश (वैकल्पिक)",
+			"description": "इस मोड के लिए विशिष्ट व्यवहार दिशानिर्देश जोड़ें।"
+		},
+		"buttons": {
+			"cancel": "रद्द करें",
+			"create": "मोड बनाएँ"
+		},
+		"deleteMode": "मोड हटाएँ"
+	},
+	"allFiles": "सभी फाइलें"
+}
diff --git a/webview-ui/src/i18n/locales/hu/prompts.json b/webview-ui/src/i18n/locales/hu/prompts.json
new file mode 100644
index 0000000000..05307f2b0a
--- /dev/null
+++ b/webview-ui/src/i18n/locales/hu/prompts.json
@@ -0,0 +1,140 @@
+{
+	"title": "Promptok",
+	"done": "Kész",
+	"modes": {
+		"title": "Módok",
+		"createNewMode": "Új mód létrehozása",
+		"editModesConfig": "Mód konfiguráció szerkesztése",
+		"editGlobalModes": "Globális módok szerkesztése",
+		"editProjectModes": "Projekt módok szerkesztése (.roomodes)",
+		"createModeHelpText": "Kattintson a + gombra új egyéni mód létrehozásához, vagy egyszerűen kérje meg Roo-t a csevegésben, hogy készítsen egyet Önnek!"
+	},
+	"apiConfiguration": {
+		"title": "API konfiguráció",
+		"select": "Válassza ki, melyik API konfigurációt használja ehhez a módhoz"
+	},
+	"tools": {
+		"title": "Elérhető eszközök",
+		"builtInModesText": "A beépített módok eszközei nem módosíthatók",
+		"editTools": "Eszközök szerkesztése",
+		"doneEditing": "Szerkesztés befejezése",
+		"allowedFiles": "Engedélyezett fájlok:"
+	},
+	"roleDefinition": {
+		"title": "Szerepkör meghatározása",
+		"resetToDefault": "Alapértelmezetthez visszaállítás",
+		"description": "Határozza meg a Roo szakértelmét és személyiségét ehhez a módhoz. Ez a leírás alakítja, hogyan mutatkozik be a Roo és hogyan közelíti meg a feladatokat."
+	},
+	"customInstructions": {
+		"title": "Módspecifikus egyéni utasítások (opcionális)",
+		"resetToDefault": "Alapértelmezetthez visszaállítás",
+		"description": "Adjon hozzá viselkedési irányelveket a(z) {{modeName}} módhoz.",
+		"loadFromFile": "A(z) {{modeName}} módra vonatkozó egyéni utasítások a munkaterületen lévő .clinerules-{{modeSlug}} fájlból is betölthetők."
+	},
+	"globalCustomInstructions": {
+		"title": "Egyéni utasítások minden módhoz",
+		"description": "Ezek az utasítások minden módra vonatkoznak. Alapvető viselkedéskészletet biztosítanak, amelyet a lenti módspecifikus utasítások kiegészíthetnek.\nHa azt szeretné, hogy a Roo az Ön szerkesztőjének megjelenítési nyelvétől ({{language}}) eltérő nyelven gondolkodjon és beszéljen, itt megadhatja.",
+		"loadFromFile": "Az utasítások a munkaterületen lévő .clinerules fájlból is betölthetők."
+	},
+	"systemPrompt": {
+		"preview": "Rendszer prompt előnézete",
+		"copy": "Rendszer prompt másolása a vágólapra",
+		"title": "Rendszer prompt ({{modeName}} mód)"
+	},
+	"supportPrompts": {
+		"title": "Támogató promptok",
+		"resetPrompt": "{{promptType}} prompt visszaállítása alapértelmezettre",
+		"prompt": "Prompt",
+		"enhance": {
+			"apiConfiguration": "API konfiguráció",
+			"apiConfigDescription": "Kiválaszthat egy API konfigurációt, amelyet mindig használ a promptok javításához, vagy használhatja az aktuálisan kiválasztottat",
+			"useCurrentConfig": "Aktuálisan kiválasztott API konfiguráció használata",
+			"testPromptPlaceholder": "Írjon be egy promptot a javítás teszteléséhez",
+			"previewButton": "Prompt javítás előnézete"
+		},
+		"types": {
+			"ENHANCE": {
+				"label": "Prompt javítása",
+				"description": "Használja a prompt javítást, hogy testreszabott javaslatokat vagy fejlesztéseket kapjon a bemeneteihez. Ez biztosítja, hogy Roo megérti az Ön szándékát és a lehető legjobb válaszokat adja. A csevegésben a ✨ ikonon keresztül érhető el."
+			},
+			"EXPLAIN": {
+				"label": "Kód magyarázata",
+				"description": "Kapjon részletes magyarázatot kódrészletekről, függvényekről vagy teljes fájlokról. Hasznos a komplex kód megértéséhez vagy új minták tanulásához. Elérhető a kód műveletek között (villanykörte ikon a szerkesztőben) és a szerkesztő kontextusmenüjében (jobb kattintás a kijelölt kódon)."
+			},
+			"FIX": {
+				"label": "Problémák javítása",
+				"description": "Kapjon segítséget a hibák, problémák vagy kódminőségi problémák azonosításához és megoldásához. Lépésről lépésre útmutatást nyújt a problémák megoldásához. Elérhető a kód műveletek között (villanykörte ikon a szerkesztőben) és a szerkesztő kontextusmenüjében (jobb kattintás a kijelölt kódon)."
+			},
+			"IMPROVE": {
+				"label": "Kód fejlesztése",
+				"description": "Kapjon javaslatokat a kód optimalizálásához, jobb gyakorlatokhoz és architektúrális fejlesztésekhez a funkcionalitás megtartása mellett. Elérhető a kód műveletek között (villanykörte ikon a szerkesztőben) és a szerkesztő kontextusmenüjében (jobb kattintás a kijelölt kódon)."
+			},
+			"ADD_TO_CONTEXT": {
+				"label": "Hozzáadás a kontextushoz",
+				"description": "Adjon hozzá kontextust az aktuális feladatához vagy beszélgetéséhez. Hasznos további információk vagy pontosítások megadásához. Elérhető a kód műveletek között (villanykörte ikon a szerkesztőben) és a szerkesztő kontextusmenüjében (jobb kattintás a kijelölt kódon)."
+			},
+			"TERMINAL_ADD_TO_CONTEXT": {
+				"label": "Terminál tartalom hozzáadása a kontextushoz",
+				"description": "Adja hozzá a terminál kimenetét az aktuális feladatához vagy beszélgetéséhez. Hasznos a parancsok kimenetének vagy naplók megadásához. Elérhető a terminál kontextusmenüjében (jobb kattintás a kijelölt terminál tartalmon)."
+			},
+			"TERMINAL_FIX": {
+				"label": "Terminál parancs javítása",
+				"description": "Kapjon segítséget a sikertelen vagy fejlesztésre szoruló terminál parancsok javításához. Elérhető a terminál kontextusmenüjében (jobb kattintás a kijelölt terminál tartalmon)."
+			},
+			"TERMINAL_EXPLAIN": {
+				"label": "Terminál parancs magyarázata",
+				"description": "Kapjon részletes magyarázatot a terminál parancsokról és kimenetükről. Elérhető a terminál kontextusmenüjében (jobb kattintás a kijelölt terminál tartalmon)."
+			}
+		}
+	},
+	"customModeCreation": {
+		"enableTitle": "Egyéni mód létrehozásának engedélyezése promptok segítségével",
+		"description": "Ha engedélyezve van, a Roo lehetővé teszi egyéni módok létrehozását olyan promptokkal, mint 'Készíts nekem egy egyéni módot, amely...'. Letiltása körülbelül 700 tokennel csökkenti a rendszer promptot, amikor erre a funkcióra nincs szükség. Ha le van tiltva, akkor is létrehozhat manuálisan egyéni módokat a fenti + gombbal vagy a kapcsolódó konfigurációs JSON szerkesztésével."
+	},
+	"advancedSystemPrompt": {
+		"title": "Speciális: Rendszer prompt felülírása",
+		"description": "Teljesen lecserélheti a rendszer promptot ehhez a módhoz (a szerepkör meghatározásán és az egyéni utasításokon kívül) egy fájl létrehozásával a .roo/system-prompt-{{modeSlug}} helyen a munkaterületén. Ez egy nagyon fejlett funkció, amely megkerüli a beépített biztonsági intézkedéseket és a konzisztencia ellenőrzéseket (különösen az eszközhasználatot illetően), ezért legyen óvatos!"
+	},
+	"createModeDialog": {
+		"title": "Új mód létrehozása",
+		"close": "Bezárás",
+		"name": {
+			"label": "Név",
+			"placeholder": "Adja meg a mód nevét"
+		},
+		"slug": {
+			"label": "Slug",
+			"description": "A slug URL-ekben és fájlnevekben használatos. Kisbetűsnek kell lennie, és csak betűket, számokat és kötőjeleket tartalmazhat."
+		},
+		"saveLocation": {
+			"label": "Mentés helye",
+			"description": "Válassza ki, hová mentse ezt a módot. A projektspecifikus módok elsőbbséget élveznek a globális módokkal szemben.",
+			"global": {
+				"label": "Globális",
+				"description": "Minden munkaterületen elérhető"
+			},
+			"project": {
+				"label": "Projektspecifikus (.roomodes)",
+				"description": "Csak ebben a munkaterületben érhető el, elsőbbséget élvez a globálissal szemben"
+			}
+		},
+		"roleDefinition": {
+			"label": "Szerepkör meghatározása",
+			"description": "Határozza meg a Roo szakértelmét és személyiségét ehhez a módhoz."
+		},
+		"tools": {
+			"label": "Elérhető eszközök",
+			"description": "Válassza ki, mely eszközöket használhatja ez a mód."
+		},
+		"customInstructions": {
+			"label": "Egyéni utasítások (opcionális)",
+			"description": "Adjon hozzá viselkedési irányelveket ehhez a módhoz."
+		},
+		"buttons": {
+			"cancel": "Mégse",
+			"create": "Mód létrehozása"
+		},
+		"deleteMode": "Mód törlése"
+	},
+	"allFiles": "összes fájl"
+}
diff --git a/webview-ui/src/i18n/locales/it/prompts.json b/webview-ui/src/i18n/locales/it/prompts.json
new file mode 100644
index 0000000000..9fb6e60ef5
--- /dev/null
+++ b/webview-ui/src/i18n/locales/it/prompts.json
@@ -0,0 +1,140 @@
+{
+	"title": "Prompt",
+	"done": "Fatto",
+	"modes": {
+		"title": "Modalità",
+		"createNewMode": "Crea nuova modalità",
+		"editModesConfig": "Modifica configurazione modalità",
+		"editGlobalModes": "Modifica modalità globali",
+		"editProjectModes": "Modifica modalità di progetto (.roomodes)",
+		"createModeHelpText": "Clicca sul + per creare una nuova modalità personalizzata, o chiedi semplicemente a Roo nella chat di crearne una per te!"
+	},
+	"apiConfiguration": {
+		"title": "Configurazione API",
+		"select": "Seleziona quale configurazione API utilizzare per questa modalità"
+	},
+	"tools": {
+		"title": "Strumenti disponibili",
+		"builtInModesText": "Gli strumenti per le modalità integrate non possono essere modificati",
+		"editTools": "Modifica strumenti",
+		"doneEditing": "Modifica completata",
+		"allowedFiles": "File consentiti:"
+	},
+	"roleDefinition": {
+		"title": "Definizione del ruolo",
+		"resetToDefault": "Ripristina predefiniti",
+		"description": "Definisci l'esperienza e la personalità di Roo per questa modalità. Questa descrizione modella come Roo si presenta e affronta i compiti."
+	},
+	"customInstructions": {
+		"title": "Istruzioni personalizzate specifiche per la modalità (opzionale)",
+		"resetToDefault": "Ripristina predefiniti",
+		"description": "Aggiungi linee guida comportamentali specifiche per la modalità {{modeName}}.",
+		"loadFromFile": "Le istruzioni personalizzate specifiche per la modalità {{modeName}} possono essere caricate anche da .clinerules-{{modeSlug}} nel tuo spazio di lavoro."
+	},
+	"globalCustomInstructions": {
+		"title": "Istruzioni personalizzate per tutte le modalità",
+		"description": "Queste istruzioni si applicano a tutte le modalità. Forniscono un insieme base di comportamenti che possono essere migliorati dalle istruzioni specifiche per modalità qui sotto.\nSe desideri che Roo pensi e parli in una lingua diversa dalla lingua di visualizzazione del tuo editor ({{language}}), puoi specificarlo qui.",
+		"loadFromFile": "Le istruzioni possono essere caricate anche da .clinerules nel tuo spazio di lavoro."
+	},
+	"systemPrompt": {
+		"preview": "Anteprima prompt di sistema",
+		"copy": "Copia prompt di sistema negli appunti",
+		"title": "Prompt di sistema (modalità {{modeName}})"
+	},
+	"supportPrompts": {
+		"title": "Prompt di supporto",
+		"resetPrompt": "Ripristina il prompt {{promptType}} ai valori predefiniti",
+		"prompt": "Prompt",
+		"enhance": {
+			"apiConfiguration": "Configurazione API",
+			"apiConfigDescription": "Puoi selezionare una configurazione API da usare sempre per migliorare i prompt, o semplicemente usare quella attualmente selezionata",
+			"useCurrentConfig": "Usa la configurazione API attualmente selezionata",
+			"testPromptPlaceholder": "Inserisci un prompt per testare il miglioramento",
+			"previewButton": "Anteprima miglioramento prompt"
+		},
+		"types": {
+			"ENHANCE": {
+				"label": "Migliora prompt",
+				"description": "Utilizza il miglioramento dei prompt per ottenere suggerimenti o miglioramenti personalizzati per i tuoi input. Questo assicura che Roo comprenda la tua intenzione e fornisca le migliori risposte possibili. Disponibile tramite l'icona ✨ nella chat."
+			},
+			"EXPLAIN": {
+				"label": "Spiega codice",
+				"description": "Ottieni spiegazioni dettagliate di frammenti di codice, funzioni o file interi. Utile per comprendere codice complesso o imparare nuovi pattern. Disponibile nelle azioni di codice (icona della lampadina nell'editor) e nel menu contestuale dell'editor (clic destro sul codice selezionato)."
+			},
+			"FIX": {
+				"label": "Risolvi problemi",
+				"description": "Ottieni aiuto per identificare e risolvere bug, errori o problemi di qualità del codice. Fornisce una guida passo-passo per risolvere i problemi. Disponibile nelle azioni di codice (icona della lampadina nell'editor) e nel menu contestuale dell'editor (clic destro sul codice selezionato)."
+			},
+			"IMPROVE": {
+				"label": "Migliora codice",
+				"description": "Ricevi suggerimenti per l'ottimizzazione del codice, migliori pratiche e miglioramenti architetturali mantenendo la funzionalità. Disponibile nelle azioni di codice (icona della lampadina nell'editor) e nel menu contestuale dell'editor (clic destro sul codice selezionato)."
+			},
+			"ADD_TO_CONTEXT": {
+				"label": "Aggiungi al contesto",
+				"description": "Aggiungi contesto al tuo compito o conversazione attuale. Utile per fornire informazioni aggiuntive o chiarimenti. Disponibile nelle azioni di codice (icona della lampadina nell'editor) e nel menu contestuale dell'editor (clic destro sul codice selezionato)."
+			},
+			"TERMINAL_ADD_TO_CONTEXT": {
+				"label": "Aggiungi contenuto del terminale al contesto",
+				"description": "Aggiungi l'output del terminale al tuo compito o conversazione attuale. Utile per fornire output di comandi o log. Disponibile nel menu contestuale del terminale (clic destro sul contenuto selezionato del terminale)."
+			},
+			"TERMINAL_FIX": {
+				"label": "Correggi comando del terminale",
+				"description": "Ottieni aiuto per correggere i comandi del terminale che hanno fallito o necessitano di miglioramenti. Disponibile nel menu contestuale del terminale (clic destro sul contenuto selezionato del terminale)."
+			},
+			"TERMINAL_EXPLAIN": {
+				"label": "Spiega comando del terminale",
+				"description": "Ottieni spiegazioni dettagliate sui comandi del terminale e sui loro output. Disponibile nel menu contestuale del terminale (clic destro sul contenuto selezionato del terminale)."
+			}
+		}
+	},
+	"customModeCreation": {
+		"enableTitle": "Abilita creazione di modalità personalizzate tramite prompt",
+		"description": "Quando abilitato, Roo ti permette di creare modalità personalizzate usando prompt come 'Crea una modalità personalizzata che...'. Disabilitarlo riduce il tuo prompt di sistema di circa 700 token quando questa funzionalità non è necessaria. Quando disabilitato, puoi comunque creare manualmente modalità personalizzate usando il pulsante + sopra o modificando il JSON di configurazione correlato."
+	},
+	"advancedSystemPrompt": {
+		"title": "Avanzato: Sovrascrivi prompt di sistema",
+		"description": "Puoi sostituire completamente il prompt di sistema per questa modalità (a parte la definizione del ruolo e le istruzioni personalizzate) creando un file in .roo/system-prompt-{{modeSlug}} nel tuo spazio di lavoro. Questa è una funzionalità molto avanzata che bypassa le protezioni integrate e i controlli di coerenza (specialmente riguardo all'uso degli strumenti), quindi fai attenzione!"
+	},
+	"createModeDialog": {
+		"title": "Crea nuova modalità",
+		"close": "Chiudi",
+		"name": {
+			"label": "Nome",
+			"placeholder": "Inserisci nome modalità"
+		},
+		"slug": {
+			"label": "Slug",
+			"description": "Lo slug viene utilizzato negli URL e nei nomi dei file. Deve essere in minuscolo e contenere solo lettere, numeri e trattini."
+		},
+		"saveLocation": {
+			"label": "Posizione di salvataggio",
+			"description": "Scegli dove salvare questa modalità. Le modalità specifiche del progetto hanno la precedenza sulle modalità globali.",
+			"global": {
+				"label": "Globale",
+				"description": "Disponibile in tutti gli spazi di lavoro"
+			},
+			"project": {
+				"label": "Specifico del progetto (.roomodes)",
+				"description": "Disponibile solo in questo spazio di lavoro, ha la precedenza sul globale"
+			}
+		},
+		"roleDefinition": {
+			"label": "Definizione del ruolo",
+			"description": "Definisci l'esperienza e la personalità di Roo per questa modalità."
+		},
+		"tools": {
+			"label": "Strumenti disponibili",
+			"description": "Seleziona quali strumenti questa modalità può utilizzare."
+		},
+		"customInstructions": {
+			"label": "Istruzioni personalizzate (opzionale)",
+			"description": "Aggiungi linee guida comportamentali specifiche per questa modalità."
+		},
+		"buttons": {
+			"cancel": "Annulla",
+			"create": "Crea modalità"
+		},
+		"deleteMode": "Elimina modalità"
+	},
+	"allFiles": "tutti i file"
+}
diff --git a/webview-ui/src/i18n/locales/ja/prompts.json b/webview-ui/src/i18n/locales/ja/prompts.json
new file mode 100644
index 0000000000..495301f5fc
--- /dev/null
+++ b/webview-ui/src/i18n/locales/ja/prompts.json
@@ -0,0 +1,140 @@
+{
+	"title": "プロンプト",
+	"done": "完了",
+	"modes": {
+		"title": "モード",
+		"createNewMode": "新しいモードを作成",
+		"editModesConfig": "モード設定を編集",
+		"editGlobalModes": "グローバルモードを編集",
+		"editProjectModes": "プロジェクトモードを編集 (.roomodes)",
+		"createModeHelpText": "+ をクリックして新しいカスタムモードを作成するか、チャットで Roo に作成を依頼してください!"
+	},
+	"apiConfiguration": {
+		"title": "API設定",
+		"select": "このモードで使用するAPI設定を選択してください"
+	},
+	"tools": {
+		"title": "利用可能なツール",
+		"builtInModesText": "組み込みモードのツールは変更できません",
+		"editTools": "ツールを編集",
+		"doneEditing": "編集完了",
+		"allowedFiles": "許可されたファイル:"
+	},
+	"roleDefinition": {
+		"title": "役割の定義",
+		"resetToDefault": "デフォルトにリセット",
+		"description": "このモードのRooの専門知識と個性を定義します。この説明は、Rooが自身をどのように表現し、タスクにどのように取り組むかを形作ります。"
+	},
+	"customInstructions": {
+		"title": "モード固有のカスタム指示(オプション)",
+		"resetToDefault": "デフォルトにリセット",
+		"description": "{{modeName}}モードに特化した行動ガイドラインを追加します。",
+		"loadFromFile": "{{modeName}}モード固有のカスタム指示は、ワークスペースの.clinerules-{{modeSlug}}からも読み込めます。"
+	},
+	"globalCustomInstructions": {
+		"title": "すべてのモードのカスタム指示",
+		"description": "これらの指示はすべてのモードに適用されます。モード固有の指示で強化できる基本的な動作セットを提供します。\nRooにエディタの表示言語({{language}})とは異なる言語で考えたり話したりさせたい場合は、ここで指定できます。",
+		"loadFromFile": "指示はワークスペースの.clinerulesからも読み込めます。"
+	},
+	"systemPrompt": {
+		"preview": "システムプロンプトのプレビュー",
+		"copy": "システムプロンプトをクリップボードにコピー",
+		"title": "システムプロンプト({{modeName}}モード)"
+	},
+	"supportPrompts": {
+		"title": "サポートプロンプト",
+		"resetPrompt": "{{promptType}}プロンプトをデフォルトにリセット",
+		"prompt": "プロンプト",
+		"enhance": {
+			"apiConfiguration": "API設定",
+			"apiConfigDescription": "プロンプトの強化に常に使用するAPI設定を選択するか、現在選択されているものを使用できます",
+			"useCurrentConfig": "現在選択されているAPI設定を使用",
+			"testPromptPlaceholder": "強化をテストするプロンプトを入力してください",
+			"previewButton": "プロンプト強化のプレビュー"
+		},
+		"types": {
+			"ENHANCE": {
+				"label": "プロンプトを強化",
+				"description": "プロンプト強化を使用して、入力に合わせたカスタマイズされた提案や改善を得ることができます。これにより、Rooがあなたの意図を理解し、最適な回答を提供できます。チャットの✨アイコンから利用できます。"
+			},
+			"EXPLAIN": {
+				"label": "コードを説明",
+				"description": "コードスニペット、関数、またはファイル全体の詳細な説明を得ることができます。複雑なコードを理解したり、新しいパターンを学んだりするのに役立ちます。コードアクション(エディタの電球アイコン)やエディタのコンテキストメニュー(選択したコードで右クリック)から利用できます。"
+			},
+			"FIX": {
+				"label": "問題を修正",
+				"description": "バグ、エラー、コード品質の問題を特定して解決するための支援を受けることができます。問題を修正するためのステップバイステップのガイダンスを提供します。コードアクション(エディタの電球アイコン)やエディタのコンテキストメニュー(選択したコードで右クリック)から利用できます。"
+			},
+			"IMPROVE": {
+				"label": "コードを改善",
+				"description": "機能を維持しながらコードの最適化、より良い実践方法、アーキテクチャの改善に関する提案を受けることができます。コードアクション(エディタの電球アイコン)やエディタのコンテキストメニュー(選択したコードで右クリック)から利用できます。"
+			},
+			"ADD_TO_CONTEXT": {
+				"label": "コンテキストに追加",
+				"description": "現在のタスクや会話にコンテキストを追加します。追加情報や説明を提供するのに役立ちます。コードアクション(エディタの電球アイコン)やエディタのコンテキストメニュー(選択したコードで右クリック)から利用できます。"
+			},
+			"TERMINAL_ADD_TO_CONTEXT": {
+				"label": "ターミナルの内容をコンテキストに追加",
+				"description": "ターミナルの出力を現在のタスクや会話に追加します。コマンドの出力やログを提供するのに役立ちます。ターミナルのコンテキストメニュー(選択したターミナルの内容で右クリック)から利用できます。"
+			},
+			"TERMINAL_FIX": {
+				"label": "ターミナルコマンドを修正",
+				"description": "失敗したり改善が必要なターミナルコマンドの修正を支援します。ターミナルのコンテキストメニュー(選択したターミナルの内容で右クリック)から利用できます。"
+			},
+			"TERMINAL_EXPLAIN": {
+				"label": "ターミナルコマンドを説明",
+				"description": "ターミナルコマンドとその出力の詳細な説明を得ることができます。ターミナルのコンテキストメニュー(選択したターミナルの内容で右クリック)から利用できます。"
+			}
+		}
+	},
+	"customModeCreation": {
+		"enableTitle": "プロンプトを通じたカスタムモード作成を有効にする",
+		"description": "有効にすると、Rooは「~するカスタムモードを作成して」のようなプロンプトを使用してカスタムモードを作成できます。無効にすると、この機能が不要な場合、システムプロンプトが約700トークン削減されます。無効にしても、上記の+ボタンを使用するか、関連する設定JSONを編集して手動でカスタムモードを作成できます。"
+	},
+	"advancedSystemPrompt": {
+		"title": "詳細設定:システムプロンプトの上書き",
+		"description": "ワークスペースの.roo/system-prompt-{{modeSlug}}にファイルを作成することで、このモードのシステムプロンプト(役割定義とカスタム指示以外)を完全に置き換えることができます。これは組み込みの安全対策と一貫性チェック(特にツールの使用に関して)をバイパスする非常に高度な機能なので、注意して使用してください!"
+	},
+	"createModeDialog": {
+		"title": "新しいモードを作成",
+		"close": "閉じる",
+		"name": {
+			"label": "名前",
+			"placeholder": "モード名を入力"
+		},
+		"slug": {
+			"label": "スラッグ",
+			"description": "スラッグはURLやファイル名で使用されます。小文字で、文字、数字、ハイフンのみを含める必要があります。"
+		},
+		"saveLocation": {
+			"label": "保存場所",
+			"description": "このモードの保存場所を選択してください。プロジェクト固有のモードはグローバルモードよりも優先されます。",
+			"global": {
+				"label": "グローバル",
+				"description": "すべてのワークスペースで利用可能"
+			},
+			"project": {
+				"label": "プロジェクト固有 (.roomodes)",
+				"description": "このワークスペースでのみ使用可能、グローバルよりも優先"
+			}
+		},
+		"roleDefinition": {
+			"label": "役割の定義",
+			"description": "このモードのRooの専門知識と個性を定義します。"
+		},
+		"tools": {
+			"label": "利用可能なツール",
+			"description": "このモードが使用できるツールを選択します。"
+		},
+		"customInstructions": {
+			"label": "カスタム指示(オプション)",
+			"description": "このモードに特化した行動ガイドラインを追加します。"
+		},
+		"buttons": {
+			"cancel": "キャンセル",
+			"create": "モードを作成"
+		},
+		"deleteMode": "モードを削除"
+	},
+	"allFiles": "すべてのファイル"
+}
diff --git a/webview-ui/src/i18n/locales/ko/prompts.json b/webview-ui/src/i18n/locales/ko/prompts.json
new file mode 100644
index 0000000000..2ab4daf304
--- /dev/null
+++ b/webview-ui/src/i18n/locales/ko/prompts.json
@@ -0,0 +1,140 @@
+{
+	"title": "프롬프트",
+	"done": "완료",
+	"modes": {
+		"title": "모드",
+		"createNewMode": "새 모드 만들기",
+		"editModesConfig": "모드 구성 편집",
+		"editGlobalModes": "전역 모드 편집",
+		"editProjectModes": "프로젝트 모드 편집 (.roomodes)",
+		"createModeHelpText": "새 커스텀 모드를 만들려면 + 버튼을 클릭하거나, 채팅에서 Roo에게 만들어달라고 요청하세요!"
+	},
+	"apiConfiguration": {
+		"title": "API 구성",
+		"select": "이 모드에 사용할 API 구성 선택"
+	},
+	"tools": {
+		"title": "사용 가능한 도구",
+		"builtInModesText": "내장 모드용 도구는 수정할 수 없습니다",
+		"editTools": "도구 편집",
+		"doneEditing": "편집 완료",
+		"allowedFiles": "허용된 파일:"
+	},
+	"roleDefinition": {
+		"title": "역할 정의",
+		"resetToDefault": "기본값으로 재설정",
+		"description": "이 모드에 대한 Roo의 전문성과 성격을 정의하세요. 이 설명은 Roo가 자신을 어떻게 표현하고 작업에 접근하는지 형성합니다."
+	},
+	"customInstructions": {
+		"title": "모드별 사용자 지정 지침 (선택 사항)",
+		"resetToDefault": "기본값으로 재설정",
+		"description": "{{modeName}} 모드에 대한 특정 행동 지침을 추가하세요.",
+		"loadFromFile": "{{modeName}} 모드에 대한 사용자 지정 지침은 작업 공간의 .clinerules-{{modeSlug}}에서도 로드할 수 있습니다."
+	},
+	"globalCustomInstructions": {
+		"title": "모든 모드에 대한 사용자 지정 지침",
+		"description": "이 지침은 모든 모드에 적용됩니다. 아래의 모드별 지침으로 향상될 수 있는 기본 동작 세트를 제공합니다.\nRoo가 에디터 표시 언어({{language}})와 다른 언어로 생각하고 말하기를 원하시면, 여기에 지정할 수 있습니다.",
+		"loadFromFile": "지침은 작업 공간의 .clinerules에서도 로드할 수 있습니다."
+	},
+	"systemPrompt": {
+		"preview": "시스템 프롬프트 미리보기",
+		"copy": "시스템 프롬프트를 클립보드에 복사",
+		"title": "시스템 프롬프트 ({{modeName}} 모드)"
+	},
+	"supportPrompts": {
+		"title": "지원 프롬프트",
+		"resetPrompt": "{{promptType}} 프롬프트를 기본값으로 재설정",
+		"prompt": "프롬프트",
+		"enhance": {
+			"apiConfiguration": "API 구성",
+			"apiConfigDescription": "프롬프트 향상에 항상 사용할 API 구성을 선택하거나, 현재 선택된 구성을 사용할 수 있습니다",
+			"useCurrentConfig": "현재 선택된 API 구성 사용",
+			"testPromptPlaceholder": "향상을 테스트할 프롬프트 입력",
+			"previewButton": "프롬프트 향상 미리보기"
+		},
+		"types": {
+			"ENHANCE": {
+				"label": "프롬프트 향상",
+				"description": "입력에 맞춤화된 제안이나 개선을 얻기 위해 프롬프트 향상을 사용하세요. 이를 통해 Roo가 의도를 이해하고 최상의 응답을 제공할 수 있습니다. 채팅에서 ✨ 아이콘을 통해 이용 가능합니다."
+			},
+			"EXPLAIN": {
+				"label": "코드 설명",
+				"description": "코드 스니펫, 함수 또는 전체 파일에 대한 상세한 설명을 얻을 수 있습니다. 복잡한 코드를 이해하거나 새로운 패턴을 배우는 데 유용합니다. 코드 액션(에디터의 전구 아이콘)과 에디터 컨텍스트 메뉴(선택한 코드에서 우클릭)에서 이용 가능합니다."
+			},
+			"FIX": {
+				"label": "문제 해결",
+				"description": "버그, 오류 또는 코드 품질 문제를 식별하고 해결하는 데 도움을 받을 수 있습니다. 문제 해결을 위한 단계별 안내를 제공합니다. 코드 액션(에디터의 전구 아이콘)과 에디터 컨텍스트 메뉴(선택한 코드에서 우클릭)에서 이용 가능합니다."
+			},
+			"IMPROVE": {
+				"label": "코드 개선",
+				"description": "기능을 유지하면서 코드 최적화, 더 나은 관행 및 아키텍처 개선에 대한 제안을 받을 수 있습니다. 코드 액션(에디터의 전구 아이콘)과 에디터 컨텍스트 메뉴(선택한 코드에서 우클릭)에서 이용 가능합니다."
+			},
+			"ADD_TO_CONTEXT": {
+				"label": "컨텍스트에 추가",
+				"description": "현재 작업이나 대화에 컨텍스트를 추가합니다. 추가 정보나 명확한 설명을 제공하는 데 유용합니다. 코드 액션(에디터의 전구 아이콘)과 에디터 컨텍스트 메뉴(선택한 코드에서 우클릭)에서 이용 가능합니다."
+			},
+			"TERMINAL_ADD_TO_CONTEXT": {
+				"label": "터미널 콘텐츠를 컨텍스트에 추가",
+				"description": "현재 작업이나 대화에 터미널 출력을 추가합니다. 명령 출력이나 로그를 제공하는 데 유용합니다. 터미널 컨텍스트 메뉴(선택한 터미널 콘텐츠에서 우클릭)에서 이용 가능합니다."
+			},
+			"TERMINAL_FIX": {
+				"label": "터미널 명령 수정",
+				"description": "실패했거나 개선이 필요한 터미널 명령을 수정하는 데 도움을 받을 수 있습니다. 터미널 컨텍스트 메뉴(선택한 터미널 콘텐츠에서 우클릭)에서 이용 가능합니다."
+			},
+			"TERMINAL_EXPLAIN": {
+				"label": "터미널 명령 설명",
+				"description": "터미널 명령과 그 출력에 대한 상세한 설명을 얻을 수 있습니다. 터미널 컨텍스트 메뉴(선택한 터미널 콘텐츠에서 우클릭)에서 이용 가능합니다."
+			}
+		}
+	},
+	"customModeCreation": {
+		"enableTitle": "프롬프트를 통한 커스텀 모드 생성 활성화",
+		"description": "활성화하면 Roo를 통해 '...하는 커스텀 모드를 만들어줘'와 같은 프롬프트를 사용하여 커스텀 모드를 생성할 수 있습니다. 이 기능이 필요하지 않을 때 비활성화하면 시스템 프롬프트가 약 700 token 감소합니다. 비활성화해도 위의 + 버튼을 사용하거나 관련 구성 JSON을 편집하여 수동으로 커스텀 모드를 생성할 수 있습니다."
+	},
+	"advancedSystemPrompt": {
+		"title": "고급: 시스템 프롬프트 재정의",
+		"description": "작업 공간의 .roo/system-prompt-{{modeSlug}}에 파일을 생성하여 이 모드의 시스템 프롬프트(역할 정의 및 사용자 지정 지침 제외)를 완전히 대체할 수 있습니다. 이는 내장된 안전 장치와 일관성 검사(특히 도구 사용 관련)를 우회하는 매우 고급 기능이므로 주의하세요!"
+	},
+	"createModeDialog": {
+		"title": "새 모드 만들기",
+		"close": "닫기",
+		"name": {
+			"label": "이름",
+			"placeholder": "모드 이름 입력"
+		},
+		"slug": {
+			"label": "슬러그",
+			"description": "슬러그는 URL 및 파일 이름에 사용됩니다. 소문자여야 하며 문자, 숫자 및 하이픈만 포함해야 합니다."
+		},
+		"saveLocation": {
+			"label": "저장 위치",
+			"description": "이 모드를 저장할 위치를 선택하세요. 프로젝트별 모드는 전역 모드보다 우선합니다.",
+			"global": {
+				"label": "전역",
+				"description": "모든 작업 공간에서 사용 가능"
+			},
+			"project": {
+				"label": "프로젝트별 (.roomodes)",
+				"description": "이 작업 공간에서만 사용 가능, 전역보다 우선"
+			}
+		},
+		"roleDefinition": {
+			"label": "역할 정의",
+			"description": "이 모드에 대한 Roo의 전문성과 성격을 정의하세요."
+		},
+		"tools": {
+			"label": "사용 가능한 도구",
+			"description": "이 모드가 사용할 수 있는 도구를 선택하세요."
+		},
+		"customInstructions": {
+			"label": "사용자 지정 지침 (선택 사항)",
+			"description": "이 모드에 대한 특정 행동 지침을 추가하세요."
+		},
+		"buttons": {
+			"cancel": "취소",
+			"create": "모드 만들기"
+		},
+		"deleteMode": "모드 삭제"
+	},
+	"allFiles": "모든 파일"
+}
diff --git a/webview-ui/src/i18n/locales/pl/prompts.json b/webview-ui/src/i18n/locales/pl/prompts.json
new file mode 100644
index 0000000000..502d221018
--- /dev/null
+++ b/webview-ui/src/i18n/locales/pl/prompts.json
@@ -0,0 +1,140 @@
+{
+	"title": "Podpowiedzi",
+	"done": "Gotowe",
+	"modes": {
+		"title": "Tryby",
+		"createNewMode": "Utwórz nowy tryb",
+		"editModesConfig": "Edytuj konfigurację trybów",
+		"editGlobalModes": "Edytuj tryby globalne",
+		"editProjectModes": "Edytuj tryby projektu (.roomodes)",
+		"createModeHelpText": "Kliknij +, aby utworzyć nowy niestandardowy tryb, lub po prostu poproś Roo w czacie, aby utworzył go dla Ciebie!"
+	},
+	"apiConfiguration": {
+		"title": "Konfiguracja API",
+		"select": "Wybierz, której konfiguracji API użyć dla tego trybu"
+	},
+	"tools": {
+		"title": "Dostępne narzędzia",
+		"builtInModesText": "Narzędzia dla wbudowanych trybów nie mogą być modyfikowane",
+		"editTools": "Edytuj narzędzia",
+		"doneEditing": "Zakończ edycję",
+		"allowedFiles": "Dozwolone pliki:"
+	},
+	"roleDefinition": {
+		"title": "Definicja roli",
+		"resetToDefault": "Przywróć domyślne",
+		"description": "Zdefiniuj wiedzę specjalistyczną i osobowość Roo dla tego trybu. Ten opis kształtuje, jak Roo prezentuje się i podchodzi do zadań."
+	},
+	"customInstructions": {
+		"title": "Niestandardowe instrukcje dla trybu (opcjonalne)",
+		"resetToDefault": "Przywróć domyślne",
+		"description": "Dodaj wytyczne dotyczące zachowania specyficzne dla trybu {{modeName}}.",
+		"loadFromFile": "Niestandardowe instrukcje dla trybu {{modeName}} mogą być również ładowane z .clinerules-{{modeSlug}} w Twoim obszarze roboczym."
+	},
+	"globalCustomInstructions": {
+		"title": "Niestandardowe instrukcje dla wszystkich trybów",
+		"description": "Te instrukcje dotyczą wszystkich trybów. Zapewniają podstawowy zestaw zachowań, które mogą być rozszerzone przez instrukcje specyficzne dla trybów poniżej.\nJeśli chcesz, aby Roo myślał i mówił w języku innym niż język wyświetlania Twojego edytora ({{language}}), możesz to określić tutaj.",
+		"loadFromFile": "Instrukcje mogą być również ładowane z .clinerules w Twoim obszarze roboczym."
+	},
+	"systemPrompt": {
+		"preview": "Podgląd podpowiedzi systemowej",
+		"copy": "Kopiuj podpowiedź systemową do schowka",
+		"title": "Podpowiedź systemowa (tryb {{modeName}})"
+	},
+	"supportPrompts": {
+		"title": "Podpowiedzi pomocnicze",
+		"resetPrompt": "Zresetuj podpowiedź {{promptType}} do domyślnej",
+		"prompt": "Podpowiedź",
+		"enhance": {
+			"apiConfiguration": "Konfiguracja API",
+			"apiConfigDescription": "Możesz wybrać konfigurację API, która będzie zawsze używana do ulepszania podpowiedzi, lub po prostu użyć aktualnie wybranej",
+			"useCurrentConfig": "Użyj aktualnie wybranej konfiguracji API",
+			"testPromptPlaceholder": "Wprowadź podpowiedź, aby przetestować ulepszenie",
+			"previewButton": "Podgląd ulepszenia podpowiedzi"
+		},
+		"types": {
+			"ENHANCE": {
+				"label": "Ulepsz podpowiedź",
+				"description": "Użyj ulepszenia podpowiedzi, aby uzyskać dostosowane sugestie lub ulepszenia dla swoich danych wejściowych. Zapewnia to, że Roo rozumie Twoje intencje i dostarcza najlepsze możliwe odpowiedzi. Dostępne za pośrednictwem ikony ✨ w czacie."
+			},
+			"EXPLAIN": {
+				"label": "Wyjaśnij kod",
+				"description": "Uzyskaj szczegółowe wyjaśnienia fragmentów kodu, funkcji lub całych plików. Przydatne do zrozumienia złożonego kodu lub nauki nowych wzorców. Dostępne w akcjach kodu (ikona żarówki w edytorze) i w menu kontekstowym edytora (prawy przycisk myszy na wybranym kodzie)."
+			},
+			"FIX": {
+				"label": "Napraw problemy",
+				"description": "Uzyskaj pomoc w identyfikowaniu i rozwiązywaniu błędów, usterek lub problemów z jakością kodu. Zapewnia krok po kroku wskazówki do naprawy problemów. Dostępne w akcjach kodu (ikona żarówki w edytorze) i w menu kontekstowym edytora (prawy przycisk myszy na wybranym kodzie)."
+			},
+			"IMPROVE": {
+				"label": "Ulepsz kod",
+				"description": "Otrzymuj sugestie dotyczące optymalizacji kodu, lepszych praktyk i ulepszeń architektonicznych przy zachowaniu funkcjonalności. Dostępne w akcjach kodu (ikona żarówki w edytorze) i w menu kontekstowym edytora (prawy przycisk myszy na wybranym kodzie)."
+			},
+			"ADD_TO_CONTEXT": {
+				"label": "Dodaj do kontekstu",
+				"description": "Dodaj kontekst do bieżącego zadania lub rozmowy. Przydatne do dostarczania dodatkowych informacji lub wyjaśnień. Dostępne w akcjach kodu (ikona żarówki w edytorze) i w menu kontekstowym edytora (prawy przycisk myszy na wybranym kodzie)."
+			},
+			"TERMINAL_ADD_TO_CONTEXT": {
+				"label": "Dodaj zawartość terminala do kontekstu",
+				"description": "Dodaj wyjście terminala do bieżącego zadania lub rozmowy. Przydatne do dostarczania wyników poleceń lub logów. Dostępne w menu kontekstowym terminala (prawy przycisk myszy na wybranej zawartości terminala)."
+			},
+			"TERMINAL_FIX": {
+				"label": "Napraw polecenie terminala",
+				"description": "Uzyskaj pomoc w naprawianiu poleceń terminala, które zawiodły lub wymagają ulepszeń. Dostępne w menu kontekstowym terminala (prawy przycisk myszy na wybranej zawartości terminala)."
+			},
+			"TERMINAL_EXPLAIN": {
+				"label": "Wyjaśnij polecenie terminala",
+				"description": "Uzyskaj szczegółowe wyjaśnienia poleceń terminala i ich wyników. Dostępne w menu kontekstowym terminala (prawy przycisk myszy na wybranej zawartości terminala)."
+			}
+		}
+	},
+	"customModeCreation": {
+		"enableTitle": "Włącz tworzenie niestandardowych trybów przez podpowiedzi",
+		"description": "Gdy włączone, Roo pozwala na tworzenie niestandardowych trybów za pomocą podpowiedzi takich jak 'Stwórz dla mnie niestandardowy tryb, który...'. Wyłączenie tej opcji zmniejsza podpowiedź systemową o około 700 tokenów, gdy ta funkcja nie jest potrzebna. Po wyłączeniu nadal możesz ręcznie tworzyć niestandardowe tryby za pomocą przycisku + powyżej lub edytując powiązany plik konfiguracyjny JSON."
+	},
+	"advancedSystemPrompt": {
+		"title": "Zaawansowane: Zastąp podpowiedź systemową",
+		"description": "Możesz całkowicie zastąpić podpowiedź systemową dla tego trybu (oprócz definicji roli i niestandardowych instrukcji) poprzez utworzenie pliku w .roo/system-prompt-{{modeSlug}} w swoim obszarze roboczym. Jest to bardzo zaawansowana funkcja, która omija wbudowane zabezpieczenia i kontrole spójności (szczególnie wokół używania narzędzi), więc bądź ostrożny!"
+	},
+	"createModeDialog": {
+		"title": "Utwórz nowy tryb",
+		"close": "Zamknij",
+		"name": {
+			"label": "Nazwa",
+			"placeholder": "Wprowadź nazwę trybu"
+		},
+		"slug": {
+			"label": "Slug",
+			"description": "Slug jest używany w adresach URL i nazwach plików. Powinien być małymi literami i zawierać tylko litery, cyfry i myślniki."
+		},
+		"saveLocation": {
+			"label": "Lokalizacja zapisu",
+			"description": "Wybierz, gdzie zapisać ten tryb. Tryby specyficzne dla projektu mają pierwszeństwo przed trybami globalnymi.",
+			"global": {
+				"label": "Globalny",
+				"description": "Dostępny we wszystkich obszarach roboczych"
+			},
+			"project": {
+				"label": "Specyficzny dla projektu (.roomodes)",
+				"description": "Dostępny tylko w tym obszarze roboczym, ma pierwszeństwo przed globalnym"
+			}
+		},
+		"roleDefinition": {
+			"label": "Definicja roli",
+			"description": "Zdefiniuj wiedzę specjalistyczną i osobowość Roo dla tego trybu."
+		},
+		"tools": {
+			"label": "Dostępne narzędzia",
+			"description": "Wybierz, których narzędzi może używać ten tryb."
+		},
+		"customInstructions": {
+			"label": "Niestandardowe instrukcje (opcjonalne)",
+			"description": "Dodaj wytyczne dotyczące zachowania specyficzne dla tego trybu."
+		},
+		"buttons": {
+			"cancel": "Anuluj",
+			"create": "Utwórz tryb"
+		},
+		"deleteMode": "Usuń tryb"
+	},
+	"allFiles": "wszystkie pliki"
+}
diff --git a/webview-ui/src/i18n/locales/pt-BR/prompts.json b/webview-ui/src/i18n/locales/pt-BR/prompts.json
new file mode 100644
index 0000000000..3b72e0c6b7
--- /dev/null
+++ b/webview-ui/src/i18n/locales/pt-BR/prompts.json
@@ -0,0 +1,106 @@
+{
+	"title": "Prompts",
+	"done": "Concluído",
+	"modes": {
+		"title": "Modos",
+		"createNewMode": "Criar novo modo",
+		"editModesConfig": "Editar configuração de modos",
+		"editGlobalModes": "Editar modos globais",
+		"editProjectModes": "Editar modos do projeto (.roomodes)",
+		"createModeHelpText": "Clique em + para criar um novo modo personalizado, ou simplesmente peça ao Roo no chat para criar um para você!"
+	},
+	"apiConfiguration": {
+		"title": "Configuração de API",
+		"select": "Selecione qual configuração de API usar para este modo"
+	},
+	"tools": {
+		"title": "Ferramentas disponíveis",
+		"builtInModesText": "Ferramentas para modos integrados não podem ser modificadas",
+		"editTools": "Editar ferramentas",
+		"doneEditing": "Concluir edição",
+		"allowedFiles": "Arquivos permitidos:"
+	},
+	"roleDefinition": {
+		"title": "Definição de função",
+		"resetToDefault": "Restaurar para padrão",
+		"description": "Defina a expertise e personalidade do Roo para este modo. Esta descrição molda como o Roo se apresenta e aborda tarefas."
+	},
+	"customInstructions": {
+		"title": "Instruções personalizadas específicas do modo (opcional)",
+		"resetToDefault": "Restaurar para padrão",
+		"description": "Adicione diretrizes comportamentais específicas para o modo {{modeName}}.",
+		"loadFromFile": "Instruções personalizadas específicas para o modo {{modeName}} também podem ser carregadas de .clinerules-{{modeSlug}} no seu espaço de trabalho."
+	},
+	"globalCustomInstructions": {
+		"title": "Instruções personalizadas para todos os modos",
+		"description": "Estas instruções se aplicam a todos os modos. Elas fornecem um conjunto base de comportamentos que podem ser aprimorados por instruções específicas do modo abaixo.\nSe você desejar que o Roo pense e fale em um idioma diferente do idioma de exibição do seu editor ({{language}}), você pode especificá-lo aqui.",
+		"loadFromFile": "As instruções também podem ser carregadas de .clinerules no seu espaço de trabalho."
+	},
+	"systemPrompt": {
+		"preview": "Visualizar prompt do sistema",
+		"copy": "Copiar prompt do sistema para a área de transferência",
+		"title": "Prompt do sistema (modo {{modeName}})"
+	},
+	"supportPrompts": {
+		"title": "Prompts de suporte",
+		"resetPrompt": "Restaurar prompt {{promptType}} para padrão",
+		"prompt": "Prompt",
+		"enhance": {
+			"apiConfiguration": "Configuração de API",
+			"apiConfigDescription": "Você pode selecionar uma configuração de API para usar sempre para aprimorar prompts, ou simplesmente usar a que está atualmente selecionada",
+			"useCurrentConfig": "Usar configuração de API atualmente selecionada",
+			"testPromptPlaceholder": "Digite um prompt para testar o aprimoramento",
+			"previewButton": "Visualizar aprimoramento do prompt"
+		}
+	},
+	"customModeCreation": {
+		"enableTitle": "Ativar criação de modo personalizado através de prompts",
+		"description": "Quando ativado, o Roo permite que você crie modos personalizados usando prompts como 'Crie para mim um modo personalizado que...'. Desativar isto reduz seu prompt de sistema em cerca de 700 tokens quando esta funcionalidade não é necessária. Quando desativado, você ainda pode criar modos personalizados manualmente usando o botão + acima ou editando o JSON de configuração relacionado."
+	},
+	"advancedSystemPrompt": {
+		"title": "Avançado: Substituir prompt do sistema",
+		"description": "Você pode substituir completamente o prompt do sistema para este modo (além da definição de função e instruções personalizadas) criando um arquivo em .roo/system-prompt-{{modeSlug}} no seu espaço de trabalho. Esta é uma funcionalidade muito avançada que contorna as salvaguardas integradas e verificações de consistência (especialmente em torno do uso de ferramentas), então tenha cuidado!"
+	},
+	"createModeDialog": {
+		"title": "Criar novo modo",
+		"close": "Fechar",
+		"name": {
+			"label": "Nome",
+			"placeholder": "Digite o nome do modo"
+		},
+		"slug": {
+			"label": "Slug",
+			"description": "O slug é usado em URLs e nomes de arquivos. Deve estar em minúsculas e conter apenas letras, números e hífens."
+		},
+		"saveLocation": {
+			"label": "Local de salvamento",
+			"description": "Escolha onde salvar este modo. Os modos específicos do projeto têm precedência sobre os modos globais.",
+			"global": {
+				"label": "Global",
+				"description": "Disponível em todos os espaços de trabalho"
+			},
+			"project": {
+				"label": "Específico do projeto (.roomodes)",
+				"description": "Disponível apenas neste espaço de trabalho, tem precedência sobre o global"
+			}
+		},
+		"roleDefinition": {
+			"label": "Definição de função",
+			"description": "Defina a expertise e personalidade do Roo para este modo."
+		},
+		"tools": {
+			"label": "Ferramentas disponíveis",
+			"description": "Selecione quais ferramentas este modo pode usar."
+		},
+		"customInstructions": {
+			"label": "Instruções personalizadas (opcional)",
+			"description": "Adicione diretrizes comportamentais específicas para este modo."
+		},
+		"buttons": {
+			"cancel": "Cancelar",
+			"create": "Criar modo"
+		},
+		"deleteMode": "Excluir modo"
+	},
+	"allFiles": "todos os arquivos"
+}
diff --git a/webview-ui/src/i18n/locales/pt/prompts.json b/webview-ui/src/i18n/locales/pt/prompts.json
new file mode 100644
index 0000000000..d66ddbac4a
--- /dev/null
+++ b/webview-ui/src/i18n/locales/pt/prompts.json
@@ -0,0 +1,140 @@
+{
+	"title": "Prompts",
+	"done": "Concluído",
+	"modes": {
+		"title": "Modos",
+		"createNewMode": "Criar novo modo",
+		"editModesConfig": "Editar configuração de modos",
+		"editGlobalModes": "Editar modos globais",
+		"editProjectModes": "Editar modos do projeto (.roomodes)",
+		"createModeHelpText": "Clique em + para criar um novo modo personalizado, ou simplesmente peça ao Roo no chat para criar um para você!"
+	},
+	"apiConfiguration": {
+		"title": "Configuração de API",
+		"select": "Selecione qual configuração de API usar para este modo"
+	},
+	"tools": {
+		"title": "Ferramentas disponíveis",
+		"builtInModesText": "Ferramentas para modos integrados não podem ser modificadas",
+		"editTools": "Editar ferramentas",
+		"doneEditing": "Concluir edição",
+		"allowedFiles": "Arquivos permitidos:"
+	},
+	"roleDefinition": {
+		"title": "Definição de função",
+		"resetToDefault": "Restaurar para padrão",
+		"description": "Defina a expertise e personalidade do Roo para este modo. Esta descrição molda como o Roo se apresenta e aborda tarefas."
+	},
+	"customInstructions": {
+		"title": "Instruções personalizadas específicas do modo (opcional)",
+		"resetToDefault": "Restaurar para padrão",
+		"description": "Adicione diretrizes comportamentais específicas para o modo {{modeName}}.",
+		"loadFromFile": "Instruções personalizadas específicas para o modo {{modeName}} também podem ser carregadas de .clinerules-{{modeSlug}} no seu espaço de trabalho."
+	},
+	"globalCustomInstructions": {
+		"title": "Instruções personalizadas para todos os modos",
+		"description": "Estas instruções se aplicam a todos os modos. Elas fornecem um conjunto base de comportamentos que podem ser aprimorados por instruções específicas do modo abaixo.\nSe você desejar que o Roo pense e fale em um idioma diferente do idioma de exibição do seu editor ({{language}}), você pode especificá-lo aqui.",
+		"loadFromFile": "As instruções também podem ser carregadas de .clinerules no seu espaço de trabalho."
+	},
+	"systemPrompt": {
+		"preview": "Visualizar prompt do sistema",
+		"copy": "Copiar prompt do sistema para a área de transferência",
+		"title": "Prompt do sistema (modo {{modeName}})"
+	},
+	"supportPrompts": {
+		"title": "Prompts de suporte",
+		"resetPrompt": "Restaurar prompt {{promptType}} para padrão",
+		"prompt": "Prompt",
+		"enhance": {
+			"apiConfiguration": "Configuração de API",
+			"apiConfigDescription": "Você pode selecionar uma configuração de API para usar sempre para aprimorar prompts, ou simplesmente usar a que está atualmente selecionada",
+			"useCurrentConfig": "Usar configuração de API atualmente selecionada",
+			"testPromptPlaceholder": "Digite um prompt para testar o aprimoramento",
+			"previewButton": "Visualizar aprimoramento do prompt"
+		},
+		"types": {
+			"ENHANCE": {
+				"label": "Aprimorar Prompt",
+				"description": "Use aprimoramento de prompt para obter sugestões ou melhorias personalizadas para suas entradas. Isso garante que o Roo entenda sua intenção e forneça as melhores respostas possíveis. Disponível através do ícone ✨ no chat."
+			},
+			"EXPLAIN": {
+				"label": "Explicar Código",
+				"description": "Obtenha explicações detalhadas de trechos de código, funções ou arquivos inteiros. Útil para entender código complexo ou aprender novos padrões. Disponível em ações de código (ícone de lâmpada no editor) e no menu de contexto do editor (clique com o botão direito no código selecionado)."
+			},
+			"FIX": {
+				"label": "Corrigir Problemas",
+				"description": "Obtenha ajuda para identificar e resolver bugs, erros ou problemas de qualidade de código. Fornece orientação passo a passo para corrigir problemas. Disponível em ações de código (ícone de lâmpada no editor) e no menu de contexto do editor (clique com o botão direito no código selecionado)."
+			},
+			"IMPROVE": {
+				"label": "Melhorar Código",
+				"description": "Receba sugestões para otimização de código, melhores práticas e melhorias arquitetônicas mantendo a funcionalidade. Disponível em ações de código (ícone de lâmpada no editor) e no menu de contexto do editor (clique com o botão direito no código selecionado)."
+			},
+			"ADD_TO_CONTEXT": {
+				"label": "Adicionar ao Contexto",
+				"description": "Adicione contexto à sua tarefa ou conversa atual. Útil para fornecer informações adicionais ou esclarecimentos. Disponível em ações de código (ícone de lâmpada no editor) e no menu de contexto do editor (clique com o botão direito no código selecionado)."
+			},
+			"TERMINAL_ADD_TO_CONTEXT": {
+				"label": "Adicionar Conteúdo do Terminal ao Contexto",
+				"description": "Adicione a saída do terminal à sua tarefa ou conversa atual. Útil para fornecer saídas de comandos ou logs. Disponível no menu de contexto do terminal (clique com o botão direito no conteúdo selecionado do terminal)."
+			},
+			"TERMINAL_FIX": {
+				"label": "Corrigir Comando do Terminal",
+				"description": "Obtenha ajuda para corrigir comandos do terminal que falharam ou precisam de melhorias. Disponível no menu de contexto do terminal (clique com o botão direito no conteúdo selecionado do terminal)."
+			},
+			"TERMINAL_EXPLAIN": {
+				"label": "Explicar Comando do Terminal",
+				"description": "Obtenha explicações detalhadas de comandos do terminal e suas saídas. Disponível no menu de contexto do terminal (clique com o botão direito no conteúdo selecionado do terminal)."
+			}
+		}
+	},
+	"customModeCreation": {
+		"enableTitle": "Ativar criação de modo personalizado através de prompts",
+		"description": "Quando ativado, o Roo permite que você crie modos personalizados usando prompts como 'Crie para mim um modo personalizado que...'. Desativar isto reduz seu prompt de sistema em cerca de 700 tokens quando esta funcionalidade não é necessária. Quando desativado, você ainda pode criar modos personalizados manualmente usando o botão + acima ou editando o JSON de configuração relacionado."
+	},
+	"advancedSystemPrompt": {
+		"title": "Avançado: Substituir prompt do sistema",
+		"description": "Você pode substituir completamente o prompt do sistema para este modo (além da definição de função e instruções personalizadas) criando um arquivo em .roo/system-prompt-{{modeSlug}} no seu espaço de trabalho. Esta é uma funcionalidade muito avançada que contorna as salvaguardas integradas e verificações de consistência (especialmente em torno do uso de ferramentas), então tenha cuidado!"
+	},
+	"createModeDialog": {
+		"title": "Criar novo modo",
+		"close": "Fechar",
+		"name": {
+			"label": "Nome",
+			"placeholder": "Digite o nome do modo"
+		},
+		"slug": {
+			"label": "Slug",
+			"description": "O slug é usado em URLs e nomes de arquivos. Deve estar em minúsculas e conter apenas letras, números e hífens."
+		},
+		"saveLocation": {
+			"label": "Local de salvamento",
+			"description": "Escolha onde salvar este modo. Os modos específicos do projeto têm precedência sobre os modos globais.",
+			"global": {
+				"label": "Global",
+				"description": "Disponível em todos os espaços de trabalho"
+			},
+			"project": {
+				"label": "Específico do projeto (.roomodes)",
+				"description": "Disponível apenas neste espaço de trabalho, tem precedência sobre o global"
+			}
+		},
+		"roleDefinition": {
+			"label": "Definição de função",
+			"description": "Defina a expertise e personalidade do Roo para este modo."
+		},
+		"tools": {
+			"label": "Ferramentas disponíveis",
+			"description": "Selecione quais ferramentas este modo pode usar."
+		},
+		"customInstructions": {
+			"label": "Instruções personalizadas (opcional)",
+			"description": "Adicione diretrizes comportamentais específicas para este modo."
+		},
+		"buttons": {
+			"cancel": "Cancelar",
+			"create": "Criar modo"
+		},
+		"deleteMode": "Excluir modo"
+	},
+	"allFiles": "todos os arquivos"
+}
diff --git a/webview-ui/src/i18n/locales/ru/prompts.json b/webview-ui/src/i18n/locales/ru/prompts.json
new file mode 100644
index 0000000000..6b6e98a70d
--- /dev/null
+++ b/webview-ui/src/i18n/locales/ru/prompts.json
@@ -0,0 +1,106 @@
+{
+	"title": "Промпты",
+	"done": "Готово",
+	"modes": {
+		"title": "Режимы",
+		"createNewMode": "Создать новый режим",
+		"editModesConfig": "Редактировать конфигурацию режимов",
+		"editGlobalModes": "Редактировать глобальные режимы",
+		"editProjectModes": "Редактировать режимы проекта (.roomodes)",
+		"createModeHelpText": "Нажмите +, чтобы создать новый пользовательский режим, или просто попросите Roo в чате создать его для вас!"
+	},
+	"apiConfiguration": {
+		"title": "Конфигурация API",
+		"select": "Выберите, какую конфигурацию API использовать для этого режима"
+	},
+	"tools": {
+		"title": "Доступные инструменты",
+		"builtInModesText": "Инструменты для встроенных режимов нельзя изменять",
+		"editTools": "Редактировать инструменты",
+		"doneEditing": "Завершить редактирование",
+		"allowedFiles": "Разрешенные файлы:"
+	},
+	"roleDefinition": {
+		"title": "Определение роли",
+		"resetToDefault": "Сбросить до значений по умолчанию",
+		"description": "Определите экспертизу и индивидуальность Roo для этого режима. Это описание формирует то, как Roo представляет себя и подходит к задачам."
+	},
+	"customInstructions": {
+		"title": "Пользовательские инструкции для режима (необязательно)",
+		"resetToDefault": "Сбросить до значений по умолчанию",
+		"description": "Добавьте поведенческие рекомендации, специфичные для режима {{modeName}}.",
+		"loadFromFile": "Пользовательские инструкции для режима {{modeName}} также могут быть загружены из .clinerules-{{modeSlug}} в вашей рабочей области."
+	},
+	"globalCustomInstructions": {
+		"title": "Пользовательские инструкции для всех режимов",
+		"description": "Эти инструкции применяются ко всем режимам. Они предоставляют базовый набор поведения, который может быть расширен инструкциями для конкретных режимов ниже.\nЕсли вы хотите, чтобы Roo думал и говорил на языке, отличном от языка отображения вашего редактора ({{language}}), вы можете указать его здесь.",
+		"loadFromFile": "Инструкции также могут быть загружены из .clinerules в вашей рабочей области."
+	},
+	"systemPrompt": {
+		"preview": "Предварительный просмотр системного промпта",
+		"copy": "Копировать системный промпт в буфер обмена",
+		"title": "Системный промпт (режим {{modeName}})"
+	},
+	"supportPrompts": {
+		"title": "Вспомогательные промпты",
+		"resetPrompt": "Сбросить промпт {{promptType}} до значений по умолчанию",
+		"prompt": "Промпт",
+		"enhance": {
+			"apiConfiguration": "Конфигурация API",
+			"apiConfigDescription": "Вы можете выбрать конфигурацию API, которая будет всегда использоваться для улучшения промптов, или просто использовать текущую выбранную",
+			"useCurrentConfig": "Использовать текущую выбранную конфигурацию API",
+			"testPromptPlaceholder": "Введите промпт для проверки улучшения",
+			"previewButton": "Предварительный просмотр улучшения промпта"
+		}
+	},
+	"customModeCreation": {
+		"enableTitle": "Включить создание пользовательских режимов через промпты",
+		"description": "Когда включено, Roo позволяет вам создавать пользовательские режимы, используя промпты вроде 'Создай мне пользовательский режим, который...'. Отключение этой функции уменьшает ваш системный промпт примерно на 700 token, когда эта функция не нужна. При отключении вы все равно можете создавать пользовательские режимы вручную, используя кнопку + выше или редактируя соответствующий JSON конфигурации."
+	},
+	"advancedSystemPrompt": {
+		"title": "Расширенные настройки: Переопределить системный промпт",
+		"description": "Вы можете полностью заменить системный промпт для этого режима (кроме определения роли и пользовательских инструкций), создав файл в .roo/system-prompt-{{modeSlug}} в вашей рабочей области. Это очень продвинутая функция, которая обходит встроенные меры безопасности и проверки согласованности (особенно вокруг использования инструментов), поэтому будьте осторожны!"
+	},
+	"createModeDialog": {
+		"title": "Создать новый режим",
+		"close": "Закрыть",
+		"name": {
+			"label": "Название",
+			"placeholder": "Введите название режима"
+		},
+		"slug": {
+			"label": "Slug",
+			"description": "Slug используется в URL и именах файлов. Он должен быть в нижнем регистре и содержать только буквы, цифры и дефисы."
+		},
+		"saveLocation": {
+			"label": "Место сохранения",
+			"description": "Выберите, где сохранить этот режим. Режимы, специфичные для проекта, имеют приоритет над глобальными режимами.",
+			"global": {
+				"label": "Глобальный",
+				"description": "Доступен во всех рабочих областях"
+			},
+			"project": {
+				"label": "Специфичный для проекта (.roomodes)",
+				"description": "Доступен только в этой рабочей области, имеет приоритет над глобальным"
+			}
+		},
+		"roleDefinition": {
+			"label": "Определение роли",
+			"description": "Определите экспертизу и индивидуальность Roo для этого режима."
+		},
+		"tools": {
+			"label": "Доступные инструменты",
+			"description": "Выберите, какие инструменты может использовать этот режим."
+		},
+		"customInstructions": {
+			"label": "Пользовательские инструкции (необязательно)",
+			"description": "Добавьте поведенческие рекомендации, специфичные для этого режима."
+		},
+		"buttons": {
+			"cancel": "Отмена",
+			"create": "Создать режим"
+		},
+		"deleteMode": "Удалить режим"
+	},
+	"allFiles": "все файлы"
+}
diff --git a/webview-ui/src/i18n/locales/tr/prompts.json b/webview-ui/src/i18n/locales/tr/prompts.json
new file mode 100644
index 0000000000..ac9d67ae92
--- /dev/null
+++ b/webview-ui/src/i18n/locales/tr/prompts.json
@@ -0,0 +1,106 @@
+{
+	"title": "Promptlar",
+	"done": "Tamamlandı",
+	"modes": {
+		"title": "Modlar",
+		"createNewMode": "Yeni mod oluştur",
+		"editModesConfig": "Mod yapılandırmasını düzenle",
+		"editGlobalModes": "Global modları düzenle",
+		"editProjectModes": "Proje modlarını düzenle (.roomodes)",
+		"createModeHelpText": "Yeni bir özel mod oluşturmak için + düğmesine tıklayın veya sohbette Roo'dan sizin için bir tane oluşturmasını isteyin!"
+	},
+	"apiConfiguration": {
+		"title": "API Yapılandırması",
+		"select": "Bu mod için hangi API yapılandırmasının kullanılacağını seçin"
+	},
+	"tools": {
+		"title": "Kullanılabilir Araçlar",
+		"builtInModesText": "Yerleşik modlar için araçlar değiştirilemez",
+		"editTools": "Araçları düzenle",
+		"doneEditing": "Düzenlemeyi bitir",
+		"allowedFiles": "İzin verilen dosyalar:"
+	},
+	"roleDefinition": {
+		"title": "Rol Tanımı",
+		"resetToDefault": "Varsayılana sıfırla",
+		"description": "Bu mod için Roo'nun uzmanlığını ve kişiliğini tanımlayın. Bu açıklama, Roo'nun kendini nasıl sunduğunu ve görevlere nasıl yaklaştığını şekillendirir."
+	},
+	"customInstructions": {
+		"title": "Moda özgü özel talimatlar (isteğe bağlı)",
+		"resetToDefault": "Varsayılana sıfırla",
+		"description": "{{modeName}} modu için özel davranış yönergeleri ekleyin.",
+		"loadFromFile": "{{modeName}} moduna özgü özel talimatlar, çalışma alanınızdaki .clinerules-{{modeSlug}} dosyasından da yüklenebilir."
+	},
+	"globalCustomInstructions": {
+		"title": "Tüm Modlar için Özel Talimatlar",
+		"description": "Bu talimatlar tüm modlara uygulanır. Aşağıdaki moda özgü talimatlarla geliştirilebilen temel davranış seti sağlarlar.\nRoo'nun editörünüzün görüntüleme dilinden ({{language}}) farklı bir dilde düşünmesini ve konuşmasını istiyorsanız, burada belirtebilirsiniz.",
+		"loadFromFile": "Talimatlar, çalışma alanınızdaki .clinerules dosyasından da yüklenebilir."
+	},
+	"systemPrompt": {
+		"preview": "Sistem promptunu önizle",
+		"copy": "Sistem promptunu panoya kopyala",
+		"title": "Sistem promptu ({{modeName}} modu)"
+	},
+	"supportPrompts": {
+		"title": "Destek Promptları",
+		"resetPrompt": "{{promptType}} promptunu varsayılana sıfırla",
+		"prompt": "Prompt",
+		"enhance": {
+			"apiConfiguration": "API Yapılandırması",
+			"apiConfigDescription": "Promptları geliştirmek için her zaman kullanılacak bir API yapılandırması seçebilir veya şu anda seçili olanı kullanabilirsiniz",
+			"useCurrentConfig": "Şu anda seçili API yapılandırmasını kullan",
+			"testPromptPlaceholder": "Geliştirmeyi test etmek için bir prompt girin",
+			"previewButton": "Prompt geliştirmesini önizle"
+		}
+	},
+	"customModeCreation": {
+		"enableTitle": "Promptlar aracılığıyla özel mod oluşturmayı etkinleştir",
+		"description": "Etkinleştirildiğinde, Roo 'Bana ... yapabilen özel bir mod oluştur' gibi promptlar kullanarak özel modlar oluşturmanıza olanak tanır. Bu özelliğe ihtiyaç duyulmadığında devre dışı bırakmak, sistem promptunuzu yaklaşık 700 token azaltır. Devre dışı bırakıldığında, yukarıdaki + düğmesini kullanarak veya ilgili yapılandırma JSON'ını düzenleyerek manuel olarak özel modlar oluşturabilirsiniz."
+	},
+	"advancedSystemPrompt": {
+		"title": "Gelişmiş: Sistem Promptunu Geçersiz Kıl",
+		"description": "Çalışma alanınızda .roo/system-prompt-{{modeSlug}} konumunda bir dosya oluşturarak bu mod için sistem promptunu (rol tanımı ve özel talimatlar dışında) tamamen değiştirebilirsiniz. Bu, yerleşik güvenceleri ve tutarlılık kontrollerini (özellikle araç kullanımı etrafında) atlayan çok gelişmiş bir özelliktir, bu yüzden dikkatli olun!"
+	},
+	"createModeDialog": {
+		"title": "Yeni Mod Oluştur",
+		"close": "Kapat",
+		"name": {
+			"label": "İsim",
+			"placeholder": "Mod adını girin"
+		},
+		"slug": {
+			"label": "Slug",
+			"description": "Slug, URL'lerde ve dosya adlarında kullanılır. Küçük harflerle yazılmalı ve yalnızca harfler, sayılar ve kısa çizgiler içermelidir."
+		},
+		"saveLocation": {
+			"label": "Kaydetme Konumu",
+			"description": "Bu modu nereye kaydedeceğinizi seçin. Projeye özgü modlar, global modlara göre önceliklidir.",
+			"global": {
+				"label": "Global",
+				"description": "Tüm çalışma alanlarında kullanılabilir"
+			},
+			"project": {
+				"label": "Projeye özgü (.roomodes)",
+				"description": "Yalnızca bu çalışma alanında kullanılabilir, globale göre önceliklidir"
+			}
+		},
+		"roleDefinition": {
+			"label": "Rol Tanımı",
+			"description": "Bu mod için Roo'nun uzmanlığını ve kişiliğini tanımlayın."
+		},
+		"tools": {
+			"label": "Kullanılabilir Araçlar",
+			"description": "Bu modun hangi araçları kullanabileceğini seçin."
+		},
+		"customInstructions": {
+			"label": "Özel Talimatlar (isteğe bağlı)",
+			"description": "Bu mod için özel davranış yönergeleri ekleyin."
+		},
+		"buttons": {
+			"cancel": "İptal",
+			"create": "Mod Oluştur"
+		},
+		"deleteMode": "Modu sil"
+	},
+	"allFiles": "tüm dosyalar"
+}
diff --git a/webview-ui/src/i18n/locales/zh-CN/prompts.json b/webview-ui/src/i18n/locales/zh-CN/prompts.json
new file mode 100644
index 0000000000..37b199fc47
--- /dev/null
+++ b/webview-ui/src/i18n/locales/zh-CN/prompts.json
@@ -0,0 +1,140 @@
+{
+	"title": "提示词",
+	"done": "完成",
+	"modes": {
+		"title": "模式",
+		"createNewMode": "创建新模式",
+		"editModesConfig": "编辑模式配置",
+		"editGlobalModes": "编辑全局模式",
+		"editProjectModes": "编辑项目模式 (.roomodes)",
+		"createModeHelpText": "点击 + 创建新的自定义模式,或者在聊天中直接要求 Roo 为您创建一个!"
+	},
+	"apiConfiguration": {
+		"title": "API配置",
+		"select": "选择要用于此模式的API配置"
+	},
+	"tools": {
+		"title": "可用工具",
+		"builtInModesText": "内置模式的工具不能被修改",
+		"editTools": "编辑工具",
+		"doneEditing": "完成编辑",
+		"allowedFiles": "允许的文件:"
+	},
+	"roleDefinition": {
+		"title": "角色定义",
+		"resetToDefault": "重置为默认值",
+		"description": "为此模式定义Roo的专业知识和个性。此描述塑造了Roo如何展示自己并处理任务。"
+	},
+	"customInstructions": {
+		"title": "模式特定的自定义指令(可选)",
+		"resetToDefault": "重置为默认值",
+		"description": "为{{modeName}}模式添加特定行为指南。",
+		"loadFromFile": "{{modeName}}模式的自定义指令也可以从工作区的.clinerules-{{modeSlug}}加载。"
+	},
+	"globalCustomInstructions": {
+		"title": "所有模式的自定义指令",
+		"description": "这些指令适用于所有模式。它们提供了一套基本行为,可以通过下面的模式特定指令来增强。\n如果您希望Roo使用不同于编辑器显示语言({{language}})的语言进行思考和对话,您可以在这里指定。",
+		"loadFromFile": "指令也可以从工作区的.clinerules加载。"
+	},
+	"systemPrompt": {
+		"preview": "预览系统提示词",
+		"copy": "复制系统提示词到剪贴板",
+		"title": "系统提示词({{modeName}}模式)"
+	},
+	"supportPrompts": {
+		"title": "支持提示词",
+		"resetPrompt": "将{{promptType}}提示词重置为默认值",
+		"prompt": "提示词",
+		"enhance": {
+			"apiConfiguration": "API配置",
+			"apiConfigDescription": "您可以选择一个固定的API配置用于增强提示词,或者使用当前选择的配置",
+			"useCurrentConfig": "使用当前选择的API配置",
+			"testPromptPlaceholder": "输入提示词以测试增强效果",
+			"previewButton": "预览提示词增强"
+		},
+		"types": {
+			"ENHANCE": {
+				"label": "增强提示词",
+				"description": "使用提示词增强功能获取针对您输入的定制建议或改进。这确保Roo理解您的意图并提供最佳的回应。可通过聊天中的✨图标使用。"
+			},
+			"EXPLAIN": {
+				"label": "解释代码",
+				"description": "获取对代码片段、函数或整个文件的详细解释。有助于理解复杂代码或学习新模式。可在代码操作(编辑器中的灯泡图标)和编辑器上下文菜单(右键点击选中的代码)中使用。"
+			},
+			"FIX": {
+				"label": "修复问题",
+				"description": "获取帮助以识别和解决bug、错误或代码质量问题。提供逐步修复问题的指导。可在代码操作(编辑器中的灯泡图标)和编辑器上下文菜单(右键点击选中的代码)中使用。"
+			},
+			"IMPROVE": {
+				"label": "改进代码",
+				"description": "在保持功能的同时,接收代码优化、更好实践和架构改进的建议。可在代码操作(编辑器中的灯泡图标)和编辑器上下文菜单(右键点击选中的代码)中使用。"
+			},
+			"ADD_TO_CONTEXT": {
+				"label": "添加到上下文",
+				"description": "为当前任务或对话添加上下文。用于提供额外信息或说明。可在代码操作(编辑器中的灯泡图标)和编辑器上下文菜单(右键点击选中的代码)中使用。"
+			},
+			"TERMINAL_ADD_TO_CONTEXT": {
+				"label": "添加终端内容到上下文",
+				"description": "将终端输出添加到当前任务或对话中。用于提供命令输出或日志。可在终端上下文菜单(右键点击选中的终端内容)中使用。"
+			},
+			"TERMINAL_FIX": {
+				"label": "修复终端命令",
+				"description": "获取帮助以修复失败或需要改进的终端命令。可在终端上下文菜单(右键点击选中的终端内容)中使用。"
+			},
+			"TERMINAL_EXPLAIN": {
+				"label": "解释终端命令",
+				"description": "获取对终端命令及其输出的详细解释。可在终端上下文菜单(右键点击选中的终端内容)中使用。"
+			}
+		}
+	},
+	"customModeCreation": {
+		"enableTitle": "通过提示词启用自定义模式创建",
+		"description": "启用后,Roo允许您使用类似\"为我创建一个自定义模式,它可以...\"的提示词来创建自定义模式。禁用此功能可以在不需要时减少系统提示词约700个token。禁用后您仍然可以通过上方的+按钮或编辑相关配置JSON手动创建自定义模式。"
+	},
+	"advancedSystemPrompt": {
+		"title": "高级:覆盖系统提示词",
+		"description": "您可以通过在工作区创建文件.roo/system-prompt-{{modeSlug}}来完全替换此模式的系统提示词(角色定义和自定义指令除外)。这是一个非常高级的功能,会绕过内置的安全措施和一致性检查(尤其是围绕工具使用的检查),请谨慎使用!"
+	},
+	"createModeDialog": {
+		"title": "创建新模式",
+		"close": "关闭",
+		"name": {
+			"label": "名称",
+			"placeholder": "输入模式名称"
+		},
+		"slug": {
+			"label": "标识符",
+			"description": "标识符用于URL和文件名。它应该是小写的,只包含字母、数字和连字符。"
+		},
+		"saveLocation": {
+			"label": "保存位置",
+			"description": "选择保存此模式的位置。项目特定模式优先于全局模式。",
+			"global": {
+				"label": "全局",
+				"description": "在所有工作区可用"
+			},
+			"project": {
+				"label": "项目特定 (.roomodes)",
+				"description": "仅在此工作区可用,优先于全局模式"
+			}
+		},
+		"roleDefinition": {
+			"label": "角色定义",
+			"description": "为此模式定义Roo的专业知识和个性。"
+		},
+		"tools": {
+			"label": "可用工具",
+			"description": "选择此模式可以使用哪些工具。"
+		},
+		"customInstructions": {
+			"label": "自定义指令(可选)",
+			"description": "为此模式添加特定行为指南。"
+		},
+		"buttons": {
+			"cancel": "取消",
+			"create": "创建模式"
+		},
+		"deleteMode": "删除模式"
+	},
+	"allFiles": "所有文件"
+}
diff --git a/webview-ui/src/i18n/locales/zh-TW/prompts.json b/webview-ui/src/i18n/locales/zh-TW/prompts.json
new file mode 100644
index 0000000000..5f10ea6751
--- /dev/null
+++ b/webview-ui/src/i18n/locales/zh-TW/prompts.json
@@ -0,0 +1,140 @@
+{
+	"title": "提示詞",
+	"done": "完成",
+	"modes": {
+		"title": "模式",
+		"createNewMode": "建立新模式",
+		"editModesConfig": "編輯模式設定",
+		"editGlobalModes": "編輯全域模式",
+		"editProjectModes": "編輯專案模式 (.roomodes)",
+		"createModeHelpText": "點擊 + 建立新的自訂模式,或者在聊天中直接要求 Roo 為您建立一個!"
+	},
+	"apiConfiguration": {
+		"title": "API設定",
+		"select": "選擇要用於此模式的API設定"
+	},
+	"tools": {
+		"title": "可用工具",
+		"builtInModesText": "內建模式的工具不能被修改",
+		"editTools": "編輯工具",
+		"doneEditing": "完成編輯",
+		"allowedFiles": "允許的檔案:"
+	},
+	"roleDefinition": {
+		"title": "角色定義",
+		"resetToDefault": "重設為預設值",
+		"description": "為此模式定義Roo的專業知識和個性。此描述塑造了Roo如何展示自己並處理任務。"
+	},
+	"customInstructions": {
+		"title": "模式特定的自訂指令(選用)",
+		"resetToDefault": "重設為預設值",
+		"description": "為{{modeName}}模式添加特定行為指南。",
+		"loadFromFile": "{{modeName}}模式的自訂指令也可以從工作區的.clinerules-{{modeSlug}}載入。"
+	},
+	"globalCustomInstructions": {
+		"title": "所有模式的自訂指令",
+		"description": "這些指令適用於所有模式。它們提供了一套基本行為,可以透過下面的模式特定指令來增強。\n如果您希望Roo使用不同於編輯器顯示語言({{language}})的語言進行思考和對話,您可以在這裡指定。",
+		"loadFromFile": "指令也可以從工作區的.clinerules載入。"
+	},
+	"systemPrompt": {
+		"preview": "預覽系統提示詞",
+		"copy": "複製系統提示詞到剪貼簿",
+		"title": "系統提示詞({{modeName}}模式)"
+	},
+	"supportPrompts": {
+		"title": "支援提示詞",
+		"resetPrompt": "將{{promptType}}提示詞重設為預設值",
+		"prompt": "提示詞",
+		"enhance": {
+			"apiConfiguration": "API設定",
+			"apiConfigDescription": "您可以選擇一個固定的API設定用於增強提示詞,或者使用當前選擇的設定",
+			"useCurrentConfig": "使用當前選擇的API設定",
+			"testPromptPlaceholder": "輸入提示詞以測試增強效果",
+			"previewButton": "預覽提示詞增強"
+		},
+		"types": {
+			"ENHANCE": {
+				"label": "增強提示詞",
+				"description": "使用提示詞增強功能獲取針對您輸入的客製化建議或改進。這確保Roo理解您的意圖並提供最佳的回應。可透過聊天中的✨圖示使用。"
+			},
+			"EXPLAIN": {
+				"label": "解釋程式碼",
+				"description": "獲取對程式碼片段、函式或整個檔案的詳細解釋。有助於理解複雜程式碼或學習新模式。可在程式碼操作(編輯器中的燈泡圖示)和編輯器右鍵選單(右鍵點擊選中的程式碼)中使用。"
+			},
+			"FIX": {
+				"label": "修復問題",
+				"description": "獲取幫助以識別和解決錯誤、bug或程式碼品質問題。提供逐步修復問題的指導。可在程式碼操作(編輯器中的燈泡圖示)和編輯器右鍵選單(右鍵點擊選中的程式碼)中使用。"
+			},
+			"IMPROVE": {
+				"label": "改進程式碼",
+				"description": "在保持功能的同時,接收程式碼優化、更好實踐和架構改進的建議。可在程式碼操作(編輯器中的燈泡圖示)和編輯器右鍵選單(右鍵點擊選中的程式碼)中使用。"
+			},
+			"ADD_TO_CONTEXT": {
+				"label": "添加到上下文",
+				"description": "為當前任務或對話添加上下文。用於提供額外資訊或說明。可在程式碼操作(編輯器中的燈泡圖示)和編輯器右鍵選單(右鍵點擊選中的程式碼)中使用。"
+			},
+			"TERMINAL_ADD_TO_CONTEXT": {
+				"label": "添加終端內容到上下文",
+				"description": "將終端輸出添加到當前任務或對話中。用於提供命令輸出或日誌。可在終端右鍵選單(右鍵點擊選中的終端內容)中使用。"
+			},
+			"TERMINAL_FIX": {
+				"label": "修復終端命令",
+				"description": "獲取幫助以修復失敗或需要改進的終端命令。可在終端右鍵選單(右鍵點擊選中的終端內容)中使用。"
+			},
+			"TERMINAL_EXPLAIN": {
+				"label": "解釋終端命令",
+				"description": "獲取對終端命令及其輸出的詳細解釋。可在終端右鍵選單(右鍵點擊選中的終端內容)中使用。"
+			}
+		}
+	},
+	"customModeCreation": {
+		"enableTitle": "透過提示詞啟用自訂模式建立",
+		"description": "啟用後,Roo允許您使用類似\"為我建立一個自訂模式,它可以...\"的提示詞來建立自訂模式。禁用此功能可以在不需要時減少系統提示詞約700個token。禁用後您仍然可以透過上方的+按鈕或編輯相關設定JSON手動建立自訂模式。"
+	},
+	"advancedSystemPrompt": {
+		"title": "進階:覆寫系統提示詞",
+		"description": "您可以透過在工作區建立檔案.roo/system-prompt-{{modeSlug}}來完全替換此模式的系統提示詞(角色定義和自訂指令除外)。這是一個非常進階的功能,會繞過內建的安全措施和一致性檢查(尤其是圍繞工具使用的檢查),請謹慎使用!"
+	},
+	"createModeDialog": {
+		"title": "建立新模式",
+		"close": "關閉",
+		"name": {
+			"label": "名稱",
+			"placeholder": "輸入模式名稱"
+		},
+		"slug": {
+			"label": "標識符",
+			"description": "標識符用於URL和檔案名稱。它應該是小寫的,只包含字母、數字和連字符。"
+		},
+		"saveLocation": {
+			"label": "儲存位置",
+			"description": "選擇儲存此模式的位置。專案特定模式優先於全域模式。",
+			"global": {
+				"label": "全域",
+				"description": "在所有工作區可用"
+			},
+			"project": {
+				"label": "專案特定 (.roomodes)",
+				"description": "僅在此工作區可用,優先於全域模式"
+			}
+		},
+		"roleDefinition": {
+			"label": "角色定義",
+			"description": "為此模式定義Roo的專業知識和個性。"
+		},
+		"tools": {
+			"label": "可用工具",
+			"description": "選擇此模式可以使用哪些工具。"
+		},
+		"customInstructions": {
+			"label": "自訂指令(選用)",
+			"description": "為此模式添加特定行為指南。"
+		},
+		"buttons": {
+			"cancel": "取消",
+			"create": "建立模式"
+		},
+		"deleteMode": "刪除模式"
+	},
+	"allFiles": "所有檔案"
+}

From ca8c6f69c3dff0e9eceefe09003ba4c3911ef4a3 Mon Sep 17 00:00:00 2001
From: Matt Rubens 
Date: Sun, 16 Mar 2025 03:17:02 -0400
Subject: [PATCH 18/58] Localize the MCP tab

---
 .../src/components/mcp/McpEnabledToggle.tsx   |  7 +-
 webview-ui/src/components/mcp/McpToolRow.tsx  |  8 +-
 webview-ui/src/components/mcp/McpView.tsx     | 80 ++++++++++---------
 .../mcp/__tests__/McpToolRow.test.tsx         | 14 ++++
 webview-ui/src/i18n/locales/ar/mcp.json       | 51 ++++++++++++
 webview-ui/src/i18n/locales/ca/mcp.json       | 51 ++++++++++++
 webview-ui/src/i18n/locales/cs/mcp.json       | 51 ++++++++++++
 webview-ui/src/i18n/locales/de/mcp.json       | 51 ++++++++++++
 webview-ui/src/i18n/locales/en/mcp.json       | 51 ++++++++++++
 webview-ui/src/i18n/locales/es/mcp.json       | 51 ++++++++++++
 webview-ui/src/i18n/locales/fr/mcp.json       | 51 ++++++++++++
 webview-ui/src/i18n/locales/hi/mcp.json       | 51 ++++++++++++
 webview-ui/src/i18n/locales/hu/mcp.json       | 51 ++++++++++++
 webview-ui/src/i18n/locales/it/mcp.json       | 51 ++++++++++++
 webview-ui/src/i18n/locales/ja/mcp.json       | 51 ++++++++++++
 webview-ui/src/i18n/locales/ko/mcp.json       | 51 ++++++++++++
 webview-ui/src/i18n/locales/pl/mcp.json       | 51 ++++++++++++
 webview-ui/src/i18n/locales/pt-BR/mcp.json    | 51 ++++++++++++
 webview-ui/src/i18n/locales/pt/mcp.json       | 51 ++++++++++++
 webview-ui/src/i18n/locales/ru/mcp.json       | 51 ++++++++++++
 webview-ui/src/i18n/locales/tr/mcp.json       | 51 ++++++++++++
 webview-ui/src/i18n/locales/zh-CN/mcp.json    | 51 ++++++++++++
 webview-ui/src/i18n/locales/zh-TW/mcp.json    | 51 ++++++++++++
 23 files changed, 1034 insertions(+), 44 deletions(-)
 create mode 100644 webview-ui/src/i18n/locales/ar/mcp.json
 create mode 100644 webview-ui/src/i18n/locales/ca/mcp.json
 create mode 100644 webview-ui/src/i18n/locales/cs/mcp.json
 create mode 100644 webview-ui/src/i18n/locales/de/mcp.json
 create mode 100644 webview-ui/src/i18n/locales/en/mcp.json
 create mode 100644 webview-ui/src/i18n/locales/es/mcp.json
 create mode 100644 webview-ui/src/i18n/locales/fr/mcp.json
 create mode 100644 webview-ui/src/i18n/locales/hi/mcp.json
 create mode 100644 webview-ui/src/i18n/locales/hu/mcp.json
 create mode 100644 webview-ui/src/i18n/locales/it/mcp.json
 create mode 100644 webview-ui/src/i18n/locales/ja/mcp.json
 create mode 100644 webview-ui/src/i18n/locales/ko/mcp.json
 create mode 100644 webview-ui/src/i18n/locales/pl/mcp.json
 create mode 100644 webview-ui/src/i18n/locales/pt-BR/mcp.json
 create mode 100644 webview-ui/src/i18n/locales/pt/mcp.json
 create mode 100644 webview-ui/src/i18n/locales/ru/mcp.json
 create mode 100644 webview-ui/src/i18n/locales/tr/mcp.json
 create mode 100644 webview-ui/src/i18n/locales/zh-CN/mcp.json
 create mode 100644 webview-ui/src/i18n/locales/zh-TW/mcp.json

diff --git a/webview-ui/src/components/mcp/McpEnabledToggle.tsx b/webview-ui/src/components/mcp/McpEnabledToggle.tsx
index 9e7831ea2b..967c06e829 100644
--- a/webview-ui/src/components/mcp/McpEnabledToggle.tsx
+++ b/webview-ui/src/components/mcp/McpEnabledToggle.tsx
@@ -1,10 +1,12 @@
 import { VSCodeCheckbox } from "@vscode/webview-ui-toolkit/react"
 import { FormEvent } from "react"
 import { useExtensionState } from "../../context/ExtensionStateContext"
+import { useAppTranslation } from "../../i18n/TranslationContext"
 import { vscode } from "../../utils/vscode"
 
 const McpEnabledToggle = () => {
 	const { mcpEnabled, setMcpEnabled } = useExtensionState()
+	const { t } = useAppTranslation()
 
 	const handleChange = (e: Event | FormEvent) => {
 		const target = ("target" in e ? e.target : null) as HTMLInputElement | null
@@ -16,7 +18,7 @@ const McpEnabledToggle = () => {
 	return (
 		
- Enable MCP Servers + {t("mcp:enableToggle.title")}

{ marginTop: "5px", color: "var(--vscode-descriptionForeground)", }}> - When enabled, Roo will be able to interact with MCP servers for advanced functionality. If you're not - using MCP, you can disable this to reduce Roo's token usage. + {t("mcp:enableToggle.description")}

) diff --git a/webview-ui/src/components/mcp/McpToolRow.tsx b/webview-ui/src/components/mcp/McpToolRow.tsx index 20fc1acbf0..9f04ce1a2f 100644 --- a/webview-ui/src/components/mcp/McpToolRow.tsx +++ b/webview-ui/src/components/mcp/McpToolRow.tsx @@ -1,5 +1,6 @@ import { VSCodeCheckbox } from "@vscode/webview-ui-toolkit/react" import { McpTool } from "../../../../src/shared/mcp" +import { useAppTranslation } from "../../i18n/TranslationContext" import { vscode } from "../../utils/vscode" type McpToolRowProps = { @@ -9,6 +10,7 @@ type McpToolRowProps = { } const McpToolRow = ({ tool, serverName, alwaysAllowMcp }: McpToolRowProps) => { + const { t } = useAppTranslation() const handleAlwaysAllowChange = () => { if (!serverName) return @@ -36,7 +38,7 @@ const McpToolRow = ({ tool, serverName, alwaysAllowMcp }: McpToolRowProps) => { {serverName && alwaysAllowMcp && ( - Always allow + {t("mcp:tool.alwaysAllow")} )} @@ -64,7 +66,7 @@ const McpToolRow = ({ tool, serverName, alwaysAllowMcp }: McpToolRowProps) => { }}>
- Parameters + {t("mcp:tool.parameters")}
{Object.entries(tool.inputSchema.properties as Record).map( ([paramName, schema]) => { @@ -98,7 +100,7 @@ const McpToolRow = ({ tool, serverName, alwaysAllowMcp }: McpToolRowProps) => { overflowWrap: "break-word", wordBreak: "break-word", }}> - {schema.description || "No description"} + {schema.description || t("mcp:tool.noDescription")} ) diff --git a/webview-ui/src/components/mcp/McpView.tsx b/webview-ui/src/components/mcp/McpView.tsx index ce37a4c09d..97111e1332 100644 --- a/webview-ui/src/components/mcp/McpView.tsx +++ b/webview-ui/src/components/mcp/McpView.tsx @@ -14,6 +14,8 @@ import { vscode } from "@/utils/vscode" import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, DialogFooter } from "@/components/ui" import { useExtensionState } from "../../context/ExtensionStateContext" +import { useAppTranslation } from "../../i18n/TranslationContext" +import { Trans } from "react-i18next" import { Tab, TabContent, TabHeader } from "../common/Tab" import McpToolRow from "./McpToolRow" import McpResourceRow from "./McpResourceRow" @@ -31,12 +33,13 @@ const McpView = ({ onDone }: McpViewProps) => { enableMcpServerCreation, setEnableMcpServerCreation, } = useExtensionState() + const { t } = useAppTranslation() return ( -

MCP Servers

- Done +

{t("mcp:title")}

+ {t("mcp:done")}
@@ -47,17 +50,16 @@ const McpView = ({ onDone }: McpViewProps) => { marginBottom: "10px", marginTop: "5px", }}> - The{" "} - - Model Context Protocol - {" "} - enables communication with locally running MCP servers that provide additional tools and resources - to extend Roo's capabilities. You can use{" "} - - community-made servers - {" "} - or ask Roo to create new tools specific to your workflow (e.g., "add a tool that gets the latest npm - docs"). + + + Model Context Protocol + + + community-made servers + + @@ -71,7 +73,7 @@ const McpView = ({ onDone }: McpViewProps) => { setEnableMcpServerCreation(e.target.checked) vscode.postMessage({ type: "enableMcpServerCreation", bool: e.target.checked }) }}> - Enable MCP Server Creation + {t("mcp:enableServerCreation.title")}

{ marginTop: "5px", color: "var(--vscode-descriptionForeground)", }}> - When enabled, Roo can help you create new MCP servers via commands like "add a new tool - to...". If you don't need to create MCP servers you can disable this to reduce Roo's - token usage. + {t("mcp:enableServerCreation.description")}

@@ -103,7 +103,7 @@ const McpView = ({ onDone }: McpViewProps) => { vscode.postMessage({ type: "openMcpSettings" }) }}> - Edit MCP Settings + {t("mcp:editSettings")} @@ -114,6 +114,7 @@ const McpView = ({ onDone }: McpViewProps) => { } const ServerRow = ({ server, alwaysAllowMcp }: { server: McpServer; alwaysAllowMcp?: boolean }) => { + const { t } = useAppTranslation() const [isExpanded, setIsExpanded] = useState(false) const [showDeleteConfirm, setShowDeleteConfirm] = useState(false) const [timeoutValue, setTimeoutValue] = useState(() => { @@ -122,14 +123,14 @@ const ServerRow = ({ server, alwaysAllowMcp }: { server: McpServer; alwaysAllowM }) const timeoutOptions = [ - { value: 15, label: "15 seconds" }, - { value: 30, label: "30 seconds" }, - { value: 60, label: "1 minute" }, - { value: 300, label: "5 minutes" }, - { value: 600, label: "10 minutes" }, - { value: 900, label: "15 minutes" }, - { value: 1800, label: "30 minutes" }, - { value: 3600, label: "60 minutes" }, + { value: 15, label: t("mcp:networkTimeout.options.15seconds") }, + { value: 30, label: t("mcp:networkTimeout.options.30seconds") }, + { value: 60, label: t("mcp:networkTimeout.options.1minute") }, + { value: 300, label: t("mcp:networkTimeout.options.5minutes") }, + { value: 600, label: t("mcp:networkTimeout.options.10minutes") }, + { value: 900, label: t("mcp:networkTimeout.options.15minutes") }, + { value: 1800, label: t("mcp:networkTimeout.options.30minutes") }, + { value: 3600, label: t("mcp:networkTimeout.options.60minutes") }, ] const getStatusColor = () => { @@ -291,7 +292,9 @@ const ServerRow = ({ server, alwaysAllowMcp }: { server: McpServer; alwaysAllowM onClick={handleRestart} disabled={server.status === "connecting"} style={{ width: "calc(100% - 20px)", margin: "0 10px 10px 10px" }}> - {server.status === "connecting" ? "Retrying..." : "Retry Connection"} + {server.status === "connecting" + ? t("mcp:serverStatus.retrying") + : t("mcp:serverStatus.retryConnection")} ) : ( @@ -304,9 +307,11 @@ const ServerRow = ({ server, alwaysAllowMcp }: { server: McpServer; alwaysAllowM borderRadius: "0 0 4px 4px", }}> - Tools ({server.tools?.length || 0}) + + {t("mcp:tabs.tools")} ({server.tools?.length || 0}) + - Resources ( + {t("mcp:tabs.resources")} ( {[...(server.resourceTemplates || []), ...(server.resources || [])].length || 0}) @@ -325,7 +330,7 @@ const ServerRow = ({ server, alwaysAllowMcp }: { server: McpServer; alwaysAllowM ) : (
- No tools found + {t("mcp:emptyState.noTools")}
)} @@ -346,7 +351,7 @@ const ServerRow = ({ server, alwaysAllowMcp }: { server: McpServer; alwaysAllowM ) : (
- No resources found + {t("mcp:emptyState.noResources")}
)} @@ -361,7 +366,7 @@ const ServerRow = ({ server, alwaysAllowMcp }: { server: McpServer; alwaysAllowM gap: "10px", marginBottom: "8px", }}> - Network Timeout + {t("mcp:networkTimeout.label")} {rateLimitSeconds}s -

Minimum time between API requests.

+

+ {t("settings:advanced.rateLimit.description")} +

@@ -69,16 +73,15 @@ export const AdvancedSettings = ({ setExperimentEnabled(EXPERIMENT_IDS.MULTI_SEARCH_AND_REPLACE, false) } }}> - Enable editing through diffs + {t("settings:advanced.diff.label")}

- When enabled, Roo will be able to edit files more quickly and will automatically reject - truncated full-file writes. Works best with the latest Claude 3.7 Sonnet model. + {t("settings:advanced.diff.description")}

{diffEnabled && (
- Diff strategy + {t("settings:advanced.diff.strategy.label")}
@@ -111,15 +120,15 @@ export const AdvancedSettings = ({

{!experiments[EXPERIMENT_IDS.DIFF_STRATEGY] && !experiments[EXPERIMENT_IDS.MULTI_SEARCH_AND_REPLACE] && - "Standard diff strategy applies changes to a single code block at a time."} + t("settings:advanced.diff.strategy.descriptions.standard")} {experiments[EXPERIMENT_IDS.DIFF_STRATEGY] && - "Unified diff strategy takes multiple approaches to applying diffs and chooses the best approach."} + t("settings:advanced.diff.strategy.descriptions.unified")} {experiments[EXPERIMENT_IDS.MULTI_SEARCH_AND_REPLACE] && - "Multi-block diff strategy allows updating multiple code blocks in a file in one request."} + t("settings:advanced.diff.strategy.descriptions.multiBlock")}

{/* Match precision slider */} - Match precision + {t("settings:advanced.diff.matchPrecision.label")}

- This slider controls how precisely code sections must match when applying diffs. Lower - values allow more flexible matching but increase the risk of incorrect replacements. Use - values below 100% with extreme caution. + {t("settings:advanced.diff.matchPrecision.description")}

)} diff --git a/webview-ui/src/components/settings/ApiConfigManager.tsx b/webview-ui/src/components/settings/ApiConfigManager.tsx index 59d5d54f78..b7c7668930 100644 --- a/webview-ui/src/components/settings/ApiConfigManager.tsx +++ b/webview-ui/src/components/settings/ApiConfigManager.tsx @@ -1,5 +1,6 @@ import { VSCodeButton, VSCodeTextField } from "@vscode/webview-ui-toolkit/react" import { memo, useEffect, useRef, useState } from "react" +import { useAppTranslation } from "@/i18n/TranslationContext" import { ApiConfigMeta } from "../../../../src/shared/ExtensionMessage" import { Dropdown } from "vscrui" import type { DropdownOption } from "vscrui" @@ -23,6 +24,7 @@ const ApiConfigManager = ({ onRenameConfig, onUpsertConfig, }: ApiConfigManagerProps) => { + const { t } = useAppTranslation() const [isRenaming, setIsRenaming] = useState(false) const [isCreating, setIsCreating] = useState(false) const [inputValue, setInputValue] = useState("") @@ -33,18 +35,18 @@ const ApiConfigManager = ({ const validateName = (name: string, isNewProfile: boolean): string | null => { const trimmed = name.trim() - if (!trimmed) return "Name cannot be empty" + if (!trimmed) return t("settings:providers.nameEmpty") const nameExists = listApiConfigMeta?.some((config) => config.name.toLowerCase() === trimmed.toLowerCase()) // For new profiles, any existing name is invalid if (isNewProfile && nameExists) { - return "A profile with this name already exists" + return t("settings:providers.nameExists") } // For rename, only block if trying to rename to a different existing profile if (!isNewProfile && nameExists && trimmed.toLowerCase() !== currentApiConfigName?.toLowerCase()) { - return "A profile with this name already exists" + return t("settings:providers.nameExists") } return null @@ -144,7 +146,7 @@ const ApiConfigManager = ({ return (
{isRenaming ? ( @@ -160,7 +162,7 @@ const ApiConfigManager = ({ setInputValue(target.target.value) setError(null) }} - placeholder="Enter new name" + placeholder={t("settings:providers.enterNewName")} style={{ flexGrow: 1 }} onKeyDown={(e: unknown) => { const event = e as { key: string } @@ -175,7 +177,8 @@ const ApiConfigManager = ({ appearance="icon" disabled={!inputValue.trim()} onClick={handleSave} - title="Save" + title={t("settings:common.save")} + data-testid="save-rename-button" style={{ padding: 0, margin: 0, @@ -188,7 +191,8 @@ const ApiConfigManager = ({ - Save different API configurations to quickly switch between providers and settings. + {t("settings:providers.description")}

)} @@ -290,7 +301,7 @@ const ApiConfigManager = ({ }} aria-labelledby="new-profile-title"> - New Configuration Profile + {t("settings:providers.newProfile")} { const event = e as { key: string } @@ -316,11 +328,15 @@ const ApiConfigManager = ({

)}
- -
diff --git a/webview-ui/src/components/settings/ApiOptions.tsx b/webview-ui/src/components/settings/ApiOptions.tsx index 4975679642..2262df28f7 100644 --- a/webview-ui/src/components/settings/ApiOptions.tsx +++ b/webview-ui/src/components/settings/ApiOptions.tsx @@ -1,4 +1,6 @@ import React, { memo, useCallback, useEffect, useMemo, useState } from "react" +import { useAppTranslation } from "@/i18n/TranslationContext" +import { Trans } from "react-i18next" import { useDebounce, useEvent } from "react-use" import { Checkbox, Dropdown, type DropdownOption } from "vscrui" import { VSCodeLink, VSCodeRadio, VSCodeRadioGroup, VSCodeTextField } from "@vscode/webview-ui-toolkit/react" @@ -91,6 +93,7 @@ const ApiOptions = ({ errorMessage, setErrorMessage, }: ApiOptionsProps) => { + const { t } = useAppTranslation() const [ollamaModels, setOllamaModels] = useState([]) const [lmStudioModels, setLmStudioModels] = useState([]) const [vsCodeLmModels, setVsCodeLmModels] = useState([]) @@ -259,7 +262,7 @@ const ApiOptions = ({

- Adjust the WebP quality of browser screenshots. Higher values provide clearer - screenshots but increase token usage. + {t("settings:browser.screenshotQuality.description")}

@@ -183,11 +188,10 @@ export const BrowserSettings = ({ setCachedStateField("remoteBrowserHost", undefined) } }}> - Use remote browser connection + {t("settings:browser.remote.label")}

- Connect to a Chrome browser running with remote debugging enabled - (--remote-debugging-port=9222). + {t("settings:browser.remote.description")}

{remoteBrowserEnabled && ( @@ -201,13 +205,15 @@ export const BrowserSettings = ({ e.target.value || undefined, ) } - placeholder="Custom URL (e.g., http://localhost:9222)" + placeholder={t("settings:browser.remote.urlPlaceholder")} style={{ flexGrow: 1 }} /> - {testingConnection || discovering ? "Testing..." : "Test Connection"} + {testingConnection || discovering + ? t("settings:browser.remote.testingButton") + : t("settings:browser.remote.testButton")}
{testResult && ( @@ -221,10 +227,7 @@ export const BrowserSettings = ({
)}

- Enter the DevTools Protocol host address or - leave empty to auto-discover Chrome local instances. - The Test Connection button will try the custom URL if provided, or - auto-discover if the field is empty. + {t("settings:browser.remote.instructions")}

)} diff --git a/webview-ui/src/components/settings/CheckpointSettings.tsx b/webview-ui/src/components/settings/CheckpointSettings.tsx index fa3b913832..6987ba4a03 100644 --- a/webview-ui/src/components/settings/CheckpointSettings.tsx +++ b/webview-ui/src/components/settings/CheckpointSettings.tsx @@ -1,4 +1,5 @@ import { HTMLAttributes } from "react" +import { useAppTranslation } from "@/i18n/TranslationContext" import { VSCodeCheckbox } from "@vscode/webview-ui-toolkit/react" import { GitBranch } from "lucide-react" @@ -20,12 +21,13 @@ export const CheckpointSettings = ({ setCachedStateField, ...props }: CheckpointSettingsProps) => { + const { t } = useAppTranslation() return (
-
Checkpoints
+
{t("settings:sections.checkpoints")}
@@ -36,11 +38,10 @@ export const CheckpointSettings = ({ onChange={(e: any) => { setCachedStateField("enableCheckpoints", e.target.checked) }}> - Enable automatic checkpoints + {t("settings:checkpoints.enable.label")}

- When enabled, Roo will automatically create checkpoints during task execution, making it easy to - review changes or revert to earlier states. + {t("settings:checkpoints.enable.description")}

diff --git a/webview-ui/src/components/settings/ContextManagementSettings.tsx b/webview-ui/src/components/settings/ContextManagementSettings.tsx index d5f4c33f9a..de17de8dd5 100644 --- a/webview-ui/src/components/settings/ContextManagementSettings.tsx +++ b/webview-ui/src/components/settings/ContextManagementSettings.tsx @@ -1,4 +1,5 @@ import { HTMLAttributes } from "react" +import { useAppTranslation } from "@/i18n/TranslationContext" import { VSCodeCheckbox } from "@vscode/webview-ui-toolkit/react" import { Database } from "lucide-react" @@ -28,19 +29,20 @@ export const ContextManagementSettings = ({ className, ...props }: ContextManagementSettingsProps) => { + const { t } = useAppTranslation() return (
- +
-
Context Management
+
{t("settings:sections.contextManagement")}
- Terminal output limit + {t("settings:contextManagement.terminal.label")}

- Maximum number of lines to include in terminal output when executing commands. When exceeded - lines will be removed from the middle, saving tokens. + {t("settings:contextManagement.terminal.description")}

- Open tabs context limit + {t("settings:contextManagement.openTabs.label")}

- Maximum number of VSCode open tabs to include in context. Higher values provide more context but - increase token usage. + {t("settings:contextManagement.openTabs.description")}

- Workspace files context limit + {t("settings:contextManagement.workspaceFiles.label")}

- Maximum number of files to include in current working directory details. Higher values provide - more context but increase token usage. + {t("settings:contextManagement.workspaceFiles.description")}

@@ -116,11 +115,10 @@ export const ContextManagementSettings = ({ setCachedStateField("showRooIgnoredFiles", e.target.checked) }} data-testid="show-rooignored-files-checkbox"> - Show .rooignore'd files in lists and searches + {t("settings:contextManagement.rooignore.label")}

- When enabled, files matching patterns in .rooignore will be shown in lists with a lock symbol. - When disabled, these files will be completely hidden from file lists and searches. + {t("settings:contextManagement.rooignore.description")}

diff --git a/webview-ui/src/components/settings/ExperimentalFeature.tsx b/webview-ui/src/components/settings/ExperimentalFeature.tsx index e06bfc513a..93c1703f5a 100644 --- a/webview-ui/src/components/settings/ExperimentalFeature.tsx +++ b/webview-ui/src/components/settings/ExperimentalFeature.tsx @@ -1,4 +1,5 @@ import { VSCodeCheckbox } from "@vscode/webview-ui-toolkit/react" +import { useAppTranslation } from "@/i18n/TranslationContext" interface ExperimentalFeatureProps { name: string @@ -7,14 +8,18 @@ interface ExperimentalFeatureProps { onChange: (value: boolean) => void } -export const ExperimentalFeature = ({ name, description, enabled, onChange }: ExperimentalFeatureProps) => ( -
-
- ⚠️ - onChange(e.target.checked)}> - {name} - +export const ExperimentalFeature = ({ name, description, enabled, onChange }: ExperimentalFeatureProps) => { + const { t } = useAppTranslation() + + return ( +
+
+ {t("settings:experimental.warning")} + onChange(e.target.checked)}> + {name} + +
+

{description}

-

{description}

-
-) + ) +} diff --git a/webview-ui/src/components/settings/ExperimentalSettings.tsx b/webview-ui/src/components/settings/ExperimentalSettings.tsx index bbdfe47e89..f0d011dab4 100644 --- a/webview-ui/src/components/settings/ExperimentalSettings.tsx +++ b/webview-ui/src/components/settings/ExperimentalSettings.tsx @@ -1,4 +1,5 @@ import { HTMLAttributes } from "react" +import { useAppTranslation } from "@/i18n/TranslationContext" import { FlaskConical } from "lucide-react" import { EXPERIMENT_IDS, experimentConfigsMap, ExperimentId } from "../../../../src/shared/experiments" @@ -25,12 +26,13 @@ export const ExperimentalSettings = ({ className, ...props }: ExperimentalSettingsProps) => { + const { t } = useAppTranslation() return (
-
Experimental Features
+
{t("settings:sections.experimental")}
diff --git a/webview-ui/src/components/settings/ModelInfoView.tsx b/webview-ui/src/components/settings/ModelInfoView.tsx index 8e9564525f..603c5a5fe5 100644 --- a/webview-ui/src/components/settings/ModelInfoView.tsx +++ b/webview-ui/src/components/settings/ModelInfoView.tsx @@ -1,5 +1,6 @@ import { useMemo } from "react" import { VSCodeLink } from "@vscode/webview-ui-toolkit/react" +import { useAppTranslation } from "@/i18n/TranslationContext" import { formatPrice } from "@/utils/formatPrice" import { cn } from "@/lib/utils" @@ -21,59 +22,64 @@ export const ModelInfoView = ({ isDescriptionExpanded, setIsDescriptionExpanded, }: ModelInfoViewProps) => { + const { t } = useAppTranslation() const isGemini = useMemo(() => Object.keys(geminiModels).includes(selectedModelId), [selectedModelId]) const infoItems = [ , , !isGemini && ( ), modelInfo.maxTokens !== undefined && modelInfo.maxTokens > 0 && ( <> - Max output: {modelInfo.maxTokens?.toLocaleString()} tokens + {t("settings:modelInfo.maxOutput")}:{" "} + {modelInfo.maxTokens?.toLocaleString()} tokens ), modelInfo.inputPrice !== undefined && modelInfo.inputPrice > 0 && ( <> - Input price: {formatPrice(modelInfo.inputPrice)} / 1M tokens + {t("settings:modelInfo.inputPrice")}:{" "} + {formatPrice(modelInfo.inputPrice)} / 1M tokens ), modelInfo.outputPrice !== undefined && modelInfo.outputPrice > 0 && ( <> - Output price: {formatPrice(modelInfo.outputPrice)} / 1M tokens + {t("settings:modelInfo.outputPrice")}:{" "} + {formatPrice(modelInfo.outputPrice)} / 1M tokens ), modelInfo.supportsPromptCache && modelInfo.cacheReadsPrice && ( <> - Cache reads price: {formatPrice(modelInfo.cacheReadsPrice || 0)} / - 1M tokens + {t("settings:modelInfo.cacheReadsPrice")}:{" "} + {formatPrice(modelInfo.cacheReadsPrice || 0)} / 1M tokens ), modelInfo.supportsPromptCache && modelInfo.cacheWritesPrice && ( <> - Cache writes price: {formatPrice(modelInfo.cacheWritesPrice || 0)}{" "} - / 1M tokens + {t("settings:modelInfo.cacheWritesPrice")}:{" "} + {formatPrice(modelInfo.cacheWritesPrice || 0)} / 1M tokens ), isGemini && ( - * Free up to {selectedModelId && selectedModelId.includes("flash") ? "15" : "2"} requests per minute. - After that, billing depends on prompt size.{" "} + {t("settings:modelInfo.gemini.freeRequests", { + count: selectedModelId && selectedModelId.includes("flash") ? 15 : 2, + })}{" "} - For more info, see pricing details. + {t("settings:modelInfo.gemini.pricingDetails")} ), diff --git a/webview-ui/src/components/settings/NotificationSettings.tsx b/webview-ui/src/components/settings/NotificationSettings.tsx index 1fba9dd412..4466bc339b 100644 --- a/webview-ui/src/components/settings/NotificationSettings.tsx +++ b/webview-ui/src/components/settings/NotificationSettings.tsx @@ -1,4 +1,5 @@ import { HTMLAttributes } from "react" +import { useAppTranslation } from "@/i18n/TranslationContext" import { VSCodeCheckbox } from "@vscode/webview-ui-toolkit/react" import { Bell } from "lucide-react" @@ -18,12 +19,13 @@ export const NotificationSettings = ({ setCachedStateField, ...props }: NotificationSettingsProps) => { + const { t } = useAppTranslation() return (
-
Notifications
+
{t("settings:sections.notifications")}
@@ -31,11 +33,12 @@ export const NotificationSettings = ({
setCachedStateField("soundEnabled", e.target.checked)}> - Enable sound effects + onChange={(e: any) => setCachedStateField("soundEnabled", e.target.checked)} + data-testid="sound-enabled-checkbox"> + {t("settings:notifications.sound.label")}

- When enabled, Roo will play sound effects for notifications and events. + {t("settings:notifications.sound.description")}

{soundEnabled && (
setCachedStateField("soundVolume", parseFloat(e.target.value))} className="h-2 focus:outline-0 w-4/5 accent-vscode-button-background" aria-label="Volume" + data-testid="sound-volume-slider" /> {((soundVolume ?? 0.5) * 100).toFixed(0)}%
-

Volume

+

+ {t("settings:notifications.sound.volumeLabel")} +

)}
diff --git a/webview-ui/src/components/settings/SectionHeader.tsx b/webview-ui/src/components/settings/SectionHeader.tsx index 709052cea8..ee120639c9 100644 --- a/webview-ui/src/components/settings/SectionHeader.tsx +++ b/webview-ui/src/components/settings/SectionHeader.tsx @@ -7,14 +7,16 @@ type SectionHeaderProps = HTMLAttributes & { description?: string } -export const SectionHeader = ({ description, children, className, ...props }: SectionHeaderProps) => ( -
-

{children}

- {description &&

{description}

} -
-) +export const SectionHeader = ({ description, children, className, ...props }: SectionHeaderProps) => { + return ( +
+

{children}

+ {description &&

{description}

} +
+ ) +} diff --git a/webview-ui/src/components/settings/SettingsFooter.tsx b/webview-ui/src/components/settings/SettingsFooter.tsx index fba7d363c9..4d430097f3 100644 --- a/webview-ui/src/components/settings/SettingsFooter.tsx +++ b/webview-ui/src/components/settings/SettingsFooter.tsx @@ -1,6 +1,7 @@ import { HTMLAttributes } from "react" +import { useAppTranslation } from "@/i18n/TranslationContext" -import { VSCodeButton, VSCodeCheckbox, VSCodeLink } from "@vscode/webview-ui-toolkit/react" +import { VSCodeButton, VSCodeCheckbox } from "@vscode/webview-ui-toolkit/react" import { vscode } from "@/utils/vscode" import { cn } from "@/lib/utils" @@ -18,56 +19,44 @@ export const SettingsFooter = ({ setTelemetrySetting, className, ...props -}: SettingsFooterProps) => ( -
-

- If you have any questions or feedback, feel free to open an issue at{" "} - - github.com/RooVetGit/Roo-Code - {" "} - or join{" "} - - reddit.com/r/RooCode - -

-

Roo Code v{version}

-
-
- { - const checked = e.target.checked === true - setTelemetrySetting(checked ? "enabled" : "disabled") - }}> - Allow anonymous error and usage reporting - -

- Help improve Roo Code by sending anonymous usage data and error reports. No code, prompts, or - personal information is ever sent. See our{" "} - - privacy policy - {" "} - for more details. -

+}: SettingsFooterProps) => { + const { t } = useAppTranslation() + + return ( +
+

{t("settings:footer.feedback")}

+

{t("settings:footer.version", { version })}

+
+
+ { + const checked = e.target.checked === true + setTelemetrySetting(checked ? "enabled" : "disabled") + }}> + {t("settings:footer.telemetry.label")} + +

+ {t("settings:footer.telemetry.description")} +

+
+
+
+

{t("settings:footer.reset.description")}

+ vscode.postMessage({ type: "resetState" })} + appearance="secondary" + className="shrink-0"> + + {t("settings:footer.reset.button")} +
-
-

Reset all global state and secret storage in the extension.

- vscode.postMessage({ type: "resetState" })} - appearance="secondary" - className="shrink-0"> - - Reset - -
-
-) + ) +} diff --git a/webview-ui/src/components/settings/SettingsView.tsx b/webview-ui/src/components/settings/SettingsView.tsx index 1cdc1d00fa..b6fbed748a 100644 --- a/webview-ui/src/components/settings/SettingsView.tsx +++ b/webview-ui/src/components/settings/SettingsView.tsx @@ -1,4 +1,5 @@ import { forwardRef, memo, useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState } from "react" +import { useAppTranslation } from "@/i18n/TranslationContext" import { Button as VSCodeButton } from "vscrui" import { CheckCheck, @@ -55,6 +56,7 @@ type SettingsViewProps = { } const SettingsView = forwardRef(({ onDone }, ref) => { + const { t } = useAppTranslation() const extensionState = useExtensionState() const { currentApiConfigName, listApiConfigMeta, uriScheme, version } = extensionState @@ -286,7 +288,7 @@ const SettingsView = forwardRef(({ onDone },
-

Settings

+

{t("settings:header.title")}

{sections.map(({ id, icon: Icon, ref }) => (
@@ -322,7 +331,7 @@ const SettingsView = forwardRef(({ onDone },
-
Providers
+
{t("settings:sections.providers")}
@@ -449,14 +458,18 @@ const SettingsView = forwardRef(({ onDone }, - Unsaved Changes + {t("settings:unsavedChangesDialog.title")} - Do you want to discard changes and continue? + + {t("settings:unsavedChangesDialog.description")} + - onConfirmDialogResult(false)}>Cancel + onConfirmDialogResult(false)}> + {t("settings:unsavedChangesDialog.cancelButton")} + onConfirmDialogResult(true)}> - Discard changes + {t("settings:unsavedChangesDialog.discardButton")} diff --git a/webview-ui/src/components/settings/TemperatureControl.tsx b/webview-ui/src/components/settings/TemperatureControl.tsx index 7502c3d1f3..816ec7c8f5 100644 --- a/webview-ui/src/components/settings/TemperatureControl.tsx +++ b/webview-ui/src/components/settings/TemperatureControl.tsx @@ -1,5 +1,6 @@ import { VSCodeCheckbox } from "@vscode/webview-ui-toolkit/react" import { useEffect, useState } from "react" +import { useAppTranslation } from "@/i18n/TranslationContext" import { useDebounce } from "react-use" interface TemperatureControlProps { @@ -9,6 +10,7 @@ interface TemperatureControlProps { } export const TemperatureControl = ({ value, onChange, maxValue = 1 }: TemperatureControlProps) => { + const { t } = useAppTranslation() const [isCustomTemperature, setIsCustomTemperature] = useState(value !== undefined) const [inputValue, setInputValue] = useState(value) useDebounce(() => onChange(inputValue), 50, [onChange, inputValue]) @@ -33,11 +35,9 @@ export const TemperatureControl = ({ value, onChange, maxValue = 1 }: Temperatur setInputValue(value ?? 0) // Use the value from apiConfiguration, if set } }}> - Use custom temperature + {t("settings:temperature.useCustom")} -
- Controls randomness in the model's responses. -
+
{t("settings:temperature.description")}
{isCustomTemperature && ( @@ -60,7 +60,7 @@ export const TemperatureControl = ({ value, onChange, maxValue = 1 }: Temperatur {inputValue}

- Higher values make output more random, lower values make it more deterministic. + {t("settings:temperature.rangeDescription")}

)} diff --git a/webview-ui/src/components/settings/__tests__/ApiConfigManager.test.tsx b/webview-ui/src/components/settings/__tests__/ApiConfigManager.test.tsx index 92a6a1cd03..81431db2f7 100644 --- a/webview-ui/src/components/settings/__tests__/ApiConfigManager.test.tsx +++ b/webview-ui/src/components/settings/__tests__/ApiConfigManager.test.tsx @@ -3,17 +3,18 @@ import ApiConfigManager from "../ApiConfigManager" // Mock VSCode components jest.mock("@vscode/webview-ui-toolkit/react", () => ({ - VSCodeButton: ({ children, onClick, title, disabled }: any) => ( - ), - VSCodeTextField: ({ value, onInput, placeholder, onKeyDown }: any) => ( + VSCodeTextField: ({ value, onInput, placeholder, onKeyDown, "data-testid": dataTestId }: any) => ( onInput(e)} placeholder={placeholder} onKeyDown={onKeyDown} + data-testid={dataTestId} ref={undefined} // Explicitly set ref to undefined to avoid warning /> ), @@ -44,6 +45,24 @@ jest.mock("@/components/ui/dialog", () => ({ DialogTitle: ({ children }: any) =>
{children}
, })) +// Mock UI components +jest.mock("@/components/ui", () => ({ + Button: ({ children, onClick, disabled, variant, "data-testid": dataTestId }: any) => ( + + ), + Input: ({ value, onInput, placeholder, onKeyDown, "data-testid": dataTestId }: any) => ( + onInput(e)} + placeholder={placeholder} + onKeyDown={onKeyDown} + data-testid={dataTestId} + /> + ), +})) + describe("ApiConfigManager", () => { const mockOnSelectConfig = jest.fn() const mockOnDeleteConfig = jest.fn() @@ -72,26 +91,26 @@ describe("ApiConfigManager", () => { it("opens new profile dialog when clicking add button", () => { render() - const addButton = screen.getByTitle("Add profile") + const addButton = screen.getByTestId("add-profile-button") fireEvent.click(addButton) expect(screen.getByTestId("dialog")).toBeVisible() - expect(screen.getByText("New Configuration Profile")).toBeInTheDocument() + expect(screen.getByTestId("dialog-title")).toHaveTextContent("settings:providers.newProfile") }) it("creates new profile with entered name", () => { render() // Open dialog - const addButton = screen.getByTitle("Add profile") + const addButton = screen.getByTestId("add-profile-button") fireEvent.click(addButton) // Enter new profile name - const input = screen.getByPlaceholderText("Enter profile name") + const input = screen.getByTestId("new-profile-input") fireEvent.input(input, { target: { value: "New Profile" } }) // Click create button - const createButton = screen.getByText("Create Profile") + const createButton = screen.getByText("settings:providers.createProfile") fireEvent.click(createButton) expect(mockOnUpsertConfig).toHaveBeenCalledWith("New Profile") @@ -101,21 +120,21 @@ describe("ApiConfigManager", () => { render() // Open dialog - const addButton = screen.getByTitle("Add profile") + const addButton = screen.getByTestId("add-profile-button") fireEvent.click(addButton) // Enter existing profile name - const input = screen.getByPlaceholderText("Enter profile name") + const input = screen.getByTestId("new-profile-input") fireEvent.input(input, { target: { value: "Default Config" } }) // Click create button to trigger validation - const createButton = screen.getByText("Create Profile") + const createButton = screen.getByText("settings:providers.createProfile") fireEvent.click(createButton) // Verify error message const dialogContent = getDialogContent() const errorMessage = within(dialogContent).getByTestId("error-message") - expect(errorMessage).toHaveTextContent("A profile with this name already exists") + expect(errorMessage).toHaveTextContent("settings:providers.nameExists") expect(mockOnUpsertConfig).not.toHaveBeenCalled() }) @@ -123,15 +142,15 @@ describe("ApiConfigManager", () => { render() // Open dialog - const addButton = screen.getByTitle("Add profile") + const addButton = screen.getByTestId("add-profile-button") fireEvent.click(addButton) // Enter empty name - const input = screen.getByPlaceholderText("Enter profile name") + const input = screen.getByTestId("new-profile-input") fireEvent.input(input, { target: { value: " " } }) // Verify create button is disabled - const createButton = screen.getByText("Create Profile") + const createButton = screen.getByText("settings:providers.createProfile") expect(createButton).toBeDisabled() expect(mockOnUpsertConfig).not.toHaveBeenCalled() }) @@ -140,7 +159,7 @@ describe("ApiConfigManager", () => { render() // Start rename - const renameButton = screen.getByTitle("Rename profile") + const renameButton = screen.getByTestId("rename-profile-button") fireEvent.click(renameButton) // Find input and enter new name @@ -148,7 +167,7 @@ describe("ApiConfigManager", () => { fireEvent.input(input, { target: { value: "New Name" } }) // Save - const saveButton = screen.getByTitle("Save") + const saveButton = screen.getByTestId("save-rename-button") fireEvent.click(saveButton) expect(mockOnRenameConfig).toHaveBeenCalledWith("Default Config", "New Name") @@ -158,7 +177,7 @@ describe("ApiConfigManager", () => { render() // Start rename - const renameButton = screen.getByTitle("Rename profile") + const renameButton = screen.getByTestId("rename-profile-button") fireEvent.click(renameButton) // Find input and enter existing name @@ -166,13 +185,13 @@ describe("ApiConfigManager", () => { fireEvent.input(input, { target: { value: "Another Config" } }) // Save to trigger validation - const saveButton = screen.getByTitle("Save") + const saveButton = screen.getByTestId("save-rename-button") fireEvent.click(saveButton) // Verify error message const renameForm = getRenameForm() const errorMessage = within(renameForm).getByTestId("error-message") - expect(errorMessage).toHaveTextContent("A profile with this name already exists") + expect(errorMessage).toHaveTextContent("settings:providers.nameExists") expect(mockOnRenameConfig).not.toHaveBeenCalled() }) @@ -180,7 +199,7 @@ describe("ApiConfigManager", () => { render() // Start rename - const renameButton = screen.getByTitle("Rename profile") + const renameButton = screen.getByTestId("rename-profile-button") fireEvent.click(renameButton) // Find input and enter empty name @@ -188,7 +207,7 @@ describe("ApiConfigManager", () => { fireEvent.input(input, { target: { value: " " } }) // Verify save button is disabled - const saveButton = screen.getByTitle("Save") + const saveButton = screen.getByTestId("save-rename-button") expect(saveButton).toBeDisabled() expect(mockOnRenameConfig).not.toHaveBeenCalled() }) @@ -205,7 +224,7 @@ describe("ApiConfigManager", () => { it("allows deleting the current config when not the only one", () => { render() - const deleteButton = screen.getByTitle("Delete profile") + const deleteButton = screen.getByTestId("delete-profile-button") expect(deleteButton).not.toBeDisabled() fireEvent.click(deleteButton) @@ -215,7 +234,7 @@ describe("ApiConfigManager", () => { it("disables delete button when only one config exists", () => { render() - const deleteButton = screen.getByTitle("Cannot delete the only profile") + const deleteButton = screen.getByTestId("delete-profile-button") expect(deleteButton).toHaveAttribute("disabled") }) @@ -223,7 +242,7 @@ describe("ApiConfigManager", () => { render() // Start rename - const renameButton = screen.getByTitle("Rename profile") + const renameButton = screen.getByTestId("rename-profile-button") fireEvent.click(renameButton) // Find input and enter new name @@ -231,7 +250,7 @@ describe("ApiConfigManager", () => { fireEvent.input(input, { target: { value: "New Name" } }) // Cancel - const cancelButton = screen.getByTitle("Cancel") + const cancelButton = screen.getByTestId("cancel-rename-button") fireEvent.click(cancelButton) // Verify rename was not called @@ -245,10 +264,10 @@ describe("ApiConfigManager", () => { render() // Open dialog - const addButton = screen.getByTitle("Add profile") + const addButton = screen.getByTestId("add-profile-button") fireEvent.click(addButton) - const input = screen.getByPlaceholderText("Enter profile name") + const input = screen.getByTestId("new-profile-input") // Test Enter key fireEvent.input(input, { target: { value: "New Profile" } }) @@ -264,7 +283,7 @@ describe("ApiConfigManager", () => { render() // Start rename - const renameButton = screen.getByTitle("Rename profile") + const renameButton = screen.getByTestId("rename-profile-button") fireEvent.click(renameButton) const input = screen.getByDisplayValue("Default Config") diff --git a/webview-ui/src/components/settings/__tests__/ContextManagementSettings.test.tsx b/webview-ui/src/components/settings/__tests__/ContextManagementSettings.test.tsx index 25e7fa3e50..a9708d260e 100644 --- a/webview-ui/src/components/settings/__tests__/ContextManagementSettings.test.tsx +++ b/webview-ui/src/components/settings/__tests__/ContextManagementSettings.test.tsx @@ -18,19 +18,23 @@ describe("ContextManagementSettings", () => { render() // Terminal output limit - expect(screen.getByText("Terminal output limit")).toBeInTheDocument() - expect(screen.getByTestId("terminal-output-limit-slider")).toHaveValue("500") + const terminalSlider = screen.getByTestId("terminal-output-limit-slider") + expect(terminalSlider).toBeInTheDocument() + expect(terminalSlider).toHaveValue("500") // Open tabs context limit - expect(screen.getByText("Open tabs context limit")).toBeInTheDocument() - expect(screen.getByTestId("open-tabs-limit-slider")).toHaveValue("20") + const openTabsSlider = screen.getByTestId("open-tabs-limit-slider") + expect(openTabsSlider).toBeInTheDocument() + expect(openTabsSlider).toHaveValue("20") // Workspace files limit - expect(screen.getByText("Workspace files context limit")).toBeInTheDocument() - expect(screen.getByTestId("workspace-files-limit-slider")).toHaveValue("200") + const workspaceFilesSlider = screen.getByTestId("workspace-files-limit-slider") + expect(workspaceFilesSlider).toBeInTheDocument() + expect(workspaceFilesSlider).toHaveValue("200") // Show .rooignore'd files - expect(screen.getByText("Show .rooignore'd files in lists and searches")).toBeInTheDocument() + const showRooIgnoredFilesCheckbox = screen.getByTestId("show-rooignored-files-checkbox") + expect(showRooIgnoredFilesCheckbox).toBeInTheDocument() expect(screen.getByTestId("show-rooignored-files-checkbox")).not.toBeChecked() }) diff --git a/webview-ui/src/components/settings/__tests__/SettingsView.test.tsx b/webview-ui/src/components/settings/__tests__/SettingsView.test.tsx index 5e5defec59..95b3bb8fa5 100644 --- a/webview-ui/src/components/settings/__tests__/SettingsView.test.tsx +++ b/webview-ui/src/components/settings/__tests__/SettingsView.test.tsx @@ -40,33 +40,39 @@ jest.mock("../ApiConfigManager", () => ({ // Mock VSCode components jest.mock("@vscode/webview-ui-toolkit/react", () => ({ - VSCodeButton: ({ children, onClick, appearance }: any) => + VSCodeButton: ({ children, onClick, appearance, "data-testid": dataTestId }: any) => appearance === "icon" ? ( - ) : ( - ), - VSCodeCheckbox: ({ children, onChange, checked }: any) => ( + VSCodeCheckbox: ({ children, onChange, checked, "data-testid": dataTestId }: any) => ( ), - VSCodeTextField: ({ value, onInput, placeholder }: any) => ( + VSCodeTextField: ({ value, onInput, placeholder, "data-testid": dataTestId }: any) => ( onInput({ target: { value: e.target.value } })} placeholder={placeholder} + data-testid={dataTestId} /> ), VSCodeTextArea: () =>