Revert localization

This commit is contained in:
Saoud Rizwan 2025-01-28 18:50:45 -08:00
parent ac53dbb122
commit 65a860e75e
28 changed files with 349 additions and 1568 deletions

View file

@ -75,7 +75,6 @@ export class Cline {
browserSession: BrowserSession
private didEditFile: boolean = false
customInstructions?: string
localeLanguage?: string
autoApprovalSettings: AutoApprovalSettings
private browserSettings: BrowserSettings
private chatSettings: ChatSettings
@ -120,7 +119,6 @@ export class Cline {
browserSettings: BrowserSettings,
chatSettings: ChatSettings,
customInstructions?: string,
localeLanguage?: string,
task?: string,
images?: string[],
historyItem?: HistoryItem,
@ -132,7 +130,6 @@ export class Cline {
this.browserSession = new BrowserSession(provider.context, browserSettings)
this.diffViewProvider = new DiffViewProvider(cwd)
this.customInstructions = customInstructions
this.localeLanguage = localeLanguage
this.autoApprovalSettings = autoApprovalSettings
this.browserSettings = browserSettings
this.chatSettings = chatSettings
@ -1215,12 +1212,6 @@ export class Cline {
this.browserSettings,
)
let userSelectedNonEnglishLanguage: string | undefined
// While we check vscode for preferred language, it's likely not giving us one of the language options
if (this.localeLanguage && this.localeLanguage !== "en") {
userSelectedNonEnglishLanguage = this.localeLanguage
}
let settingsCustomInstructions = this.customInstructions?.trim()
const clineRulesFilePath = path.resolve(cwd, GlobalFileNames.clineRules)
let clineRulesFileInstructions: string | undefined
@ -1235,13 +1226,9 @@ export class Cline {
}
}
if (settingsCustomInstructions || clineRulesFileInstructions || userSelectedNonEnglishLanguage) {
if (settingsCustomInstructions || clineRulesFileInstructions) {
// altering the system prompt mid-task will break the prompt cache, but in the grand scheme this will not change often so it's better to not pollute user messages with it the way we have to with <potentially relevant details>
systemPrompt += addUserInstructions(
settingsCustomInstructions,
clineRulesFileInstructions,
userSelectedNonEnglishLanguage,
)
systemPrompt += addUserInstructions(settingsCustomInstructions, clineRulesFileInstructions)
}
// If the previous API request's total token usage is close to the context window, truncate the conversation history to free up space for the new request

View file

@ -957,16 +957,8 @@ You accomplish a given task iteratively, breaking it down into clear steps and w
4. Once you've completed the user's task, you must use the attempt_completion tool to present the result of the task to the user. You may also provide a CLI command to showcase the result of your task; this can be particularly useful for web development tasks, where you can run e.g. \`open index.html\` to show the website you've built.
5. The user may provide feedback, which you can use to make improvements and try again. But DO NOT continue in pointless back and forth conversations, i.e. don't end your responses with questions or offers for further assistance.`
export function addUserInstructions(
settingsCustomInstructions?: string,
clineRulesFileInstructions?: string,
chosenLanguage?: string,
) {
export function addUserInstructions(settingsCustomInstructions?: string, clineRulesFileInstructions?: string) {
let customInstructions = ""
if (chosenLanguage) {
// Will only be provided for non-english languages
customInstructions += `Speak in this language: ${chosenLanguage}.` + "\n\n"
}
if (settingsCustomInstructions) {
customInstructions += settingsCustomInstructions + "\n\n"
}

View file

@ -72,7 +72,6 @@ type GlobalStateKey =
| "browserSettings"
| "chatSettings"
| "vsCodeLmModelSelector"
| "localeLanguage"
| "userInfo"
| "previousModeApiProvider"
| "previousModeModelId"
@ -247,7 +246,7 @@ export class ClineProvider implements vscode.WebviewViewProvider {
async initClineWithTask(task?: string, images?: string[]) {
await this.clearTask() // ensures that an exising task doesn't exist before starting a new one, although this shouldn't be possible since user must clear task before starting a new one
const { apiConfiguration, customInstructions, localeLanguage, autoApprovalSettings, browserSettings, chatSettings } =
const { apiConfiguration, customInstructions, autoApprovalSettings, browserSettings, chatSettings } =
await this.getState()
this.cline = new Cline(
this,
@ -256,7 +255,6 @@ export class ClineProvider implements vscode.WebviewViewProvider {
browserSettings,
chatSettings,
customInstructions,
localeLanguage,
task,
images,
)
@ -264,7 +262,7 @@ export class ClineProvider implements vscode.WebviewViewProvider {
async initClineWithHistoryItem(historyItem: HistoryItem) {
await this.clearTask()
const { apiConfiguration, customInstructions, localeLanguage, autoApprovalSettings, browserSettings, chatSettings } =
const { apiConfiguration, customInstructions, autoApprovalSettings, browserSettings, chatSettings } =
await this.getState()
this.cline = new Cline(
this,
@ -273,7 +271,6 @@ export class ClineProvider implements vscode.WebviewViewProvider {
browserSettings,
chatSettings,
customInstructions,
localeLanguage,
undefined,
undefined,
historyItem,
@ -747,10 +744,6 @@ export class ClineProvider implements vscode.WebviewViewProvider {
}
break
}
case "changeLanguage": {
await this.updateLocaleLanguage(message.text)
break
}
case "restartMcpServer": {
try {
await this.mcpHub?.restartConnection(message.text!)
@ -844,14 +837,6 @@ export class ClineProvider implements vscode.WebviewViewProvider {
await this.postStateToWebview()
}
async updateLocaleLanguage(language?: string) {
await this.updateGlobalState("localeLanguage", language || undefined)
if (this.cline) {
this.cline.localeLanguage = language || undefined
}
await this.postStateToWebview()
}
// MCP
async getDocumentsPath(): Promise<string> {
@ -1267,7 +1252,6 @@ export class ClineProvider implements vscode.WebviewViewProvider {
chatSettings,
userInfo,
authToken,
localeLanguage,
} = await this.getState()
return {
@ -1283,8 +1267,6 @@ export class ClineProvider implements vscode.WebviewViewProvider {
autoApprovalSettings,
browserSettings,
chatSettings,
// FIXME: the vscode.env.language doesn't translate to the language specifiers we use in i18n. We need to know what values vscode uses and transform. For now this will always just lead to defaulting to English (see i18n.ts)
localeLanguage: localeLanguage || vscode.env.language,
isLoggedIn: !!authToken,
userInfo,
}
@ -1376,7 +1358,6 @@ export class ClineProvider implements vscode.WebviewViewProvider {
browserSettings,
chatSettings,
vsCodeLmModelSelector,
localeLanguage,
userInfo,
authToken,
previousModeApiProvider,
@ -1416,7 +1397,6 @@ export class ClineProvider implements vscode.WebviewViewProvider {
this.getGlobalState("browserSettings") as Promise<BrowserSettings | undefined>,
this.getGlobalState("chatSettings") as Promise<ChatSettings | undefined>,
this.getGlobalState("vsCodeLmModelSelector") as Promise<vscode.LanguageModelChatSelector | undefined>,
this.getGlobalState("localeLanguage") as Promise<string | undefined>,
this.getGlobalState("userInfo") as Promise<UserInfo | undefined>,
this.getSecret("authToken") as Promise<string | undefined>,
this.getGlobalState("previousModeApiProvider") as Promise<ApiProvider | undefined>,
@ -1474,7 +1454,6 @@ export class ClineProvider implements vscode.WebviewViewProvider {
autoApprovalSettings: autoApprovalSettings || DEFAULT_AUTO_APPROVAL_SETTINGS, // default value can be 0 or empty string
browserSettings: browserSettings || DEFAULT_BROWSER_SETTINGS,
chatSettings: chatSettings || DEFAULT_CHAT_SETTINGS,
localeLanguage,
userInfo,
authToken,
previousModeApiProvider,

View file

@ -61,7 +61,6 @@ export interface ExtensionState {
autoApprovalSettings: AutoApprovalSettings
browserSettings: BrowserSettings
chatSettings: ChatSettings
localeLanguage: string
isLoggedIn: boolean
userInfo?: {
displayName: string | null

View file

@ -42,7 +42,6 @@ export interface WebviewMessage {
| "accountLoginClicked"
| "accountLogoutClicked"
| "subscribeEmail"
| "changeLanguage"
// | "relaunchChromeDebugMode"
text?: string
disabled?: boolean

View file

@ -22,7 +22,6 @@
"pretty-bytes": "^6.1.1",
"react": "^18.3.1",
"react-dom": "^18.3.1",
"react-i18next": "^15.4.0",
"react-remark": "^2.1.0",
"react-scripts": "^5.0.1",
"react-textarea-autosize": "^8.5.3",
@ -9326,15 +9325,6 @@
"node": ">=12"
}
},
"node_modules/html-parse-stringify": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz",
"integrity": "sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==",
"license": "MIT",
"dependencies": {
"void-elements": "3.1.0"
}
},
"node_modules/html-webpack-plugin": {
"version": "5.6.3",
"resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.3.tgz",
@ -9506,38 +9496,6 @@
"integrity": "sha512-WDC/ui2VVRrz3jOVi+XtjqkDjiVjTtFaAGiW37k6b+ohyQ5wYDOGkvCZa8+H0nx3gyvv0+BST9xuOgIyGQ00gw==",
"license": "BSD-3-Clause"
},
"node_modules/i18next": {
"version": "24.2.1",
"resolved": "https://registry.npmjs.org/i18next/-/i18next-24.2.1.tgz",
"integrity": "sha512-Q2wC1TjWcSikn1VAJg13UGIjc+okpFxQTxjVAymOnSA3RpttBQNMPf2ovcgoFVsV4QNxTfNZMAxorXZXsk4fBA==",
"funding": [
{
"type": "individual",
"url": "https://locize.com"
},
{
"type": "individual",
"url": "https://locize.com/i18next.html"
},
{
"type": "individual",
"url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project"
}
],
"license": "MIT",
"peer": true,
"dependencies": {
"@babel/runtime": "^7.23.2"
},
"peerDependencies": {
"typescript": "^5"
},
"peerDependenciesMeta": {
"typescript": {
"optional": true
}
}
},
"node_modules/iconv-lite": {
"version": "0.6.3",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
@ -14646,28 +14604,6 @@
"integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==",
"license": "MIT"
},
"node_modules/react-i18next": {
"version": "15.4.0",
"resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-15.4.0.tgz",
"integrity": "sha512-Py6UkX3zV08RTvL6ZANRoBh9sL/ne6rQq79XlkHEdd82cZr2H9usbWpUNVadJntIZP2pu3M2rL1CN+5rQYfYFw==",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.25.0",
"html-parse-stringify": "^3.0.1"
},
"peerDependencies": {
"i18next": ">= 23.2.3",
"react": ">= 16.8.0"
},
"peerDependenciesMeta": {
"react-dom": {
"optional": true
},
"react-native": {
"optional": true
}
}
},
"node_modules/react-is": {
"version": "17.0.2",
"resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
@ -18043,15 +17979,6 @@
"url": "https://opencollective.com/unified"
}
},
"node_modules/void-elements": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz",
"integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==",
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/w3c-hr-time": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz",

View file

@ -17,7 +17,6 @@
"pretty-bytes": "^6.1.1",
"react": "^18.3.1",
"react-dom": "^18.3.1",
"react-i18next": "^15.4.0",
"react-remark": "^2.1.0",
"react-scripts": "^5.0.1",
"react-textarea-autosize": "^8.5.3",

View file

@ -9,11 +9,9 @@ import AccountView from "./components/account/AccountView"
import { ExtensionStateContextProvider, useExtensionState } from "./context/ExtensionStateContext"
import { vscode } from "./utils/vscode"
import McpView from "./components/mcp/McpView"
import { useTranslation } from "react-i18next"
const AppContent = () => {
const { didHydrateState, showWelcome, shouldShowAnnouncement, localeLanguage } = useExtensionState()
const { i18n } = useTranslation()
const { didHydrateState, showWelcome, shouldShowAnnouncement } = useExtensionState()
const [showSettings, setShowSettings] = useState(false)
const [showHistory, setShowHistory] = useState(false)
const [showMcp, setShowMcp] = useState(false)
@ -69,12 +67,6 @@ const AppContent = () => {
}
}, [shouldShowAnnouncement])
useEffect(() => {
if (localeLanguage) {
i18n.changeLanguage(localeLanguage)
}
}, [i18n, localeLanguage])
if (!didHydrateState) {
return null
}

View file

@ -1,7 +1,5 @@
import { VSCodeButton, VSCodeLink } from "@vscode/webview-ui-toolkit/react"
import { memo } from "react"
import { useTranslation } from "react-i18next"
import { Trans } from "react-i18next"
import { getAsVar, VSC_DESCRIPTION_FOREGROUND, VSC_INACTIVE_SELECTION_BACKGROUND } from "../../utils/vscStyles"
interface AnnouncementProps {
@ -13,8 +11,6 @@ interface AnnouncementProps {
You must update the latestAnnouncementId in ClineProvider for new announcements to show to users. This new id will be compared with whats in state for the 'last announcement shown', and if it's different then the announcement will render. As soon as an announcement is shown, the id will be updated in state. This ensures that announcements are not shown more than once, even if the user doesn't close it themselves.
*/
const Announcement = ({ version, hideAnnouncement }: AnnouncementProps) => {
const { t } = useTranslation("translation", { keyPrefix: "announcement" })
const minorVersion = version.split(".").slice(0, 2).join(".") // 2.0.0 -> 2.0
return (
<div
@ -29,7 +25,9 @@ const Announcement = ({ version, hideAnnouncement }: AnnouncementProps) => {
<VSCodeButton appearance="icon" onClick={hideAnnouncement} style={{ position: "absolute", top: "8px", right: "8px" }}>
<span className="codicon codicon-close"></span>
</VSCodeButton>
<h3 style={{ margin: "0 0 8px" }}>{t("newInVersion", { version: minorVersion })}</h3>
<h3 style={{ margin: "0 0 8px" }}>
🎉{" "}New in v{minorVersion}
</h3>
<ul style={{ margin: "0 0 8px", paddingLeft: "12px" }}>
<li>
<b>Plan/Act mode toggle:</b> Plan mode turns Cline into an architect that gathers information, asks clarifying
@ -111,13 +109,15 @@ const Announcement = ({ version, hideAnnouncement }: AnnouncementProps) => {
}}
/>
<p style={{ margin: "0" }}>
<Trans
i18nKey="announcement.joinOurCommunities"
components={{
DiscordLink: <VSCodeLink style={{ display: "inline" }} href="https://discord.gg/cline" />,
RedditLink: <VSCodeLink style={{ display: "inline" }} href="https://www.reddit.com/r/cline/" />,
}}
/>
Join our{" "}
<VSCodeLink style={{ display: "inline" }} href="https://discord.gg/cline">
discord
</VSCodeLink>{" "}
or{" "}
<VSCodeLink style={{ display: "inline" }} href="https://www.reddit.com/r/cline/">
r/cline
</VSCodeLink>
for more updates!
</p>
</div>
)

View file

@ -5,7 +5,6 @@ import { useExtensionState } from "../../context/ExtensionStateContext"
import { AutoApprovalSettings } from "../../../../src/shared/AutoApprovalSettings"
import { vscode } from "../../utils/vscode"
import { getAsVar, VSC_FOREGROUND, VSC_TITLEBAR_INACTIVE_FOREGROUND, VSC_DESCRIPTION_FOREGROUND } from "../../utils/vscStyles"
import { useTranslation } from "react-i18next"
interface AutoApproveMenuProps {
style?: React.CSSProperties
@ -51,7 +50,6 @@ const ACTION_METADATA: {
]
const AutoApproveMenu = ({ style }: AutoApproveMenuProps) => {
const { t } = useTranslation("translation", { keyPrefix: "autoApproveMenu" })
const { autoApprovalSettings } = useExtensionState()
const [isExpanded, setIsExpanded] = useState(false)
const [isHoveringCollapsibleSection, setIsHoveringCollapsibleSection] = useState(false)
@ -192,7 +190,7 @@ const AutoApproveMenu = ({ style }: AutoApproveMenuProps) => {
color: getAsVar(VSC_FOREGROUND),
whiteSpace: "nowrap",
}}>
{t("autoApprove")}
Auto-approve:
</span>
<span
style={{
@ -200,7 +198,7 @@ const AutoApproveMenu = ({ style }: AutoApproveMenuProps) => {
overflow: "hidden",
textOverflow: "ellipsis",
}}>
{enabledActions.length === 0 ? t("none") : enabledActionsList}
{enabledActions.length === 0 ? "None" : enabledActionsList}
</span>
<span
className={`codicon codicon-chevron-${isExpanded ? "down" : "right"}`}
@ -219,7 +217,8 @@ const AutoApproveMenu = ({ style }: AutoApproveMenuProps) => {
color: getAsVar(VSC_DESCRIPTION_FOREGROUND),
fontSize: "12px",
}}>
{t("autoApproveDescription")}
Auto-approve allows Cline to perform the following actions without asking for permission. Please use with
caution and only enable if you understand the risks.
</div>
{ACTION_METADATA.map((action) => (
<div key={action.id} style={{ margin: "6px 0" }}>
@ -286,7 +285,7 @@ const AutoApproveMenu = ({ style }: AutoApproveMenuProps) => {
fontSize: "12px",
marginBottom: "10px",
}}>
{t("autoApproveMaxRequestsDescription")}
Cline will automatically make this many API requests before asking for approval to proceed with the task.
</div>
<div style={{ margin: "6px 0" }}>
<VSCodeCheckbox
@ -295,7 +294,7 @@ const AutoApproveMenu = ({ style }: AutoApproveMenuProps) => {
const checked = (e.target as HTMLInputElement).checked
updateNotifications(checked)
}}>
{t("enableNotifications")}
Enable Notifications
</VSCodeCheckbox>
<div
style={{
@ -303,7 +302,7 @@ const AutoApproveMenu = ({ style }: AutoApproveMenuProps) => {
color: getAsVar(VSC_DESCRIPTION_FOREGROUND),
fontSize: "12px",
}}>
{t("enableNotificationsDescription")}
Receive system notifications when Cline requires approval to proceed or when a task is completed.
</div>
</div>
</div>

View file

@ -2,8 +2,6 @@ import { VSCodeBadge, VSCodeProgressRing } from "@vscode/webview-ui-toolkit/reac
import deepEqual from "fast-deep-equal"
import React, { memo, useCallback, useEffect, useMemo, useRef, useState } from "react"
import { useEvent, useSize } from "react-use"
import { useTranslation } from "react-i18next"
import { Trans } from "react-i18next"
import styled from "styled-components"
import {
ClineApiReqInfo,
@ -101,7 +99,6 @@ const ChatRow = memo(
export default ChatRow
export const ChatRowContent = ({ message, isExpanded, onToggleExpand, lastModifiedMessage, isLast }: ChatRowContentProps) => {
const { t } = useTranslation("translation", { keyPrefix: "chatRow" })
const { mcpServers } = useExtensionState()
const [seeNewChangesDisabled, setSeeNewChangesDisabled] = useState(false)
@ -154,7 +151,7 @@ export const ChatRowContent = ({ message, isExpanded, onToggleExpand, lastModifi
color: errorColor,
marginBottom: "-1.5px",
}}></span>,
<span style={{ color: errorColor, fontWeight: "bold" }}>{t("error")}</span>,
<span style={{ color: errorColor, fontWeight: "bold" }}>Error</span>,
]
case "mistake_limit_reached":
return [
@ -164,7 +161,7 @@ export const ChatRowContent = ({ message, isExpanded, onToggleExpand, lastModifi
color: errorColor,
marginBottom: "-1.5px",
}}></span>,
<span style={{ color: errorColor, fontWeight: "bold" }}>{t("mistakeLimitReached")}</span>,
<span style={{ color: errorColor, fontWeight: "bold" }}>Cline is having trouble...</span>,
]
case "auto_approval_max_req_reached":
return [
@ -174,7 +171,7 @@ export const ChatRowContent = ({ message, isExpanded, onToggleExpand, lastModifi
color: errorColor,
marginBottom: "-1.5px",
}}></span>,
<span style={{ color: errorColor, fontWeight: "bold" }}>{t("autoApprovalMaxReqReached")}</span>,
<span style={{ color: errorColor, fontWeight: "bold" }}>Maximum Requests Reached</span>,
]
case "command":
return [
@ -189,7 +186,7 @@ export const ChatRowContent = ({ message, isExpanded, onToggleExpand, lastModifi
}}></span>
),
<span style={{ color: normalColor, fontWeight: "bold" }}>
{message.type === "ask" ? t("command.ask") : t("command.say")}
{message.type === "ask" ? "Cline wants to execute this command:" : "Cline executed this command:"}
</span>,
]
case "use_mcp_server":
@ -208,23 +205,13 @@ export const ChatRowContent = ({ message, isExpanded, onToggleExpand, lastModifi
<span style={{ color: normalColor, fontWeight: "bold" }}>
{message.type === "ask" ? (
<>
{t("useMcpServer.ask", {
type:
mcpServerUse.type === "use_mcp_tool"
? t("useMcpServer.tool")
: t("useMcpServer.resource"),
serverName: mcpServerUse.serverName,
})}
Cline wants to {mcpServerUse.type === "use_mcp_tool" ? "use a tool" : "access a resource"} on the{" "}
<code>{mcpServerUse.serverName}</code> MCP server:
</>
) : (
<>
{t("useMcpServer.say", {
type:
mcpServerUse.type === "use_mcp_tool"
? t("useMcpServer.tool")
: t("useMcpServer.resource"),
serverName: mcpServerUse.serverName,
})}
Cline {mcpServerUse.type === "use_mcp_tool" ? "used a tool" : "accessed a resource"} on the{" "}
<code>{mcpServerUse.serverName}</code> MCP server:
</>
)}
</span>,
@ -237,7 +224,7 @@ export const ChatRowContent = ({ message, isExpanded, onToggleExpand, lastModifi
color: successColor,
marginBottom: "-1.5px",
}}></span>,
<span style={{ color: successColor, fontWeight: "bold" }}>{t("completionResult")}</span>,
<span style={{ color: successColor, fontWeight: "bold" }}>Task Completed</span>,
]
case "api_req_started":
const getIconSpan = (iconName: string, color: string) => (
@ -279,7 +266,7 @@ export const ChatRowContent = ({ message, isExpanded, onToggleExpand, lastModifi
color: normalColor,
fontWeight: "bold",
}}>
{t("apiReqCancelled")}
API Request Cancelled
</span>
) : (
<span
@ -287,15 +274,15 @@ export const ChatRowContent = ({ message, isExpanded, onToggleExpand, lastModifi
color: errorColor,
fontWeight: "bold",
}}>
{t("apiStreamingFailed")}
API Streaming Failed
</span>
)
) : cost != null ? (
<span style={{ color: normalColor, fontWeight: "bold" }}>{t("apiRequest")}</span>
<span style={{ color: normalColor, fontWeight: "bold" }}>API Request</span>
) : apiRequestFailedMessage ? (
<span style={{ color: errorColor, fontWeight: "bold" }}>{t("apiRequestFailed")}</span>
<span style={{ color: errorColor, fontWeight: "bold" }}>API Request Failed</span>
) : (
<span style={{ color: normalColor, fontWeight: "bold" }}>{t("apiRequestInProgress")}</span>
<span style={{ color: normalColor, fontWeight: "bold" }}>API Request...</span>
),
]
case "followup":
@ -306,7 +293,7 @@ export const ChatRowContent = ({ message, isExpanded, onToggleExpand, lastModifi
color: normalColor,
marginBottom: "-1.5px",
}}></span>,
<span style={{ color: normalColor, fontWeight: "bold" }}>{t("followup")}</span>,
<span style={{ color: normalColor, fontWeight: "bold" }}>Cline has a question:</span>,
]
default:
return [null, null]
@ -320,7 +307,6 @@ export const ChatRowContent = ({ message, isExpanded, onToggleExpand, lastModifi
isMcpServerResponding,
message.text,
message.type,
t,
])
const headerStyle: React.CSSProperties = {
@ -361,7 +347,7 @@ export const ChatRowContent = ({ message, isExpanded, onToggleExpand, lastModifi
<div style={headerStyle}>
{toolIcon("edit")}
<span style={{ fontWeight: "bold" }}>
{message.type === "ask" ? t("tool.editedExistingFile.ask") : t("tool.editedExistingFile.say")}
{message.type === "ask" ? "Cline wants to edit this file:" : "Cline is editing this file:"}
</span>
</div>
<CodeAccordian
@ -379,7 +365,7 @@ export const ChatRowContent = ({ message, isExpanded, onToggleExpand, lastModifi
<div style={headerStyle}>
{toolIcon("new-file")}
<span style={{ fontWeight: "bold" }}>
{message.type === "ask" ? t("tool.createdNewFile.ask") : t("tool.createdNewFile.say")}
{message.type === "ask" ? "Cline wants to create a new file:" : "Cline is creating a new file:"}
</span>
</div>
<CodeAccordian
@ -397,7 +383,7 @@ export const ChatRowContent = ({ message, isExpanded, onToggleExpand, lastModifi
<div style={headerStyle}>
{toolIcon("file-code")}
<span style={{ fontWeight: "bold" }}>
{message.type === "ask" ? t("tool.readExistingFile.ask") : t("tool.readExistingFile.say")}
{message.type === "ask" ? "Cline wants to read this file:" : "Cline read this file:"}
</span>
</div>
{/* <CodeAccordian
@ -787,56 +773,52 @@ export const ChatRowContent = ({ message, isExpanded, onToggleExpand, lastModifi
<>
<br />
<br />
<Trans
i18nKey="chatRow.troubleshootingGuide"
components={{
Link: (
<a
href="https://github.com/cline/cline/wiki/TroubleShooting-%E2%80%90-%22PowerShell-is-not-recognized-as-an-internal-or-external-command%22"
style={{
color: "inherit",
textDecoration: "underline",
}}>
PowerShell
</a>
),
}}
/>
It seems like you're having Windows PowerShell issues, please see this{" "}
<a
href="https://github.com/cline/cline/wiki/TroubleShooting-%E2%80%90-%22PowerShell-is-not-recognized-as-an-internal-or-external-command%22"
style={{
color: "inherit",
textDecoration: "underline",
}}>
troubleshooting guide
</a>
.
</>
)}
</p>
{/* {apiProvider === "" && (
<div
style={{
display: "flex",
alignItems: "center",
backgroundColor:
"color-mix(in srgb, var(--vscode-errorForeground) 20%, transparent)",
color: "var(--vscode-editor-foreground)",
padding: "6px 8px",
borderRadius: "3px",
margin: "10px 0 0 0",
fontSize: "12px",
}}>
<i
className="codicon codicon-warning"
<div
style={{
marginRight: 6,
fontSize: 16,
color: "var(--vscode-errorForeground)",
}}></i>
<span>
Uh-oh, this could be a problem on end. We've been alerted and
will resolve this ASAP. You can also{" "}
<a
href=""
style={{ color: "inherit", textDecoration: "underline" }}>
contact us
</a>
.
</span>
</div>
)} */}
display: "flex",
alignItems: "center",
backgroundColor:
"color-mix(in srgb, var(--vscode-errorForeground) 20%, transparent)",
color: "var(--vscode-editor-foreground)",
padding: "6px 8px",
borderRadius: "3px",
margin: "10px 0 0 0",
fontSize: "12px",
}}>
<i
className="codicon codicon-warning"
style={{
marginRight: 6,
fontSize: 16,
color: "var(--vscode-errorForeground)",
}}></i>
<span>
Uh-oh, this could be a problem on end. We've been alerted and
will resolve this ASAP. You can also{" "}
<a
href=""
style={{ color: "inherit", textDecoration: "underline" }}>
contact us
</a>
.
</span>
</div>
)} */}
</>
)}
@ -941,10 +923,13 @@ export const ChatRowContent = ({ message, isExpanded, onToggleExpand, lastModifi
fontWeight: 500,
color: "#FFA500",
}}>
{t("diffEditFailed")}
Diff Edit Failed
</span>
</div>
<div>{t("diffEditFailedMessage")}</div>
<div>
This usually happens when the model uses search patterns that don't match anything in the
file. Retrying...
</div>
</div>
</>
)
@ -984,7 +969,7 @@ export const ChatRowContent = ({ message, isExpanded, onToggleExpand, lastModifi
cursor: seeNewChangesDisabled ? "wait" : "pointer",
}}>
<i className="codicon codicon-new-file" style={{ marginRight: 6 }} />
{t("seeNewChanges")}
See new changes
</SuccessButton>
</div>
)}
@ -1020,10 +1005,23 @@ export const ChatRowContent = ({ message, isExpanded, onToggleExpand, lastModifi
fontWeight: 500,
color: "#FFA500",
}}>
{t("shellIntegrationUnavailable")}
Shell Integration Unavailable
</span>
</div>
<div>{t("shellIntegrationUnavailableMessage")}</div>
<div>
Cline won't be able to view the command's output. Please update VSCode (
<code>CMD/CTRL + Shift + P</code> "Update") and make sure you're using a supported shell:
zsh, bash, fish, or PowerShell (<code>CMD/CTRL + Shift + P</code> "Terminal: Select Default
Profile").{" "}
<a
href="https://github.com/cline/cline/wiki/Troubleshooting-%E2%80%90-Shell-Integration-Unavailable"
style={{
color: "inherit",
textDecoration: "underline",
}}>
Still having trouble?
</a>
</div>
</div>
</>
)
@ -1038,14 +1036,7 @@ export const ChatRowContent = ({ message, isExpanded, onToggleExpand, lastModifi
fontSize: "12px",
textTransform: "uppercase",
}}>
<a
href="https://github.com/cline/cline/wiki/Troubleshooting-%E2%80%90-Shell-Integration-Unavailable"
style={{
color: "inherit",
textDecoration: "underline",
}}>
{t("response")}
</a>
Response
</div>
<CodeAccordian
code={message.text}
@ -1145,7 +1136,7 @@ export const ChatRowContent = ({ message, isExpanded, onToggleExpand, lastModifi
cursor: seeNewChangesDisabled ? "wait" : "pointer",
}}
/>
{t("seeNewChanges")}
See new changes
</SuccessButton>
</div>
)}

View file

@ -4,7 +4,6 @@ import DynamicTextArea from "react-textarea-autosize"
import { useClickAway, useWindowSize } from "react-use"
import styled from "styled-components"
import { mentionRegex, mentionRegexGlobal } from "../../../../src/shared/context-mentions"
import { useTranslation } from "react-i18next"
import { useExtensionState } from "../../context/ExtensionStateContext"
import {
ContextMenuOptionType,
@ -211,7 +210,6 @@ const ChatTextArea = forwardRef<HTMLTextAreaElement, ChatTextAreaProps>(
},
ref,
) => {
const { t } = useTranslation("translation", { keyPrefix: "chatTextArea" })
const { filePaths, chatSettings, apiConfiguration, openRouterModels } = useExtensionState()
const [isTextAreaFocused, setIsTextAreaFocused] = useState(false)
const [thumbnailsHeight, setThumbnailsHeight] = useState(0)
@ -1072,8 +1070,8 @@ const ChatTextArea = forwardRef<HTMLTextAreaElement, ChatTextAreaProps>(
<SwitchContainer data-testid="mode-switch" disabled={textAreaDisabled} onClick={onModeToggle}>
<Slider isAct={chatSettings.mode === "act"} isPlan={chatSettings.mode === "plan"} />
<SwitchOption isActive={chatSettings.mode === "plan"}>{t("plan")}</SwitchOption>
<SwitchOption isActive={chatSettings.mode === "act"}>{t("act")}</SwitchOption>
<SwitchOption isActive={chatSettings.mode === "plan"}>Plan</SwitchOption>
<SwitchOption isActive={chatSettings.mode === "act"}>Act</SwitchOption>
</SwitchContainer>
</ControlsContainer>
</div>

View file

@ -3,8 +3,6 @@ import debounce from "debounce"
import { useCallback, useEffect, useMemo, useRef, useState } from "react"
import { useDeepCompareEffect, useEvent, useMount } from "react-use"
import { Virtuoso, type VirtuosoHandle } from "react-virtuoso"
import { useTranslation } from "react-i18next"
import { Trans } from "react-i18next"
import styled from "styled-components"
import {
ClineAsk,
@ -38,7 +36,6 @@ interface ChatViewProps {
export const MAX_IMAGES_PER_MESSAGE = 20 // Anthropic limits to 20 images
const ChatView = ({ isHidden, showAnnouncement, hideAnnouncement, showHistoryView }: ChatViewProps) => {
const { t } = useTranslation("translation", { keyPrefix: "chatView" })
const { version, clineMessages: messages, taskHistory, apiConfiguration } = useExtensionState()
//const task = messages.length > 0 ? (messages[0].say === "task" ? messages[0] : undefined) : undefined) : undefined
@ -669,8 +666,9 @@ const ChatView = ({ isHidden, showAnnouncement, hideAnnouncement, showHistoryVie
useEvent("wheel", handleWheel, window, { passive: true }) // passive improves scrolling performance
const placeholderText = useMemo(() => {
return task ? t("typeMessage") : t("typeTask")
}, [task, t])
const text = task ? "Type a message..." : "Type your task here..."
return text
}, [task])
const itemContent = useCallback(
(index: number, messageOrGroup: ClineMessage | ClineMessage[]) => {
@ -745,19 +743,18 @@ const ChatView = ({ isHidden, showAnnouncement, hideAnnouncement, showHistoryVie
}}>
{showAnnouncement && <Announcement version={version} hideAnnouncement={hideAnnouncement} />}
<div style={{ padding: "0 20px", flexShrink: 0 }}>
<h2>{t("whatCanIDoForYou")}</h2>
<h2>What can I do for you?</h2>
<p>
<Trans
i18nKey="chatView.thanksTo"
components={{
ClaudeLink: (
<VSCodeLink
href="https://www-cdn.anthropic.com/fed9cc193a14b84131812372d8d5857f8f304c52/Model_Card_Claude_3_Addendum.pdf"
style={{ display: "inline" }}
/>
),
}}
/>
Thanks to{" "}
<VSCodeLink
href="https://www-cdn.anthropic.com/fed9cc193a14b84131812372d8d5857f8f304c52/Model_Card_Claude_3_Addendum.pdf"
style={{ display: "inline" }}>
Claude 3.5 Sonnet's agentic coding capabilities,
</VSCodeLink>{" "}
I can handle complex software development tasks step-by-step. With tools that let me create & edit
files, explore complex projects, use the browser, and execute terminal commands (after you grant
permission), I can assist you in ways that go beyond code completion or tech support. I can even use
MCP to create new tools and extend my own capabilities.
</p>
</div>
{taskHistory.length > 0 && <HistoryPreview showHistoryView={showHistoryView} />}

View file

@ -3,14 +3,12 @@ import { useExtensionState } from "../../context/ExtensionStateContext"
import { vscode } from "../../utils/vscode"
import { memo } from "react"
import { formatLargeNumber } from "../../utils/format"
import { useTranslation } from "react-i18next"
type HistoryPreviewProps = {
showHistoryView: () => void
}
const HistoryPreview = ({ showHistoryView }: HistoryPreviewProps) => {
const { t } = useTranslation("translation", { keyPrefix: "historyPreview" })
const { taskHistory } = useExtensionState()
const handleHistorySelect = (id: string) => {
vscode.postMessage({ type: "showTaskWithId", text: id })
@ -71,7 +69,7 @@ const HistoryPreview = ({ showHistoryView }: HistoryPreviewProps) => {
fontSize: "0.85em",
textTransform: "uppercase",
}}>
{t("recentTasks")}
Recent Tasks
</span>
</div>
@ -114,14 +112,13 @@ const HistoryPreview = ({ showHistoryView }: HistoryPreviewProps) => {
color: "var(--vscode-descriptionForeground)",
}}>
<span>
{t("tokens")}: {formatLargeNumber(item.tokensIn || 0)}
{formatLargeNumber(item.tokensOut || 0)}
Tokens: {formatLargeNumber(item.tokensIn || 0)} {formatLargeNumber(item.tokensOut || 0)}
</span>
{!!item.cacheWrites && (
<>
{" • "}
<span>
{t("cache")}: +{formatLargeNumber(item.cacheWrites || 0)} {" "}
Cache: +{formatLargeNumber(item.cacheWrites || 0)} {" "}
{formatLargeNumber(item.cacheReads || 0)}
</span>
</>
@ -129,9 +126,7 @@ const HistoryPreview = ({ showHistoryView }: HistoryPreviewProps) => {
{!!item.totalCost && (
<>
{" • "}
<span>
{t("apiCost")}: ${item.totalCost?.toFixed(4)}
</span>
<span>API Cost: ${item.totalCost?.toFixed(4)}</span>
</>
)}
</div>
@ -155,7 +150,7 @@ const HistoryPreview = ({ showHistoryView }: HistoryPreviewProps) => {
fontSize: "var(--vscode-font-size)",
color: "var(--vscode-descriptionForeground)",
}}>
{t("viewAllHistory")}
View all history
</div>
</VSCodeButton>
</div>

View file

@ -6,7 +6,6 @@ import { memo, useMemo, useState, useEffect } from "react"
import Fuse, { FuseResult } from "fuse.js"
import { formatLargeNumber } from "../../utils/format"
import { formatSize } from "../../utils/size"
import { useTranslation } from "react-i18next"
type HistoryViewProps = {
onDone: () => void
@ -15,7 +14,6 @@ type HistoryViewProps = {
type SortOption = "newest" | "oldest" | "mostExpensive" | "mostTokens" | "mostRelevant"
const HistoryView = ({ onDone }: HistoryViewProps) => {
const { t } = useTranslation("translation", { keyPrefix: "historyView" })
const { taskHistory } = useExtensionState()
const [searchQuery, setSearchQuery] = useState("")
const [sortOption, setSortOption] = useState<SortOption>("newest")
@ -144,9 +142,9 @@ const HistoryView = ({ onDone }: HistoryViewProps) => {
color: "var(--vscode-foreground)",
margin: 0,
}}>
{t("history")}
History
</h3>
<VSCodeButton onClick={onDone}>{t("done")}</VSCodeButton>
<VSCodeButton onClick={onDone}>Done</VSCodeButton>
</div>
<div style={{ padding: "5px 17px 6px 17px" }}>
<div
@ -157,7 +155,7 @@ const HistoryView = ({ onDone }: HistoryViewProps) => {
}}>
<VSCodeTextField
style={{ width: "100%" }}
placeholder={t("fuzzySearchHistory")}
placeholder="Fuzzy search history..."
value={searchQuery}
onInput={(e) => {
const newValue = (e.target as HTMLInputElement)?.value
@ -194,12 +192,12 @@ const HistoryView = ({ onDone }: HistoryViewProps) => {
style={{ display: "flex", flexWrap: "wrap" }}
value={sortOption}
onChange={(e) => setSortOption((e.target as HTMLInputElement).value as SortOption)}>
<VSCodeRadio value="newest">{t("newest")}</VSCodeRadio>
<VSCodeRadio value="oldest">{t("oldest")}</VSCodeRadio>
<VSCodeRadio value="mostExpensive">{t("mostExpensive")}</VSCodeRadio>
<VSCodeRadio value="mostTokens">{t("mostTokens")}</VSCodeRadio>
<VSCodeRadio value="newest">Newest</VSCodeRadio>
<VSCodeRadio value="oldest">Oldest</VSCodeRadio>
<VSCodeRadio value="mostExpensive">Most Expensive</VSCodeRadio>
<VSCodeRadio value="mostTokens">Most Tokens</VSCodeRadio>
<VSCodeRadio value="mostRelevant" disabled={!searchQuery} style={{ opacity: searchQuery ? 1 : 0.5 }}>
{t("mostRelevant")}
Most Relevant
</VSCodeRadio>
</VSCodeRadioGroup>
</div>
@ -321,7 +319,7 @@ const HistoryView = ({ onDone }: HistoryViewProps) => {
fontWeight: 500,
color: "var(--vscode-descriptionForeground)",
}}>
{t("tokens")}
Tokens:
</span>
<span
style={{
@ -374,7 +372,7 @@ const HistoryView = ({ onDone }: HistoryViewProps) => {
fontWeight: 500,
color: "var(--vscode-descriptionForeground)",
}}>
{t("cache")}
Cache:
</span>
<span
style={{
@ -431,7 +429,7 @@ const HistoryView = ({ onDone }: HistoryViewProps) => {
fontWeight: 500,
color: "var(--vscode-descriptionForeground)",
}}>
{t("apiCost")}
API Cost:
</span>
<span
style={{
@ -454,20 +452,17 @@ const HistoryView = ({ onDone }: HistoryViewProps) => {
)
}
const ExportButton = ({ itemId }: { itemId: string }) => {
const { t } = useTranslation("translation", { keyPrefix: "historyView" })
return (
<VSCodeButton
className="export-button"
appearance="icon"
onClick={(e) => {
e.stopPropagation()
vscode.postMessage({ type: "exportTaskWithId", text: itemId })
}}>
<div style={{ fontSize: "11px", fontWeight: 500, opacity: 1 }}>{t("export")}</div>
</VSCodeButton>
)
}
const ExportButton = ({ itemId }: { itemId: string }) => (
<VSCodeButton
className="export-button"
appearance="icon"
onClick={(e) => {
e.stopPropagation()
vscode.postMessage({ type: "exportTaskWithId", text: itemId })
}}>
<div style={{ fontSize: "11px", fontWeight: 500, opacity: 1 }}>EXPORT</div>
</VSCodeButton>
)
// https://gist.github.com/evenfrost/1ba123656ded32fb7a0cd4651efd4db0
export const highlight = (fuseSearchResult: FuseResult<any>[], highlightClassName: string = "history-item-highlight") => {

View file

@ -8,10 +8,7 @@ import {
VSCodeTextField,
} from "@vscode/webview-ui-toolkit/react"
import { Fragment, memo, useCallback, useEffect, useMemo, useState } from "react"
import { Trans, useTranslation } from "react-i18next"
import { useEvent, useInterval } from "react-use"
import styled from "styled-components"
import * as vscodemodels from "vscode"
import {
ApiConfiguration,
ApiProvider,
@ -40,6 +37,8 @@ import { useExtensionState } from "../../context/ExtensionStateContext"
import { vscode } from "../../utils/vscode"
import VSCodeButtonLink from "../common/VSCodeButtonLink"
import OpenRouterModelPicker, { ModelDescriptionMarkdown } from "./OpenRouterModelPicker"
import styled from "styled-components"
import * as vscodemodels from "vscode"
interface ApiOptionsProps {
showModelOptions: boolean
@ -73,7 +72,6 @@ declare module "vscode" {
}
const ApiOptions = ({ showModelOptions, apiErrorMessage, modelIdErrorMessage, isPopup }: ApiOptionsProps) => {
const { t } = useTranslation("translation", { keyPrefix: "apiOptions" })
const { apiConfiguration, setApiConfiguration, uriScheme } = useExtensionState()
const [ollamaModels, setOllamaModels] = useState<string[]>([])
const [lmStudioModels, setLmStudioModels] = useState<string[]>([])
@ -83,7 +81,10 @@ const ApiOptions = ({ showModelOptions, apiErrorMessage, modelIdErrorMessage, is
const [isDescriptionExpanded, setIsDescriptionExpanded] = useState(false)
const handleInputChange = (field: keyof ApiConfiguration) => (event: any) => {
setApiConfiguration({ ...apiConfiguration, [field]: event.target.value })
setApiConfiguration({
...apiConfiguration,
[field]: event.target.value,
})
}
const { selectedProvider, selectedModelId, selectedModelInfo } = useMemo(() => {
@ -93,7 +94,10 @@ const ApiOptions = ({ showModelOptions, apiErrorMessage, modelIdErrorMessage, is
// Poll ollama/lmstudio models
const requestLocalModels = useCallback(() => {
if (selectedProvider === "ollama") {
vscode.postMessage({ type: "requestOllamaModels", text: apiConfiguration?.ollamaBaseUrl })
vscode.postMessage({
type: "requestOllamaModels",
text: apiConfiguration?.ollamaBaseUrl,
})
} else if (selectedProvider === "lmstudio") {
vscode.postMessage({
type: "requestLmStudioModels",
@ -140,7 +144,7 @@ const ApiOptions = ({ showModelOptions, apiErrorMessage, modelIdErrorMessage, is
value={selectedModelId}
onChange={handleInputChange("apiModelId")}
style={{ width: "100%" }}>
<VSCodeOption value="">{t("selectModel")}</VSCodeOption>
<VSCodeOption value="">Select a model...</VSCodeOption>
{Object.keys(models).map((modelId) => (
<VSCodeOption
key={modelId}
@ -161,13 +165,16 @@ const ApiOptions = ({ showModelOptions, apiErrorMessage, modelIdErrorMessage, is
<div style={{ display: "flex", flexDirection: "column", gap: 5, marginBottom: isPopup ? -10 : 0 }}>
<DropdownContainer className="dropdown-container">
<label htmlFor="api-provider">
<span style={{ fontWeight: 500 }}>{t("apiProvider")}</span>
<span style={{ fontWeight: 500 }}>API Provider</span>
</label>
<VSCodeDropdown
id="api-provider"
value={selectedProvider}
onChange={handleInputChange("apiProvider")}
style={{ minWidth: 130, position: "relative" }}>
style={{
minWidth: 130,
position: "relative",
}}>
<VSCodeOption value="openrouter">OpenRouter</VSCodeOption>
<VSCodeOption value="anthropic">Anthropic</VSCodeOption>
<VSCodeOption value="gemini">Google Gemini</VSCodeOption>
@ -176,7 +183,7 @@ const ApiOptions = ({ showModelOptions, apiErrorMessage, modelIdErrorMessage, is
<VSCodeOption value="vertex">GCP Vertex AI</VSCodeOption>
<VSCodeOption value="bedrock">AWS Bedrock</VSCodeOption>
<VSCodeOption value="openai-native">OpenAI</VSCodeOption>
<VSCodeOption value="openai">{t("getCompatibleVendor", { vendor: "OpenAI" })}</VSCodeOption>
<VSCodeOption value="openai">OpenAI Compatible</VSCodeOption>
<VSCodeOption value="vscode-lm">VS Code LM API</VSCodeOption>
<VSCodeOption value="lmstudio">LM Studio</VSCodeOption>
<VSCodeOption value="ollama">Ollama</VSCodeOption>
@ -190,7 +197,7 @@ const ApiOptions = ({ showModelOptions, apiErrorMessage, modelIdErrorMessage, is
style={{ width: "100%" }}
type="password"
onInput={handleInputChange("apiKey")}
placeholder={t("enterApiKey")}>
placeholder="Enter API Key...">
<span style={{ fontWeight: 500 }}>Anthropic API Key</span>
</VSCodeTextField>
@ -200,10 +207,13 @@ const ApiOptions = ({ showModelOptions, apiErrorMessage, modelIdErrorMessage, is
const isChecked = e.target.checked === true
setAnthropicBaseUrlSelected(isChecked)
if (!isChecked) {
setApiConfiguration({ ...apiConfiguration, anthropicBaseUrl: "" })
setApiConfiguration({
...apiConfiguration,
anthropicBaseUrl: "",
})
}
}}>
{t("useCustomBaseUrl")}
Use custom base URL
</VSCodeCheckbox>
{anthropicBaseUrlSelected && (
@ -222,7 +232,7 @@ const ApiOptions = ({ showModelOptions, apiErrorMessage, modelIdErrorMessage, is
marginTop: 3,
color: "var(--vscode-descriptionForeground)",
}}>
{t("apiKeyInfo")}
This key is stored locally and only used to make API requests from this extension.
{!apiConfiguration?.apiKey && (
<VSCodeLink
href="https://console.anthropic.com/settings/keys"
@ -230,7 +240,7 @@ const ApiOptions = ({ showModelOptions, apiErrorMessage, modelIdErrorMessage, is
display: "inline",
fontSize: "inherit",
}}>
{t("getApiKeyMessage", { vendor: "Anthropic" })}
You can get an Anthropic API key by signing up here.
</VSCodeLink>
)}
</p>
@ -244,8 +254,8 @@ const ApiOptions = ({ showModelOptions, apiErrorMessage, modelIdErrorMessage, is
style={{ width: "100%" }}
type="password"
onInput={handleInputChange("openAiNativeApiKey")}
placeholder={t("enterApiKey")}>
<span style={{ fontWeight: 500 }}>{t("getApiVendorKey", { vendor: "OpenAI" })}</span>
placeholder="Enter API Key...">
<span style={{ fontWeight: 500 }}>OpenAI API Key</span>
</VSCodeTextField>
<p
style={{
@ -253,7 +263,7 @@ const ApiOptions = ({ showModelOptions, apiErrorMessage, modelIdErrorMessage, is
marginTop: 3,
color: "var(--vscode-descriptionForeground)",
}}>
{t("apiKeyInfo")}
This key is stored locally and only used to make API requests from this extension.
{!apiConfiguration?.openAiNativeApiKey && (
<VSCodeLink
href="https://platform.openai.com/api-keys"
@ -261,7 +271,7 @@ const ApiOptions = ({ showModelOptions, apiErrorMessage, modelIdErrorMessage, is
display: "inline",
fontSize: "inherit",
}}>
{t("getApiKeyMessage", { vendor: "OpenAI" })}
You can get an OpenAI API key by signing up here.
</VSCodeLink>
)}
</p>
@ -275,8 +285,8 @@ const ApiOptions = ({ showModelOptions, apiErrorMessage, modelIdErrorMessage, is
style={{ width: "100%" }}
type="password"
onInput={handleInputChange("deepSeekApiKey")}
placeholder={t("enterApiKey")}>
<span style={{ fontWeight: 500 }}>{t("getApiVendorKey", { vendor: "DeepSeek" })}</span>
placeholder="Enter API Key...">
<span style={{ fontWeight: 500 }}>DeepSeek API Key</span>
</VSCodeTextField>
<p
style={{
@ -284,7 +294,7 @@ const ApiOptions = ({ showModelOptions, apiErrorMessage, modelIdErrorMessage, is
marginTop: 3,
color: "var(--vscode-descriptionForeground)",
}}>
{t("apiKeyInfo")}
This key is stored locally and only used to make API requests from this extension.
{!apiConfiguration?.deepSeekApiKey && (
<VSCodeLink
href="https://www.deepseek.com/"
@ -292,7 +302,7 @@ const ApiOptions = ({ showModelOptions, apiErrorMessage, modelIdErrorMessage, is
display: "inline",
fontSize: "inherit",
}}>
{t("getApiKeyMessage", { vendor: "DeepSeek" })}
You can get a DeepSeek API key by signing up here.
</VSCodeLink>
)}
</p>
@ -306,8 +316,8 @@ const ApiOptions = ({ showModelOptions, apiErrorMessage, modelIdErrorMessage, is
style={{ width: "100%" }}
type="password"
onInput={handleInputChange("mistralApiKey")}
placeholder={t("enterApiKey")}>
<span style={{ fontWeight: 500 }}>{t("getApiVendorKey", { vendor: "Mistral" })}</span>
placeholder="Enter API Key...">
<span style={{ fontWeight: 500 }}>Mistral API Key</span>
</VSCodeTextField>
<p
style={{
@ -315,7 +325,7 @@ const ApiOptions = ({ showModelOptions, apiErrorMessage, modelIdErrorMessage, is
marginTop: 3,
color: "var(--vscode-descriptionForeground)",
}}>
{t("apiKeyInfo")}
This key is stored locally and only used to make API requests from this extension.
{!apiConfiguration?.mistralApiKey && (
<VSCodeLink
href="https://console.mistral.ai/codestral"
@ -323,7 +333,7 @@ const ApiOptions = ({ showModelOptions, apiErrorMessage, modelIdErrorMessage, is
display: "inline",
fontSize: "inherit",
}}>
{t("getApiKeyMessage", { vendor: "Mistral" })}
You can get a Mistral API key by signing up here.
</VSCodeLink>
)}
</p>
@ -337,15 +347,15 @@ const ApiOptions = ({ showModelOptions, apiErrorMessage, modelIdErrorMessage, is
style={{ width: "100%" }}
type="password"
onInput={handleInputChange("openRouterApiKey")}
placeholder={t("enterApiKey")}>
<span style={{ fontWeight: 500 }}>{t("getApiVendorKey", { vendor: "OpenRouter" })}</span>
placeholder="Enter API Key...">
<span style={{ fontWeight: 500 }}>OpenRouter API Key</span>
</VSCodeTextField>
{!apiConfiguration?.openRouterApiKey && (
<VSCodeButtonLink
href={getOpenRouterAuthUrl(uriScheme)}
style={{ margin: "5px 0 0 0" }}
appearance="secondary">
{t("getApiKeyMessage", { vendor: "OpenRouter" })}
Get OpenRouter API Key
</VSCodeButtonLink>
)}
<p
@ -354,47 +364,58 @@ const ApiOptions = ({ showModelOptions, apiErrorMessage, modelIdErrorMessage, is
marginTop: "5px",
color: "var(--vscode-descriptionForeground)",
}}>
{t("apiKeyInfo")}
This key is stored locally and only used to make API requests from this extension.{" "}
{/* {!apiConfiguration?.openRouterApiKey && (
<span style={{ color: "var(--vscode-charts-green)" }}>
(<span style={{ fontWeight: 500 }}>Note:</span> OpenRouter is recommended for high rate
limits, prompt caching, and wider selection of models.)
</span>
)} */}
</p>
</div>
)}
{selectedProvider === "bedrock" && (
<div style={{ display: "flex", flexDirection: "column", gap: 5 }}>
<div
style={{
display: "flex",
flexDirection: "column",
gap: 5,
}}>
<VSCodeTextField
value={apiConfiguration?.awsAccessKey || ""}
style={{ width: "100%" }}
type="password"
onInput={handleInputChange("awsAccessKey")}
placeholder={t("enterAwsAccessKey")}>
<span style={{ fontWeight: 500 }}>{t("awsAccessKey")}</span>
placeholder="Enter Access Key...">
<span style={{ fontWeight: 500 }}>AWS Access Key</span>
</VSCodeTextField>
<VSCodeTextField
value={apiConfiguration?.awsSecretKey || ""}
style={{ width: "100%" }}
type="password"
onInput={handleInputChange("awsSecretKey")}
placeholder={t("enterAwsSecretKey")}>
<span style={{ fontWeight: 500 }}>{t("awsSecretKey")}</span>
placeholder="Enter Secret Key...">
<span style={{ fontWeight: 500 }}>AWS Secret Key</span>
</VSCodeTextField>
<VSCodeTextField
value={apiConfiguration?.awsSessionToken || ""}
style={{ width: "100%" }}
type="password"
onInput={handleInputChange("awsSessionToken")}
placeholder={t("enterAwsSessionToken")}>
<span style={{ fontWeight: 500 }}>{t("awsSessionToken")}</span>
placeholder="Enter Session Token...">
<span style={{ fontWeight: 500 }}>AWS Session Token</span>
</VSCodeTextField>
<DropdownContainer zIndex={DROPDOWN_Z_INDEX - 1} className="dropdown-container">
<label htmlFor="aws-region-dropdown">
<span style={{ fontWeight: 500 }}>{t("getRegion", { vendor: "AWS" })}</span>
<span style={{ fontWeight: 500 }}>AWS Region</span>
</label>
<VSCodeDropdown
id="aws-region-dropdown"
value={apiConfiguration?.awsRegion || ""}
style={{ width: "100%" }}
onChange={handleInputChange("awsRegion")}>
<VSCodeOption value="">{t("selectRegion")}</VSCodeOption>
<VSCodeOption value="">Select a region...</VSCodeOption>
{/* The user will have to choose a region that supports the model they use, but this shouldn't be a problem since they'd have to request access for it in that region in the first place. */}
<VSCodeOption value="us-east-1">us-east-1</VSCodeOption>
<VSCodeOption value="us-east-2">us-east-2</VSCodeOption>
@ -426,9 +447,12 @@ const ApiOptions = ({ showModelOptions, apiErrorMessage, modelIdErrorMessage, is
checked={apiConfiguration?.awsUseCrossRegionInference || false}
onChange={(e: any) => {
const isChecked = e.target.checked === true
setApiConfiguration({ ...apiConfiguration, awsUseCrossRegionInference: isChecked })
setApiConfiguration({
...apiConfiguration,
awsUseCrossRegionInference: isChecked,
})
}}>
{t("useCrossRegionInference")}
Use cross-region inference
</VSCodeCheckbox>
<p
style={{
@ -436,30 +460,37 @@ const ApiOptions = ({ showModelOptions, apiErrorMessage, modelIdErrorMessage, is
marginTop: "5px",
color: "var(--vscode-descriptionForeground)",
}}>
{t("awsInfo")}
Authenticate by either providing the keys above or use the default AWS credential providers, i.e.
~/.aws/credentials or environment variables. These credentials are only used locally to make API requests
from this extension.
</p>
</div>
)}
{apiConfiguration?.apiProvider === "vertex" && (
<div style={{ display: "flex", flexDirection: "column", gap: 5 }}>
<div
style={{
display: "flex",
flexDirection: "column",
gap: 5,
}}>
<VSCodeTextField
value={apiConfiguration?.vertexProjectId || ""}
style={{ width: "100%" }}
onInput={handleInputChange("vertexProjectId")}
placeholder={t("enterGcpProjectId")}>
<span style={{ fontWeight: 500 }}>{t("gcpProjectId")}</span>
placeholder="Enter Project ID...">
<span style={{ fontWeight: 500 }}>Google Cloud Project ID</span>
</VSCodeTextField>
<DropdownContainer zIndex={DROPDOWN_Z_INDEX - 2} className="dropdown-container">
<label htmlFor="vertex-region-dropdown">
<span style={{ fontWeight: 500 }}>{t("getRegion", { vendor: "Google Cloud" })}</span>
<span style={{ fontWeight: 500 }}>Google Cloud Region</span>
</label>
<VSCodeDropdown
id="vertex-region-dropdown"
value={apiConfiguration?.vertexRegion || ""}
style={{ width: "100%" }}
onChange={handleInputChange("vertexRegion")}>
<VSCodeOption value="">{t("selectRegion")}</VSCodeOption>
<VSCodeOption value="">Select a region...</VSCodeOption>
<VSCodeOption value="us-east5">us-east5</VSCodeOption>
<VSCodeOption value="us-central1">us-central1</VSCodeOption>
<VSCodeOption value="europe-west1">europe-west1</VSCodeOption>
@ -473,12 +504,17 @@ const ApiOptions = ({ showModelOptions, apiErrorMessage, modelIdErrorMessage, is
marginTop: "5px",
color: "var(--vscode-descriptionForeground)",
}}>
<Trans
i18nKey="apiOptions.gcpLinks"
components={{
Link: <VSCodeLink />,
}}
/>
To use Google Cloud Vertex AI, you need to
<VSCodeLink
href="https://cloud.google.com/vertex-ai/generative-ai/docs/partner-models/use-claude#before_you_begin"
style={{ display: "inline", fontSize: "inherit" }}>
{"1) create a Google Cloud account enable the Vertex AI API enable the desired Claude models,"}
</VSCodeLink>{" "}
<VSCodeLink
href="https://cloud.google.com/docs/authentication/provide-credentials-adc#google-idp"
style={{ display: "inline", fontSize: "inherit" }}>
{"2) install the Google Cloud CLI configure Application Default Credentials."}
</VSCodeLink>
</p>
</div>
)}
@ -490,8 +526,8 @@ const ApiOptions = ({ showModelOptions, apiErrorMessage, modelIdErrorMessage, is
style={{ width: "100%" }}
type="password"
onInput={handleInputChange("geminiApiKey")}
placeholder={t("enterApiKey")}>
<span style={{ fontWeight: 500 }}>{t("getApiVendorKey", { vendor: "Gemini" })}</span>
placeholder="Enter API Key...">
<span style={{ fontWeight: 500 }}>Gemini API Key</span>
</VSCodeTextField>
<p
style={{
@ -499,7 +535,7 @@ const ApiOptions = ({ showModelOptions, apiErrorMessage, modelIdErrorMessage, is
marginTop: 3,
color: "var(--vscode-descriptionForeground)",
}}>
{t("apiKeyInfo")}
This key is stored locally and only used to make API requests from this extension.
{!apiConfiguration?.geminiApiKey && (
<VSCodeLink
href="https://ai.google.dev/"
@ -507,7 +543,7 @@ const ApiOptions = ({ showModelOptions, apiErrorMessage, modelIdErrorMessage, is
display: "inline",
fontSize: "inherit",
}}>
{t("getApiKeyMessage", { vendor: "Gemini" })}
You can get a Gemini API key by signing up here.
</VSCodeLink>
)}
</p>
@ -521,23 +557,23 @@ const ApiOptions = ({ showModelOptions, apiErrorMessage, modelIdErrorMessage, is
style={{ width: "100%" }}
type="url"
onInput={handleInputChange("openAiBaseUrl")}
placeholder={t("enterBaseUrl")}>
<span style={{ fontWeight: 500 }}>{t("baseUrl")}</span>
placeholder={"Enter base URL..."}>
<span style={{ fontWeight: 500 }}>Base URL</span>
</VSCodeTextField>
<VSCodeTextField
value={apiConfiguration?.openAiApiKey || ""}
style={{ width: "100%" }}
type="password"
onInput={handleInputChange("openAiApiKey")}
placeholder={t("enterApiKey")}>
<span style={{ fontWeight: 500 }}>{t("apiKey")}</span>
placeholder="Enter API Key...">
<span style={{ fontWeight: 500 }}>API Key</span>
</VSCodeTextField>
<VSCodeTextField
value={apiConfiguration?.openAiModelId || ""}
style={{ width: "100%" }}
onInput={handleInputChange("openAiModelId")}
placeholder={t("enterModelId")}>
<span style={{ fontWeight: 500 }}>{t("modelId")}</span>
placeholder={"Enter Model ID..."}>
<span style={{ fontWeight: 500 }}>Model ID</span>
</VSCodeTextField>
<VSCodeCheckbox
checked={azureApiVersionSelected}
@ -545,17 +581,20 @@ const ApiOptions = ({ showModelOptions, apiErrorMessage, modelIdErrorMessage, is
const isChecked = e.target.checked === true
setAzureApiVersionSelected(isChecked)
if (!isChecked) {
setApiConfiguration({ ...apiConfiguration, azureApiVersion: "" })
setApiConfiguration({
...apiConfiguration,
azureApiVersion: "",
})
}
}}>
{t("setAzureApiVersion")}
Set Azure API version
</VSCodeCheckbox>
{azureApiVersionSelected && (
<VSCodeTextField
value={apiConfiguration?.azureApiVersion || ""}
style={{ width: "100%", marginTop: 3 }}
onInput={handleInputChange("azureApiVersion")}
placeholder={t("getDefault", azureOpenAiDefaultApiVersion)}
placeholder={`Default: ${azureOpenAiDefaultApiVersion}`}
/>
)}
<p
@ -564,13 +603,10 @@ const ApiOptions = ({ showModelOptions, apiErrorMessage, modelIdErrorMessage, is
marginTop: 3,
color: "var(--vscode-descriptionForeground)",
}}>
<Trans
i18nKey="apiOptions.azureInfo"
components={{
Link: <VSCodeLink />,
ErrSpan: <span style={{ color: "var(--vscode-errorForeground)" }} />,
}}
/>
<span style={{ color: "var(--vscode-errorForeground)" }}>
(<span style={{ fontWeight: 500 }}>Note:</span> Cline uses complex prompts and works best with Claude
models. Less capable models may not work as expected.)
</span>
</p>
</div>
)}
@ -579,7 +615,7 @@ const ApiOptions = ({ showModelOptions, apiErrorMessage, modelIdErrorMessage, is
<div>
<DropdownContainer zIndex={DROPDOWN_Z_INDEX - 2} className="dropdown-container">
<label htmlFor="vscode-lm-model">
<span style={{ fontWeight: 500 }}>{t("languageModel")}</span>
<span style={{ fontWeight: 500 }}>Language Model</span>
</label>
{vsCodeLmModels.length > 0 ? (
<VSCodeDropdown
@ -602,7 +638,7 @@ const ApiOptions = ({ showModelOptions, apiErrorMessage, modelIdErrorMessage, is
})
}}
style={{ width: "100%" }}>
<VSCodeOption value="">{t("selectModel")}</VSCodeOption>
<VSCodeOption value="">Select a model...</VSCodeOption>
{vsCodeLmModels.map((model) => (
<VSCodeOption
key={`${model.vendor}/${model.family}`}
@ -618,7 +654,9 @@ const ApiOptions = ({ showModelOptions, apiErrorMessage, modelIdErrorMessage, is
marginTop: "5px",
color: "var(--vscode-descriptionForeground)",
}}>
{t("vscodeLanguageModelsInfo")}
The VS Code Language Model API allows you to run models provided by other VS Code extensions
(including but not limited to GitHub Copilot). The easiest way to get started is to install the
Copilot extension from the VS Marketplace and enabling Claude 3.5 Sonnet.
</p>
)}
@ -629,7 +667,7 @@ const ApiOptions = ({ showModelOptions, apiErrorMessage, modelIdErrorMessage, is
color: "var(--vscode-errorForeground)",
fontWeight: 500,
}}>
{t("experimentalFeature")}
Note: This is a very experimental integration and may not work as expected.
</p>
</DropdownContainer>
</div>
@ -642,15 +680,15 @@ const ApiOptions = ({ showModelOptions, apiErrorMessage, modelIdErrorMessage, is
style={{ width: "100%" }}
type="url"
onInput={handleInputChange("lmStudioBaseUrl")}
placeholder={t("getDefault", { defaultValue: "http://localhost/1234" })}>
<span style={{ fontWeight: 500 }}>{t("optionalBaseUrl")}</span>
placeholder={"Default: http://localhost:1234"}>
<span style={{ fontWeight: 500 }}>Base URL (optional)</span>
</VSCodeTextField>
<VSCodeTextField
value={apiConfiguration?.lmStudioModelId || ""}
style={{ width: "100%" }}
onInput={handleInputChange("lmStudioModelId")}
placeholder={"e.g. meta-llama-3.1-8b-instruct"}>
<span style={{ fontWeight: 500 }}>{t("modelId")}</span>
<span style={{ fontWeight: 500 }}>Model ID</span>
</VSCodeTextField>
{lmStudioModels.length > 0 && (
<VSCodeRadioGroup
@ -681,13 +719,22 @@ const ApiOptions = ({ showModelOptions, apiErrorMessage, modelIdErrorMessage, is
marginTop: "5px",
color: "var(--vscode-descriptionForeground)",
}}>
<Trans
i18nKey="apiOptions.lmStudioInfo"
components={{
Link: <VSCodeLink style={{ display: "inline", fontSize: "inherit" }} />,
ErrSpan: <span style={{ color: "var(--vscode-errorForeground)" }} />,
}}
/>
LM Studio allows you to run models locally on your computer. For instructions on how to get started, see
their
<VSCodeLink href="https://lmstudio.ai/docs" style={{ display: "inline", fontSize: "inherit" }}>
quickstart guide.
</VSCodeLink>
You will also need to start LM Studio's{" "}
<VSCodeLink
href="https://lmstudio.ai/docs/basics/server"
style={{ display: "inline", fontSize: "inherit" }}>
local server
</VSCodeLink>{" "}
feature to use it with this extension.{" "}
<span style={{ color: "var(--vscode-errorForeground)" }}>
(<span style={{ fontWeight: 500 }}>Note:</span> Cline uses complex prompts and works best with Claude
models. Less capable models may not work as expected.)
</span>
</p>
</div>
)}
@ -699,8 +746,8 @@ const ApiOptions = ({ showModelOptions, apiErrorMessage, modelIdErrorMessage, is
style={{ width: "100%" }}
type="url"
onInput={handleInputChange("ollamaBaseUrl")}
placeholder={t("getDefault", { defaultValue: "http://localhost:11434" })}>
<span style={{ fontWeight: 500 }}>{t("optionalBaseUrl")}</span>
placeholder={"Default: http://localhost:11434"}>
<span style={{ fontWeight: 500 }}>Base URL (optional)</span>
</VSCodeTextField>
<VSCodeTextField
value={apiConfiguration?.ollamaModelId || ""}
@ -738,15 +785,17 @@ const ApiOptions = ({ showModelOptions, apiErrorMessage, modelIdErrorMessage, is
marginTop: "5px",
color: "var(--vscode-descriptionForeground)",
}}>
{
<Trans
i18nKey="apiOptions.ollamaInfo"
components={{
Link: <VSCodeLink style={{ display: "inline", fontSize: "inherit" }} />,
ErrorSpan: <span style={{ color: "var(--vscode-errorForeground)" }} />,
}}
/>
}
Ollama allows you to run models locally on your computer. For instructions on how to get started, see
their
<VSCodeLink
href="https://github.com/ollama/ollama/blob/main/README.md"
style={{ display: "inline", fontSize: "inherit" }}>
quickstart guide.
</VSCodeLink>
<span style={{ color: "var(--vscode-errorForeground)" }}>
(<span style={{ fontWeight: 500 }}>Note:</span> Cline uses complex prompts and works best with Claude
models. Less capable models may not work as expected.)
</span>
</p>
</div>
)}
@ -771,7 +820,7 @@ const ApiOptions = ({ showModelOptions, apiErrorMessage, modelIdErrorMessage, is
<>
<DropdownContainer zIndex={DROPDOWN_Z_INDEX - 2} className="dropdown-container">
<label htmlFor="model-id">
<span style={{ fontWeight: 500 }}>{t("model")}</span>
<span style={{ fontWeight: 500 }}>Model</span>
</label>
{selectedProvider === "anthropic" && createDropdown(anthropicModels)}
{selectedProvider === "bedrock" && createDropdown(bedrockModels)}
@ -811,6 +860,7 @@ const ApiOptions = ({ showModelOptions, apiErrorMessage, modelIdErrorMessage, is
export function getOpenRouterAuthUrl(uriScheme?: string) {
return `https://openrouter.ai/auth?callback_url=${uriScheme || "vscode"}://saoudrizwan.claude-dev/openrouter`
}
export const formatPrice = (price: number) => {
return new Intl.NumberFormat("en-US", {
style: "currency",
@ -834,7 +884,6 @@ export const ModelInfoView = ({
isPopup?: boolean
}) => {
const isGemini = Object.keys(geminiModels).includes(selectedModelId)
const { t } = useTranslation("translation", { keyPrefix: "apiOptions" })
const infoItems = [
modelInfo.description && (
@ -849,64 +898,68 @@ export const ModelInfoView = ({
<ModelInfoSupportsItem
key="supportsImages"
isSupported={modelInfo.supportsImages ?? false}
supportsLabel={t("supportsImages")}
doesNotSupportLabel={t("doesNotSupportImages")}
supportsLabel="Supports images"
doesNotSupportLabel="Does not support images"
/>,
<ModelInfoSupportsItem
key="supportsComputerUse"
isSupported={modelInfo.supportsComputerUse ?? false}
supportsLabel={t("supportsComputerUse")}
doesNotSupportLabel={t("doesNotSupportComputerUse")}
supportsLabel="Supports computer use"
doesNotSupportLabel="Does not support computer use"
/>,
!isGemini && (
<ModelInfoSupportsItem
key="supportsPromptCache"
isSupported={modelInfo.supportsPromptCache}
supportsLabel={t("supportsPromptCache")}
doesNotSupportLabel={t("doesNotSupportPromptCache")}
supportsLabel="Supports prompt caching"
doesNotSupportLabel="Does not support prompt caching"
/>
),
modelInfo.maxTokens !== undefined && modelInfo.maxTokens > 0 && (
<span key="maxTokens">
<span style={{ fontWeight: 500 }}>{t("maxOutput")}:</span> {modelInfo.maxTokens?.toLocaleString()} {t("tokens")}
<span style={{ fontWeight: 500 }}>Max output:</span> {modelInfo.maxTokens?.toLocaleString()} tokens
</span>
),
modelInfo.inputPrice !== undefined && modelInfo.inputPrice > 0 && (
<span key="inputPrice">
<span style={{ fontWeight: 500 }}>{t("inputPrice")}:</span> {formatPrice(modelInfo.inputPrice)}/
{t("millionTokens")}
<span style={{ fontWeight: 500 }}>Input price:</span> {formatPrice(modelInfo.inputPrice)}/million tokens
</span>
),
modelInfo.supportsPromptCache && modelInfo.cacheWritesPrice && (
<span key="cacheWritesPrice">
<span style={{ fontWeight: 500 }}>{t("cacheWritesPrice")}:</span> {formatPrice(modelInfo.cacheWritesPrice || 0)}/
{t("millionTokens")}
<span style={{ fontWeight: 500 }}>Cache writes price:</span> {formatPrice(modelInfo.cacheWritesPrice || 0)}
/million tokens
</span>
),
modelInfo.supportsPromptCache && modelInfo.cacheReadsPrice && (
<span key="cacheReadsPrice">
<span style={{ fontWeight: 500 }}>{t("cacheReadsPrice")}:</span> {formatPrice(modelInfo.cacheReadsPrice || 0)}/
{t("millionTokens")}
<span style={{ fontWeight: 500 }}>Cache reads price:</span> {formatPrice(modelInfo.cacheReadsPrice || 0)}/million
tokens
</span>
),
modelInfo.outputPrice !== undefined && modelInfo.outputPrice > 0 && (
<span key="outputPrice">
<span style={{ fontWeight: 500 }}>{t("outputPrice")}:</span> {formatPrice(modelInfo.outputPrice)}/
{t("millionTokens")}
<span style={{ fontWeight: 500 }}>Output price:</span> {formatPrice(modelInfo.outputPrice)}/million tokens
</span>
),
isGemini && (
<span key="geminiInfo" style={{ fontStyle: "italic" }}>
{t("geminiInfo", { selectedModelId })}{" "}
* Free up to {selectedModelId && selectedModelId.includes("flash") ? "15" : "2"} requests per minute. After that,
billing depends on prompt size.{" "}
<VSCodeLink href="https://ai.google.dev/pricing" style={{ display: "inline", fontSize: "inherit" }}>
{t("pricingDetails")}
For more info, see pricing details.
</VSCodeLink>
</span>
),
].filter(Boolean)
return (
<p style={{ fontSize: "12px", marginTop: "2px", color: "var(--vscode-descriptionForeground)" }}>
<p
style={{
fontSize: "12px",
marginTop: "2px",
color: "var(--vscode-descriptionForeground)",
}}>
{infoItems.map((item, index) => (
<Fragment key={index}>
{item}
@ -963,7 +1016,11 @@ export function normalizeApiConfiguration(apiConfiguration?: ApiConfiguration):
selectedModelId = defaultId
selectedModelInfo = models[defaultId]
}
return { selectedProvider: provider, selectedModelId, selectedModelInfo }
return {
selectedProvider: provider,
selectedModelId,
selectedModelInfo,
}
}
switch (provider) {
case "anthropic":

View file

@ -1,41 +0,0 @@
import { VSCodeDropdown, VSCodeOption } from "@vscode/webview-ui-toolkit/react"
import { memo } from "react"
import { useTranslation } from "react-i18next"
import { vscode } from "../../utils/vscode"
const LanguageOptions = () => {
const { t, i18n } = useTranslation("translation", { keyPrefix: "settingsView", useSuspense: false })
const changeLanguage = (e: any) => {
const language = e.target.value
// i18n.changeLanguage(language)
vscode.postMessage({
type: "changeLanguage",
text: language,
})
}
return (
<div style={{ display: "flex", flexDirection: "column", gap: 5 }}>
<div className="dropdown-container">
<label htmlFor="language-dropdown">
<span style={{ fontWeight: 500 }}>{t("language")}</span>
</label>
<VSCodeDropdown
id="language-dropdown"
value={i18n.resolvedLanguage}
style={{ width: "100%" }}
onChange={changeLanguage}>
<VSCodeOption value="en">English</VSCodeOption>
<VSCodeOption value="es">Español</VSCodeOption>
<VSCodeOption value="de">Deutsch</VSCodeOption>
<VSCodeOption value="zh-CN">()</VSCodeOption>
<VSCodeOption value="zh-TW">()</VSCodeOption>
<VSCodeOption value="ja"></VSCodeOption>
</VSCodeDropdown>
</div>
</div>
)
}
export default memo(LanguageOptions)

View file

@ -1,13 +1,10 @@
import { VSCodeButton, VSCodeLink, VSCodeTextArea } from "@vscode/webview-ui-toolkit/react"
import { memo, useEffect, useState } from "react"
import { useTranslation } from "react-i18next"
import { useExtensionState } from "../../context/ExtensionStateContext"
import { validateApiConfiguration, validateModelId } from "../../utils/validate"
import { vscode } from "../../utils/vscode"
import ApiOptions from "./ApiOptions"
import LanguageOptions from "./LanguageOptions"
import SettingsButton from "../common/SettingsButton"
const IS_DEV = false // FIXME: use flags when packaging
type SettingsViewProps = {
@ -15,7 +12,6 @@ type SettingsViewProps = {
}
const SettingsView = ({ onDone }: SettingsViewProps) => {
const { t } = useTranslation("translation", { keyPrefix: "settingsView", useSuspense: false })
const { apiConfiguration, version, customInstructions, setCustomInstructions, openRouterModels } = useExtensionState()
const [apiErrorMessage, setApiErrorMessage] = useState<string | undefined>(undefined)
const [modelIdErrorMessage, setModelIdErrorMessage] = useState<string | undefined>(undefined)
@ -45,7 +41,7 @@ const SettingsView = ({ onDone }: SettingsViewProps) => {
// validate as soon as the component is mounted
/*
useEffect will use stale values of variables if they are not included in the dependency array. so trying to use useEffect with a dependency array of only one value for example will use any other variables' old values. In most cases you don't want this, and should opt to use react-use hooks.
useEffect(() => {
// uses someVar and anotherVar
// eslint-disable-next-line react-hooks/exhaustive-deps
@ -79,8 +75,8 @@ const SettingsView = ({ onDone }: SettingsViewProps) => {
marginBottom: "17px",
paddingRight: 17,
}}>
<h3 style={{ color: "var(--vscode-foreground)", margin: 0 }}>{t("settings")}</h3>
<VSCodeButton onClick={handleSubmit}>{t("done")}</VSCodeButton>
<h3 style={{ color: "var(--vscode-foreground)", margin: 0 }}>Settings</h3>
<VSCodeButton onClick={handleSubmit}>Done</VSCodeButton>
</div>
<div
style={{
@ -104,9 +100,9 @@ const SettingsView = ({ onDone }: SettingsViewProps) => {
style={{ width: "100%" }}
resize="vertical"
rows={4}
placeholder={t("customInstructionsPlaceholder")}
placeholder={'e.g. "Run unit tests at the end", "Use TypeScript with async/await", "Speak in Spanish"'}
onInput={(e: any) => setCustomInstructions(e.target?.value ?? "")}>
<span style={{ fontWeight: "500" }}>{t("customInstructions")}</span>
<span style={{ fontWeight: "500" }}>Custom Instructions</span>
</VSCodeTextArea>
<p
style={{
@ -114,18 +110,15 @@ const SettingsView = ({ onDone }: SettingsViewProps) => {
marginTop: "5px",
color: "var(--vscode-descriptionForeground)",
}}>
{t("customInstructionsDescription")}
These instructions are added to the end of the system prompt sent with every request.
</p>
</div>
<div style={{ marginBottom: 5 }}>
<LanguageOptions />
</div>
{IS_DEV && (
<>
<div style={{ marginTop: "10px", marginBottom: "4px" }}>{t("debug")}</div>
<div style={{ marginTop: "10px", marginBottom: "4px" }}>Debug</div>
<VSCodeButton onClick={handleResetState} style={{ marginTop: "5px", width: "auto" }}>
{t("resetState")}
Reset State
</VSCodeButton>
<p
style={{
@ -133,7 +126,7 @@ const SettingsView = ({ onDone }: SettingsViewProps) => {
marginTop: "5px",
color: "var(--vscode-descriptionForeground)",
}}>
{t("resetStateDescription")}
This will reset all global state and secret storage in the extension.
</p>
</>
)}
@ -168,7 +161,7 @@ const SettingsView = ({ onDone }: SettingsViewProps) => {
margin: 0,
padding: 0,
}}>
{t("feedback")}{" "}
If you have any questions or feedback, feel free to open an issue at{" "}
<VSCodeLink href="https://github.com/cline/cline" style={{ display: "inline" }}>
https://github.com/cline/cline
</VSCodeLink>

View file

@ -4,15 +4,10 @@ import { useExtensionState } from "../../context/ExtensionStateContext"
import { validateApiConfiguration } from "../../utils/validate"
import { vscode } from "../../utils/vscode"
import ApiOptions from "../settings/ApiOptions"
import { useTranslation } from "react-i18next"
import { Trans } from "react-i18next"
import { useEvent } from "react-use"
import { ExtensionMessage } from "../../../../src/shared/ExtensionMessage"
import LanguageOptions from "../settings/LanguageOptions"
const WelcomeView = () => {
const { t } = useTranslation("translation", { keyPrefix: "welcomeView" })
const { apiConfiguration } = useExtensionState()
const [apiErrorMessage, setApiErrorMessage] = useState<string | undefined>(undefined)
@ -61,27 +56,20 @@ const WelcomeView = () => {
padding: "0 20px",
overflow: "auto",
}}>
<h2>{t("greeting")}</h2>
<div style={{ marginBottom: "10px" }}>
<LanguageOptions />
</div>
<h2>Hi, I'm Cline</h2>
<p>
<Trans
i18nKey="welcomeView.description"
components={{
ClaudeLink: (
<VSCodeLink
href="https://www-cdn.anthropic.com/fed9cc193a14b84131812372d8d5857f8f304c52/Model_Card_Claude_3_Addendum.pdf"
style={{ display: "inline" }}
/>
),
}}
/>
I can do all kinds of tasks thanks to the latest breakthroughs in{" "}
<VSCodeLink
href="https://www-cdn.anthropic.com/fed9cc193a14b84131812372d8d5857f8f304c52/Model_Card_Claude_3_Addendum.pdf"
style={{ display: "inline" }}>
Claude 3.5 Sonnet's agentic coding capabilities
</VSCodeLink>{" "}
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.
</p>
<b>{t("getStarted")}</b>
<b>To get started, this extension needs an API provider for Claude 3.5 Sonnet.</b>
<div
style={{
@ -121,7 +109,7 @@ const WelcomeView = () => {
<div style={{ marginTop: "15px" }}>
<ApiOptions showModelOptions={false} />
<VSCodeButton onClick={handleSubmit} disabled={disableLetsGoButton} style={{ marginTop: "3px" }}>
{t("letsGo")}
Let's go!
</VSCodeButton>
</div>
</div>

View file

@ -35,7 +35,6 @@ export const ExtensionStateContextProvider: React.FC<{
shouldShowAnnouncement: false,
autoApprovalSettings: DEFAULT_AUTO_APPROVAL_SETTINGS,
browserSettings: DEFAULT_BROWSER_SETTINGS,
localeLanguage: "en",
chatSettings: DEFAULT_CHAT_SETTINGS,
isLoggedIn: false,
})

View file

@ -1,29 +0,0 @@
import i18n from "i18next"
import { initReactI18next } from "react-i18next"
import translationEN from "./locales/en/translation.json"
import translationES from "./locales/es/translation.json"
import translationDE from "./locales/de/translation.json"
import translationZHCN from "./locales/zh-cn/translation.json"
import translationZHTW from "./locales/zh-tw/translation.json"
import translationJA from "./locales/ja/translation.json"
i18n.use(initReactI18next) // passes i18n down to react-i18next
.init({
fallbackLng: "en",
debug: true,
react: {
bindI18n: "languageChanged",
transSupportBasicHtmlNodes: true,
transKeepBasicHtmlNodesFor: ["b", "i", "strong", "em", "br"],
},
})
i18n.addResourceBundle("en", "translation", translationEN)
i18n.addResourceBundle("es", "translation", translationES)
i18n.addResourceBundle("de", "translation", translationDE)
i18n.addResourceBundle("zh-CN", "translation", translationZHCN)
i18n.addResourceBundle("zh-TW", "translation", translationZHTW)
i18n.addResourceBundle("ja", "translation", translationJA)
export default i18n

View file

@ -4,7 +4,6 @@ import "./index.css"
import App from "./App"
import reportWebVitals from "./reportWebVitals"
import "../../node_modules/@vscode/codicons/dist/codicon.css"
import "./i18n"
const root = ReactDOM.createRoot(document.getElementById("root") as HTMLElement)
root.render(

View file

@ -1,174 +0,0 @@
{
"announcement": {
"newInVersion": "Neu in Version {{version}}",
"joinOurCommunities": "Treten Sie unserem <DiscordLink>Discord</DiscordLink> oder <RedditLink>Reddit</RedditLink> für weitere Updates bei!"
},
"settingsView": {
"settings": "Einstellungen",
"done": "Fertig",
"language": "Sprache",
"customInstructions": "Benutzerdefinierte Anweisungen",
"customInstructionsPlaceholder": "z.B. \"Führen Sie am Ende Unit-Tests durch\", \"Verwenden Sie TypeScript mit async/await\", \"Sprechen Sie auf Japanisch\"",
"customInstructionsDescription": "Diese Anweisungen werden am Ende des Systemprompts hinzugefügt, der mit jeder Anfrage gesendet wird.",
"debug": "Debuggen",
"resetState": "Zustand zurücksetzen",
"resetStateDescription": "Dies setzt den gesamten globalen Zustand und die geheime Speicherung in der Erweiterung zurück.",
"feedback": "Wenn Sie Fragen oder Feedback haben, können Sie gerne ein Issue eröffnen unter"
},
"apiOptions": {
"selectModel": "Modell auswählen...",
"model": "Modell",
"apiProvider": "API-Anbieter",
"enterApiKey": "API-Schlüssel eingeben...",
"apiKey": "API-Schlüssel",
"enterBaseUrl": "Basis-URL eingeben...",
"baseUrl": "Basis-URL",
"optionalBaseUrl": "Basis-URL (optional)",
"enterModelId": "Modell-ID eingeben...",
"modelId": "Modell-ID",
"useCustomBaseUrl": "Benutzerdefinierte Basis-URL verwenden",
"apiKeyInfo": "Dieser Schlüssel wird lokal gespeichert und nur verwendet, um API-Anfragen von dieser Erweiterung zu stellen.",
"getDefault": "Standard: {{defaultValue}}",
"getApiKeyMessage": "Sie können einen {{vendor}} API-Schlüssel erhalten, indem Sie sich hier anmelden.",
"getApiVendorKey": "{{vendor}} API-Schlüssel",
"getCompatibleVendor": "{{vendor}} kompatibel",
"lmStudioInfo": "LM Studio ermöglicht es Ihnen, Modelle lokal auf Ihrem Computer auszuführen. Anweisungen zum Einstieg finden Sie in ihrem <Link href=\"https://lmstudio.ai/docs\">Schnellstart-Handbuch.</Link> Sie müssen auch die <Link href=\"https://lmstudio.ai/docs/basics/server\">lokale Server</Link>-Funktion von LM Studio starten, um sie mit dieser Erweiterung zu verwenden. <ErrSpan>(<b>Hinweis:</b> Cline verwendet komplexe Prompts und funktioniert am besten mit Claude-Modellen. Weniger leistungsfähige Modelle funktionieren möglicherweise nicht wie erwartet.)</ErrSpan>",
"ollamaInfo": "Ollama ermöglicht es Ihnen, Modelle lokal auf Ihrem Computer auszuführen. Anweisungen zum Einstieg finden Sie in ihrem <Link href=\"https://github.com/ollama/ollama/blob/main/README.md\">Schnellstart-Handbuch.</Link> <ErrorSpan>(<b>Hinweis:</b> Cline verwendet komplexe Prompts und funktioniert am besten mit Claude-Modellen. Weniger leistungsfähige Modelle funktionieren möglicherweise nicht wie erwartet.)</ErrorSpan>",
"azureInfo": "<ErrSpan>(<b>Hinweis:</b> Cline verwendet komplexe Prompts und funktioniert am besten mit Claude-Modellen. Weniger leistungsfähige Modelle funktionieren möglicherweise nicht wie erwartet.)</ErrSpan>",
"setAzureApiVersion": "Azure API-Version festlegen",
"enterGcpProjectId": "Projekt-ID eingeben...",
"gcpProjectId": "Google Cloud Projekt-ID",
"gcpLinks": "Um Google Cloud Vertex AI zu verwenden, müssen Sie <Link href=\"https://cloud.google.com/vertex-ai/generative-ai/docs/partner-models/use-claude#before_you_begin\"> 1) ein Google Cloud-Konto erstellen die Vertex AI API aktivieren die gewünschten Claude-Modelle aktivieren, </Link><br /> <Link href=\"https://cloud.google.com/docs/authentication/provide-credentials-adc#google-idp\"> 2) die Google Cloud CLI installieren Anwendungsstandardanmeldeinformationen konfigurieren. </Link>",
"enterAwsAccessKey": "Zugangsschlüssel eingeben...",
"awsAccessKey": "AWS Zugangsschlüssel",
"enterAwsSecretKey": "Geheimschlüssel eingeben...",
"awsSecretKey": "AWS Geheimschlüssel",
"enterAwsSessionToken": "Sitzungstoken eingeben...",
"awsSessionToken": "AWS Sitzungstoken",
"getRegion": "{{vendor}} Region",
"selectRegion": "Region auswählen...",
"useCrossRegionInference": "Regionsübergreifende Inferenz verwenden",
"awsInfo": "Authentifizieren Sie sich entweder durch die Angabe der oben genannten Schlüssel oder verwenden Sie die Standard-AWS-Anmeldeinformationen, d.h. ~/.aws/credentials oder Umgebungsvariablen. Diese Anmeldeinformationen werden nur lokal verwendet, um API-Anfragen von dieser Erweiterung zu stellen.",
"vscodeLanguageModelsInfo": "Die VS Code Language Model API ermöglicht es Ihnen, Modelle zu verwenden, die von anderen VS Code-Erweiterungen bereitgestellt werden (einschließlich, aber nicht beschränkt auf GitHub Copilot). Der einfachste Weg, um loszulegen, ist die Installation der Copilot-Erweiterung aus dem VS Marketplace und die Aktivierung von Claude 3.5 Sonnet.",
"experimentalFeature": "Hinweis: Dies ist eine sehr experimentelle Integration und funktioniert möglicherweise nicht wie erwartet.",
"supportsImages": "Unterstützt Bilder",
"doesNotSupportImages": "Unterstützt keine Bilder",
"supportsComputerUse": "Unterstützt Computernutzung",
"doesNotSupportComputerUse": "Unterstützt keine Computernutzung",
"supportsPromptCache": "Unterstützt Prompt-Caching",
"doesNotSupportPromptCache": "Unterstützt kein Prompt-Caching",
"maxOutput": "Maximale Ausgabe",
"tokens": "Tokens",
"inputPrice": "Eingabepreis",
"millionTokens": "Millionen Tokens",
"cacheWritesPrice": "Cache-Schreibpreis",
"cacheReadsPrice": "Cache-Lesepreis",
"outputPrice": "Ausgabepreis",
"geminiInfo": "* Kostenlos bis zu {{selectedModelId}} Anfragen pro Minute. Danach hängt die Abrechnung von der Prompt-Größe ab.",
"pricingDetails": "Weitere Informationen finden Sie in den Preisdaten.",
"languageModel": "Sprachmodell"
},
"welcomeView": {
"greeting": "Hallo! Ich bin Cline, dein KI-Assistent.",
"description": "Ich kann alle möglichen Aufgaben dank der neuesten Durchbrüche in <ClaudeLink>Claude 3.5 Sonnets agentischen Codierungsfähigkeiten</ClaudeLink> und dem Zugriff auf Werkzeuge, 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 deiner Erlaubnis). Ich kann sogar MCP verwenden, um neue Werkzeuge zu erstellen und meine eigenen Fähigkeiten zu erweitern.",
"getStarted": "Um loszulegen, benötigt diese Erweiterung einen API-Anbieter für Claude 3.5 Sonnet.",
"letsGo": "Los geht's!"
},
"chatView": {
"typeMessage": "Nachricht eingeben...",
"typeTask": "Aufgabe eingeben...",
"whatCanIDoForYou": "Was kann ich für dich tun?",
"thanksTo": "Dank <ClaudeLink>Claude 3.5 Sonnets agentischen Codierungsfähigkeiten</ClaudeLink> kann ich komplexe Softwareentwicklungsaufgaben Schritt für Schritt bewältigen. Mit Werkzeugen, die es mir ermöglichen, Dateien zu erstellen und zu bearbeiten, komplexe Projekte zu erkunden, den Browser zu verwenden und Terminalbefehle auszuführen (nachdem du die Erlaubnis erteilt hast), kann ich dir auf eine Weise helfen, die über die Codevervollständigung oder den technischen Support hinausgeht. Ich kann sogar MCP verwenden, um neue Werkzeuge zu erstellen und meine eigenen Fähigkeiten zu erweitern."
},
"chatTextArea": {
"plan": "Planen",
"act": "Handeln"
},
"chatRow": {
"error": "Fehler",
"mistakeLimitReached": "Fehlergrenze erreicht",
"autoApprovalMaxReqReached": "Maximale Anzahl automatischer Genehmigungen erreicht",
"command": {
"ask": "Cline möchte diesen Befehl ausführen:",
"say": "Cline hat diesen Befehl ausgeführt:"
},
"useMcpServer": {
"ask": "Cline möchte dieses {type} auf {serverName} verwenden:",
"say": "Cline hat dieses {type} auf {serverName} verwendet:",
"tool": "Werkzeug",
"resource": "Ressource"
},
"completionResult": "Abschlussergebnis",
"apiReqCancelled": "API-Anfrage abgebrochen",
"apiStreamingFailed": "API-Streaming fehlgeschlagen",
"apiRequest": "API-Anfrage",
"apiRequestFailed": "API-Anfrage fehlgeschlagen",
"apiRequestInProgress": "API-Anfrage in Bearbeitung",
"followup": "Nachverfolgung",
"tool": {
"editedExistingFile": {
"ask": "Cline möchte diese Datei bearbeiten:",
"say": "Cline bearbeitet diese Datei:"
},
"createdNewFile": {
"ask": "Cline möchte diese Datei erstellen:",
"say": "Cline hat diese Datei erstellt:"
},
"readExistingFile": {
"ask": "Cline möchte diese Datei lesen:",
"say": "Cline hat diese Datei gelesen:"
}
},
"apiReqStarted": "API-Anfrage gestartet",
"userFeedback": "Benutzer-Feedback",
"userFeedbackDiff": "Benutzer-Feedback-Diff",
"diffEditFailed": "Diff-Bearbeitung fehlgeschlagen",
"shellIntegrationUnavailable": "Shell-Integration nicht verfügbar",
"mcpServerResponse": "MCP-Server-Antwort",
"planModeResponse": "Planmodus-Antwort",
"seeNewChanges": "Neue Änderungen anzeigen",
"commandRequiresApproval": "Das Modell hat bestimmt, dass dieser Befehl eine ausdrückliche Genehmigung erfordert.",
"troubleshootingGuide": "Es scheint, dass Sie Probleme mit Windows PowerShell haben. Bitte sehen Sie sich diesen <Link>Fehlerbehebungsleitfaden</Link> an.",
"clineWantsToViewTopLevelFiles": "Cline möchte die obersten Dateien in diesem Verzeichnis anzeigen:",
"clineViewedTopLevelFiles": "Cline hat die obersten Dateien in diesem Verzeichnis angezeigt:",
"clineWantsToRecursivelyViewFiles": "Cline möchte alle Dateien in diesem Verzeichnis rekursiv anzeigen:",
"clineRecursivelyViewedFiles": "Cline hat alle Dateien in diesem Verzeichnis rekursiv angezeigt:",
"clineWantsToViewSourceCodeDefinitions": "Cline möchte die in diesem Verzeichnis verwendeten Quellcode-Definitionsnamen anzeigen:",
"clineViewedSourceCodeDefinitions": "Cline hat die in diesem Verzeichnis verwendeten Quellcode-Definitionsnamen angezeigt:",
"clineWantsToSearchDirectory": "Cline möchte dieses Verzeichnis nach {{regex}} durchsuchen:",
"clineSearchedDirectory": "Cline hat dieses Verzeichnis nach {{regex}} durchsucht:",
"diffEditFailedMessage": "Dies passiert normalerweise, wenn das Modell Suchmuster verwendet, die nichts in der Datei finden. Erneut versuchen...",
"shellIntegrationUnavailableMessage": "Cline kann die Ausgabe des Befehls nicht anzeigen. Bitte aktualisiere VSCode (CMD/CTRL + Shift + P → \"Update\") und stelle sicher, dass du eine unterstützte Shell verwendest: zsh, bash, fish oder PowerShell (CMD/CTRL + Shift + P → \"Terminal: Standardprofil auswählen\"). Immer noch Probleme?",
"response": "Antwort",
"stillHavingTrouble": "Immer noch Probleme?"
},
"autoApproveMenu": {
"none": "Keine",
"autoApprove": "Automatische Genehmigung:",
"autoApproveDescription": "Die automatische Genehmigung ermöglicht es Cline, die folgenden Aktionen ohne Erlaubnis auszuführen. Bitte mit Vorsicht verwenden und nur aktivieren, wenn Sie die Risiken verstehen.",
"autoApproveMaxRequestsDescription": "Cline wird automatisch so viele API-Anfragen stellen, bevor eine Genehmigung zur Fortsetzung der Aufgabe erforderlich ist.",
"enableNotifications": "Benachrichtigungen aktivieren",
"enableNotificationsDescription": "Erhalte Systembenachrichtigungen, wenn Cline eine Genehmigung zur Fortsetzung benötigt oder wenn eine Aufgabe abgeschlossen ist."
},
"historyPreview": {
"recentTasks": "Kürzliche Aufgaben",
"tokens": "Tokens",
"cache": "Cache",
"apiCost": "API-Kosten",
"viewAllHistory": "Alle Verlauf anzeigen"
},
"historyView": {
"history": "Verlauf",
"done": "Fertig",
"fuzzySearchHistory": "Verlauf unscharf durchsuchen...",
"newest": "Neueste",
"oldest": "Älteste",
"mostExpensive": "Teuerste",
"mostTokens": "Meiste Tokens",
"mostRelevant": "Relevanteste",
"tokens": "Tokens:",
"cache": "Cache:",
"apiCost": "API-Kosten:",
"export": "EXPORTIEREN"
}
}

View file

@ -1,174 +0,0 @@
{
"announcement": {
"newInVersion": "New in version {{version}}",
"joinOurCommunities": "Join our <DiscordLink>Discord</DiscordLink> or <RedditLink>Reddit</RedditLink> for more updates!"
},
"settingsView": {
"settings": "Settings",
"done": "Done",
"language": "Language",
"customInstructions": "Custom Instructions",
"customInstructionsPlaceholder": "e.g. \"Run unit tests at the end\", \"Use TypeScript with async/await\", \"Speak in Japanese\"",
"customInstructionsDescription": "These instructions are added to the end of the system prompt sent with every request.",
"debug": "Debug",
"resetState": "Reset State",
"resetStateDescription": "This will reset all global state and secret storage in the extension.",
"feedback": "If you have any questions or feedback, feel free to open an issue at"
},
"apiOptions": {
"selectModel": "Select a Model...",
"model": "Model",
"apiProvider": "API Provider",
"enterApiKey": "Enter API Key...",
"apiKey": "API Key",
"enterBaseUrl": "Enter Base URL...",
"baseUrl": "Base URL",
"optionalBaseUrl": "Base URL (optional)",
"enterModelId": "Enter Model ID...",
"modelId": "Model ID",
"useCustomBaseUrl": "Use custom base URL",
"apiKeyInfo": "This key is stored locally and only used to make API requests from this extension.",
"getDefault": "Default: {{defaultValue}}",
"getApiKeyMessage": "You can get an {{vendor}} API key by signing up here.",
"getApiVendorKey": "{{vendor}} API Key",
"getCompatibleVendor": "{{vendor}} Compatible",
"lmStudioInfo": "LM Studio allows you to run models locally on your computer. For instructions on how to get started, see their <Link href=\"https://lmstudio.ai/docs\">quickstart guide.</Link> You will also need to start LM Studio's <Link href=\"https://lmstudio.ai/docs/basics/server\">local server</Link> feature to use it with this extension. <ErrSpan>(<b>Note:</b> Cline uses complex prompts and works best with Claude models. Less capable models may not work as expected.)</ErrSpan>",
"ollamaInfo": "Ollama allows you to run models locally on your computer. For instructions on how to get started, see their <Link href=\"https://github.com/ollama/ollama/blob/main/README.md\">quickstart guide.</Link> <ErrorSpan>(<b>Note:</b> Cline uses complex prompts and works best with Claude models. Less capable models may not work as expected.)</ErrorSpan>",
"azureInfo": "<ErrSpan>(<b>Note:</b> Cline uses complex prompts and works best with Claude models. Less capable models may not work as expected.)</ErrSpan>",
"setAzureApiVersion": "Set Azure API version",
"enterGcpProjectId": "Enter Project ID...",
"gcpProjectId": "Google Cloud Project ID",
"gcpLinks": "To use Google Cloud Vertex AI, you need to <Link href=\"https://cloud.google.com/vertex-ai/generative-ai/docs/partner-models/use-claude#before_you_begin\"> 1) create a Google Cloud account enable the Vertex AI API enable the desired Claude models, </Link><br /> <Link href=\"https://cloud.google.com/docs/authentication/provide-credentials-adc#google-idp\"> 2) install the Google Cloud CLI configure Application Default Credentials. </Link>",
"enterAwsAccessKey": "Enter Access Key...",
"awsAccessKey": "AWS Access Key",
"enterAwsSecretKey": "Enter Secret Key...",
"awsSecretKey": "AWS Secret Key",
"enterAwsSessionToken": "Enter Session Token...",
"awsSessionToken": "AWS Session Token",
"getRegion": "{{vendor}} Region",
"selectRegion": "Select a Region...",
"useCrossRegionInference": "Use cross-region inference",
"awsInfo": "Authenticate by either providing the keys above or use the default AWS credential providers, i.e. ~/.aws/credentials or environment variables. These credentials are only used locally to make API requests from this extension.",
"vscodeLanguageModelsInfo": "The VS Code Language Model API allows you to run models provided by other VS Code extensions (including but not limited to GitHub Copilot). The easiest way to get started is to install the Copilot extension from the VS Marketplace and enabling Claude 3.5 Sonnet.",
"experimentalFeature": "Note: This is a very experimental integration and may not work as expected.",
"supportsImages": "Supports images",
"doesNotSupportImages": "Does not support images",
"supportsComputerUse": "Supports computer use",
"doesNotSupportComputerUse": "Does not support computer use",
"supportsPromptCache": "Supports prompt caching",
"doesNotSupportPromptCache": "Does not support prompt caching",
"maxOutput": "Max output",
"tokens": "tokens",
"inputPrice": "Input price",
"millionTokens": "million tokens",
"cacheWritesPrice": "Cache writes price",
"cacheReadsPrice": "Cache reads price",
"outputPrice": "Output price",
"geminiInfo": "* Free up to {{selectedModelId}} requests per minute. After that, billing depends on prompt size.",
"pricingDetails": "For more info, see pricing details.",
"languageModel": "Language Model"
},
"welcomeView": {
"greeting": "Hello! I'm Cline, your AI assistant.",
"description": "I can do all kinds of tasks thanks to the latest breakthroughs in <ClaudeLink>Claude 3.5 Sonnet's agentic coding capabilities</ClaudeLink> 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.",
"getStarted": "To get started, this extension needs an API provider for Claude 3.5 Sonnet.",
"letsGo": "Let's go!"
},
"chatView": {
"typeMessage": "Type a message...",
"typeTask": "Type a task...",
"whatCanIDoForYou": "What can I do for you?",
"thanksTo": "Thanks to <ClaudeLink>Claude 3.5 Sonnet's agentic coding capabilities,</ClaudeLink> I can handle complex software development tasks step-by-step. With tools that let me create & edit files, explore complex projects, use the browser, and execute terminal commands (after you grant permission), I can assist you in ways that go beyond code completion or tech support. I can even use MCP to create new tools and extend my own capabilities."
},
"chatTextArea": {
"plan": "Plan",
"act": "Act"
},
"chatRow": {
"error": "Error",
"mistakeLimitReached": "Cline is having trouble...",
"autoApprovalMaxReqReached": "Maximum Requests Reached",
"command": {
"ask": "Cline wants to execute this command:",
"say": "Cline executed this command:"
},
"useMcpServer": {
"ask": "Cline wants to use this {type} on {serverName}:",
"say": "Cline used this {type} on {serverName}:",
"tool": "tool",
"resource": "resource"
},
"completionResult": "Task Completed",
"apiReqCancelled": "API Request Cancelled",
"apiStreamingFailed": "API Streaming Failed",
"apiRequest": "API Request",
"apiRequestFailed": "API Request Failed",
"apiRequestInProgress": "API Request...",
"followup": "Cline has a question:",
"tool": {
"editedExistingFile": {
"ask": "Cline wants to edit this file:",
"say": "Cline is editing this file:"
},
"createdNewFile": {
"ask": "Cline wants to create this file:",
"say": "Cline created this file:"
},
"readExistingFile": {
"ask": "Cline wants to read this file:",
"say": "Cline read this file:"
}
},
"apiReqStarted": "API Request Started",
"userFeedback": "User Feedback",
"userFeedbackDiff": "User Feedback Diff",
"diffEditFailed": "Diff Edit Failed",
"shellIntegrationUnavailable": "Shell Integration Unavailable",
"mcpServerResponse": "MCP Server Response",
"planModeResponse": "Plan Mode Response",
"seeNewChanges": "See new changes",
"commandRequiresApproval": "The model has determined this command requires explicit approval.",
"troubleshootingGuide": "It seems like you're having Windows PowerShell issues, please see this <Link>troubleshooting guide</Link>",
"clineWantsToViewTopLevelFiles": "Cline wants to view the top level files in this directory:",
"clineViewedTopLevelFiles": "Cline viewed the top level files in this directory:",
"clineWantsToRecursivelyViewFiles": "Cline wants to recursively view all files in this directory:",
"clineRecursivelyViewedFiles": "Cline recursively viewed all files in this directory:",
"clineWantsToViewSourceCodeDefinitions": "Cline wants to view source code definition names used in this directory:",
"clineViewedSourceCodeDefinitions": "Cline viewed source code definition names used in this directory:",
"clineWantsToSearchDirectory": "Cline wants to search this directory for {{regex}}:",
"clineSearchedDirectory": "Cline searched this directory for {{regex}}:",
"diffEditFailedMessage": "This usually happens when the model uses search patterns that don't match anything in the file. Retrying...",
"shellIntegrationUnavailableMessage": "Cline won't be able to view the command's output. Please update VSCode (CMD/CTRL + Shift + P → \"Update\") and make sure you're using a supported shell: zsh, bash, fish, or PowerShell (CMD/CTRL + Shift + P → \"Terminal: Select Default Profile\"). Still having trouble?",
"response": "Response",
"stillHavingTrouble": "Still having trouble?"
},
"autoApproveMenu": {
"none": "None",
"autoApprove": "Auto Approve:",
"autoApproveDescription": "Auto-approve allows Cline to perform the following actions without asking for permission. Please use with caution and only enable if you understand the risks.",
"autoApproveMaxRequestsDescription": "Cline will automatically make this many API requests before asking for approval to proceed with the task.",
"enableNotifications": "Enable Notifications",
"enableNotificationsDescription": "Receive system notifications when Cline requires approval to proceed or when a task is completed."
},
"historyPreview": {
"recentTasks": "Recent Tasks",
"tokens": "Tokens",
"cache": "Cache",
"apiCost": "API Cost",
"viewAllHistory": "View all history"
},
"historyView": {
"history": "History",
"done": "Done",
"fuzzySearchHistory": "Fuzzy search history...",
"newest": "Newest",
"oldest": "Oldest",
"mostExpensive": "Most Expensive",
"mostTokens": "Most Tokens",
"mostRelevant": "Most Relevant",
"tokens": "Tokens:",
"cache": "Cache:",
"apiCost": "API Cost:",
"export": "EXPORT"
}
}

View file

@ -1,174 +0,0 @@
{
"announcement": {
"newInVersion": "Nuevo en la versión {{version}}",
"joinOurCommunities": "Únete a nuestro <DiscordLink>Discord</DiscordLink> o <RedditLink>Reddit</RedditLink> para más actualizaciones!"
},
"settingsView": {
"settings": "Configuraciones",
"done": "Hecho",
"language": "Idioma",
"customInstructions": "Instrucciones personalizadas",
"customInstructionsPlaceholder": "por ejemplo, \"Realiza pruebas unitarias al final\", \"Usa TypeScript con async/await\", \"Habla en japonés\"",
"customInstructionsDescription": "Estas instrucciones se agregarán al final del prompt del sistema que se envía con cada solicitud.",
"debug": "Depurar",
"resetState": "Restablecer estado",
"resetStateDescription": "Esto restablecerá todo el estado global y el almacenamiento secreto en la extensión.",
"feedback": "Si tienes preguntas o comentarios, no dudes en abrir un issue en"
},
"apiOptions": {
"selectModel": "Seleccionar modelo...",
"model": "Modelo",
"apiProvider": "Proveedor de API",
"enterApiKey": "Ingresar clave API...",
"apiKey": "Clave API",
"enterBaseUrl": "Ingresar URL base...",
"baseUrl": "URL base",
"optionalBaseUrl": "URL base (opcional)",
"enterModelId": "Ingresar ID del modelo...",
"modelId": "ID del modelo",
"useCustomBaseUrl": "Usar URL base personalizada",
"apiKeyInfo": "Esta clave se almacena localmente y solo se usa para realizar solicitudes API desde esta extensión.",
"getDefault": "Predeterminado: {{defaultValue}}",
"getApiKeyMessage": "Puedes obtener una clave API de {{vendor}} registrándote aquí.",
"getApiVendorKey": "Clave API de {{vendor}}",
"getCompatibleVendor": "Compatible con {{vendor}}",
"lmStudioInfo": "LM Studio te permite ejecutar modelos localmente en tu computadora. Encuentra instrucciones para comenzar en su <Link href=\"https://lmstudio.ai/docs\">Guía de inicio rápido.</Link> También debes iniciar la función de <Link href=\"https://lmstudio.ai/docs/basics/server\">servidor local</Link> de LM Studio para usarla con esta extensión. <ErrSpan>(<b>Nota:</b> Cline usa prompts complejos y funciona mejor con modelos Claude. Los modelos menos potentes pueden no funcionar como se espera.)</ErrSpan>",
"ollamaInfo": "Ollama te permite ejecutar modelos localmente en tu computadora. Encuentra instrucciones para comenzar en su <Link href=\"https://github.com/ollama/ollama/blob/main/README.md\">Guía de inicio rápido.</Link> <ErrorSpan>(<b>Nota:</b> Cline usa prompts complejos y funciona mejor con modelos Claude. Los modelos menos potentes pueden no funcionar como se espera.)</ErrorSpan>",
"azureInfo": "<ErrSpan>(<b>Nota:</b> Cline usa prompts complejos y funciona mejor con modelos Claude. Los modelos menos potentes pueden no funcionar como se espera.)</ErrSpan>",
"setAzureApiVersion": "Establecer versión de API de Azure",
"enterGcpProjectId": "Ingresar ID del proyecto...",
"gcpProjectId": "ID del proyecto de Google Cloud",
"gcpLinks": "Para usar Google Cloud Vertex AI, debes <Link href=\"https://cloud.google.com/vertex-ai/generative-ai/docs/partner-models/use-claude#before_you_begin\"> 1) crear una cuenta de Google Cloud habilitar la API de Vertex AI habilitar los modelos Claude deseados, </Link><br /> <Link href=\"https://cloud.google.com/docs/authentication/provide-credentials-adc#google-idp\"> 2) instalar la CLI de Google Cloud configurar credenciales predeterminadas de la aplicación. </Link>",
"enterAwsAccessKey": "Ingresar clave de acceso...",
"awsAccessKey": "Clave de acceso de AWS",
"enterAwsSecretKey": "Ingresar clave secreta...",
"awsSecretKey": "Clave secreta de AWS",
"enterAwsSessionToken": "Ingresar token de sesión...",
"awsSessionToken": "Token de sesión de AWS",
"getRegion": "Región de {{vendor}}",
"selectRegion": "Seleccionar región...",
"useCrossRegionInference": "Usar inferencia entre regiones",
"awsInfo": "Autentícate proporcionando las claves mencionadas arriba o usando las credenciales predeterminadas de AWS, es decir, ~/.aws/credentials o variables de entorno. Estas credenciales solo se usan localmente para realizar solicitudes API desde esta extensión.",
"vscodeLanguageModelsInfo": "La API de Modelos de Lenguaje de VS Code te permite usar modelos proporcionados por otras extensiones de VS Code (incluyendo, pero no limitado a GitHub Copilot). La forma más fácil de comenzar es instalar la extensión Copilot desde el VS Marketplace y habilitar Claude 3.5 Sonnet.",
"experimentalFeature": "Nota: Esta es una integración muy experimental y puede no funcionar como se espera.",
"supportsImages": "Soporta imágenes",
"doesNotSupportImages": "No soporta imágenes",
"supportsComputerUse": "Soporta uso de computadora",
"doesNotSupportComputerUse": "No soporta uso de computadora",
"supportsPromptCache": "Soporta caché de prompts",
"doesNotSupportPromptCache": "No soporta caché de prompts",
"maxOutput": "Salida máxima",
"tokens": "Tokens",
"inputPrice": "Precio de entrada",
"millionTokens": "Millones de tokens",
"cacheWritesPrice": "Precio de escritura en caché",
"cacheReadsPrice": "Precio de lectura en caché",
"outputPrice": "Precio de salida",
"geminiInfo": "* Gratis hasta {{selectedModelId}} solicitudes por minuto. Después, la facturación depende del tamaño del prompt.",
"pricingDetails": "Para más información, consulta los detalles de precios.",
"languageModel": "Modelo de lenguaje"
},
"welcomeView": {
"greeting": "¡Hola! Soy Cline, tu asistente de IA.",
"description": "Puedo realizar todo tipo de tareas gracias a los últimos avances en <ClaudeLink>las habilidades de codificación agencial de Claude 3.5 Sonnet</ClaudeLink> y el acceso a herramientas que me permiten crear y editar archivos, explorar proyectos complejos, usar el navegador y ejecutar comandos de terminal (por supuesto, con tu permiso). Incluso puedo usar MCP para crear nuevas herramientas y expandir mis propias habilidades.",
"getStarted": "Para comenzar, esta extensión necesita un proveedor de API para Claude 3.5 Sonnet.",
"letsGo": "¡Vamos allá!"
},
"chatView": {
"typeMessage": "Escribir mensaje...",
"typeTask": "Escribir tarea...",
"whatCanIDoForYou": "¿Qué puedo hacer por ti?",
"thanksTo": "Gracias a <ClaudeLink>las habilidades de codificación agencial de Claude 3.5 Sonnet</ClaudeLink>, puedo manejar tareas complejas de desarrollo de software paso a paso. Con herramientas que me permiten crear y editar archivos, explorar proyectos complejos, usar el navegador y ejecutar comandos de terminal (después de que hayas dado permiso), puedo ayudarte de una manera que va más allá de la autocompletación de código o el soporte técnico. Incluso puedo usar MCP para crear nuevas herramientas y expandir mis propias habilidades."
},
"chatTextArea": {
"plan": "Planificar",
"act": "Actuar"
},
"chatRow": {
"error": "Error",
"mistakeLimitReached": "Límite de errores alcanzado",
"autoApprovalMaxReqReached": "Número máximo de aprobaciones automáticas alcanzado",
"command": {
"ask": "Cline quiere ejecutar este comando:",
"say": "Cline ha ejecutado este comando:"
},
"useMcpServer": {
"ask": "Cline quiere usar este {type} en {serverName}:",
"say": "Cline ha usado este {type} en {serverName}:",
"tool": "Herramienta",
"resource": "Recurso"
},
"completionResult": "Resultado de la finalización",
"apiReqCancelled": "Solicitud API cancelada",
"apiStreamingFailed": "Transmisión API fallida",
"apiRequest": "Solicitud API",
"apiRequestFailed": "Solicitud API fallida",
"apiRequestInProgress": "Solicitud API en progreso",
"followup": "Seguimiento",
"tool": {
"editedExistingFile": {
"ask": "Cline quiere editar este archivo:",
"say": "Cline está editando este archivo:"
},
"createdNewFile": {
"ask": "Cline quiere crear este archivo:",
"say": "Cline ha creado este archivo:"
},
"readExistingFile": {
"ask": "Cline quiere leer este archivo:",
"say": "Cline ha leído este archivo:"
}
},
"apiReqStarted": "Solicitud API iniciada",
"userFeedback": "Comentarios del usuario",
"userFeedbackDiff": "Diferencia de comentarios del usuario",
"diffEditFailed": "Edición de diferencia fallida",
"shellIntegrationUnavailable": "Integración de shell no disponible",
"mcpServerResponse": "Respuesta del servidor MCP",
"planModeResponse": "Respuesta del modo plan",
"seeNewChanges": "Ver nuevos cambios",
"commandRequiresApproval": "El modelo ha determinado que este comando requiere aprobación explícita.",
"troubleshootingGuide": "Guía de solución de problemas",
"clineWantsToViewTopLevelFiles": "Cline quiere ver los archivos principales en este directorio:",
"clineViewedTopLevelFiles": "Cline ha visto los archivos principales en este directorio:",
"clineWantsToRecursivelyViewFiles": "Cline quiere ver todos los archivos en este directorio de forma recursiva:",
"clineRecursivelyViewedFiles": "Cline ha visto todos los archivos en este directorio de forma recursiva:",
"clineWantsToViewSourceCodeDefinitions": "Cline quiere ver los nombres de las definiciones de código fuente usadas en este directorio:",
"clineViewedSourceCodeDefinitions": "Cline ha visto los nombres de las definiciones de código fuente usadas en este directorio:",
"clineWantsToSearchDirectory": "Cline quiere buscar en este directorio por {{regex}}:",
"clineSearchedDirectory": "Cline ha buscado en este directorio por {{regex}}:",
"diffEditFailedMessage": "Esto generalmente ocurre cuando el modelo usa patrones de búsqueda que no encuentran nada en el archivo. Intentar de nuevo...",
"shellIntegrationUnavailableMessage": "Cline no puede mostrar la salida del comando. Por favor, actualiza VSCode (CMD/CTRL + Shift + P → \"Update\") y asegúrate de estar usando una shell compatible: zsh, bash, fish o PowerShell (CMD/CTRL + Shift + P → \"Terminal: Seleccionar perfil predeterminado\"). ¿Sigues teniendo problemas?",
"response": "Respuesta",
"stillHavingTrouble": "¿Sigues teniendo problemas?"
},
"autoApproveMenu": {
"none": "Ninguno",
"autoApprove": "Aprobación automática:",
"autoApproveDescription": "La aprobación automática permite a Cline realizar las siguientes acciones sin pedir permiso. Por favor, úsalo con precaución y solo habilítalo si entiendes los riesgos.",
"autoApproveMaxRequestsDescription": "Cline realizará automáticamente tantas solicitudes API antes de que se requiera una aprobación para continuar con la tarea.",
"enableNotifications": "Habilitar notificaciones",
"enableNotificationsDescription": "Recibe notificaciones del sistema cuando Cline necesita aprobación para continuar o cuando una tarea se ha completado."
},
"historyPreview": {
"recentTasks": "Tareas recientes",
"tokens": "Tokens",
"cache": "Caché",
"apiCost": "Costo de API",
"viewAllHistory": "Ver todo el historial"
},
"historyView": {
"history": "Historial",
"done": "Hecho",
"fuzzySearchHistory": "Búsqueda difusa en el historial...",
"newest": "Más reciente",
"oldest": "Más antiguo",
"mostExpensive": "Más caro",
"mostTokens": "Más tokens",
"mostRelevant": "Más relevante",
"tokens": "Tokens:",
"cache": "Caché:",
"apiCost": "Costo de API:",
"export": "EXPORTAR"
}
}

View file

@ -1,174 +0,0 @@
{
"announcement": {
"newInVersion": "バージョン{{version}}の新機能",
"joinOurCommunities": "最新情報については、<DiscordLink>Discord</DiscordLink> または <RedditLink>Reddit</RedditLink> にぜひご参加ください!"
},
"settingsView": {
"settings": "設定",
"done": "完了",
"language": "言語",
"customInstructions": "カスタム指示",
"customInstructionsPlaceholder": "例: 「最後にユニットテストを実行する」、「async/awaitでTypeScriptを使用する」、「英語で話す」",
"customInstructionsDescription": "これらの指示は、各リクエストで送信されるシステムプロンプトの末尾に追加されます。",
"debug": "デバッグ",
"resetState": "状態をリセット",
"resetStateDescription": "拡張機能のすべてのグローバル状態とシークレットストレージがリセットされます。",
"feedback": "ご質問やフィードバックがある場合は、ご自由にイシューを作成してください。"
},
"apiOptions": {
"selectModel": "モデルを選択...",
"model": "モデル",
"apiProvider": "APIプロバイダー",
"enterApiKey": "APIキーを入力...",
"apiKey": "APIキー",
"enterBaseUrl": "ベースURLを入力...",
"baseUrl": "ベースURL",
"optionalBaseUrl": "ベースURL任意",
"enterModelId": "モデルIDを入力...",
"modelId": "モデルID",
"useCustomBaseUrl": "カスタムベースURLを使用",
"apiKeyInfo": "このキーはローカル環境にのみ保存され、拡張機能によるAPIリクエストでのみ使用されます。",
"getDefault": "デフォルト: {{defaultValue}}",
"getApiKeyMessage": "{{vendor}}のAPIキーは、こちらでサインアップして取得できます。",
"getApiVendorKey": "{{vendor}} APIキー",
"getCompatibleVendor": "{{vendor}}互換",
"lmStudioInfo": "LM Studioを使用すると、モデルをローカルコンピューターで実行できます。始め方については、<Link href=\"https://lmstudio.ai/docs\">クイックスタートガイド</Link>をご覧ください。また、この拡張機能で使用するには、LM Studioの<Link href=\"https://lmstudio.ai/docs/basics/server\">ローカルサーバー</Link>機能を起動する必要があります。<ErrSpan>(<b>注意:</b> Clineは複雑なプロンプトを使用するため、Claudeモデルで最適に動作します。処理能力の低いモデルでは、期待通りに動作しない可能性があります。)</ErrSpan>",
"ollamaInfo": "Ollamaを使用すると、モデルをローカルコンピューターで実行できます。始め方については、<Link href=\"https://github.com/ollama/ollama/blob/main/README.md\">クイックスタートガイド</Link>をご覧ください。<ErrorSpan>(<b>注意:</b> Clineは複雑なプロンプトを使用するため、Claudeモデルで最適に動作します。処理能力の低いモデルでは、期待通りに動作しない可能性があります。)</ErrorSpan>",
"azureInfo": "<ErrSpan>(<b>注意:</b> Clineは複雑なプロンプトを使用するため、Claudeモデルで最適に動作します。処理能力の低いモデルでは、期待通りに動作しない可能性があります。)</ErrSpan>",
"setAzureApiVersion": "Azure APIバージョンを設定",
"enterGcpProjectId": "プロジェクトIDを入力...",
"gcpProjectId": "Google CloudプロジェクトID",
"gcpLinks": "Google Cloud Vertex AIを使用するには、<Link href=\"https://cloud.google.com/vertex-ai/generative-ai/docs/partner-models/use-claude#before_you_begin\"> 1) Google Cloudアカウントを作成 Vertex AI APIを有効化 Claudeモデルを有効化</Link><br /> <Link href=\"https://cloud.google.com/docs/authentication/provide-credentials-adc#google-idp\"> 2) Google Cloud CLIをインストール アプリケーションデフォルト認証情報を設定</Link>が必要です。",
"enterAwsAccessKey": "アクセスキーを入力...",
"awsAccessKey": "AWSアクセスキー",
"enterAwsSecretKey": "シークレットキーを入力...",
"awsSecretKey": "AWSシークレットキー",
"enterAwsSessionToken": "セッショントークンを入力...",
"awsSessionToken": "AWSセッショントークン",
"getRegion": "{{vendor}} リージョン",
"selectRegion": "リージョンを選択...",
"useCrossRegionInference": "クロスリージョン推論を使用",
"awsInfo": "上記のキーを入力するか、デフォルトのAWS認証プロバイダー (例: ~/.aws/credentials または環境変数) を使用して認証してください。これらの認証情報は、この拡張機能からのAPIリクエストにのみローカルで使用されます。",
"vscodeLanguageModelsInfo": "VS Code Language Model APIを使用すると、他のVS Code拡張機能 (GitHub Copilotなど) が提供するモデルを実行できます。始める最も簡単な方法は、VSマーケットプレイスからCopilot拡張機能をインストールし、Claude 3.5 Sonnetを有効化することです。",
"experimentalFeature": "注意: これは試験的な統合機能であり、意図した通りに動作しない場合があります。",
"supportsImages": "画像サポートあり",
"doesNotSupportImages": "画像サポートなし",
"supportsComputerUse": "コンピューター利用サポートあり",
"doesNotSupportComputerUse": "コンピューター利用サポートなし",
"supportsPromptCache": "プロンプトキャッシュサポートあり",
"doesNotSupportPromptCache": "プロンプトキャッシュサポートなし",
"maxOutput": "最大出力",
"tokens": "トークン",
"inputPrice": "入力価格",
"millionTokens": "百万トークン",
"cacheWritesPrice": "キャッシュ書き込み価格",
"cacheReadsPrice": "キャッシュ読み取り価格",
"outputPrice": "出力価格",
"geminiInfo": "* {{selectedModelId}} リクエスト毎分まで無料。その後、料金はプロンプトサイズに基づいて計算されます。",
"pricingDetails": "詳細については料金情報をご確認ください。",
"languageModel": "言語モデル"
},
"welcomeView": {
"greeting": "こんにちは私はあなたのAIアシスタント、クラインです。",
"description": "最新の<ClaudeLink>Claude 3.5 Sonnetのエージェントコーディング機能</ClaudeLink>と、ファイルの作成や編集、複雑なプロジェクトの探索、ブラウザの使用、ターミナルコマンドの実行もちろん、あなたの許可が必要ですを可能にするツールのおかげで、あらゆるタスクをこなすことができます。さらに、MCPを使用して新しいツールを作成し、自分の能力を拡張することもできます。",
"getStarted": "始めるには、この拡張機能にClaude 3.5 SonnetのAPIプロバイダーが必要です。",
"letsGo": "さあ、始めましょう!"
},
"chatView": {
"typeMessage": "メッセージを入力...",
"typeTask": "タスクを入力...",
"whatCanIDoForYou": "何をお手伝いしましょうか?",
"thanksTo": "<ClaudeLink>Claude 3.5 Sonnetのエージェントコーディング機能</ClaudeLink>のおかげで、複雑なソフトウェア開発タスクをステップバイステップで処理できます。ファイルの作成や編集、複雑なプロジェクトの探索、ブラウザの使用、ターミナルコマンドの実行許可をいただいた後を可能にするツールを使用して、コードの補完や技術サポートを超えた支援を提供できます。さらに、MCPを使用して新しいツールを作成し、自分の能力を拡張することもできます。"
},
"chatTextArea": {
"plan": "計画",
"act": "実行"
},
"chatRow": {
"error": "エラー",
"mistakeLimitReached": "ミスの限界に達しました",
"autoApprovalMaxReqReached": "自動承認の最大リクエストに達しました",
"command": {
"ask": "クラインがこのコマンドを実行したいと考えています:",
"say": "クラインがこのコマンドを実行しました:"
},
"useMcpServer": {
"ask": "クラインがこの{type}を{serverName}で使用したいと考えています:",
"say": "クラインがこの{type}を{serverName}で使用しました:",
"tool": "ツール",
"resource": "リソース"
},
"completionResult": "完了結果",
"apiReqCancelled": "APIリクエストがキャンセルされました",
"apiStreamingFailed": "APIストリーミングに失敗しました",
"apiRequest": "APIリクエスト",
"apiRequestFailed": "APIリクエストに失敗しました",
"apiRequestInProgress": "APIリクエスト進行中",
"followup": "フォローアップ",
"tool": {
"editedExistingFile": {
"ask": "クラインがこのファイルを編集したいと考えています:",
"say": "クラインがこのファイルを編集しています:"
},
"createdNewFile": {
"ask": "クラインがこのファイルを作成したいと考えています:",
"say": "クラインがこのファイルを作成しました:"
},
"readExistingFile": {
"ask": "クラインがこのファイルを読みたいと考えています:",
"say": "クラインがこのファイルを読みました:"
}
},
"apiReqStarted": "APIリクエスト開始",
"userFeedback": "ユーザーフィードバック",
"userFeedbackDiff": "ユーザーフィードバック差分",
"diffEditFailed": "差分編集に失敗しました",
"shellIntegrationUnavailable": "シェル統合が利用できません",
"mcpServerResponse": "MCPサーバー応答",
"planModeResponse": "計画モード応答",
"seeNewChanges": "新しい変更を見る",
"commandRequiresApproval": "このコマンドは明示的な承認が必要です。",
"troubleshootingGuide": "Windows PowerShellの問題が発生しているようです。この<Link>トラブルシューティングガイド</Link>をご覧ください。",
"clineWantsToViewTopLevelFiles": "クラインがこのディレクトリのトップレベルファイルを表示したいと考えています:",
"clineViewedTopLevelFiles": "クラインがこのディレクトリのトップレベルファイルを表示しました:",
"clineWantsToRecursivelyViewFiles": "クラインがこのディレクトリのすべてのファイルを再帰的に表示したいと考えています:",
"clineRecursivelyViewedFiles": "クラインがこのディレクトリのすべてのファイルを再帰的に表示しました:",
"clineWantsToViewSourceCodeDefinitions": "クラインがこのディレクトリで使用されているソースコード定義名を表示したいと考えています:",
"clineViewedSourceCodeDefinitions": "クラインがこのディレクトリで使用されているソースコード定義名を表示しました:",
"clineWantsToSearchDirectory": "クラインがこのディレクトリで{{regex}}を検索したいと考えています:",
"clineSearchedDirectory": "クラインがこのディレクトリで{{regex}}を検索しました:",
"diffEditFailedMessage": "これは通常、モデルがファイル内で一致しない検索パターンを使用した場合に発生します。再試行中...",
"shellIntegrationUnavailableMessage": "クラインはコマンドの出力を表示できません。VSCodeを更新しCMD/CTRL + Shift + P → \"Update\"、サポートされているシェルを使用していることを確認してくださいzsh、bash、fish、またはPowerShellCMD/CTRL + Shift + P → \"Terminal: Select Default Profile\")。まだ問題がありますか?",
"response": "応答",
"stillHavingTrouble": "まだ問題がありますか?"
},
"autoApproveMenu": {
"none": "なし",
"autoApprove": "自動承認:",
"autoApproveDescription": "自動承認を有効にすると、クラインが以下のアクションを許可を求めずに実行できるようになります。リスクを理解した上で、慎重に使用してください。",
"autoApproveMaxRequestsDescription": "クラインは、このタスクを進めるために承認を求める前に、この数のAPIリクエストを自動的に行います。",
"enableNotifications": "通知を有効にする",
"enableNotificationsDescription": "クラインがタスクを進めるために承認を求めるとき、またはタスクが完了したときにシステム通知を受け取ります。"
},
"historyPreview": {
"recentTasks": "最近のタスク",
"tokens": "トークン",
"cache": "キャッシュ",
"apiCost": "APIコスト",
"viewAllHistory": "すべての履歴を見る"
},
"historyView": {
"history": "履歴",
"done": "完了",
"fuzzySearchHistory": "履歴をあいまい検索...",
"newest": "最新",
"oldest": "最古",
"mostExpensive": "最も高価",
"mostTokens": "最も多いトークン",
"mostRelevant": "最も関連性が高い",
"tokens": "トークン:",
"cache": "キャッシュ:",
"apiCost": "APIコスト:",
"export": "エクスポート"
}
}

View file

@ -1,169 +0,0 @@
{
"announcement": {
"newInVersion": "版本 {{version}} 中的新功能",
"joinOurCommunities": "加入我们的 <DiscordLink>Discord</DiscordLink> 或 <RedditLink>Reddit</RedditLink> 获取更多更新!"
},
"settingsView": {
"settings": "设置",
"done": "完成",
"language": "语言",
"customInstructions": "自定义指令",
"customInstructionsPlaceholder": "例如 \"在结束时运行单元测试\", \"使用 TypeScript 和 async/await\", \"用日语交流\"",
"customInstructionsDescription": "这些指令会添加到每个请求发送的系统提示的末尾。",
"debug": "调试",
"resetState": "重置状态",
"resetStateDescription": "这将重置扩展中的所有全局状态和秘密存储。",
"feedback": "如果您有任何问题或反馈,请随时在以下网址提交问题"
},
"apiOptions": {
"selectModel": "选择模型...",
"model": "模型",
"apiProvider": "API 提供商",
"enterApiKey": "请输入 API 密钥...",
"apiKey": "API 密钥",
"enterBaseUrl": "输入基本 URL...",
"baseUrl": "基本 URL",
"enterModelId": "输入模型 ID...",
"modelId": "模型 ID",
"useCustomBaseUrl": "使用自定义基本 URL",
"apiKeyInfo": "此密钥存储在本地,仅用于从此扩展进行 API 请求。",
"getApiKeyMessage": "您可以通过在此处注册来获取 {{vendor}} API 密钥。",
"getApiVendorKey": "{{vendor}} API 密钥",
"getCompatibleVendor": "{{vendor}} 兼容",
"enterGcpProjectId": "输入项目 ID...",
"gcpProjectId": "Google Cloud 项目 ID",
"gcpLinks": "要使用 Google Cloud Vertex AI您需要 <Link href=\"https://cloud.google.com/vertex-ai/generative-ai/docs/partner-models/use-claude#before_you_begin\"> 1) 创建一个 Google Cloud 帐户 启用 Vertex AI API 启用所需的 Claude 模型,</Link><br /> <Link href=\"https://cloud.google.com/docs/authentication/provide-credentials-adc#google-idp\"> 2) 安装 Google Cloud CLI 配置应用程序默认凭据。</Link>",
"enterAwsAccessKey": "输入访问密钥...",
"awsAccessKey": "AWS 访问密钥",
"enterAwsSecretKey": "输入秘密密钥...",
"awsSecretKey": "AWS 密钥",
"enterAwsSessionToken": "输入会话令牌...",
"awsSessionToken": "AWS 会话令牌",
"awsRegion": "AWS 区域",
"getRegion": "{{vendor}} 区域",
"selectRegion": "选择区域...",
"useCrossRegionInference": "使用跨区域推理",
"awsInfo": "通过提供上述密钥或使用默认的 AWS 凭证提供程序进行身份验证,即 ~/.aws/credentials 或环境变量。这些凭证仅在本地用于从此扩展进行 API 请求。",
"vscodeLanguageModelsInfo": "VS Code 语言模型 API 允许您运行其他 VS Code 扩展提供的模型(包括但不限于 GitHub Copilot。最简单的方法是从 VS Marketplace 安装 Copilot 扩展并启用 Claude 3.5 Sonnet。",
"experimentalFeature": "注意:这是一个非常实验性功能,可能无法按预期工作。",
"supportsImages": "支持图像",
"doesNotSupportImages": "不支持图像",
"supportsComputerUse": "支持计算机使用",
"doesNotSupportComputerUse": "不支持计算机使用",
"supportsPromptCache": "支持提示缓存",
"doesNotSupportPromptCache": "不支持提示缓存",
"maxOutput": "最大输出",
"tokens": "令牌",
"inputPrice": "输入价格",
"millionTokens": "百万令牌",
"cacheWritesPrice": "缓存写入价格",
"cacheReadsPrice": "缓存读取价格",
"outputPrice": "输出价格",
"geminiInfo": "* 每分钟最多 {{selectedModelId}} 次请求免费。之后,费用取决于提示大小。",
"pricingDetails": "有关更多信息,请参阅定价详情。",
"languageModel": "语言模型"
},
"welcomeView": {
"greeting": "你好!我是 Cline你的 AI 助手。",
"description": "感谢 <ClaudeLink>Claude 3.5 Sonnet 的代理编码能力</ClaudeLink> 和访问工具,我可以执行各种任务,这些工具让我可以创建和编辑文件、探索复杂项目、使用浏览器和执行终端命令(当然,需要你的许可)。我甚至可以使用 MCP 创建新工具并扩展我自己的能力。",
"getStarted": "要开始使用,此扩展需要 Claude 3.5 Sonnet 的 API 提供商。",
"letsGo": "开始吧!"
},
"chatView": {
"typeMessage": "输入消息...",
"typeTask": "输入任务...",
"whatCanIDoForYou": "我能为你做什么?",
"thanksTo": "感谢 <ClaudeLink>Claude 3.5 Sonnet 的代理编码能力,</ClaudeLink> 我可以一步步处理复杂的软件开发任务。通过允许我创建和编辑文件、探索复杂项目、使用浏览器和执行终端命令的工具(在你授予权限后),我可以以超越代码完成或技术支持的方式帮助你。我甚至可以使用 MCP 创建新工具并扩展我自己的能力。"
},
"chatTextArea": {
"plan": "计划",
"act": "行动"
},
"chatRow": {
"error": "错误",
"mistakeLimitReached": "错误次数达到上限",
"autoApprovalMaxReqReached": "自动批准请求次数达到上限",
"command": {
"ask": "Cline 想执行此命令:",
"say": "Cline 执行了此命令:"
},
"useMcpServer": {
"ask": "Cline 想在 {serverName} 上使用此 {type}",
"say": "Cline 在 {serverName} 上使用了此 {type}",
"tool": "工具",
"resource": "资源"
},
"completionResult": "完成结果",
"apiReqCancelled": "API 请求已取消",
"apiStreamingFailed": "API 流式传输失败",
"apiRequest": "API 请求",
"apiRequestFailed": "API 请求失败",
"apiRequestInProgress": "API 请求进行中",
"followup": "跟进",
"tool": {
"editedExistingFile": {
"ask": "Cline 想编辑此文件:",
"say": "Cline 正在编辑此文件:"
},
"createdNewFile": {
"ask": "Cline 想创建此文件:",
"say": "Cline 创建了此文件:"
},
"readExistingFile": {
"ask": "Cline 想读取此文件:",
"say": "Cline 读取了此文件:"
}
},
"apiReqStarted": "API 请求已启动",
"userFeedback": "用户反馈",
"userFeedbackDiff": "用户反馈差异",
"diffEditFailed": "差异编辑失败",
"shellIntegrationUnavailable": "Shell 集成不可用",
"mcpServerResponse": "MCP 服务器响应",
"planModeResponse": "计划模式响应",
"seeNewChanges": "查看新更改",
"commandRequiresApproval": "模型已确定此命令需要明确批准。",
"troubleshootingGuide": "看起来你遇到了 Windows PowerShell 问题,请参阅此 <Link>故障排除指南</Link>",
"clineWantsToViewTopLevelFiles": "Cline 想查看此目录中的顶级文件:",
"clineViewedTopLevelFiles": "Cline 查看了此目录中的顶级文件:",
"clineWantsToRecursivelyViewFiles": "Cline 想递归查看此目录中的所有文件:",
"clineRecursivelyViewedFiles": "Cline 递归查看了此目录中的所有文件:",
"clineWantsToViewSourceCodeDefinitions": "Cline 想查看此目录中使用的源代码定义名称:",
"clineViewedSourceCodeDefinitions": "Cline 查看了此目录中使用的源代码定义名称:",
"clineWantsToSearchDirectory": "Cline 想在此目录中搜索 {{regex}}",
"clineSearchedDirectory": "Cline 在此目录中搜索了 {{regex}}",
"diffEditFailedMessage": "这通常发生在模型使用的搜索模式与文件中的任何内容不匹配时。重试中...",
"shellIntegrationUnavailableMessage": "Cline 将无法查看命令的输出。请更新 VSCodeCMD/CTRL + Shift + P → \"Update\")并确保你使用的是受支持的 shellzsh、bash、fish 或 PowerShellCMD/CTRL + Shift + P → \"Terminal: Select Default Profile\")。仍有问题?",
"response": "响应",
"stillHavingTrouble": "仍有问题?"
},
"autoApproveMenu": {
"none": "无",
"autoApprove": "自动批准:",
"autoApproveDescription": "自动批准允许 Cline 在不请求许可的情况下执行以下操作。请谨慎使用,并仅在了解风险的情况下启用。",
"autoApproveMaxRequestsDescription": "Cline 将自动发出此数量的 API 请求,然后再请求批准以继续任务。",
"enableNotifications": "启用通知",
"enableNotificationsDescription": "当 Cline 需要批准以继续或任务完成时接收系统通知。"
},
"historyPreview": {
"recentTasks": "最近任务",
"tokens": "令牌",
"cache": "缓存",
"apiCost": "API 成本",
"viewAllHistory": "查看所有历史记录"
},
"historyView": {
"history": "历史",
"done": "完成",
"fuzzySearchHistory": "模糊搜索历史...",
"newest": "最新",
"oldest": "最旧",
"mostExpensive": "最昂贵",
"mostTokens": "最多令牌",
"mostRelevant": "最相关",
"tokens": "令牌:",
"cache": "缓存:",
"apiCost": "API 成本:",
"export": "导出"
}
}

View file

@ -1,169 +0,0 @@
{
"announcement": {
"newInVersion": "版本 {{version}} 中的新功能",
"joinOurCommunities": "加入我們的 <DiscordLink>Discord</DiscordLink> 或 <RedditLink>Reddit</RedditLink> 獲取更多更新!"
},
"settingsView": {
"settings": "設置",
"done": "完成",
"language": "語言",
"customInstructions": "自定義指令",
"customInstructionsPlaceholder": "例如 \"在結束時運行單元測試\", \"使用 TypeScript 和 async/await\", \"用日語交流\"",
"customInstructionsDescription": "這些指令會添加到每個請求發送的系統提示的末尾。",
"debug": "調試",
"resetState": "重置狀態",
"resetStateDescription": "這將重置擴展中的所有全局狀態和秘密存儲。",
"feedback": "如果您有任何問題或反饋,請隨時在以下網址提交問題"
},
"apiOptions": {
"selectModel": "選擇模型...",
"model": "模型",
"apiProvider": "API 提供者",
"enterApiKey": "請輸入 API 密鑰...",
"apiKey": "API 密鑰",
"enterBaseUrl": "輸入基本 URL...",
"baseUrl": "基本 URL",
"enterModelId": "輸入模型 ID...",
"modelId": "模型 ID",
"useCustomBaseUrl": "使用自定義基本 URL",
"apiKeyInfo": "此密鑰僅存儲在本地,僅用於從此擴展進行 API 請求。",
"getApiKeyMessage": "您可以通過在此處註冊來獲取 {{vendor}} API 金鑰。",
"getApiVendorKey": "{{vendor}} API 金鑰",
"getCompatibleVendor": "{{vendor}} 兼容",
"enterGcpProjectId": "輸入項目 ID...",
"gcpProjectId": "Google Cloud 項目 ID",
"gcpLinks": "要使用 Google Cloud Vertex AI您需要 <Link href=\"https://cloud.google.com/vertex-ai/generative-ai/docs/partner-models/use-claude#before_you_begin\"> 1) 創建 Google Cloud 帳戶 啟用 Vertex AI API 啟用所需的 Claude 模型, </Link><br /> <Link href=\"https://cloud.google.com/docs/authentication/provide-credentials-adc#google-idp\"> 2) 安裝 Google Cloud CLI 配置應用程序默認憑據。 </Link>",
"enterAwsAccessKey": "輸入訪問金鑰...",
"awsAccessKey": "AWS 訪問金鑰",
"enterAwsSecretKey": "輸入秘密金鑰...",
"awsSecretKey": "AWS 秘密金鑰",
"enterAwsSessionToken": "輸入會話令牌...",
"awsSessionToken": "AWS 會話令牌",
"awsRegion": "AWS 區域",
"getRegion": "{{vendor}} 區域",
"selectRegion": "選擇區域...",
"useCrossRegionInference": "使用跨區域推理",
"awsInfo": "通過提供上述金鑰或使用默認的 AWS 憑據提供者進行身份驗證,即 ~/.aws/credentials 或環境變量。這些憑據僅在本地用於從此擴展進行 API 請求。",
"vscodeLanguageModelsInfo": "VS Code 語言模型 API 允許您運行其他 VS Code 擴展提供的模型(包括但不限於 GitHub Copilot。最簡單的入門方法是從 VS Marketplace 安裝 Copilot 擴展並啟用 Claude 3.5 Sonnet。",
"experimentalFeature": "注意:這是一個非常實驗性的集成,可能無法按預期工作。",
"supportsImages": "支持圖片",
"doesNotSupportImages": "不支持圖片",
"supportsComputerUse": "支持電腦使用",
"doesNotSupportComputerUse": "不支持電腦使用",
"supportsPromptCache": "支持提示緩存",
"doesNotSupportPromptCache": "不支持提示緩存",
"maxOutput": "最大輸出",
"tokens": "標記",
"inputPrice": "輸入價格",
"millionTokens": "百萬標記",
"cacheWritesPrice": "緩存寫入價格",
"cacheReadsPrice": "緩存讀取價格",
"outputPrice": "輸出價格",
"geminiInfo": "* 每分鐘最多免費 {{selectedModelId}} 次請求。之後,計費取決於提示大小。",
"pricingDetails": "更多信息,請參見定價詳情。",
"languageModel": "語言模型"
},
"welcomeView": {
"greeting": "您好!我是 Cline您的 AI 助手。",
"description": "得益於 <ClaudeLink>Claude 3.5 Sonnet 的代理編碼能力</ClaudeLink> 和訪問各種工具,我可以執行各種任務,這些工具讓我能夠創建和編輯文件、探索複雜項目、使用瀏覽器和執行終端命令(當然是在您的許可下)。我甚至可以使用 MCP 創建新工具並擴展我自己的能力。",
"getStarted": "要開始使用,這個擴展需要 Claude 3.5 Sonnet 的 API 提供者。",
"letsGo": "讓我們開始吧!"
},
"chatView": {
"typeMessage": "輸入消息...",
"typeTask": "輸入任務...",
"whatCanIDoForYou": "我能為您做什麼?",
"thanksTo": "感謝 <ClaudeLink>Claude 3.5 Sonnet 的代理編碼能力,</ClaudeLink> 我可以逐步處理複雜的軟件開發任務。通過這些工具,我可以創建和編輯文件、探索複雜項目、使用瀏覽器和執行終端命令(在您授權後),我可以幫助您完成超越代碼補全或技術支持的任務。我甚至可以使用 MCP 創建新工具並擴展我自己的能力。"
},
"chatTextArea": {
"plan": "計劃",
"act": "行動"
},
"chatRow": {
"error": "錯誤",
"mistakeLimitReached": "錯誤次數達到上限",
"autoApprovalMaxReqReached": "自動批准請求次數達到上限",
"command": {
"ask": "Cline 想要執行此命令:",
"say": "Cline 執行了此命令:"
},
"useMcpServer": {
"ask": "Cline 想要在 {serverName} 上使用此 {type}",
"say": "Cline 在 {serverName} 上使用了此 {type}",
"tool": "工具",
"resource": "資源"
},
"completionResult": "完成結果",
"apiReqCancelled": "API 請求已取消",
"apiStreamingFailed": "API 流式傳輸失敗",
"apiRequest": "API 請求",
"apiRequestFailed": "API 請求失敗",
"apiRequestInProgress": "API 請求進行中",
"followup": "後續",
"tool": {
"editedExistingFile": {
"ask": "Cline 想要編輯此文件:",
"say": "Cline 正在編輯此文件:"
},
"createdNewFile": {
"ask": "Cline 想要創建此文件:",
"say": "Cline 創建了此文件:"
},
"readExistingFile": {
"ask": "Cline 想要閱讀此文件:",
"say": "Cline 閱讀了此文件:"
}
},
"apiReqStarted": "API 請求已開始",
"userFeedback": "用戶反饋",
"userFeedbackDiff": "用戶反饋差異",
"diffEditFailed": "差異編輯失敗",
"shellIntegrationUnavailable": "Shell 集成不可用",
"mcpServerResponse": "MCP 服務器響應",
"planModeResponse": "計劃模式響應",
"seeNewChanges": "查看新變更",
"commandRequiresApproval": "模型已確定此命令需要明確批准。",
"troubleshootingGuide": "看起來您遇到了 Windows PowerShell 問題,請參閱此 <Link>故障排除指南</Link>",
"clineWantsToViewTopLevelFiles": "Cline 想要查看此目錄中的頂層文件:",
"clineViewedTopLevelFiles": "Cline 查看了此目錄中的頂層文件:",
"clineWantsToRecursivelyViewFiles": "Cline 想要遞歸查看此目錄中的所有文件:",
"clineRecursivelyViewedFiles": "Cline 遞歸查看了此目錄中的所有文件:",
"clineWantsToViewSourceCodeDefinitions": "Cline 想要查看此目錄中使用的源代碼定義名稱:",
"clineViewedSourceCodeDefinitions": "Cline 查看了此目錄中使用的源代碼定義名稱:",
"clineWantsToSearchDirectory": "Cline 想要在此目錄中搜索 {{regex}}",
"clineSearchedDirectory": "Cline 在此目錄中搜索了 {{regex}}",
"diffEditFailedMessage": "這通常發生在模型使用的搜索模式與文件中的任何內容不匹配時。重試中...",
"shellIntegrationUnavailableMessage": "Cline 將無法查看命令的輸出。請更新 VSCodeCMD/CTRL + Shift + P → \"Update\")並確保您使用的是受支持的 shellzsh、bash、fish 或 PowerShellCMD/CTRL + Shift + P → \"Terminal: Select Default Profile\")。仍有問題?",
"response": "響應",
"stillHavingTrouble": "仍有問題?"
},
"autoApproveMenu": {
"none": "無",
"autoApprove": "自動批准:",
"autoApproveDescription": "自動批准允許 Cline 執行以下操作而無需請求許可。請謹慎使用,僅在您了解風險的情況下啟用。",
"autoApproveMaxRequestsDescription": "Cline 將自動發出這麼多 API 請求,然後再請求批准以繼續任務。",
"enableNotifications": "啟用通知",
"enableNotificationsDescription": "當 Cline 需要批准以繼續或任務完成時接收系統通知。"
},
"historyPreview": {
"recentTasks": "最近任務",
"tokens": "標記",
"cache": "緩存",
"apiCost": "API 成本",
"viewAllHistory": "查看所有歷史記錄"
},
"historyView": {
"history": "歷史",
"done": "完成",
"fuzzySearchHistory": "模糊搜索歷史...",
"newest": "最新",
"oldest": "最舊",
"mostExpensive": "最昂貴",
"mostTokens": "最多標記",
"mostRelevant": "最相關",
"tokens": "標記:",
"cache": "緩存:",
"apiCost": "API 成本:",
"export": "導出"
}
}