ux: Improvements to the new, RCC Provider centric onboarding flow (#9709)

Co-authored-by: roomote[bot] <219738659+roomote[bot]@users.noreply.github.com>
This commit is contained in:
Bruno Bergher 2025-12-01 14:39:39 +00:00 committed by GitHub
parent 4591e960ed
commit f26d5a479f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
66 changed files with 408 additions and 220 deletions

View file

@ -1426,10 +1426,10 @@ const ChatViewComponent: React.ForwardRefRenderFunction<ChatViewRef, ChatViewPro
{!cloudIsAuthenticated && taskHistory.length >= 6 && (
<DismissibleUpsell
upsellId="taskList2"
icon={<Cloud className="size-5 mt-0.5 shrink-0" />}
icon={<Cloud className="size-5 shrink-0" />}
onClick={() => openUpsell()}
dismissOnClick={false}
className="!bg-vscode-editor-background mt-6 border-border rounded-xl pl-4 pr-3 py-3 !text-base">
className="bg-none mt-6 border-border rounded-xl p-0 py-3 !text-base">
<Trans
i18nKey="cloud:upsell.taskList"
components={{

View file

@ -119,6 +119,7 @@ import { ConsecutiveMistakeLimitControl } from "./ConsecutiveMistakeLimitControl
import { BedrockCustomArn } from "./providers/BedrockCustomArn"
import { RooBalanceDisplay } from "./providers/RooBalanceDisplay"
import { buildDocLink } from "@src/utils/docLinks"
import { BookOpenText } from "lucide-react"
export interface ApiOptionsProps {
uriScheme: string | undefined
@ -466,6 +467,12 @@ const ApiOptions = ({
const [rooOption] = options.splice(rooIndex, 1)
options.unshift(rooOption)
}
} else {
const openRouterIndex = options.findIndex((opt) => opt.value === "openrouter")
if (openRouterIndex > 0) {
const [openRouterOption] = options.splice(openRouterIndex, 1)
options.unshift(openRouterOption)
}
}
return options
@ -475,16 +482,15 @@ const ApiOptions = ({
<div className="flex flex-col gap-3">
<div className="flex flex-col gap-1 relative">
<div className="flex justify-between items-center">
<label className="block font-medium mb-1">{t("settings:providers.apiProvider")}</label>
<label className="block font-medium">{t("settings:providers.apiProvider")}</label>
{selectedProvider === "roo" && cloudIsAuthenticated ? (
<RooBalanceDisplay />
) : (
docs && (
<div className="text-xs text-vscode-descriptionForeground">
<VSCodeLink href={docs.url} className="hover:text-vscode-foreground" target="_blank">
{t("settings:providers.providerDocumentation", { provider: docs.name })}
</VSCodeLink>
</div>
<VSCodeLink href={docs.url} target="_blank" className="flex gap-2">
{docs.name}
<BookOpenText className="size-4 inline ml-2" />
</VSCodeLink>
)
)}
</div>
@ -509,7 +515,7 @@ const ApiOptions = ({
routerModels={routerModels}
selectedModelId={selectedModelId}
uriScheme={uriScheme}
fromWelcomeView={fromWelcomeView}
simplifySettings={fromWelcomeView}
organizationAllowList={organizationAllowList}
modelValidationError={modelValidationError}
/>
@ -524,6 +530,7 @@ const ApiOptions = ({
refetchRouterModels={refetchRouterModels}
organizationAllowList={organizationAllowList}
modelValidationError={modelValidationError}
simplifySettings={fromWelcomeView}
/>
)}
@ -535,6 +542,7 @@ const ApiOptions = ({
uriScheme={uriScheme}
organizationAllowList={organizationAllowList}
modelValidationError={modelValidationError}
simplifySettings={fromWelcomeView}
/>
)}
@ -545,6 +553,7 @@ const ApiOptions = ({
routerModels={routerModels}
organizationAllowList={organizationAllowList}
modelValidationError={modelValidationError}
simplifySettings={fromWelcomeView}
/>
)}
@ -556,15 +565,24 @@ const ApiOptions = ({
refetchRouterModels={refetchRouterModels}
organizationAllowList={organizationAllowList}
modelValidationError={modelValidationError}
simplifySettings={fromWelcomeView}
/>
)}
{selectedProvider === "anthropic" && (
<Anthropic apiConfiguration={apiConfiguration} setApiConfigurationField={setApiConfigurationField} />
<Anthropic
apiConfiguration={apiConfiguration}
setApiConfigurationField={setApiConfigurationField}
simplifySettings={fromWelcomeView}
/>
)}
{selectedProvider === "claude-code" && (
<ClaudeCode apiConfiguration={apiConfiguration} setApiConfigurationField={setApiConfigurationField} />
<ClaudeCode
apiConfiguration={apiConfiguration}
setApiConfigurationField={setApiConfigurationField}
simplifySettings={fromWelcomeView}
/>
)}
{selectedProvider === "openai-native" && (
@ -572,15 +590,24 @@ const ApiOptions = ({
apiConfiguration={apiConfiguration}
setApiConfigurationField={setApiConfigurationField}
selectedModelInfo={selectedModelInfo}
simplifySettings={fromWelcomeView}
/>
)}
{selectedProvider === "mistral" && (
<Mistral apiConfiguration={apiConfiguration} setApiConfigurationField={setApiConfigurationField} />
<Mistral
apiConfiguration={apiConfiguration}
setApiConfigurationField={setApiConfigurationField}
simplifySettings={fromWelcomeView}
/>
)}
{selectedProvider === "baseten" && (
<Baseten apiConfiguration={apiConfiguration} setApiConfigurationField={setApiConfigurationField} />
<Baseten
apiConfiguration={apiConfiguration}
setApiConfigurationField={setApiConfigurationField}
simplifySettings={fromWelcomeView}
/>
)}
{selectedProvider === "bedrock" && (
@ -588,6 +615,7 @@ const ApiOptions = ({
apiConfiguration={apiConfiguration}
setApiConfigurationField={setApiConfigurationField}
selectedModelInfo={selectedModelInfo}
simplifySettings={fromWelcomeView}
/>
)}
@ -595,7 +623,7 @@ const ApiOptions = ({
<Vertex
apiConfiguration={apiConfiguration}
setApiConfigurationField={setApiConfigurationField}
fromWelcomeView={fromWelcomeView}
simplifySettings={fromWelcomeView}
/>
)}
@ -603,7 +631,7 @@ const ApiOptions = ({
<Gemini
apiConfiguration={apiConfiguration}
setApiConfigurationField={setApiConfigurationField}
fromWelcomeView={fromWelcomeView}
simplifySettings={fromWelcomeView}
/>
)}
@ -613,27 +641,48 @@ const ApiOptions = ({
setApiConfigurationField={setApiConfigurationField}
organizationAllowList={organizationAllowList}
modelValidationError={modelValidationError}
simplifySettings={fromWelcomeView}
/>
)}
{selectedProvider === "lmstudio" && (
<LMStudio apiConfiguration={apiConfiguration} setApiConfigurationField={setApiConfigurationField} />
<LMStudio
apiConfiguration={apiConfiguration}
setApiConfigurationField={setApiConfigurationField}
simplifySettings={fromWelcomeView}
/>
)}
{selectedProvider === "deepseek" && (
<DeepSeek apiConfiguration={apiConfiguration} setApiConfigurationField={setApiConfigurationField} />
<DeepSeek
apiConfiguration={apiConfiguration}
setApiConfigurationField={setApiConfigurationField}
simplifySettings={fromWelcomeView}
/>
)}
{selectedProvider === "doubao" && (
<Doubao apiConfiguration={apiConfiguration} setApiConfigurationField={setApiConfigurationField} />
<Doubao
apiConfiguration={apiConfiguration}
setApiConfigurationField={setApiConfigurationField}
simplifySettings={fromWelcomeView}
/>
)}
{selectedProvider === "qwen-code" && (
<QwenCode apiConfiguration={apiConfiguration} setApiConfigurationField={setApiConfigurationField} />
<QwenCode
apiConfiguration={apiConfiguration}
setApiConfigurationField={setApiConfigurationField}
simplifySettings={fromWelcomeView}
/>
)}
{selectedProvider === "moonshot" && (
<Moonshot apiConfiguration={apiConfiguration} setApiConfigurationField={setApiConfigurationField} />
<Moonshot
apiConfiguration={apiConfiguration}
setApiConfigurationField={setApiConfigurationField}
simplifySettings={fromWelcomeView}
/>
)}
{selectedProvider === "minimax" && (
@ -671,6 +720,7 @@ const ApiOptions = ({
routerModels={routerModels}
organizationAllowList={organizationAllowList}
modelValidationError={modelValidationError}
simplifySettings={fromWelcomeView}
/>
)}
@ -680,6 +730,7 @@ const ApiOptions = ({
setApiConfigurationField={setApiConfigurationField}
organizationAllowList={organizationAllowList}
modelValidationError={modelValidationError}
simplifySettings={fromWelcomeView}
/>
)}
@ -697,6 +748,7 @@ const ApiOptions = ({
setApiConfigurationField={setApiConfigurationField}
organizationAllowList={organizationAllowList}
modelValidationError={modelValidationError}
simplifySettings={fromWelcomeView}
/>
)}
@ -707,6 +759,7 @@ const ApiOptions = ({
routerModels={routerModels}
organizationAllowList={organizationAllowList}
modelValidationError={modelValidationError}
simplifySettings={fromWelcomeView}
/>
)}
@ -733,6 +786,7 @@ const ApiOptions = ({
cloudIsAuthenticated={cloudIsAuthenticated}
organizationAllowList={organizationAllowList}
modelValidationError={modelValidationError}
simplifySettings={fromWelcomeView}
/>
)}
@ -801,24 +855,25 @@ const ApiOptions = ({
</>
)}
{selectedProvider === "roo" ? (
<SimpleThinkingBudget
key={`${selectedProvider}-${selectedModelId}`}
apiConfiguration={apiConfiguration}
setApiConfigurationField={setApiConfigurationField}
modelInfo={selectedModelInfo}
/>
) : (
<ThinkingBudget
key={`${selectedProvider}-${selectedModelId}`}
apiConfiguration={apiConfiguration}
setApiConfigurationField={setApiConfigurationField}
modelInfo={selectedModelInfo}
/>
)}
{!fromWelcomeView &&
(selectedProvider === "roo" ? (
<SimpleThinkingBudget
key={`${selectedProvider}-${selectedModelId}`}
apiConfiguration={apiConfiguration}
setApiConfigurationField={setApiConfigurationField}
modelInfo={selectedModelInfo}
/>
) : (
<ThinkingBudget
key={`${selectedProvider}-${selectedModelId}`}
apiConfiguration={apiConfiguration}
setApiConfigurationField={setApiConfigurationField}
modelInfo={selectedModelInfo}
/>
))}
{/* Gate Verbosity UI by capability flag */}
{selectedModelInfo?.supportsVerbosity && (
{!fromWelcomeView && selectedModelInfo?.supportsVerbosity && (
<Verbosity
apiConfiguration={apiConfiguration}
setApiConfigurationField={setApiConfigurationField}

View file

@ -1,7 +1,7 @@
import { useMemo, useState, useCallback, useEffect, useRef } from "react"
import { VSCodeLink } from "@vscode/webview-ui-toolkit/react"
import { Trans } from "react-i18next"
import { ChevronsUpDown, Check, X } from "lucide-react"
import { ChevronsUpDown, Check, X, Info } from "lucide-react"
import type { ProviderSettings, ModelInfo, OrganizationAllowList } from "@roo-code/types"
@ -54,6 +54,7 @@ interface ModelPickerProps {
) => void
organizationAllowList: OrganizationAllowList
errorMessage?: string
simplifySettings?: boolean
}
export const ModelPicker = ({
@ -66,6 +67,7 @@ export const ModelPicker = ({
setApiConfigurationField,
organizationAllowList,
errorMessage,
simplifySettings,
}: ModelPickerProps) => {
const { t } = useAppTranslation()
@ -246,25 +248,37 @@ export const ModelPicker = ({
{selectedModelInfo?.deprecated && (
<ApiErrorMessage errorMessage={t("settings:validation.modelDeprecated")} />
)}
{selectedModelId && selectedModelInfo && !selectedModelInfo.deprecated && (
<ModelInfoView
apiProvider={apiConfiguration.apiProvider}
selectedModelId={selectedModelId}
modelInfo={selectedModelInfo}
isDescriptionExpanded={isDescriptionExpanded}
setIsDescriptionExpanded={setIsDescriptionExpanded}
/>
{simplifySettings ? (
<p className="text-xs text-vscode-descriptionForeground m-0">
<Info className="size-3 inline mr-1" />
{t("settings:modelPicker.simplifiedExplanation")}
</p>
) : (
<div>
{selectedModelId && selectedModelInfo && !selectedModelInfo.deprecated && (
<ModelInfoView
apiProvider={apiConfiguration.apiProvider}
selectedModelId={selectedModelId}
modelInfo={selectedModelInfo}
isDescriptionExpanded={isDescriptionExpanded}
setIsDescriptionExpanded={setIsDescriptionExpanded}
/>
)}
<div className="text-sm text-vscode-descriptionForeground">
<Trans
i18nKey="settings:modelPicker.automaticFetch"
components={{
serviceLink: <VSCodeLink href={serviceUrl} className="text-sm" />,
defaultModelLink: (
<VSCodeLink onClick={() => onSelect(defaultModelId)} className="text-sm" />
),
}}
values={{ serviceName, defaultModelId }}
/>
</div>
</div>
)}
<div className="text-sm text-vscode-descriptionForeground">
<Trans
i18nKey="settings:modelPicker.automaticFetch"
components={{
serviceLink: <VSCodeLink href={serviceUrl} className="text-sm" />,
defaultModelLink: <VSCodeLink onClick={() => onSelect(defaultModelId)} className="text-sm" />,
}}
values={{ serviceName, defaultModelId }}
/>
</div>
</>
)
}

View file

@ -13,6 +13,7 @@ import { inputEventTransform, noTransform } from "../transforms"
type AnthropicProps = {
apiConfiguration: ProviderSettings
setApiConfigurationField: (field: keyof ProviderSettings, value: ProviderSettings[keyof ProviderSettings]) => void
simplifySettings?: boolean
}
export const Anthropic = ({ apiConfiguration, setApiConfigurationField }: AnthropicProps) => {

View file

@ -11,6 +11,7 @@ import { inputEventTransform } from "../transforms"
type BasetenProps = {
apiConfiguration: ProviderSettings
setApiConfigurationField: (field: keyof ProviderSettings, value: ProviderSettings[keyof ProviderSettings]) => void
simplifySettings?: boolean
}
export const Baseten = ({ apiConfiguration, setApiConfigurationField }: BasetenProps) => {

View file

@ -19,6 +19,7 @@ type BedrockProps = {
apiConfiguration: ProviderSettings
setApiConfigurationField: (field: keyof ProviderSettings, value: ProviderSettings[keyof ProviderSettings]) => void
selectedModelInfo?: ModelInfo
simplifySettings?: boolean
}
export const Bedrock = ({ apiConfiguration, setApiConfigurationField, selectedModelInfo }: BedrockProps) => {

View file

@ -18,6 +18,7 @@ type ChutesProps = {
routerModels?: RouterModels
organizationAllowList: OrganizationAllowList
modelValidationError?: string
simplifySettings?: boolean
}
export const Chutes = ({
@ -26,6 +27,7 @@ export const Chutes = ({
routerModels,
organizationAllowList,
modelValidationError,
simplifySettings,
}: ChutesProps) => {
const { t } = useAppTranslation()
@ -69,6 +71,7 @@ export const Chutes = ({
serviceUrl="https://llm.chutes.ai/v1/models"
organizationAllowList={organizationAllowList}
errorMessage={modelValidationError}
simplifySettings={simplifySettings}
/>
</>
)

View file

@ -7,6 +7,7 @@ import { Slider } from "@src/components/ui"
interface ClaudeCodeProps {
apiConfiguration: ProviderSettings
setApiConfigurationField: (field: keyof ProviderSettings, value: ProviderSettings[keyof ProviderSettings]) => void
simplifySettings?: boolean
}
export const ClaudeCode: React.FC<ClaudeCodeProps> = ({ apiConfiguration, setApiConfigurationField }) => {

View file

@ -19,6 +19,7 @@ type DeepInfraProps = {
refetchRouterModels: () => void
organizationAllowList: OrganizationAllowList
modelValidationError?: string
simplifySettings?: boolean
}
export const DeepInfra = ({
@ -28,6 +29,7 @@ export const DeepInfra = ({
refetchRouterModels,
organizationAllowList,
modelValidationError,
simplifySettings,
}: DeepInfraProps) => {
const { t } = useAppTranslation()
@ -88,6 +90,7 @@ export const DeepInfra = ({
serviceUrl="https://deepinfra.com/models"
organizationAllowList={organizationAllowList}
errorMessage={modelValidationError}
simplifySettings={simplifySettings}
/>
</>
)

View file

@ -11,6 +11,7 @@ import { inputEventTransform } from "../transforms"
type DeepSeekProps = {
apiConfiguration: ProviderSettings
setApiConfigurationField: (field: keyof ProviderSettings, value: ProviderSettings[keyof ProviderSettings]) => void
simplifySettings?: boolean
}
export const DeepSeek = ({ apiConfiguration, setApiConfigurationField }: DeepSeekProps) => {

View file

@ -11,6 +11,7 @@ import { inputEventTransform } from "../transforms"
type DoubaoProps = {
apiConfiguration: ProviderSettings
setApiConfigurationField: (field: keyof ProviderSettings, value: ProviderSettings[keyof ProviderSettings]) => void
simplifySettings?: boolean
}
export const Doubao = ({ apiConfiguration, setApiConfigurationField }: DoubaoProps) => {

View file

@ -12,10 +12,10 @@ import { inputEventTransform } from "../transforms"
type GeminiProps = {
apiConfiguration: ProviderSettings
setApiConfigurationField: (field: keyof ProviderSettings, value: ProviderSettings[keyof ProviderSettings]) => void
fromWelcomeView?: boolean
simplifySettings?: boolean
}
export const Gemini = ({ apiConfiguration, setApiConfigurationField, fromWelcomeView }: GeminiProps) => {
export const Gemini = ({ apiConfiguration, setApiConfigurationField, simplifySettings }: GeminiProps) => {
const { t } = useAppTranslation()
const [googleGeminiBaseUrlSelected, setGoogleGeminiBaseUrlSelected] = useState(
@ -74,7 +74,7 @@ export const Gemini = ({ apiConfiguration, setApiConfigurationField, fromWelcome
/>
)}
{!fromWelcomeView && (
{!simplifySettings && (
<>
<Checkbox
className="mt-6"

View file

@ -19,6 +19,7 @@ type GlamaProps = {
uriScheme?: string
organizationAllowList: OrganizationAllowList
modelValidationError?: string
simplifySettings?: boolean
}
export const Glama = ({
@ -28,6 +29,7 @@ export const Glama = ({
uriScheme,
organizationAllowList,
modelValidationError,
simplifySettings,
}: GlamaProps) => {
const { t } = useAppTranslation()
@ -70,6 +72,7 @@ export const Glama = ({
serviceUrl="https://glama.ai/models"
organizationAllowList={organizationAllowList}
errorMessage={modelValidationError}
simplifySettings={simplifySettings}
/>
</>
)

View file

@ -21,6 +21,7 @@ type IOIntelligenceProps = {
setApiConfigurationField: (field: keyof ProviderSettings, value: ProviderSettings[keyof ProviderSettings]) => void
organizationAllowList: OrganizationAllowList
modelValidationError?: string
simplifySettings?: boolean
}
export const IOIntelligence = ({
@ -28,6 +29,7 @@ export const IOIntelligence = ({
setApiConfigurationField,
organizationAllowList,
modelValidationError,
simplifySettings,
}: IOIntelligenceProps) => {
const { t } = useAppTranslation()
const { routerModels } = useExtensionState()
@ -71,6 +73,7 @@ export const IOIntelligence = ({
setApiConfigurationField={setApiConfigurationField}
organizationAllowList={organizationAllowList}
errorMessage={modelValidationError}
simplifySettings={simplifySettings}
/>
</>
)

View file

@ -17,6 +17,7 @@ import { ModelRecord } from "@roo/api"
type LMStudioProps = {
apiConfiguration: ProviderSettings
setApiConfigurationField: (field: keyof ProviderSettings, value: ProviderSettings[keyof ProviderSettings]) => void
simplifySettings?: boolean
}
export const LMStudio = ({ apiConfiguration, setApiConfigurationField }: LMStudioProps) => {

View file

@ -19,6 +19,7 @@ type LiteLLMProps = {
setApiConfigurationField: (field: keyof ProviderSettings, value: ProviderSettings[keyof ProviderSettings]) => void
organizationAllowList: OrganizationAllowList
modelValidationError?: string
simplifySettings?: boolean
}
export const LiteLLM = ({
@ -26,6 +27,7 @@ export const LiteLLM = ({
setApiConfigurationField,
organizationAllowList,
modelValidationError,
simplifySettings,
}: LiteLLMProps) => {
const { t } = useAppTranslation()
const { routerModels } = useExtensionState()
@ -151,6 +153,7 @@ export const LiteLLM = ({
setApiConfigurationField={setApiConfigurationField}
organizationAllowList={organizationAllowList}
errorMessage={modelValidationError}
simplifySettings={simplifySettings}
/>
{/* Show prompt caching option if the selected model supports it */}

View file

@ -14,6 +14,7 @@ type MistralProps = {
apiConfiguration: ProviderSettings
setApiConfigurationField: (field: keyof ProviderSettings, value: ProviderSettings[keyof ProviderSettings]) => void
routerModels?: RouterModels
simplifySettings?: boolean
}
export const Mistral = ({ apiConfiguration, setApiConfigurationField }: MistralProps) => {

View file

@ -12,6 +12,7 @@ import { cn } from "@/lib/utils"
type MoonshotProps = {
apiConfiguration: ProviderSettings
setApiConfigurationField: (field: keyof ProviderSettings, value: ProviderSettings[keyof ProviderSettings]) => void
simplifySettings?: boolean
}
export const Moonshot = ({ apiConfiguration, setApiConfigurationField }: MoonshotProps) => {

View file

@ -14,6 +14,7 @@ type OpenAIProps = {
apiConfiguration: ProviderSettings
setApiConfigurationField: (field: keyof ProviderSettings, value: ProviderSettings[keyof ProviderSettings]) => void
selectedModelInfo?: ModelInfo
simplifySettings?: boolean
}
export const OpenAI = ({ apiConfiguration, setApiConfigurationField, selectedModelInfo }: OpenAIProps) => {

View file

@ -28,6 +28,7 @@ type OpenAICompatibleProps = {
setApiConfigurationField: (field: keyof ProviderSettings, value: ProviderSettings[keyof ProviderSettings]) => void
organizationAllowList: OrganizationAllowList
modelValidationError?: string
simplifySettings?: boolean
}
export const OpenAICompatible = ({
@ -35,6 +36,7 @@ export const OpenAICompatible = ({
setApiConfigurationField,
organizationAllowList,
modelValidationError,
simplifySettings,
}: OpenAICompatibleProps) => {
const { t } = useAppTranslation()
@ -147,6 +149,7 @@ export const OpenAICompatible = ({
serviceUrl="https://platform.openai.com"
organizationAllowList={organizationAllowList}
errorMessage={modelValidationError}
simplifySettings={simplifySettings}
/>
<R1FormatSetting
onChange={handleInputChange("openAiR1FormatEnabled", noTransform)}

View file

@ -22,7 +22,7 @@ type OpenRouterProps = {
routerModels?: RouterModels
selectedModelId: string
uriScheme: string | undefined
fromWelcomeView?: boolean
simplifySettings?: boolean
organizationAllowList: OrganizationAllowList
modelValidationError?: string
}
@ -32,7 +32,7 @@ export const OpenRouter = ({
setApiConfigurationField,
routerModels,
uriScheme,
fromWelcomeView,
simplifySettings,
organizationAllowList,
modelValidationError,
}: OpenRouterProps) => {
@ -77,7 +77,7 @@ export const OpenRouter = ({
{t("settings:providers.getOpenRouterApiKey")}
</VSCodeButtonLink>
)}
{!fromWelcomeView && (
{!simplifySettings && (
<>
<div>
<Checkbox
@ -123,6 +123,7 @@ export const OpenRouter = ({
serviceUrl="https://openrouter.ai/models"
organizationAllowList={organizationAllowList}
errorMessage={modelValidationError}
simplifySettings={simplifySettings}
/>
</>
)

View file

@ -5,6 +5,7 @@ import { type ProviderSettings } from "@roo-code/types"
interface QwenCodeProps {
apiConfiguration: ProviderSettings
setApiConfigurationField: (field: keyof ProviderSettings, value: ProviderSettings[keyof ProviderSettings]) => void
simplifySettings?: boolean
}
export const QwenCode: React.FC<QwenCodeProps> = ({ apiConfiguration, setApiConfigurationField }) => {

View file

@ -23,6 +23,7 @@ type RequestyProps = {
organizationAllowList: OrganizationAllowList
modelValidationError?: string
uriScheme?: string
simplifySettings?: boolean
}
export const Requesty = ({
@ -33,6 +34,7 @@ export const Requesty = ({
organizationAllowList,
modelValidationError,
uriScheme,
simplifySettings,
}: RequestyProps) => {
const { t } = useAppTranslation()
@ -143,6 +145,7 @@ export const Requesty = ({
serviceUrl="https://requesty.ai"
organizationAllowList={organizationAllowList}
errorMessage={modelValidationError}
simplifySettings={simplifySettings}
/>
</>
)

View file

@ -15,6 +15,7 @@ type RooProps = {
cloudIsAuthenticated: boolean
organizationAllowList: OrganizationAllowList
modelValidationError?: string
simplifySettings?: boolean
}
export const Roo = ({
@ -24,6 +25,7 @@ export const Roo = ({
cloudIsAuthenticated,
organizationAllowList,
modelValidationError,
simplifySettings,
}: RooProps) => {
const { t } = useAppTranslation()
@ -55,6 +57,7 @@ export const Roo = ({
serviceUrl="https://roocode.com"
organizationAllowList={organizationAllowList}
errorMessage={modelValidationError}
simplifySettings={simplifySettings}
/>
</>
)

View file

@ -24,6 +24,7 @@ type UnboundProps = {
routerModels?: RouterModels
organizationAllowList: OrganizationAllowList
modelValidationError?: string
simplifySettings?: boolean
}
export const Unbound = ({
@ -32,6 +33,7 @@ export const Unbound = ({
routerModels,
organizationAllowList,
modelValidationError,
simplifySettings,
}: UnboundProps) => {
const { t } = useAppTranslation()
const [didRefetch, setDidRefetch] = useState<boolean>()
@ -185,6 +187,7 @@ export const Unbound = ({
setApiConfigurationField={setApiConfigurationField}
organizationAllowList={organizationAllowList}
errorMessage={modelValidationError}
simplifySettings={simplifySettings}
/>
</>
)

View file

@ -17,6 +17,7 @@ type VercelAiGatewayProps = {
routerModels?: RouterModels
organizationAllowList: OrganizationAllowList
modelValidationError?: string
simplifySettings?: boolean
}
export const VercelAiGateway = ({
@ -25,6 +26,7 @@ export const VercelAiGateway = ({
routerModels,
organizationAllowList,
modelValidationError,
simplifySettings,
}: VercelAiGatewayProps) => {
const { t } = useAppTranslation()
@ -70,6 +72,7 @@ export const VercelAiGateway = ({
serviceUrl="https://vercel.com/ai-gateway/models"
organizationAllowList={organizationAllowList}
errorMessage={modelValidationError}
simplifySettings={simplifySettings}
/>
</>
)

View file

@ -12,10 +12,10 @@ import { inputEventTransform } from "../transforms"
type VertexProps = {
apiConfiguration: ProviderSettings
setApiConfigurationField: (field: keyof ProviderSettings, value: ProviderSettings[keyof ProviderSettings]) => void
fromWelcomeView?: boolean
simplifySettings?: boolean
}
export const Vertex = ({ apiConfiguration, setApiConfigurationField, fromWelcomeView }: VertexProps) => {
export const Vertex = ({ apiConfiguration, setApiConfigurationField, simplifySettings }: VertexProps) => {
const { t } = useAppTranslation()
const handleInputChange = useCallback(
@ -94,7 +94,7 @@ export const Vertex = ({ apiConfiguration, setApiConfigurationField, fromWelcome
</Select>
</div>
{!fromWelcomeView && apiConfiguration.apiModelId?.startsWith("gemini") && (
{!simplifySettings && apiConfiguration.apiModelId?.startsWith("gemini") && (
<div className="mt-6">
<Checkbox
data-testid="checkbox-url-context"

View file

@ -128,13 +128,13 @@ describe("Gemini", () => {
})
})
describe("fromWelcomeView prop", () => {
it("should hide URL context and grounding checkboxes when fromWelcomeView is true, but keep custom base URL", () => {
describe("simplifySettings prop", () => {
it("should hide URL context and grounding checkboxes when simplifySettings is true, but keep custom base URL", () => {
render(
<Gemini
apiConfiguration={defaultApiConfiguration}
setApiConfigurationField={mockSetApiConfigurationField}
fromWelcomeView={true}
simplifySettings={true}
/>,
)
@ -145,12 +145,12 @@ describe("Gemini", () => {
expect(screen.queryByTestId("checkbox-grounding-search")).not.toBeInTheDocument()
})
it("should show all checkboxes when fromWelcomeView is false", () => {
it("should show all checkboxes when simplifySettings is false", () => {
render(
<Gemini
apiConfiguration={defaultApiConfiguration}
setApiConfigurationField={mockSetApiConfigurationField}
fromWelcomeView={false}
simplifySettings={false}
/>,
)
@ -160,7 +160,7 @@ describe("Gemini", () => {
expect(screen.getByTestId("checkbox-grounding-search")).toBeInTheDocument()
})
it("should show all checkboxes when fromWelcomeView is undefined (default behavior)", () => {
it("should show all checkboxes when simplifySettings is undefined (default behavior)", () => {
render(
<Gemini
apiConfiguration={defaultApiConfiguration}

View file

@ -138,12 +138,12 @@ describe("Vertex", () => {
expect(urlContextCheckbox).toBeNull()
})
it("should NOT render URL context checkbox when fromWelcomeView is true", () => {
it("should NOT render URL context checkbox when simplifySettings is true", () => {
render(
<Vertex
apiConfiguration={defaultApiConfiguration}
setApiConfigurationField={mockSetApiConfigurationField}
fromWelcomeView={true}
simplifySettings={true}
/>,
)
@ -208,12 +208,12 @@ describe("Vertex", () => {
expect(groundingCheckbox).toBeNull()
})
it("should NOT render grounding search checkbox when fromWelcomeView is true", () => {
it("should NOT render grounding search checkbox when simplifySettings is true", () => {
render(
<Vertex
apiConfiguration={defaultApiConfiguration}
setApiConfigurationField={mockSetApiConfigurationField}
fromWelcomeView={true}
simplifySettings={true}
/>,
)

View file

@ -1,5 +1,11 @@
import { useCallback, useEffect, useRef, useState } from "react"
import { VSCodeLink, VSCodeProgressRing, VSCodeTextField } from "@vscode/webview-ui-toolkit/react"
import {
VSCodeLink,
VSCodeProgressRing,
VSCodeRadio,
VSCodeRadioGroup,
VSCodeTextField,
} from "@vscode/webview-ui-toolkit/react"
import type { ProviderSettings } from "@roo-code/types"
@ -14,7 +20,7 @@ import { Tab, TabContent } from "../common/Tab"
import RooHero from "./RooHero"
import { Trans } from "react-i18next"
import { ArrowLeft } from "lucide-react"
import { ArrowLeft, ArrowRight, BadgeInfo } from "lucide-react"
type ProviderOption = "roo" | "custom"
@ -27,6 +33,7 @@ const WelcomeViewProvider = () => {
const [authInProgress, setAuthInProgress] = useState(false)
const [showManualEntry, setShowManualEntry] = useState(false)
const [manualUrl, setManualUrl] = useState("")
const [manualErrorMessage, setManualErrorMessage] = useState<boolean | undefined>(undefined)
const manualUrlInputRef = useRef<HTMLInputElement | null>(null)
// When auth completes during the provider signup flow, save the Roo config
@ -92,6 +99,7 @@ const WelcomeViewProvider = () => {
setAuthInProgress(false)
setShowManualEntry(false)
setManualUrl("")
setManualErrorMessage(false)
}, [])
const handleManualUrlChange = (e: any) => {
@ -101,19 +109,21 @@ const WelcomeViewProvider = () => {
// Auto-trigger authentication when a complete URL is pasted
setTimeout(() => {
if (url.trim() && url.includes("://") && url.includes("/auth/clerk/callback")) {
setManualErrorMessage(false)
vscode.postMessage({ type: "rooCloudManualUrl", text: url.trim() })
}
}, 100)
}
const handleKeyDown = (e: any) => {
if (e.key === "Enter") {
const url = manualUrl.trim()
if (url && url.includes("://") && url.includes("/auth/clerk/callback")) {
vscode.postMessage({ type: "rooCloudManualUrl", text: url })
}
const handleSubmit = useCallback(() => {
const url = manualUrl.trim()
if (url && url.includes("://") && url.includes("/auth/clerk/callback")) {
setManualErrorMessage(false)
vscode.postMessage({ type: "rooCloudManualUrl", text: url })
} else {
setManualErrorMessage(true)
}
}
}, [manualUrl])
const handleOpenSignupUrl = () => {
vscode.postMessage({ type: "rooCloudSignIn", useProviderSignup: true })
@ -127,132 +137,149 @@ const WelcomeViewProvider = () => {
<div className="flex flex-col items-start gap-4 pt-8">
<VSCodeProgressRing className="size-6" />
<h2 className="mt-0 mb-0 text-lg font-semibold">{t("welcome:waitingForCloud.heading")}</h2>
<p className="text-sm text-vscode-descriptionForeground mt-0">
<p className="text-vscode-descriptionForeground mt-0">
{t("welcome:waitingForCloud.description")}
</p>
<p className="text-sm text-vscode-descriptionForeground mt-2">
<Trans
i18nKey="welcome:waitingForCloud.noPrompt"
components={{
clickHere: (
<button
onClick={handleOpenSignupUrl}
className="text-vscode-textLink-foreground hover:text-vscode-textLink-activeForeground underline cursor-pointer bg-transparent border-none p-0 text-sm"
/>
),
}}
/>
</p>
<p className="text-sm text-vscode-descriptionForeground">
<Trans
i18nKey="welcome:waitingForCloud.havingTrouble"
components={{
clickHere: (
<button
onClick={() => setShowManualEntry(true)}
className="text-vscode-textLink-foreground hover:text-vscode-textLink-activeForeground underline cursor-pointer bg-transparent border-none p-0 text-sm"
/>
),
}}
/>
</p>
{showManualEntry && (
<div className="mt-2 w-full max-w-sm">
<p className="text-sm text-vscode-descriptionForeground mb-2">
{t("welcome:waitingForCloud.pasteUrl")}
</p>
<VSCodeTextField
ref={manualUrlInputRef as any}
value={manualUrl}
onChange={handleManualUrlChange}
onKeyDown={handleKeyDown}
placeholder="vscode://RooVeterinaryInc.roo-cline/auth/clerk/callback?state=..."
className="w-full"
<div className="flex gap-2 items-start pr-4 text-vscode-descriptionForeground">
<BadgeInfo className="size-4 inline shrink-0" />
<p className="m-0">
<Trans
i18nKey="welcome:waitingForCloud.noPrompt"
components={{
clickHere: (
<button
onClick={handleOpenSignupUrl}
className="text-vscode-textLink-foreground hover:text-vscode-textLink-activeForeground underline cursor-pointer bg-transparent border-none p-0"
/>
),
}}
/>
</p>
</div>
<div className="flex gap-2 items-start pr-4 text-vscode-descriptionForeground">
<ArrowRight className="size-4 inline shrink-0" />
<div>
<p className="m-0">
<Trans
i18nKey="welcome:waitingForCloud.havingTrouble"
components={{
clickHere: (
<button
onClick={() => setShowManualEntry(true)}
className="text-vscode-textLink-foreground hover:text-vscode-textLink-activeForeground underline cursor-pointer bg-transparent border-none p-0 "
/>
),
}}
/>
</p>
{showManualEntry && (
<div className="w-full max-w-sm">
<p className="text-vscode-descriptionForeground">
{t("welcome:waitingForCloud.pasteUrl")}
</p>
<div className="flex gap-2 items-center">
<VSCodeTextField
ref={manualUrlInputRef as any}
value={manualUrl}
onKeyUp={handleManualUrlChange}
placeholder="vscode://RooVeterinaryInc.roo-cline/auth/clerk/callback?state=..."
className="flex-1"
/>
<Button
onClick={handleSubmit}
disabled={manualUrl.length < 40}
variant="secondary">
<ArrowRight className="size-4" />
</Button>
</div>
{manualUrl && manualErrorMessage && (
<p className="text-vscode-errorForeground mt-2">
{t("welcome:waitingForCloud.invalidURL")}
</p>
)}
</div>
)}
</div>
)}
</div>
</div>
<div className="mt-4">
<Button onClick={handleGoBack} variant="secondary">
<ArrowLeft className="size-4" />
{t("welcome:waitingForCloud.goBack")}
</Button>
</div>
</TabContent>
<div className="sticky bottom-0 bg-vscode-sideBar-background p-4 border-t border-vscode-panel-border">
<Button onClick={handleGoBack} variant="secondary" className="flex items-center gap-2">
<ArrowLeft className="size-4" />
{t("welcome:waitingForCloud.goBack")}
</Button>
</div>
</Tab>
)
}
return (
<Tab>
<TabContent className="flex flex-col gap-4 p-6">
<TabContent className="flex flex-col gap-4 p-6 justify-center">
<RooHero />
<h2 className="mt-0 mb-0 text-xl">{t("welcome:greeting")}</h2>
<div className="text-base text-vscode-foreground">
<p className="mb-3 leading-relaxed">
<Trans i18nKey="welcome:introduction" />
</p>
<p className="mb-0 leading-relaxed">
<div className="text-base text-vscode-foreground space-y-3">
{selectedProvider === "roo" && (
<p>
<Trans i18nKey="welcome:introduction" />
</p>
)}
<p>
<Trans i18nKey="welcome:chooseProvider" />
</p>
</div>
<div className="mb-4">
{/* Roo Code Cloud Provider Option */}
<div
className="flex items-start gap-3 p-4 mb-3 border border-vscode-panel-border rounded-md cursor-pointer hover:bg-vscode-list-hoverBackground"
onClick={() => setSelectedProvider("roo")}>
<input
type="radio"
name="provider"
checked={selectedProvider === "roo"}
onChange={() => setSelectedProvider("roo")}
className="mt-1"
/>
<div className="flex-1">
<span className="text-sm font-semibold mb-2 block">
{t("welcome:providerSignup.rooCloudProvider")}
</span>
<p className="text-xs text-vscode-descriptionForeground mb-1">
{t("welcome:providerSignup.rooCloudDescription")} (
<VSCodeLink
href="https://roocode.com/provider/pricing?utm_source=extension&utm_medium=welcome-screen&utm_campaign=provider-signup&utm_content=learn-more"
className="text-xs">
{t("welcome:providerSignup.learnMore")}
</VSCodeLink>
).
</p>
</div>
</div>
<VSCodeRadioGroup
value={selectedProvider}
onChange={(e: Event | React.FormEvent<HTMLElement>) => {
const target = ((e as CustomEvent)?.detail?.target ||
(e.target as HTMLInputElement)) as HTMLInputElement
setSelectedProvider(target.value as ProviderOption)
}}>
{/* Roo Code Cloud Provider Option */}
<VSCodeRadio value="roo" className="flex items-start gap-2">
<div className="flex-1 space-y-1 cursor-pointer">
<p className="text-lg font-semibold block -mt-1">
{t("welcome:providerSignup.rooCloudProvider")}
</p>
<p className="text-base text-vscode-descriptionForeground mt-0">
{t("welcome:providerSignup.rooCloudDescription")} (
<VSCodeLink
href="https://roocode.com/provider/pricing?utm_source=extension&utm_medium=welcome-screen&utm_campaign=provider-signup&utm_content=learn-more"
className="cursor-pointer">
{t("welcome:providerSignup.learnMore")}
</VSCodeLink>
).
</p>
</div>
</VSCodeRadio>
{/* Use Another Provider Option */}
<div
className="flex items-start gap-3 p-4 mb-4 border border-vscode-panel-border rounded-md cursor-pointer hover:bg-vscode-list-hoverBackground"
onClick={() => setSelectedProvider("custom")}>
<input
type="radio"
name="provider"
checked={selectedProvider === "custom"}
onChange={() => setSelectedProvider("custom")}
className="mt-1"
/>
<div className="flex-1">
<span className="text-sm font-semibold mb-2 block">
{t("welcome:providerSignup.useAnotherProvider")}
</span>
<p className="text-xs text-vscode-descriptionForeground mb-1">
{t("welcome:providerSignup.useAnotherProviderDescription")}
</p>
</div>
</div>
{/* Use Another Provider Option */}
<VSCodeRadio value="custom" className="flex items-start gap-2">
<div className="flex-1 space-y-1 cursor-pointer">
<p className="text-lg font-semibold block -mt-1">
{t("welcome:providerSignup.useAnotherProvider")}
</p>
<p className="text-base text-vscode-descriptionForeground mt-0">
{t("welcome:providerSignup.useAnotherProviderDescription")}
</p>
</div>
</VSCodeRadio>
</VSCodeRadioGroup>
{/* Show API options only when custom provider is selected */}
{selectedProvider === "custom" && (
<div className="mt-4">
{/* Expand API options only when custom provider is selected, max height is used to force a transition */}
<div className="mb-8 border-l-2 border-vscode-panel-border pl-6 ml-[7px]">
<div
className={`overflow-clip transition-[max-height] ease-in-out duration-300 ${selectedProvider === "custom" ? "max-h-[600px]" : "max-h-0"}`}>
<p className="text-base text-vscode-descriptionForeground mt-0">
{t("welcome:providerSignup.noApiKeys")}
</p>
<ApiOptions
fromWelcomeView
apiConfiguration={apiConfiguration || {}}
@ -262,19 +289,15 @@ const WelcomeViewProvider = () => {
setErrorMessage={setErrorMessage}
/>
</div>
)}
</div>
</div>
</TabContent>
<div className="sticky bottom-0 bg-vscode-sideBar-background p-4 border-t border-vscode-panel-border">
<div className="flex flex-col gap-2">
<div className="-mt-8">
<Button onClick={handleGetStarted} variant="primary">
{t("welcome:providerSignup.getStarted")}
</Button>
{errorMessage && selectedProvider === "custom" && (
<div className="text-vscode-errorForeground text-sm">{errorMessage}</div>
)}
</div>
</div>
</TabContent>
</Tab>
)
}

View file

@ -858,7 +858,8 @@
"label": "Model",
"searchPlaceholder": "Cerca",
"noMatchFound": "No s'ha trobat cap coincidència",
"useCustomModel": "Utilitzar personalitzat: {{modelId}}"
"useCustomModel": "Utilitzar personalitzat: {{modelId}}",
"simplifiedExplanation": "Pots ajustar la configuració detallada del model més tard."
},
"footer": {
"feedback": "Si teniu qualsevol pregunta o comentari, no dubteu a obrir un issue a <githubLink>github.com/RooCodeInc/Roo-Code</githubLink> o unir-vos a <redditLink>reddit.com/r/RooCode</redditLink> o <discordLink>discord.gg/roocode</discordLink>",

View file

@ -23,6 +23,7 @@
"learnMore": "més informació",
"useAnotherProvider": "Utilitza un altre proveïdor",
"useAnotherProviderDescription": "Introdueix una clau API i comença.",
"noApiKeys": "No vols haver de tractar amb claus? Opta pel Proveïdor Roo Code Cloud.",
"getStarted": "Començar"
},
"waitingForCloud": {
@ -31,6 +32,7 @@
"noPrompt": "Si no se t'avisa per obrir una URL, <clickHere>feu clic aquí</clickHere>.",
"havingTrouble": "Si has completat el registre però tens problemes, <clickHere>feu clic aquí</clickHere>.",
"pasteUrl": "Enganxa la URL de resposta del teu navegador:",
"invalidURL": "No sembla una URL de resposta vàlida. Copia el que Roo Code Cloud mostra al teu navegador.",
"goBack": "Enrere"
},
"startRouter": "Recomanem utilitzar un router LLM:",

View file

@ -858,7 +858,8 @@
"label": "Modell",
"searchPlaceholder": "Suchen",
"noMatchFound": "Keine Übereinstimmung gefunden",
"useCustomModel": "Benutzerdefiniert verwenden: {{modelId}}"
"useCustomModel": "Benutzerdefiniert verwenden: {{modelId}}",
"simplifiedExplanation": "Du kannst detaillierte Modelleinstellungen später anpassen."
},
"footer": {
"feedback": "Wenn du Fragen oder Feedback hast, kannst du gerne ein Issue auf <githubLink>github.com/RooCodeInc/Roo-Code</githubLink> eröffnen oder <redditLink>reddit.com/r/RooCode</redditLink> oder <discordLink>discord.gg/roocode</discordLink> beitreten",

View file

@ -16,21 +16,23 @@
"incentive": "Probier Roo kostenlos aus"
}
},
"chooseProvider": "Um loszulegen, brauchst du einen LLM-Anbieter:",
"chooseProvider": "Roo braucht einen LLM-Anbieter. Wähle deinen:",
"providerSignup": {
"rooCloudProvider": "Roo Code Cloud Provider",
"rooCloudDescription": "Der einfachste Weg, Roo zu nutzen. Eine kuratierte Mischung aus kostenlosen und bezahlten Modellen zu niedrigen Kosten",
"learnMore": "mehr erfahren",
"useAnotherProvider": "Anderen Anbieter verwenden",
"useAnotherProviderDescription": "Gib einen API-Schlüssel ein und leg los.",
"noApiKeys": "Du möchtest dich nicht mit Schlüsseln herumschlagen? Geh mit dem Roo Code Cloud Provider.",
"getStarted": "Loslegen"
},
"waitingForCloud": {
"heading": "Wir bringen dich zu Roo Code Cloud...",
"description": "Schließe die Anmeldung in deinem Browser ab und du wirst automatisch hierher zurückgebracht.",
"description": "Wir bringen dich in deinen Browser, um dich für Roo Code Cloud zu registrieren. Dann bringen wir dich hierher zurück, um das Einrichten abzuschließen.",
"noPrompt": "Wenn du nicht aufgefordert wirst, eine URL zu öffnen, <clickHere>klick hier</clickHere>.",
"havingTrouble": "Wenn du die Anmeldung abgeschlossen hast, aber Probleme hast, <clickHere>klick hier</clickHere>.",
"pasteUrl": "Füge die Callback-URL aus deinem Browser ein:",
"invalidURL": "Das sieht nicht wie eine gültige Callback-URL aus. Bitte kopiere das, was Roo Code Cloud in deinem Browser anzeigt.",
"goBack": "Zurück"
},
"startRouter": "Wir empfehlen die Verwendung eines LLM-Routers:",

View file

@ -863,7 +863,8 @@
"label": "Model",
"searchPlaceholder": "Search",
"noMatchFound": "No match found",
"useCustomModel": "Use custom: {{modelId}}"
"useCustomModel": "Use custom: {{modelId}}",
"simplifiedExplanation": "You can adjust detailed model settings later."
},
"footer": {
"telemetry": {

View file

@ -16,21 +16,23 @@
"incentive": "Try Roo out for free"
}
},
"chooseProvider": "To get started, you need an LLM provider:",
"chooseProvider": "Roo needs an LLM provider to work. Choose yours:",
"providerSignup": {
"rooCloudProvider": "Roo Code Cloud Provider",
"rooCloudDescription": "The simplest way to use Roo. A curated mix of free and paid models at a low cost",
"learnMore": "learn more",
"useAnotherProvider": "Use another provider",
"useAnotherProviderDescription": "Enter an API key and get going.",
"noApiKeys": "Don't want to deal with keys? Go with the Roo Code Cloud Provider.",
"getStarted": "Get started"
},
"waitingForCloud": {
"heading": "Taking you to Roo Code Cloud...",
"description": "Complete sign-up in your browser, then you'll return here automatically.",
"description": "We'll take you to your browser to sign up for Roo Code Cloud. We'll then bring you back here to finish.",
"noPrompt": "If you don't get prompted to open a URL, <clickHere>click here</clickHere>.",
"havingTrouble": "If you've completed the sign up but are having trouble, <clickHere>click here</clickHere>.",
"pasteUrl": "Paste the callback URL from your browser:",
"havingTrouble": "If you've completed sign up but are having trouble, <clickHere>click here</clickHere>.",
"pasteUrl": "Paste the callback URL shown in your browser:",
"invalidURL": "That doesn't look like a valid callback URL. Please copy what Roo Code Cloud is showing in your browser.",
"goBack": "Go back"
},
"startRouter": "We recommend using an LLM Router:",

View file

@ -858,7 +858,8 @@
"label": "Modelo",
"searchPlaceholder": "Buscar",
"noMatchFound": "No se encontraron coincidencias",
"useCustomModel": "Usar personalizado: {{modelId}}"
"useCustomModel": "Usar personalizado: {{modelId}}",
"simplifiedExplanation": "Puedes ajustar la configuración detallada del modelo más tarde."
},
"footer": {
"feedback": "Si tiene alguna pregunta o comentario, no dude en abrir un issue en <githubLink>github.com/RooCodeInc/Roo-Code</githubLink> o unirse a <redditLink>reddit.com/r/RooCode</redditLink> o <discordLink>discord.gg/roocode</discordLink>",

View file

@ -16,21 +16,23 @@
"incentive": "Prueba Roo gratis"
}
},
"chooseProvider": "Para comenzar, necesitas un proveedor LLM:",
"chooseProvider": "Roo necesita un proveedor de LLM. Elige el tuyo:",
"providerSignup": {
"rooCloudProvider": "Proveedor Roo Code Cloud",
"rooCloudDescription": "La forma más sencilla de usar Roo. Una mezcla seleccionada de modelos gratuitos y de pago a bajo costo",
"learnMore": "más información",
"useAnotherProvider": "Usar otro proveedor",
"useAnotherProviderDescription": "Introduce una clave API y comienza.",
"noApiKeys": "¿No quieres lidiar con claves? Ve con el Proveedor de Roo Code Cloud.",
"getStarted": "Comenzar"
},
"waitingForCloud": {
"heading": "Te llevamos a Roo Code Cloud...",
"description": "Completa el registro en tu navegador y volverás aquí automáticamente.",
"description": "Te llevaremos a tu navegador para que te registres en Roo Code Cloud. Luego te traeremos aquí para terminar.",
"noPrompt": "Si no se te pide que abras una URL, <clickHere>haz clic aquí</clickHere>.",
"havingTrouble": "Si completaste el registro pero tienes problemas, <clickHere>haz clic aquí</clickHere>.",
"pasteUrl": "Pega la URL de respuesta de tu navegador:",
"invalidURL": "Eso no parece ser una URL de respuesta válida. Por favor copia lo que Roo Code Cloud está mostrando en tu navegador.",
"goBack": "Volver"
},
"startRouter": "Recomendamos usar un router LLM:",

View file

@ -858,7 +858,8 @@
"label": "Modèle",
"searchPlaceholder": "Rechercher",
"noMatchFound": "Aucune correspondance trouvée",
"useCustomModel": "Utiliser personnalisé : {{modelId}}"
"useCustomModel": "Utiliser personnalisé : {{modelId}}",
"simplifiedExplanation": "Tu peux ajuster les paramètres détaillés du modèle ultérieurement."
},
"footer": {
"feedback": "Si vous avez des questions ou des commentaires, n'hésitez pas à ouvrir un problème sur <githubLink>github.com/RooCodeInc/Roo-Code</githubLink> ou à rejoindre <redditLink>reddit.com/r/RooCode</redditLink> ou <discordLink>discord.gg/roocode</discordLink>",

View file

@ -23,6 +23,7 @@
"learnMore": "en savoir plus",
"useAnotherProvider": "Utiliser un autre fournisseur",
"useAnotherProviderDescription": "Entre une clé API et commence.",
"noApiKeys": "Tu ne veux pas te soucier des clés? Opte pour le Fournisseur Roo Code Cloud.",
"getStarted": "Commencer"
},
"waitingForCloud": {
@ -31,6 +32,7 @@
"noPrompt": "Si tu n'es pas invité à ouvrir une URL, <clickHere>clique ici</clickHere>.",
"havingTrouble": "Si tu as terminé l'inscription mais que tu rencontres des problèmes, <clickHere>clique ici</clickHere>.",
"pasteUrl": "Colle l'URL de rappel depuis ton navigateur :",
"invalidURL": "Cela ne ressemble pas à une URL de rappel valide. Copie ce que Roo Code Cloud affiche dans ton navigateur.",
"goBack": "Retour"
},
"startRouter": "Nous recommandons d'utiliser un routeur LLM :",

View file

@ -859,7 +859,8 @@
"label": "मॉडल",
"searchPlaceholder": "खोजें",
"noMatchFound": "कोई मिलान नहीं मिला",
"useCustomModel": "कस्टम उपयोग करें: {{modelId}}"
"useCustomModel": "कस्टम उपयोग करें: {{modelId}}",
"simplifiedExplanation": "आप बाद में विस्तृत मॉडल सेटिंग्स समायोजित कर सकते हैं।"
},
"footer": {
"feedback": "यदि आपके कोई प्रश्न या प्रतिक्रिया है, तो <githubLink>github.com/RooCodeInc/Roo-Code</githubLink> पर एक मुद्दा खोलने या <redditLink>reddit.com/r/RooCode</redditLink> या <discordLink>discord.gg/roocode</discordLink> में शामिल होने में संकोच न करें",

View file

@ -23,6 +23,7 @@
"learnMore": "और जानें",
"useAnotherProvider": "दूसरे प्रदाता का उपयोग करें",
"useAnotherProviderDescription": "एक API कुंजी दर्ज करें और शुरू करें।",
"noApiKeys": "कुंजियों से निपटना नहीं चाहते? Roo Code Cloud प्रदाता के साथ जाएं।",
"getStarted": "शुरू करें"
},
"waitingForCloud": {
@ -31,6 +32,7 @@
"noPrompt": "यदि आपको URL खोलने के लिए संकेत नहीं मिलता है, तो <clickHere>यहां क्लिक करें</clickHere>।",
"havingTrouble": "यदि आपने साइन अप पूरा कर लिया है लेकिन समस्या हो रही है, तो <clickHere>यहां क्लिक करें</clickHere>।",
"pasteUrl": "अपने ब्राउज़र से कॉलबैक URL पेस्ट करें:",
"invalidURL": "यह एक वैध कॉलबैक URL नहीं लगता है। कृपया वह कॉपी करें जो Roo Code Cloud आपके ब्राउज़र में दिखा रहा है।",
"goBack": "वापस जाएं"
},
"startRouter": "हम एक LLM राउटर का उपयोग करने की सलाह देते हैं:",

View file

@ -888,7 +888,8 @@
"label": "Model",
"searchPlaceholder": "Cari",
"noMatchFound": "Tidak ada yang cocok ditemukan",
"useCustomModel": "Gunakan kustom: {{modelId}}"
"useCustomModel": "Gunakan kustom: {{modelId}}",
"simplifiedExplanation": "Anda dapat menyesuaikan pengaturan model terperinci nanti."
},
"footer": {
"feedback": "Jika kamu punya pertanyaan atau feedback, jangan ragu untuk membuka issue di <githubLink>github.com/RooCodeInc/Roo-Code</githubLink> atau bergabung <redditLink>reddit.com/r/RooCode</redditLink> atau <discordLink>discord.gg/roocode</discordLink>",

View file

@ -23,6 +23,7 @@
"learnMore": "pelajari lebih lanjut",
"useAnotherProvider": "Gunakan penyedia lain",
"useAnotherProviderDescription": "Masukkan kunci API dan mulai.",
"noApiKeys": "Tidak ingin menangani kunci? Pilih Penyedia Roo Code Cloud.",
"getStarted": "Mulai"
},
"waitingForCloud": {
@ -31,6 +32,7 @@
"noPrompt": "Jika kamu tidak diminta untuk membuka URL, <clickHere>klik di sini</clickHere>.",
"havingTrouble": "Jika kamu telah menyelesaikan pendaftaran tetapi mengalami masalah, <clickHere>klik di sini</clickHere>.",
"pasteUrl": "Tempel URL callback dari browser Anda:",
"invalidURL": "Itu tidak terlihat seperti URL callback yang valid. Salin apa yang ditampilkan Roo Code Cloud di browser Anda.",
"goBack": "Kembali"
},
"startRouter": "Kami merekomendasikan menggunakan Router LLM:",

View file

@ -859,7 +859,8 @@
"label": "Modello",
"searchPlaceholder": "Cerca",
"noMatchFound": "Nessuna corrispondenza trovata",
"useCustomModel": "Usa personalizzato: {{modelId}}"
"useCustomModel": "Usa personalizzato: {{modelId}}",
"simplifiedExplanation": "Puoi modificare le impostazioni dettagliate del modello in seguito."
},
"footer": {
"feedback": "Se hai domande o feedback, sentiti libero di aprire un issue su <githubLink>github.com/RooCodeInc/Roo-Code</githubLink> o unirti a <redditLink>reddit.com/r/RooCode</redditLink> o <discordLink>discord.gg/roocode</discordLink>",

View file

@ -23,6 +23,7 @@
"learnMore": "scopri di più",
"useAnotherProvider": "Usa un altro provider",
"useAnotherProviderDescription": "Inserisci una chiave API e inizia.",
"noApiKeys": "Non vuoi occuparti di chiavi? Scegli il Provider Roo Code Cloud.",
"getStarted": "Inizia"
},
"waitingForCloud": {
@ -31,6 +32,7 @@
"noPrompt": "Se non ti viene chiesto di aprire un URL, <clickHere>fai clic qui</clickHere>.",
"havingTrouble": "Se hai completato l'iscrizione ma hai problemi, <clickHere>fai clic qui</clickHere>.",
"pasteUrl": "Incolla l'URL di callback dal tuo browser:",
"invalidURL": "Questo non sembra un URL di callback valido. Copia quello che Roo Code Cloud mostra nel tuo browser.",
"goBack": "Indietro"
},
"startRouter": "Consigliamo di utilizzare un router LLM:",

View file

@ -859,7 +859,8 @@
"label": "モデル",
"searchPlaceholder": "検索",
"noMatchFound": "一致するものが見つかりません",
"useCustomModel": "カスタムを使用: {{modelId}}"
"useCustomModel": "カスタムを使用: {{modelId}}",
"simplifiedExplanation": "詳細なモデル設定は後で調整できます。"
},
"footer": {
"feedback": "質問やフィードバックがある場合は、<githubLink>github.com/RooCodeInc/Roo-Code</githubLink>で問題を開くか、<redditLink>reddit.com/r/RooCode</redditLink>や<discordLink>discord.gg/roocode</discordLink>に参加してください",

View file

@ -23,6 +23,7 @@
"learnMore": "詳細を見る",
"useAnotherProvider": "別のプロバイダーを使用",
"useAnotherProviderDescription": "APIキーを入力して始める。",
"noApiKeys": "キーを扱いたくないですかRoo Code Cloudプロバイダーを選びましょう。",
"getStarted": "始める"
},
"waitingForCloud": {
@ -31,6 +32,7 @@
"noPrompt": "URLを開くように促されない場合は、<clickHere>ここをクリック</clickHere>してください。",
"havingTrouble": "サインアップを完了しましたが問題がある場合は、<clickHere>ここをクリック</clickHere>してください。",
"pasteUrl": "ブラウザからコールバックURLを貼り付けてください",
"invalidURL": "有効なコールバックURLのようには見えません。Roo Code Cloudがブラウザに表示しているものをコピーしてください。",
"goBack": "戻る"
},
"startRouter": "LLMルーターの使用をお勧めします",

View file

@ -859,7 +859,8 @@
"label": "모델",
"searchPlaceholder": "검색",
"noMatchFound": "일치하는 항목 없음",
"useCustomModel": "사용자 정의 사용: {{modelId}}"
"useCustomModel": "사용자 정의 사용: {{modelId}}",
"simplifiedExplanation": "나중에 자세한 모델 설정을 조정할 수 있습니다."
},
"footer": {
"feedback": "질문이나 피드백이 있으시면 <githubLink>github.com/RooCodeInc/Roo-Code</githubLink>에서 이슈를 열거나 <redditLink>reddit.com/r/RooCode</redditLink> 또는 <discordLink>discord.gg/roocode</discordLink>에 가입하세요",

View file

@ -23,6 +23,7 @@
"learnMore": "자세히 알아보기",
"useAnotherProvider": "다른 제공업체 사용",
"useAnotherProviderDescription": "API 키를 입력하고 시작하세요.",
"noApiKeys": "키를 다루기 싫으세요? Roo Code Cloud 제공업체를 선택하세요.",
"getStarted": "시작하기"
},
"waitingForCloud": {
@ -31,6 +32,7 @@
"noPrompt": "URL을 열도록 요청받지 않으면 <clickHere>여기를 클릭</clickHere>하세요.",
"havingTrouble": "가입을 완료했지만 문제가 있으면 <clickHere>여기를 클릭</clickHere>하세요.",
"pasteUrl": "브라우저에서 콜백 URL을 붙여넣으세요:",
"invalidURL": "유효한 콜백 URL로 보이지 않습니다. Roo Code Cloud에서 브라우저에 표시하는 내용을 복사하세요.",
"goBack": "돌아가기"
},
"startRouter": "LLM 라우터 사용을 권장합니다:",

View file

@ -859,7 +859,8 @@
"label": "Model",
"searchPlaceholder": "Zoeken",
"noMatchFound": "Geen overeenkomsten gevonden",
"useCustomModel": "Aangepast gebruiken: {{modelId}}"
"useCustomModel": "Aangepast gebruiken: {{modelId}}",
"simplifiedExplanation": "Je kunt later gedetailleerde modelinstellingen aanpassen."
},
"footer": {
"feedback": "Heb je vragen of feedback? Open gerust een issue op <githubLink>github.com/RooCodeInc/Roo-Code</githubLink> of sluit je aan bij <redditLink>reddit.com/r/RooCode</redditLink> of <discordLink>discord.gg/roocode</discordLink>",

View file

@ -23,6 +23,7 @@
"learnMore": "meer informatie",
"useAnotherProvider": "Gebruik een andere provider",
"useAnotherProviderDescription": "Voer een API-sleutel in en ga aan de slag.",
"noApiKeys": "Geen zin in sleutels? Kies dan voor de Roo Code Cloud Provider.",
"getStarted": "Beginnen"
},
"waitingForCloud": {
@ -31,6 +32,7 @@
"noPrompt": "Als je niet wordt gevraagd een URL te openen, <clickHere>klik hier</clickHere>.",
"havingTrouble": "Als je de registratie hebt voltooid maar problemen hebt, <clickHere>klik hier</clickHere>.",
"pasteUrl": "Plak de callback-URL vanuit je browser:",
"invalidURL": "Dat ziet er niet uit als een geldige callback-URL. Kopieer wat Roo Code Cloud in je browser toont.",
"goBack": "Terug"
},
"startRouter": "We raden aan om een LLM-router te gebruiken:",

View file

@ -859,7 +859,8 @@
"label": "Model",
"searchPlaceholder": "Wyszukaj",
"noMatchFound": "Nie znaleziono dopasowań",
"useCustomModel": "Użyj niestandardowy: {{modelId}}"
"useCustomModel": "Użyj niestandardowy: {{modelId}}",
"simplifiedExplanation": "Można dostosować szczegółowe ustawienia modelu później."
},
"footer": {
"feedback": "Jeśli masz jakiekolwiek pytania lub opinie, śmiało otwórz zgłoszenie na <githubLink>github.com/RooCodeInc/Roo-Code</githubLink> lub dołącz do <redditLink>reddit.com/r/RooCode</redditLink> lub <discordLink>discord.gg/roocode</discordLink>",

View file

@ -23,6 +23,7 @@
"learnMore": "dowiedz się więcej",
"useAnotherProvider": "Użyj innego dostawcy",
"useAnotherProviderDescription": "Wprowadź klucz API i zacznij.",
"noApiKeys": "Nie chcesz się zajmować kluczami? Wybierz Dostawcę Roo Code Cloud.",
"getStarted": "Rozpocznij"
},
"waitingForCloud": {
@ -31,6 +32,7 @@
"noPrompt": "Jeśli nie zostaniesz poproszony o otwarcie adresu URL, <clickHere>kliknij tutaj</clickHere>.",
"havingTrouble": "Jeśli ukończyłeś rejestrację, ale masz problemy, <clickHere>kliknij tutaj</clickHere>.",
"pasteUrl": "Wklej adres URL wywołania zwrotnego z przeglądarki:",
"invalidURL": "To nie wygląda na ważny adres URL wywołania zwrotnego. Skopiuj to, co Roo Code Cloud pokazuje w Twojej przeglądarce.",
"goBack": "Wróć"
},
"startRouter": "Zalecamy korzystanie z routera LLM:",

View file

@ -859,7 +859,8 @@
"label": "Modelo",
"searchPlaceholder": "Pesquisar",
"noMatchFound": "Nenhuma correspondência encontrada",
"useCustomModel": "Usar personalizado: {{modelId}}"
"useCustomModel": "Usar personalizado: {{modelId}}",
"simplifiedExplanation": "Você pode ajustar as configurações detalhadas do modelo mais tarde."
},
"footer": {
"feedback": "Se tiver alguma dúvida ou feedback, sinta-se à vontade para abrir um problema em <githubLink>github.com/RooCodeInc/Roo-Code</githubLink> ou juntar-se a <redditLink>reddit.com/r/RooCode</redditLink> ou <discordLink>discord.gg/roocode</discordLink>",

View file

@ -23,6 +23,7 @@
"learnMore": "saiba mais",
"useAnotherProvider": "Usar outro provedor",
"useAnotherProviderDescription": "Digite uma chave API e comece.",
"noApiKeys": "Não quer lidar com chaves? Escolha o Provedor Roo Code Cloud.",
"getStarted": "Começar"
},
"waitingForCloud": {
@ -31,6 +32,7 @@
"noPrompt": "Se você não for solicitado a abrir uma URL, <clickHere>clique aqui</clickHere>.",
"havingTrouble": "Se você completou o registro mas está tendo problemas, <clickHere>clique aqui</clickHere>.",
"pasteUrl": "Cole a URL de callback do seu navegador:",
"invalidURL": "Isso não parece uma URL de callback válida. Copie o que o Roo Code Cloud está mostrando no seu navegador.",
"goBack": "Voltar"
},
"startRouter": "Recomendamos usar um roteador LLM:",

View file

@ -859,7 +859,8 @@
"label": "Модель",
"searchPlaceholder": "Поиск",
"noMatchFound": "Совпадений не найдено",
"useCustomModel": "Использовать пользовательскую: {{modelId}}"
"useCustomModel": "Использовать пользовательскую: {{modelId}}",
"simplifiedExplanation": "Ты сможешь настроить подробные параметры модели позже."
},
"footer": {
"feedback": "Если у вас есть вопросы или предложения, откройте issue на <githubLink>github.com/RooCodeInc/Roo-Code</githubLink> или присоединяйтесь к <redditLink>reddit.com/r/RooCode</redditLink> или <discordLink>discord.gg/roocode</discordLink>",

View file

@ -23,6 +23,7 @@
"learnMore": "подробнее",
"useAnotherProvider": "Использовать другого провайдера",
"useAnotherProviderDescription": "Введи API-ключ и начни.",
"noApiKeys": "Не хочешь заниматься ключами? Выбери Провайдер Roo Code Cloud.",
"getStarted": "Начать"
},
"waitingForCloud": {
@ -31,6 +32,7 @@
"noPrompt": "Если вас не попросят открыть URL, <clickHere>нажмите здесь</clickHere>.",
"havingTrouble": "Если вы завершили регистрацию, но у вас возникли проблемы, <clickHere>нажмите здесь</clickHere>.",
"pasteUrl": "Вставьте URL обратного вызова из браузера:",
"invalidURL": "Это не похоже на корректный URL обратного вызова. Скопируй то, что показывает Roo Code Cloud в твоем браузере.",
"goBack": "Назад"
},
"startRouter": "Мы рекомендуем использовать маршрутизатор LLM:",

View file

@ -859,7 +859,8 @@
"label": "Model",
"searchPlaceholder": "Ara",
"noMatchFound": "Eşleşme bulunamadı",
"useCustomModel": "Özel kullan: {{modelId}}"
"useCustomModel": "Özel kullan: {{modelId}}",
"simplifiedExplanation": "Ayrıntılı model ayarlarını daha sonra ayarlayabilirsiniz."
},
"footer": {
"feedback": "Herhangi bir sorunuz veya geri bildiriminiz varsa, <githubLink>github.com/RooCodeInc/Roo-Code</githubLink> adresinde bir konu açmaktan veya <redditLink>reddit.com/r/RooCode</redditLink> ya da <discordLink>discord.gg/roocode</discordLink>'a katılmaktan çekinmeyin",

View file

@ -23,6 +23,7 @@
"learnMore": "daha fazla bilgi",
"useAnotherProvider": "Başka bir sağlayıcı kullan",
"useAnotherProviderDescription": "Bir API anahtarı gir ve başla.",
"noApiKeys": "Anahtarlarla uğraşmak istemez misin? Roo Code Cloud Sağlayıcısı'nı seç.",
"getStarted": "Başla"
},
"waitingForCloud": {
@ -31,6 +32,7 @@
"noPrompt": "URL açmanız istenmezse, <clickHere>buraya tıkla</clickHere>.",
"havingTrouble": "Kaydı tamamladıysan ama sorun yaşıyorsan, <clickHere>buraya tıkla</clickHere>.",
"pasteUrl": "Tarayıcınızdan geri arama URL'sini yapıştırın:",
"invalidURL": "Bu geçerli bir geri arama URL'si gibi görünmüyor. Roo Code Cloud'un tarayıcında gösterdiği şeyi kopyala.",
"goBack": "Geri Dön"
},
"startRouter": "Bir LLM yönlendiricisi kullanmanı öneririz:",

View file

@ -859,7 +859,8 @@
"label": "Mô hình",
"searchPlaceholder": "Tìm kiếm",
"noMatchFound": "Không tìm thấy kết quả",
"useCustomModel": "Sử dụng tùy chỉnh: {{modelId}}"
"useCustomModel": "Sử dụng tùy chỉnh: {{modelId}}",
"simplifiedExplanation": "Bạn có thể điều chỉnh cài đặt mô hình chi tiết sau."
},
"footer": {
"feedback": "Nếu bạn có bất kỳ câu hỏi hoặc phản hồi nào, vui lòng mở một vấn đề tại <githubLink>github.com/RooCodeInc/Roo-Code</githubLink> hoặc tham gia <redditLink>reddit.com/r/RooCode</redditLink> hoặc <discordLink>discord.gg/roocode</discordLink>",

View file

@ -23,6 +23,7 @@
"learnMore": "tìm hiểu thêm",
"useAnotherProvider": "Sử dụng nhà cung cấp khác",
"useAnotherProviderDescription": "Nhập khóa API và bắt đầu.",
"noApiKeys": "Không muốn phải xử lý các khóa? Hãy sử dụng Nhà cung cấp Roo Code Cloud.",
"getStarted": "Bắt đầu"
},
"waitingForCloud": {
@ -31,6 +32,7 @@
"noPrompt": "Nếu bạn không được nhắc mở URL, <clickHere>hãy nhấp vào đây</clickHere>.",
"havingTrouble": "Nếu bạn đã hoàn thành đăng ký nhưng gặp sự cố, <clickHere>hãy nhấp vào đây</clickHere>.",
"pasteUrl": "Dán URL callback từ trình duyệt của bạn:",
"invalidURL": "Điều đó không giống như một URL callback hợp lệ. Vui lòng sao chép những gì Roo Code Cloud đang hiển thị trong trình duyệt của bạn.",
"goBack": "Quay lại"
},
"startRouter": "Chúng tôi khuyên bạn nên sử dụng bộ định tuyến LLM:",

View file

@ -859,7 +859,8 @@
"label": "模型",
"searchPlaceholder": "搜索",
"noMatchFound": "未找到匹配项",
"useCustomModel": "使用自定义:{{modelId}}"
"useCustomModel": "使用自定义:{{modelId}}",
"simplifiedExplanation": "你可以稍后调整详细的模型设置。"
},
"footer": {
"feedback": "如果您有任何问题或反馈,请随时在 <githubLink>github.com/RooCodeInc/Roo-Code</githubLink> 上提出问题或加入 <redditLink>reddit.com/r/RooCode</redditLink> 或 <discordLink>discord.gg/roocode</discordLink>",

View file

@ -23,6 +23,7 @@
"learnMore": "了解更多",
"useAnotherProvider": "使用其他提供商",
"useAnotherProviderDescription": "输入 API 密钥即可开始。",
"noApiKeys": "不想处理密钥?选择 Roo Code Cloud 提供商吧。",
"getStarted": "开始使用"
},
"waitingForCloud": {
@ -31,6 +32,7 @@
"noPrompt": "如果你未被提示打开 URL<clickHere>请点击此处</clickHere>。",
"havingTrouble": "如果你已完成注册但遇到问题,<clickHere>请点击此处</clickHere>。",
"pasteUrl": "从浏览器粘贴回调 URL",
"invalidURL": "这看起来不像是有效的回调 URL。请复制 Roo Code Cloud 在你的浏览器中显示的内容。",
"goBack": "返回"
},
"startRouter": "我们推荐使用 LLM 路由器:",

View file

@ -859,7 +859,8 @@
"label": "模型",
"searchPlaceholder": "搜尋",
"noMatchFound": "找不到符合的項目",
"useCustomModel": "使用自訂模型:{{modelId}}"
"useCustomModel": "使用自訂模型:{{modelId}}",
"simplifiedExplanation": "你可以稍後調整詳細的模型設定。"
},
"footer": {
"feedback": "若您有任何問題或建議,歡迎至 <githubLink>github.com/RooCodeInc/Roo-Code</githubLink> 提出 issue或加入 <redditLink>reddit.com/r/RooCode</redditLink> 或 <discordLink>discord.gg/roocode</discordLink> 討論。",

View file

@ -23,6 +23,7 @@
"learnMore": "了解更多",
"useAnotherProvider": "使用其他提供者",
"useAnotherProviderDescription": "輸入 API 金鑰即可開始。",
"noApiKeys": "不想處理金鑰?選擇 Roo Code Cloud 提供者吧。",
"getStarted": "開始使用"
},
"waitingForCloud": {
@ -31,6 +32,7 @@
"noPrompt": "如果您未被提示開啟 URL<clickHere>請點擊此處</clickHere>。",
"havingTrouble": "如果您已完成註冊但遇到問題,<clickHere>請點擊此處</clickHere>。",
"pasteUrl": "從瀏覽器貼上回呼 URL",
"invalidURL": "這看起來不像是有效的回呼 URL。請複製 Roo Code Cloud 在您的瀏覽器中顯示的內容。",
"goBack": "返回"
},
"startRouter": "我們建議使用 LLM 路由器:",