diff --git a/bun.lock b/bun.lock index 679e0cb4a5e..5536daf272c 100644 --- a/bun.lock +++ b/bun.lock @@ -338,6 +338,7 @@ "name": "kilo-code", "version": "0.0.1", "dependencies": { + "@kilocode/kilo-i18n": "workspace:*", "@kilocode/kilo-ui": "workspace:*", "@kilocode/sdk": "workspace:*", "eventsource": "^2.0.2", diff --git a/packages/kilo-vscode/package.json b/packages/kilo-vscode/package.json index 0bf5e384b42..ea3a2bd2788 100644 --- a/packages/kilo-vscode/package.json +++ b/packages/kilo-vscode/package.json @@ -114,6 +114,49 @@ "configuration": { "title": "Kilo Code", "properties": { + "kilo-code.new.language": { + "type": "string", + "default": "", + "description": "Override the UI language for Kilo Code (e.g. en, de, ja). Empty means use VS Code's display language.", + "enum": [ + "", + "en", + "zh", + "zht", + "ko", + "de", + "es", + "fr", + "da", + "ja", + "pl", + "ru", + "ar", + "no", + "br", + "th", + "bs" + ], + "enumDescriptions": [ + "Auto (VS Code language)", + "English", + "简体中文", + "繁體中文", + "한국어", + "Deutsch", + "Español", + "Français", + "Dansk", + "日本語", + "Polski", + "Русский", + "العربية", + "Norsk", + "Português (Brasil)", + "ภาษาไทย", + "Bosanski" + ] + }, "kilo-code.new.model.providerID": { "type": "string", "default": "kilo", diff --git a/packages/kilo-vscode/src/KiloProvider.ts b/packages/kilo-vscode/src/KiloProvider.ts index c0d1c41a029..2a4a4b1d62b 100644 --- a/packages/kilo-vscode/src/KiloProvider.ts +++ b/packages/kilo-vscode/src/KiloProvider.ts @@ -64,9 +64,12 @@ export class KiloProvider implements vscode.WebviewViewProvider { // Re-send ready so the webview can recover after refresh. if (serverInfo) { + const langConfig = vscode.workspace.getConfiguration("kilo-code.new") this.postMessage({ type: "ready", serverInfo, + vscodeLanguage: vscode.env.language, + languageOverride: langConfig.get("language"), }) } @@ -193,6 +196,11 @@ export class KiloProvider implements vscode.WebviewViewProvider { case "requestAgents": await this.fetchAndSendAgents() break + case "setLanguage": + await vscode.workspace + .getConfiguration("kilo-code.new") + .update("language", message.locale || undefined, vscode.ConfigurationTarget.Global) + break } }) } @@ -259,7 +267,13 @@ export class KiloProvider implements vscode.WebviewViewProvider { this.connectionState = this.connectionService.getConnectionState() if (serverInfo) { - this.postMessage({ type: "ready", serverInfo }) + const langConfig = vscode.workspace.getConfiguration("kilo-code.new") + this.postMessage({ + type: "ready", + serverInfo, + vscodeLanguage: vscode.env.language, + languageOverride: langConfig.get("language"), + }) } this.postMessage({ type: "connectionState", state: this.connectionState }) diff --git a/packages/kilo-vscode/webview-ui/src/App.tsx b/packages/kilo-vscode/webview-ui/src/App.tsx index 43415572763..f96e18f7305 100644 --- a/packages/kilo-vscode/webview-ui/src/App.tsx +++ b/packages/kilo-vscode/webview-ui/src/App.tsx @@ -1,6 +1,5 @@ import { Component, createSignal, createMemo, Switch, Match, onMount, onCleanup } from "solid-js" import { ThemeProvider } from "@kilocode/kilo-ui/theme" -import { LanguageProvider } from "./context/language" import { DialogProvider } from "@kilocode/kilo-ui/context/dialog" import { MarkedProvider } from "@kilocode/kilo-ui/context/marked" import { DataProvider } from "@kilocode/kilo-ui/context/data" @@ -10,6 +9,7 @@ import { VSCodeProvider } from "./context/vscode" import { ServerProvider, useServer } from "./context/server" import { ProviderProvider } from "./context/provider" import { SessionProvider, useSession } from "./context/session" +import { LanguageProvider } from "./context/language" import { ChatView } from "./components/chat" import SessionList from "./components/history/SessionList" import type { Message as SDKMessage, Part as SDKPart } from "@kilocode/sdk/v2" @@ -37,13 +37,6 @@ const DummyView: Component<{ title: string }> = (props) => { /** * Bridge our session store to the DataProvider's expected Data shape. - * Since the runtime data comes from the CLI backend, it's already in SDK format — - * we just need to restructure it into the Data layout that DataProvider expects. - * - * Note: DiffComponentProvider and CodeComponentProvider are NOT included because - * @pierre/diffs uses Vite's ?worker&url import syntax which is incompatible - * with esbuild. Tool renderers that need diffs (edit, write, apply_patch) - * will fall back to GenericTool display. See ui-implementation-plan.md §7.6. */ const DataBridge: Component<{ children: any }> = (props) => { const session = useSession() @@ -77,6 +70,19 @@ const DataBridge: Component<{ children: any }> = (props) => { ) } +/** + * Wraps children in LanguageProvider, passing server-side language info. + * Must be below ServerProvider in the hierarchy. + */ +const LanguageBridge: Component<{ children: any }> = (props) => { + const server = useServer() + return ( + + {props.children} + + ) +} + // Inner app component that uses the contexts const AppContent: Component = () => { const [currentView, setCurrentView] = createSignal("newTask") @@ -154,11 +160,11 @@ const AppContent: Component = () => { const App: Component = () => { return ( - - - - - + + + + + @@ -166,11 +172,11 @@ const App: Component = () => { - - - - - + + + + + ) } diff --git a/packages/kilo-vscode/webview-ui/src/components/settings/LanguageTab.tsx b/packages/kilo-vscode/webview-ui/src/components/settings/LanguageTab.tsx index 83dfcce2b26..25828047650 100644 --- a/packages/kilo-vscode/webview-ui/src/components/settings/LanguageTab.tsx +++ b/packages/kilo-vscode/webview-ui/src/components/settings/LanguageTab.tsx @@ -1,30 +1,34 @@ import { Component } from "solid-js" +import { Select } from "@kilocode/kilo-ui/select" +import { useLanguage, LOCALES, LOCALE_LABELS, type Locale } from "../../context/language" + +const options = ["", ...LOCALES] as const +type Option = "" | Locale const LanguageTab: Component = () => { + const language = useLanguage() + return ( -
-
+

+ Choose the language for the Kilo Code UI. "Auto" uses your VS Code display language. +

+