Просмотр исходного кода

Merge branch 'main' into support_project_mcp

# Conflicts:
#	webview-ui/src/i18n/locales/ar/mcp.json
#	webview-ui/src/i18n/locales/cs/mcp.json
#	webview-ui/src/i18n/locales/hu/mcp.json
#	webview-ui/src/i18n/locales/pt/mcp.json
#	webview-ui/src/i18n/locales/ru/mcp.json
aheizi 11 месяцев назад
Родитель
Сommit
bda929b4f6
100 измененных файлов с 3554 добавлено и 1610 удалено
  1. 0 1
      .roomodes
  2. 2 1
      knip.json
  3. 218 0
      scripts/find-missing-translations.js
  4. 11 3
      src/core/webview/ClineProvider.ts
  5. 1 0
      src/exports/roo-code.d.ts
  6. 1 0
      src/shared/WebviewMessage.ts
  7. 0 3
      src/shared/__tests__/experiments.test.ts
  8. 1 32
      src/shared/experiments.ts
  9. 1 0
      src/shared/globalState.ts
  10. 0 9
      src/shared/tool-groups.ts
  11. 6 6
      webview-ui/src/components/common/TelemetryBanner.tsx
  12. 1 0
      webview-ui/src/components/history/CopyButton.tsx
  13. 15 4
      webview-ui/src/components/history/HistoryView.tsx
  14. 10 13
      webview-ui/src/components/history/__tests__/HistoryView.test.tsx
  15. 4 4
      webview-ui/src/components/prompts/PromptsView.tsx
  16. 24 17
      webview-ui/src/components/settings/AdvancedSettings.tsx
  17. 33 17
      webview-ui/src/components/settings/ApiConfigManager.tsx
  18. 22 14
      webview-ui/src/components/settings/ApiOptions.tsx
  19. 51 36
      webview-ui/src/components/settings/AutoApproveSettings.tsx
  20. 26 23
      webview-ui/src/components/settings/BrowserSettings.tsx
  21. 5 4
      webview-ui/src/components/settings/CheckpointSettings.tsx
  22. 12 14
      webview-ui/src/components/settings/ContextManagementSettings.tsx
  23. 21 12
      webview-ui/src/components/settings/ExperimentalFeature.tsx
  24. 4 2
      webview-ui/src/components/settings/ExperimentalSettings.tsx
  25. 22 16
      webview-ui/src/components/settings/ModelInfoView.tsx
  26. 12 9
      webview-ui/src/components/settings/ModelPicker.tsx
  27. 11 5
      webview-ui/src/components/settings/NotificationSettings.tsx
  28. 13 11
      webview-ui/src/components/settings/SectionHeader.tsx
  29. 94 51
      webview-ui/src/components/settings/SettingsFooter.tsx
  30. 38 12
      webview-ui/src/components/settings/SettingsView.tsx
  31. 5 5
      webview-ui/src/components/settings/TemperatureControl.tsx
  32. 48 29
      webview-ui/src/components/settings/__tests__/ApiConfigManager.test.tsx
  33. 11 7
      webview-ui/src/components/settings/__tests__/ContextManagementSettings.test.tsx
  34. 39 51
      webview-ui/src/components/settings/__tests__/SettingsView.test.tsx
  35. 52 57
      webview-ui/src/i18n/__mocks__/TranslationContext.tsx
  36. 0 0
      webview-ui/src/i18n/locales/ar/.gitkeep
  37. 0 113
      webview-ui/src/i18n/locales/ar/chat.json
  38. 0 8
      webview-ui/src/i18n/locales/ar/common.json
  39. 0 25
      webview-ui/src/i18n/locales/ar/history.json
  40. 0 52
      webview-ui/src/i18n/locales/ar/mcp.json
  41. 0 140
      webview-ui/src/i18n/locales/ar/prompts.json
  42. 0 6
      webview-ui/src/i18n/locales/ar/welcome.json
  43. 1 8
      webview-ui/src/i18n/locales/ca/common.json
  44. 8 1
      webview-ui/src/i18n/locales/ca/prompts.json
  45. 228 0
      webview-ui/src/i18n/locales/ca/settings.json
  46. 9 1
      webview-ui/src/i18n/locales/ca/welcome.json
  47. 0 0
      webview-ui/src/i18n/locales/cs/.gitkeep
  48. 0 113
      webview-ui/src/i18n/locales/cs/chat.json
  49. 0 8
      webview-ui/src/i18n/locales/cs/common.json
  50. 0 25
      webview-ui/src/i18n/locales/cs/history.json
  51. 0 52
      webview-ui/src/i18n/locales/cs/mcp.json
  52. 0 140
      webview-ui/src/i18n/locales/cs/prompts.json
  53. 0 6
      webview-ui/src/i18n/locales/cs/welcome.json
  54. 1 8
      webview-ui/src/i18n/locales/de/common.json
  55. 8 1
      webview-ui/src/i18n/locales/de/prompts.json
  56. 228 0
      webview-ui/src/i18n/locales/de/settings.json
  57. 9 1
      webview-ui/src/i18n/locales/de/welcome.json
  58. 1 8
      webview-ui/src/i18n/locales/en/common.json
  59. 8 1
      webview-ui/src/i18n/locales/en/prompts.json
  60. 228 0
      webview-ui/src/i18n/locales/en/settings.json
  61. 9 1
      webview-ui/src/i18n/locales/en/welcome.json
  62. 1 8
      webview-ui/src/i18n/locales/es/common.json
  63. 8 1
      webview-ui/src/i18n/locales/es/prompts.json
  64. 228 0
      webview-ui/src/i18n/locales/es/settings.json
  65. 9 1
      webview-ui/src/i18n/locales/es/welcome.json
  66. 1 8
      webview-ui/src/i18n/locales/fr/common.json
  67. 8 1
      webview-ui/src/i18n/locales/fr/prompts.json
  68. 228 0
      webview-ui/src/i18n/locales/fr/settings.json
  69. 9 1
      webview-ui/src/i18n/locales/fr/welcome.json
  70. 1 8
      webview-ui/src/i18n/locales/hi/common.json
  71. 8 1
      webview-ui/src/i18n/locales/hi/prompts.json
  72. 228 0
      webview-ui/src/i18n/locales/hi/settings.json
  73. 9 1
      webview-ui/src/i18n/locales/hi/welcome.json
  74. 0 0
      webview-ui/src/i18n/locales/hu/.gitkeep
  75. 0 113
      webview-ui/src/i18n/locales/hu/chat.json
  76. 0 8
      webview-ui/src/i18n/locales/hu/common.json
  77. 0 25
      webview-ui/src/i18n/locales/hu/history.json
  78. 0 52
      webview-ui/src/i18n/locales/hu/mcp.json
  79. 0 140
      webview-ui/src/i18n/locales/hu/prompts.json
  80. 0 6
      webview-ui/src/i18n/locales/hu/welcome.json
  81. 1 8
      webview-ui/src/i18n/locales/it/common.json
  82. 8 1
      webview-ui/src/i18n/locales/it/prompts.json
  83. 228 0
      webview-ui/src/i18n/locales/it/settings.json
  84. 9 1
      webview-ui/src/i18n/locales/it/welcome.json
  85. 1 8
      webview-ui/src/i18n/locales/ja/common.json
  86. 8 1
      webview-ui/src/i18n/locales/ja/prompts.json
  87. 228 0
      webview-ui/src/i18n/locales/ja/settings.json
  88. 9 1
      webview-ui/src/i18n/locales/ja/welcome.json
  89. 1 8
      webview-ui/src/i18n/locales/ko/common.json
  90. 8 1
      webview-ui/src/i18n/locales/ko/prompts.json
  91. 228 0
      webview-ui/src/i18n/locales/ko/settings.json
  92. 9 1
      webview-ui/src/i18n/locales/ko/welcome.json
  93. 1 8
      webview-ui/src/i18n/locales/pl/common.json
  94. 8 1
      webview-ui/src/i18n/locales/pl/prompts.json
  95. 228 0
      webview-ui/src/i18n/locales/pl/settings.json
  96. 9 1
      webview-ui/src/i18n/locales/pl/welcome.json
  97. 1 8
      webview-ui/src/i18n/locales/pt-BR/common.json
  98. 42 1
      webview-ui/src/i18n/locales/pt-BR/prompts.json
  99. 228 0
      webview-ui/src/i18n/locales/pt-BR/settings.json
  100. 9 1
      webview-ui/src/i18n/locales/pt-BR/welcome.json

Разница между файлами не показана из-за своего большого размера
+ 0 - 1
.roomodes


+ 2 - 1
knip.json

@@ -16,7 +16,8 @@
 		"e2e/**",
 		"e2e/**",
 		"src/activate/**",
 		"src/activate/**",
 		"src/exports/**",
 		"src/exports/**",
-		"src/extension.ts"
+		"src/extension.ts",
+		"scripts/**"
 	],
 	],
 	"workspaces": {
 	"workspaces": {
 		"webview-ui": {
 		"webview-ui": {

+ 218 - 0
scripts/find-missing-translations.js

@@ -0,0 +1,218 @@
+/**
+ * Script to find missing translations in locale files
+ *
+ * Usage:
+ *   node scripts/find-missing-translations.js [options]
+ *
+ * Options:
+ *   --locale=<locale>   Only check a specific locale (e.g. --locale=fr)
+ *   --file=<file>       Only check a specific file (e.g. --file=chat.json)
+ *   --help              Show this help message
+ */
+
+const fs = require("fs")
+const path = require("path")
+
+// Process command line arguments
+const args = process.argv.slice(2).reduce((acc, arg) => {
+	if (arg === "--help") {
+		acc.help = true
+	} else if (arg.startsWith("--locale=")) {
+		acc.locale = arg.split("=")[1]
+	} else if (arg.startsWith("--file=")) {
+		acc.file = arg.split("=")[1]
+	}
+	return acc
+}, {})
+
+// Show help if requested
+if (args.help) {
+	console.log(`
+Find Missing Translations
+
+A utility script to identify missing translations across locale files.
+Compares non-English locale files to the English ones to find any missing keys.
+
+Usage: 
+  node scripts/find-missing-translations.js [options]
+
+Options:
+  --locale=<locale>   Only check a specific locale (e.g. --locale=fr)
+  --file=<file>       Only check a specific file (e.g. --file=chat.json)
+  --help              Show this help message
+
+Output:
+  - Generates a report of missing translations
+  `)
+	process.exit(0)
+}
+
+// Path to the locales directory
+const LOCALES_DIR = path.join(__dirname, "../webview-ui/src/i18n/locales")
+
+// Recursively find all keys in an object
+function findKeys(obj, parentKey = "") {
+	let keys = []
+
+	for (const [key, value] of Object.entries(obj)) {
+		const currentKey = parentKey ? `${parentKey}.${key}` : key
+
+		if (typeof value === "object" && value !== null) {
+			// If value is an object, recurse
+			keys = [...keys, ...findKeys(value, currentKey)]
+		} else {
+			// If value is a primitive, add the key
+			keys.push(currentKey)
+		}
+	}
+
+	return keys
+}
+
+// Get value at a dotted path in an object
+function getValueAtPath(obj, path) {
+	const parts = path.split(".")
+	let current = obj
+
+	for (const part of parts) {
+		if (current === undefined || current === null) {
+			return undefined
+		}
+		current = current[part]
+	}
+
+	return current
+}
+
+// Main function to find missing translations
+function findMissingTranslations() {
+	try {
+		// Get all locale directories (or filter to the specified locale)
+		const allLocales = fs.readdirSync(LOCALES_DIR).filter((item) => {
+			const stats = fs.statSync(path.join(LOCALES_DIR, item))
+			return stats.isDirectory() && item !== "en" // Exclude English as it's our source
+		})
+
+		// Filter to the specified locale if provided
+		const locales = args.locale ? allLocales.filter((locale) => locale === args.locale) : allLocales
+
+		if (args.locale && locales.length === 0) {
+			console.error(`Error: Locale '${args.locale}' not found in ${LOCALES_DIR}`)
+			process.exit(1)
+		}
+
+		console.log(`Checking ${locales.length} non-English locale(s): ${locales.join(", ")}`)
+
+		// Get all English JSON files
+		const englishDir = path.join(LOCALES_DIR, "en")
+		let englishFiles = fs.readdirSync(englishDir).filter((file) => file.endsWith(".json") && !file.startsWith("."))
+
+		// Filter to the specified file if provided
+		if (args.file) {
+			if (!englishFiles.includes(args.file)) {
+				console.error(`Error: File '${args.file}' not found in ${englishDir}`)
+				process.exit(1)
+			}
+			englishFiles = englishFiles.filter((file) => file === args.file)
+		}
+
+		// Load file contents
+		const englishFileContents = englishFiles.map((file) => ({
+			name: file,
+			content: JSON.parse(fs.readFileSync(path.join(englishDir, file), "utf8")),
+		}))
+
+		console.log(
+			`Checking ${englishFileContents.length} translation file(s): ${englishFileContents.map((f) => f.name).join(", ")}`,
+		)
+
+		// Results object to store missing translations
+		const missingTranslations = {}
+
+		// For each locale, check for missing translations
+		for (const locale of locales) {
+			missingTranslations[locale] = {}
+
+			for (const { name, content: englishContent } of englishFileContents) {
+				const localeFilePath = path.join(LOCALES_DIR, locale, name)
+
+				// Check if the file exists in the locale
+				if (!fs.existsSync(localeFilePath)) {
+					missingTranslations[locale][name] = { file: "File is missing entirely" }
+					continue
+				}
+
+				// Load the locale file
+				const localeContent = JSON.parse(fs.readFileSync(localeFilePath, "utf8"))
+
+				// Find all keys in the English file
+				const englishKeys = findKeys(englishContent)
+
+				// Check for missing keys in the locale file
+				const missingKeys = []
+
+				for (const key of englishKeys) {
+					const englishValue = getValueAtPath(englishContent, key)
+					const localeValue = getValueAtPath(localeContent, key)
+
+					if (localeValue === undefined) {
+						missingKeys.push({
+							key,
+							englishValue,
+						})
+					}
+				}
+
+				if (missingKeys.length > 0) {
+					missingTranslations[locale][name] = missingKeys
+				}
+			}
+		}
+
+		// Output results
+		let hasMissingTranslations = false
+
+		console.log("\nMissing Translations Report:\n")
+
+		for (const [locale, files] of Object.entries(missingTranslations)) {
+			if (Object.keys(files).length === 0) {
+				console.log(`✅ ${locale}: No missing translations`)
+				continue
+			}
+
+			hasMissingTranslations = true
+			console.log(`📝 ${locale}:`)
+
+			for (const [fileName, missingItems] of Object.entries(files)) {
+				if (missingItems.file) {
+					console.log(`  - ${fileName}: ${missingItems.file}`)
+					continue
+				}
+
+				console.log(`  - ${fileName}: ${missingItems.length} missing translations`)
+
+				for (const { key, englishValue } of missingItems) {
+					console.log(`      ${key}: "${englishValue}"`)
+				}
+			}
+
+			console.log("")
+		}
+
+		if (!hasMissingTranslations) {
+			console.log("\n✅ All translations are complete!")
+		} else {
+			console.log("✏️  To add missing translations:")
+			console.log("1. Add the missing keys to the corresponding locale files")
+			console.log("2. Translate the English values to the appropriate language")
+			console.log("3. Run this script again to verify all translations are complete")
+		}
+	} catch (error) {
+		console.error("Error:", error.message)
+		console.error(error.stack)
+		process.exit(1)
+	}
+}
+
+// Run the main function
+findMissingTranslations()

+ 11 - 3
src/core/webview/ClineProvider.ts

@@ -1549,6 +1549,10 @@ export class ClineProvider implements vscode.WebviewViewProvider {
 						await this.updateGlobalState("browserToolEnabled", message.bool ?? true)
 						await this.updateGlobalState("browserToolEnabled", message.bool ?? true)
 						await this.postStateToWebview()
 						await this.postStateToWebview()
 						break
 						break
+					case "language":
+						await this.updateGlobalState("language", message.text)
+						await this.postStateToWebview()
+						break
 					case "showRooIgnoredFiles":
 					case "showRooIgnoredFiles":
 						await this.updateGlobalState("showRooIgnoredFiles", message.bool ?? true)
 						await this.updateGlobalState("showRooIgnoredFiles", message.bool ?? true)
 						await this.postStateToWebview()
 						await this.postStateToWebview()
@@ -2528,8 +2532,7 @@ export class ClineProvider implements vscode.WebviewViewProvider {
 			writeDelayMs: stateValues.writeDelayMs ?? 1000,
 			writeDelayMs: stateValues.writeDelayMs ?? 1000,
 			terminalOutputLineLimit: stateValues.terminalOutputLineLimit ?? 500,
 			terminalOutputLineLimit: stateValues.terminalOutputLineLimit ?? 500,
 			mode: stateValues.mode ?? defaultModeSlug,
 			mode: stateValues.mode ?? defaultModeSlug,
-			// Pass the VSCode language code directly
-			language: formatLanguage(vscode.env.language),
+			language: stateValues.language || formatLanguage(vscode.env.language),
 			mcpEnabled: stateValues.mcpEnabled ?? true,
 			mcpEnabled: stateValues.mcpEnabled ?? true,
 			enableMcpServerCreation: stateValues.enableMcpServerCreation ?? true,
 			enableMcpServerCreation: stateValues.enableMcpServerCreation ?? true,
 			alwaysApproveResubmit: stateValues.alwaysApproveResubmit ?? false,
 			alwaysApproveResubmit: stateValues.alwaysApproveResubmit ?? false,
@@ -2641,7 +2644,7 @@ export class ClineProvider implements vscode.WebviewViewProvider {
 	 * like the current mode, API provider, etc.
 	 * like the current mode, API provider, etc.
 	 */
 	 */
 	public async getTelemetryProperties(): Promise<Record<string, any>> {
 	public async getTelemetryProperties(): Promise<Record<string, any>> {
-		const { mode, apiConfiguration } = await this.getState()
+		const { mode, apiConfiguration, language } = await this.getState()
 		const appVersion = this.context.extension?.packageJSON?.version
 		const appVersion = this.context.extension?.packageJSON?.version
 		const vscodeVersion = vscode.version
 		const vscodeVersion = vscode.version
 		const platform = process.platform
 		const platform = process.platform
@@ -2656,6 +2659,11 @@ export class ClineProvider implements vscode.WebviewViewProvider {
 			properties.appVersion = appVersion
 			properties.appVersion = appVersion
 		}
 		}
 
 
+		// Add language
+		if (language) {
+			properties.language = language
+		}
+
 		// Add current mode
 		// Add current mode
 		if (mode) {
 		if (mode) {
 			properties.mode = mode
 			properties.mode = mode

+ 1 - 0
src/exports/roo-code.d.ts

@@ -218,6 +218,7 @@ export type GlobalStateKey =
 	| "telemetrySetting"
 	| "telemetrySetting"
 	| "showRooIgnoredFiles"
 	| "showRooIgnoredFiles"
 	| "remoteBrowserEnabled"
 	| "remoteBrowserEnabled"
+	| "language"
 
 
 export type ConfigurationKey = GlobalStateKey | SecretKey
 export type ConfigurationKey = GlobalStateKey | SecretKey
 
 

+ 1 - 0
src/shared/WebviewMessage.ts

@@ -108,6 +108,7 @@ export interface WebviewMessage {
 		| "discoverBrowser"
 		| "discoverBrowser"
 		| "browserConnectionResult"
 		| "browserConnectionResult"
 		| "remoteBrowserEnabled"
 		| "remoteBrowserEnabled"
+		| "language"
 	text?: string
 	text?: string
 	disabled?: boolean
 	disabled?: boolean
 	askResponse?: ClineAskResponse
 	askResponse?: ClineAskResponse

+ 0 - 3
src/shared/__tests__/experiments.test.ts

@@ -5,9 +5,6 @@ describe("experiments", () => {
 		it("is configured correctly", () => {
 		it("is configured correctly", () => {
 			expect(EXPERIMENT_IDS.POWER_STEERING).toBe("powerSteering")
 			expect(EXPERIMENT_IDS.POWER_STEERING).toBe("powerSteering")
 			expect(experimentConfigsMap.POWER_STEERING).toMatchObject({
 			expect(experimentConfigsMap.POWER_STEERING).toMatchObject({
-				name: 'Use experimental "power steering" mode',
-				description:
-					"When enabled, Roo will remind the model about the details of its current mode definition more frequently. This will lead to stronger adherence to role definitions and custom instructions, but will use more tokens per message.",
 				enabled: false,
 				enabled: false,
 			})
 			})
 		})
 		})

+ 1 - 32
src/shared/experiments.ts

@@ -10,8 +10,6 @@ export type ExperimentKey = keyof typeof EXPERIMENT_IDS
 export type ExperimentId = valueof<typeof EXPERIMENT_IDS>
 export type ExperimentId = valueof<typeof EXPERIMENT_IDS>
 
 
 export interface ExperimentConfig {
 export interface ExperimentConfig {
-	name: string
-	description: string
 	enabled: boolean
 	enabled: boolean
 }
 }
 
 
@@ -19,34 +17,18 @@ type valueof<X> = X[keyof X]
 
 
 export const experimentConfigsMap: Record<ExperimentKey, ExperimentConfig> = {
 export const experimentConfigsMap: Record<ExperimentKey, ExperimentConfig> = {
 	DIFF_STRATEGY: {
 	DIFF_STRATEGY: {
-		name: "Use experimental unified diff strategy",
-		description:
-			"Enable the experimental unified diff strategy. This strategy might reduce the number of retries caused by model errors but may cause unexpected behavior or incorrect edits. Only enable if you understand the risks and are willing to carefully review all changes.",
 		enabled: false,
 		enabled: false,
 	},
 	},
 	SEARCH_AND_REPLACE: {
 	SEARCH_AND_REPLACE: {
-		name: "Use experimental search and replace tool",
-		description:
-			"Enable the experimental search and replace tool, allowing Roo to replace multiple instances of a search term in one request.",
 		enabled: false,
 		enabled: false,
 	},
 	},
 	INSERT_BLOCK: {
 	INSERT_BLOCK: {
-		name: "Use experimental insert content tool",
-
-		description:
-			"Enable the experimental insert content tool, allowing Roo to insert content at specific line numbers without needing to create a diff.",
 		enabled: false,
 		enabled: false,
 	},
 	},
 	POWER_STEERING: {
 	POWER_STEERING: {
-		name: 'Use experimental "power steering" mode',
-		description:
-			"When enabled, Roo will remind the model about the details of its current mode definition more frequently. This will lead to stronger adherence to role definitions and custom instructions, but will use more tokens per message.",
 		enabled: false,
 		enabled: false,
 	},
 	},
 	MULTI_SEARCH_AND_REPLACE: {
 	MULTI_SEARCH_AND_REPLACE: {
-		name: "Use experimental multi block diff tool",
-		description:
-			"When enabled, Roo will use multi block diff tool. This will try to update multiple code blocks in the file in one request.",
 		enabled: false,
 		enabled: false,
 	},
 	},
 }
 }
@@ -67,17 +49,4 @@ export const experiments = {
 	},
 	},
 } as const
 } as const
 
 
-// Expose experiment details for UI - pre-compute from map for better performance
-export const experimentLabels = Object.fromEntries(
-	Object.entries(experimentConfigsMap).map(([_, config]) => [
-		EXPERIMENT_IDS[_ as keyof typeof EXPERIMENT_IDS] as ExperimentId,
-		config.name,
-	]),
-) as Record<string, string>
-
-export const experimentDescriptions = Object.fromEntries(
-	Object.entries(experimentConfigsMap).map(([_, config]) => [
-		EXPERIMENT_IDS[_ as keyof typeof EXPERIMENT_IDS] as ExperimentId,
-		config.description,
-	]),
-) as Record<string, string>
+// No longer needed as we use translation keys directly in the UI

+ 1 - 0
src/shared/globalState.ts

@@ -116,6 +116,7 @@ export const GLOBAL_STATE_KEYS = [
 	"telemetrySetting",
 	"telemetrySetting",
 	"showRooIgnoredFiles",
 	"showRooIgnoredFiles",
 	"remoteBrowserEnabled",
 	"remoteBrowserEnabled",
+	"language",
 	"maxWorkspaceFiles",
 	"maxWorkspaceFiles",
 ] as const
 ] as const
 
 

+ 0 - 9
src/shared/tool-groups.ts

@@ -66,12 +66,3 @@ export function getToolName(toolConfig: string | readonly [ToolName, ...any[]]):
 export function getToolOptions(toolConfig: string | readonly [ToolName, ...any[]]): any {
 export function getToolOptions(toolConfig: string | readonly [ToolName, ...any[]]): any {
 	return typeof toolConfig === "string" ? undefined : toolConfig[1]
 	return typeof toolConfig === "string" ? undefined : toolConfig[1]
 }
 }
-
-// Display names for groups in UI
-export const GROUP_DISPLAY_NAMES: Record<ToolGroup, string> = {
-	read: "Read Files",
-	edit: "Edit Files",
-	browser: "Use Browser",
-	command: "Run Commands",
-	mcp: "Use MCP",
-}

+ 6 - 6
webview-ui/src/components/common/TelemetryBanner.tsx

@@ -45,13 +45,13 @@ const TelemetryBanner = () => {
 	return (
 	return (
 		<BannerContainer>
 		<BannerContainer>
 			<div>
 			<div>
-				<strong>{t("common:telemetryTitle")}</strong>
+				<strong>{t("welcome:telemetry.title")}</strong>
 				<div className="mt-1">
 				<div className="mt-1">
-					{t("common:anonymousTelemetry")}
+					{t("welcome:telemetry.anonymousTelemetry")}
 					<div className="mt-1">
 					<div className="mt-1">
-						{t("common:changeSettings")}{" "}
+						{t("welcome:telemetry.changeSettings")}{" "}
 						<VSCodeLink href="#" onClick={handleOpenSettings}>
 						<VSCodeLink href="#" onClick={handleOpenSettings}>
-							{t("common:settings")}
+							{t("welcome:telemetry.settings")}
 						</VSCodeLink>
 						</VSCodeLink>
 						.
 						.
 					</div>
 					</div>
@@ -59,10 +59,10 @@ const TelemetryBanner = () => {
 			</div>
 			</div>
 			<ButtonContainer>
 			<ButtonContainer>
 				<VSCodeButton appearance="primary" onClick={handleAllow} disabled={hasChosen}>
 				<VSCodeButton appearance="primary" onClick={handleAllow} disabled={hasChosen}>
-					{t("common:allow")}
+					{t("welcome:telemetry.allow")}
 				</VSCodeButton>
 				</VSCodeButton>
 				<VSCodeButton appearance="secondary" onClick={handleDeny} disabled={hasChosen}>
 				<VSCodeButton appearance="secondary" onClick={handleDeny} disabled={hasChosen}>
-					{t("common:deny")}
+					{t("welcome:telemetry.deny")}
 				</VSCodeButton>
 				</VSCodeButton>
 			</ButtonContainer>
 			</ButtonContainer>
 		</BannerContainer>
 		</BannerContainer>

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

@@ -27,6 +27,7 @@ export const CopyButton = ({ itemTask }: CopyButtonProps) => {
 			size="icon"
 			size="icon"
 			title={t("history:copyPrompt")}
 			title={t("history:copyPrompt")}
 			onClick={onCopy}
 			onClick={onCopy}
+			data-testid="copy-prompt-button"
 			className="opacity-50 hover:opacity-100">
 			className="opacity-50 hover:opacity-100">
 			<span className={cn("codicon scale-80", { "codicon-check": isCopied, "codicon-copy": !isCopied })} />
 			<span className={cn("codicon scale-80", { "codicon-check": isCopied, "codicon-copy": !isCopied })} />
 		</Button>
 		</Button>

+ 15 - 4
webview-ui/src/components/history/HistoryView.tsx

@@ -39,6 +39,7 @@ const HistoryView = ({ onDone }: HistoryViewProps) => {
 						style={{ width: "100%" }}
 						style={{ width: "100%" }}
 						placeholder={t("history:searchPlaceholder")}
 						placeholder={t("history:searchPlaceholder")}
 						value={searchQuery}
 						value={searchQuery}
+						data-testid="history-search-input"
 						onInput={(e) => {
 						onInput={(e) => {
 							const newValue = (e.target as HTMLInputElement)?.value
 							const newValue = (e.target as HTMLInputElement)?.value
 							setSearchQuery(newValue)
 							setSearchQuery(newValue)
@@ -72,13 +73,22 @@ const HistoryView = ({ onDone }: HistoryViewProps) => {
 						value={sortOption}
 						value={sortOption}
 						role="radiogroup"
 						role="radiogroup"
 						onChange={(e) => setSortOption((e.target as HTMLInputElement).value as SortOption)}>
 						onChange={(e) => setSortOption((e.target as HTMLInputElement).value as SortOption)}>
-						<VSCodeRadio value="newest">{t("history:newest")}</VSCodeRadio>
-						<VSCodeRadio value="oldest">{t("history:oldest")}</VSCodeRadio>
-						<VSCodeRadio value="mostExpensive">{t("history:mostExpensive")}</VSCodeRadio>
-						<VSCodeRadio value="mostTokens">{t("history:mostTokens")}</VSCodeRadio>
+						<VSCodeRadio value="newest" data-testid="radio-newest">
+							{t("history:newest")}
+						</VSCodeRadio>
+						<VSCodeRadio value="oldest" data-testid="radio-oldest">
+							{t("history:oldest")}
+						</VSCodeRadio>
+						<VSCodeRadio value="mostExpensive" data-testid="radio-most-expensive">
+							{t("history:mostExpensive")}
+						</VSCodeRadio>
+						<VSCodeRadio value="mostTokens" data-testid="radio-most-tokens">
+							{t("history:mostTokens")}
+						</VSCodeRadio>
 						<VSCodeRadio
 						<VSCodeRadio
 							value="mostRelevant"
 							value="mostRelevant"
 							disabled={!searchQuery}
 							disabled={!searchQuery}
+							data-testid="radio-most-relevant"
 							style={{ opacity: searchQuery ? 1 : 0.5 }}>
 							style={{ opacity: searchQuery ? 1 : 0.5 }}>
 							{t("history:mostRelevant")}
 							{t("history:mostRelevant")}
 						</VSCodeRadio>
 						</VSCodeRadio>
@@ -135,6 +145,7 @@ const HistoryView = ({ onDone }: HistoryViewProps) => {
 											variant="ghost"
 											variant="ghost"
 											size="sm"
 											size="sm"
 											title={t("history:deleteTaskTitle")}
 											title={t("history:deleteTaskTitle")}
+											data-testid="delete-task-button"
 											onClick={(e) => {
 											onClick={(e) => {
 												e.stopPropagation()
 												e.stopPropagation()
 
 

+ 10 - 13
webview-ui/src/components/history/__tests__/HistoryView.test.tsx

@@ -75,7 +75,7 @@ describe("HistoryView", () => {
 		render(<HistoryView onDone={onDone} />)
 		render(<HistoryView onDone={onDone} />)
 
 
 		// Get search input and radio group
 		// Get search input and radio group
-		const searchInput = screen.getByPlaceholderText("Fuzzy search history...")
+		const searchInput = screen.getByTestId("history-search-input")
 		const radioGroup = screen.getByRole("radiogroup")
 		const radioGroup = screen.getByRole("radiogroup")
 
 
 		// Type in search
 		// Type in search
@@ -85,7 +85,7 @@ describe("HistoryView", () => {
 		jest.advanceTimersByTime(100)
 		jest.advanceTimersByTime(100)
 
 
 		// Check if sort option automatically changes to "Most Relevant"
 		// Check if sort option automatically changes to "Most Relevant"
-		const mostRelevantRadio = within(radioGroup).getByLabelText("Most Relevant")
+		const mostRelevantRadio = within(radioGroup).getByTestId("radio-most-relevant")
 		expect(mostRelevantRadio).not.toBeDisabled()
 		expect(mostRelevantRadio).not.toBeDisabled()
 
 
 		// Click the radio button
 		// Click the radio button
@@ -95,7 +95,7 @@ describe("HistoryView", () => {
 		jest.advanceTimersByTime(100)
 		jest.advanceTimersByTime(100)
 
 
 		// Verify radio button is checked
 		// Verify radio button is checked
-		const updatedRadio = within(radioGroup).getByRole("radio", { name: "Most Relevant", checked: true })
+		const updatedRadio = within(radioGroup).getByTestId("radio-most-relevant")
 		expect(updatedRadio).toBeInTheDocument()
 		expect(updatedRadio).toBeInTheDocument()
 	})
 	})
 
 
@@ -106,21 +106,18 @@ describe("HistoryView", () => {
 		const radioGroup = screen.getByRole("radiogroup")
 		const radioGroup = screen.getByRole("radiogroup")
 
 
 		// Test changing sort options
 		// Test changing sort options
-		const oldestRadio = within(radioGroup).getByLabelText("Oldest")
+		const oldestRadio = within(radioGroup).getByTestId("radio-oldest")
 		fireEvent.click(oldestRadio)
 		fireEvent.click(oldestRadio)
 
 
 		// Wait for oldest radio to be checked
 		// Wait for oldest radio to be checked
-		const checkedOldestRadio = await within(radioGroup).findByRole("radio", { name: "Oldest", checked: true })
+		const checkedOldestRadio = within(radioGroup).getByTestId("radio-oldest")
 		expect(checkedOldestRadio).toBeInTheDocument()
 		expect(checkedOldestRadio).toBeInTheDocument()
 
 
-		const mostExpensiveRadio = within(radioGroup).getByLabelText("Most Expensive")
+		const mostExpensiveRadio = within(radioGroup).getByTestId("radio-most-expensive")
 		fireEvent.click(mostExpensiveRadio)
 		fireEvent.click(mostExpensiveRadio)
 
 
 		// Wait for most expensive radio to be checked
 		// Wait for most expensive radio to be checked
-		const checkedExpensiveRadio = await within(radioGroup).findByRole("radio", {
-			name: "Most Expensive",
-			checked: true,
-		})
+		const checkedExpensiveRadio = within(radioGroup).getByTestId("radio-most-expensive")
 		expect(checkedExpensiveRadio).toBeInTheDocument()
 		expect(checkedExpensiveRadio).toBeInTheDocument()
 	})
 	})
 
 
@@ -148,7 +145,7 @@ describe("HistoryView", () => {
 			fireEvent.mouseEnter(taskContainer)
 			fireEvent.mouseEnter(taskContainer)
 
 
 			// Click delete button to open confirmation dialog
 			// Click delete button to open confirmation dialog
-			const deleteButton = within(taskContainer).getByTitle("Delete Task (Shift + Click to skip confirmation)")
+			const deleteButton = within(taskContainer).getByTestId("delete-task-button")
 			fireEvent.click(deleteButton)
 			fireEvent.click(deleteButton)
 
 
 			// Verify dialog is shown
 			// Verify dialog is shown
@@ -175,7 +172,7 @@ describe("HistoryView", () => {
 			fireEvent.mouseEnter(taskContainer)
 			fireEvent.mouseEnter(taskContainer)
 
 
 			// Shift-click delete button
 			// Shift-click delete button
-			const deleteButton = within(taskContainer).getByTitle("Delete Task (Shift + Click to skip confirmation)")
+			const deleteButton = within(taskContainer).getByTestId("delete-task-button")
 			fireEvent.click(deleteButton, { shiftKey: true })
 			fireEvent.click(deleteButton, { shiftKey: true })
 
 
 			// Verify no dialog is shown
 			// Verify no dialog is shown
@@ -203,7 +200,7 @@ describe("HistoryView", () => {
 		const taskContainer = screen.getByTestId("virtuoso-item-1")
 		const taskContainer = screen.getByTestId("virtuoso-item-1")
 		fireEvent.mouseEnter(taskContainer)
 		fireEvent.mouseEnter(taskContainer)
 
 
-		const copyButton = within(taskContainer).getByTitle("Copy Prompt")
+		const copyButton = within(taskContainer).getByTestId("copy-prompt-button")
 
 
 		// Click the copy button and wait for clipboard operation
 		// Click the copy button and wait for clipboard operation
 		await act(async () => {
 		await act(async () => {

+ 4 - 4
webview-ui/src/components/prompts/PromptsView.tsx

@@ -22,7 +22,7 @@ import {
 import { CustomModeSchema } from "../../../../src/core/config/CustomModesSchema"
 import { CustomModeSchema } from "../../../../src/core/config/CustomModesSchema"
 import { supportPrompt, SupportPromptType } 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 { TOOL_GROUPS, ToolGroup } from "../../../../src/shared/tool-groups"
 import { vscode } from "../../utils/vscode"
 import { vscode } from "../../utils/vscode"
 import { Tab, TabContent, TabHeader } from "../common/Tab"
 import { Tab, TabContent, TabHeader } from "../common/Tab"
 import i18next from "i18next"
 import i18next from "i18next"
@@ -657,7 +657,7 @@ const PromptsView = ({ onDone }: PromptsViewProps) => {
 												checked={isGroupEnabled}
 												checked={isGroupEnabled}
 												onChange={handleGroupChange(group, Boolean(isCustomMode), customMode)}
 												onChange={handleGroupChange(group, Boolean(isCustomMode), customMode)}
 												disabled={!isCustomMode}>
 												disabled={!isCustomMode}>
-												{GROUP_DISPLAY_NAMES[group]}
+												{t(`prompts:tools.toolNames.${group}`)}
 												{group === "edit" && (
 												{group === "edit" && (
 													<div className="text-xs text-vscode-descriptionForeground mt-0.5">
 													<div className="text-xs text-vscode-descriptionForeground mt-0.5">
 														{t("prompts:tools.allowedFiles")}{" "}
 														{t("prompts:tools.allowedFiles")}{" "}
@@ -689,7 +689,7 @@ const PromptsView = ({ onDone }: PromptsViewProps) => {
 										return enabledGroups
 										return enabledGroups
 											.map((group) => {
 											.map((group) => {
 												const groupName = getGroupName(group)
 												const groupName = getGroupName(group)
-												const displayName = GROUP_DISPLAY_NAMES[groupName]
+												const displayName = t(`prompts:tools.toolNames.${groupName}`)
 												if (Array.isArray(group) && group[1]?.fileRegex) {
 												if (Array.isArray(group) && group[1]?.fileRegex) {
 													const description =
 													const description =
 														group[1].description || `/${group[1].fileRegex}/`
 														group[1].description || `/${group[1].fileRegex}/`
@@ -1247,7 +1247,7 @@ const PromptsView = ({ onDone }: PromptsViewProps) => {
 													)
 													)
 												}
 												}
 											}}>
 											}}>
-											{GROUP_DISPLAY_NAMES[group]}
+											{t(`prompts:tools.toolNames.${group}`)}
 										</VSCodeCheckbox>
 										</VSCodeCheckbox>
 									))}
 									))}
 								</div>
 								</div>

+ 24 - 17
webview-ui/src/components/settings/AdvancedSettings.tsx

@@ -1,4 +1,5 @@
 import { HTMLAttributes } from "react"
 import { HTMLAttributes } from "react"
+import { useAppTranslation } from "@/i18n/TranslationContext"
 import { VSCodeCheckbox } from "@vscode/webview-ui-toolkit/react"
 import { VSCodeCheckbox } from "@vscode/webview-ui-toolkit/react"
 import { Cog } from "lucide-react"
 import { Cog } from "lucide-react"
 
 
@@ -29,19 +30,20 @@ export const AdvancedSettings = ({
 	className,
 	className,
 	...props
 	...props
 }: AdvancedSettingsProps) => {
 }: AdvancedSettingsProps) => {
+	const { t } = useAppTranslation()
 	return (
 	return (
 		<div className={cn("flex flex-col gap-2", className)} {...props}>
 		<div className={cn("flex flex-col gap-2", className)} {...props}>
 			<SectionHeader>
 			<SectionHeader>
 				<div className="flex items-center gap-2">
 				<div className="flex items-center gap-2">
 					<Cog className="w-4" />
 					<Cog className="w-4" />
-					<div>Advanced</div>
+					<div>{t("settings:sections.advanced")}</div>
 				</div>
 				</div>
 			</SectionHeader>
 			</SectionHeader>
 
 
 			<Section>
 			<Section>
 				<div>
 				<div>
 					<div className="flex flex-col gap-2">
 					<div className="flex flex-col gap-2">
-						<span className="font-medium">Rate limit</span>
+						<span className="font-medium">{t("settings:advanced.rateLimit.label")}</span>
 						<div className="flex items-center gap-2">
 						<div className="flex items-center gap-2">
 							<input
 							<input
 								type="range"
 								type="range"
@@ -55,7 +57,9 @@ export const AdvancedSettings = ({
 							<span style={{ ...sliderLabelStyle }}>{rateLimitSeconds}s</span>
 							<span style={{ ...sliderLabelStyle }}>{rateLimitSeconds}s</span>
 						</div>
 						</div>
 					</div>
 					</div>
-					<p className="text-vscode-descriptionForeground text-sm mt-0">Minimum time between API requests.</p>
+					<p className="text-vscode-descriptionForeground text-sm mt-0">
+						{t("settings:advanced.rateLimit.description")}
+					</p>
 				</div>
 				</div>
 
 
 				<div>
 				<div>
@@ -69,16 +73,15 @@ export const AdvancedSettings = ({
 								setExperimentEnabled(EXPERIMENT_IDS.MULTI_SEARCH_AND_REPLACE, false)
 								setExperimentEnabled(EXPERIMENT_IDS.MULTI_SEARCH_AND_REPLACE, false)
 							}
 							}
 						}}>
 						}}>
-						<span className="font-medium">Enable editing through diffs</span>
+						<span className="font-medium">{t("settings:advanced.diff.label")}</span>
 					</VSCodeCheckbox>
 					</VSCodeCheckbox>
 					<p className="text-vscode-descriptionForeground text-sm mt-0">
 					<p className="text-vscode-descriptionForeground text-sm mt-0">
-						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")}
 					</p>
 					</p>
 					{diffEnabled && (
 					{diffEnabled && (
 						<div className="flex flex-col gap-2 mt-3 mb-2 pl-3 border-l-2 border-vscode-button-background">
 						<div className="flex flex-col gap-2 mt-3 mb-2 pl-3 border-l-2 border-vscode-button-background">
 							<div className="flex flex-col gap-2">
 							<div className="flex flex-col gap-2">
-								<span className="font-medium">Diff strategy</span>
+								<span className="font-medium">{t("settings:advanced.diff.strategy.label")}</span>
 								<select
 								<select
 									value={
 									value={
 										experiments[EXPERIMENT_IDS.DIFF_STRATEGY]
 										experiments[EXPERIMENT_IDS.DIFF_STRATEGY]
@@ -101,9 +104,15 @@ export const AdvancedSettings = ({
 										}
 										}
 									}}
 									}}
 									className="p-2 rounded w-full bg-vscode-input-background text-vscode-input-foreground border border-vscode-input-border outline-none focus:border-vscode-focusBorder">
 									className="p-2 rounded w-full bg-vscode-input-background text-vscode-input-foreground border border-vscode-input-border outline-none focus:border-vscode-focusBorder">
-									<option value="standard">Standard (Single block)</option>
-									<option value="multiBlock">Experimental: Multi-block diff</option>
-									<option value="unified">Experimental: Unified diff</option>
+									<option value="standard">
+										{t("settings:advanced.diff.strategy.options.standard")}
+									</option>
+									<option value="multiBlock">
+										{t("settings:advanced.diff.strategy.options.multiBlock")}
+									</option>
+									<option value="unified">
+										{t("settings:advanced.diff.strategy.options.unified")}
+									</option>
 								</select>
 								</select>
 							</div>
 							</div>
 
 
@@ -111,15 +120,15 @@ export const AdvancedSettings = ({
 							<p className="text-vscode-descriptionForeground text-sm mt-1">
 							<p className="text-vscode-descriptionForeground text-sm mt-1">
 								{!experiments[EXPERIMENT_IDS.DIFF_STRATEGY] &&
 								{!experiments[EXPERIMENT_IDS.DIFF_STRATEGY] &&
 									!experiments[EXPERIMENT_IDS.MULTI_SEARCH_AND_REPLACE] &&
 									!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] &&
 								{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] &&
 								{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")}
 							</p>
 							</p>
 
 
 							{/* Match precision slider */}
 							{/* Match precision slider */}
-							<span className="font-medium mt-3">Match precision</span>
+							<span className="font-medium mt-3">{t("settings:advanced.diff.matchPrecision.label")}</span>
 							<div className="flex items-center gap-2">
 							<div className="flex items-center gap-2">
 								<input
 								<input
 									type="range"
 									type="range"
@@ -137,9 +146,7 @@ export const AdvancedSettings = ({
 								</span>
 								</span>
 							</div>
 							</div>
 							<p className="text-vscode-descriptionForeground text-sm mt-0">
 							<p className="text-vscode-descriptionForeground text-sm mt-0">
-								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")}
 							</p>
 							</p>
 						</div>
 						</div>
 					)}
 					)}

+ 33 - 17
webview-ui/src/components/settings/ApiConfigManager.tsx

@@ -1,5 +1,6 @@
 import { VSCodeButton, VSCodeTextField } from "@vscode/webview-ui-toolkit/react"
 import { VSCodeButton, VSCodeTextField } from "@vscode/webview-ui-toolkit/react"
 import { memo, useEffect, useRef, useState } from "react"
 import { memo, useEffect, useRef, useState } from "react"
+import { useAppTranslation } from "@/i18n/TranslationContext"
 import { ApiConfigMeta } from "../../../../src/shared/ExtensionMessage"
 import { ApiConfigMeta } from "../../../../src/shared/ExtensionMessage"
 import { Dropdown } from "vscrui"
 import { Dropdown } from "vscrui"
 import type { DropdownOption } from "vscrui"
 import type { DropdownOption } from "vscrui"
@@ -23,6 +24,7 @@ const ApiConfigManager = ({
 	onRenameConfig,
 	onRenameConfig,
 	onUpsertConfig,
 	onUpsertConfig,
 }: ApiConfigManagerProps) => {
 }: ApiConfigManagerProps) => {
+	const { t } = useAppTranslation()
 	const [isRenaming, setIsRenaming] = useState(false)
 	const [isRenaming, setIsRenaming] = useState(false)
 	const [isCreating, setIsCreating] = useState(false)
 	const [isCreating, setIsCreating] = useState(false)
 	const [inputValue, setInputValue] = useState("")
 	const [inputValue, setInputValue] = useState("")
@@ -33,18 +35,18 @@ const ApiConfigManager = ({
 
 
 	const validateName = (name: string, isNewProfile: boolean): string | null => {
 	const validateName = (name: string, isNewProfile: boolean): string | null => {
 		const trimmed = name.trim()
 		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())
 		const nameExists = listApiConfigMeta?.some((config) => config.name.toLowerCase() === trimmed.toLowerCase())
 
 
 		// For new profiles, any existing name is invalid
 		// For new profiles, any existing name is invalid
 		if (isNewProfile && nameExists) {
 		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
 		// For rename, only block if trying to rename to a different existing profile
 		if (!isNewProfile && nameExists && trimmed.toLowerCase() !== currentApiConfigName?.toLowerCase()) {
 		if (!isNewProfile && nameExists && trimmed.toLowerCase() !== currentApiConfigName?.toLowerCase()) {
-			return "A profile with this name already exists"
+			return t("settings:providers.nameExists")
 		}
 		}
 
 
 		return null
 		return null
@@ -144,7 +146,7 @@ const ApiConfigManager = ({
 	return (
 	return (
 		<div className="flex flex-col gap-1">
 		<div className="flex flex-col gap-1">
 			<label htmlFor="config-profile">
 			<label htmlFor="config-profile">
-				<span className="font-medium">Configuration Profile</span>
+				<span className="font-medium">{t("settings:providers.configProfile")}</span>
 			</label>
 			</label>
 
 
 			{isRenaming ? (
 			{isRenaming ? (
@@ -160,7 +162,7 @@ const ApiConfigManager = ({
 								setInputValue(target.target.value)
 								setInputValue(target.target.value)
 								setError(null)
 								setError(null)
 							}}
 							}}
-							placeholder="Enter new name"
+							placeholder={t("settings:providers.enterNewName")}
 							style={{ flexGrow: 1 }}
 							style={{ flexGrow: 1 }}
 							onKeyDown={(e: unknown) => {
 							onKeyDown={(e: unknown) => {
 								const event = e as { key: string }
 								const event = e as { key: string }
@@ -175,7 +177,8 @@ const ApiConfigManager = ({
 							appearance="icon"
 							appearance="icon"
 							disabled={!inputValue.trim()}
 							disabled={!inputValue.trim()}
 							onClick={handleSave}
 							onClick={handleSave}
-							title="Save"
+							title={t("settings:common.save")}
+							data-testid="save-rename-button"
 							style={{
 							style={{
 								padding: 0,
 								padding: 0,
 								margin: 0,
 								margin: 0,
@@ -188,7 +191,8 @@ const ApiConfigManager = ({
 						<VSCodeButton
 						<VSCodeButton
 							appearance="icon"
 							appearance="icon"
 							onClick={handleCancel}
 							onClick={handleCancel}
-							title="Cancel"
+							title={t("settings:common.cancel")}
+							data-testid="cancel-rename-button"
 							style={{
 							style={{
 								padding: 0,
 								padding: 0,
 								margin: 0,
 								margin: 0,
@@ -224,7 +228,8 @@ const ApiConfigManager = ({
 						<VSCodeButton
 						<VSCodeButton
 							appearance="icon"
 							appearance="icon"
 							onClick={handleAdd}
 							onClick={handleAdd}
-							title="Add profile"
+							title={t("settings:providers.addProfile")}
+							data-testid="add-profile-button"
 							style={{
 							style={{
 								padding: 0,
 								padding: 0,
 								margin: 0,
 								margin: 0,
@@ -239,7 +244,8 @@ const ApiConfigManager = ({
 								<VSCodeButton
 								<VSCodeButton
 									appearance="icon"
 									appearance="icon"
 									onClick={handleStartRename}
 									onClick={handleStartRename}
-									title="Rename profile"
+									title={t("settings:providers.renameProfile")}
+									data-testid="rename-profile-button"
 									style={{
 									style={{
 										padding: 0,
 										padding: 0,
 										margin: 0,
 										margin: 0,
@@ -252,7 +258,12 @@ const ApiConfigManager = ({
 								<VSCodeButton
 								<VSCodeButton
 									appearance="icon"
 									appearance="icon"
 									onClick={handleDelete}
 									onClick={handleDelete}
-									title={isOnlyProfile ? "Cannot delete the only profile" : "Delete profile"}
+									title={
+										isOnlyProfile
+											? t("settings:providers.cannotDeleteOnlyProfile")
+											: t("settings:providers.deleteProfile")
+									}
+									data-testid="delete-profile-button"
 									disabled={isOnlyProfile}
 									disabled={isOnlyProfile}
 									style={{
 									style={{
 										padding: 0,
 										padding: 0,
@@ -272,7 +283,7 @@ const ApiConfigManager = ({
 							margin: "5px 0 12px",
 							margin: "5px 0 12px",
 							color: "var(--vscode-descriptionForeground)",
 							color: "var(--vscode-descriptionForeground)",
 						}}>
 						}}>
-						Save different API configurations to quickly switch between providers and settings.
+						{t("settings:providers.description")}
 					</p>
 					</p>
 				</>
 				</>
 			)}
 			)}
@@ -290,7 +301,7 @@ const ApiConfigManager = ({
 				}}
 				}}
 				aria-labelledby="new-profile-title">
 				aria-labelledby="new-profile-title">
 				<DialogContent className="p-4 max-w-sm">
 				<DialogContent className="p-4 max-w-sm">
-					<DialogTitle>New Configuration Profile</DialogTitle>
+					<DialogTitle>{t("settings:providers.newProfile")}</DialogTitle>
 					<Input
 					<Input
 						ref={newProfileInputRef}
 						ref={newProfileInputRef}
 						value={newProfileName}
 						value={newProfileName}
@@ -299,7 +310,8 @@ const ApiConfigManager = ({
 							setNewProfileName(target.target.value)
 							setNewProfileName(target.target.value)
 							setError(null)
 							setError(null)
 						}}
 						}}
-						placeholder="Enter profile name"
+						placeholder={t("settings:providers.enterProfileName")}
+						data-testid="new-profile-input"
 						style={{ width: "100%" }}
 						style={{ width: "100%" }}
 						onKeyDown={(e: unknown) => {
 						onKeyDown={(e: unknown) => {
 							const event = e as { key: string }
 							const event = e as { key: string }
@@ -316,11 +328,15 @@ const ApiConfigManager = ({
 						</p>
 						</p>
 					)}
 					)}
 					<div className="flex justify-end gap-2 mt-4">
 					<div className="flex justify-end gap-2 mt-4">
-						<Button variant="secondary" onClick={resetCreateState}>
-							Cancel
+						<Button variant="secondary" onClick={resetCreateState} data-testid="cancel-new-profile-button">
+							{t("settings:common.cancel")}
 						</Button>
 						</Button>
-						<Button variant="default" disabled={!newProfileName.trim()} onClick={handleNewProfileSave}>
-							Create Profile
+						<Button
+							variant="default"
+							disabled={!newProfileName.trim()}
+							onClick={handleNewProfileSave}
+							data-testid="create-profile-button">
+							{t("settings:providers.createProfile")}
 						</Button>
 						</Button>
 					</div>
 					</div>
 				</DialogContent>
 				</DialogContent>

+ 22 - 14
webview-ui/src/components/settings/ApiOptions.tsx

@@ -1,4 +1,6 @@
 import React, { memo, useCallback, useEffect, useMemo, useState } from "react"
 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 { useDebounce, useEvent } from "react-use"
 import { Checkbox, Dropdown, type DropdownOption } from "vscrui"
 import { Checkbox, Dropdown, type DropdownOption } from "vscrui"
 import { VSCodeLink, VSCodeRadio, VSCodeRadioGroup, VSCodeTextField } from "@vscode/webview-ui-toolkit/react"
 import { VSCodeLink, VSCodeRadio, VSCodeRadioGroup, VSCodeTextField } from "@vscode/webview-ui-toolkit/react"
@@ -91,6 +93,7 @@ const ApiOptions = ({
 	errorMessage,
 	errorMessage,
 	setErrorMessage,
 	setErrorMessage,
 }: ApiOptionsProps) => {
 }: ApiOptionsProps) => {
+	const { t } = useAppTranslation()
 	const [ollamaModels, setOllamaModels] = useState<string[]>([])
 	const [ollamaModels, setOllamaModels] = useState<string[]>([])
 	const [lmStudioModels, setLmStudioModels] = useState<string[]>([])
 	const [lmStudioModels, setLmStudioModels] = useState<string[]>([])
 	const [vsCodeLmModels, setVsCodeLmModels] = useState<vscodemodels.LanguageModelChatSelector[]>([])
 	const [vsCodeLmModels, setVsCodeLmModels] = useState<vscodemodels.LanguageModelChatSelector[]>([])
@@ -259,7 +262,7 @@ const ApiOptions = ({
 		<div className="flex flex-col gap-3">
 		<div className="flex flex-col gap-3">
 			<div className="dropdown-container">
 			<div className="dropdown-container">
 				<label htmlFor="api-provider" className="font-medium">
 				<label htmlFor="api-provider" className="font-medium">
-					API Provider
+					{t("settings:providers.apiProvider")}
 				</label>
 				</label>
 				<Select
 				<Select
 					value={selectedProvider}
 					value={selectedProvider}
@@ -289,14 +292,14 @@ const ApiOptions = ({
 						onInput={handleInputChange("openRouterApiKey")}
 						onInput={handleInputChange("openRouterApiKey")}
 						placeholder="Enter API Key..."
 						placeholder="Enter API Key..."
 						className="w-full">
 						className="w-full">
-						<span className="font-medium">OpenRouter API Key</span>
+						<span className="font-medium">{t("settings:providers.openRouterApiKey")}</span>
 					</VSCodeTextField>
 					</VSCodeTextField>
 					<div className="text-sm text-vscode-descriptionForeground -mt-2">
 					<div className="text-sm text-vscode-descriptionForeground -mt-2">
-						This key is stored locally and only used to make API requests from this extension.
+						{t("settings:providers.apiKeyStorageNotice")}
 					</div>
 					</div>
 					{!apiConfiguration?.openRouterApiKey && (
 					{!apiConfiguration?.openRouterApiKey && (
 						<VSCodeButtonLink href={getOpenRouterAuthUrl(uriScheme)} appearance="secondary">
 						<VSCodeButtonLink href={getOpenRouterAuthUrl(uriScheme)} appearance="secondary">
-							Get OpenRouter API Key
+							{t("settings:providers.getOpenRouterApiKey")}
 						</VSCodeButtonLink>
 						</VSCodeButtonLink>
 					)}
 					)}
 					{!fromWelcomeView && (
 					{!fromWelcomeView && (
@@ -311,7 +314,7 @@ const ApiOptions = ({
 											setApiConfigurationField("openRouterBaseUrl", "")
 											setApiConfigurationField("openRouterBaseUrl", "")
 										}
 										}
 									}}>
 									}}>
-									Use custom base URL
+									{t("settings:providers.useCustomBaseUrl")}
 								</Checkbox>
 								</Checkbox>
 								{openRouterBaseUrlSelected && (
 								{openRouterBaseUrlSelected && (
 									<VSCodeTextField
 									<VSCodeTextField
@@ -326,8 +329,13 @@ const ApiOptions = ({
 							<Checkbox
 							<Checkbox
 								checked={apiConfiguration?.openRouterUseMiddleOutTransform ?? true}
 								checked={apiConfiguration?.openRouterUseMiddleOutTransform ?? true}
 								onChange={handleInputChange("openRouterUseMiddleOutTransform", noTransform)}>
 								onChange={handleInputChange("openRouterUseMiddleOutTransform", noTransform)}>
-								Compress prompts and message chains to the context size (
-								<a href="https://openrouter.ai/docs/transforms">OpenRouter Transforms</a>)
+								<Trans
+									i18nKey="settings:providers.openRouterTransformsText"
+									components={{
+										// eslint-disable-next-line jsx-a11y/anchor-has-content
+										a: <a href="https://openrouter.ai/docs/transforms" />,
+									}}
+								/>
 							</Checkbox>
 							</Checkbox>
 						</>
 						</>
 					)}
 					)}
@@ -342,14 +350,14 @@ const ApiOptions = ({
 						onInput={handleInputChange("apiKey")}
 						onInput={handleInputChange("apiKey")}
 						placeholder="Enter API Key..."
 						placeholder="Enter API Key..."
 						className="w-full">
 						className="w-full">
-						<div className="font-medium">Anthropic API Key</div>
+						<div className="font-medium">{t("settings:providers.anthropicApiKey")}</div>
 					</VSCodeTextField>
 					</VSCodeTextField>
 					<div className="text-sm text-vscode-descriptionForeground -mt-2">
 					<div className="text-sm text-vscode-descriptionForeground -mt-2">
-						This key is stored locally and only used to make API requests from this extension.
+						{t("settings:providers.apiKeyStorageNotice")}
 					</div>
 					</div>
 					{!apiConfiguration?.apiKey && (
 					{!apiConfiguration?.apiKey && (
 						<VSCodeButtonLink href="https://console.anthropic.com/settings/keys" appearance="secondary">
 						<VSCodeButtonLink href="https://console.anthropic.com/settings/keys" appearance="secondary">
-							Get Anthropic API Key
+							{t("settings:providers.getAnthropicApiKey")}
 						</VSCodeButtonLink>
 						</VSCodeButtonLink>
 					)}
 					)}
 					<div>
 					<div>
@@ -362,7 +370,7 @@ const ApiOptions = ({
 									setApiConfigurationField("anthropicBaseUrl", "")
 									setApiConfigurationField("anthropicBaseUrl", "")
 								}
 								}
 							}}>
 							}}>
-							Use custom base URL
+							{t("settings:providers.useCustomBaseUrl")}
 						</Checkbox>
 						</Checkbox>
 						{anthropicBaseUrlSelected && (
 						{anthropicBaseUrlSelected && (
 							<VSCodeTextField
 							<VSCodeTextField
@@ -385,14 +393,14 @@ const ApiOptions = ({
 						onInput={handleInputChange("glamaApiKey")}
 						onInput={handleInputChange("glamaApiKey")}
 						placeholder="Enter API Key..."
 						placeholder="Enter API Key..."
 						className="w-full">
 						className="w-full">
-						<span className="font-medium">Glama API Key</span>
+						<span className="font-medium">{t("settings:providers.glamaApiKey")}</span>
 					</VSCodeTextField>
 					</VSCodeTextField>
 					<div className="text-sm text-vscode-descriptionForeground -mt-2">
 					<div className="text-sm text-vscode-descriptionForeground -mt-2">
-						This key is stored locally and only used to make API requests from this extension.
+						{t("settings:providers.apiKeyStorageNotice")}
 					</div>
 					</div>
 					{!apiConfiguration?.glamaApiKey && (
 					{!apiConfiguration?.glamaApiKey && (
 						<VSCodeButtonLink href={getGlamaAuthUrl(uriScheme)} appearance="secondary">
 						<VSCodeButtonLink href={getGlamaAuthUrl(uriScheme)} appearance="secondary">
-							Get Glama API Key
+							{t("settings:providers.getGlamaApiKey")}
 						</VSCodeButtonLink>
 						</VSCodeButtonLink>
 					)}
 					)}
 				</>
 				</>

+ 51 - 36
webview-ui/src/components/settings/AutoApproveSettings.tsx

@@ -1,4 +1,5 @@
 import { HTMLAttributes, useState } from "react"
 import { HTMLAttributes, useState } from "react"
+import { useAppTranslation } from "@/i18n/TranslationContext"
 import { VSCodeButton, VSCodeCheckbox, VSCodeTextField } from "@vscode/webview-ui-toolkit/react"
 import { VSCodeButton, VSCodeCheckbox, VSCodeTextField } from "@vscode/webview-ui-toolkit/react"
 import { CheckCheck } from "lucide-react"
 import { CheckCheck } from "lucide-react"
 
 
@@ -40,6 +41,7 @@ export const AutoApproveSettings = ({
 	className,
 	className,
 	...props
 	...props
 }: AutoApproveSettingsProps) => {
 }: AutoApproveSettingsProps) => {
+	const { t } = useAppTranslation()
 	const [commandInput, setCommandInput] = useState("")
 	const [commandInput, setCommandInput] = useState("")
 
 
 	const handleAddCommand = () => {
 	const handleAddCommand = () => {
@@ -54,10 +56,10 @@ export const AutoApproveSettings = ({
 
 
 	return (
 	return (
 		<div {...props}>
 		<div {...props}>
-			<SectionHeader description="Allow Roo to automatically perform operations without requiring approval. Enable these settings only if you fully trust the AI and understand the associated security risks.">
+			<SectionHeader description={t("settings:autoApprove.description")}>
 				<div className="flex items-center gap-2">
 				<div className="flex items-center gap-2">
 					<CheckCheck className="w-4" />
 					<CheckCheck className="w-4" />
-					<div>Auto-Approve</div>
+					<div>{t("settings:sections.autoApprove")}</div>
 				</div>
 				</div>
 			</SectionHeader>
 			</SectionHeader>
 
 
@@ -65,23 +67,24 @@ export const AutoApproveSettings = ({
 				<div>
 				<div>
 					<VSCodeCheckbox
 					<VSCodeCheckbox
 						checked={alwaysAllowReadOnly}
 						checked={alwaysAllowReadOnly}
-						onChange={(e: any) => setCachedStateField("alwaysAllowReadOnly", e.target.checked)}>
-						<span className="font-medium">Always approve read-only operations</span>
+						onChange={(e: any) => setCachedStateField("alwaysAllowReadOnly", e.target.checked)}
+						data-testid="always-allow-readonly-checkbox">
+						<span className="font-medium">{t("settings:autoApprove.readOnly.label")}</span>
 					</VSCodeCheckbox>
 					</VSCodeCheckbox>
 					<p className="text-vscode-descriptionForeground text-sm mt-0">
 					<p className="text-vscode-descriptionForeground text-sm mt-0">
-						When enabled, Roo will automatically view directory contents and read files without requiring
-						you to click the Approve button.
+						{t("settings:autoApprove.readOnly.description")}
 					</p>
 					</p>
 				</div>
 				</div>
 
 
 				<div>
 				<div>
 					<VSCodeCheckbox
 					<VSCodeCheckbox
 						checked={alwaysAllowWrite}
 						checked={alwaysAllowWrite}
-						onChange={(e: any) => setCachedStateField("alwaysAllowWrite", e.target.checked)}>
-						<span className="font-medium">Always approve write operations</span>
+						onChange={(e: any) => setCachedStateField("alwaysAllowWrite", e.target.checked)}
+						data-testid="always-allow-write-checkbox">
+						<span className="font-medium">{t("settings:autoApprove.write.label")}</span>
 					</VSCodeCheckbox>
 					</VSCodeCheckbox>
 					<p className="text-vscode-descriptionForeground text-sm mt-0">
 					<p className="text-vscode-descriptionForeground text-sm mt-0">
-						Automatically create and edit files without requiring approval
+						{t("settings:autoApprove.write.description")}
 					</p>
 					</p>
 					{alwaysAllowWrite && (
 					{alwaysAllowWrite && (
 						<div
 						<div
@@ -98,12 +101,13 @@ export const AutoApproveSettings = ({
 									step="100"
 									step="100"
 									value={writeDelayMs}
 									value={writeDelayMs}
 									onChange={(e) => setCachedStateField("writeDelayMs", parseInt(e.target.value))}
 									onChange={(e) => setCachedStateField("writeDelayMs", parseInt(e.target.value))}
+									data-testid="write-delay-slider"
 									className="h-2 focus:outline-0 w-4/5 accent-vscode-button-background"
 									className="h-2 focus:outline-0 w-4/5 accent-vscode-button-background"
 								/>
 								/>
 								<span style={{ minWidth: "45px", textAlign: "left" }}>{writeDelayMs}ms</span>
 								<span style={{ minWidth: "45px", textAlign: "left" }}>{writeDelayMs}ms</span>
 							</div>
 							</div>
 							<p className="text-vscode-descriptionForeground text-sm mt-1">
 							<p className="text-vscode-descriptionForeground text-sm mt-1">
-								Delay after writes to allow diagnostics to detect potential problems
+								{t("settings:autoApprove.write.delayLabel")}
 							</p>
 							</p>
 						</div>
 						</div>
 					)}
 					)}
@@ -112,24 +116,26 @@ export const AutoApproveSettings = ({
 				<div>
 				<div>
 					<VSCodeCheckbox
 					<VSCodeCheckbox
 						checked={alwaysAllowBrowser}
 						checked={alwaysAllowBrowser}
-						onChange={(e: any) => setCachedStateField("alwaysAllowBrowser", e.target.checked)}>
-						<span className="font-medium">Always approve browser actions</span>
+						onChange={(e: any) => setCachedStateField("alwaysAllowBrowser", e.target.checked)}
+						data-testid="always-allow-browser-checkbox">
+						<span className="font-medium">{t("settings:autoApprove.browser.label")}</span>
 					</VSCodeCheckbox>
 					</VSCodeCheckbox>
 					<p className="text-vscode-descriptionForeground text-sm mt-0">
 					<p className="text-vscode-descriptionForeground text-sm mt-0">
-						Automatically perform browser actions without requiring approval
+						{t("settings:autoApprove.browser.description")}
 						<br />
 						<br />
-						Note: Only applies when the model supports computer use
+						{t("settings:autoApprove.browser.note")}
 					</p>
 					</p>
 				</div>
 				</div>
 
 
 				<div>
 				<div>
 					<VSCodeCheckbox
 					<VSCodeCheckbox
 						checked={alwaysApproveResubmit}
 						checked={alwaysApproveResubmit}
-						onChange={(e: any) => setCachedStateField("alwaysApproveResubmit", e.target.checked)}>
-						<span className="font-medium">Always retry failed API requests</span>
+						onChange={(e: any) => setCachedStateField("alwaysApproveResubmit", e.target.checked)}
+						data-testid="always-approve-resubmit-checkbox">
+						<span className="font-medium">{t("settings:autoApprove.retry.label")}</span>
 					</VSCodeCheckbox>
 					</VSCodeCheckbox>
 					<p className="text-vscode-descriptionForeground text-sm mt-0">
 					<p className="text-vscode-descriptionForeground text-sm mt-0">
-						Automatically retry failed API requests when server returns an error response
+						{t("settings:autoApprove.retry.description")}
 					</p>
 					</p>
 					{alwaysApproveResubmit && (
 					{alwaysApproveResubmit && (
 						<div
 						<div
@@ -148,12 +154,13 @@ export const AutoApproveSettings = ({
 									onChange={(e) =>
 									onChange={(e) =>
 										setCachedStateField("requestDelaySeconds", parseInt(e.target.value))
 										setCachedStateField("requestDelaySeconds", parseInt(e.target.value))
 									}
 									}
+									data-testid="request-delay-slider"
 									className="h-2 focus:outline-0 w-4/5 accent-vscode-button-background"
 									className="h-2 focus:outline-0 w-4/5 accent-vscode-button-background"
 								/>
 								/>
 								<span style={{ minWidth: "45px", textAlign: "left" }}>{requestDelaySeconds}s</span>
 								<span style={{ minWidth: "45px", textAlign: "left" }}>{requestDelaySeconds}s</span>
 							</div>
 							</div>
 							<p className="text-vscode-descriptionForeground text-sm mt-0">
 							<p className="text-vscode-descriptionForeground text-sm mt-0">
-								Delay before retrying the request
+								{t("settings:autoApprove.retry.delayLabel")}
 							</p>
 							</p>
 						</div>
 						</div>
 					)}
 					)}
@@ -162,45 +169,48 @@ export const AutoApproveSettings = ({
 				<div>
 				<div>
 					<VSCodeCheckbox
 					<VSCodeCheckbox
 						checked={alwaysAllowMcp}
 						checked={alwaysAllowMcp}
-						onChange={(e: any) => setCachedStateField("alwaysAllowMcp", e.target.checked)}>
-						<span className="font-medium">Always approve MCP tools</span>
+						onChange={(e: any) => setCachedStateField("alwaysAllowMcp", e.target.checked)}
+						data-testid="always-allow-mcp-checkbox">
+						<span className="font-medium">{t("settings:autoApprove.mcp.label")}</span>
 					</VSCodeCheckbox>
 					</VSCodeCheckbox>
 					<p className="text-vscode-descriptionForeground text-sm mt-0">
 					<p className="text-vscode-descriptionForeground text-sm mt-0">
-						Enable auto-approval of individual MCP tools in the MCP Servers view (requires both this setting
-						and the tool's individual "Always allow" checkbox)
+						{t("settings:autoApprove.mcp.description")}
 					</p>
 					</p>
 				</div>
 				</div>
 
 
 				<div>
 				<div>
 					<VSCodeCheckbox
 					<VSCodeCheckbox
 						checked={alwaysAllowModeSwitch}
 						checked={alwaysAllowModeSwitch}
-						onChange={(e: any) => setCachedStateField("alwaysAllowModeSwitch", e.target.checked)}>
-						<span className="font-medium">Always approve mode switching</span>
+						onChange={(e: any) => setCachedStateField("alwaysAllowModeSwitch", e.target.checked)}
+						data-testid="always-allow-mode-switch-checkbox">
+						<span className="font-medium">{t("settings:autoApprove.modeSwitch.label")}</span>
 					</VSCodeCheckbox>
 					</VSCodeCheckbox>
 					<p className="text-vscode-descriptionForeground text-sm mt-0">
 					<p className="text-vscode-descriptionForeground text-sm mt-0">
-						Automatically switch between different modes without requiring approval
+						{t("settings:autoApprove.modeSwitch.description")}
 					</p>
 					</p>
 				</div>
 				</div>
 
 
 				<div>
 				<div>
 					<VSCodeCheckbox
 					<VSCodeCheckbox
 						checked={alwaysAllowSubtasks}
 						checked={alwaysAllowSubtasks}
-						onChange={(e: any) => setCachedStateField("alwaysAllowSubtasks", e.target.checked)}>
-						<span className="font-medium">Always approve creation & completion of subtasks</span>
+						onChange={(e: any) => setCachedStateField("alwaysAllowSubtasks", e.target.checked)}
+						data-testid="always-allow-subtasks-checkbox">
+						<span className="font-medium">{t("settings:autoApprove.subtasks.label")}</span>
 					</VSCodeCheckbox>
 					</VSCodeCheckbox>
 					<p className="text-vscode-descriptionForeground text-sm mt-0">
 					<p className="text-vscode-descriptionForeground text-sm mt-0">
-						Allow creation and completion of subtasks without requiring approval
+						{t("settings:autoApprove.subtasks.description")}
 					</p>
 					</p>
 				</div>
 				</div>
 
 
 				<div>
 				<div>
 					<VSCodeCheckbox
 					<VSCodeCheckbox
 						checked={alwaysAllowExecute}
 						checked={alwaysAllowExecute}
-						onChange={(e: any) => setCachedStateField("alwaysAllowExecute", e.target.checked)}>
-						<span className="font-medium">Always approve allowed execute operations</span>
+						onChange={(e: any) => setCachedStateField("alwaysAllowExecute", e.target.checked)}
+						data-testid="always-allow-execute-checkbox">
+						<span className="font-medium">{t("settings:autoApprove.execute.label")}</span>
 					</VSCodeCheckbox>
 					</VSCodeCheckbox>
 					<p className="text-vscode-descriptionForeground text-sm mt-0">
 					<p className="text-vscode-descriptionForeground text-sm mt-0">
-						Automatically execute allowed terminal commands without requiring approval
+						{t("settings:autoApprove.execute.description")}
 					</p>
 					</p>
 					{alwaysAllowExecute && (
 					{alwaysAllowExecute && (
 						<div
 						<div
@@ -209,10 +219,11 @@ export const AutoApproveSettings = ({
 								paddingLeft: 10,
 								paddingLeft: 10,
 								borderLeft: "2px solid var(--vscode-button-background)",
 								borderLeft: "2px solid var(--vscode-button-background)",
 							}}>
 							}}>
-							<span className="font-medium">Allowed Auto-Execute Commands</span>
+							<span className="font-medium" data-testid="allowed-commands-heading">
+								{t("settings:autoApprove.execute.allowedCommands")}
+							</span>
 							<p className="text-vscode-descriptionForeground text-sm mt-0">
 							<p className="text-vscode-descriptionForeground text-sm mt-0">
-								Command prefixes that can be auto-executed when "Always approve execute operations" is
-								enabled. Add * to allow all commands (use with caution).
+								{t("settings:autoApprove.execute.allowedCommandsDescription")}
 							</p>
 							</p>
 							<div style={{ display: "flex", gap: "5px", marginTop: "10px" }}>
 							<div style={{ display: "flex", gap: "5px", marginTop: "10px" }}>
 								<VSCodeTextField
 								<VSCodeTextField
@@ -224,10 +235,13 @@ export const AutoApproveSettings = ({
 											handleAddCommand()
 											handleAddCommand()
 										}
 										}
 									}}
 									}}
-									placeholder="Enter command prefix (e.g., 'git ')"
+									placeholder={t("settings:autoApprove.execute.commandPlaceholder")}
+									data-testid="command-input"
 									style={{ flexGrow: 1 }}
 									style={{ flexGrow: 1 }}
 								/>
 								/>
-								<VSCodeButton onClick={handleAddCommand}>Add</VSCodeButton>
+								<VSCodeButton onClick={handleAddCommand} data-testid="add-command-button">
+									{t("settings:autoApprove.execute.addButton")}
+								</VSCodeButton>
 							</div>
 							</div>
 							<div
 							<div
 								style={{
 								style={{
@@ -244,6 +258,7 @@ export const AutoApproveSettings = ({
 										<VSCodeButton
 										<VSCodeButton
 											appearance="icon"
 											appearance="icon"
 											className="text-primary-foreground"
 											className="text-primary-foreground"
+											data-testid={`remove-command-${index}`}
 											onClick={() => {
 											onClick={() => {
 												const newCommands = (allowedCommands ?? []).filter(
 												const newCommands = (allowedCommands ?? []).filter(
 													(_, i) => i !== index,
 													(_, i) => i !== index,

+ 26 - 23
webview-ui/src/components/settings/BrowserSettings.tsx

@@ -1,4 +1,5 @@
 import React, { HTMLAttributes, useState, useEffect } from "react"
 import React, { HTMLAttributes, useState, useEffect } from "react"
+import { useAppTranslation } from "@/i18n/TranslationContext"
 import { VSCodeButton, VSCodeCheckbox, VSCodeTextField } from "@vscode/webview-ui-toolkit/react"
 import { VSCodeButton, VSCodeCheckbox, VSCodeTextField } from "@vscode/webview-ui-toolkit/react"
 import { Dropdown, type DropdownOption } from "vscrui"
 import { Dropdown, type DropdownOption } from "vscrui"
 import { SquareMousePointer } from "lucide-react"
 import { SquareMousePointer } from "lucide-react"
@@ -33,6 +34,7 @@ export const BrowserSettings = ({
 	setCachedStateField,
 	setCachedStateField,
 	...props
 	...props
 }: BrowserSettingsProps) => {
 }: BrowserSettingsProps) => {
+	const { t } = useAppTranslation()
 	const [testingConnection, setTestingConnection] = useState(false)
 	const [testingConnection, setTestingConnection] = useState(false)
 	const [testResult, setTestResult] = useState<{ success: boolean; message: string } | null>(null)
 	const [testResult, setTestResult] = useState<{ success: boolean; message: string } | null>(null)
 	const [discovering, setDiscovering] = useState(false)
 	const [discovering, setDiscovering] = useState(false)
@@ -102,7 +104,7 @@ export const BrowserSettings = ({
 			<SectionHeader>
 			<SectionHeader>
 				<div className="flex items-center gap-2">
 				<div className="flex items-center gap-2">
 					<SquareMousePointer className="w-4" />
 					<SquareMousePointer className="w-4" />
-					<div>Browser / Computer Use</div>
+					<div>{t("settings:sections.browser")}</div>
 				</div>
 				</div>
 			</SectionHeader>
 			</SectionHeader>
 
 
@@ -111,11 +113,10 @@ export const BrowserSettings = ({
 					<VSCodeCheckbox
 					<VSCodeCheckbox
 						checked={browserToolEnabled}
 						checked={browserToolEnabled}
 						onChange={(e: any) => setCachedStateField("browserToolEnabled", e.target.checked)}>
 						onChange={(e: any) => setCachedStateField("browserToolEnabled", e.target.checked)}>
-						<span className="font-medium">Enable browser tool</span>
+						<span className="font-medium">{t("settings:browser.enable.label")}</span>
 					</VSCodeCheckbox>
 					</VSCodeCheckbox>
 					<p className="text-vscode-descriptionForeground text-sm mt-0">
 					<p className="text-vscode-descriptionForeground text-sm mt-0">
-						When enabled, Roo can use a browser to interact with websites when using models that support
-						computer use.
+						{t("settings:browser.enable.description")}
 					</p>
 					</p>
 					{browserToolEnabled && (
 					{browserToolEnabled && (
 						<div
 						<div
@@ -126,7 +127,7 @@ export const BrowserSettings = ({
 							}}>
 							}}>
 							<div>
 							<div>
 								<label style={{ fontWeight: "500", display: "block", marginBottom: 5 }}>
 								<label style={{ fontWeight: "500", display: "block", marginBottom: 5 }}>
-									Viewport size
+									{t("settings:browser.viewport.label")}
 								</label>
 								</label>
 								<div className="dropdown-container">
 								<div className="dropdown-container">
 									<Dropdown
 									<Dropdown
@@ -136,21 +137,26 @@ export const BrowserSettings = ({
 										}}
 										}}
 										style={{ width: "100%" }}
 										style={{ width: "100%" }}
 										options={[
 										options={[
-											{ value: "1280x800", label: "Large Desktop (1280x800)" },
-											{ value: "900x600", label: "Small Desktop (900x600)" },
-											{ value: "768x1024", label: "Tablet (768x1024)" },
-											{ value: "360x640", label: "Mobile (360x640)" },
+											{
+												value: "1280x800",
+												label: t("settings:browser.viewport.options.largeDesktop"),
+											},
+											{
+												value: "900x600",
+												label: t("settings:browser.viewport.options.smallDesktop"),
+											},
+											{ value: "768x1024", label: t("settings:browser.viewport.options.tablet") },
+											{ value: "360x640", label: t("settings:browser.viewport.options.mobile") },
 										]}
 										]}
 									/>
 									/>
 								</div>
 								</div>
 								<p className="text-vscode-descriptionForeground text-sm mt-0">
 								<p className="text-vscode-descriptionForeground text-sm mt-0">
-									Select the viewport size for browser interactions. This affects how websites are
-									displayed and interacted with.
+									{t("settings:browser.viewport.description")}
 								</p>
 								</p>
 							</div>
 							</div>
 							<div>
 							<div>
 								<div style={{ display: "flex", flexDirection: "column", gap: "5px" }}>
 								<div style={{ display: "flex", flexDirection: "column", gap: "5px" }}>
-									<span className="font-medium">Screenshot quality</span>
+									<span className="font-medium">{t("settings:browser.screenshotQuality.label")}</span>
 									<div style={{ display: "flex", alignItems: "center", gap: "5px" }}>
 									<div style={{ display: "flex", alignItems: "center", gap: "5px" }}>
 										<input
 										<input
 											type="range"
 											type="range"
@@ -167,8 +173,7 @@ export const BrowserSettings = ({
 									</div>
 									</div>
 								</div>
 								</div>
 								<p className="text-vscode-descriptionForeground text-sm mt-0">
 								<p className="text-vscode-descriptionForeground text-sm mt-0">
-									Adjust the WebP quality of browser screenshots. Higher values provide clearer
-									screenshots but increase token usage.
+									{t("settings:browser.screenshotQuality.description")}
 								</p>
 								</p>
 							</div>
 							</div>
 							<div className="mt-4">
 							<div className="mt-4">
@@ -183,11 +188,10 @@ export const BrowserSettings = ({
 												setCachedStateField("remoteBrowserHost", undefined)
 												setCachedStateField("remoteBrowserHost", undefined)
 											}
 											}
 										}}>
 										}}>
-										<span className="font-medium">Use remote browser connection</span>
+										<span className="font-medium">{t("settings:browser.remote.label")}</span>
 									</VSCodeCheckbox>
 									</VSCodeCheckbox>
 									<p className="text-vscode-descriptionForeground text-sm mt-0 ml-6">
 									<p className="text-vscode-descriptionForeground text-sm mt-0 ml-6">
-										Connect to a Chrome browser running with remote debugging enabled
-										(--remote-debugging-port=9222).
+										{t("settings:browser.remote.description")}
 									</p>
 									</p>
 								</div>
 								</div>
 								{remoteBrowserEnabled && (
 								{remoteBrowserEnabled && (
@@ -201,13 +205,15 @@ export const BrowserSettings = ({
 														e.target.value || undefined,
 														e.target.value || undefined,
 													)
 													)
 												}
 												}
-												placeholder="Custom URL (e.g., http://localhost:9222)"
+												placeholder={t("settings:browser.remote.urlPlaceholder")}
 												style={{ flexGrow: 1 }}
 												style={{ flexGrow: 1 }}
 											/>
 											/>
 											<VSCodeButton
 											<VSCodeButton
 												disabled={testingConnection}
 												disabled={testingConnection}
 												onClick={remoteBrowserHost ? testConnection : discoverBrowser}>
 												onClick={remoteBrowserHost ? testConnection : discoverBrowser}>
-												{testingConnection || discovering ? "Testing..." : "Test Connection"}
+												{testingConnection || discovering
+													? t("settings:browser.remote.testingButton")
+													: t("settings:browser.remote.testButton")}
 											</VSCodeButton>
 											</VSCodeButton>
 										</div>
 										</div>
 										{testResult && (
 										{testResult && (
@@ -221,10 +227,7 @@ export const BrowserSettings = ({
 											</div>
 											</div>
 										)}
 										)}
 										<p className="text-vscode-descriptionForeground text-sm mt-2">
 										<p className="text-vscode-descriptionForeground text-sm mt-2">
-											Enter the DevTools Protocol host address or
-											<strong> leave empty to auto-discover Chrome local instances.</strong>
-											The Test Connection button will try the custom URL if provided, or
-											auto-discover if the field is empty.
+											{t("settings:browser.remote.instructions")}
 										</p>
 										</p>
 									</>
 									</>
 								)}
 								)}

+ 5 - 4
webview-ui/src/components/settings/CheckpointSettings.tsx

@@ -1,4 +1,5 @@
 import { HTMLAttributes } from "react"
 import { HTMLAttributes } from "react"
+import { useAppTranslation } from "@/i18n/TranslationContext"
 import { VSCodeCheckbox } from "@vscode/webview-ui-toolkit/react"
 import { VSCodeCheckbox } from "@vscode/webview-ui-toolkit/react"
 import { GitBranch } from "lucide-react"
 import { GitBranch } from "lucide-react"
 
 
@@ -20,12 +21,13 @@ export const CheckpointSettings = ({
 	setCachedStateField,
 	setCachedStateField,
 	...props
 	...props
 }: CheckpointSettingsProps) => {
 }: CheckpointSettingsProps) => {
+	const { t } = useAppTranslation()
 	return (
 	return (
 		<div {...props}>
 		<div {...props}>
 			<SectionHeader>
 			<SectionHeader>
 				<div className="flex items-center gap-2">
 				<div className="flex items-center gap-2">
 					<GitBranch className="w-4" />
 					<GitBranch className="w-4" />
-					<div>Checkpoints</div>
+					<div>{t("settings:sections.checkpoints")}</div>
 				</div>
 				</div>
 			</SectionHeader>
 			</SectionHeader>
 
 
@@ -36,11 +38,10 @@ export const CheckpointSettings = ({
 						onChange={(e: any) => {
 						onChange={(e: any) => {
 							setCachedStateField("enableCheckpoints", e.target.checked)
 							setCachedStateField("enableCheckpoints", e.target.checked)
 						}}>
 						}}>
-						<span className="font-medium">Enable automatic checkpoints</span>
+						<span className="font-medium">{t("settings:checkpoints.enable.label")}</span>
 					</VSCodeCheckbox>
 					</VSCodeCheckbox>
 					<p className="text-vscode-descriptionForeground text-sm mt-0">
 					<p className="text-vscode-descriptionForeground text-sm mt-0">
-						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")}
 					</p>
 					</p>
 				</div>
 				</div>
 			</Section>
 			</Section>

+ 12 - 14
webview-ui/src/components/settings/ContextManagementSettings.tsx

@@ -1,4 +1,5 @@
 import { HTMLAttributes } from "react"
 import { HTMLAttributes } from "react"
+import { useAppTranslation } from "@/i18n/TranslationContext"
 import { VSCodeCheckbox } from "@vscode/webview-ui-toolkit/react"
 import { VSCodeCheckbox } from "@vscode/webview-ui-toolkit/react"
 import { Database } from "lucide-react"
 import { Database } from "lucide-react"
 
 
@@ -28,19 +29,20 @@ export const ContextManagementSettings = ({
 	className,
 	className,
 	...props
 	...props
 }: ContextManagementSettingsProps) => {
 }: ContextManagementSettingsProps) => {
+	const { t } = useAppTranslation()
 	return (
 	return (
 		<div className={cn("flex flex-col gap-2", className)} {...props}>
 		<div className={cn("flex flex-col gap-2", className)} {...props}>
-			<SectionHeader description="Control what information is included in the AI's context window, affecting token usage and response quality">
+			<SectionHeader description={t("settings:contextManagement.description")}>
 				<div className="flex items-center gap-2">
 				<div className="flex items-center gap-2">
 					<Database className="w-4" />
 					<Database className="w-4" />
-					<div>Context Management</div>
+					<div>{t("settings:sections.contextManagement")}</div>
 				</div>
 				</div>
 			</SectionHeader>
 			</SectionHeader>
 
 
 			<Section>
 			<Section>
 				<div>
 				<div>
 					<div className="flex flex-col gap-2">
 					<div className="flex flex-col gap-2">
-						<span className="font-medium">Terminal output limit</span>
+						<span className="font-medium">{t("settings:contextManagement.terminal.label")}</span>
 						<div className="flex items-center gap-2">
 						<div className="flex items-center gap-2">
 							<input
 							<input
 								type="range"
 								type="range"
@@ -58,14 +60,13 @@ export const ContextManagementSettings = ({
 						</div>
 						</div>
 					</div>
 					</div>
 					<p className="text-vscode-descriptionForeground text-sm mt-0">
 					<p className="text-vscode-descriptionForeground text-sm mt-0">
-						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")}
 					</p>
 					</p>
 				</div>
 				</div>
 
 
 				<div>
 				<div>
 					<div className="flex flex-col gap-2">
 					<div className="flex flex-col gap-2">
-						<span className="font-medium">Open tabs context limit</span>
+						<span className="font-medium">{t("settings:contextManagement.openTabs.label")}</span>
 						<div className="flex items-center gap-2">
 						<div className="flex items-center gap-2">
 							<input
 							<input
 								type="range"
 								type="range"
@@ -81,14 +82,13 @@ export const ContextManagementSettings = ({
 						</div>
 						</div>
 					</div>
 					</div>
 					<p className="text-vscode-descriptionForeground text-sm mt-0">
 					<p className="text-vscode-descriptionForeground text-sm mt-0">
-						Maximum number of VSCode open tabs to include in context. Higher values provide more context but
-						increase token usage.
+						{t("settings:contextManagement.openTabs.description")}
 					</p>
 					</p>
 				</div>
 				</div>
 
 
 				<div>
 				<div>
 					<div className="flex flex-col gap-2">
 					<div className="flex flex-col gap-2">
-						<span className="font-medium">Workspace files context limit</span>
+						<span className="font-medium">{t("settings:contextManagement.workspaceFiles.label")}</span>
 						<div className="flex items-center gap-2">
 						<div className="flex items-center gap-2">
 							<input
 							<input
 								type="range"
 								type="range"
@@ -104,8 +104,7 @@ export const ContextManagementSettings = ({
 						</div>
 						</div>
 					</div>
 					</div>
 					<p className="text-vscode-descriptionForeground text-sm mt-0">
 					<p className="text-vscode-descriptionForeground text-sm mt-0">
-						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")}
 					</p>
 					</p>
 				</div>
 				</div>
 
 
@@ -116,11 +115,10 @@ export const ContextManagementSettings = ({
 							setCachedStateField("showRooIgnoredFiles", e.target.checked)
 							setCachedStateField("showRooIgnoredFiles", e.target.checked)
 						}}
 						}}
 						data-testid="show-rooignored-files-checkbox">
 						data-testid="show-rooignored-files-checkbox">
-						<span className="font-medium">Show .rooignore'd files in lists and searches</span>
+						<span className="font-medium">{t("settings:contextManagement.rooignore.label")}</span>
 					</VSCodeCheckbox>
 					</VSCodeCheckbox>
 					<p className="text-vscode-descriptionForeground text-sm mt-0">
 					<p className="text-vscode-descriptionForeground text-sm mt-0">
-						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")}
 					</p>
 					</p>
 				</div>
 				</div>
 			</Section>
 			</Section>

+ 21 - 12
webview-ui/src/components/settings/ExperimentalFeature.tsx

@@ -1,20 +1,29 @@
 import { VSCodeCheckbox } from "@vscode/webview-ui-toolkit/react"
 import { VSCodeCheckbox } from "@vscode/webview-ui-toolkit/react"
+import { useAppTranslation } from "@/i18n/TranslationContext"
 
 
 interface ExperimentalFeatureProps {
 interface ExperimentalFeatureProps {
-	name: string
-	description: string
 	enabled: boolean
 	enabled: boolean
 	onChange: (value: boolean) => void
 	onChange: (value: boolean) => void
+	// Additional property to identify the experiment
+	experimentKey?: string
 }
 }
 
 
-export const ExperimentalFeature = ({ name, description, enabled, onChange }: ExperimentalFeatureProps) => (
-	<div>
-		<div className="flex items-center gap-2">
-			<span className="text-vscode-errorForeground">⚠️</span>
-			<VSCodeCheckbox checked={enabled} onChange={(e: any) => onChange(e.target.checked)}>
-				<span className="font-medium">{name}</span>
-			</VSCodeCheckbox>
+export const ExperimentalFeature = ({ enabled, onChange, experimentKey }: ExperimentalFeatureProps) => {
+	const { t } = useAppTranslation()
+
+	// Generate translation keys based on experiment key
+	const nameKey = experimentKey ? `settings:experimental.${experimentKey}.name` : ""
+	const descriptionKey = experimentKey ? `settings:experimental.${experimentKey}.description` : ""
+
+	return (
+		<div>
+			<div className="flex items-center gap-2">
+				<span className="text-vscode-errorForeground">{t("settings:experimental.warning")}</span>
+				<VSCodeCheckbox checked={enabled} onChange={(e: any) => onChange(e.target.checked)}>
+					<span className="font-medium">{t(nameKey)}</span>
+				</VSCodeCheckbox>
+			</div>
+			<p className="text-vscode-descriptionForeground text-sm mt-0">{t(descriptionKey)}</p>
 		</div>
 		</div>
-		<p className="text-vscode-descriptionForeground text-sm mt-0">{description}</p>
-	</div>
-)
+	)
+}

+ 4 - 2
webview-ui/src/components/settings/ExperimentalSettings.tsx

@@ -1,4 +1,5 @@
 import { HTMLAttributes } from "react"
 import { HTMLAttributes } from "react"
+import { useAppTranslation } from "@/i18n/TranslationContext"
 import { FlaskConical } from "lucide-react"
 import { FlaskConical } from "lucide-react"
 
 
 import { EXPERIMENT_IDS, experimentConfigsMap, ExperimentId } from "../../../../src/shared/experiments"
 import { EXPERIMENT_IDS, experimentConfigsMap, ExperimentId } from "../../../../src/shared/experiments"
@@ -25,12 +26,13 @@ export const ExperimentalSettings = ({
 	className,
 	className,
 	...props
 	...props
 }: ExperimentalSettingsProps) => {
 }: ExperimentalSettingsProps) => {
+	const { t } = useAppTranslation()
 	return (
 	return (
 		<div className={cn("flex flex-col gap-2", className)} {...props}>
 		<div className={cn("flex flex-col gap-2", className)} {...props}>
 			<SectionHeader>
 			<SectionHeader>
 				<div className="flex items-center gap-2">
 				<div className="flex items-center gap-2">
 					<FlaskConical className="w-4" />
 					<FlaskConical className="w-4" />
-					<div>Experimental Features</div>
+					<div>{t("settings:sections.experimental")}</div>
 				</div>
 				</div>
 			</SectionHeader>
 			</SectionHeader>
 
 
@@ -40,7 +42,7 @@ export const ExperimentalSettings = ({
 					.map((config) => (
 					.map((config) => (
 						<ExperimentalFeature
 						<ExperimentalFeature
 							key={config[0]}
 							key={config[0]}
-							{...config[1]}
+							experimentKey={config[0]}
 							enabled={experiments[EXPERIMENT_IDS[config[0] as keyof typeof EXPERIMENT_IDS]] ?? false}
 							enabled={experiments[EXPERIMENT_IDS[config[0] as keyof typeof EXPERIMENT_IDS]] ?? false}
 							onChange={(enabled) =>
 							onChange={(enabled) =>
 								setExperimentEnabled(EXPERIMENT_IDS[config[0] as keyof typeof EXPERIMENT_IDS], enabled)
 								setExperimentEnabled(EXPERIMENT_IDS[config[0] as keyof typeof EXPERIMENT_IDS], enabled)

+ 22 - 16
webview-ui/src/components/settings/ModelInfoView.tsx

@@ -1,5 +1,6 @@
 import { useMemo } from "react"
 import { useMemo } from "react"
 import { VSCodeLink } from "@vscode/webview-ui-toolkit/react"
 import { VSCodeLink } from "@vscode/webview-ui-toolkit/react"
+import { useAppTranslation } from "@/i18n/TranslationContext"
 
 
 import { formatPrice } from "@/utils/formatPrice"
 import { formatPrice } from "@/utils/formatPrice"
 import { cn } from "@/lib/utils"
 import { cn } from "@/lib/utils"
@@ -21,59 +22,64 @@ export const ModelInfoView = ({
 	isDescriptionExpanded,
 	isDescriptionExpanded,
 	setIsDescriptionExpanded,
 	setIsDescriptionExpanded,
 }: ModelInfoViewProps) => {
 }: ModelInfoViewProps) => {
+	const { t } = useAppTranslation()
 	const isGemini = useMemo(() => Object.keys(geminiModels).includes(selectedModelId), [selectedModelId])
 	const isGemini = useMemo(() => Object.keys(geminiModels).includes(selectedModelId), [selectedModelId])
 
 
 	const infoItems = [
 	const infoItems = [
 		<ModelInfoSupportsItem
 		<ModelInfoSupportsItem
 			isSupported={modelInfo.supportsImages ?? false}
 			isSupported={modelInfo.supportsImages ?? false}
-			supportsLabel="Supports images"
-			doesNotSupportLabel="Does not support images"
+			supportsLabel={t("settings:modelInfo.supportsImages")}
+			doesNotSupportLabel={t("settings:modelInfo.noImages")}
 		/>,
 		/>,
 		<ModelInfoSupportsItem
 		<ModelInfoSupportsItem
 			isSupported={modelInfo.supportsComputerUse ?? false}
 			isSupported={modelInfo.supportsComputerUse ?? false}
-			supportsLabel="Supports computer use"
-			doesNotSupportLabel="Does not support computer use"
+			supportsLabel={t("settings:modelInfo.supportsComputerUse")}
+			doesNotSupportLabel={t("settings:modelInfo.noComputerUse")}
 		/>,
 		/>,
 		!isGemini && (
 		!isGemini && (
 			<ModelInfoSupportsItem
 			<ModelInfoSupportsItem
 				isSupported={modelInfo.supportsPromptCache}
 				isSupported={modelInfo.supportsPromptCache}
-				supportsLabel="Supports prompt caching"
-				doesNotSupportLabel="Does not support prompt caching"
+				supportsLabel={t("settings:modelInfo.supportsPromptCache")}
+				doesNotSupportLabel={t("settings:modelInfo.noPromptCache")}
 			/>
 			/>
 		),
 		),
 		modelInfo.maxTokens !== undefined && modelInfo.maxTokens > 0 && (
 		modelInfo.maxTokens !== undefined && modelInfo.maxTokens > 0 && (
 			<>
 			<>
-				<span className="font-medium">Max output:</span> {modelInfo.maxTokens?.toLocaleString()} tokens
+				<span className="font-medium">{t("settings:modelInfo.maxOutput")}:</span>{" "}
+				{modelInfo.maxTokens?.toLocaleString()} tokens
 			</>
 			</>
 		),
 		),
 		modelInfo.inputPrice !== undefined && modelInfo.inputPrice > 0 && (
 		modelInfo.inputPrice !== undefined && modelInfo.inputPrice > 0 && (
 			<>
 			<>
-				<span className="font-medium">Input price:</span> {formatPrice(modelInfo.inputPrice)} / 1M tokens
+				<span className="font-medium">{t("settings:modelInfo.inputPrice")}:</span>{" "}
+				{formatPrice(modelInfo.inputPrice)} / 1M tokens
 			</>
 			</>
 		),
 		),
 		modelInfo.outputPrice !== undefined && modelInfo.outputPrice > 0 && (
 		modelInfo.outputPrice !== undefined && modelInfo.outputPrice > 0 && (
 			<>
 			<>
-				<span className="font-medium">Output price:</span> {formatPrice(modelInfo.outputPrice)} / 1M tokens
+				<span className="font-medium">{t("settings:modelInfo.outputPrice")}:</span>{" "}
+				{formatPrice(modelInfo.outputPrice)} / 1M tokens
 			</>
 			</>
 		),
 		),
 		modelInfo.supportsPromptCache && modelInfo.cacheReadsPrice && (
 		modelInfo.supportsPromptCache && modelInfo.cacheReadsPrice && (
 			<>
 			<>
-				<span className="font-medium">Cache reads price:</span> {formatPrice(modelInfo.cacheReadsPrice || 0)} /
-				1M tokens
+				<span className="font-medium">{t("settings:modelInfo.cacheReadsPrice")}:</span>{" "}
+				{formatPrice(modelInfo.cacheReadsPrice || 0)} / 1M tokens
 			</>
 			</>
 		),
 		),
 		modelInfo.supportsPromptCache && modelInfo.cacheWritesPrice && (
 		modelInfo.supportsPromptCache && modelInfo.cacheWritesPrice && (
 			<>
 			<>
-				<span className="font-medium">Cache writes price:</span> {formatPrice(modelInfo.cacheWritesPrice || 0)}{" "}
-				/ 1M tokens
+				<span className="font-medium">{t("settings:modelInfo.cacheWritesPrice")}:</span>{" "}
+				{formatPrice(modelInfo.cacheWritesPrice || 0)} / 1M tokens
 			</>
 			</>
 		),
 		),
 		isGemini && (
 		isGemini && (
 			<span className="italic">
 			<span className="italic">
-				* 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,
+				})}{" "}
 				<VSCodeLink href="https://ai.google.dev/pricing" className="text-sm">
 				<VSCodeLink href="https://ai.google.dev/pricing" className="text-sm">
-					For more info, see pricing details.
+					{t("settings:modelInfo.gemini.pricingDetails")}
 				</VSCodeLink>
 				</VSCodeLink>
 			</span>
 			</span>
 		),
 		),

+ 12 - 9
webview-ui/src/components/settings/ModelPicker.tsx

@@ -1,5 +1,6 @@
 import { useMemo, useState, useCallback, useEffect, useRef } from "react"
 import { useMemo, useState, useCallback, useEffect, useRef } from "react"
 import { VSCodeLink } from "@vscode/webview-ui-toolkit/react"
 import { VSCodeLink } from "@vscode/webview-ui-toolkit/react"
+import { Trans } from "react-i18next"
 
 
 import { Combobox, ComboboxContent, ComboboxEmpty, ComboboxInput, ComboboxItem } from "@/components/ui/combobox"
 import { Combobox, ComboboxContent, ComboboxEmpty, ComboboxInput, ComboboxItem } from "@/components/ui/combobox"
 
 
@@ -100,15 +101,17 @@ export const ModelPicker = ({
 				modelInfo={selectedModelInfo}
 				modelInfo={selectedModelInfo}
 			/>
 			/>
 			<div className="text-sm text-vscode-descriptionForeground">
 			<div className="text-sm text-vscode-descriptionForeground">
-				The extension automatically fetches the latest list of models available on{" "}
-				<VSCodeLink href={serviceUrl} className="text-sm">
-					{serviceName}
-				</VSCodeLink>
-				. If you're unsure which model to choose, Roo Code works best with{" "}
-				<VSCodeLink onClick={() => onSelect(defaultModelId)} className="text-sm">
-					{defaultModelId}.
-				</VSCodeLink>
-				You can also try searching "free" for no-cost options currently available.
+				<Trans
+					i18nKey="settings:modelPicker.automaticFetch"
+					components={{
+						serviceLink: <VSCodeLink href={serviceUrl} className="text-sm" />,
+						defaultModelLink: <VSCodeLink onClick={() => onSelect(defaultModelId)} className="text-sm" />,
+					}}
+					values={{
+						serviceName,
+						defaultModelId,
+					}}
+				/>
 			</div>
 			</div>
 		</>
 		</>
 	)
 	)

+ 11 - 5
webview-ui/src/components/settings/NotificationSettings.tsx

@@ -1,4 +1,5 @@
 import { HTMLAttributes } from "react"
 import { HTMLAttributes } from "react"
+import { useAppTranslation } from "@/i18n/TranslationContext"
 import { VSCodeCheckbox } from "@vscode/webview-ui-toolkit/react"
 import { VSCodeCheckbox } from "@vscode/webview-ui-toolkit/react"
 import { Bell } from "lucide-react"
 import { Bell } from "lucide-react"
 
 
@@ -18,12 +19,13 @@ export const NotificationSettings = ({
 	setCachedStateField,
 	setCachedStateField,
 	...props
 	...props
 }: NotificationSettingsProps) => {
 }: NotificationSettingsProps) => {
+	const { t } = useAppTranslation()
 	return (
 	return (
 		<div {...props}>
 		<div {...props}>
 			<SectionHeader>
 			<SectionHeader>
 				<div className="flex items-center gap-2">
 				<div className="flex items-center gap-2">
 					<Bell className="w-4" />
 					<Bell className="w-4" />
-					<div>Notifications</div>
+					<div>{t("settings:sections.notifications")}</div>
 				</div>
 				</div>
 			</SectionHeader>
 			</SectionHeader>
 
 
@@ -31,11 +33,12 @@ export const NotificationSettings = ({
 				<div>
 				<div>
 					<VSCodeCheckbox
 					<VSCodeCheckbox
 						checked={soundEnabled}
 						checked={soundEnabled}
-						onChange={(e: any) => setCachedStateField("soundEnabled", e.target.checked)}>
-						<span className="font-medium">Enable sound effects</span>
+						onChange={(e: any) => setCachedStateField("soundEnabled", e.target.checked)}
+						data-testid="sound-enabled-checkbox">
+						<span className="font-medium">{t("settings:notifications.sound.label")}</span>
 					</VSCodeCheckbox>
 					</VSCodeCheckbox>
 					<p className="text-vscode-descriptionForeground text-sm mt-0">
 					<p className="text-vscode-descriptionForeground text-sm mt-0">
-						When enabled, Roo will play sound effects for notifications and events.
+						{t("settings:notifications.sound.description")}
 					</p>
 					</p>
 					{soundEnabled && (
 					{soundEnabled && (
 						<div
 						<div
@@ -54,12 +57,15 @@ export const NotificationSettings = ({
 									onChange={(e) => setCachedStateField("soundVolume", parseFloat(e.target.value))}
 									onChange={(e) => setCachedStateField("soundVolume", parseFloat(e.target.value))}
 									className="h-2 focus:outline-0 w-4/5 accent-vscode-button-background"
 									className="h-2 focus:outline-0 w-4/5 accent-vscode-button-background"
 									aria-label="Volume"
 									aria-label="Volume"
+									data-testid="sound-volume-slider"
 								/>
 								/>
 								<span style={{ minWidth: "35px", textAlign: "left" }}>
 								<span style={{ minWidth: "35px", textAlign: "left" }}>
 									{((soundVolume ?? 0.5) * 100).toFixed(0)}%
 									{((soundVolume ?? 0.5) * 100).toFixed(0)}%
 								</span>
 								</span>
 							</div>
 							</div>
-							<p className="text-vscode-descriptionForeground text-sm mt-1">Volume</p>
+							<p className="text-vscode-descriptionForeground text-sm mt-1">
+								{t("settings:notifications.sound.volumeLabel")}
+							</p>
 						</div>
 						</div>
 					)}
 					)}
 				</div>
 				</div>

+ 13 - 11
webview-ui/src/components/settings/SectionHeader.tsx

@@ -7,14 +7,16 @@ type SectionHeaderProps = HTMLAttributes<HTMLDivElement> & {
 	description?: string
 	description?: string
 }
 }
 
 
-export const SectionHeader = ({ description, children, className, ...props }: SectionHeaderProps) => (
-	<div
-		className={cn(
-			"sticky top-0 z-10 text-vscode-sideBar-foreground bg-vscode-sideBar-background brightness-90 px-5 py-4",
-			className,
-		)}
-		{...props}>
-		<h4 className="m-0">{children}</h4>
-		{description && <p className="text-vscode-descriptionForeground text-sm mt-2 mb-0">{description}</p>}
-	</div>
-)
+export const SectionHeader = ({ description, children, className, ...props }: SectionHeaderProps) => {
+	return (
+		<div
+			className={cn(
+				"sticky top-0 z-10 text-vscode-sideBar-foreground bg-vscode-sideBar-background brightness-90 px-5 py-4",
+				className,
+			)}
+			{...props}>
+			<h4 className="m-0">{children}</h4>
+			{description && <p className="text-vscode-descriptionForeground text-sm mt-2 mb-0">{description}</p>}
+		</div>
+	)
+}

+ 94 - 51
webview-ui/src/components/settings/SettingsFooter.tsx

@@ -1,73 +1,116 @@
 import { HTMLAttributes } from "react"
 import { HTMLAttributes } from "react"
+import { useAppTranslation } from "@/i18n/TranslationContext"
+import { Trans } from "react-i18next"
+import { Globe } from "lucide-react"
 
 
 import { VSCodeButton, VSCodeCheckbox, VSCodeLink } from "@vscode/webview-ui-toolkit/react"
 import { VSCodeButton, VSCodeCheckbox, VSCodeLink } from "@vscode/webview-ui-toolkit/react"
 
 
 import { vscode } from "@/utils/vscode"
 import { vscode } from "@/utils/vscode"
 import { cn } from "@/lib/utils"
 import { cn } from "@/lib/utils"
 import { TelemetrySetting } from "../../../../src/shared/TelemetrySetting"
 import { TelemetrySetting } from "../../../../src/shared/TelemetrySetting"
+import { SetCachedStateField } from "./types"
+
+// Map of language codes to their display names
+const LANGUAGES: Record<string, string> = {
+	ca: "Català",
+	de: "Deutsch",
+	en: "English",
+	es: "Español",
+	fr: "Français",
+	hi: "हिन्दी",
+	it: "Italiano",
+	ja: "日本語",
+	ko: "한국어",
+	pl: "Polski",
+	"pt-BR": "Português",
+	tr: "Türkçe",
+	vi: "Tiếng Việt",
+	"zh-CN": "简体中文",
+	"zh-TW": "繁體中文",
+}
 
 
 type SettingsFooterProps = HTMLAttributes<HTMLDivElement> & {
 type SettingsFooterProps = HTMLAttributes<HTMLDivElement> & {
 	version: string
 	version: string
 	telemetrySetting: TelemetrySetting
 	telemetrySetting: TelemetrySetting
 	setTelemetrySetting: (setting: TelemetrySetting) => void
 	setTelemetrySetting: (setting: TelemetrySetting) => void
+	language: string
+	setCachedStateField: SetCachedStateField<"language">
 }
 }
 
 
 export const SettingsFooter = ({
 export const SettingsFooter = ({
 	version,
 	version,
 	telemetrySetting,
 	telemetrySetting,
 	setTelemetrySetting,
 	setTelemetrySetting,
+	language,
+	setCachedStateField,
 	className,
 	className,
 	...props
 	...props
-}: SettingsFooterProps) => (
-	<div className={cn("text-vscode-descriptionForeground p-5", className)} {...props}>
-		<p style={{ wordWrap: "break-word", margin: 0, padding: 0 }}>
-			If you have any questions or feedback, feel free to open an issue at{" "}
-			<VSCodeLink href="https://github.com/RooVetGit/Roo-Code" style={{ display: "inline" }}>
-				github.com/RooVetGit/Roo-Code
-			</VSCodeLink>{" "}
-			or join{" "}
-			<VSCodeLink href="https://www.reddit.com/r/RooCode/" style={{ display: "inline" }}>
-				reddit.com/r/RooCode
-			</VSCodeLink>
-		</p>
-		<p className="italic">Roo Code v{version}</p>
-		<div className="mt-4 mb-4">
-			<div>
-				<VSCodeCheckbox
-					style={{ marginBottom: "5px" }}
-					checked={telemetrySetting === "enabled"}
-					onChange={(e: any) => {
-						const checked = e.target.checked === true
-						setTelemetrySetting(checked ? "enabled" : "disabled")
-					}}>
-					Allow anonymous error and usage reporting
-				</VSCodeCheckbox>
-				<p
-					style={{
-						fontSize: "12px",
-						marginTop: "5px",
-						color: "var(--vscode-descriptionForeground)",
-					}}>
-					Help improve Roo Code by sending anonymous usage data and error reports. No code, prompts, or
-					personal information is ever sent. See our{" "}
-					<VSCodeLink
-						href="https://github.com/RooVetGit/Roo-Code/blob/main/PRIVACY.md"
-						style={{ fontSize: "inherit" }}>
-						privacy policy
-					</VSCodeLink>{" "}
-					for more details.
-				</p>
+}: SettingsFooterProps) => {
+	const { t } = useAppTranslation()
+
+	return (
+		<div className={cn("text-vscode-descriptionForeground p-5", className)} {...props}>
+			<p style={{ wordWrap: "break-word", margin: 0, padding: 0 }}>
+				<Trans
+					i18nKey="settings:footer.feedback"
+					components={{
+						githubLink: <VSCodeLink href="https://github.com/RooVetGit/Roo-Code" />,
+						redditLink: <VSCodeLink href="https://reddit.com/r/RooCode" />,
+						discordLink: <VSCodeLink href="https://discord.gg/roocode" />,
+					}}
+				/>
+			</p>
+			<div className="flex items-center gap-4">
+				<div className="flex items-center text-nowrap">
+					<p>Roo Code</p>
+					<p className="italic ml-1">v{version}</p>
+				</div>
+				<div className="relative flex items-center">
+					<Globe className="w-4 h-4 text-vscode-descriptionForeground absolute left-2 pointer-events-none" />
+					<select
+						value={language}
+						onChange={(e) => setCachedStateField("language", e.target.value)}
+						className="appearance-none bg-transparent text-vscode-foreground border border-transparent hover:border-vscode-input-border focus:border-vscode-focusBorder rounded px-2 py-1 pl-7 text-xs min-w-[70px]"
+						title={LANGUAGES[language]}>
+						{Object.entries(LANGUAGES).map(([code, name]) => (
+							<option key={code} value={code}>
+								{name} ({code})
+							</option>
+						))}
+					</select>
+				</div>
+			</div>
+			<div className="mt-4 mb-4">
+				<div>
+					<VSCodeCheckbox
+						style={{ marginBottom: "5px" }}
+						checked={telemetrySetting === "enabled"}
+						onChange={(e: any) => {
+							const checked = e.target.checked === true
+							setTelemetrySetting(checked ? "enabled" : "disabled")
+						}}>
+						{t("settings:footer.telemetry.label")}
+					</VSCodeCheckbox>
+					<p
+						style={{
+							fontSize: "12px",
+							marginTop: "5px",
+							color: "var(--vscode-descriptionForeground)",
+						}}>
+						{t("settings:footer.telemetry.description")}
+					</p>
+				</div>
+			</div>
+			<div className="flex justify-between items-center gap-3">
+				<p>{t("settings:footer.reset.description")}</p>
+				<VSCodeButton
+					onClick={() => vscode.postMessage({ type: "resetState" })}
+					appearance="secondary"
+					className="shrink-0">
+					<span className="codicon codicon-warning text-vscode-errorForeground mr-1" />
+					{t("settings:footer.reset.button")}
+				</VSCodeButton>
 			</div>
 			</div>
 		</div>
 		</div>
-		<div className="flex justify-between items-center gap-3">
-			<p>Reset all global state and secret storage in the extension.</p>
-			<VSCodeButton
-				onClick={() => vscode.postMessage({ type: "resetState" })}
-				appearance="secondary"
-				className="shrink-0">
-				<span className="codicon codicon-warning text-vscode-errorForeground mr-1" />
-				Reset
-			</VSCodeButton>
-		</div>
-	</div>
-)
+	)
+}

+ 38 - 12
webview-ui/src/components/settings/SettingsView.tsx

@@ -1,4 +1,5 @@
 import { forwardRef, memo, useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState } from "react"
 import { forwardRef, memo, useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState } from "react"
+import { useAppTranslation } from "@/i18n/TranslationContext"
 import { Button as VSCodeButton } from "vscrui"
 import { Button as VSCodeButton } from "vscrui"
 import {
 import {
 	CheckCheck,
 	CheckCheck,
@@ -55,6 +56,7 @@ type SettingsViewProps = {
 }
 }
 
 
 const SettingsView = forwardRef<SettingsViewRef, SettingsViewProps>(({ onDone }, ref) => {
 const SettingsView = forwardRef<SettingsViewRef, SettingsViewProps>(({ onDone }, ref) => {
+	const { t } = useAppTranslation()
 	const extensionState = useExtensionState()
 	const extensionState = useExtensionState()
 	const { currentApiConfigName, listApiConfigMeta, uriScheme, version } = extensionState
 	const { currentApiConfigName, listApiConfigMeta, uriScheme, version } = extensionState
 
 
@@ -70,6 +72,7 @@ const SettingsView = forwardRef<SettingsViewRef, SettingsViewProps>(({ onDone },
 	const {
 	const {
 		alwaysAllowReadOnly,
 		alwaysAllowReadOnly,
 		allowedCommands,
 		allowedCommands,
+		language,
 		alwaysAllowBrowser,
 		alwaysAllowBrowser,
 		alwaysAllowExecute,
 		alwaysAllowExecute,
 		alwaysAllowMcp,
 		alwaysAllowMcp,
@@ -173,6 +176,7 @@ const SettingsView = forwardRef<SettingsViewRef, SettingsViewProps>(({ onDone },
 
 
 	const handleSubmit = () => {
 	const handleSubmit = () => {
 		if (isSettingValid) {
 		if (isSettingValid) {
+			vscode.postMessage({ type: "language", text: language })
 			vscode.postMessage({ type: "alwaysAllowReadOnly", bool: alwaysAllowReadOnly })
 			vscode.postMessage({ type: "alwaysAllowReadOnly", bool: alwaysAllowReadOnly })
 			vscode.postMessage({ type: "alwaysAllowWrite", bool: alwaysAllowWrite })
 			vscode.postMessage({ type: "alwaysAllowWrite", bool: alwaysAllowWrite })
 			vscode.postMessage({ type: "alwaysAllowExecute", bool: alwaysAllowExecute })
 			vscode.postMessage({ type: "alwaysAllowExecute", bool: alwaysAllowExecute })
@@ -251,7 +255,16 @@ const SettingsView = forwardRef<SettingsViewRef, SettingsViewProps>(({ onDone },
 			{ id: "advanced", icon: Cog, ref: advancedRef },
 			{ id: "advanced", icon: Cog, ref: advancedRef },
 			{ id: "experimental", icon: FlaskConical, ref: experimentalRef },
 			{ id: "experimental", icon: FlaskConical, ref: experimentalRef },
 		],
 		],
-		[providersRef, autoApproveRef, browserRef, checkpointRef, notificationsRef, advancedRef, experimentalRef],
+		[
+			providersRef,
+			autoApproveRef,
+			browserRef,
+			checkpointRef,
+			notificationsRef,
+			contextRef,
+			advancedRef,
+			experimentalRef,
+		],
 	)
 	)
 
 
 	const handleScroll = useCallback((e: React.UIEvent<HTMLDivElement>) => {
 	const handleScroll = useCallback((e: React.UIEvent<HTMLDivElement>) => {
@@ -286,7 +299,7 @@ const SettingsView = forwardRef<SettingsViewRef, SettingsViewProps>(({ onDone },
 		<Tab>
 		<Tab>
 			<TabHeader className="flex justify-between items-center gap-2">
 			<TabHeader className="flex justify-between items-center gap-2">
 				<div className="flex items-center gap-2">
 				<div className="flex items-center gap-2">
-					<h3 className="text-vscode-foreground m-0">Settings</h3>
+					<h3 className="text-vscode-foreground m-0">{t("settings:header.title")}</h3>
 					<div className="hidden [@media(min-width:400px)]:flex items-center">
 					<div className="hidden [@media(min-width:400px)]:flex items-center">
 						{sections.map(({ id, icon: Icon, ref }) => (
 						{sections.map(({ id, icon: Icon, ref }) => (
 							<Button
 							<Button
@@ -303,16 +316,23 @@ const SettingsView = forwardRef<SettingsViewRef, SettingsViewProps>(({ onDone },
 					<VSCodeButton
 					<VSCodeButton
 						appearance={isSettingValid ? "primary" : "secondary"}
 						appearance={isSettingValid ? "primary" : "secondary"}
 						className={!isSettingValid ? "!border-vscode-errorForeground" : ""}
 						className={!isSettingValid ? "!border-vscode-errorForeground" : ""}
-						title={!isSettingValid ? errorMessage : isChangeDetected ? "Save changes" : "Nothing changed"}
+						title={
+							!isSettingValid
+								? errorMessage
+								: isChangeDetected
+									? t("settings:header.saveButtonTooltip")
+									: t("settings:header.nothingChangedTooltip")
+						}
 						onClick={handleSubmit}
 						onClick={handleSubmit}
-						disabled={!isChangeDetected || !isSettingValid}>
-						Save
+						disabled={!isChangeDetected || !isSettingValid}
+						data-testid="save-button">
+						{t("settings:common.save")}
 					</VSCodeButton>
 					</VSCodeButton>
 					<VSCodeButton
 					<VSCodeButton
 						appearance="secondary"
 						appearance="secondary"
-						title="Discard unsaved changes and close settings panel"
+						title={t("settings:header.doneButtonTooltip")}
 						onClick={() => checkUnsaveChanges(onDone)}>
 						onClick={() => checkUnsaveChanges(onDone)}>
-						Done
+						{t("settings:common.done")}
 					</VSCodeButton>
 					</VSCodeButton>
 				</div>
 				</div>
 			</TabHeader>
 			</TabHeader>
@@ -322,7 +342,7 @@ const SettingsView = forwardRef<SettingsViewRef, SettingsViewProps>(({ onDone },
 					<SectionHeader>
 					<SectionHeader>
 						<div className="flex items-center gap-2">
 						<div className="flex items-center gap-2">
 							<Webhook className="w-4" />
 							<Webhook className="w-4" />
-							<div>Providers</div>
+							<div>{t("settings:sections.providers")}</div>
 						</div>
 						</div>
 					</SectionHeader>
 					</SectionHeader>
 
 
@@ -441,6 +461,8 @@ const SettingsView = forwardRef<SettingsViewRef, SettingsViewProps>(({ onDone },
 					version={version}
 					version={version}
 					telemetrySetting={telemetrySetting}
 					telemetrySetting={telemetrySetting}
 					setTelemetrySetting={setTelemetrySetting}
 					setTelemetrySetting={setTelemetrySetting}
+					language={language || "en"}
+					setCachedStateField={setCachedStateField}
 				/>
 				/>
 			</TabContent>
 			</TabContent>
 
 
@@ -449,14 +471,18 @@ const SettingsView = forwardRef<SettingsViewRef, SettingsViewProps>(({ onDone },
 					<AlertDialogHeader>
 					<AlertDialogHeader>
 						<AlertDialogTitle>
 						<AlertDialogTitle>
 							<AlertTriangle className="w-5 h-5 text-yellow-500" />
 							<AlertTriangle className="w-5 h-5 text-yellow-500" />
-							Unsaved Changes
+							{t("settings:unsavedChangesDialog.title")}
 						</AlertDialogTitle>
 						</AlertDialogTitle>
-						<AlertDialogDescription>Do you want to discard changes and continue?</AlertDialogDescription>
+						<AlertDialogDescription>
+							{t("settings:unsavedChangesDialog.description")}
+						</AlertDialogDescription>
 					</AlertDialogHeader>
 					</AlertDialogHeader>
 					<AlertDialogFooter>
 					<AlertDialogFooter>
-						<AlertDialogCancel onClick={() => onConfirmDialogResult(false)}>Cancel</AlertDialogCancel>
+						<AlertDialogCancel onClick={() => onConfirmDialogResult(false)}>
+							{t("settings:unsavedChangesDialog.cancelButton")}
+						</AlertDialogCancel>
 						<AlertDialogAction onClick={() => onConfirmDialogResult(true)}>
 						<AlertDialogAction onClick={() => onConfirmDialogResult(true)}>
-							Discard changes
+							{t("settings:unsavedChangesDialog.discardButton")}
 						</AlertDialogAction>
 						</AlertDialogAction>
 					</AlertDialogFooter>
 					</AlertDialogFooter>
 				</AlertDialogContent>
 				</AlertDialogContent>

+ 5 - 5
webview-ui/src/components/settings/TemperatureControl.tsx

@@ -1,5 +1,6 @@
 import { VSCodeCheckbox } from "@vscode/webview-ui-toolkit/react"
 import { VSCodeCheckbox } from "@vscode/webview-ui-toolkit/react"
 import { useEffect, useState } from "react"
 import { useEffect, useState } from "react"
+import { useAppTranslation } from "@/i18n/TranslationContext"
 import { useDebounce } from "react-use"
 import { useDebounce } from "react-use"
 
 
 interface TemperatureControlProps {
 interface TemperatureControlProps {
@@ -9,6 +10,7 @@ interface TemperatureControlProps {
 }
 }
 
 
 export const TemperatureControl = ({ value, onChange, maxValue = 1 }: TemperatureControlProps) => {
 export const TemperatureControl = ({ value, onChange, maxValue = 1 }: TemperatureControlProps) => {
+	const { t } = useAppTranslation()
 	const [isCustomTemperature, setIsCustomTemperature] = useState(value !== undefined)
 	const [isCustomTemperature, setIsCustomTemperature] = useState(value !== undefined)
 	const [inputValue, setInputValue] = useState(value)
 	const [inputValue, setInputValue] = useState(value)
 	useDebounce(() => onChange(inputValue), 50, [onChange, inputValue])
 	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
 							setInputValue(value ?? 0) // Use the value from apiConfiguration, if set
 						}
 						}
 					}}>
 					}}>
-					<span className="font-medium">Use custom temperature</span>
+					<span className="font-medium">{t("settings:temperature.useCustom")}</span>
 				</VSCodeCheckbox>
 				</VSCodeCheckbox>
-				<div className="text-sm text-vscode-descriptionForeground">
-					Controls randomness in the model's responses.
-				</div>
+				<div className="text-sm text-vscode-descriptionForeground">{t("settings:temperature.description")}</div>
 			</div>
 			</div>
 
 
 			{isCustomTemperature && (
 			{isCustomTemperature && (
@@ -60,7 +60,7 @@ export const TemperatureControl = ({ value, onChange, maxValue = 1 }: Temperatur
 						<span>{inputValue}</span>
 						<span>{inputValue}</span>
 					</div>
 					</div>
 					<p className="text-vscode-descriptionForeground text-sm mt-1">
 					<p className="text-vscode-descriptionForeground text-sm mt-1">
-						Higher values make output more random, lower values make it more deterministic.
+						{t("settings:temperature.rangeDescription")}
 					</p>
 					</p>
 				</div>
 				</div>
 			)}
 			)}

+ 48 - 29
webview-ui/src/components/settings/__tests__/ApiConfigManager.test.tsx

@@ -3,17 +3,18 @@ import ApiConfigManager from "../ApiConfigManager"
 
 
 // Mock VSCode components
 // Mock VSCode components
 jest.mock("@vscode/webview-ui-toolkit/react", () => ({
 jest.mock("@vscode/webview-ui-toolkit/react", () => ({
-	VSCodeButton: ({ children, onClick, title, disabled }: any) => (
-		<button onClick={onClick} title={title} disabled={disabled}>
+	VSCodeButton: ({ children, onClick, title, disabled, "data-testid": dataTestId }: any) => (
+		<button onClick={onClick} title={title} disabled={disabled} data-testid={dataTestId}>
 			{children}
 			{children}
 		</button>
 		</button>
 	),
 	),
-	VSCodeTextField: ({ value, onInput, placeholder, onKeyDown }: any) => (
+	VSCodeTextField: ({ value, onInput, placeholder, onKeyDown, "data-testid": dataTestId }: any) => (
 		<input
 		<input
 			value={value}
 			value={value}
 			onChange={(e) => onInput(e)}
 			onChange={(e) => onInput(e)}
 			placeholder={placeholder}
 			placeholder={placeholder}
 			onKeyDown={onKeyDown}
 			onKeyDown={onKeyDown}
+			data-testid={dataTestId}
 			ref={undefined} // Explicitly set ref to undefined to avoid warning
 			ref={undefined} // Explicitly set ref to undefined to avoid warning
 		/>
 		/>
 	),
 	),
@@ -44,6 +45,24 @@ jest.mock("@/components/ui/dialog", () => ({
 	DialogTitle: ({ children }: any) => <div data-testid="dialog-title">{children}</div>,
 	DialogTitle: ({ children }: any) => <div data-testid="dialog-title">{children}</div>,
 }))
 }))
 
 
+// Mock UI components
+jest.mock("@/components/ui", () => ({
+	Button: ({ children, onClick, disabled, variant, "data-testid": dataTestId }: any) => (
+		<button onClick={onClick} disabled={disabled} data-testid={dataTestId}>
+			{children}
+		</button>
+	),
+	Input: ({ value, onInput, placeholder, onKeyDown, "data-testid": dataTestId }: any) => (
+		<input
+			value={value}
+			onChange={(e) => onInput(e)}
+			placeholder={placeholder}
+			onKeyDown={onKeyDown}
+			data-testid={dataTestId}
+		/>
+	),
+}))
+
 describe("ApiConfigManager", () => {
 describe("ApiConfigManager", () => {
 	const mockOnSelectConfig = jest.fn()
 	const mockOnSelectConfig = jest.fn()
 	const mockOnDeleteConfig = jest.fn()
 	const mockOnDeleteConfig = jest.fn()
@@ -72,26 +91,26 @@ describe("ApiConfigManager", () => {
 	it("opens new profile dialog when clicking add button", () => {
 	it("opens new profile dialog when clicking add button", () => {
 		render(<ApiConfigManager {...defaultProps} />)
 		render(<ApiConfigManager {...defaultProps} />)
 
 
-		const addButton = screen.getByTitle("Add profile")
+		const addButton = screen.getByTestId("add-profile-button")
 		fireEvent.click(addButton)
 		fireEvent.click(addButton)
 
 
 		expect(screen.getByTestId("dialog")).toBeVisible()
 		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", () => {
 	it("creates new profile with entered name", () => {
 		render(<ApiConfigManager {...defaultProps} />)
 		render(<ApiConfigManager {...defaultProps} />)
 
 
 		// Open dialog
 		// Open dialog
-		const addButton = screen.getByTitle("Add profile")
+		const addButton = screen.getByTestId("add-profile-button")
 		fireEvent.click(addButton)
 		fireEvent.click(addButton)
 
 
 		// Enter new profile name
 		// 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" } })
 		fireEvent.input(input, { target: { value: "New Profile" } })
 
 
 		// Click create button
 		// Click create button
-		const createButton = screen.getByText("Create Profile")
+		const createButton = screen.getByText("settings:providers.createProfile")
 		fireEvent.click(createButton)
 		fireEvent.click(createButton)
 
 
 		expect(mockOnUpsertConfig).toHaveBeenCalledWith("New Profile")
 		expect(mockOnUpsertConfig).toHaveBeenCalledWith("New Profile")
@@ -101,21 +120,21 @@ describe("ApiConfigManager", () => {
 		render(<ApiConfigManager {...defaultProps} />)
 		render(<ApiConfigManager {...defaultProps} />)
 
 
 		// Open dialog
 		// Open dialog
-		const addButton = screen.getByTitle("Add profile")
+		const addButton = screen.getByTestId("add-profile-button")
 		fireEvent.click(addButton)
 		fireEvent.click(addButton)
 
 
 		// Enter existing profile name
 		// 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" } })
 		fireEvent.input(input, { target: { value: "Default Config" } })
 
 
 		// Click create button to trigger validation
 		// Click create button to trigger validation
-		const createButton = screen.getByText("Create Profile")
+		const createButton = screen.getByText("settings:providers.createProfile")
 		fireEvent.click(createButton)
 		fireEvent.click(createButton)
 
 
 		// Verify error message
 		// Verify error message
 		const dialogContent = getDialogContent()
 		const dialogContent = getDialogContent()
 		const errorMessage = within(dialogContent).getByTestId("error-message")
 		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()
 		expect(mockOnUpsertConfig).not.toHaveBeenCalled()
 	})
 	})
 
 
@@ -123,15 +142,15 @@ describe("ApiConfigManager", () => {
 		render(<ApiConfigManager {...defaultProps} />)
 		render(<ApiConfigManager {...defaultProps} />)
 
 
 		// Open dialog
 		// Open dialog
-		const addButton = screen.getByTitle("Add profile")
+		const addButton = screen.getByTestId("add-profile-button")
 		fireEvent.click(addButton)
 		fireEvent.click(addButton)
 
 
 		// Enter empty name
 		// Enter empty name
-		const input = screen.getByPlaceholderText("Enter profile name")
+		const input = screen.getByTestId("new-profile-input")
 		fireEvent.input(input, { target: { value: "   " } })
 		fireEvent.input(input, { target: { value: "   " } })
 
 
 		// Verify create button is disabled
 		// Verify create button is disabled
-		const createButton = screen.getByText("Create Profile")
+		const createButton = screen.getByText("settings:providers.createProfile")
 		expect(createButton).toBeDisabled()
 		expect(createButton).toBeDisabled()
 		expect(mockOnUpsertConfig).not.toHaveBeenCalled()
 		expect(mockOnUpsertConfig).not.toHaveBeenCalled()
 	})
 	})
@@ -140,7 +159,7 @@ describe("ApiConfigManager", () => {
 		render(<ApiConfigManager {...defaultProps} />)
 		render(<ApiConfigManager {...defaultProps} />)
 
 
 		// Start rename
 		// Start rename
-		const renameButton = screen.getByTitle("Rename profile")
+		const renameButton = screen.getByTestId("rename-profile-button")
 		fireEvent.click(renameButton)
 		fireEvent.click(renameButton)
 
 
 		// Find input and enter new name
 		// Find input and enter new name
@@ -148,7 +167,7 @@ describe("ApiConfigManager", () => {
 		fireEvent.input(input, { target: { value: "New Name" } })
 		fireEvent.input(input, { target: { value: "New Name" } })
 
 
 		// Save
 		// Save
-		const saveButton = screen.getByTitle("Save")
+		const saveButton = screen.getByTestId("save-rename-button")
 		fireEvent.click(saveButton)
 		fireEvent.click(saveButton)
 
 
 		expect(mockOnRenameConfig).toHaveBeenCalledWith("Default Config", "New Name")
 		expect(mockOnRenameConfig).toHaveBeenCalledWith("Default Config", "New Name")
@@ -158,7 +177,7 @@ describe("ApiConfigManager", () => {
 		render(<ApiConfigManager {...defaultProps} />)
 		render(<ApiConfigManager {...defaultProps} />)
 
 
 		// Start rename
 		// Start rename
-		const renameButton = screen.getByTitle("Rename profile")
+		const renameButton = screen.getByTestId("rename-profile-button")
 		fireEvent.click(renameButton)
 		fireEvent.click(renameButton)
 
 
 		// Find input and enter existing name
 		// Find input and enter existing name
@@ -166,13 +185,13 @@ describe("ApiConfigManager", () => {
 		fireEvent.input(input, { target: { value: "Another Config" } })
 		fireEvent.input(input, { target: { value: "Another Config" } })
 
 
 		// Save to trigger validation
 		// Save to trigger validation
-		const saveButton = screen.getByTitle("Save")
+		const saveButton = screen.getByTestId("save-rename-button")
 		fireEvent.click(saveButton)
 		fireEvent.click(saveButton)
 
 
 		// Verify error message
 		// Verify error message
 		const renameForm = getRenameForm()
 		const renameForm = getRenameForm()
 		const errorMessage = within(renameForm).getByTestId("error-message")
 		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()
 		expect(mockOnRenameConfig).not.toHaveBeenCalled()
 	})
 	})
 
 
@@ -180,7 +199,7 @@ describe("ApiConfigManager", () => {
 		render(<ApiConfigManager {...defaultProps} />)
 		render(<ApiConfigManager {...defaultProps} />)
 
 
 		// Start rename
 		// Start rename
-		const renameButton = screen.getByTitle("Rename profile")
+		const renameButton = screen.getByTestId("rename-profile-button")
 		fireEvent.click(renameButton)
 		fireEvent.click(renameButton)
 
 
 		// Find input and enter empty name
 		// Find input and enter empty name
@@ -188,7 +207,7 @@ describe("ApiConfigManager", () => {
 		fireEvent.input(input, { target: { value: "   " } })
 		fireEvent.input(input, { target: { value: "   " } })
 
 
 		// Verify save button is disabled
 		// Verify save button is disabled
-		const saveButton = screen.getByTitle("Save")
+		const saveButton = screen.getByTestId("save-rename-button")
 		expect(saveButton).toBeDisabled()
 		expect(saveButton).toBeDisabled()
 		expect(mockOnRenameConfig).not.toHaveBeenCalled()
 		expect(mockOnRenameConfig).not.toHaveBeenCalled()
 	})
 	})
@@ -205,7 +224,7 @@ describe("ApiConfigManager", () => {
 	it("allows deleting the current config when not the only one", () => {
 	it("allows deleting the current config when not the only one", () => {
 		render(<ApiConfigManager {...defaultProps} />)
 		render(<ApiConfigManager {...defaultProps} />)
 
 
-		const deleteButton = screen.getByTitle("Delete profile")
+		const deleteButton = screen.getByTestId("delete-profile-button")
 		expect(deleteButton).not.toBeDisabled()
 		expect(deleteButton).not.toBeDisabled()
 
 
 		fireEvent.click(deleteButton)
 		fireEvent.click(deleteButton)
@@ -215,7 +234,7 @@ describe("ApiConfigManager", () => {
 	it("disables delete button when only one config exists", () => {
 	it("disables delete button when only one config exists", () => {
 		render(<ApiConfigManager {...defaultProps} listApiConfigMeta={[{ id: "default", name: "Default Config" }]} />)
 		render(<ApiConfigManager {...defaultProps} listApiConfigMeta={[{ id: "default", name: "Default Config" }]} />)
 
 
-		const deleteButton = screen.getByTitle("Cannot delete the only profile")
+		const deleteButton = screen.getByTestId("delete-profile-button")
 		expect(deleteButton).toHaveAttribute("disabled")
 		expect(deleteButton).toHaveAttribute("disabled")
 	})
 	})
 
 
@@ -223,7 +242,7 @@ describe("ApiConfigManager", () => {
 		render(<ApiConfigManager {...defaultProps} />)
 		render(<ApiConfigManager {...defaultProps} />)
 
 
 		// Start rename
 		// Start rename
-		const renameButton = screen.getByTitle("Rename profile")
+		const renameButton = screen.getByTestId("rename-profile-button")
 		fireEvent.click(renameButton)
 		fireEvent.click(renameButton)
 
 
 		// Find input and enter new name
 		// Find input and enter new name
@@ -231,7 +250,7 @@ describe("ApiConfigManager", () => {
 		fireEvent.input(input, { target: { value: "New Name" } })
 		fireEvent.input(input, { target: { value: "New Name" } })
 
 
 		// Cancel
 		// Cancel
-		const cancelButton = screen.getByTitle("Cancel")
+		const cancelButton = screen.getByTestId("cancel-rename-button")
 		fireEvent.click(cancelButton)
 		fireEvent.click(cancelButton)
 
 
 		// Verify rename was not called
 		// Verify rename was not called
@@ -245,10 +264,10 @@ describe("ApiConfigManager", () => {
 		render(<ApiConfigManager {...defaultProps} />)
 		render(<ApiConfigManager {...defaultProps} />)
 
 
 		// Open dialog
 		// Open dialog
-		const addButton = screen.getByTitle("Add profile")
+		const addButton = screen.getByTestId("add-profile-button")
 		fireEvent.click(addButton)
 		fireEvent.click(addButton)
 
 
-		const input = screen.getByPlaceholderText("Enter profile name")
+		const input = screen.getByTestId("new-profile-input")
 
 
 		// Test Enter key
 		// Test Enter key
 		fireEvent.input(input, { target: { value: "New Profile" } })
 		fireEvent.input(input, { target: { value: "New Profile" } })
@@ -264,7 +283,7 @@ describe("ApiConfigManager", () => {
 		render(<ApiConfigManager {...defaultProps} />)
 		render(<ApiConfigManager {...defaultProps} />)
 
 
 		// Start rename
 		// Start rename
-		const renameButton = screen.getByTitle("Rename profile")
+		const renameButton = screen.getByTestId("rename-profile-button")
 		fireEvent.click(renameButton)
 		fireEvent.click(renameButton)
 
 
 		const input = screen.getByDisplayValue("Default Config")
 		const input = screen.getByDisplayValue("Default Config")

+ 11 - 7
webview-ui/src/components/settings/__tests__/ContextManagementSettings.test.tsx

@@ -18,19 +18,23 @@ describe("ContextManagementSettings", () => {
 		render(<ContextManagementSettings {...defaultProps} />)
 		render(<ContextManagementSettings {...defaultProps} />)
 
 
 		// Terminal output limit
 		// 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
 		// 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
 		// 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
 		// 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()
 		expect(screen.getByTestId("show-rooignored-files-checkbox")).not.toBeChecked()
 	})
 	})
 
 

+ 39 - 51
webview-ui/src/components/settings/__tests__/SettingsView.test.tsx

@@ -40,33 +40,39 @@ jest.mock("../ApiConfigManager", () => ({
 
 
 // Mock VSCode components
 // Mock VSCode components
 jest.mock("@vscode/webview-ui-toolkit/react", () => ({
 jest.mock("@vscode/webview-ui-toolkit/react", () => ({
-	VSCodeButton: ({ children, onClick, appearance }: any) =>
+	VSCodeButton: ({ children, onClick, appearance, "data-testid": dataTestId }: any) =>
 		appearance === "icon" ? (
 		appearance === "icon" ? (
-			<button onClick={onClick} className="codicon codicon-close" aria-label="Remove command">
+			<button
+				onClick={onClick}
+				className="codicon codicon-close"
+				aria-label="Remove command"
+				data-testid={dataTestId}>
 				<span className="codicon codicon-close" />
 				<span className="codicon codicon-close" />
 			</button>
 			</button>
 		) : (
 		) : (
-			<button onClick={onClick} data-appearance={appearance}>
+			<button onClick={onClick} data-appearance={appearance} data-testid={dataTestId}>
 				{children}
 				{children}
 			</button>
 			</button>
 		),
 		),
-	VSCodeCheckbox: ({ children, onChange, checked }: any) => (
+	VSCodeCheckbox: ({ children, onChange, checked, "data-testid": dataTestId }: any) => (
 		<label>
 		<label>
 			<input
 			<input
 				type="checkbox"
 				type="checkbox"
 				checked={checked}
 				checked={checked}
 				onChange={(e) => onChange({ target: { checked: e.target.checked } })}
 				onChange={(e) => onChange({ target: { checked: e.target.checked } })}
 				aria-label={typeof children === "string" ? children : undefined}
 				aria-label={typeof children === "string" ? children : undefined}
+				data-testid={dataTestId}
 			/>
 			/>
 			{children}
 			{children}
 		</label>
 		</label>
 	),
 	),
-	VSCodeTextField: ({ value, onInput, placeholder }: any) => (
+	VSCodeTextField: ({ value, onInput, placeholder, "data-testid": dataTestId }: any) => (
 		<input
 		<input
 			type="text"
 			type="text"
 			value={value}
 			value={value}
 			onChange={(e) => onInput({ target: { value: e.target.value } })}
 			onChange={(e) => onInput({ target: { value: e.target.value } })}
 			placeholder={placeholder}
 			placeholder={placeholder}
+			data-testid={dataTestId}
 		/>
 		/>
 	),
 	),
 	VSCodeTextArea: () => <textarea />,
 	VSCodeTextArea: () => <textarea />,
@@ -81,13 +87,14 @@ jest.mock("@vscode/webview-ui-toolkit/react", () => ({
 		<input type="radio" value={value} checked={checked} onChange={onChange} />
 		<input type="radio" value={value} checked={checked} onChange={onChange} />
 	),
 	),
 	VSCodeRadioGroup: ({ children, value, onChange }: any) => <div onChange={onChange}>{children}</div>,
 	VSCodeRadioGroup: ({ children, value, onChange }: any) => <div onChange={onChange}>{children}</div>,
-	VSCodeSlider: ({ value, onChange }: any) => (
+	VSCodeSlider: ({ value, onChange, "data-testid": dataTestId }: any) => (
 		<input
 		<input
 			type="range"
 			type="range"
 			value={value}
 			value={value}
 			onChange={(e) => onChange({ target: { value: Number(e.target.value) } })}
 			onChange={(e) => onChange({ target: { value: Number(e.target.value) } })}
 			min={0}
 			min={0}
 			max={1}
 			max={1}
+			data-testid={dataTestId}
 			step={0.01}
 			step={0.01}
 			style={{ flexGrow: 1, height: "2px" }}
 			style={{ flexGrow: 1, height: "2px" }}
 		/>
 		/>
@@ -135,28 +142,24 @@ describe("SettingsView - Sound Settings", () => {
 	it("initializes with sound disabled by default", () => {
 	it("initializes with sound disabled by default", () => {
 		renderSettingsView()
 		renderSettingsView()
 
 
-		const soundCheckbox = screen.getByRole("checkbox", {
-			name: /Enable sound effects/i,
-		})
+		const soundCheckbox = screen.getByTestId("sound-enabled-checkbox")
 		expect(soundCheckbox).not.toBeChecked()
 		expect(soundCheckbox).not.toBeChecked()
 
 
 		// Volume slider should not be visible when sound is disabled
 		// Volume slider should not be visible when sound is disabled
-		expect(screen.queryByRole("slider", { name: /volume/i })).not.toBeInTheDocument()
+		expect(screen.queryByTestId("sound-volume-slider")).not.toBeInTheDocument()
 	})
 	})
 
 
 	it("toggles sound setting and sends message to VSCode", () => {
 	it("toggles sound setting and sends message to VSCode", () => {
 		renderSettingsView()
 		renderSettingsView()
 
 
-		const soundCheckbox = screen.getByRole("checkbox", {
-			name: /Enable sound effects/i,
-		})
+		const soundCheckbox = screen.getByTestId("sound-enabled-checkbox")
 
 
 		// Enable sound
 		// Enable sound
 		fireEvent.click(soundCheckbox)
 		fireEvent.click(soundCheckbox)
 		expect(soundCheckbox).toBeChecked()
 		expect(soundCheckbox).toBeChecked()
 
 
 		// Click Save to save settings
 		// Click Save to save settings
-		const saveButton = screen.getByText("Save")
+		const saveButton = screen.getByTestId("save-button")
 		fireEvent.click(saveButton)
 		fireEvent.click(saveButton)
 
 
 		expect(vscode.postMessage).toHaveBeenCalledWith(
 		expect(vscode.postMessage).toHaveBeenCalledWith(
@@ -171,13 +174,11 @@ describe("SettingsView - Sound Settings", () => {
 		renderSettingsView()
 		renderSettingsView()
 
 
 		// Enable sound
 		// Enable sound
-		const soundCheckbox = screen.getByRole("checkbox", {
-			name: /Enable sound effects/i,
-		})
+		const soundCheckbox = screen.getByTestId("sound-enabled-checkbox")
 		fireEvent.click(soundCheckbox)
 		fireEvent.click(soundCheckbox)
 
 
 		// Volume slider should be visible
 		// Volume slider should be visible
-		const volumeSlider = screen.getByRole("slider", { name: /volume/i })
+		const volumeSlider = screen.getByTestId("sound-volume-slider")
 		expect(volumeSlider).toBeInTheDocument()
 		expect(volumeSlider).toBeInTheDocument()
 		expect(volumeSlider).toHaveValue("0.5")
 		expect(volumeSlider).toHaveValue("0.5")
 	})
 	})
@@ -186,17 +187,15 @@ describe("SettingsView - Sound Settings", () => {
 		renderSettingsView()
 		renderSettingsView()
 
 
 		// Enable sound
 		// Enable sound
-		const soundCheckbox = screen.getByRole("checkbox", {
-			name: /Enable sound effects/i,
-		})
+		const soundCheckbox = screen.getByTestId("sound-enabled-checkbox")
 		fireEvent.click(soundCheckbox)
 		fireEvent.click(soundCheckbox)
 
 
 		// Change volume
 		// Change volume
-		const volumeSlider = screen.getByRole("slider", { name: /volume/i })
+		const volumeSlider = screen.getByTestId("sound-volume-slider")
 		fireEvent.change(volumeSlider, { target: { value: "0.75" } })
 		fireEvent.change(volumeSlider, { target: { value: "0.75" } })
 
 
 		// Click Save to save settings
 		// Click Save to save settings
-		const saveButton = screen.getByText("Save")
+		const saveButton = screen.getByTestId("save-button")
 		fireEvent.click(saveButton)
 		fireEvent.click(saveButton)
 
 
 		// Verify message sent to VSCode
 		// Verify message sent to VSCode
@@ -228,30 +227,25 @@ describe("SettingsView - Allowed Commands", () => {
 		renderSettingsView()
 		renderSettingsView()
 
 
 		// Enable always allow execute
 		// Enable always allow execute
-		const executeCheckbox = screen.getByRole("checkbox", {
-			name: /Always approve allowed execute operations/i,
-		})
+		const executeCheckbox = screen.getByTestId("always-allow-execute-checkbox")
 		fireEvent.click(executeCheckbox)
 		fireEvent.click(executeCheckbox)
-
 		// Verify allowed commands section appears
 		// Verify allowed commands section appears
-		expect(screen.getByText(/Allowed Auto-Execute Commands/i)).toBeInTheDocument()
-		expect(screen.getByPlaceholderText(/Enter command prefix/i)).toBeInTheDocument()
+		expect(screen.getByTestId("allowed-commands-heading")).toBeInTheDocument()
+		expect(screen.getByTestId("command-input")).toBeInTheDocument()
 	})
 	})
 
 
 	it("adds new command to the list", () => {
 	it("adds new command to the list", () => {
 		renderSettingsView()
 		renderSettingsView()
 
 
 		// Enable always allow execute
 		// Enable always allow execute
-		const executeCheckbox = screen.getByRole("checkbox", {
-			name: /Always approve allowed execute operations/i,
-		})
+		const executeCheckbox = screen.getByTestId("always-allow-execute-checkbox")
 		fireEvent.click(executeCheckbox)
 		fireEvent.click(executeCheckbox)
 
 
 		// Add a new command
 		// Add a new command
-		const input = screen.getByPlaceholderText(/Enter command prefix/i)
+		const input = screen.getByTestId("command-input")
 		fireEvent.change(input, { target: { value: "npm test" } })
 		fireEvent.change(input, { target: { value: "npm test" } })
 
 
-		const addButton = screen.getByText("Add")
+		const addButton = screen.getByTestId("add-command-button")
 		fireEvent.click(addButton)
 		fireEvent.click(addButton)
 
 
 		// Verify command was added
 		// Verify command was added
@@ -268,19 +262,17 @@ describe("SettingsView - Allowed Commands", () => {
 		renderSettingsView()
 		renderSettingsView()
 
 
 		// Enable always allow execute
 		// Enable always allow execute
-		const executeCheckbox = screen.getByRole("checkbox", {
-			name: /Always approve allowed execute operations/i,
-		})
+		const executeCheckbox = screen.getByTestId("always-allow-execute-checkbox")
 		fireEvent.click(executeCheckbox)
 		fireEvent.click(executeCheckbox)
 
 
 		// Add a command
 		// Add a command
-		const input = screen.getByPlaceholderText(/Enter command prefix/i)
+		const input = screen.getByTestId("command-input")
 		fireEvent.change(input, { target: { value: "npm test" } })
 		fireEvent.change(input, { target: { value: "npm test" } })
-		const addButton = screen.getByText("Add")
+		const addButton = screen.getByTestId("add-command-button")
 		fireEvent.click(addButton)
 		fireEvent.click(addButton)
 
 
 		// Remove the command
 		// Remove the command
-		const removeButton = screen.getByRole("button", { name: "Remove command" })
+		const removeButton = screen.getByTestId("remove-command-0")
 		fireEvent.click(removeButton)
 		fireEvent.click(removeButton)
 
 
 		// Verify command was removed
 		// Verify command was removed
@@ -297,14 +289,12 @@ describe("SettingsView - Allowed Commands", () => {
 		renderSettingsView()
 		renderSettingsView()
 
 
 		// Enable always allow execute
 		// Enable always allow execute
-		const executeCheckbox = screen.getByRole("checkbox", {
-			name: /Always approve allowed execute operations/i,
-		})
+		const executeCheckbox = screen.getByTestId("always-allow-execute-checkbox")
 		fireEvent.click(executeCheckbox)
 		fireEvent.click(executeCheckbox)
 
 
 		// Add a command twice
 		// Add a command twice
-		const input = screen.getByPlaceholderText(/Enter command prefix/i)
-		const addButton = screen.getByText("Add")
+		const input = screen.getByTestId("command-input")
+		const addButton = screen.getByTestId("add-command-button")
 
 
 		// First addition
 		// First addition
 		fireEvent.change(input, { target: { value: "npm test" } })
 		fireEvent.change(input, { target: { value: "npm test" } })
@@ -323,19 +313,17 @@ describe("SettingsView - Allowed Commands", () => {
 		renderSettingsView()
 		renderSettingsView()
 
 
 		// Enable always allow execute
 		// Enable always allow execute
-		const executeCheckbox = screen.getByRole("checkbox", {
-			name: /Always approve allowed execute operations/i,
-		})
+		const executeCheckbox = screen.getByTestId("always-allow-execute-checkbox")
 		fireEvent.click(executeCheckbox)
 		fireEvent.click(executeCheckbox)
 
 
 		// Add a command
 		// Add a command
-		const input = screen.getByPlaceholderText(/Enter command prefix/i)
+		const input = screen.getByTestId("command-input")
 		fireEvent.change(input, { target: { value: "npm test" } })
 		fireEvent.change(input, { target: { value: "npm test" } })
-		const addButton = screen.getByText("Add")
+		const addButton = screen.getByTestId("add-command-button")
 		fireEvent.click(addButton)
 		fireEvent.click(addButton)
 
 
 		// Click Save
 		// Click Save
-		const saveButton = screen.getByText("Save")
+		const saveButton = screen.getByTestId("save-button")
 		fireEvent.click(saveButton)
 		fireEvent.click(saveButton)
 
 
 		// Verify VSCode messages were sent
 		// Verify VSCode messages were sent

+ 52 - 57
webview-ui/src/i18n/__mocks__/TranslationContext.tsx

@@ -1,63 +1,58 @@
-import React from "react"
-
-// Create a mock for the useAppTranslation hook
-export const useAppTranslation = () => {
-	return {
-		t: (key: string, options?: Record<string, any>) => {
-			const translations: Record<string, string> = {
-				// History translations
-				"history:recentTasks": "Recent Tasks",
-				"history:viewAll": "View All",
-				"history:history": "History",
-				"history:done": "Done",
-				"history:searchPlaceholder": "Fuzzy search history...",
-				"history:newest": "Newest",
-				"history:oldest": "Oldest",
-				"history:mostExpensive": "Most Expensive",
-				"history:mostTokens": "Most Tokens",
-				"history:mostRelevant": "Most Relevant",
-				"history:deleteTaskTitle": "Delete Task (Shift + Click to skip confirmation)",
-				"history:tokensLabel": "Tokens:",
-				"history:cacheLabel": "Cache:",
-				"history:apiCostLabel": "API Cost:",
-				"history:copyPrompt": "Copy Prompt",
-				"history:exportTask": "Export Task",
-				"history:deleteTask": "Delete Task",
-				"history:deleteTaskMessage": "Are you sure you want to delete this task? This action cannot be undone.",
-				"history:cancel": "Cancel",
-				"history:delete": "Delete",
-			}
-
-			// Handle interpolation
-			if (options && key === "history:tokens") {
-				return `Tokens: ↑${options.in} ↓${options.out}`
-			}
-
-			if (options && key === "history:cache") {
-				return `Cache: +${options.writes} → ${options.reads}`
-			}
-
-			if (options && key === "history:apiCost") {
-				return `API Cost: $${options.cost}`
-			}
-
-			return translations[key] || key
-		},
-		i18n: {
-			language: "en",
-			changeLanguage: jest.fn(),
-		},
+import React, { createContext, useContext, ReactNode } from "react"
+
+// Mock translation function that returns English text for settings or the key itself
+const mockTranslate = (key: string, options?: Record<string, any>): string => {
+	// Convert the key back to approximate English text for test purposes
+	if (key.startsWith("settings.")) {
+		// For specific keys the tests are looking for
+		if (key === "settings.notifications.sound.label") return "Enable sound effects"
+		if (key === "settings.autoApprove.execute.label") return "Always approve allowed execute operations"
+		if (key === "settings.autoApprove.execute.allowedCommands") return "Allowed Auto-Execute Commands"
+		if (key === "settings.autoApprove.execute.commandPlaceholder") return "Enter command prefix"
+		if (key === "settings.autoApprove.execute.addButton") return "Add"
+		if (key === "settings.common.save") return "Save"
+		if (key === "settings.contextManagement.terminal.label") return "Terminal output limit"
+		if (key === "settings.header.title") return "Settings"
+
+		// Default handling of other keys
+		return key.split(".").pop() || key
+	}
+
+	// For keys that contain variables
+	if (options) {
+		let result = key
+		Object.entries(options).forEach(([varName, value]) => {
+			result = result.replace(`{${varName}}`, String(value))
+		})
+		return result
 	}
 	}
-}
 
 
-export const withTranslation = (Component: React.ComponentType<any>) => {
-	return (props: any) => <Component {...props} />
+	return key
 }
 }
 
 
-// Mock provider component
-export const AppTranslationProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => {
-	return <>{children}</>
+// Create mock context
+export const TranslationContext = createContext<{
+	t: (key: string, options?: Record<string, any>) => string
+	i18n: any
+}>({
+	t: mockTranslate,
+	i18n: {},
+})
+
+// Mock translation provider component
+export const TranslationProvider: React.FC<{ children: ReactNode }> = ({ children }) => {
+	return (
+		<TranslationContext.Provider
+			value={{
+				t: mockTranslate,
+				i18n: {},
+			}}>
+			{children}
+		</TranslationContext.Provider>
+	)
 }
 }
 
 
-const TranslationContext = { AppTranslationProvider, useAppTranslation, withTranslation }
-export default TranslationContext
+// Custom hook for translations
+export const useAppTranslation = () => useContext(TranslationContext)
+
+export default TranslationProvider

+ 0 - 0
webview-ui/src/i18n/locales/ar/.gitkeep


+ 0 - 113
webview-ui/src/i18n/locales/ar/chat.json

@@ -1,113 +0,0 @@
-{
-	"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 لسحب الملفات/الصور",
-	"enhancePromptDescription": "يساعد زر 'تحسين المطالبة' على تحسين طلبك من خلال توفير سياق إضافي أو توضيحات أو إعادة صياغة. جرب كتابة طلب هنا وانقر على الزر مرة أخرى لمعرفة كيفية عمله.",
-	"errorReadingFile": "خطأ في قراءة الملف:",
-	"noValidImages": "لم تتم معالجة أي صور صالحة",
-	"separator": "فاصل",
-	"edit": "تعديل...",
-	"forNextMode": "للوضع التالي",
-	"autoApprove": {
-		"title": "الموافقة التلقائية:",
-		"none": "لا شيء",
-		"description": "الموافقة التلقائية تسمح لـ Roo Code بتنفيذ الإجراءات دون طلب إذن. قم بتمكينها فقط للإجراءات التي تثق بها تمامًا.",
-		"actions": {
-			"readFiles": {
-				"label": "قراءة الملفات والمجلدات",
-				"shortName": "قراءة",
-				"description": "يسمح بالوصول لقراءة أي ملف على جهاز الكمبيوتر الخاص بك."
-			},
-			"editFiles": {
-				"label": "تعديل الملفات",
-				"shortName": "تعديل",
-				"description": "يسمح بتعديل أي ملفات على جهاز الكمبيوتر الخاص بك."
-			},
-			"executeCommands": {
-				"label": "تنفيذ الأوامر المعتمدة",
-				"shortName": "أوامر",
-				"description": "يسمح بتنفيذ أوامر الطرفية المعتمدة. يمكنك تكوين ذلك في لوحة الإعدادات."
-			},
-			"useBrowser": {
-				"label": "استخدام المتصفح",
-				"shortName": "متصفح",
-				"description": "يسمح بالقدرة على تشغيل والتفاعل مع أي موقع ويب في متصفح بدون واجهة."
-			},
-			"useMcp": {
-				"label": "استخدام خوادم MCP",
-				"shortName": "MCP",
-				"description": "يسمح باستخدام خوادم MCP المكونة التي قد تعدل نظام الملفات أو تتفاعل مع واجهات برمجة التطبيقات."
-			},
-			"switchModes": {
-				"label": "تبديل الأوضاع",
-				"shortName": "أوضاع",
-				"description": "يسمح بالتبديل التلقائي بين الأوضاع المختلفة دون الحاجة إلى موافقة."
-			},
-			"subtasks": {
-				"label": "إنشاء وإكمال المهام الفرعية",
-				"shortName": "مهام فرعية",
-				"description": "يسمح بإنشاء وإكمال المهام الفرعية دون الحاجة إلى موافقة."
-			},
-			"retryRequests": {
-				"label": "إعادة محاولة الطلبات الفاشلة",
-				"shortName": "إعادة المحاولات",
-				"description": "إعادة محاولة طلبات API الفاشلة تلقائيًا عندما يُرجع المزود استجابة خطأ."
-			}
-		}
-	}
-}

+ 0 - 8
webview-ui/src/i18n/locales/ar/common.json

@@ -1,8 +0,0 @@
-{
-	"title": "ساعد في تحسين Roo Code",
-	"anonymousTelemetry": "إرسال بيانات الاستخدام والأخطاء المجهولة للمساعدة في إصلاح الأخطاء وتحسين الامتداد. لا يتم إرسال أي كود أو نصوص أو معلومات شخصية.",
-	"changeSettings": "يمكنك دائمًا تغيير هذا في أسفل الإعدادات",
-	"settings": "الإعدادات",
-	"allow": "السماح",
-	"deny": "رفض"
-}

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

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

+ 0 - 52
webview-ui/src/i18n/locales/ar/mcp.json

@@ -1,52 +0,0 @@
-{
-	"title": "خوادم MCP",
-	"done": "تم",
-	"description": "يتيح <0>بروتوكول سياق النموذج (Model Context Protocol)</0> الاتصال بخوادم MCP المحلية التي توفر أدوات وموارد إضافية لتوسيع قدرات Roo. يمكنك استخدام <1>الخوادم التي أنشأها المجتمع</1> أو مطالبة Roo بإنشاء أدوات جديدة مخصصة لسير عملك (مثل \"إضافة أداة تحصل على أحدث وثائق npm\").",
-	"enableToggle": {
-		"title": "تمكين خوادم MCP",
-		"description": "عند التمكين، سيتمكن Roo من التفاعل مع خوادم MCP للحصول على وظائف متقدمة. إذا كنت لا تستخدم MCP، يمكنك تعطيل هذا لتقليل استخدام token بواسطة Roo."
-	},
-	"enableServerCreation": {
-		"title": "تمكين إنشاء خادم MCP",
-		"description": "عند التمكين، يمكن لـ Roo مساعدتك في إنشاء خوادم MCP جديدة عبر أوامر مثل \"إضافة أداة جديدة إلى...\". إذا كنت لا تحتاج إلى إنشاء خوادم MCP، يمكنك تعطيل هذا لتقليل استخدام token بواسطة Roo."
-	},
-	"editGlobalMCP": "تعديل MCP العام",
-	"editProjectMCP": "تعديل MCP المشروع",
-	"tool": {
-		"alwaysAllow": "السماح دائمًا",
-		"parameters": "المعلمات",
-		"noDescription": "لا يوجد وصف"
-	},
-	"tabs": {
-		"tools": "الأدوات",
-		"resources": "الموارد"
-	},
-	"emptyState": {
-		"noTools": "لم يتم العثور على أدوات",
-		"noResources": "لم يتم العثور على موارد"
-	},
-	"networkTimeout": {
-		"label": "مهلة الشبكة",
-		"description": "الحد الأقصى لوقت الانتظار لاستجابات الخادم",
-		"options": {
-			"15seconds": "15 ثانية",
-			"30seconds": "30 ثانية",
-			"1minute": "1 دقيقة",
-			"5minutes": "5 دقائق",
-			"10minutes": "10 دقائق",
-			"15minutes": "15 دقيقة",
-			"30minutes": "30 دقيقة",
-			"60minutes": "60 دقيقة"
-		}
-	},
-	"deleteDialog": {
-		"title": "حذف خادم MCP",
-		"description": "هل أنت متأكد أنك تريد حذف خادم MCP \"{{serverName}}\"؟ لا يمكن التراجع عن هذا الإجراء.",
-		"cancel": "إلغاء",
-		"delete": "حذف"
-	},
-	"serverStatus": {
-		"retrying": "إعادة المحاولة...",
-		"retryConnection": "إعادة محاولة الاتصال"
-	}
-}

+ 0 - 140
webview-ui/src/i18n/locales/ar/prompts.json

@@ -1,140 +0,0 @@
-{
-	"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": "جميع الملفات"
-}

+ 0 - 6
webview-ui/src/i18n/locales/ar/welcome.json

@@ -1,6 +0,0 @@
-{
-	"greeting": "مرحبًا، أنا رو!",
-	"introduction": "يمكنني القيام بجميع أنواع المهام بفضل أحدث التطورات في قدرات الترميز الذكية والوصول إلى الأدوات التي تتيح لي إنشاء وتحرير الملفات واستكشاف المشاريع المعقدة واستخدام المتصفح وتنفيذ أوامر الطرفية (بإذنك، بالطبع). يمكنني حتى استخدام MCP لإنشاء أدوات جديدة وتوسيع قدراتي الخاصة.",
-	"notice": "للبدء، يحتاج هذا الامتداد إلى موفر API.",
-	"start": "لنبدأ!"
-}

+ 1 - 8
webview-ui/src/i18n/locales/ca/common.json

@@ -1,8 +1 @@
-{
-	"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"
-}
+{}

+ 8 - 1
webview-ui/src/i18n/locales/ca/prompts.json

@@ -18,7 +18,14 @@
 		"builtInModesText": "Les eines per a modes integrats no es poden modificar",
 		"builtInModesText": "Les eines per a modes integrats no es poden modificar",
 		"editTools": "Editar eines",
 		"editTools": "Editar eines",
 		"doneEditing": "Finalitzar edició",
 		"doneEditing": "Finalitzar edició",
-		"allowedFiles": "Fitxers permesos:"
+		"allowedFiles": "Fitxers permesos:",
+		"toolNames": {
+			"read": "Llegir fitxers",
+			"edit": "Editar fitxers",
+			"browser": "Utilitzar navegador",
+			"command": "Executar comandes",
+			"mcp": "Utilitzar MCP"
+		}
 	},
 	},
 	"roleDefinition": {
 	"roleDefinition": {
 		"title": "Definició de rol",
 		"title": "Definició de rol",

+ 228 - 0
webview-ui/src/i18n/locales/ca/settings.json

@@ -0,0 +1,228 @@
+{
+	"common": {
+		"save": "Desar",
+		"done": "Fet",
+		"cancel": "Cancel·lar",
+		"reset": "Restablir"
+	},
+	"header": {
+		"title": "Configuració",
+		"saveButtonTooltip": "Desar canvis",
+		"nothingChangedTooltip": "No s'ha canviat res",
+		"doneButtonTooltip": "Descartar els canvis no desats i tancar el panell de configuració"
+	},
+	"unsavedChangesDialog": {
+		"title": "Canvis no desats",
+		"description": "Voleu descartar els canvis i continuar?",
+		"cancelButton": "Cancel·lar",
+		"discardButton": "Descartar canvis"
+	},
+	"sections": {
+		"providers": "Proveïdors",
+		"autoApprove": "Aprovació automàtica",
+		"browser": "Navegador / Ús de l'ordinador",
+		"checkpoints": "Punts de control",
+		"notifications": "Notificacions",
+		"contextManagement": "Gestió de context",
+		"advanced": "Avançat",
+		"experimental": "Funcions experimentals"
+	},
+	"autoApprove": {
+		"description": "Permet que Roo realitzi operacions automàticament sense requerir aprovació. Activeu aquesta configuració només si confieu plenament en la IA i enteneu els riscos de seguretat associats.",
+		"readOnly": {
+			"label": "Aprovar sempre operacions de només lectura",
+			"description": "Quan està activat, Roo veurà automàticament el contingut del directori i llegirà fitxers sense que calgui fer clic al botó Aprovar."
+		},
+		"write": {
+			"label": "Aprovar sempre operacions d'escriptura",
+			"description": "Crear i editar fitxers automàticament sense requerir aprovació",
+			"delayLabel": "Retard després d'escriptura per permetre que els diagnòstics detectin possibles problemes"
+		},
+		"browser": {
+			"label": "Aprovar sempre accions del navegador",
+			"description": "Realitzar accions del navegador automàticament sense requerir aprovació",
+			"note": "Nota: Només s'aplica quan el model admet l'ús de l'ordinador"
+		},
+		"retry": {
+			"label": "Tornar a intentar sempre sol·licituds d'API fallides",
+			"description": "Tornar a intentar sol·licituds d'API fallides automàticament quan el servidor retorna una resposta d'error",
+			"delayLabel": "Retard abans de tornar a intentar la sol·licitud"
+		},
+		"mcp": {
+			"label": "Aprovar sempre eines MCP",
+			"description": "Habilitar l'aprovació automàtica d'eines MCP individuals a la vista de Servidors MCP (requereix tant aquesta configuració com la casella \"Permetre sempre\" de l'eina)"
+		},
+		"modeSwitch": {
+			"label": "Aprovar sempre canvis de mode",
+			"description": "Canviar automàticament entre diferents modes sense requerir aprovació"
+		},
+		"subtasks": {
+			"label": "Aprovar sempre creació i finalització de subtasques",
+			"description": "Permetre la creació i finalització de subtasques sense requerir aprovació"
+		},
+		"execute": {
+			"label": "Aprovar sempre operacions d'execució permeses",
+			"description": "Executar automàticament comandes de terminal permeses sense requerir aprovació",
+			"allowedCommands": "Comandes d'auto-execució permeses",
+			"allowedCommandsDescription": "Prefixos de comandes que poden ser executats automàticament quan \"Aprovar sempre operacions d'execució\" està habilitat. Afegeix * per permetre totes les comandes (usar amb precaució).",
+			"commandPlaceholder": "Introduïu prefix de comanda (ex. 'git ')",
+			"addButton": "Afegir"
+		}
+	},
+	"providers": {
+		"configProfile": "Perfil de configuració",
+		"description": "Descripció",
+		"apiProvider": "Proveïdor d'API",
+		"openRouterApiKey": "Clau API d'OpenRouter",
+		"apiKeyStorageNotice": "Les claus API s'emmagatzemen de forma segura a l'Emmagatzematge Secret de VSCode",
+		"useCustomBaseUrl": "Utilitzar URL base personalitzada",
+		"openRouterTransformsText": "Comprimir prompts i cadenes de missatges a la mida del context (<a>Transformacions d'OpenRouter</a>)"
+	},
+	"browser": {
+		"enable": {
+			"label": "Habilitar eina de navegador",
+			"description": "Quan està habilitat, Roo pot utilitzar un navegador per interactuar amb llocs web quan s'utilitzen models que admeten l'ús de l'ordinador."
+		},
+		"viewport": {
+			"label": "Mida del viewport",
+			"description": "Seleccioneu la mida del viewport per a interaccions del navegador. Això afecta com es mostren i interactuen els llocs web.",
+			"options": {
+				"largeDesktop": "Escriptori gran (1280x800)",
+				"smallDesktop": "Escriptori petit (900x600)",
+				"tablet": "Tauleta (768x1024)",
+				"mobile": "Mòbil (360x640)"
+			}
+		},
+		"screenshotQuality": {
+			"label": "Qualitat de captures de pantalla",
+			"description": "Ajusteu la qualitat WebP de les captures de pantalla del navegador. Valors més alts proporcionen captures més clares però augmenten l'ús de token."
+		},
+		"remote": {
+			"label": "Utilitzar connexió remota del navegador",
+			"description": "Connectar a un navegador Chrome que s'executa amb depuració remota habilitada (--remote-debugging-port=9222).",
+			"urlPlaceholder": "URL personalitzada (ex. http://localhost:9222)",
+			"testButton": "Provar connexió",
+			"testingButton": "Provant...",
+			"instructions": "Introduïu l'adreça d'amfitrió del protocol DevTools o deixeu-la buida per descobrir automàticament instàncies locals de Chrome. El botó Provar Connexió provarà la URL personalitzada si es proporciona, o descobrirà automàticament si el camp està buit."
+		}
+	},
+	"checkpoints": {
+		"enable": {
+			"label": "Habilitar punts de control automàtics",
+			"description": "Quan està habilitat, Roo crearà automàticament punts de control durant l'execució de tasques, facilitant la revisió de canvis o la reversió a estats anteriors."
+		}
+	},
+	"notifications": {
+		"sound": {
+			"label": "Habilitar efectes de so",
+			"description": "Quan està habilitat, Roo reproduirà efectes de so per a notificacions i esdeveniments.",
+			"volumeLabel": "Volum"
+		}
+	},
+	"contextManagement": {
+		"description": "Controleu quina informació s'inclou a la finestra de context de la IA, afectant l'ús de token i la qualitat de resposta",
+		"terminal": {
+			"label": "Límit de sortida de terminal",
+			"description": "Nombre màxim de línies a incloure a la sortida del terminal en executar comandes. Quan s'excedeix, s'eliminaran línies del mig, estalviant token."
+		},
+		"openTabs": {
+			"label": "Límit de context de pestanyes obertes",
+			"description": "Nombre màxim de pestanyes obertes de VSCode a incloure al context. Valors més alts proporcionen més context però augmenten l'ús de token."
+		},
+		"workspaceFiles": {
+			"label": "Límit de context de fitxers de l'espai de treball",
+			"description": "Nombre màxim de fitxers a incloure als detalls del directori de treball actual. Valors més alts proporcionen més context però augmenten l'ús de token."
+		},
+		"rooignore": {
+			"label": "Mostrar fitxers .rooignore en llistes i cerques",
+			"description": "Quan està habilitat, els fitxers que coincideixen amb els patrons a .rooignore es mostraran en llistes amb un símbol de cadenat. Quan està deshabilitat, aquests fitxers s'ocultaran completament de les llistes de fitxers i cerques."
+		}
+	},
+	"advanced": {
+		"rateLimit": {
+			"label": "Límit de freqüència",
+			"description": "Temps mínim entre sol·licituds d'API."
+		},
+		"diff": {
+			"label": "Habilitar edició mitjançant diffs",
+			"description": "Quan està habilitat, Roo podrà editar fitxers més ràpidament i rebutjarà automàticament escriptures completes de fitxers truncats. Funciona millor amb l'últim model Claude 3.7 Sonnet.",
+			"strategy": {
+				"label": "Estratègia de diff",
+				"options": {
+					"standard": "Estàndard (Bloc únic)",
+					"multiBlock": "Experimental: Diff multi-bloc",
+					"unified": "Experimental: Diff unificat"
+				},
+				"descriptions": {
+					"standard": "L'estratègia de diff estàndard aplica canvis a un sol bloc de codi alhora.",
+					"unified": "L'estratègia de diff unificat pren múltiples enfocaments per aplicar diffs i tria el millor enfocament.",
+					"multiBlock": "L'estratègia de diff multi-bloc permet actualitzar múltiples blocs de codi en un fitxer en una sola sol·licitud."
+				}
+			},
+			"matchPrecision": {
+				"label": "Precisió de coincidència",
+				"description": "Aquest control lliscant controla amb quina precisió han de coincidir les seccions de codi en aplicar diffs. Valors més baixos permeten coincidències més flexibles però augmenten el risc de reemplaçaments incorrectes. Utilitzeu valors per sota del 100% amb extrema precaució."
+			}
+		}
+	},
+	"experimental": {
+		"warning": "⚠️",
+		"DIFF_STRATEGY": {
+			"name": "Utilitzar estratègia diff unificada experimental",
+			"description": "Activar l'estratègia diff unificada experimental. Aquesta estratègia podria reduir el nombre de reintents causats per errors del model, però pot causar comportaments inesperats o edicions incorrectes. Activeu-la només si enteneu els riscos i esteu disposats a revisar acuradament tots els canvis."
+		},
+		"SEARCH_AND_REPLACE": {
+			"name": "Utilitzar eina de cerca i reemplaçament experimental",
+			"description": "Activar l'eina de cerca i reemplaçament experimental, permetent a Roo reemplaçar múltiples instàncies d'un terme de cerca en una sola petició."
+		},
+		"INSERT_BLOCK": {
+			"name": "Utilitzar eina d'inserció de contingut experimental",
+			"description": "Activar l'eina d'inserció de contingut experimental, permetent a Roo inserir contingut a números de línia específics sense necessitat de crear un diff."
+		},
+		"POWER_STEERING": {
+			"name": "Utilitzar mode \"direcció assistida\" experimental",
+			"description": "Quan està activat, Roo recordarà al model els detalls de la seva definició de mode actual amb més freqüència. Això portarà a una adherència més forta a les definicions de rol i instruccions personalitzades, però utilitzarà més tokens per missatge."
+		},
+		"MULTI_SEARCH_AND_REPLACE": {
+			"name": "Utilitzar eina diff de blocs múltiples experimental",
+			"description": "Quan està activat, Roo utilitzarà l'eina diff de blocs múltiples. Això intentarà actualitzar múltiples blocs de codi a l'arxiu en una sola petició."
+		}
+	},
+	"temperature": {
+		"useCustom": "Utilitzar temperatura personalitzada",
+		"description": "Controla l'aleatorietat en les respostes del model.",
+		"rangeDescription": "Valors més alts fan que la sortida sigui més aleatòria, valors més baixos la fan més determinista."
+	},
+	"modelInfo": {
+		"supportsImages": "Suporta imatges",
+		"noImages": "No suporta imatges",
+		"supportsComputerUse": "Suporta ús de l'ordinador",
+		"noComputerUse": "No suporta ús de l'ordinador",
+		"supportsPromptCache": "Suporta emmagatzematge en caché de prompts",
+		"noPromptCache": "No suporta emmagatzematge en caché de prompts",
+		"maxOutput": "Sortida màxima",
+		"inputPrice": "Preu d'entrada",
+		"outputPrice": "Preu de sortida",
+		"cacheReadsPrice": "Preu de lectures de caché",
+		"cacheWritesPrice": "Preu d'escriptures de caché",
+		"gemini": {
+			"freeRequests": "* Gratuït fins a {{count}} sol·licituds per minut. Després d'això, la facturació depèn de la mida del prompt.",
+			"pricingDetails": "Per a més informació, consulteu els detalls de preus."
+		}
+	},
+	"modelPicker": {
+		"automaticFetch": "L'extensió obté automàticament la llista més recent de models disponibles a <serviceLink>{{serviceName}}</serviceLink>. Si no esteu segur de quin model triar, Roo Code funciona millor amb <defaultModelLink>{{defaultModelId}}</defaultModelLink>. També podeu cercar \"free\" per a opcions gratuïtes actualment disponibles."
+	},
+	"footer": {
+		"feedback": "Si teniu qualsevol pregunta o comentari, no dubteu a obrir un issue a <githubLink>github.com/RooVetGit/Roo-Code</githubLink> o unir-vos a <redditLink>reddit.com/r/RooCode</redditLink> o <discordLink>discord.gg/roocode</discordLink>",
+		"version": "Roo Code v{{version}}",
+		"telemetry": {
+			"label": "Permetre informes anònims d'errors i ús",
+			"description": "Ajudeu a millorar Roo Code enviant dades d'ús anònimes i informes d'errors. Mai s'envia codi, prompts o informació personal. Vegeu la nostra política de privacitat per a més detalls."
+		},
+		"reset": {
+			"description": "Restablir tot l'estat global i emmagatzematge secret a l'extensió.",
+			"button": "Restablir"
+		}
+	}
+}

+ 9 - 1
webview-ui/src/i18n/locales/ca/welcome.json

@@ -2,5 +2,13 @@
 	"greeting": "Hola, sóc en Roo!",
 	"greeting": "Hola, sóc en Roo!",
 	"introduction": "Puc fer tot tipus de tasques gràcies als últims avenços en capacitats de codificació agent i accés a eines que em permeten crear i editar fitxers, explorar projectes complexos, utilitzar el navegador i executar ordres de terminal (amb el teu permís, és clar). Fins i tot puc utilitzar MCP per crear noves eines i ampliar les meves pròpies capacitats.",
 	"introduction": "Puc fer tot tipus de tasques gràcies als últims avenços en capacitats de codificació agent i accés a eines que em permeten crear i editar fitxers, explorar projectes complexos, utilitzar el navegador i executar ordres de terminal (amb el teu permís, és clar). Fins i tot puc utilitzar MCP per crear noves eines i ampliar les meves pròpies capacitats.",
 	"notice": "Per començar, aquesta extensió necessita un proveïdor d'API.",
 	"notice": "Per començar, aquesta extensió necessita un proveïdor d'API.",
-	"start": "Som-hi!"
+	"start": "Som-hi!",
+	"telemetry": {
+		"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"
+	}
 }
 }

+ 0 - 0
webview-ui/src/i18n/locales/cs/.gitkeep


+ 0 - 113
webview-ui/src/i18n/locales/cs/chat.json

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

+ 0 - 8
webview-ui/src/i18n/locales/cs/common.json

@@ -1,8 +0,0 @@
-{
-	"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"
-}

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

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

+ 0 - 52
webview-ui/src/i18n/locales/cs/mcp.json

@@ -1,52 +0,0 @@
-{
-	"title": "MCP Servery",
-	"done": "Hotovo",
-	"description": "<0>Model Context Protocol</0> umožňuje komunikaci s lokálně běžícími MCP servery, které poskytují další nástroje a zdroje k rozšíření schopností Roo. Můžete používat <1>servery vytvořené komunitou</1> nebo požádat Roo o vytvoření nových nástrojů specifických pro váš pracovní postup (např. \"přidat nástroj, který získává nejnovější npm dokumentaci\").",
-	"enableToggle": {
-		"title": "Povolit MCP servery",
-		"description": "Když je povoleno, Roo bude moci komunikovat s MCP servery pro pokročilé funkce. Pokud MCP nepoužíváte, můžete tuto funkci zakázat a snížit spotřebu tokenů Roo."
-	},
-	"enableServerCreation": {
-		"title": "Povolit vytváření MCP serverů",
-		"description": "Když je povoleno, Roo vám může pomoci vytvářet nové MCP servery pomocí příkazů jako \"přidat nový nástroj pro...\". Pokud nepotřebujete vytvářet MCP servery, můžete tuto funkci zakázat a snížit spotřebu tokenů Roo."
-	},
-	"editGlobalMCP": "Upravit globální MCP",
-	"editProjectMCP": "Upravit projektové MCP",
-	"tool": {
-		"alwaysAllow": "Vždy povolit",
-		"parameters": "Parametry",
-		"noDescription": "Bez popisu"
-	},
-	"tabs": {
-		"tools": "Nástroje",
-		"resources": "Zdroje"
-	},
-	"emptyState": {
-		"noTools": "Nebyly nalezeny žádné nástroje",
-		"noResources": "Nebyly nalezeny žádné zdroje"
-	},
-	"networkTimeout": {
-		"label": "Časový limit sítě",
-		"description": "Maximální doba čekání na odpovědi serveru",
-		"options": {
-			"15seconds": "15 sekund",
-			"30seconds": "30 sekund",
-			"1minute": "1 minuta",
-			"5minutes": "5 minut",
-			"10minutes": "10 minut",
-			"15minutes": "15 minut",
-			"30minutes": "30 minut",
-			"60minutes": "60 minut"
-		}
-	},
-	"deleteDialog": {
-		"title": "Smazat MCP server",
-		"description": "Opravdu chcete smazat MCP server \"{{serverName}}\"? Tuto akci nelze vrátit zpět.",
-		"cancel": "Zrušit",
-		"delete": "Smazat"
-	},
-	"serverStatus": {
-		"retrying": "Opakování...",
-		"retryConnection": "Zkusit připojení znovu"
-	}
-}

+ 0 - 140
webview-ui/src/i18n/locales/cs/prompts.json

@@ -1,140 +0,0 @@
-{
-	"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"
-}

+ 0 - 6
webview-ui/src/i18n/locales/cs/welcome.json

@@ -1,6 +0,0 @@
-{
-	"greeting": "Ahoj, já jsem Roo!",
-	"introduction": "Díky nejnovějším průlomům v agentních kódovacích schopnostech a přístupu k nástrojům, které mi umožňují vytvářet a upravovat soubory, prozkoumávat složité projekty, používat prohlížeč a spouštět terminálové příkazy (s vaším svolením, samozřejmě), mohu dělat všechny druhy úkolů. Dokonce mohu použít MCP k vytváření nových nástrojů a rozšiřování svých vlastních schopností.",
-	"notice": "Pro začátek toto rozšíření potřebuje poskytovatele API.",
-	"start": "Jdeme na to!"
-}

+ 1 - 8
webview-ui/src/i18n/locales/de/common.json

@@ -1,8 +1 @@
-{
-	"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"
-}
+{}

+ 8 - 1
webview-ui/src/i18n/locales/de/prompts.json

@@ -18,7 +18,14 @@
 		"builtInModesText": "Werkzeuge für eingebaute Modi können nicht geändert werden",
 		"builtInModesText": "Werkzeuge für eingebaute Modi können nicht geändert werden",
 		"editTools": "Werkzeuge bearbeiten",
 		"editTools": "Werkzeuge bearbeiten",
 		"doneEditing": "Bearbeitung abschließen",
 		"doneEditing": "Bearbeitung abschließen",
-		"allowedFiles": "Erlaubte Dateien:"
+		"allowedFiles": "Erlaubte Dateien:",
+		"toolNames": {
+			"read": "Dateien lesen",
+			"edit": "Dateien bearbeiten",
+			"browser": "Browser verwenden",
+			"command": "Befehle ausführen",
+			"mcp": "MCP verwenden"
+		}
 	},
 	},
 	"roleDefinition": {
 	"roleDefinition": {
 		"title": "Rollendefinition",
 		"title": "Rollendefinition",

+ 228 - 0
webview-ui/src/i18n/locales/de/settings.json

@@ -0,0 +1,228 @@
+{
+	"common": {
+		"save": "Speichern",
+		"done": "Fertig",
+		"cancel": "Abbrechen",
+		"reset": "Zurücksetzen"
+	},
+	"header": {
+		"title": "Einstellungen",
+		"saveButtonTooltip": "Änderungen speichern",
+		"nothingChangedTooltip": "Nichts geändert",
+		"doneButtonTooltip": "Ungespeicherte Änderungen verwerfen und Einstellungsbereich schließen"
+	},
+	"unsavedChangesDialog": {
+		"title": "Ungespeicherte Änderungen",
+		"description": "Möchten Sie die Änderungen verwerfen und fortfahren?",
+		"cancelButton": "Abbrechen",
+		"discardButton": "Änderungen verwerfen"
+	},
+	"sections": {
+		"providers": "Anbieter",
+		"autoApprove": "Automatische Genehmigung",
+		"browser": "Browser / Computer-Nutzung",
+		"checkpoints": "Kontrollpunkte",
+		"notifications": "Benachrichtigungen",
+		"contextManagement": "Kontext-Management",
+		"advanced": "Erweitert",
+		"experimental": "Experimentelle Funktionen"
+	},
+	"autoApprove": {
+		"description": "Erlaubt Roo, Operationen automatisch ohne Genehmigung durchzuführen. Aktivieren Sie diese Einstellungen nur, wenn Sie der KI vollständig vertrauen und die damit verbundenen Sicherheitsrisiken verstehen.",
+		"readOnly": {
+			"label": "Schreibgeschützte Operationen immer genehmigen",
+			"description": "Wenn aktiviert, wird Roo automatisch Verzeichnisinhalte anzeigen und Dateien lesen, ohne dass Sie auf die Genehmigen-Schaltfläche klicken müssen."
+		},
+		"write": {
+			"label": "Schreiboperationen immer genehmigen",
+			"description": "Dateien automatisch erstellen und bearbeiten ohne Genehmigung",
+			"delayLabel": "Verzögerung nach Schreibvorgängen, damit Diagnosefunktionen potenzielle Probleme erkennen können"
+		},
+		"browser": {
+			"label": "Browser-Aktionen immer genehmigen",
+			"description": "Browser-Aktionen automatisch ohne Genehmigung durchführen",
+			"note": "Hinweis: Gilt nur, wenn das Modell Computer-Nutzung unterstützt"
+		},
+		"retry": {
+			"label": "Fehlgeschlagene API-Anfragen immer wiederholen",
+			"description": "Fehlgeschlagene API-Anfragen automatisch wiederholen, wenn der Server eine Fehlerantwort zurückgibt",
+			"delayLabel": "Verzögerung vor dem Wiederholen der Anfrage"
+		},
+		"mcp": {
+			"label": "MCP-Tools immer genehmigen",
+			"description": "Automatische Genehmigung einzelner MCP-Tools in der MCP-Server-Ansicht aktivieren (erfordert sowohl diese Einstellung als auch das 'Immer erlauben'-Kontrollkästchen des Tools)"
+		},
+		"modeSwitch": {
+			"label": "Moduswechsel immer genehmigen",
+			"description": "Automatisch zwischen verschiedenen Modi wechseln ohne Genehmigung"
+		},
+		"subtasks": {
+			"label": "Erstellung & Abschluss von Unteraufgaben immer genehmigen",
+			"description": "Erstellung und Abschluss von Unteraufgaben ohne Genehmigung erlauben"
+		},
+		"execute": {
+			"label": "Erlaubte Ausführungsoperationen immer genehmigen",
+			"description": "Erlaubte Terminal-Befehle automatisch ohne Genehmigung ausführen",
+			"allowedCommands": "Erlaubte Auto-Ausführungsbefehle",
+			"allowedCommandsDescription": "Befehlspräfixe, die automatisch ausgeführt werden können, wenn 'Ausführungsoperationen immer genehmigen' aktiviert ist. Fügen Sie * hinzu, um alle Befehle zu erlauben (mit Vorsicht verwenden).",
+			"commandPlaceholder": "Befehlspräfix eingeben (z.B. 'git ')",
+			"addButton": "Hinzufügen"
+		}
+	},
+	"providers": {
+		"configProfile": "Konfigurationsprofil",
+		"description": "Beschreibung",
+		"apiProvider": "API-Anbieter",
+		"openRouterApiKey": "OpenRouter API-Schlüssel",
+		"apiKeyStorageNotice": "API-Schlüssel werden sicher im VSCode Secret Storage gespeichert",
+		"useCustomBaseUrl": "Benutzerdefinierte Basis-URL verwenden",
+		"openRouterTransformsText": "Prompts und Nachrichtenketten auf Kontextgröße komprimieren (<a>OpenRouter Transformationen</a>)"
+	},
+	"browser": {
+		"enable": {
+			"label": "Browser-Tool aktivieren",
+			"description": "Wenn aktiviert, kann Roo einen Browser verwenden, um mit Websites zu interagieren, wenn Modelle verwendet werden, die Computer-Nutzung unterstützen."
+		},
+		"viewport": {
+			"label": "Viewport-Größe",
+			"description": "Wählen Sie die Viewport-Größe für Browser-Interaktionen. Dies beeinflusst, wie Websites angezeigt und mit ihnen interagiert wird.",
+			"options": {
+				"largeDesktop": "Großer Desktop (1280x800)",
+				"smallDesktop": "Kleiner Desktop (900x600)",
+				"tablet": "Tablet (768x1024)",
+				"mobile": "Mobil (360x640)"
+			}
+		},
+		"screenshotQuality": {
+			"label": "Screenshot-Qualität",
+			"description": "Passen Sie die WebP-Qualität von Browser-Screenshots an. Höhere Werte bieten klarere Screenshots, erhöhen aber den Token-Verbrauch."
+		},
+		"remote": {
+			"label": "Remote-Browser-Verbindung verwenden",
+			"description": "Verbindung zu einem Chrome-Browser herstellen, der mit aktiviertem Remote-Debugging läuft (--remote-debugging-port=9222).",
+			"urlPlaceholder": "Benutzerdefinierte URL (z.B. http://localhost:9222)",
+			"testButton": "Verbindung testen",
+			"testingButton": "Teste...",
+			"instructions": "Geben Sie die DevTools-Protokoll-Host-Adresse ein oder lassen Sie das Feld leer, um Chrome lokale Instanzen automatisch zu erkennen. Die Schaltfläche 'Verbindung testen' versucht die benutzerdefinierte URL, wenn angegeben, oder erkennt automatisch, wenn das Feld leer ist."
+		}
+	},
+	"checkpoints": {
+		"enable": {
+			"label": "Automatische Kontrollpunkte aktivieren",
+			"description": "Wenn aktiviert, erstellt Roo automatisch Kontrollpunkte während der Aufgabenausführung, was die Überprüfung von Änderungen oder die Rückkehr zu früheren Zuständen erleichtert."
+		}
+	},
+	"notifications": {
+		"sound": {
+			"label": "Soundeffekte aktivieren",
+			"description": "Wenn aktiviert, spielt Roo Soundeffekte für Benachrichtigungen und Ereignisse ab.",
+			"volumeLabel": "Lautstärke"
+		}
+	},
+	"contextManagement": {
+		"description": "Steuern Sie, welche Informationen im KI-Kontextfenster enthalten sind, was den Token-Verbrauch und die Antwortqualität beeinflusst",
+		"terminal": {
+			"label": "Terminal-Ausgabelimit",
+			"description": "Maximale Anzahl von Zeilen, die in der Terminal-Ausgabe bei der Ausführung von Befehlen enthalten sein sollen. Bei Überschreitung werden Zeilen aus der Mitte entfernt, wodurch Token gespart werden."
+		},
+		"openTabs": {
+			"label": "Geöffnete Tabs Kontextlimit",
+			"description": "Maximale Anzahl von geöffneten VSCode-Tabs, die im Kontext enthalten sein sollen. Höhere Werte bieten mehr Kontext, erhöhen aber den Token-Verbrauch."
+		},
+		"workspaceFiles": {
+			"label": "Workspace-Dateien Kontextlimit",
+			"description": "Maximale Anzahl von Dateien, die in den Details des aktuellen Arbeitsverzeichnisses enthalten sein sollen. Höhere Werte bieten mehr Kontext, erhöhen aber den Token-Verbrauch."
+		},
+		"rooignore": {
+			"label": ".rooignore-Dateien in Listen und Suchen anzeigen",
+			"description": "Wenn aktiviert, werden Dateien, die mit Mustern in .rooignore übereinstimmen, in Listen mit einem Schlosssymbol angezeigt. Wenn deaktiviert, werden diese Dateien vollständig aus Dateilisten und Suchen ausgeblendet."
+		}
+	},
+	"advanced": {
+		"rateLimit": {
+			"label": "Ratenbegrenzung",
+			"description": "Minimale Zeit zwischen API-Anfragen."
+		},
+		"diff": {
+			"label": "Bearbeitung durch Diffs aktivieren",
+			"description": "Wenn aktiviert, kann Roo Dateien schneller bearbeiten und lehnt automatisch gekürzte vollständige Dateischreibvorgänge ab. Funktioniert am besten mit dem neuesten Claude 3.7 Sonnet-Modell.",
+			"strategy": {
+				"label": "Diff-Strategie",
+				"options": {
+					"standard": "Standard (Einzelner Block)",
+					"multiBlock": "Experimentell: Multi-Block-Diff",
+					"unified": "Experimentell: Vereinheitlichter Diff"
+				},
+				"descriptions": {
+					"standard": "Die Standard-Diff-Strategie wendet Änderungen auf einen einzelnen Codeblock gleichzeitig an.",
+					"unified": "Die vereinheitlichte Diff-Strategie verwendet mehrere Ansätze zum Anwenden von Diffs und wählt den besten Ansatz aus.",
+					"multiBlock": "Die Multi-Block-Diff-Strategie ermöglicht die Aktualisierung mehrerer Codeblöcke in einer Datei in einer Anfrage."
+				}
+			},
+			"matchPrecision": {
+				"label": "Übereinstimmungsgenauigkeit",
+				"description": "Dieser Schieberegler steuert, wie genau Codeabschnitte beim Anwenden von Diffs übereinstimmen müssen. Niedrigere Werte ermöglichen flexiblere Übereinstimmungen, erhöhen aber das Risiko falscher Ersetzungen. Verwenden Sie Werte unter 100% mit äußerster Vorsicht."
+			}
+		}
+	},
+	"experimental": {
+		"warning": "⚠️",
+		"DIFF_STRATEGY": {
+			"name": "Experimentelle einheitliche Diff-Strategie verwenden",
+			"description": "Aktiviert die experimentelle einheitliche Diff-Strategie. Diese Strategie könnte die Anzahl der durch Modellfehler verursachten Wiederholungen reduzieren, kann aber unerwartetes Verhalten oder falsche Bearbeitungen verursachen. Nur aktivieren, wenn Sie die Risiken verstehen und bereit sind, alle Änderungen sorgfältig zu überprüfen."
+		},
+		"SEARCH_AND_REPLACE": {
+			"name": "Experimentelles Such- und Ersetzungswerkzeug verwenden",
+			"description": "Aktiviert das experimentelle Such- und Ersetzungswerkzeug, das Roo ermöglicht, mehrere Instanzen eines Suchbegriffs in einer Anfrage zu ersetzen."
+		},
+		"INSERT_BLOCK": {
+			"name": "Experimentelles Inhalts-Einfüge-Werkzeug verwenden",
+			"description": "Aktiviert das experimentelle Inhalts-Einfüge-Werkzeug, das Roo ermöglicht, Inhalte an bestimmten Zeilennummern einzufügen, ohne einen Diff erstellen zu müssen."
+		},
+		"POWER_STEERING": {
+			"name": "Experimentellen \"Servolenkung\"-Modus verwenden",
+			"description": "Wenn aktiviert, wird Roo das Modell häufiger an die Details seiner aktuellen Modusdefinition erinnern. Dies führt zu einer stärkeren Einhaltung von Rollendefinitionen und benutzerdefinierten Anweisungen, verwendet aber mehr Tokens pro Nachricht."
+		},
+		"MULTI_SEARCH_AND_REPLACE": {
+			"name": "Experimentelles Multi-Block-Diff-Werkzeug verwenden",
+			"description": "Wenn aktiviert, verwendet Roo das Multi-Block-Diff-Werkzeug. Dies versucht, mehrere Codeblöcke in der Datei in einer Anfrage zu aktualisieren."
+		}
+	},
+	"temperature": {
+		"useCustom": "Benutzerdefinierte Temperatur verwenden",
+		"description": "Steuert die Zufälligkeit in den Antworten des Modells.",
+		"rangeDescription": "Höhere Werte machen die Ausgabe zufälliger, niedrigere Werte machen sie deterministischer."
+	},
+	"modelInfo": {
+		"supportsImages": "Unterstützt Bilder",
+		"noImages": "Unterstützt keine Bilder",
+		"supportsComputerUse": "Unterstützt Computer-Nutzung",
+		"noComputerUse": "Unterstützt keine Computer-Nutzung",
+		"supportsPromptCache": "Unterstützt Prompt-Caching",
+		"noPromptCache": "Unterstützt kein Prompt-Caching",
+		"maxOutput": "Maximale Ausgabe",
+		"inputPrice": "Eingabepreis",
+		"outputPrice": "Ausgabepreis",
+		"cacheReadsPrice": "Cache-Lesepreis",
+		"cacheWritesPrice": "Cache-Schreibpreis",
+		"gemini": {
+			"freeRequests": "* Kostenlos bis zu {{count}} Anfragen pro Minute. Danach hängt die Abrechnung von der Prompt-Größe ab.",
+			"pricingDetails": "Weitere Informationen finden Sie in den Preisdetails."
+		}
+	},
+	"modelPicker": {
+		"automaticFetch": "Die Erweiterung ruft automatisch die neueste Liste der verfügbaren Modelle von <serviceLink>{{serviceName}}</serviceLink> ab. Wenn Sie sich nicht sicher sind, welches Modell Sie wählen sollen, funktioniert Roo Code am besten mit <defaultModelLink>{{defaultModelId}}</defaultModelLink>. Sie können auch nach \"free\" suchen, um derzeit verfügbare kostenlose Optionen zu finden."
+	},
+	"footer": {
+		"feedback": "Wenn Sie Fragen oder Feedback haben, können Sie gerne ein Issue auf <githubLink>github.com/RooVetGit/Roo-Code</githubLink> öffnen oder <redditLink>reddit.com/r/RooCode</redditLink> oder <discordLink>discord.gg/roocode</discordLink> beitreten",
+		"version": "Roo Code v{{version}}",
+		"telemetry": {
+			"label": "Anonyme Fehler- und Nutzungsberichte zulassen",
+			"description": "Helfen Sie, Roo Code zu verbessern, indem Sie anonyme Nutzungsdaten und Fehlerberichte senden. Es werden niemals Code, Prompts oder persönliche Informationen gesendet. Weitere Details finden Sie in unserer Datenschutzrichtlinie."
+		},
+		"reset": {
+			"description": "Setzen Sie alle globalen Zustände und geheimen Speicher in der Erweiterung zurück.",
+			"button": "Zurücksetzen"
+		}
+	}
+}

+ 9 - 1
webview-ui/src/i18n/locales/de/welcome.json

@@ -2,5 +2,13 @@
 	"greeting": "Hallo, ich bin Roo!",
 	"greeting": "Hallo, ich bin Roo!",
 	"introduction": "Ich kann alle Arten von Aufgaben erledigen, dank der neuesten Durchbrüche in agentenbasierten Codierungsfähigkeiten und dem Zugang zu Tools, die es mir ermöglichen, Dateien zu erstellen und zu bearbeiten, komplexe Projekte zu erkunden, den Browser zu verwenden und Terminalbefehle auszuführen (natürlich mit Ihrer Erlaubnis). Ich kann sogar MCP verwenden, um neue Tools zu erstellen und meine eigenen Fähigkeiten zu erweitern.",
 	"introduction": "Ich kann alle Arten von Aufgaben erledigen, dank der neuesten Durchbrüche in agentenbasierten Codierungsfähigkeiten und dem Zugang zu Tools, die es mir ermöglichen, Dateien zu erstellen und zu bearbeiten, komplexe Projekte zu erkunden, den Browser zu verwenden und Terminalbefehle auszuführen (natürlich mit Ihrer Erlaubnis). Ich kann sogar MCP verwenden, um neue Tools zu erstellen und meine eigenen Fähigkeiten zu erweitern.",
 	"notice": "Um loszulegen, benötigt diese Erweiterung einen API-Anbieter.",
 	"notice": "Um loszulegen, benötigt diese Erweiterung einen API-Anbieter.",
-	"start": "Los geht's!"
+	"start": "Los geht's!",
+	"telemetry": {
+		"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"
+	}
 }
 }

+ 1 - 8
webview-ui/src/i18n/locales/en/common.json

@@ -1,8 +1 @@
-{
-	"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"
-}
+{}

+ 8 - 1
webview-ui/src/i18n/locales/en/prompts.json

@@ -18,7 +18,14 @@
 		"builtInModesText": "Tools for built-in modes cannot be modified",
 		"builtInModesText": "Tools for built-in modes cannot be modified",
 		"editTools": "Edit tools",
 		"editTools": "Edit tools",
 		"doneEditing": "Done editing",
 		"doneEditing": "Done editing",
-		"allowedFiles": "Allowed files:"
+		"allowedFiles": "Allowed files:",
+		"toolNames": {
+			"read": "Read Files",
+			"edit": "Edit Files",
+			"browser": "Use Browser",
+			"command": "Run Commands",
+			"mcp": "Use MCP"
+		}
 	},
 	},
 	"roleDefinition": {
 	"roleDefinition": {
 		"title": "Role Definition",
 		"title": "Role Definition",

+ 228 - 0
webview-ui/src/i18n/locales/en/settings.json

@@ -0,0 +1,228 @@
+{
+	"common": {
+		"save": "Save",
+		"done": "Done",
+		"cancel": "Cancel",
+		"reset": "Reset"
+	},
+	"header": {
+		"title": "Settings",
+		"saveButtonTooltip": "Save changes",
+		"nothingChangedTooltip": "Nothing changed",
+		"doneButtonTooltip": "Discard unsaved changes and close settings panel"
+	},
+	"unsavedChangesDialog": {
+		"title": "Unsaved Changes",
+		"description": "Do you want to discard changes and continue?",
+		"cancelButton": "Cancel",
+		"discardButton": "Discard changes"
+	},
+	"sections": {
+		"providers": "Providers",
+		"autoApprove": "Auto-Approve",
+		"browser": "Browser / Computer Use",
+		"checkpoints": "Checkpoints",
+		"notifications": "Notifications",
+		"contextManagement": "Context Management",
+		"advanced": "Advanced",
+		"experimental": "Experimental Features"
+	},
+	"autoApprove": {
+		"description": "Allow Roo to automatically perform operations without requiring approval. Enable these settings only if you fully trust the AI and understand the associated security risks.",
+		"readOnly": {
+			"label": "Always approve read-only operations",
+			"description": "When enabled, Roo will automatically view directory contents and read files without requiring you to click the Approve button."
+		},
+		"write": {
+			"label": "Always approve write operations",
+			"description": "Automatically create and edit files without requiring approval",
+			"delayLabel": "Delay after writes to allow diagnostics to detect potential problems"
+		},
+		"browser": {
+			"label": "Always approve browser actions",
+			"description": "Automatically perform browser actions without requiring approval",
+			"note": "Note: Only applies when the model supports computer use"
+		},
+		"retry": {
+			"label": "Always retry failed API requests",
+			"description": "Automatically retry failed API requests when server returns an error response",
+			"delayLabel": "Delay before retrying the request"
+		},
+		"mcp": {
+			"label": "Always approve MCP tools",
+			"description": "Enable auto-approval of individual MCP tools in the MCP Servers view (requires both this setting and the tool's individual \"Always allow\" checkbox)"
+		},
+		"modeSwitch": {
+			"label": "Always approve mode switching",
+			"description": "Automatically switch between different modes without requiring approval"
+		},
+		"subtasks": {
+			"label": "Always approve creation & completion of subtasks",
+			"description": "Allow creation and completion of subtasks without requiring approval"
+		},
+		"execute": {
+			"label": "Always approve allowed execute operations",
+			"description": "Automatically execute allowed terminal commands without requiring approval",
+			"allowedCommands": "Allowed Auto-Execute Commands",
+			"allowedCommandsDescription": "Command prefixes that can be auto-executed when \"Always approve execute operations\" is enabled. Add * to allow all commands (use with caution).",
+			"commandPlaceholder": "Enter command prefix (e.g., 'git ')",
+			"addButton": "Add"
+		}
+	},
+	"providers": {
+		"configProfile": "Configuration Profile",
+		"description": "Description",
+		"apiProvider": "API Provider",
+		"openRouterApiKey": "OpenRouter API Key",
+		"apiKeyStorageNotice": "API keys are stored securely in VSCode's Secret Storage",
+		"useCustomBaseUrl": "Use custom base URL",
+		"openRouterTransformsText": "Compress prompts and message chains to the context size (<a>OpenRouter Transforms</a>)"
+	},
+	"browser": {
+		"enable": {
+			"label": "Enable browser tool",
+			"description": "When enabled, Roo can use a browser to interact with websites when using models that support computer use."
+		},
+		"viewport": {
+			"label": "Viewport size",
+			"description": "Select the viewport size for browser interactions. This affects how websites are displayed and interacted with.",
+			"options": {
+				"largeDesktop": "Large Desktop (1280x800)",
+				"smallDesktop": "Small Desktop (900x600)",
+				"tablet": "Tablet (768x1024)",
+				"mobile": "Mobile (360x640)"
+			}
+		},
+		"screenshotQuality": {
+			"label": "Screenshot quality",
+			"description": "Adjust the WebP quality of browser screenshots. Higher values provide clearer screenshots but increase token usage."
+		},
+		"remote": {
+			"label": "Use remote browser connection",
+			"description": "Connect to a Chrome browser running with remote debugging enabled (--remote-debugging-port=9222).",
+			"urlPlaceholder": "Custom URL (e.g., http://localhost:9222)",
+			"testButton": "Test Connection",
+			"testingButton": "Testing...",
+			"instructions": "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."
+		}
+	},
+	"checkpoints": {
+		"enable": {
+			"label": "Enable automatic checkpoints",
+			"description": "When enabled, Roo will automatically create checkpoints during task execution, making it easy to review changes or revert to earlier states."
+		}
+	},
+	"notifications": {
+		"sound": {
+			"label": "Enable sound effects",
+			"description": "When enabled, Roo will play sound effects for notifications and events.",
+			"volumeLabel": "Volume"
+		}
+	},
+	"contextManagement": {
+		"description": "Control what information is included in the AI's context window, affecting token usage and response quality",
+		"terminal": {
+			"label": "Terminal output limit",
+			"description": "Maximum number of lines to include in terminal output when executing commands. When exceeded lines will be removed from the middle, saving tokens."
+		},
+		"openTabs": {
+			"label": "Open tabs context limit",
+			"description": "Maximum number of VSCode open tabs to include in context. Higher values provide more context but increase token usage."
+		},
+		"workspaceFiles": {
+			"label": "Workspace files context limit",
+			"description": "Maximum number of files to include in current working directory details. Higher values provide more context but increase token usage."
+		},
+		"rooignore": {
+			"label": "Show .rooignore'd files in lists and searches",
+			"description": "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."
+		}
+	},
+	"advanced": {
+		"rateLimit": {
+			"label": "Rate limit",
+			"description": "Minimum time between API requests."
+		},
+		"diff": {
+			"label": "Enable editing through diffs",
+			"description": "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.",
+			"strategy": {
+				"label": "Diff strategy",
+				"options": {
+					"standard": "Standard (Single block)",
+					"multiBlock": "Experimental: Multi-block diff",
+					"unified": "Experimental: Unified diff"
+				},
+				"descriptions": {
+					"standard": "Standard diff strategy applies changes to a single code block at a time.",
+					"unified": "Unified diff strategy takes multiple approaches to applying diffs and chooses the best approach.",
+					"multiBlock": "Multi-block diff strategy allows updating multiple code blocks in a file in one request."
+				}
+			},
+			"matchPrecision": {
+				"label": "Match precision",
+				"description": "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."
+			}
+		}
+	},
+	"experimental": {
+		"warning": "⚠️",
+		"DIFF_STRATEGY": {
+			"name": "Use experimental unified diff strategy",
+			"description": "Enable the experimental unified diff strategy. This strategy might reduce the number of retries caused by model errors but may cause unexpected behavior or incorrect edits. Only enable if you understand the risks and are willing to carefully review all changes."
+		},
+		"SEARCH_AND_REPLACE": {
+			"name": "Use experimental search and replace tool",
+			"description": "Enable the experimental search and replace tool, allowing Roo to replace multiple instances of a search term in one request."
+		},
+		"INSERT_BLOCK": {
+			"name": "Use experimental insert content tool",
+			"description": "Enable the experimental insert content tool, allowing Roo to insert content at specific line numbers without needing to create a diff."
+		},
+		"POWER_STEERING": {
+			"name": "Use experimental \"power steering\" mode",
+			"description": "When enabled, Roo will remind the model about the details of its current mode definition more frequently. This will lead to stronger adherence to role definitions and custom instructions, but will use more tokens per message."
+		},
+		"MULTI_SEARCH_AND_REPLACE": {
+			"name": "Use experimental multi block diff tool",
+			"description": "When enabled, Roo will use multi block diff tool. This will try to update multiple code blocks in the file in one request."
+		}
+	},
+	"temperature": {
+		"useCustom": "Use custom temperature",
+		"description": "Controls randomness in the model's responses.",
+		"rangeDescription": "Higher values make output more random, lower values make it more deterministic."
+	},
+	"modelInfo": {
+		"supportsImages": "Supports images",
+		"noImages": "Does not support images",
+		"supportsComputerUse": "Supports computer use",
+		"noComputerUse": "Does not support computer use",
+		"supportsPromptCache": "Supports prompt caching",
+		"noPromptCache": "Does not support prompt caching",
+		"maxOutput": "Max output",
+		"inputPrice": "Input price",
+		"outputPrice": "Output price",
+		"cacheReadsPrice": "Cache reads price",
+		"cacheWritesPrice": "Cache writes price",
+		"gemini": {
+			"freeRequests": "* Free up to {{count}} requests per minute. After that, billing depends on prompt size.",
+			"pricingDetails": "For more info, see pricing details."
+		}
+	},
+	"modelPicker": {
+		"automaticFetch": "The extension automatically fetches the latest list of models available on <serviceLink>{{serviceName}}</serviceLink>. If you're unsure which model to choose, Roo Code works best with <defaultModelLink>{{defaultModelId}}</defaultModelLink>. You can also try searching \"free\" for no-cost options currently available."
+	},
+	"footer": {
+		"feedback": "If you have any questions or feedback, feel free to open an issue at <githubLink>github.com/RooVetGit/Roo-Code</githubLink> or join <redditLink>reddit.com/r/RooCode</redditLink> or <discordLink>discord.gg/roocode</discordLink>",
+		"version": "Roo Code v{{version}}",
+		"telemetry": {
+			"label": "Allow anonymous error and usage reporting",
+			"description": "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."
+		},
+		"reset": {
+			"description": "Reset all global state and secret storage in the extension.",
+			"button": "Reset"
+		}
+	}
+}

+ 9 - 1
webview-ui/src/i18n/locales/en/welcome.json

@@ -2,5 +2,13 @@
 	"greeting": "Hi, I'm Roo!",
 	"greeting": "Hi, I'm Roo!",
 	"introduction": "I can do all kinds of tasks thanks to the latest breakthroughs in agentic coding capabilities and access to tools that let me create & edit files, explore complex projects, use the browser, and execute terminal commands (with your permission, of course). I can even use MCP to create new tools and extend my own capabilities.",
 	"introduction": "I can do all kinds of tasks thanks to the latest breakthroughs in agentic coding capabilities and access to tools that let me create & edit files, explore complex projects, use the browser, and execute terminal commands (with your permission, of course). I can even use MCP to create new tools and extend my own capabilities.",
 	"notice": "To get started, this extension needs an API provider.",
 	"notice": "To get started, this extension needs an API provider.",
-	"start": "Let's go!"
+	"start": "Let's go!",
+	"telemetry": {
+		"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"
+	}
 }
 }

+ 1 - 8
webview-ui/src/i18n/locales/es/common.json

@@ -1,8 +1 @@
-{
-	"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"
-}
+{}

+ 8 - 1
webview-ui/src/i18n/locales/es/prompts.json

@@ -18,7 +18,14 @@
 		"builtInModesText": "Las herramientas para modos integrados no se pueden modificar",
 		"builtInModesText": "Las herramientas para modos integrados no se pueden modificar",
 		"editTools": "Editar herramientas",
 		"editTools": "Editar herramientas",
 		"doneEditing": "Terminar edición",
 		"doneEditing": "Terminar edición",
-		"allowedFiles": "Archivos permitidos:"
+		"allowedFiles": "Archivos permitidos:",
+		"toolNames": {
+			"read": "Leer archivos",
+			"edit": "Editar archivos",
+			"browser": "Usar navegador",
+			"command": "Ejecutar comandos",
+			"mcp": "Usar MCP"
+		}
 	},
 	},
 	"roleDefinition": {
 	"roleDefinition": {
 		"title": "Definición de rol",
 		"title": "Definición de rol",

+ 228 - 0
webview-ui/src/i18n/locales/es/settings.json

@@ -0,0 +1,228 @@
+{
+	"common": {
+		"save": "Guardar",
+		"done": "Hecho",
+		"cancel": "Cancelar",
+		"reset": "Restablecer"
+	},
+	"header": {
+		"title": "Configuración",
+		"saveButtonTooltip": "Guardar cambios",
+		"nothingChangedTooltip": "Nada ha cambiado",
+		"doneButtonTooltip": "Descartar cambios no guardados y cerrar el panel de configuración"
+	},
+	"unsavedChangesDialog": {
+		"title": "Cambios no guardados",
+		"description": "¿Desea descartar los cambios y continuar?",
+		"cancelButton": "Cancelar",
+		"discardButton": "Descartar cambios"
+	},
+	"sections": {
+		"providers": "Proveedores",
+		"autoApprove": "Aprobación automática",
+		"browser": "Navegador / Uso del ordenador",
+		"checkpoints": "Puntos de control",
+		"notifications": "Notificaciones",
+		"contextManagement": "Gestión de contexto",
+		"advanced": "Avanzado",
+		"experimental": "Funciones experimentales"
+	},
+	"autoApprove": {
+		"description": "Permitir que Roo realice operaciones automáticamente sin requerir aprobación. Habilite esta configuración solo si confía plenamente en la IA y comprende los riesgos de seguridad asociados.",
+		"readOnly": {
+			"label": "Aprobar siempre operaciones de solo lectura",
+			"description": "Cuando está habilitado, Roo verá automáticamente el contenido del directorio y leerá archivos sin que necesite hacer clic en el botón Aprobar."
+		},
+		"write": {
+			"label": "Aprobar siempre operaciones de escritura",
+			"description": "Crear y editar archivos automáticamente sin requerir aprobación",
+			"delayLabel": "Retraso después de escritura para permitir que los diagnósticos detecten posibles problemas"
+		},
+		"browser": {
+			"label": "Aprobar siempre acciones del navegador",
+			"description": "Realizar acciones del navegador automáticamente sin requerir aprobación",
+			"note": "Nota: Solo se aplica cuando el modelo admite el uso del ordenador"
+		},
+		"retry": {
+			"label": "Reintentar siempre solicitudes de API fallidas",
+			"description": "Reintentar automáticamente solicitudes de API fallidas cuando el servidor devuelve una respuesta de error",
+			"delayLabel": "Retraso antes de reintentar la solicitud"
+		},
+		"mcp": {
+			"label": "Aprobar siempre herramientas MCP",
+			"description": "Habilitar la aprobación automática de herramientas MCP individuales en la vista de Servidores MCP (requiere tanto esta configuración como la casilla \"Permitir siempre\" de la herramienta)"
+		},
+		"modeSwitch": {
+			"label": "Aprobar siempre cambios de modo",
+			"description": "Cambiar automáticamente entre diferentes modos sin requerir aprobación"
+		},
+		"subtasks": {
+			"label": "Aprobar siempre creación y finalización de subtareas",
+			"description": "Permitir la creación y finalización de subtareas sin requerir aprobación"
+		},
+		"execute": {
+			"label": "Aprobar siempre operaciones de ejecución permitidas",
+			"description": "Ejecutar automáticamente comandos de terminal permitidos sin requerir aprobación",
+			"allowedCommands": "Comandos de auto-ejecución permitidos",
+			"allowedCommandsDescription": "Prefijos de comandos que pueden ser ejecutados automáticamente cuando \"Aprobar siempre operaciones de ejecución\" está habilitado. Añade * para permitir todos los comandos (usar con precaución).",
+			"commandPlaceholder": "Ingrese prefijo de comando (ej. 'git ')",
+			"addButton": "Añadir"
+		}
+	},
+	"providers": {
+		"configProfile": "Perfil de configuración",
+		"description": "Descripción",
+		"apiProvider": "Proveedor de API",
+		"openRouterApiKey": "Clave API de OpenRouter",
+		"apiKeyStorageNotice": "Las claves API se almacenan de forma segura en el Almacenamiento Secreto de VSCode",
+		"useCustomBaseUrl": "Usar URL base personalizada",
+		"openRouterTransformsText": "Comprimir prompts y cadenas de mensajes al tamaño del contexto (<a>Transformaciones de OpenRouter</a>)"
+	},
+	"browser": {
+		"enable": {
+			"label": "Habilitar herramienta de navegador",
+			"description": "Cuando está habilitado, Roo puede usar un navegador para interactuar con sitios web cuando se utilizan modelos que admiten el uso del ordenador."
+		},
+		"viewport": {
+			"label": "Tamaño del viewport",
+			"description": "Seleccione el tamaño del viewport para interacciones del navegador. Esto afecta cómo se muestran e interactúan los sitios web.",
+			"options": {
+				"largeDesktop": "Escritorio grande (1280x800)",
+				"smallDesktop": "Escritorio pequeño (900x600)",
+				"tablet": "Tablet (768x1024)",
+				"mobile": "Móvil (360x640)"
+			}
+		},
+		"screenshotQuality": {
+			"label": "Calidad de capturas de pantalla",
+			"description": "Ajuste la calidad WebP de las capturas de pantalla del navegador. Valores más altos proporcionan capturas más claras pero aumentan el uso de token."
+		},
+		"remote": {
+			"label": "Usar conexión remota del navegador",
+			"description": "Conectarse a un navegador Chrome que se ejecuta con depuración remota habilitada (--remote-debugging-port=9222).",
+			"urlPlaceholder": "URL personalizada (ej. http://localhost:9222)",
+			"testButton": "Probar conexión",
+			"testingButton": "Probando...",
+			"instructions": "Ingrese la dirección del host del protocolo DevTools o déjelo vacío para descubrir automáticamente instancias locales de Chrome. El botón Probar Conexión intentará usar la URL personalizada si se proporciona, o descubrirá automáticamente si el campo está vacío."
+		}
+	},
+	"checkpoints": {
+		"enable": {
+			"label": "Habilitar puntos de control automáticos",
+			"description": "Cuando está habilitado, Roo creará automáticamente puntos de control durante la ejecución de tareas, facilitando la revisión de cambios o la reversión a estados anteriores."
+		}
+	},
+	"notifications": {
+		"sound": {
+			"label": "Habilitar efectos de sonido",
+			"description": "Cuando está habilitado, Roo reproducirá efectos de sonido para notificaciones y eventos.",
+			"volumeLabel": "Volumen"
+		}
+	},
+	"contextManagement": {
+		"description": "Controle qué información se incluye en la ventana de contexto de la IA, afectando el uso de token y la calidad de respuesta",
+		"terminal": {
+			"label": "Límite de salida de terminal",
+			"description": "Número máximo de líneas a incluir en la salida del terminal al ejecutar comandos. Cuando se excede, se eliminarán líneas del medio, ahorrando token."
+		},
+		"openTabs": {
+			"label": "Límite de contexto de pestañas abiertas",
+			"description": "Número máximo de pestañas abiertas de VSCode a incluir en el contexto. Valores más altos proporcionan más contexto pero aumentan el uso de token."
+		},
+		"workspaceFiles": {
+			"label": "Límite de contexto de archivos del espacio de trabajo",
+			"description": "Número máximo de archivos a incluir en los detalles del directorio de trabajo actual. Valores más altos proporcionan más contexto pero aumentan el uso de token."
+		},
+		"rooignore": {
+			"label": "Mostrar archivos .rooignore en listas y búsquedas",
+			"description": "Cuando está habilitado, los archivos que coinciden con los patrones en .rooignore se mostrarán en listas con un símbolo de candado. Cuando está deshabilitado, estos archivos se ocultarán completamente de las listas de archivos y búsquedas."
+		}
+	},
+	"advanced": {
+		"rateLimit": {
+			"label": "Límite de tasa",
+			"description": "Tiempo mínimo entre solicitudes de API."
+		},
+		"diff": {
+			"label": "Habilitar edición a través de diffs",
+			"description": "Cuando está habilitado, Roo podrá editar archivos más rápidamente y rechazará automáticamente escrituras completas de archivos truncados. Funciona mejor con el último modelo Claude 3.7 Sonnet.",
+			"strategy": {
+				"label": "Estrategia de diff",
+				"options": {
+					"standard": "Estándar (Bloque único)",
+					"multiBlock": "Experimental: Diff multi-bloque",
+					"unified": "Experimental: Diff unificado"
+				},
+				"descriptions": {
+					"standard": "La estrategia de diff estándar aplica cambios a un solo bloque de código a la vez.",
+					"unified": "La estrategia de diff unificado toma múltiples enfoques para aplicar diffs y elige el mejor enfoque.",
+					"multiBlock": "La estrategia de diff multi-bloque permite actualizar múltiples bloques de código en un archivo en una sola solicitud."
+				}
+			},
+			"matchPrecision": {
+				"label": "Precisión de coincidencia",
+				"description": "Este control deslizante controla cuán precisamente deben coincidir las secciones de código al aplicar diffs. Valores más bajos permiten coincidencias más flexibles pero aumentan el riesgo de reemplazos incorrectos. Use valores por debajo del 100% con extrema precaución."
+			}
+		}
+	},
+	"experimental": {
+		"warning": "⚠️",
+		"DIFF_STRATEGY": {
+			"name": "Usar estrategia de diff unificada experimental",
+			"description": "Habilitar la estrategia de diff unificada experimental. Esta estrategia podría reducir el número de reintentos causados por errores del modelo, pero puede causar comportamientos inesperados o ediciones incorrectas. Habilítela solo si comprende los riesgos y está dispuesto a revisar cuidadosamente todos los cambios."
+		},
+		"SEARCH_AND_REPLACE": {
+			"name": "Usar herramienta experimental de búsqueda y reemplazo",
+			"description": "Habilitar la herramienta experimental de búsqueda y reemplazo, permitiendo a Roo reemplazar múltiples instancias de un término de búsqueda en una sola solicitud."
+		},
+		"INSERT_BLOCK": {
+			"name": "Usar herramienta experimental de inserción de contenido",
+			"description": "Habilitar la herramienta experimental de inserción de contenido, permitiendo a Roo insertar contenido en números de línea específicos sin necesidad de crear un diff."
+		},
+		"POWER_STEERING": {
+			"name": "Usar modo experimental de \"dirección asistida\"",
+			"description": "Cuando está habilitado, Roo recordará al modelo los detalles de su definición de modo actual con más frecuencia. Esto llevará a una mayor adherencia a las definiciones de roles e instrucciones personalizadas, pero usará más tokens por mensaje."
+		},
+		"MULTI_SEARCH_AND_REPLACE": {
+			"name": "Usar herramienta experimental de diff de bloques múltiples",
+			"description": "Cuando está habilitado, Roo usará la herramienta de diff de bloques múltiples. Esto intentará actualizar múltiples bloques de código en el archivo en una sola solicitud."
+		}
+	},
+	"temperature": {
+		"useCustom": "Usar temperatura personalizada",
+		"description": "Controla la aleatoriedad en las respuestas del modelo.",
+		"rangeDescription": "Valores más altos hacen que la salida sea más aleatoria, valores más bajos la hacen más determinista."
+	},
+	"modelInfo": {
+		"supportsImages": "Soporta imágenes",
+		"noImages": "No soporta imágenes",
+		"supportsComputerUse": "Soporta uso del ordenador",
+		"noComputerUse": "No soporta uso del ordenador",
+		"supportsPromptCache": "Soporta caché de prompts",
+		"noPromptCache": "No soporta caché de prompts",
+		"maxOutput": "Salida máxima",
+		"inputPrice": "Precio de entrada",
+		"outputPrice": "Precio de salida",
+		"cacheReadsPrice": "Precio de lecturas de caché",
+		"cacheWritesPrice": "Precio de escrituras de caché",
+		"gemini": {
+			"freeRequests": "* Gratis hasta {{count}} solicitudes por minuto. Después de eso, la facturación depende del tamaño del prompt.",
+			"pricingDetails": "Para más información, consulte los detalles de precios."
+		}
+	},
+	"modelPicker": {
+		"automaticFetch": "La extensión obtiene automáticamente la lista más reciente de modelos disponibles en <serviceLink>{{serviceName}}</serviceLink>. Si no está seguro de qué modelo elegir, Roo Code funciona mejor con <defaultModelLink>{{defaultModelId}}</defaultModelLink>. También puede buscar \"free\" para opciones sin costo actualmente disponibles."
+	},
+	"footer": {
+		"feedback": "Si tiene alguna pregunta o comentario, no dude en abrir un issue en <githubLink>github.com/RooVetGit/Roo-Code</githubLink> o unirse a <redditLink>reddit.com/r/RooCode</redditLink> o <discordLink>discord.gg/roocode</discordLink>",
+		"version": "Roo Code v{{version}}",
+		"telemetry": {
+			"label": "Permitir informes anónimos de errores y uso",
+			"description": "Ayude a mejorar Roo Code enviando datos de uso anónimos e informes de errores. Nunca se envía código, prompts o información personal. Consulte nuestra política de privacidad para más detalles."
+		},
+		"reset": {
+			"description": "Restablecer todo el estado global y almacenamiento secreto en la extensión.",
+			"button": "Restablecer"
+		}
+	}
+}

+ 9 - 1
webview-ui/src/i18n/locales/es/welcome.json

@@ -2,5 +2,13 @@
 	"greeting": "¡Hola, soy Roo!",
 	"greeting": "¡Hola, soy Roo!",
 	"introduction": "Puedo realizar todo tipo de tareas gracias a los últimos avances en capacidades de codificación agentica y acceso a herramientas que me permiten crear y editar archivos, explorar proyectos complejos, usar el navegador y ejecutar comandos de terminal (con tu permiso, por supuesto). Incluso puedo usar MCP para crear nuevas herramientas y ampliar mis propias capacidades.",
 	"introduction": "Puedo realizar todo tipo de tareas gracias a los últimos avances en capacidades de codificación agentica y acceso a herramientas que me permiten crear y editar archivos, explorar proyectos complejos, usar el navegador y ejecutar comandos de terminal (con tu permiso, por supuesto). Incluso puedo usar MCP para crear nuevas herramientas y ampliar mis propias capacidades.",
 	"notice": "Para comenzar, esta extensión necesita un proveedor de API.",
 	"notice": "Para comenzar, esta extensión necesita un proveedor de API.",
-	"start": "¡Vamos!"
+	"start": "¡Vamos!",
+	"telemetry": {
+		"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"
+	}
 }
 }

+ 1 - 8
webview-ui/src/i18n/locales/fr/common.json

@@ -1,8 +1 @@
-{
-	"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"
-}
+{}

+ 8 - 1
webview-ui/src/i18n/locales/fr/prompts.json

@@ -18,7 +18,14 @@
 		"builtInModesText": "Les outils pour les modes intégrés ne peuvent pas être modifiés",
 		"builtInModesText": "Les outils pour les modes intégrés ne peuvent pas être modifiés",
 		"editTools": "Modifier les outils",
 		"editTools": "Modifier les outils",
 		"doneEditing": "Terminer la modification",
 		"doneEditing": "Terminer la modification",
-		"allowedFiles": "Fichiers autorisés :"
+		"allowedFiles": "Fichiers autorisés :",
+		"toolNames": {
+			"read": "Lire les fichiers",
+			"edit": "Modifier les fichiers",
+			"browser": "Utiliser le navigateur",
+			"command": "Exécuter des commandes",
+			"mcp": "Utiliser MCP"
+		}
 	},
 	},
 	"roleDefinition": {
 	"roleDefinition": {
 		"title": "Définition du rôle",
 		"title": "Définition du rôle",

+ 228 - 0
webview-ui/src/i18n/locales/fr/settings.json

@@ -0,0 +1,228 @@
+{
+	"common": {
+		"save": "Enregistrer",
+		"done": "Terminé",
+		"cancel": "Annuler",
+		"reset": "Réinitialiser"
+	},
+	"header": {
+		"title": "Paramètres",
+		"saveButtonTooltip": "Enregistrer les modifications",
+		"nothingChangedTooltip": "Rien n'a changé",
+		"doneButtonTooltip": "Ignorer les modifications non enregistrées et fermer le panneau des paramètres"
+	},
+	"unsavedChangesDialog": {
+		"title": "Modifications non enregistrées",
+		"description": "Voulez-vous ignorer les modifications et continuer ?",
+		"cancelButton": "Annuler",
+		"discardButton": "Ignorer les modifications"
+	},
+	"sections": {
+		"providers": "Fournisseurs",
+		"autoApprove": "Approbation automatique",
+		"browser": "Navigateur / Utilisation de l'ordinateur",
+		"checkpoints": "Points de contrôle",
+		"notifications": "Notifications",
+		"contextManagement": "Gestion du contexte",
+		"advanced": "Avancé",
+		"experimental": "Fonctionnalités expérimentales"
+	},
+	"autoApprove": {
+		"description": "Permettre à Roo d'effectuer automatiquement des opérations sans requérir d'approbation. Activez ces paramètres uniquement si vous faites entièrement confiance à l'IA et que vous comprenez les risques de sécurité associés.",
+		"readOnly": {
+			"label": "Toujours approuver les opérations en lecture seule",
+			"description": "Lorsque cette option est activée, Roo affichera automatiquement le contenu des répertoires et lira les fichiers sans que vous ayez à cliquer sur le bouton Approuver."
+		},
+		"write": {
+			"label": "Toujours approuver les opérations d'écriture",
+			"description": "Créer et modifier automatiquement des fichiers sans nécessiter d'approbation",
+			"delayLabel": "Délai après les écritures pour permettre aux diagnostics de détecter les problèmes potentiels"
+		},
+		"browser": {
+			"label": "Toujours approuver les actions du navigateur",
+			"description": "Effectuer automatiquement des actions du navigateur sans nécessiter d'approbation",
+			"note": "Remarque : S'applique uniquement lorsque le modèle prend en charge l'utilisation de l'ordinateur"
+		},
+		"retry": {
+			"label": "Toujours réessayer les requêtes API échouées",
+			"description": "Réessayer automatiquement les requêtes API échouées lorsque le serveur renvoie une réponse d'erreur",
+			"delayLabel": "Délai avant de réessayer la requête"
+		},
+		"mcp": {
+			"label": "Toujours approuver les outils MCP",
+			"description": "Activer l'approbation automatique des outils MCP individuels dans la vue des serveurs MCP (nécessite à la fois ce paramètre et la case à cocher \"Toujours autoriser\" de l'outil)"
+		},
+		"modeSwitch": {
+			"label": "Toujours approuver les changements de mode",
+			"description": "Basculer automatiquement entre différents modes sans nécessiter d'approbation"
+		},
+		"subtasks": {
+			"label": "Toujours approuver la création et l'achèvement des sous-tâches",
+			"description": "Permettre la création et l'achèvement des sous-tâches sans nécessiter d'approbation"
+		},
+		"execute": {
+			"label": "Toujours approuver les opérations d'exécution autorisées",
+			"description": "Exécuter automatiquement les commandes de terminal autorisées sans nécessiter d'approbation",
+			"allowedCommands": "Commandes auto-exécutables autorisées",
+			"allowedCommandsDescription": "Préfixes de commandes qui peuvent être auto-exécutés lorsque \"Toujours approuver les opérations d'exécution\" est activé. Ajoutez * pour autoriser toutes les commandes (à utiliser avec précaution).",
+			"commandPlaceholder": "Entrez le préfixe de commande (ex. 'git ')",
+			"addButton": "Ajouter"
+		}
+	},
+	"providers": {
+		"configProfile": "Profil de configuration",
+		"description": "Description",
+		"apiProvider": "Fournisseur d'API",
+		"openRouterApiKey": "Clé API OpenRouter",
+		"apiKeyStorageNotice": "Les clés API sont stockées en toute sécurité dans le stockage sécurisé de VSCode",
+		"useCustomBaseUrl": "Utiliser une URL de base personnalisée",
+		"openRouterTransformsText": "Compresser les prompts et chaînes de messages à la taille du contexte (<a>Transformations OpenRouter</a>)"
+	},
+	"browser": {
+		"enable": {
+			"label": "Activer l'outil de navigateur",
+			"description": "Lorsque cette option est activée, Roo peut utiliser un navigateur pour interagir avec des sites web lors de l'utilisation de modèles qui prennent en charge l'utilisation de l'ordinateur."
+		},
+		"viewport": {
+			"label": "Taille de la fenêtre d'affichage",
+			"description": "Sélectionnez la taille de la fenêtre d'affichage pour les interactions du navigateur. Cela affecte la façon dont les sites web sont affichés et dont on interagit avec eux.",
+			"options": {
+				"largeDesktop": "Grand bureau (1280x800)",
+				"smallDesktop": "Petit bureau (900x600)",
+				"tablet": "Tablette (768x1024)",
+				"mobile": "Mobile (360x640)"
+			}
+		},
+		"screenshotQuality": {
+			"label": "Qualité des captures d'écran",
+			"description": "Ajustez la qualité WebP des captures d'écran du navigateur. Des valeurs plus élevées fournissent des captures plus claires mais augmentent l'utilisation de token."
+		},
+		"remote": {
+			"label": "Utiliser une connexion de navigateur distant",
+			"description": "Se connecter à un navigateur Chrome exécuté avec le débogage à distance activé (--remote-debugging-port=9222).",
+			"urlPlaceholder": "URL personnalisée (ex. http://localhost:9222)",
+			"testButton": "Tester la connexion",
+			"testingButton": "Test en cours...",
+			"instructions": "Entrez l'adresse hôte du protocole DevTools ou laissez vide pour découvrir automatiquement les instances Chrome locales. Le bouton Tester la connexion essaiera l'URL personnalisée si fournie, ou découvrira automatiquement si le champ est vide."
+		}
+	},
+	"checkpoints": {
+		"enable": {
+			"label": "Activer les points de contrôle automatiques",
+			"description": "Lorsque cette option est activée, Roo créera automatiquement des points de contrôle pendant l'exécution des tâches, facilitant la révision des modifications ou le retour à des états antérieurs."
+		}
+	},
+	"notifications": {
+		"sound": {
+			"label": "Activer les effets sonores",
+			"description": "Lorsque cette option est activée, Roo jouera des effets sonores pour les notifications et les événements.",
+			"volumeLabel": "Volume"
+		}
+	},
+	"contextManagement": {
+		"description": "Contrôlez quelles informations sont incluses dans la fenêtre de contexte de l'IA, affectant l'utilisation de token et la qualité des réponses",
+		"terminal": {
+			"label": "Limite de sortie du terminal",
+			"description": "Nombre maximum de lignes à inclure dans la sortie du terminal lors de l'exécution de commandes. Lorsque ce nombre est dépassé, les lignes seront supprimées du milieu, économisant des token."
+		},
+		"openTabs": {
+			"label": "Limite de contexte des onglets ouverts",
+			"description": "Nombre maximum d'onglets VSCode ouverts à inclure dans le contexte. Des valeurs plus élevées fournissent plus de contexte mais augmentent l'utilisation de token."
+		},
+		"workspaceFiles": {
+			"label": "Limite de contexte des fichiers de l'espace de travail",
+			"description": "Nombre maximum de fichiers à inclure dans les détails du répertoire de travail actuel. Des valeurs plus élevées fournissent plus de contexte mais augmentent l'utilisation de token."
+		},
+		"rooignore": {
+			"label": "Afficher les fichiers .rooignore dans les listes et recherches",
+			"description": "Lorsque cette option est activée, les fichiers correspondant aux modèles dans .rooignore seront affichés dans les listes avec un symbole de cadenas. Lorsqu'elle est désactivée, ces fichiers seront complètement masqués des listes de fichiers et des recherches."
+		}
+	},
+	"advanced": {
+		"rateLimit": {
+			"label": "Limite de débit",
+			"description": "Temps minimum entre les requêtes API."
+		},
+		"diff": {
+			"label": "Activer l'édition via des diffs",
+			"description": "Lorsque cette option est activée, Roo pourra éditer des fichiers plus rapidement et rejettera automatiquement les écritures de fichiers complets tronqués. Fonctionne mieux avec le dernier modèle Claude 3.7 Sonnet.",
+			"strategy": {
+				"label": "Stratégie de diff",
+				"options": {
+					"standard": "Standard (Bloc unique)",
+					"multiBlock": "Expérimental : Diff multi-blocs",
+					"unified": "Expérimental : Diff unifié"
+				},
+				"descriptions": {
+					"standard": "La stratégie de diff standard applique les modifications à un seul bloc de code à la fois.",
+					"unified": "La stratégie de diff unifié prend plusieurs approches pour appliquer les diffs et choisit la meilleure approche.",
+					"multiBlock": "La stratégie de diff multi-blocs permet de mettre à jour plusieurs blocs de code dans un fichier en une seule requête."
+				}
+			},
+			"matchPrecision": {
+				"label": "Précision de correspondance",
+				"description": "Ce curseur contrôle la précision avec laquelle les sections de code doivent correspondre lors de l'application des diffs. Des valeurs plus basses permettent des correspondances plus flexibles mais augmentent le risque de remplacements incorrects. Utilisez des valeurs inférieures à 100 % avec une extrême prudence."
+			}
+		}
+	},
+	"experimental": {
+		"warning": "⚠️",
+		"DIFF_STRATEGY": {
+			"name": "Utiliser la stratégie diff unifiée expérimentale",
+			"description": "Activer la stratégie diff unifiée expérimentale. Cette stratégie pourrait réduire le nombre de tentatives causées par des erreurs de modèle, mais peut provoquer des comportements inattendus ou des modifications incorrectes. Activez-la uniquement si vous comprenez les risques et êtes prêt à examiner attentivement tous les changements."
+		},
+		"SEARCH_AND_REPLACE": {
+			"name": "Utiliser l'outil de recherche et remplacement expérimental",
+			"description": "Activer l'outil de recherche et remplacement expérimental, permettant à Roo de remplacer plusieurs occurrences d'un terme de recherche en une seule requête."
+		},
+		"INSERT_BLOCK": {
+			"name": "Utiliser l'outil d'insertion de contenu expérimental",
+			"description": "Activer l'outil d'insertion de contenu expérimental, permettant à Roo d'insérer du contenu à des numéros de ligne spécifiques sans avoir besoin de créer un diff."
+		},
+		"POWER_STEERING": {
+			"name": "Utiliser le mode \"direction assistée\" expérimental",
+			"description": "Lorsqu'il est activé, Roo rappellera plus fréquemment au modèle les détails de sa définition de mode actuelle. Cela conduira à une adhérence plus forte aux définitions de rôles et aux instructions personnalisées, mais utilisera plus de tokens par message."
+		},
+		"MULTI_SEARCH_AND_REPLACE": {
+			"name": "Utiliser l'outil diff multi-blocs expérimental",
+			"description": "Lorsqu'il est activé, Roo utilisera l'outil diff multi-blocs. Cela tentera de mettre à jour plusieurs blocs de code dans le fichier en une seule requête."
+		}
+	},
+	"temperature": {
+		"useCustom": "Utiliser une température personnalisée",
+		"description": "Contrôle l'aléatoire dans les réponses du modèle.",
+		"rangeDescription": "Des valeurs plus élevées rendent la sortie plus aléatoire, des valeurs plus basses la rendent plus déterministe."
+	},
+	"modelInfo": {
+		"supportsImages": "Prend en charge les images",
+		"noImages": "Ne prend pas en charge les images",
+		"supportsComputerUse": "Prend en charge l'utilisation de l'ordinateur",
+		"noComputerUse": "Ne prend pas en charge l'utilisation de l'ordinateur",
+		"supportsPromptCache": "Prend en charge la mise en cache des prompts",
+		"noPromptCache": "Ne prend pas en charge la mise en cache des prompts",
+		"maxOutput": "Sortie maximale",
+		"inputPrice": "Prix d'entrée",
+		"outputPrice": "Prix de sortie",
+		"cacheReadsPrice": "Prix des lectures de cache",
+		"cacheWritesPrice": "Prix des écritures de cache",
+		"gemini": {
+			"freeRequests": "* Gratuit jusqu'à {{count}} requêtes par minute. Après cela, la facturation dépend de la taille du prompt.",
+			"pricingDetails": "Pour plus d'informations, voir les détails de tarification."
+		}
+	},
+	"modelPicker": {
+		"automaticFetch": "L'extension récupère automatiquement la liste la plus récente des modèles disponibles sur <serviceLink>{{serviceName}}</serviceLink>. Si vous ne savez pas quel modèle choisir, Roo Code fonctionne mieux avec <defaultModelLink>{{defaultModelId}}</defaultModelLink>. Vous pouvez également rechercher \"free\" pour les options gratuites actuellement disponibles."
+	},
+	"footer": {
+		"feedback": "Si vous avez des questions ou des commentaires, n'hésitez pas à ouvrir un problème sur <githubLink>github.com/RooVetGit/Roo-Code</githubLink> ou à rejoindre <redditLink>reddit.com/r/RooCode</redditLink> ou <discordLink>discord.gg/roocode</discordLink>",
+		"version": "Roo Code v{{version}}",
+		"telemetry": {
+			"label": "Autoriser les rapports anonymes d'erreurs et d'utilisation",
+			"description": "Aidez à améliorer Roo Code en envoyant des données d'utilisation anonymes et des rapports d'erreurs. Aucun code, prompt ou information personnelle n'est jamais envoyé. Consultez notre politique de confidentialité pour plus de détails."
+		},
+		"reset": {
+			"description": "Réinitialiser tous les états globaux et le stockage secret dans l'extension.",
+			"button": "Réinitialiser"
+		}
+	}
+}

+ 9 - 1
webview-ui/src/i18n/locales/fr/welcome.json

@@ -2,5 +2,13 @@
 	"greeting": "Salut, je suis Roo !",
 	"greeting": "Salut, je suis Roo !",
 	"introduction": "Je peux effectuer toutes sortes de tâches grâce aux dernières avancées en matière de capacités de codage agentique et à l'accès à 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 (avec votre permission, bien sûr). Je peux même utiliser MCP pour créer de nouveaux outils et étendre mes propres capacités.",
 	"introduction": "Je peux effectuer toutes sortes de tâches grâce aux dernières avancées en matière de capacités de codage agentique et à l'accès à 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 (avec votre permission, bien sûr). Je peux même utiliser MCP pour créer de nouveaux outils et étendre mes propres capacités.",
 	"notice": "Pour commencer, cette extension a besoin d'un fournisseur d'API.",
 	"notice": "Pour commencer, cette extension a besoin d'un fournisseur d'API.",
-	"start": "C'est parti !"
+	"start": "C'est parti !",
+	"telemetry": {
+		"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"
+	}
 }
 }

+ 1 - 8
webview-ui/src/i18n/locales/hi/common.json

@@ -1,8 +1 @@
-{
-	"title": "Roo Code को बेहतर बनाने में मदद करें",
-	"anonymousTelemetry": "बग ठीक करने और एक्सटेंशन को बेहतर बनाने में हमारी मदद करने के लिए गुमनाम त्रुटि और उपयोग डेटा भेजें। कोड, संकेत या व्यक्तिगत जानकारी कभी नहीं भेजी जाती है।",
-	"changeSettings": "आप इसे हमेशा सेटिंग्स के निचले भाग में बदल सकते हैं",
-	"settings": "सेटिंग्स",
-	"allow": "अनुमति दें",
-	"deny": "अस्वीकार करें"
-}
+{}

+ 8 - 1
webview-ui/src/i18n/locales/hi/prompts.json

@@ -18,7 +18,14 @@
 		"builtInModesText": "अंतर्निहित मोड्स के लिए टूल्स को संशोधित नहीं किया जा सकता",
 		"builtInModesText": "अंतर्निहित मोड्स के लिए टूल्स को संशोधित नहीं किया जा सकता",
 		"editTools": "टूल्स संपादित करें",
 		"editTools": "टूल्स संपादित करें",
 		"doneEditing": "संपादन पूरा हुआ",
 		"doneEditing": "संपादन पूरा हुआ",
-		"allowedFiles": "अनुमत फाइलें:"
+		"allowedFiles": "अनुमत फाइलें:",
+		"toolNames": {
+			"read": "फाइलें पढ़ें",
+			"edit": "फाइलें संपादित करें",
+			"browser": "ब्राउज़र का उपयोग करें",
+			"command": "कमांड्स चलाएँ",
+			"mcp": "MCP का उपयोग करें"
+		}
 	},
 	},
 	"roleDefinition": {
 	"roleDefinition": {
 		"title": "भूमिका परिभाषा",
 		"title": "भूमिका परिभाषा",

+ 228 - 0
webview-ui/src/i18n/locales/hi/settings.json

@@ -0,0 +1,228 @@
+{
+	"common": {
+		"save": "सहेजें",
+		"done": "पूर्ण",
+		"cancel": "रद्द करें",
+		"reset": "रीसेट करें"
+	},
+	"header": {
+		"title": "सेटिंग्स",
+		"saveButtonTooltip": "परिवर्तन सहेजें",
+		"nothingChangedTooltip": "कुछ भी नहीं बदला",
+		"doneButtonTooltip": "असहेजे परिवर्तनों को छोड़ें और सेटिंग्स पैनल बंद करें"
+	},
+	"unsavedChangesDialog": {
+		"title": "असहेजे परिवर्तन",
+		"description": "क्या आप परिवर्तनों को छोड़कर जारी रखना चाहते हैं?",
+		"cancelButton": "रद्द करें",
+		"discardButton": "परिवर्तन छोड़ें"
+	},
+	"sections": {
+		"providers": "प्रदाता",
+		"autoApprove": "स्वतः अनुमोदन",
+		"browser": "ब्राउज़र / कंप्यूटर उपयोग",
+		"checkpoints": "चेकपॉइंट",
+		"notifications": "सूचनाएँ",
+		"contextManagement": "संदर्भ प्रबंधन",
+		"advanced": "उन्नत",
+		"experimental": "प्रायोगिक सुविधाएँ"
+	},
+	"autoApprove": {
+		"description": "Roo को अनुमोदन की आवश्यकता के बिना स्वचालित रूप से ऑपरेशन करने की अनुमति दें। इन सेटिंग्स को केवल तभी सक्षम करें जब आप AI पर पूरी तरह से भरोसा करते हों और संबंधित सुरक्षा जोखिमों को समझते हों।",
+		"readOnly": {
+			"label": "केवल पढ़ने वाले ऑपरेशन हमेशा अनुमोदित करें",
+			"description": "जब सक्षम होता है, तो Roo आपके अनुमोदित बटन पर क्लिक किए बिना स्वचालित रूप से निर्देशिका सामग्री देखेगा और फाइलें पढ़ेगा।"
+		},
+		"write": {
+			"label": "लिखने वाले ऑपरेशन हमेशा अनुमोदित करें",
+			"description": "अनुमोदन की आवश्यकता के बिना स्वचालित रूप से फाइलें बनाएँ और संपादित करें",
+			"delayLabel": "लिखने के बाद विलंब ताकि डायग्नोस्टिक संभावित समस्याओं का पता लगा सकें"
+		},
+		"browser": {
+			"label": "ब्राउज़र क्रियाएँ हमेशा अनुमोदित करें",
+			"description": "अनुमोदन की आवश्यकता के बिना स्वचालित रूप से ब्राउज़र क्रियाएँ करें",
+			"note": "नोट: केवल तभी लागू होता है जब मॉडल कंप्यूटर उपयोग का समर्थन करता है"
+		},
+		"retry": {
+			"label": "विफल API अनुरोधों को हमेशा पुनः प्रयास करें",
+			"description": "जब सर्वर त्रुटि प्रतिक्रिया देता है तो स्वचालित रूप से विफल API अनुरोधों को पुनः प्रयास करें",
+			"delayLabel": "अनुरोध को पुनः प्रयास करने से पहले विलंब"
+		},
+		"mcp": {
+			"label": "MCP टूल्स हमेशा अनुमोदित करें",
+			"description": "MCP सर्वर व्यू में व्यक्तिगत MCP टूल्स के स्वतः अनुमोदन को सक्षम करें (इस सेटिंग और टूल के \"हमेशा अनुमति दें\" चेकबॉक्स दोनों की आवश्यकता है)"
+		},
+		"modeSwitch": {
+			"label": "मोड स्विचिंग हमेशा अनुमोदित करें",
+			"description": "अनुमोदन की आवश्यकता के बिना स्वचालित रूप से विभिन्न मोड के बीच स्विच करें"
+		},
+		"subtasks": {
+			"label": "उप-कार्यों का निर्माण और पूर्णता हमेशा अनुमोदित करें",
+			"description": "अनुमोदन की आवश्यकता के बिना उप-कार्यों के निर्माण और पूर्णता की अनुमति दें"
+		},
+		"execute": {
+			"label": "अनुमत निष्पादन ऑपरेशन हमेशा अनुमोदित करें",
+			"description": "अनुमोदन की आवश्यकता के बिना स्वचालित रूप से अनुमत टर्मिनल कमांड निष्पादित करें",
+			"allowedCommands": "अनुमत स्वतः-निष्पादन कमांड",
+			"allowedCommandsDescription": "कमांड प्रीफिक्स जो स्वचालित रूप से निष्पादित किए जा सकते हैं जब \"निष्पादन ऑपरेशन हमेशा अनुमोदित करें\" सक्षम है। सभी कमांड की अनुमति देने के लिए * जोड़ें (सावधानी से उपयोग करें)।",
+			"commandPlaceholder": "कमांड प्रीफिक्स दर्ज करें (उदा. 'git ')",
+			"addButton": "जोड़ें"
+		}
+	},
+	"providers": {
+		"configProfile": "कॉन्फिगरेशन प्रोफाइल",
+		"description": "विवरण",
+		"apiProvider": "API प्रदाता",
+		"openRouterApiKey": "OpenRouter API कुंजी",
+		"apiKeyStorageNotice": "API कुंजियाँ VSCode के सुरक्षित स्टोरेज में सुरक्षित रूप से संग्रहीत हैं",
+		"useCustomBaseUrl": "कस्टम बेस URL का उपयोग करें",
+		"openRouterTransformsText": "संदर्भ आकार के लिए प्रॉम्प्ट और संदेश श्रृंखलाओं को संपीड़ित करें (<a>OpenRouter ट्रांसफॉर्म</a>)"
+	},
+	"browser": {
+		"enable": {
+			"label": "ब्राउज़र टूल सक्षम करें",
+			"description": "जब सक्षम होता है, तो Roo कंप्यूटर उपयोग का समर्थन करने वाले मॉडल का उपयोग करते समय वेबसाइटों के साथ बातचीत करने के लिए ब्राउज़र का उपयोग कर सकता है।"
+		},
+		"viewport": {
+			"label": "व्यूपोर्ट आकार",
+			"description": "ब्राउज़र इंटरैक्शन के लिए व्यूपोर्ट आकार चुनें। यह वेबसाइटों के प्रदर्शन और उनके साथ बातचीत को प्रभावित करता है।",
+			"options": {
+				"largeDesktop": "बड़ा डेस्कटॉप (1280x800)",
+				"smallDesktop": "छोटा डेस्कटॉप (900x600)",
+				"tablet": "टैबलेट (768x1024)",
+				"mobile": "मोबाइल (360x640)"
+			}
+		},
+		"screenshotQuality": {
+			"label": "स्क्रीनशॉट गुणवत्ता",
+			"description": "ब्राउज़र स्क्रीनशॉट की WebP गुणवत्ता समायोजित करें। उच्च मान स्पष्ट स्क्रीनशॉट प्रदान करते हैं लेकिन token उपयोग बढ़ाते हैं।"
+		},
+		"remote": {
+			"label": "दूरस्थ ब्राउज़र कनेक्शन का उपयोग करें",
+			"description": "रिमोट डीबगिंग सक्षम के साथ चल रहे Chrome ब्राउज़र से कनेक्ट करें (--remote-debugging-port=9222)।",
+			"urlPlaceholder": "कस्टम URL (उदा. http://localhost:9222)",
+			"testButton": "कनेक्शन का परीक्षण करें",
+			"testingButton": "परीक्षण हो रहा है...",
+			"instructions": "DevTools प्रोटोकॉल होस्ट पता दर्ज करें या Chrome स्थानीय इंस्टेंस स्वतः खोजने के लिए खाली छोड़ दें। टेस्ट कनेक्शन बटन यदि प्रदान किया गया है तो कस्टम URL का प्रयास करेगा, या यदि फ़ील्ड खाली है तो स्वतः खोज करेगा।"
+		}
+	},
+	"checkpoints": {
+		"enable": {
+			"label": "स्वचालित चेकपॉइंट सक्षम करें",
+			"description": "जब सक्षम होता है, तो Roo कार्य निष्पादन के दौरान स्वचालित रूप से चेकपॉइंट बनाएगा, जिससे परिवर्तनों की समीक्षा करना या पहले की स्थितियों पर वापस जाना आसान हो जाएगा।"
+		}
+	},
+	"notifications": {
+		"sound": {
+			"label": "ध्वनि प्रभाव सक्षम करें",
+			"description": "जब सक्षम होता है, तो Roo सूचनाओं और घटनाओं के लिए ध्वनि प्रभाव चलाएगा।",
+			"volumeLabel": "वॉल्यूम"
+		}
+	},
+	"contextManagement": {
+		"description": "AI के संदर्भ विंडो में शामिल जानकारी को नियंत्रित करें, जो token उपयोग और प्रतिक्रिया गुणवत्ता को प्रभावित करता है",
+		"terminal": {
+			"label": "टर्मिनल आउटपुट सीमा",
+			"description": "कमांड निष्पादित करते समय टर्मिनल आउटपुट में शामिल करने के लिए पंक्तियों की अधिकतम संख्या। पार होने पर पंक्तियाँ मध्य से हटा दी जाएंगी, token बचाते हुए।"
+		},
+		"openTabs": {
+			"label": "खुले टैब संदर्भ सीमा",
+			"description": "संदर्भ में शामिल करने के लिए VSCode खुले टैब की अधिकतम संख्या। उच्च मान अधिक संदर्भ प्रदान करते हैं लेकिन token उपयोग बढ़ाते हैं।"
+		},
+		"workspaceFiles": {
+			"label": "वर्कस्पेस फाइल संदर्भ सीमा",
+			"description": "वर्तमान कार्य निर्देशिका विवरण में शामिल करने के लिए फाइलों की अधिकतम संख्या। उच्च मान अधिक संदर्भ प्रदान करते हैं लेकिन token उपयोग बढ़ाते हैं।"
+		},
+		"rooignore": {
+			"label": "सूचियों और खोजों में .rooignore फाइलें दिखाएँ",
+			"description": "जब सक्षम होता है, .rooignore में पैटर्न से मेल खाने वाली फाइलें लॉक प्रतीक के साथ सूचियों में दिखाई जाएंगी। जब अक्षम होता है, ये फाइलें फाइल सूचियों और खोजों से पूरी तरह छिपा दी जाएंगी।"
+		}
+	},
+	"advanced": {
+		"rateLimit": {
+			"label": "दर सीमा",
+			"description": "API अनुरोधों के बीच न्यूनतम समय।"
+		},
+		"diff": {
+			"label": "diffs के माध्यम से संपादन सक्षम करें",
+			"description": "जब सक्षम होता है, Roo फाइलों को तेजी से संपादित कर सकेगा और स्वचालित रूप से काटे गए पूर्ण-फाइल लेखन को अस्वीकार करेगा। नवीनतम Claude 3.7 Sonnet मॉडल के साथ सबसे अच्छा काम करता है।",
+			"strategy": {
+				"label": "Diff रणनीति",
+				"options": {
+					"standard": "मानक (एकल ब्लॉक)",
+					"multiBlock": "प्रायोगिक: मल्टी-ब्लॉक diff",
+					"unified": "प्रायोगिक: एकीकृत diff"
+				},
+				"descriptions": {
+					"standard": "मानक diff रणनीति एक समय में एक कोड ब्लॉक पर परिवर्तन लागू करती है।",
+					"unified": "एकीकृत diff रणनीति diffs लागू करने के लिए कई दृष्टिकोण लेती है और सर्वोत्तम दृष्टिकोण चुनती है।",
+					"multiBlock": "मल्टी-ब्लॉक diff रणनीति एक अनुरोध में एक फाइल में कई कोड ब्लॉक अपडेट करने की अनुमति देती है।"
+				}
+			},
+			"matchPrecision": {
+				"label": "मिलान सटीकता",
+				"description": "यह स्लाइडर नियंत्रित करता है कि diffs लागू करते समय कोड अनुभागों को कितनी सटीकता से मेल खाना चाहिए। निम्न मान अधिक लचीले मिलान की अनुमति देते हैं लेकिन गलत प्रतिस्थापन का जोखिम बढ़ाते हैं। 100% से नीचे के मानों का उपयोग अत्यधिक सावधानी के साथ करें।"
+			}
+		}
+	},
+	"experimental": {
+		"warning": "⚠️",
+		"DIFF_STRATEGY": {
+			"name": "प्रायोगिक एकीकृत diff रणनीति का उपयोग करें",
+			"description": "प्रायोगिक एकीकृत diff रणनीति सक्षम करें। यह रणनीति मॉडल त्रुटियों के कारण पुनः प्रयासों की संख्या को कम कर सकती है, लेकिन अप्रत्याशित व्यवहार या गलत संपादन का कारण बन सकती है। केवल तभी सक्षम करें जब आप जोखिमों को समझते हों और सभी परिवर्तनों की सावधानीपूर्वक समीक्षा करने के लिए तैयार हों।"
+		},
+		"SEARCH_AND_REPLACE": {
+			"name": "प्रायोगिक खोज और प्रतिस्थापन उपकरण का उपयोग करें",
+			"description": "प्रायोगिक खोज और प्रतिस्थापन उपकरण सक्षम करें, जो Roo को एक अनुरोध में खोज शब्द के कई उदाहरणों को बदलने की अनुमति देता है।"
+		},
+		"INSERT_BLOCK": {
+			"name": "प्रायोगिक सामग्री सम्मिलित करने के उपकरण का उपयोग करें",
+			"description": "प्रायोगिक सामग्री सम्मिलित करने के उपकरण को सक्षम करें, जो Roo को diff बनाए बिना विशिष्ट लाइन नंबरों पर सामग्री सम्मिलित करने की अनुमति देता है।"
+		},
+		"POWER_STEERING": {
+			"name": "प्रायोगिक \"पावर स्टीयरिंग\" मोड का उपयोग करें",
+			"description": "जब सक्षम किया जाता है, तो Roo मॉडल को उसके वर्तमान मोड परिभाषा के विवरण के बारे में अधिक बार याद दिलाएगा। इससे भूमिका परिभाषाओं और कस्टम निर्देशों के प्रति अधिक मजबूत अनुपालन होगा, लेकिन प्रति संदेश अधिक token का उपयोग होगा।"
+		},
+		"MULTI_SEARCH_AND_REPLACE": {
+			"name": "प्रायोगिक मल्टी ब्लॉक diff उपकरण का उपयोग करें",
+			"description": "जब सक्षम किया जाता है, तो Roo मल्टी ब्लॉक diff उपकरण का उपयोग करेगा। यह एक अनुरोध में फ़ाइल में कई कोड ब्लॉक अपडेट करने का प्रयास करेगा।"
+		}
+	},
+	"temperature": {
+		"useCustom": "कस्टम तापमान का उपयोग करें",
+		"description": "मॉडल की प्रतिक्रियाओं में यादृच्छिकता को नियंत्रित करता है।",
+		"rangeDescription": "उच्च मान आउटपुट को अधिक यादृच्छिक बनाते हैं, निम्न मान इसे अधिक निर्धारित बनाते हैं।"
+	},
+	"modelInfo": {
+		"supportsImages": "छवियों का समर्थन करता है",
+		"noImages": "छवियों का समर्थन नहीं करता है",
+		"supportsComputerUse": "कंप्यूटर उपयोग का समर्थन करता है",
+		"noComputerUse": "कंप्यूटर उपयोग का समर्थन नहीं करता है",
+		"supportsPromptCache": "प्रॉम्प्ट कैशिंग का समर्थन करता है",
+		"noPromptCache": "प्रॉम्प्ट कैशिंग का समर्थन नहीं करता है",
+		"maxOutput": "अधिकतम आउटपुट",
+		"inputPrice": "इनपुट मूल्य",
+		"outputPrice": "आउटपुट मूल्य",
+		"cacheReadsPrice": "कैश रीड्स मूल्य",
+		"cacheWritesPrice": "कैश राइट्स मूल्य",
+		"gemini": {
+			"freeRequests": "* प्रति मिनट {{count}} अनुरोधों तक मुफ्त। उसके बाद, बिलिंग प्रॉम्प्ट आकार पर निर्भर करती है।",
+			"pricingDetails": "अधिक जानकारी के लिए, मूल्य निर्धारण विवरण देखें।"
+		}
+	},
+	"modelPicker": {
+		"automaticFetch": "एक्सटेंशन <serviceLink>{{serviceName}}</serviceLink> पर उपलब्ध मॉडलों की नवीनतम सूची स्वचालित रूप से प्राप्त करता है। यदि आप अनिश्चित हैं कि कौन सा मॉडल चुनना है, तो Roo Code <defaultModelLink>{{defaultModelId}}</defaultModelLink> के साथ सबसे अच्छा काम करता है। आप वर्तमान में उपलब्ध निःशुल्क विकल्पों के लिए \"free\" भी खोज सकते हैं।"
+	},
+	"footer": {
+		"feedback": "यदि आपके कोई प्रश्न या प्रतिक्रिया है, तो <githubLink>github.com/RooVetGit/Roo-Code</githubLink> पर एक मुद्दा खोलने या <redditLink>reddit.com/r/RooCode</redditLink> या <discordLink>discord.gg/roocode</discordLink> में शामिल होने में संकोच न करें",
+		"version": "Roo Code v{{version}}",
+		"telemetry": {
+			"label": "गुमनाम त्रुटि और उपयोग रिपोर्टिंग की अनुमति दें",
+			"description": "गुमनाम उपयोग डेटा और त्रुटि रिपोर्ट भेजकर Roo Code को बेहतर बनाने में मदद करें। कोड, प्रॉम्प्ट, या व्यक्तिगत जानकारी कभी भी नहीं भेजी जाती है। अधिक विवरण के लिए हमारी गोपनीयता नीति देखें।"
+		},
+		"reset": {
+			"description": "एक्सटेंशन में सभी वैश्विक स्थिति और गुप्त भंडारण को रीसेट करें।",
+			"button": "रीसेट करें"
+		}
+	}
+}

+ 9 - 1
webview-ui/src/i18n/locales/hi/welcome.json

@@ -2,5 +2,13 @@
 	"greeting": "नमस्ते, मैं रू हूँ!",
 	"greeting": "नमस्ते, मैं रू हूँ!",
 	"introduction": "मैं सभी प्रकार के कार्य कर सकता हूँ, एजेंटिक कोडिंग क्षमताओं में नवीनतम सफलताओं और उन टूल्स तक पहुंच के लिए धन्यवाद जो मुझे फाइलें बनाने और संपादित करने, जटिल परियोजनाओं का पता लगाने, ब्राउज़र का उपयोग करने और टर्मिनल कमांड निष्पादित करने की अनुमति देते हैं (आपकी अनुमति से, बिल्कुल)। मैं MCP का उपयोग करके नए टूल बना सकता हूँ और अपनी क्षमताओं का विस्तार कर सकता हूँ।",
 	"introduction": "मैं सभी प्रकार के कार्य कर सकता हूँ, एजेंटिक कोडिंग क्षमताओं में नवीनतम सफलताओं और उन टूल्स तक पहुंच के लिए धन्यवाद जो मुझे फाइलें बनाने और संपादित करने, जटिल परियोजनाओं का पता लगाने, ब्राउज़र का उपयोग करने और टर्मिनल कमांड निष्पादित करने की अनुमति देते हैं (आपकी अनुमति से, बिल्कुल)। मैं MCP का उपयोग करके नए टूल बना सकता हूँ और अपनी क्षमताओं का विस्तार कर सकता हूँ।",
 	"notice": "शुरू करने के लिए, इस एक्सटेंशन को एक API प्रदाता की आवश्यकता है।",
 	"notice": "शुरू करने के लिए, इस एक्सटेंशन को एक API प्रदाता की आवश्यकता है।",
-	"start": "चलो शुरू करें!"
+	"start": "चलो शुरू करें!",
+	"telemetry": {
+		"title": "Roo Code को बेहतर बनाने में मदद करें",
+		"anonymousTelemetry": "बग ठीक करने और एक्सटेंशन को बेहतर बनाने में हमारी मदद करने के लिए गुमनाम त्रुटि और उपयोग डेटा भेजें। कोड, संकेत या व्यक्तिगत जानकारी कभी नहीं भेजी जाती है।",
+		"changeSettings": "आप इसे हमेशा सेटिंग्स के निचले भाग में बदल सकते हैं",
+		"settings": "सेटिंग्स",
+		"allow": "अनुमति दें",
+		"deny": "अस्वीकार करें"
+	}
 }
 }

+ 0 - 0
webview-ui/src/i18n/locales/hu/.gitkeep


+ 0 - 113
webview-ui/src/i18n/locales/hu/chat.json

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

+ 0 - 8
webview-ui/src/i18n/locales/hu/common.json

@@ -1,8 +0,0 @@
-{
-	"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"
-}

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

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

+ 0 - 52
webview-ui/src/i18n/locales/hu/mcp.json

@@ -1,52 +0,0 @@
-{
-	"title": "MCP szerverek",
-	"done": "Kész",
-	"description": "A <0>Model Context Protocol</0> lehetővé teszi a kommunikációt a helyileg futó MCP szerverekkel, amelyek további eszközöket és erőforrásokat biztosítanak a Roo képességeinek kiterjesztéséhez. Használhatsz <1>közösség által készített szervereket</1>, vagy megkérheted a Roo-t, hogy hozzon létre új, a munkafolyamatodhoz specifikus eszközöket (pl. \"adj hozzá egy eszközt, amely lekéri a legfrissebb npm dokumentációt\").",
-	"enableToggle": {
-		"title": "MCP szerverek engedélyezése",
-		"description": "Ha engedélyezve van, a Roo képes lesz kommunikálni az MCP szerverekkel a speciális funkciók érdekében. Ha nem használsz MCP-t, kikapcsolhatod ezt, hogy csökkentsd a Roo token használatát."
-	},
-	"enableServerCreation": {
-		"title": "MCP szerver létrehozás engedélyezése",
-		"description": "Ha engedélyezve van, a Roo segíthet új MCP szerverek létrehozásában olyan parancsokkal, mint \"új eszköz hozzáadása...\". Ha nincs szükséged MCP szerverek létrehozására, kikapcsolhatod ezt, hogy csökkentsd a Roo token használatát."
-	},
-	"editGlobalMCP": "Globális MCP szerkesztése",
-	"editProjectMCP": "Projekt MCP szerkesztése",
-	"tool": {
-		"alwaysAllow": "Mindig engedélyez",
-		"parameters": "Paraméterek",
-		"noDescription": "Nincs leírás"
-	},
-	"tabs": {
-		"tools": "Eszközök",
-		"resources": "Erőforrások"
-	},
-	"emptyState": {
-		"noTools": "Nem található eszköz",
-		"noResources": "Nem található erőforrás"
-	},
-	"networkTimeout": {
-		"label": "Hálózati időtúllépés",
-		"description": "Maximális várakozási idő a szerver válaszaira",
-		"options": {
-			"15seconds": "15 másodperc",
-			"30seconds": "30 másodperc",
-			"1minute": "1 perc",
-			"5minutes": "5 perc",
-			"10minutes": "10 perc",
-			"15minutes": "15 perc",
-			"30minutes": "30 perc",
-			"60minutes": "60 perc"
-		}
-	},
-	"deleteDialog": {
-		"title": "MCP szerver törlése",
-		"description": "Biztosan törölni szeretnéd a(z) \"{{serverName}}\" MCP szervert? Ez a művelet nem vonható vissza.",
-		"cancel": "Mégse",
-		"delete": "Törlés"
-	},
-	"serverStatus": {
-		"retrying": "Újrapróbálás...",
-		"retryConnection": "Kapcsolat újrapróbálása"
-	}
-}

+ 0 - 140
webview-ui/src/i18n/locales/hu/prompts.json

@@ -1,140 +0,0 @@
-{
-	"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"
-}

+ 0 - 6
webview-ui/src/i18n/locales/hu/welcome.json

@@ -1,6 +0,0 @@
-{
-	"greeting": "Szia, én Roo vagyok!",
-	"introduction": "Mindenféle feladatot el tudok látni az ügynök-alapú kódolási képességek legújabb áttöréseinek és az eszközökhez való hozzáférésnek köszönhetően, amelyek lehetővé teszik számomra fájlok létrehozását és szerkesztését, összetett projektek felfedezését, böngésző használatát és terminálparancsok végrehajtását (természetesen az Ön engedélyével). 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.",
-	"notice": "A kezdéshez ez a bővítmény egy API szolgáltatót igényel.",
-	"start": "Gyerünk!"
-}

+ 1 - 8
webview-ui/src/i18n/locales/it/common.json

@@ -1,8 +1 @@
-{
-	"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"
-}
+{}

+ 8 - 1
webview-ui/src/i18n/locales/it/prompts.json

@@ -18,7 +18,14 @@
 		"builtInModesText": "Gli strumenti per le modalità integrate non possono essere modificati",
 		"builtInModesText": "Gli strumenti per le modalità integrate non possono essere modificati",
 		"editTools": "Modifica strumenti",
 		"editTools": "Modifica strumenti",
 		"doneEditing": "Modifica completata",
 		"doneEditing": "Modifica completata",
-		"allowedFiles": "File consentiti:"
+		"allowedFiles": "File consentiti:",
+		"toolNames": {
+			"read": "Leggi file",
+			"edit": "Modifica file",
+			"browser": "Usa browser",
+			"command": "Esegui comandi",
+			"mcp": "Usa MCP"
+		}
 	},
 	},
 	"roleDefinition": {
 	"roleDefinition": {
 		"title": "Definizione del ruolo",
 		"title": "Definizione del ruolo",

+ 228 - 0
webview-ui/src/i18n/locales/it/settings.json

@@ -0,0 +1,228 @@
+{
+	"common": {
+		"save": "Salva",
+		"done": "Fatto",
+		"cancel": "Annulla",
+		"reset": "Ripristina"
+	},
+	"header": {
+		"title": "Impostazioni",
+		"saveButtonTooltip": "Salva modifiche",
+		"nothingChangedTooltip": "Nessuna modifica",
+		"doneButtonTooltip": "Scarta le modifiche non salvate e chiudi il pannello delle impostazioni"
+	},
+	"unsavedChangesDialog": {
+		"title": "Modifiche non salvate",
+		"description": "Vuoi scartare le modifiche e continuare?",
+		"cancelButton": "Annulla",
+		"discardButton": "Scarta modifiche"
+	},
+	"sections": {
+		"providers": "Fornitori",
+		"autoApprove": "Approvazione automatica",
+		"browser": "Browser / Uso del computer",
+		"checkpoints": "Punti di controllo",
+		"notifications": "Notifiche",
+		"contextManagement": "Gestione del contesto",
+		"advanced": "Avanzate",
+		"experimental": "Funzionalità sperimentali"
+	},
+	"autoApprove": {
+		"description": "Permetti a Roo di eseguire automaticamente operazioni senza richiedere approvazione. Abilita queste impostazioni solo se ti fidi completamente dell'IA e comprendi i rischi di sicurezza associati.",
+		"readOnly": {
+			"label": "Approva sempre operazioni di sola lettura",
+			"description": "Quando abilitato, Roo visualizzerà automaticamente i contenuti della directory e leggerà i file senza richiedere di cliccare sul pulsante Approva."
+		},
+		"write": {
+			"label": "Approva sempre operazioni di scrittura",
+			"description": "Crea e modifica automaticamente i file senza richiedere approvazione",
+			"delayLabel": "Ritardo dopo le scritture per consentire alla diagnostica di rilevare potenziali problemi"
+		},
+		"browser": {
+			"label": "Approva sempre azioni del browser",
+			"description": "Esegui automaticamente azioni del browser senza richiedere approvazione",
+			"note": "Nota: Si applica solo quando il modello supporta l'uso del computer"
+		},
+		"retry": {
+			"label": "Riprova sempre le richieste API fallite",
+			"description": "Riprova automaticamente le richieste API fallite quando il server restituisce una risposta di errore",
+			"delayLabel": "Ritardo prima di riprovare la richiesta"
+		},
+		"mcp": {
+			"label": "Approva sempre strumenti MCP",
+			"description": "Abilita l'approvazione automatica dei singoli strumenti MCP nella vista Server MCP (richiede sia questa impostazione che la casella \"Consenti sempre\" dello strumento)"
+		},
+		"modeSwitch": {
+			"label": "Approva sempre cambi di modalità",
+			"description": "Passa automaticamente tra diverse modalità senza richiedere approvazione"
+		},
+		"subtasks": {
+			"label": "Approva sempre creazione e completamento di attività secondarie",
+			"description": "Consenti la creazione e il completamento di attività secondarie senza richiedere approvazione"
+		},
+		"execute": {
+			"label": "Approva sempre operazioni di esecuzione consentite",
+			"description": "Esegui automaticamente i comandi del terminale consentiti senza richiedere approvazione",
+			"allowedCommands": "Comandi di auto-esecuzione consentiti",
+			"allowedCommandsDescription": "Prefissi di comando che possono essere auto-eseguiti quando \"Approva sempre operazioni di esecuzione\" è abilitato. Aggiungi * per consentire tutti i comandi (usare con cautela).",
+			"commandPlaceholder": "Inserisci prefisso comando (es. 'git ')",
+			"addButton": "Aggiungi"
+		}
+	},
+	"providers": {
+		"configProfile": "Profilo di configurazione",
+		"description": "Descrizione",
+		"apiProvider": "Fornitore API",
+		"openRouterApiKey": "Chiave API OpenRouter",
+		"apiKeyStorageNotice": "Le chiavi API sono memorizzate in modo sicuro nell'Archivio Segreto di VSCode",
+		"useCustomBaseUrl": "Usa URL base personalizzato",
+		"openRouterTransformsText": "Comprimi prompt e catene di messaggi alla dimensione del contesto (<a>Trasformazioni OpenRouter</a>)"
+	},
+	"browser": {
+		"enable": {
+			"label": "Abilita strumento browser",
+			"description": "Quando abilitato, Roo può utilizzare un browser per interagire con siti web quando si utilizzano modelli che supportano l'uso del computer."
+		},
+		"viewport": {
+			"label": "Dimensione viewport",
+			"description": "Seleziona la dimensione del viewport per le interazioni del browser. Questo influisce su come i siti web vengono visualizzati e su come vi si interagisce.",
+			"options": {
+				"largeDesktop": "Desktop grande (1280x800)",
+				"smallDesktop": "Desktop piccolo (900x600)",
+				"tablet": "Tablet (768x1024)",
+				"mobile": "Mobile (360x640)"
+			}
+		},
+		"screenshotQuality": {
+			"label": "Qualità screenshot",
+			"description": "Regola la qualità WebP degli screenshot del browser. Valori più alti forniscono screenshot più nitidi ma aumentano l'utilizzo di token."
+		},
+		"remote": {
+			"label": "Usa connessione browser remoto",
+			"description": "Connettiti a un browser Chrome in esecuzione con debug remoto abilitato (--remote-debugging-port=9222).",
+			"urlPlaceholder": "URL personalizzato (es. http://localhost:9222)",
+			"testButton": "Testa connessione",
+			"testingButton": "Test in corso...",
+			"instructions": "Inserisci l'indirizzo host del protocollo DevTools o lascia vuoto per scoprire automaticamente le istanze Chrome locali. Il pulsante Test Connessione proverà l'URL personalizzato se fornito, o scoprirà automaticamente se il campo è vuoto."
+		}
+	},
+	"checkpoints": {
+		"enable": {
+			"label": "Abilita punti di controllo automatici",
+			"description": "Quando abilitato, Roo creerà automaticamente punti di controllo durante l'esecuzione dei compiti, facilitando la revisione delle modifiche o il ritorno a stati precedenti."
+		}
+	},
+	"notifications": {
+		"sound": {
+			"label": "Abilita effetti sonori",
+			"description": "Quando abilitato, Roo riprodurrà effetti sonori per notifiche ed eventi.",
+			"volumeLabel": "Volume"
+		}
+	},
+	"contextManagement": {
+		"description": "Controlla quali informazioni sono incluse nella finestra di contesto dell'IA, influenzando l'utilizzo di token e la qualità delle risposte",
+		"terminal": {
+			"label": "Limite output terminale",
+			"description": "Numero massimo di righe da includere nell'output del terminale durante l'esecuzione dei comandi. Quando superato, le righe verranno rimosse dal centro, risparmiando token."
+		},
+		"openTabs": {
+			"label": "Limite contesto schede aperte",
+			"description": "Numero massimo di schede VSCode aperte da includere nel contesto. Valori più alti forniscono più contesto ma aumentano l'utilizzo di token."
+		},
+		"workspaceFiles": {
+			"label": "Limite contesto file area di lavoro",
+			"description": "Numero massimo di file da includere nei dettagli della directory di lavoro corrente. Valori più alti forniscono più contesto ma aumentano l'utilizzo di token."
+		},
+		"rooignore": {
+			"label": "Mostra file .rooignore negli elenchi e nelle ricerche",
+			"description": "Quando abilitato, i file che corrispondono ai pattern in .rooignore verranno mostrati negli elenchi con un simbolo di blocco. Quando disabilitato, questi file saranno completamente nascosti dagli elenchi di file e dalle ricerche."
+		}
+	},
+	"advanced": {
+		"rateLimit": {
+			"label": "Limite di frequenza",
+			"description": "Tempo minimo tra le richieste API."
+		},
+		"diff": {
+			"label": "Abilita modifica tramite diff",
+			"description": "Quando abilitato, Roo sarà in grado di modificare i file più velocemente e rifiuterà automaticamente scritture di file completi troncati. Funziona meglio con l'ultimo modello Claude 3.7 Sonnet.",
+			"strategy": {
+				"label": "Strategia diff",
+				"options": {
+					"standard": "Standard (Blocco singolo)",
+					"multiBlock": "Sperimentale: Diff multi-blocco",
+					"unified": "Sperimentale: Diff unificato"
+				},
+				"descriptions": {
+					"standard": "La strategia diff standard applica modifiche a un singolo blocco di codice alla volta.",
+					"unified": "La strategia diff unificato adotta diversi approcci per applicare i diff e sceglie il migliore.",
+					"multiBlock": "La strategia diff multi-blocco consente di aggiornare più blocchi di codice in un file in una singola richiesta."
+				}
+			},
+			"matchPrecision": {
+				"label": "Precisione corrispondenza",
+				"description": "Questo cursore controlla quanto precisamente le sezioni di codice devono corrispondere quando si applicano i diff. Valori più bassi consentono corrispondenze più flessibili ma aumentano il rischio di sostituzioni errate. Usa valori inferiori al 100% con estrema cautela."
+			}
+		}
+	},
+	"experimental": {
+		"warning": "⚠️",
+		"DIFF_STRATEGY": {
+			"name": "Usa strategia diff unificata sperimentale",
+			"description": "Abilita la strategia diff unificata sperimentale. Questa strategia potrebbe ridurre il numero di tentativi causati da errori del modello, ma può causare comportamenti imprevisti o modifiche errate. Abilitala solo se comprendi i rischi e sei disposto a rivedere attentamente tutte le modifiche."
+		},
+		"SEARCH_AND_REPLACE": {
+			"name": "Usa strumento di ricerca e sostituzione sperimentale",
+			"description": "Abilita lo strumento di ricerca e sostituzione sperimentale, consentendo a Roo di sostituire più istanze di un termine di ricerca in una singola richiesta."
+		},
+		"INSERT_BLOCK": {
+			"name": "Usa strumento di inserimento contenuti sperimentale",
+			"description": "Abilita lo strumento di inserimento contenuti sperimentale, consentendo a Roo di inserire contenuti a numeri di riga specifici senza dover creare un diff."
+		},
+		"POWER_STEERING": {
+			"name": "Usa modalità \"servosterzo\" sperimentale",
+			"description": "Quando abilitato, Roo ricorderà al modello i dettagli della sua definizione di modalità corrente più frequentemente. Questo porterà a una maggiore aderenza alle definizioni dei ruoli e alle istruzioni personalizzate, ma utilizzerà più token per messaggio."
+		},
+		"MULTI_SEARCH_AND_REPLACE": {
+			"name": "Usa strumento diff multi-blocco sperimentale",
+			"description": "Quando abilitato, Roo utilizzerà lo strumento diff multi-blocco. Questo tenterà di aggiornare più blocchi di codice nel file in una singola richiesta."
+		}
+	},
+	"temperature": {
+		"useCustom": "Usa temperatura personalizzata",
+		"description": "Controlla la casualità nelle risposte del modello.",
+		"rangeDescription": "Valori più alti rendono l'output più casuale, valori più bassi lo rendono più deterministico."
+	},
+	"modelInfo": {
+		"supportsImages": "Supporta immagini",
+		"noImages": "Non supporta immagini",
+		"supportsComputerUse": "Supporta uso del computer",
+		"noComputerUse": "Non supporta uso del computer",
+		"supportsPromptCache": "Supporta cache dei prompt",
+		"noPromptCache": "Non supporta cache dei prompt",
+		"maxOutput": "Output massimo",
+		"inputPrice": "Prezzo input",
+		"outputPrice": "Prezzo output",
+		"cacheReadsPrice": "Prezzo letture cache",
+		"cacheWritesPrice": "Prezzo scritture cache",
+		"gemini": {
+			"freeRequests": "* Gratuito fino a {{count}} richieste al minuto. Dopo, la fatturazione dipende dalla dimensione del prompt.",
+			"pricingDetails": "Per maggiori informazioni, vedi i dettagli sui prezzi."
+		}
+	},
+	"modelPicker": {
+		"automaticFetch": "L'estensione recupera automaticamente l'elenco più recente dei modelli disponibili su <serviceLink>{{serviceName}}</serviceLink>. Se non sei sicuro di quale modello scegliere, Roo Code funziona meglio con <defaultModelLink>{{defaultModelId}}</defaultModelLink>. Puoi anche cercare \"free\" per opzioni gratuite attualmente disponibili."
+	},
+	"footer": {
+		"feedback": "Se hai domande o feedback, sentiti libero di aprire un issue su <githubLink>github.com/RooVetGit/Roo-Code</githubLink> o unirti a <redditLink>reddit.com/r/RooCode</redditLink> o <discordLink>discord.gg/roocode</discordLink>",
+		"version": "Roo Code v{{version}}",
+		"telemetry": {
+			"label": "Consenti segnalazioni anonime di errori e utilizzo",
+			"description": "Aiuta a migliorare Roo Code inviando dati di utilizzo anonimi e segnalazioni di errori. Non vengono mai inviati codice, prompt o informazioni personali. Consulta la nostra politica sulla privacy per maggiori dettagli."
+		},
+		"reset": {
+			"description": "Reimposta tutti gli stati globali e l'archivio segreto nell'estensione.",
+			"button": "Ripristina"
+		}
+	}
+}

+ 9 - 1
webview-ui/src/i18n/locales/it/welcome.json

@@ -2,5 +2,13 @@
 	"greeting": "Ciao, sono Roo!",
 	"greeting": "Ciao, sono Roo!",
 	"introduction": "Posso svolgere tutti i tipi di attività grazie ai più recenti progressi nelle capacità di codifica agentica e all'accesso a strumenti che mi permettono di creare e modificare file, esplorare progetti complessi, utilizzare il browser ed eseguire comandi terminal (con il tuo permesso, ovviamente). Posso persino utilizzare MCP per creare nuovi strumenti ed estendere le mie capacità.",
 	"introduction": "Posso svolgere tutti i tipi di attività grazie ai più recenti progressi nelle capacità di codifica agentica e all'accesso a strumenti che mi permettono di creare e modificare file, esplorare progetti complessi, utilizzare il browser ed eseguire comandi terminal (con il tuo permesso, ovviamente). Posso persino utilizzare MCP per creare nuovi strumenti ed estendere le mie capacità.",
 	"notice": "Per iniziare, questa estensione necessita di un fornitore di API.",
 	"notice": "Per iniziare, questa estensione necessita di un fornitore di API.",
-	"start": "Andiamo!"
+	"start": "Andiamo!",
+	"telemetry": {
+		"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"
+	}
 }
 }

+ 1 - 8
webview-ui/src/i18n/locales/ja/common.json

@@ -1,8 +1 @@
-{
-	"title": "Roo Codeの改善にご協力ください",
-	"anonymousTelemetry": "バグの修正と拡張機能の改善のため、匿名のエラーと使用データを送信してください。コード、プロンプト、個人情報は一切送信されません。",
-	"changeSettings": "設定の下部でいつでも変更できます",
-	"settings": "設定",
-	"allow": "許可",
-	"deny": "拒否"
-}
+{}

+ 8 - 1
webview-ui/src/i18n/locales/ja/prompts.json

@@ -18,7 +18,14 @@
 		"builtInModesText": "組み込みモードのツールは変更できません",
 		"builtInModesText": "組み込みモードのツールは変更できません",
 		"editTools": "ツールを編集",
 		"editTools": "ツールを編集",
 		"doneEditing": "編集完了",
 		"doneEditing": "編集完了",
-		"allowedFiles": "許可されたファイル:"
+		"allowedFiles": "許可されたファイル:",
+		"toolNames": {
+			"read": "ファイルを読み込む",
+			"edit": "ファイルを編集",
+			"browser": "ブラウザを使用",
+			"command": "コマンドを実行",
+			"mcp": "MCP を使用"
+		}
 	},
 	},
 	"roleDefinition": {
 	"roleDefinition": {
 		"title": "役割の定義",
 		"title": "役割の定義",

+ 228 - 0
webview-ui/src/i18n/locales/ja/settings.json

@@ -0,0 +1,228 @@
+{
+	"common": {
+		"save": "保存",
+		"done": "完了",
+		"cancel": "キャンセル",
+		"reset": "リセット"
+	},
+	"header": {
+		"title": "設定",
+		"saveButtonTooltip": "変更を保存",
+		"nothingChangedTooltip": "変更なし",
+		"doneButtonTooltip": "未保存の変更を破棄して設定パネルを閉じる"
+	},
+	"unsavedChangesDialog": {
+		"title": "未保存の変更",
+		"description": "変更を破棄して続行しますか?",
+		"cancelButton": "キャンセル",
+		"discardButton": "変更を破棄"
+	},
+	"sections": {
+		"providers": "プロバイダー",
+		"autoApprove": "自動承認",
+		"browser": "ブラウザ / コンピューター使用",
+		"checkpoints": "チェックポイント",
+		"notifications": "通知",
+		"contextManagement": "コンテキスト管理",
+		"advanced": "詳細設定",
+		"experimental": "実験的機能"
+	},
+	"autoApprove": {
+		"description": "Rooが承認なしで自動的に操作を実行できるようにします。AIを完全に信頼し、関連するセキュリティリスクを理解している場合にのみ、これらの設定を有効にしてください。",
+		"readOnly": {
+			"label": "読み取り専用操作を常に承認",
+			"description": "有効にすると、Rooは承認ボタンをクリックすることなく、自動的にディレクトリの内容を表示してファイルを読み取ります。"
+		},
+		"write": {
+			"label": "書き込み操作を常に承認",
+			"description": "承認なしで自動的にファイルを作成・編集",
+			"delayLabel": "診断が潜在的な問題を検出できるよう、書き込み後に遅延を設ける"
+		},
+		"browser": {
+			"label": "ブラウザアクションを常に承認",
+			"description": "承認なしで自動的にブラウザアクションを実行",
+			"note": "注意:コンピューター使用をサポートするモデルを使用している場合のみ適用されます"
+		},
+		"retry": {
+			"label": "失敗したAPIリクエストを常に再試行",
+			"description": "サーバーがエラーレスポンスを返した場合、自動的に失敗したAPIリクエストを再試行",
+			"delayLabel": "リクエスト再試行前の遅延"
+		},
+		"mcp": {
+			"label": "MCPツールを常に承認",
+			"description": "MCPサーバービューで個々のMCPツールの自動承認を有効にします(この設定とツールの「常に許可」チェックボックスの両方が必要)"
+		},
+		"modeSwitch": {
+			"label": "モード切り替えを常に承認",
+			"description": "承認なしで自動的に異なるモード間を切り替え"
+		},
+		"subtasks": {
+			"label": "サブタスクの作成と完了を常に承認",
+			"description": "承認なしでサブタスクの作成と完了を許可"
+		},
+		"execute": {
+			"label": "許可された実行操作を常に承認",
+			"description": "承認なしで自動的に許可されたターミナルコマンドを実行",
+			"allowedCommands": "許可された自動実行コマンド",
+			"allowedCommandsDescription": "「実行操作を常に承認」が有効な場合に自動実行できるコマンドプレフィックス。すべてのコマンドを許可するには * を追加します(注意して使用してください)。",
+			"commandPlaceholder": "コマンドプレフィックスを入力(例:'git ')",
+			"addButton": "追加"
+		}
+	},
+	"providers": {
+		"configProfile": "設定プロファイル",
+		"description": "説明",
+		"apiProvider": "APIプロバイダー",
+		"openRouterApiKey": "OpenRouter APIキー",
+		"apiKeyStorageNotice": "APIキーはVSCodeのシークレットストレージに安全に保存されます",
+		"useCustomBaseUrl": "カスタムベースURLを使用",
+		"openRouterTransformsText": "プロンプトとメッセージチェーンをコンテキストサイズに圧縮(<a>OpenRouter変換</a>)"
+	},
+	"browser": {
+		"enable": {
+			"label": "ブラウザツールを有効化",
+			"description": "有効にすると、コンピューター使用をサポートするモデルを使用する際に、Rooはウェブサイトとのやり取りにブラウザを使用できます。"
+		},
+		"viewport": {
+			"label": "ビューポートサイズ",
+			"description": "ブラウザインタラクションのビューポートサイズを選択します。これはウェブサイトの表示方法とインタラクション方法に影響します。",
+			"options": {
+				"largeDesktop": "大型デスクトップ (1280x800)",
+				"smallDesktop": "小型デスクトップ (900x600)",
+				"tablet": "タブレット (768x1024)",
+				"mobile": "モバイル (360x640)"
+			}
+		},
+		"screenshotQuality": {
+			"label": "スクリーンショット品質",
+			"description": "ブラウザスクリーンショットのWebP品質を調整します。高い値はより鮮明なスクリーンショットを提供しますが、token使用量が増加します。"
+		},
+		"remote": {
+			"label": "リモートブラウザ接続を使用",
+			"description": "リモートデバッグを有効にして実行しているChromeブラウザに接続します(--remote-debugging-port=9222)。",
+			"urlPlaceholder": "カスタムURL(例:http://localhost:9222)",
+			"testButton": "接続テスト",
+			"testingButton": "テスト中...",
+			"instructions": "DevToolsプロトコルホストアドレスを入力するか、Chromeのローカルインスタンスを自動検出するために空のままにします。接続テストボタンは、提供されている場合はカスタムURLを試み、フィールドが空の場合は自動検出します。"
+		}
+	},
+	"checkpoints": {
+		"enable": {
+			"label": "自動チェックポイントを有効化",
+			"description": "有効にすると、Rooはタスク実行中に自動的にチェックポイントを作成し、変更の確認や以前の状態への復帰を容易にします。"
+		}
+	},
+	"notifications": {
+		"sound": {
+			"label": "サウンドエフェクトを有効化",
+			"description": "有効にすると、Rooは通知やイベントのためにサウンドエフェクトを再生します。",
+			"volumeLabel": "音量"
+		}
+	},
+	"contextManagement": {
+		"description": "AIのコンテキストウィンドウに含まれる情報を制御し、token使用量とレスポンスの品質に影響します",
+		"terminal": {
+			"label": "ターミナル出力制限",
+			"description": "コマンド実行時にターミナル出力に含める最大行数。超過すると中央から行が削除され、tokenを節約します。"
+		},
+		"openTabs": {
+			"label": "オープンタブコンテキスト制限",
+			"description": "コンテキストに含めるVSCodeオープンタブの最大数。高い値はより多くのコンテキストを提供しますが、token使用量が増加します。"
+		},
+		"workspaceFiles": {
+			"label": "ワークスペースファイルコンテキスト制限",
+			"description": "現在の作業ディレクトリの詳細に含めるファイルの最大数。高い値はより多くのコンテキストを提供しますが、token使用量が増加します。"
+		},
+		"rooignore": {
+			"label": "リストと検索で.rooignoreファイルを表示",
+			"description": "有効にすると、.rooignoreのパターンに一致するファイルがロックシンボル付きでリストに表示されます。無効にすると、これらのファイルはファイルリストや検索から完全に非表示になります。"
+		}
+	},
+	"advanced": {
+		"rateLimit": {
+			"label": "レート制限",
+			"description": "APIリクエスト間の最小時間。"
+		},
+		"diff": {
+			"label": "diff経由の編集を有効化",
+			"description": "有効にすると、Rooはファイルをより迅速に編集でき、切り詰められた全ファイル書き込みを自動的に拒否します。最新のClaude 3.7 Sonnetモデルで最良に機能します。",
+			"strategy": {
+				"label": "Diff戦略",
+				"options": {
+					"standard": "標準(単一ブロック)",
+					"multiBlock": "実験的:マルチブロックdiff",
+					"unified": "実験的:統合diff"
+				},
+				"descriptions": {
+					"standard": "標準diff戦略は一度に1つのコードブロックに変更を適用します。",
+					"unified": "統合diff戦略はdiffを適用するための複数のアプローチを取り、最良のアプローチを選択します。",
+					"multiBlock": "マルチブロックdiff戦略は、1つのリクエストでファイル内の複数のコードブロックを更新できます。"
+				}
+			},
+			"matchPrecision": {
+				"label": "マッチ精度",
+				"description": "このスライダーは、diffを適用する際にコードセクションがどれだけ正確に一致する必要があるかを制御します。低い値はより柔軟なマッチングを可能にしますが、誤った置換のリスクが高まります。100%未満の値は細心の注意を払って使用してください。"
+			}
+		}
+	},
+	"experimental": {
+		"warning": "⚠️",
+		"DIFF_STRATEGY": {
+			"name": "実験的な統合diff戦略を使用する",
+			"description": "実験的な統合diff戦略を有効にします。この戦略はモデルエラーによる再試行の回数を減らす可能性がありますが、予期しない動作や不正確な編集を引き起こす可能性があります。リスクを理解し、すべての変更を注意深く確認する準備がある場合にのみ有効にしてください。"
+		},
+		"SEARCH_AND_REPLACE": {
+			"name": "実験的な検索と置換ツールを使用する",
+			"description": "実験的な検索と置換ツールを有効にし、Rooが1つのリクエストで検索語の複数のインスタンスを置き換えることを可能にします。"
+		},
+		"INSERT_BLOCK": {
+			"name": "実験的なコンテンツ挿入ツールを使用する",
+			"description": "実験的なコンテンツ挿入ツールを有効にし、Rooがdiffを作成せずに特定の行番号にコンテンツを挿入できるようにします。"
+		},
+		"POWER_STEERING": {
+			"name": "実験的な「パワーステアリング」モードを使用する",
+			"description": "有効にすると、Rooはより頻繁にモデルに現在のモード定義の詳細を思い出させます。これにより、役割定義とカスタム指示へのより強い遵守が実現しますが、メッセージごとにより多くのtokenを使用します。"
+		},
+		"MULTI_SEARCH_AND_REPLACE": {
+			"name": "実験的なマルチブロックdiffツールを使用する",
+			"description": "有効にすると、Rooはマルチブロックdiffツールを使用します。これにより、1つのリクエストでファイル内の複数のコードブロックを更新しようとします。"
+		}
+	},
+	"temperature": {
+		"useCustom": "カスタム温度を使用",
+		"description": "モデルの応答のランダム性を制御します。",
+		"rangeDescription": "高い値は出力をよりランダムに、低い値はより決定論的にします。"
+	},
+	"modelInfo": {
+		"supportsImages": "画像をサポート",
+		"noImages": "画像をサポートしていません",
+		"supportsComputerUse": "コンピューター使用をサポート",
+		"noComputerUse": "コンピューター使用をサポートしていません",
+		"supportsPromptCache": "プロンプトキャッシュをサポート",
+		"noPromptCache": "プロンプトキャッシュをサポートしていません",
+		"maxOutput": "最大出力",
+		"inputPrice": "入力価格",
+		"outputPrice": "出力価格",
+		"cacheReadsPrice": "キャッシュ読み取り価格",
+		"cacheWritesPrice": "キャッシュ書き込み価格",
+		"gemini": {
+			"freeRequests": "* 毎分{{count}}リクエストまで無料。それ以降は、プロンプトサイズに応じて課金されます。",
+			"pricingDetails": "詳細については、価格詳細をご覧ください。"
+		}
+	},
+	"modelPicker": {
+		"automaticFetch": "拡張機能は<serviceLink>{{serviceName}}</serviceLink>で利用可能な最新のモデルリストを自動的に取得します。どのモデルを選ぶべきか迷っている場合、Roo Codeは<defaultModelLink>{{defaultModelId}}</defaultModelLink>で最適に動作します。また、「free」で検索すると、現在利用可能な無料オプションを見つけることができます。"
+	},
+	"footer": {
+		"feedback": "質問やフィードバックがある場合は、<githubLink>github.com/RooVetGit/Roo-Code</githubLink>で問題を開くか、<redditLink>reddit.com/r/RooCode</redditLink>や<discordLink>discord.gg/roocode</discordLink>に参加してください",
+		"version": "Roo Code v{{version}}",
+		"telemetry": {
+			"label": "匿名のエラーと使用状況レポートを許可",
+			"description": "匿名の使用データとエラーレポートを送信してRoo Codeの改善にご協力ください。コード、プロンプト、個人情報が送信されることはありません。詳細については、プライバシーポリシーをご覧ください。"
+		},
+		"reset": {
+			"description": "拡張機能内のすべてのグローバル状態とシークレットストレージをリセットします。",
+			"button": "リセット"
+		}
+	}
+}

+ 9 - 1
webview-ui/src/i18n/locales/ja/welcome.json

@@ -2,5 +2,13 @@
 	"greeting": "こんにちは、私はルーです!",
 	"greeting": "こんにちは、私はルーです!",
 	"introduction": "エージェント型コーディング能力の最新の進歩と、ファイルの作成・編集、複雑なプロジェクトの探索、ブラウザの使用、ターミナルコマンドの実行(もちろんあなたの許可を得て)を可能にするツールへのアクセスにより、あらゆる種類のタスクを実行できます。MCPを使用して新しいツールを作成し、自分の能力を拡張することもできます。",
 	"introduction": "エージェント型コーディング能力の最新の進歩と、ファイルの作成・編集、複雑なプロジェクトの探索、ブラウザの使用、ターミナルコマンドの実行(もちろんあなたの許可を得て)を可能にするツールへのアクセスにより、あらゆる種類のタスクを実行できます。MCPを使用して新しいツールを作成し、自分の能力を拡張することもできます。",
 	"notice": "開始するには、この拡張機能にはAPIプロバイダーが必要です。",
 	"notice": "開始するには、この拡張機能にはAPIプロバイダーが必要です。",
-	"start": "さあ、始めましょう!"
+	"start": "さあ、始めましょう!",
+	"telemetry": {
+		"title": "Roo Codeの改善にご協力ください",
+		"anonymousTelemetry": "バグの修正と拡張機能の改善のため、匿名のエラーと使用データを送信してください。コード、プロンプト、個人情報は一切送信されません。",
+		"changeSettings": "設定の下部でいつでも変更できます",
+		"settings": "設定",
+		"allow": "許可",
+		"deny": "拒否"
+	}
 }
 }

+ 1 - 8
webview-ui/src/i18n/locales/ko/common.json

@@ -1,8 +1 @@
-{
-	"title": "Roo Code 개선에 도움 주세요",
-	"anonymousTelemetry": "버그 수정 및 확장 기능 개선을 위해 익명의 오류 및 사용 데이터를 보내주세요. 코드, 프롬프트 또는 개인 정보는 절대 전송되지 않습니다.",
-	"changeSettings": "설정 하단에서 언제든지 변경할 수 있습니다",
-	"settings": "설정",
-	"allow": "허용",
-	"deny": "거부"
-}
+{}

+ 8 - 1
webview-ui/src/i18n/locales/ko/prompts.json

@@ -18,7 +18,14 @@
 		"builtInModesText": "내장 모드용 도구는 수정할 수 없습니다",
 		"builtInModesText": "내장 모드용 도구는 수정할 수 없습니다",
 		"editTools": "도구 편집",
 		"editTools": "도구 편집",
 		"doneEditing": "편집 완료",
 		"doneEditing": "편집 완료",
-		"allowedFiles": "허용된 파일:"
+		"allowedFiles": "허용된 파일:",
+		"toolNames": {
+			"read": "파일 읽기",
+			"edit": "파일 편집",
+			"browser": "브라우저 사용",
+			"command": "명령 실행",
+			"mcp": "MCP 사용"
+		}
 	},
 	},
 	"roleDefinition": {
 	"roleDefinition": {
 		"title": "역할 정의",
 		"title": "역할 정의",

+ 228 - 0
webview-ui/src/i18n/locales/ko/settings.json

@@ -0,0 +1,228 @@
+{
+	"common": {
+		"save": "저장",
+		"done": "완료",
+		"cancel": "취소",
+		"reset": "초기화"
+	},
+	"header": {
+		"title": "설정",
+		"saveButtonTooltip": "변경 사항 저장",
+		"nothingChangedTooltip": "변경 사항 없음",
+		"doneButtonTooltip": "저장되지 않은 변경 사항을 버리고 설정 패널 닫기"
+	},
+	"unsavedChangesDialog": {
+		"title": "저장되지 않은 변경 사항",
+		"description": "변경 사항을 버리고 계속하시겠습니까?",
+		"cancelButton": "취소",
+		"discardButton": "변경 사항 버리기"
+	},
+	"sections": {
+		"providers": "공급자",
+		"autoApprove": "자동 승인",
+		"browser": "브라우저 / 컴퓨터 사용",
+		"checkpoints": "체크포인트",
+		"notifications": "알림",
+		"contextManagement": "컨텍스트 관리",
+		"advanced": "고급",
+		"experimental": "실험적 기능"
+	},
+	"autoApprove": {
+		"description": "Roo가 승인 없이 자동으로 작업을 수행할 수 있도록 허용합니다. AI를 완전히 신뢰하고 관련 보안 위험을 이해하는 경우에만 이러한 설정을 활성화하세요.",
+		"readOnly": {
+			"label": "읽기 전용 작업 항상 승인",
+			"description": "활성화되면 Roo는 승인 버튼을 클릭하지 않고도 자동으로 디렉토리 내용을 보고 파일을 읽습니다."
+		},
+		"write": {
+			"label": "쓰기 작업 항상 승인",
+			"description": "승인 없이 자동으로 파일 생성 및 편집",
+			"delayLabel": "진단이 잠재적 문제를 감지할 수 있도록 쓰기 후 지연"
+		},
+		"browser": {
+			"label": "브라우저 작업 항상 승인",
+			"description": "승인 없이 자동으로 브라우저 작업 수행",
+			"note": "참고: 모델이 컴퓨터 사용을 지원할 때만 적용됩니다"
+		},
+		"retry": {
+			"label": "실패한 API 요청 항상 재시도",
+			"description": "서버가 오류 응답을 반환할 때 자동으로 실패한 API 요청 재시도",
+			"delayLabel": "요청 재시도 전 지연"
+		},
+		"mcp": {
+			"label": "MCP 도구 항상 승인",
+			"description": "MCP 서버 보기에서 개별 MCP 도구의 자동 승인 활성화(이 설정과 도구의 \"항상 허용\" 체크박스 모두 필요)"
+		},
+		"modeSwitch": {
+			"label": "모드 전환 항상 승인",
+			"description": "승인 없이 자동으로 다양한 모드 간 전환"
+		},
+		"subtasks": {
+			"label": "하위 작업 생성 및 완료 항상 승인",
+			"description": "승인 없이 하위 작업 생성 및 완료 허용"
+		},
+		"execute": {
+			"label": "허용된 실행 작업 항상 승인",
+			"description": "승인 없이 자동으로 허용된 터미널 명령 실행",
+			"allowedCommands": "허용된 자동 실행 명령",
+			"allowedCommandsDescription": "\"실행 작업 항상 승인\"이 활성화되었을 때 자동 실행될 수 있는 명령 접두사. 모든 명령을 허용하려면 * 추가(주의해서 사용)",
+			"commandPlaceholder": "명령 접두사 입력(예: 'git ')",
+			"addButton": "추가"
+		}
+	},
+	"providers": {
+		"configProfile": "구성 프로필",
+		"description": "설명",
+		"apiProvider": "API 공급자",
+		"openRouterApiKey": "OpenRouter API 키",
+		"apiKeyStorageNotice": "API 키는 VSCode의 보안 저장소에 안전하게 저장됩니다",
+		"useCustomBaseUrl": "사용자 정의 기본 URL 사용",
+		"openRouterTransformsText": "프롬프트 및 메시지 체인을 컨텍스트 크기로 압축(<a>OpenRouter 변환</a>)"
+	},
+	"browser": {
+		"enable": {
+			"label": "브라우저 도구 활성화",
+			"description": "활성화되면 Roo는 컴퓨터 사용을 지원하는 모델을 사용할 때 웹사이트와 상호 작용하기 위해 브라우저를 사용할 수 있습니다."
+		},
+		"viewport": {
+			"label": "뷰포트 크기",
+			"description": "브라우저 상호 작용을 위한 뷰포트 크기를 선택하세요. 이는 웹사이트가 표시되고 상호 작용하는 방식에 영향을 미칩니다.",
+			"options": {
+				"largeDesktop": "대형 데스크톱 (1280x800)",
+				"smallDesktop": "소형 데스크톱 (900x600)",
+				"tablet": "태블릿 (768x1024)",
+				"mobile": "모바일 (360x640)"
+			}
+		},
+		"screenshotQuality": {
+			"label": "스크린샷 품질",
+			"description": "브라우저 스크린샷의 WebP 품질을 조정합니다. 높은 값은 더 선명한 스크린샷을 제공하지만 token 사용량이 증가합니다."
+		},
+		"remote": {
+			"label": "원격 브라우저 연결 사용",
+			"description": "원격 디버깅이 활성화된 Chrome 브라우저에 연결합니다(--remote-debugging-port=9222).",
+			"urlPlaceholder": "사용자 정의 URL(예: http://localhost:9222)",
+			"testButton": "연결 테스트",
+			"testingButton": "테스트 중...",
+			"instructions": "DevTools 프로토콜 호스트 주소를 입력하거나 Chrome 로컬 인스턴스를 자동으로 발견하기 위해 비워두세요. 연결 테스트 버튼은 제공된 경우 사용자 정의 URL을 시도하거나, 필드가 비어 있으면 자동으로 발견합니다."
+		}
+	},
+	"checkpoints": {
+		"enable": {
+			"label": "자동 체크포인트 활성화",
+			"description": "활성화되면 Roo는 작업 실행 중에 자동으로 체크포인트를 생성하여 변경 사항을 검토하거나 이전 상태로 되돌리기 쉽게 합니다."
+		}
+	},
+	"notifications": {
+		"sound": {
+			"label": "사운드 효과 활성화",
+			"description": "활성화되면 Roo는 알림 및 이벤트에 대한 사운드 효과를 재생합니다.",
+			"volumeLabel": "볼륨"
+		}
+	},
+	"contextManagement": {
+		"description": "AI의 컨텍스트 창에 포함되는 정보를 제어하여 token 사용량과 응답 품질에 영향을 미칩니다",
+		"terminal": {
+			"label": "터미널 출력 제한",
+			"description": "명령 실행 시 터미널 출력에 포함할 최대 라인 수. 초과 시 중간에서 라인이 제거되어 token이 절약됩니다."
+		},
+		"openTabs": {
+			"label": "열린 탭 컨텍스트 제한",
+			"description": "컨텍스트에 포함할 VSCode 열린 탭의 최대 수. 높은 값은 더 많은 컨텍스트를 제공하지만 token 사용량이 증가합니다."
+		},
+		"workspaceFiles": {
+			"label": "작업 공간 파일 컨텍스트 제한",
+			"description": "현재 작업 디렉토리 세부 정보에 포함할 파일의 최대 수. 높은 값은 더 많은 컨텍스트를 제공하지만 token 사용량이 증가합니다."
+		},
+		"rooignore": {
+			"label": "목록 및 검색에서 .rooignore 파일 표시",
+			"description": "활성화되면 .rooignore의 패턴과 일치하는 파일이 잠금 기호와 함께 목록에 표시됩니다. 비활성화되면 이러한 파일은 파일 목록 및 검색에서 완전히 숨겨집니다."
+		}
+	},
+	"advanced": {
+		"rateLimit": {
+			"label": "속도 제한",
+			"description": "API 요청 간 최소 시간."
+		},
+		"diff": {
+			"label": "diff를 통한 편집 활성화",
+			"description": "활성화되면 Roo는 파일을 더 빠르게 편집할 수 있으며 잘린 전체 파일 쓰기를 자동으로 거부합니다. 최신 Claude 3.7 Sonnet 모델에서 가장 잘 작동합니다.",
+			"strategy": {
+				"label": "Diff 전략",
+				"options": {
+					"standard": "표준(단일 블록)",
+					"multiBlock": "실험적: 다중 블록 diff",
+					"unified": "실험적: 통합 diff"
+				},
+				"descriptions": {
+					"standard": "표준 diff 전략은 한 번에 하나의 코드 블록에 변경 사항을 적용합니다.",
+					"unified": "통합 diff 전략은 diff를 적용하는 여러 접근 방식을 취하고 최상의 접근 방식을 선택합니다.",
+					"multiBlock": "다중 블록 diff 전략은 하나의 요청으로 파일의 여러 코드 블록을 업데이트할 수 있습니다."
+				}
+			},
+			"matchPrecision": {
+				"label": "일치 정확도",
+				"description": "이 슬라이더는 diff를 적용할 때 코드 섹션이 얼마나 정확하게 일치해야 하는지 제어합니다. 낮은 값은 더 유연한 일치를 허용하지만 잘못된 교체 위험이 증가합니다. 100% 미만의 값은 극도로 주의해서 사용하세요."
+			}
+		}
+	},
+	"experimental": {
+		"warning": "⚠️",
+		"DIFF_STRATEGY": {
+			"name": "실험적 통합 diff 전략 사용",
+			"description": "실험적 통합 diff 전략을 활성화합니다. 이 전략은 모델 오류로 인한 재시도 횟수를 줄일 수 있지만 예기치 않은 동작이나 잘못된 편집을 일으킬 수 있습니다. 위험을 이해하고 모든 변경 사항을 신중하게 검토할 의향이 있는 경우에만 활성화하십시오."
+		},
+		"SEARCH_AND_REPLACE": {
+			"name": "실험적 검색 및 바꾸기 도구 사용",
+			"description": "실험적 검색 및 바꾸기 도구를 활성화하여 Roo가 하나의 요청에서 검색어의 여러 인스턴스를 바꿀 수 있게 합니다."
+		},
+		"INSERT_BLOCK": {
+			"name": "실험적 콘텐츠 삽입 도구 사용",
+			"description": "실험적 콘텐츠 삽입 도구를 활성화하여 Roo가 diff를 만들 필요 없이 특정 줄 번호에 콘텐츠를 삽입할 수 있게 합니다."
+		},
+		"POWER_STEERING": {
+			"name": "실험적 \"파워 스티어링\" 모드 사용",
+			"description": "활성화하면 Roo가 현재 모드 정의의 세부 정보를 모델에 더 자주 상기시킵니다. 이로 인해 역할 정의 및 사용자 지정 지침에 대한 준수가 강화되지만 메시지당 더 많은 token이 사용됩니다."
+		},
+		"MULTI_SEARCH_AND_REPLACE": {
+			"name": "실험적 다중 블록 diff 도구 사용",
+			"description": "활성화하면 Roo가 다중 블록 diff 도구를 사용합니다. 이것은 하나의 요청에서 파일의 여러 코드 블록을 업데이트하려고 시도합니다."
+		}
+	},
+	"temperature": {
+		"useCustom": "사용자 정의 온도 사용",
+		"description": "모델 응답의 무작위성을 제어합니다.",
+		"rangeDescription": "높은 값은 출력을 더 무작위하게, 낮은 값은 더 결정적으로 만듭니다."
+	},
+	"modelInfo": {
+		"supportsImages": "이미지 지원",
+		"noImages": "이미지 지원 안 함",
+		"supportsComputerUse": "컴퓨터 사용 지원",
+		"noComputerUse": "컴퓨터 사용 지원 안 함",
+		"supportsPromptCache": "프롬프트 캐싱 지원",
+		"noPromptCache": "프롬프트 캐싱 지원 안 함",
+		"maxOutput": "최대 출력",
+		"inputPrice": "입력 가격",
+		"outputPrice": "출력 가격",
+		"cacheReadsPrice": "캐시 읽기 가격",
+		"cacheWritesPrice": "캐시 쓰기 가격",
+		"gemini": {
+			"freeRequests": "* 분당 {{count}}개 요청까지 무료. 이후에는 프롬프트 크기에 따라 요금이 부과됩니다.",
+			"pricingDetails": "자세한 내용은 가격 책정 세부 정보를 참조하세요."
+		}
+	},
+	"modelPicker": {
+		"automaticFetch": "확장 프로그램은 <serviceLink>{{serviceName}}</serviceLink>에서 사용 가능한 최신 모델 목록을 자동으로 가져옵니다. 어떤 모델을 선택해야 할지 확실하지 않다면, Roo Code는 <defaultModelLink>{{defaultModelId}}</defaultModelLink>로 가장 잘 작동합니다. 현재 사용 가능한 무료 옵션을 찾으려면 \"free\"를 검색해 볼 수도 있습니다."
+	},
+	"footer": {
+		"feedback": "질문이나 피드백이 있으시면 <githubLink>github.com/RooVetGit/Roo-Code</githubLink>에서 이슈를 열거나 <redditLink>reddit.com/r/RooCode</redditLink> 또는 <discordLink>discord.gg/roocode</discordLink>에 가입하세요",
+		"version": "Roo Code v{{version}}",
+		"telemetry": {
+			"label": "익명 오류 및 사용 보고 허용",
+			"description": "익명 사용 데이터 및 오류 보고서를 보내 Roo Code 개선에 도움을 주세요. 코드, 프롬프트 또는 개인 정보는 절대 전송되지 않습니다. 자세한 내용은 개인정보 보호정책을 참조하세요."
+		},
+		"reset": {
+			"description": "확장 프로그램의 모든 전역 상태 및 보안 저장소를 재설정합니다.",
+			"button": "초기화"
+		}
+	}
+}

+ 9 - 1
webview-ui/src/i18n/locales/ko/welcome.json

@@ -2,5 +2,13 @@
 	"greeting": "안녕하세요, 저는 루입니다!",
 	"greeting": "안녕하세요, 저는 루입니다!",
 	"introduction": "에이전트 코딩 능력의 최신 발전과 파일 생성 및 편집, 복잡한 프로젝트 탐색, 브라우저 사용, 터미널 명령 실행(물론 사용자의 허락 하에)을 가능하게 하는 도구에 대한 접근 덕분에 모든 종류의 작업을 수행할 수 있습니다. MCP를 사용하여 새로운 도구를 만들고 제 능력을 확장할 수도 있습니다.",
 	"introduction": "에이전트 코딩 능력의 최신 발전과 파일 생성 및 편집, 복잡한 프로젝트 탐색, 브라우저 사용, 터미널 명령 실행(물론 사용자의 허락 하에)을 가능하게 하는 도구에 대한 접근 덕분에 모든 종류의 작업을 수행할 수 있습니다. MCP를 사용하여 새로운 도구를 만들고 제 능력을 확장할 수도 있습니다.",
 	"notice": "시작하려면 이 확장 프로그램에 API 공급자가 필요합니다.",
 	"notice": "시작하려면 이 확장 프로그램에 API 공급자가 필요합니다.",
-	"start": "시작해 봅시다!"
+	"start": "시작해 봅시다!",
+	"telemetry": {
+		"title": "Roo Code 개선에 도움 주세요",
+		"anonymousTelemetry": "버그 수정 및 확장 기능 개선을 위해 익명의 오류 및 사용 데이터를 보내주세요. 코드, 프롬프트 또는 개인 정보는 절대 전송되지 않습니다.",
+		"changeSettings": "설정 하단에서 언제든지 변경할 수 있습니다",
+		"settings": "설정",
+		"allow": "허용",
+		"deny": "거부"
+	}
 }
 }

+ 1 - 8
webview-ui/src/i18n/locales/pl/common.json

@@ -1,8 +1 @@
-{
-	"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"
-}
+{}

+ 8 - 1
webview-ui/src/i18n/locales/pl/prompts.json

@@ -18,7 +18,14 @@
 		"builtInModesText": "Narzędzia dla wbudowanych trybów nie mogą być modyfikowane",
 		"builtInModesText": "Narzędzia dla wbudowanych trybów nie mogą być modyfikowane",
 		"editTools": "Edytuj narzędzia",
 		"editTools": "Edytuj narzędzia",
 		"doneEditing": "Zakończ edycję",
 		"doneEditing": "Zakończ edycję",
-		"allowedFiles": "Dozwolone pliki:"
+		"allowedFiles": "Dozwolone pliki:",
+		"toolNames": {
+			"read": "Czytaj pliki",
+			"edit": "Edytuj pliki",
+			"browser": "Używaj przeglądarki",
+			"command": "Uruchamiaj polecenia",
+			"mcp": "Używaj MCP"
+		}
 	},
 	},
 	"roleDefinition": {
 	"roleDefinition": {
 		"title": "Definicja roli",
 		"title": "Definicja roli",

+ 228 - 0
webview-ui/src/i18n/locales/pl/settings.json

@@ -0,0 +1,228 @@
+{
+	"common": {
+		"save": "Zapisz",
+		"done": "Gotowe",
+		"cancel": "Anuluj",
+		"reset": "Resetuj"
+	},
+	"header": {
+		"title": "Ustawienia",
+		"saveButtonTooltip": "Zapisz zmiany",
+		"nothingChangedTooltip": "Nic się nie zmieniło",
+		"doneButtonTooltip": "Odrzuć niezapisane zmiany i zamknij panel ustawień"
+	},
+	"unsavedChangesDialog": {
+		"title": "Niezapisane zmiany",
+		"description": "Czy chcesz odrzucić zmiany i kontynuować?",
+		"cancelButton": "Anuluj",
+		"discardButton": "Odrzuć zmiany"
+	},
+	"sections": {
+		"providers": "Dostawcy",
+		"autoApprove": "Automatyczne zatwierdzanie",
+		"browser": "Przeglądarka / Użycie komputera",
+		"checkpoints": "Punkty kontrolne",
+		"notifications": "Powiadomienia",
+		"contextManagement": "Zarządzanie kontekstem",
+		"advanced": "Zaawansowane",
+		"experimental": "Funkcje eksperymentalne"
+	},
+	"autoApprove": {
+		"description": "Pozwól Roo na automatyczne wykonywanie operacji bez wymagania zatwierdzenia. Włącz te ustawienia tylko jeśli w pełni ufasz AI i rozumiesz związane z tym zagrożenia bezpieczeństwa.",
+		"readOnly": {
+			"label": "Zawsze zatwierdzaj operacje tylko do odczytu",
+			"description": "Gdy włączone, Roo automatycznie będzie wyświetlać zawartość katalogów i czytać pliki bez konieczności klikania przycisku Zatwierdź."
+		},
+		"write": {
+			"label": "Zawsze zatwierdzaj operacje zapisu",
+			"description": "Automatycznie twórz i edytuj pliki bez konieczności zatwierdzania",
+			"delayLabel": "Opóźnienie po zapisach, aby umożliwić diagnostyce wykrycie potencjalnych problemów"
+		},
+		"browser": {
+			"label": "Zawsze zatwierdzaj akcje przeglądarki",
+			"description": "Automatycznie wykonuj akcje przeglądarki bez konieczności zatwierdzania",
+			"note": "Uwaga: Dotyczy tylko gdy model obsługuje używanie komputera"
+		},
+		"retry": {
+			"label": "Zawsze ponawiaj nieudane żądania API",
+			"description": "Automatycznie ponawiaj nieudane żądania API, gdy serwer zwraca odpowiedź z błędem",
+			"delayLabel": "Opóźnienie przed ponowieniem żądania"
+		},
+		"mcp": {
+			"label": "Zawsze zatwierdzaj narzędzia MCP",
+			"description": "Włącz automatyczne zatwierdzanie poszczególnych narzędzi MCP w widoku Serwerów MCP (wymaga zarówno tego ustawienia, jak i pola wyboru \"Zawsze zezwalaj\" narzędzia)"
+		},
+		"modeSwitch": {
+			"label": "Zawsze zatwierdzaj przełączanie trybów",
+			"description": "Automatycznie przełączaj między różnymi trybami bez konieczności zatwierdzania"
+		},
+		"subtasks": {
+			"label": "Zawsze zatwierdzaj tworzenie i ukończenie podzadań",
+			"description": "Zezwalaj na tworzenie i ukończenie podzadań bez konieczności zatwierdzania"
+		},
+		"execute": {
+			"label": "Zawsze zatwierdzaj dozwolone operacje wykonania",
+			"description": "Automatycznie wykonuj dozwolone polecenia terminala bez konieczności zatwierdzania",
+			"allowedCommands": "Dozwolone polecenia auto-wykonania",
+			"allowedCommandsDescription": "Prefiksy poleceń, które mogą być automatycznie wykonywane, gdy \"Zawsze zatwierdzaj operacje wykonania\" jest włączone. Dodaj * aby zezwolić na wszystkie polecenia (używaj z ostrożnością).",
+			"commandPlaceholder": "Wprowadź prefiks polecenia (np. 'git ')",
+			"addButton": "Dodaj"
+		}
+	},
+	"providers": {
+		"configProfile": "Profil konfiguracji",
+		"description": "Opis",
+		"apiProvider": "Dostawca API",
+		"openRouterApiKey": "Klucz API OpenRouter",
+		"apiKeyStorageNotice": "Klucze API są bezpiecznie przechowywane w Tajnym Magazynie VSCode",
+		"useCustomBaseUrl": "Użyj niestandardowego URL bazowego",
+		"openRouterTransformsText": "Kompresuj podpowiedzi i łańcuchy wiadomości do rozmiaru kontekstu (<a>Transformacje OpenRouter</a>)"
+	},
+	"browser": {
+		"enable": {
+			"label": "Włącz narzędzie przeglądarki",
+			"description": "Gdy włączone, Roo może używać przeglądarki do interakcji ze stronami internetowymi podczas korzystania z modeli obsługujących używanie komputera."
+		},
+		"viewport": {
+			"label": "Rozmiar viewportu",
+			"description": "Wybierz rozmiar viewportu dla interakcji przeglądarki. Wpływa to na sposób wyświetlania stron internetowych i interakcji z nimi.",
+			"options": {
+				"largeDesktop": "Duży pulpit (1280x800)",
+				"smallDesktop": "Mały pulpit (900x600)",
+				"tablet": "Tablet (768x1024)",
+				"mobile": "Telefon (360x640)"
+			}
+		},
+		"screenshotQuality": {
+			"label": "Jakość zrzutów ekranu",
+			"description": "Dostosuj jakość WebP zrzutów ekranu przeglądarki. Wyższe wartości zapewniają wyraźniejsze zrzuty ekranu, ale zwiększają zużycie token."
+		},
+		"remote": {
+			"label": "Użyj zdalnego połączenia przeglądarki",
+			"description": "Połącz się z przeglądarką Chrome uruchomioną z włączonym zdalnym debugowaniem (--remote-debugging-port=9222).",
+			"urlPlaceholder": "Niestandardowy URL (np. http://localhost:9222)",
+			"testButton": "Testuj połączenie",
+			"testingButton": "Testowanie...",
+			"instructions": "Wprowadź adres hosta protokołu DevTools lub pozostaw puste, aby automatycznie wykryć lokalne instancje Chrome. Przycisk Test Połączenia spróbuje użyć niestandardowego URL, jeśli podany, lub automatycznie wykryje, jeśli pole jest puste."
+		}
+	},
+	"checkpoints": {
+		"enable": {
+			"label": "Włącz automatyczne punkty kontrolne",
+			"description": "Gdy włączone, Roo automatycznie utworzy punkty kontrolne podczas wykonywania zadań, ułatwiając przeglądanie zmian lub powrót do wcześniejszych stanów."
+		}
+	},
+	"notifications": {
+		"sound": {
+			"label": "Włącz efekty dźwiękowe",
+			"description": "Gdy włączone, Roo będzie odtwarzać efekty dźwiękowe dla powiadomień i zdarzeń.",
+			"volumeLabel": "Głośność"
+		}
+	},
+	"contextManagement": {
+		"description": "Kontroluj, jakie informacje są zawarte w oknie kontekstu AI, wpływając na zużycie token i jakość odpowiedzi",
+		"terminal": {
+			"label": "Limit wyjścia terminala",
+			"description": "Maksymalna liczba linii do uwzględnienia w wyjściu terminala podczas wykonywania poleceń. Po przekroczeniu linie będą usuwane ze środka, oszczędzając token."
+		},
+		"openTabs": {
+			"label": "Limit kontekstu otwartych kart",
+			"description": "Maksymalna liczba otwartych kart VSCode do uwzględnienia w kontekście. Wyższe wartości zapewniają więcej kontekstu, ale zwiększają zużycie token."
+		},
+		"workspaceFiles": {
+			"label": "Limit kontekstu plików obszaru roboczego",
+			"description": "Maksymalna liczba plików do uwzględnienia w szczegółach bieżącego katalogu roboczego. Wyższe wartości zapewniają więcej kontekstu, ale zwiększają zużycie token."
+		},
+		"rooignore": {
+			"label": "Pokaż pliki .rooignore na listach i w wyszukiwaniach",
+			"description": "Gdy włączone, pliki pasujące do wzorców w .rooignore będą pokazywane na listach z symbolem kłódki. Gdy wyłączone, te pliki będą całkowicie ukryte z list plików i wyszukiwań."
+		}
+	},
+	"advanced": {
+		"rateLimit": {
+			"label": "Limit szybkości",
+			"description": "Minimalny czas między żądaniami API."
+		},
+		"diff": {
+			"label": "Włącz edycję przez różnice",
+			"description": "Gdy włączone, Roo będzie w stanie edytować pliki szybciej i automatycznie odrzuci obcięte pełne zapisy plików. Działa najlepiej z najnowszym modelem Claude 3.7 Sonnet.",
+			"strategy": {
+				"label": "Strategia diff",
+				"options": {
+					"standard": "Standardowa (Pojedynczy blok)",
+					"multiBlock": "Eksperymentalna: Diff wieloblokowy",
+					"unified": "Eksperymentalna: Diff ujednolicony"
+				},
+				"descriptions": {
+					"standard": "Standardowa strategia diff stosuje zmiany do jednego bloku kodu na raz.",
+					"unified": "Strategia diff ujednoliconego stosuje wiele podejść do zastosowania różnic i wybiera najlepsze podejście.",
+					"multiBlock": "Strategia diff wieloblokowego pozwala na aktualizację wielu bloków kodu w pliku w jednym żądaniu."
+				}
+			},
+			"matchPrecision": {
+				"label": "Precyzja dopasowania",
+				"description": "Ten suwak kontroluje, jak dokładnie sekcje kodu muszą pasować podczas stosowania różnic. Niższe wartości umożliwiają bardziej elastyczne dopasowywanie, ale zwiększają ryzyko nieprawidłowych zamian. Używaj wartości poniżej 100% z najwyższą ostrożnością."
+			}
+		}
+	},
+	"experimental": {
+		"warning": "⚠️",
+		"DIFF_STRATEGY": {
+			"name": "Użyj eksperymentalnej ujednoliconej strategii diff",
+			"description": "Włącz eksperymentalną ujednoliconą strategię diff. Ta strategia może zmniejszyć liczbę ponownych prób spowodowanych błędami modelu, ale może powodować nieoczekiwane zachowanie lub nieprawidłowe edycje. Włącz tylko jeśli rozumiesz ryzyko i jesteś gotów dokładnie przeglądać wszystkie zmiany."
+		},
+		"SEARCH_AND_REPLACE": {
+			"name": "Użyj eksperymentalnego narzędzia do wyszukiwania i zamiany",
+			"description": "Włącz eksperymentalne narzędzie do wyszukiwania i zamiany, umożliwiając Roo zastąpienie wielu wystąpień wyszukiwanego terminu w jednym żądaniu."
+		},
+		"INSERT_BLOCK": {
+			"name": "Użyj eksperymentalnego narzędzia do wstawiania treści",
+			"description": "Włącz eksperymentalne narzędzie do wstawiania treści, umożliwiając Roo wstawianie treści w określonych numerach linii bez konieczności tworzenia diff."
+		},
+		"POWER_STEERING": {
+			"name": "Użyj eksperymentalnego trybu \"wspomagania kierownicy\"",
+			"description": "Po włączeniu, Roo będzie częściej przypominać modelowi o szczegółach jego bieżącej definicji trybu. Doprowadzi to do silniejszego przestrzegania definicji ról i niestandardowych instrukcji, ale będzie używać więcej tokenów na wiadomość."
+		},
+		"MULTI_SEARCH_AND_REPLACE": {
+			"name": "Użyj eksperymentalnego narzędzia diff wieloblokowego",
+			"description": "Po włączeniu, Roo użyje narzędzia diff wieloblokowego. Spróbuje to zaktualizować wiele bloków kodu w pliku w jednym żądaniu."
+		}
+	},
+	"temperature": {
+		"useCustom": "Użyj niestandardowej temperatury",
+		"description": "Kontroluje losowość w odpowiedziach modelu.",
+		"rangeDescription": "Wyższe wartości sprawiają, że wyjście jest bardziej losowe, niższe wartości czynią je bardziej deterministycznym."
+	},
+	"modelInfo": {
+		"supportsImages": "Obsługuje obrazy",
+		"noImages": "Nie obsługuje obrazów",
+		"supportsComputerUse": "Obsługuje użycie komputera",
+		"noComputerUse": "Nie obsługuje użycia komputera",
+		"supportsPromptCache": "Obsługuje buforowanie podpowiedzi",
+		"noPromptCache": "Nie obsługuje buforowania podpowiedzi",
+		"maxOutput": "Maksymalne wyjście",
+		"inputPrice": "Cena wejścia",
+		"outputPrice": "Cena wyjścia",
+		"cacheReadsPrice": "Cena odczytów bufora",
+		"cacheWritesPrice": "Cena zapisów bufora",
+		"gemini": {
+			"freeRequests": "* Darmowe do {{count}} zapytań na minutę. Po tym, rozliczanie zależy od rozmiaru podpowiedzi.",
+			"pricingDetails": "Więcej informacji znajdziesz w szczegółach cennika."
+		}
+	},
+	"modelPicker": {
+		"automaticFetch": "Rozszerzenie automatycznie pobiera najnowszą listę modeli dostępnych w <serviceLink>{{serviceName}}</serviceLink>. Jeśli nie jesteś pewien, który model wybrać, Roo Code działa najlepiej z <defaultModelLink>{{defaultModelId}}</defaultModelLink>. Możesz również wyszukać \"free\", aby znaleźć obecnie dostępne opcje bezpłatne."
+	},
+	"footer": {
+		"feedback": "Jeśli masz jakiekolwiek pytania lub opinie, śmiało otwórz zgłoszenie na <githubLink>github.com/RooVetGit/Roo-Code</githubLink> lub dołącz do <redditLink>reddit.com/r/RooCode</redditLink> lub <discordLink>discord.gg/roocode</discordLink>",
+		"version": "Roo Code v{{version}}",
+		"telemetry": {
+			"label": "Zezwól na anonimowe raportowanie błędów i użycia",
+			"description": "Pomóż ulepszyć Roo Code, wysyłając anonimowe dane o użytkowaniu i raporty o błędach. Nigdy nie są wysyłane kod, podpowiedzi ani informacje osobiste. Zobacz naszą politykę prywatności, aby uzyskać więcej szczegółów."
+		},
+		"reset": {
+			"description": "Zresetuj wszystkie globalne stany i tajne magazyny w rozszerzeniu.",
+			"button": "Resetuj"
+		}
+	}
+}

+ 9 - 1
webview-ui/src/i18n/locales/pl/welcome.json

@@ -2,5 +2,13 @@
 	"greeting": "Cześć, jestem Roo!",
 	"greeting": "Cześć, jestem Roo!",
 	"introduction": "Mogę wykonywać wszelkiego rodzaju zadania dzięki najnowszym osiągnięciom w zakresie możliwości kodowania agentowego i dostępu do narzędzi, które pozwalają mi tworzyć i edytować pliki, eksplorować złożone projekty, korzystać z przeglądarki i wykonywać polecenia terminalowe (oczywiście za Twoją zgodą). Mogę nawet używać MCP do tworzenia nowych narzędzi i rozszerzania własnych możliwości.",
 	"introduction": "Mogę wykonywać wszelkiego rodzaju zadania dzięki najnowszym osiągnięciom w zakresie możliwości kodowania agentowego i dostępu do narzędzi, które pozwalają mi tworzyć i edytować pliki, eksplorować złożone projekty, korzystać z przeglądarki i wykonywać polecenia terminalowe (oczywiście za Twoją zgodą). Mogę nawet używać MCP do tworzenia nowych narzędzi i rozszerzania własnych możliwości.",
 	"notice": "Aby rozpocząć, to rozszerzenie potrzebuje dostawcy API.",
 	"notice": "Aby rozpocząć, to rozszerzenie potrzebuje dostawcy API.",
-	"start": "Zaczynajmy!"
+	"start": "Zaczynajmy!",
+	"telemetry": {
+		"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"
+	}
 }
 }

+ 1 - 8
webview-ui/src/i18n/locales/pt-BR/common.json

@@ -1,8 +1 @@
-{
-	"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"
-}
+{}

+ 42 - 1
webview-ui/src/i18n/locales/pt-BR/prompts.json

@@ -18,7 +18,14 @@
 		"builtInModesText": "Ferramentas para modos integrados não podem ser modificadas",
 		"builtInModesText": "Ferramentas para modos integrados não podem ser modificadas",
 		"editTools": "Editar ferramentas",
 		"editTools": "Editar ferramentas",
 		"doneEditing": "Concluir edição",
 		"doneEditing": "Concluir edição",
-		"allowedFiles": "Arquivos permitidos:"
+		"allowedFiles": "Arquivos permitidos:",
+		"toolNames": {
+			"read": "Ler arquivos",
+			"edit": "Editar arquivos",
+			"browser": "Usar navegador",
+			"command": "Executar comandos",
+			"mcp": "Usar MCP"
+		}
 	},
 	},
 	"roleDefinition": {
 	"roleDefinition": {
 		"title": "Definição de função",
 		"title": "Definição de função",
@@ -51,6 +58,40 @@
 			"useCurrentConfig": "Usar configuração de API atualmente selecionada",
 			"useCurrentConfig": "Usar configuração de API atualmente selecionada",
 			"testPromptPlaceholder": "Digite um prompt para testar o aprimoramento",
 			"testPromptPlaceholder": "Digite um prompt para testar o aprimoramento",
 			"previewButton": "Visualizar aprimoramento do prompt"
 			"previewButton": "Visualizar aprimoramento do prompt"
+		},
+		"types": {
+			"ENHANCE": {
+				"label": "Aprimorar Prompt",
+				"description": "Use o 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 nas 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 nas 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 nas 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 nas 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 de 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 de 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": {
 	"customModeCreation": {

+ 228 - 0
webview-ui/src/i18n/locales/pt-BR/settings.json

@@ -0,0 +1,228 @@
+{
+	"common": {
+		"save": "Salvar",
+		"done": "Concluído",
+		"cancel": "Cancelar",
+		"reset": "Redefinir"
+	},
+	"header": {
+		"title": "Configurações",
+		"saveButtonTooltip": "Salvar alterações",
+		"nothingChangedTooltip": "Nada alterado",
+		"doneButtonTooltip": "Descartar alterações não salvas e fechar o painel de configurações"
+	},
+	"unsavedChangesDialog": {
+		"title": "Alterações não salvas",
+		"description": "Deseja descartar as alterações e continuar?",
+		"cancelButton": "Cancelar",
+		"discardButton": "Descartar alterações"
+	},
+	"sections": {
+		"providers": "Provedores",
+		"autoApprove": "Aprovação automática",
+		"browser": "Navegador / Uso do computador",
+		"checkpoints": "Pontos de verificação",
+		"notifications": "Notificações",
+		"contextManagement": "Gestão de contexto",
+		"advanced": "Avançado",
+		"experimental": "Recursos experimentais"
+	},
+	"autoApprove": {
+		"description": "Permitir que o Roo realize operações automaticamente sem exigir aprovação. Ative essas configurações apenas se confiar totalmente na IA e compreender os riscos de segurança associados.",
+		"readOnly": {
+			"label": "Aprovar sempre operações somente de leitura",
+			"description": "Quando ativado, o Roo visualizará automaticamente o conteúdo do diretório e lerá arquivos sem que você precise clicar no botão Aprovar."
+		},
+		"write": {
+			"label": "Aprovar sempre operações de escrita",
+			"description": "Criar e editar arquivos automaticamente sem exigir aprovação",
+			"delayLabel": "Atraso após escritas para permitir que diagnósticos detectem problemas potenciais"
+		},
+		"browser": {
+			"label": "Aprovar sempre ações do navegador",
+			"description": "Realizar ações do navegador automaticamente sem exigir aprovação",
+			"note": "Nota: Aplica-se apenas quando o modelo suporta uso do computador"
+		},
+		"retry": {
+			"label": "Sempre tentar novamente requisições de API com falha",
+			"description": "Tentar novamente automaticamente requisições de API com falha quando o servidor retorna uma resposta de erro",
+			"delayLabel": "Atraso antes de tentar novamente a requisição"
+		},
+		"mcp": {
+			"label": "Aprovar sempre ferramentas MCP",
+			"description": "Ativar aprovação automática de ferramentas MCP individuais na visualização de Servidores MCP (requer tanto esta configuração quanto a caixa de seleção \"Permitir sempre\" da ferramenta)"
+		},
+		"modeSwitch": {
+			"label": "Aprovar sempre troca de modos",
+			"description": "Alternar automaticamente entre diferentes modos sem exigir aprovação"
+		},
+		"subtasks": {
+			"label": "Aprovar sempre criação e conclusão de subtarefas",
+			"description": "Permitir a criação e conclusão de subtarefas sem exigir aprovação"
+		},
+		"execute": {
+			"label": "Aprovar sempre operações de execução permitidas",
+			"description": "Executar automaticamente comandos de terminal permitidos sem exigir aprovação",
+			"allowedCommands": "Comandos de auto-execução permitidos",
+			"allowedCommandsDescription": "Prefixos de comando que podem ser auto-executados quando \"Aprovar sempre operações de execução\" está ativado. Adicione * para permitir todos os comandos (use com cautela).",
+			"commandPlaceholder": "Digite o prefixo do comando (ex. 'git ')",
+			"addButton": "Adicionar"
+		}
+	},
+	"providers": {
+		"configProfile": "Perfil de configuração",
+		"description": "Descrição",
+		"apiProvider": "Provedor de API",
+		"openRouterApiKey": "Chave de API OpenRouter",
+		"apiKeyStorageNotice": "As chaves de API são armazenadas com segurança no Armazenamento Secreto do VSCode",
+		"useCustomBaseUrl": "Usar URL base personalizado",
+		"openRouterTransformsText": "Comprimir prompts e cadeias de mensagens para o tamanho do contexto (<a>Transformações OpenRouter</a>)"
+	},
+	"browser": {
+		"enable": {
+			"label": "Ativar ferramenta de navegador",
+			"description": "Quando ativado, o Roo pode usar um navegador para interagir com sites ao usar modelos que suportam o uso do computador."
+		},
+		"viewport": {
+			"label": "Tamanho da viewport",
+			"description": "Selecione o tamanho da viewport para interações do navegador. Isso afeta como os sites são exibidos e como se interage com eles.",
+			"options": {
+				"largeDesktop": "Desktop grande (1280x800)",
+				"smallDesktop": "Desktop pequeno (900x600)",
+				"tablet": "Tablet (768x1024)",
+				"mobile": "Móvel (360x640)"
+			}
+		},
+		"screenshotQuality": {
+			"label": "Qualidade das capturas de tela",
+			"description": "Ajuste a qualidade WebP das capturas de tela do navegador. Valores mais altos fornecem capturas mais nítidas, mas aumentam o uso de token."
+		},
+		"remote": {
+			"label": "Usar conexão remota de navegador",
+			"description": "Conectar a um navegador Chrome executando com depuração remota ativada (--remote-debugging-port=9222).",
+			"urlPlaceholder": "URL personalizado (ex. http://localhost:9222)",
+			"testButton": "Testar conexão",
+			"testingButton": "Testando...",
+			"instructions": "Digite o endereço do host do protocolo DevTools ou deixe em branco para descobrir automaticamente instâncias locais do Chrome. O botão Testar Conexão tentará usar o URL personalizado, se fornecido, ou descobrirá automaticamente se o campo estiver vazio."
+		}
+	},
+	"checkpoints": {
+		"enable": {
+			"label": "Ativar pontos de verificação automáticos",
+			"description": "Quando ativado, o Roo criará automaticamente pontos de verificação durante a execução de tarefas, facilitando a revisão de alterações ou o retorno a estados anteriores."
+		}
+	},
+	"notifications": {
+		"sound": {
+			"label": "Ativar efeitos sonoros",
+			"description": "Quando ativado, o Roo reproduzirá efeitos sonoros para notificações e eventos.",
+			"volumeLabel": "Volume"
+		}
+	},
+	"contextManagement": {
+		"description": "Controle quais informações são incluídas na janela de contexto da IA, afetando o uso de token e a qualidade da resposta",
+		"terminal": {
+			"label": "Limite de saída do terminal",
+			"description": "Número máximo de linhas a incluir na saída do terminal ao executar comandos. Quando excedido, as linhas serão removidas do meio, economizando token."
+		},
+		"openTabs": {
+			"label": "Limite de contexto de abas abertas",
+			"description": "Número máximo de abas abertas do VSCode a incluir no contexto. Valores mais altos fornecem mais contexto, mas aumentam o uso de token."
+		},
+		"workspaceFiles": {
+			"label": "Limite de contexto de arquivos do espaço de trabalho",
+			"description": "Número máximo de arquivos a incluir nos detalhes do diretório de trabalho atual. Valores mais altos fornecem mais contexto, mas aumentam o uso de token."
+		},
+		"rooignore": {
+			"label": "Mostrar arquivos .rooignore em listas e pesquisas",
+			"description": "Quando ativado, os arquivos que correspondem aos padrões em .rooignore serão mostrados em listas com um símbolo de cadeado. Quando desativado, esses arquivos serão completamente ocultos das listas de arquivos e pesquisas."
+		}
+	},
+	"advanced": {
+		"rateLimit": {
+			"label": "Limite de taxa",
+			"description": "Tempo mínimo entre requisições de API."
+		},
+		"diff": {
+			"label": "Ativar edição através de diffs",
+			"description": "Quando ativado, o Roo poderá editar arquivos mais rapidamente e rejeitará automaticamente escritas completas de arquivos truncados. Funciona melhor com o modelo mais recente Claude 3.7 Sonnet.",
+			"strategy": {
+				"label": "Estratégia de diff",
+				"options": {
+					"standard": "Padrão (Bloco único)",
+					"multiBlock": "Experimental: Diff multi-bloco",
+					"unified": "Experimental: Diff unificado"
+				},
+				"descriptions": {
+					"standard": "A estratégia de diff padrão aplica alterações a um único bloco de código por vez.",
+					"unified": "A estratégia de diff unificado adota várias abordagens para aplicar diffs e escolhe a melhor abordagem.",
+					"multiBlock": "A estratégia de diff multi-bloco permite atualizar vários blocos de código em um arquivo em uma única requisição."
+				}
+			},
+			"matchPrecision": {
+				"label": "Precisão de correspondência",
+				"description": "Este controle deslizante controla quão precisamente as seções de código devem corresponder ao aplicar diffs. Valores mais baixos permitem correspondências mais flexíveis, mas aumentam o risco de substituições incorretas. Use valores abaixo de 100% com extrema cautela."
+			}
+		}
+	},
+	"experimental": {
+		"warning": "⚠️",
+		"DIFF_STRATEGY": {
+			"name": "Usar estratégia diff unificada experimental",
+			"description": "Ativar a estratégia diff unificada experimental. Esta estratégia pode reduzir o número de novas tentativas causadas por erros do modelo, mas pode causar comportamento inesperado ou edições incorretas. Ative apenas se compreender os riscos e estiver disposto a revisar cuidadosamente todas as alterações."
+		},
+		"SEARCH_AND_REPLACE": {
+			"name": "Usar ferramenta de busca e substituição experimental",
+			"description": "Ativar a ferramenta de busca e substituição experimental, permitindo que o Roo substitua várias instâncias de um termo de busca em uma única solicitação."
+		},
+		"INSERT_BLOCK": {
+			"name": "Usar ferramenta de inserção de conteúdo experimental",
+			"description": "Ativar a ferramenta de inserção de conteúdo experimental, permitindo que o Roo insira conteúdo em números de linha específicos sem precisar criar um diff."
+		},
+		"POWER_STEERING": {
+			"name": "Usar modo \"direção assistida\" experimental",
+			"description": "Quando ativado, o Roo lembrará o modelo sobre os detalhes da sua definição de modo atual com mais frequência. Isso levará a uma adesão mais forte às definições de função e instruções personalizadas, mas usará mais tokens por mensagem."
+		},
+		"MULTI_SEARCH_AND_REPLACE": {
+			"name": "Usar ferramenta diff de múltiplos blocos experimental",
+			"description": "Quando ativado, o Roo usará a ferramenta diff de múltiplos blocos. Isso tentará atualizar vários blocos de código no arquivo em uma única solicitação."
+		}
+	},
+	"temperature": {
+		"useCustom": "Usar temperatura personalizada",
+		"description": "Controla a aleatoriedade nas respostas do modelo.",
+		"rangeDescription": "Valores mais altos tornam a saída mais aleatória, valores mais baixos a tornam mais determinística."
+	},
+	"modelInfo": {
+		"supportsImages": "Suporta imagens",
+		"noImages": "Não suporta imagens",
+		"supportsComputerUse": "Suporta uso do computador",
+		"noComputerUse": "Não suporta uso do computador",
+		"supportsPromptCache": "Suporta cache de prompts",
+		"noPromptCache": "Não suporta cache de prompts",
+		"maxOutput": "Saída máxima",
+		"inputPrice": "Preço de entrada",
+		"outputPrice": "Preço de saída",
+		"cacheReadsPrice": "Preço de leituras de cache",
+		"cacheWritesPrice": "Preço de escritas de cache",
+		"gemini": {
+			"freeRequests": "* Gratuito até {{count}} requisições por minuto. Depois disso, a cobrança depende do tamanho do prompt.",
+			"pricingDetails": "Para mais informações, consulte os detalhes de preços."
+		}
+	},
+	"modelPicker": {
+		"automaticFetch": "A extensão busca automaticamente a lista mais recente de modelos disponíveis em <serviceLink>{{serviceName}}</serviceLink>. Se você não tem certeza sobre qual modelo escolher, o Roo Code funciona melhor com <defaultModelLink>{{defaultModelId}}</defaultModelLink>. Você também pode pesquisar por \"free\" para encontrar opções gratuitas atualmente disponíveis."
+	},
+	"footer": {
+		"feedback": "Se tiver alguma dúvida ou feedback, sinta-se à vontade para abrir um problema em <githubLink>github.com/RooVetGit/Roo-Code</githubLink> ou juntar-se a <redditLink>reddit.com/r/RooCode</redditLink> ou <discordLink>discord.gg/roocode</discordLink>",
+		"version": "Roo Code v{{version}}",
+		"telemetry": {
+			"label": "Permitir relatórios anônimos de erros e uso",
+			"description": "Ajude a melhorar o Roo Code enviando dados de uso anônimos e relatórios de erros. Nunca são enviados código, prompts ou informações pessoais. Consulte nossa política de privacidade para mais detalhes."
+		},
+		"reset": {
+			"description": "Redefinir todo o estado global e armazenamento secreto na extensão.",
+			"button": "Redefinir"
+		}
+	}
+}

+ 9 - 1
webview-ui/src/i18n/locales/pt-BR/welcome.json

@@ -2,5 +2,13 @@
 	"greeting": "Olá, eu sou o Roo!",
 	"greeting": "Olá, eu sou o Roo!",
 	"introduction": "Posso realizar todos os tipos de tarefas graças aos últimos avanços nas capacidades de codificação agentica e ao acesso a ferramentas que me permitem criar e editar arquivos, explorar projetos complexos, usar o navegador e executar comandos de terminal (com sua permissão, é claro). Posso até usar o MCP para criar novas ferramentas e expandir minhas próprias capacidades.",
 	"introduction": "Posso realizar todos os tipos de tarefas graças aos últimos avanços nas capacidades de codificação agentica e ao acesso a ferramentas que me permitem criar e editar arquivos, explorar projetos complexos, usar o navegador e executar comandos de terminal (com sua permissão, é claro). Posso até usar o MCP para criar novas ferramentas e expandir minhas próprias capacidades.",
 	"notice": "Para começar, esta extensão precisa de um provedor de API.",
 	"notice": "Para começar, esta extensão precisa de um provedor de API.",
-	"start": "Vamos lá!"
+	"start": "Vamos lá!",
+	"telemetry": {
+		"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"
+	}
 }
 }

Некоторые файлы не были показаны из-за большого количества измененных файлов