ux: Updates to CloudView (#9776)

* refactor: remove TabHeader and onDone callback from CloudView

- Removed TabHeader component from CloudView as it is no longer needed
- Removed onDone prop from CloudView component definition and usage
- Updated all test files to reflect the removal of onDone prop
- Kept Button import that was accidentally removed initially

* Updates upsell copy to reflect today's product

* Update webview-ui/src/components/cloud/CloudView.tsx

Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com>

* Update webview-ui/src/i18n/locales/ko/cloud.json

Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com>

* Update webview-ui/src/i18n/locales/zh-CN/cloud.json

Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com>

* Test fixes

---------

Co-authored-by: Roo Code <roomote@roocode.com>
Co-authored-by: Bruno Bergher <bruno@roocode.com>
Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com>
This commit is contained in:
roomote[bot] 2025-12-03 13:36:33 +00:00 committed by GitHub
parent 873a763ea7
commit 18117f0723
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
25 changed files with 211 additions and 239 deletions

View file

@ -263,7 +263,6 @@ const App = () => {
isAuthenticated={cloudIsAuthenticated}
cloudApiUrl={cloudApiUrl}
organizations={cloudOrganizations}
onDone={() => switchTab("chat")}
/>
)}
<ChatView

View file

@ -83,12 +83,8 @@ vi.mock("@src/components/marketplace/MarketplaceView", () => ({
}))
vi.mock("@src/components/cloud/CloudView", () => ({
CloudView: function CloudView({ onDone }: { onDone: () => void }) {
return (
<div data-testid="cloud-view" onClick={onDone}>
Cloud View
</div>
)
CloudView: function CloudView() {
return <div data-testid="cloud-view">Cloud View</div>
},
}))

View file

@ -1,7 +1,7 @@
import { useTranslation } from "react-i18next"
import { Dialog, DialogContent, DialogHeader, Button } from "@/components/ui"
import RooHero from "../welcome/RooHero"
import { CircleDollarSign, FileStack, Router, Share } from "lucide-react"
import { ArrowRight, Brain, Cable, CircleDollarSign, FileStack, Router, Users2 } from "lucide-react"
import { DialogTitle } from "@radix-ui/react-dialog"
interface CloudUpsellDialogProps {
@ -19,21 +19,29 @@ export const renderCloudBenefitsContent = (t: any) => {
</div>
<h1 className="text-xl font-bold text-vscode-foreground">{t("cloud:cloudBenefitsTitle")}</h1>
<div className="text-lg">
<ul className="text-vscode-descriptionForeground space-y-4 my-8">
<ul className="text-vscode-descriptionForeground space-y-2 my-8">
<li className="flex items-start gap-2">
<Router className="size-4 mt-0.5 shrink-0" />
<Brain className="size-4 mt-1 shrink-0" />
{t("cloud:cloudBenefitProvider")}
</li>
<li className="flex items-start gap-2">
<Users2 className="size-4 mt-1 shrink-0" />
{t("cloud:cloudBenefitCloudAgents")}
</li>
<li className="flex items-start gap-2">
<Cable className="size-4 mt-1 shrink-0" />
{t("cloud:cloudBenefitTriggers")}
</li>
<li className="flex items-start gap-2">
<Router className="size-4 mt-1 shrink-0" />
{t("cloud:cloudBenefitWalkaway")}
</li>
<li className="flex items-start gap-2">
<Share className="size-4 mt-0.5 shrink-0" />
{t("cloud:cloudBenefitSharing")}
</li>
<li className="flex items-start gap-2">
<CircleDollarSign className="size-4 mt-0.5 shrink-0" />
<CircleDollarSign className="size-4 mt-1 shrink-0" />
{t("cloud:cloudBenefitMetrics")}
</li>
<li className="flex items-start gap-2">
<FileStack className="size-4 mt-0.5 shrink-0" />
<FileStack className="size-4 mt-1 shrink-0" />
{t("cloud:cloudBenefitHistory")}
</li>
</ul>
@ -56,8 +64,9 @@ export const CloudUpsellDialog = ({ open, onOpenChange, onConnect }: CloudUpsell
{renderCloudBenefitsContent(t)}
<div className="flex flex-col gap-4">
<Button onClick={onConnect} className="w-full">
<Button variant="primary" onClick={onConnect} className="w-full">
{t("cloud:connect")}
<ArrowRight />
</Button>
</div>
</div>

View file

@ -9,9 +9,9 @@ import { vscode } from "@src/utils/vscode"
import { telemetryClient } from "@src/utils/TelemetryClient"
import { ToggleSwitch } from "@/components/ui/toggle-switch"
import { renderCloudBenefitsContent } from "./CloudUpsellDialog"
import { CircleAlert, Info, Lock, TriangleAlert } from "lucide-react"
import { ArrowRight, CircleAlert, Info, Lock, TriangleAlert } from "lucide-react"
import { cn } from "@/lib/utils"
import { Tab, TabContent, TabHeader } from "../common/Tab"
import { Tab, TabContent } from "../common/Tab"
import { Button } from "@/components/ui/button"
import { OrganizationSwitcher } from "./OrganizationSwitcher"
import { StandardTooltip } from "../ui"
@ -23,11 +23,10 @@ type CloudViewProps = {
userInfo: CloudUserInfo | null
isAuthenticated: boolean
cloudApiUrl?: string
onDone: () => void
organizations?: CloudOrganizationMembership[]
}
export const CloudView = ({ userInfo, isAuthenticated, cloudApiUrl, onDone, organizations = [] }: CloudViewProps) => {
export const CloudView = ({ userInfo, isAuthenticated, cloudApiUrl, organizations = [] }: CloudViewProps) => {
const { t } = useAppTranslation()
const {
remoteControlEnabled,
@ -159,11 +158,6 @@ export const CloudView = ({ userInfo, isAuthenticated, cloudApiUrl, onDone, orga
return (
<Tab>
<TabHeader className="flex justify-between items-center">
<h3 className="text-vscode-foreground m-0">{isAuthenticated && t("cloud:title")}</h3>
<Button onClick={onDone}>{t("settings:common.done")}</Button>
</TabHeader>
<TabContent className="pt-10">
{isAuthenticated ? (
<>
@ -271,12 +265,13 @@ export const CloudView = ({ userInfo, isAuthenticated, cloudApiUrl, onDone, orga
</>
) : (
<>
<div className="flex flex-col items-start gap-4 px-8 max-w-100">
<div className="flex flex-col items-start gap-4 px-4 max-w-lg">
<div className={cn(authInProgress && "opacity-50")}>{renderCloudBenefitsContent(t)}</div>
{!authInProgress && (
<Button variant="primary" onClick={handleConnectClick} className="w-full">
<Button variant="primary" onClick={handleConnectClick}>
{t("cloud:connect")}
<ArrowRight />
</Button>
)}

View file

@ -7,12 +7,14 @@ vi.mock("react-i18next", () => ({
useTranslation: () => ({
t: (key: string) => {
const translations: Record<string, string> = {
"cloud:cloudBenefitsTitle": "Connect to Roo Cloud",
"cloud:cloudBenefitSharing": "Share tasks with your team",
"cloud:cloudBenefitHistory": "Access conversation history",
"cloud:cloudBenefitMetrics": "View usage metrics",
"cloud:cloudBenefitWalkaway": "Walk away with your code",
"cloud:connect": "Connect to Cloud",
"cloud:cloudBenefitsTitle": "Try Roo Code Cloud",
"cloud:cloudBenefitProvider": "Access free and paid models that work great with Roo",
"cloud:cloudBenefitCloudAgents": "Give tasks to autonomous Cloud agents",
"cloud:cloudBenefitTriggers": "Get code reviews on Github, start tasks from Slack and more",
"cloud:cloudBenefitWalkaway": "Follow and control tasks from anywhere (including your phone)",
"cloud:cloudBenefitHistory": "Access your task history from anywhere and share them with others",
"cloud:cloudBenefitMetrics": "Get a holistic view of your token consumption",
"cloud:connect": "Get started",
}
return translations[key] || key
},
@ -30,32 +32,37 @@ describe("CloudUpsellDialog", () => {
it("renders dialog when open", () => {
render(<CloudUpsellDialog open={true} onOpenChange={mockOnOpenChange} onConnect={mockOnConnect} />)
expect(screen.getByText("Connect to Roo Cloud")).toBeInTheDocument()
expect(screen.getByText("Share tasks with your team")).toBeInTheDocument()
expect(screen.getByText("Access conversation history")).toBeInTheDocument()
expect(screen.getByText("View usage metrics")).toBeInTheDocument()
expect(screen.getByRole("button", { name: "Connect to Cloud" })).toBeInTheDocument()
expect(screen.getByText("Try Roo Code Cloud")).toBeInTheDocument()
expect(screen.getByText("Access free and paid models that work great with Roo")).toBeInTheDocument()
expect(screen.getByText("Give tasks to autonomous Cloud agents")).toBeInTheDocument()
expect(screen.getByText("Get code reviews on Github, start tasks from Slack and more")).toBeInTheDocument()
expect(screen.getByText("Follow and control tasks from anywhere (including your phone)")).toBeInTheDocument()
expect(
screen.getByText("Access your task history from anywhere and share them with others"),
).toBeInTheDocument()
expect(screen.getByText("Get a holistic view of your token consumption")).toBeInTheDocument()
expect(screen.getByRole("button", { name: "Get started" })).toBeInTheDocument()
})
it("does not render dialog when closed", () => {
render(<CloudUpsellDialog open={false} onOpenChange={mockOnOpenChange} onConnect={mockOnConnect} />)
expect(screen.queryByText("Connect to Roo Cloud")).not.toBeInTheDocument()
expect(screen.queryByText("Try Roo Code Cloud")).not.toBeInTheDocument()
})
it("calls onConnect when connect button is clicked", () => {
render(<CloudUpsellDialog open={true} onOpenChange={mockOnOpenChange} onConnect={mockOnConnect} />)
const connectButton = screen.getByRole("button", { name: "Connect to Cloud" })
const connectButton = screen.getByRole("button", { name: "Get started" })
fireEvent.click(connectButton)
expect(mockOnConnect).toHaveBeenCalledTimes(1)
})
it("renders all three benefits as list items", () => {
it("renders all benefits as list items", () => {
render(<CloudUpsellDialog open={true} onOpenChange={mockOnOpenChange} onConnect={mockOnConnect} />)
const listItems = screen.getAllByRole("listitem")
expect(listItems).toHaveLength(4)
expect(listItems).toHaveLength(6)
})
})

View file

@ -10,12 +10,15 @@ vi.mock("@src/i18n/TranslationContext", () => ({
"cloud:title": "Cloud",
"settings:common.done": "Done",
"cloud:signIn": "Connect to Roo Code Cloud",
"cloud:cloudBenefitsTitle": "Connect to Roo Code Cloud",
"cloud:cloudBenefitSharing": "Share tasks with others",
"cloud:cloudBenefitHistory": "Access your task history",
"cloud:cloudBenefitsTitle": "Try Roo Code Cloud",
"cloud:cloudBenefitProvider": "Access free and paid models that work great with Roo",
"cloud:cloudBenefitCloudAgents": "Give tasks to autonomous Cloud agents",
"cloud:cloudBenefitTriggers": "Get code reviews on Github, start tasks from Slack and more",
"cloud:cloudBenefitWalkaway": "Follow and control tasks from anywhere (including your phone)",
"cloud:cloudBenefitHistory": "Access your task history from anywhere and share them with others",
"cloud:cloudBenefitMetrics": "Get a holistic view of your token consumption",
"cloud:logOut": "Log out",
"cloud:connect": "Connect Now",
"cloud:connect": "Get started",
"cloud:visitCloudWebsite": "Visit Roo Code Cloud",
"cloud:taskSync": "Task sync",
"cloud:taskSyncDescription": "Sync your tasks for viewing and sharing on Roo Code Cloud",
@ -69,23 +72,21 @@ Object.defineProperty(window, "IMAGES_BASE_URI", {
describe("CloudView", () => {
it("should display benefits when user is not authenticated", () => {
render(
<CloudView
userInfo={null}
isAuthenticated={false}
cloudApiUrl="https://app.roocode.com"
onDone={() => {}}
/>,
)
render(<CloudView userInfo={null} isAuthenticated={false} cloudApiUrl="https://app.roocode.com" />)
// Check that the benefits section is displayed
expect(screen.getByRole("heading", { name: "Connect to Roo Code Cloud" })).toBeInTheDocument()
expect(screen.getByText("Share tasks with others")).toBeInTheDocument()
expect(screen.getByText("Access your task history")).toBeInTheDocument()
expect(screen.getByRole("heading", { name: "Try Roo Code Cloud" })).toBeInTheDocument()
expect(screen.getByText("Access free and paid models that work great with Roo")).toBeInTheDocument()
expect(screen.getByText("Give tasks to autonomous Cloud agents")).toBeInTheDocument()
expect(screen.getByText("Get code reviews on Github, start tasks from Slack and more")).toBeInTheDocument()
expect(screen.getByText("Follow and control tasks from anywhere (including your phone)")).toBeInTheDocument()
expect(
screen.getByText("Access your task history from anywhere and share them with others"),
).toBeInTheDocument()
expect(screen.getByText("Get a holistic view of your token consumption")).toBeInTheDocument()
// Check that the connect button is also present
expect(screen.getByText("Connect Now")).toBeInTheDocument()
expect(screen.getByRole("button", { name: "Get started" })).toBeInTheDocument()
})
it("should not display benefits when user is authenticated", () => {
@ -94,21 +95,20 @@ describe("CloudView", () => {
email: "test@example.com",
}
render(
<CloudView
userInfo={mockUserInfo}
isAuthenticated={true}
cloudApiUrl="https://app.roocode.com"
onDone={() => {}}
/>,
)
render(<CloudView userInfo={mockUserInfo} isAuthenticated={true} cloudApiUrl="https://app.roocode.com" />)
// Check that the benefits section is NOT displayed
expect(screen.queryByText("Access free and paid models that work great with Roo")).not.toBeInTheDocument()
expect(screen.queryByText("Give tasks to autonomous Cloud agents")).not.toBeInTheDocument()
expect(
screen.queryByText("Follow and control tasks from anywhere with Roomote Control"),
screen.queryByText("Get code reviews on Github, start tasks from Slack and more"),
).not.toBeInTheDocument()
expect(
screen.queryByText("Follow and control tasks from anywhere (including your phone)"),
).not.toBeInTheDocument()
expect(
screen.queryByText("Access your task history from anywhere and share them with others"),
).not.toBeInTheDocument()
expect(screen.queryByText("Share tasks with others")).not.toBeInTheDocument()
expect(screen.queryByText("Access your task history")).not.toBeInTheDocument()
expect(screen.queryByText("Get a holistic view of your token consumption")).not.toBeInTheDocument()
// Check that user info is displayed instead
@ -123,14 +123,7 @@ describe("CloudView", () => {
extensionBridgeEnabled: true,
}
render(
<CloudView
userInfo={mockUserInfo}
isAuthenticated={true}
cloudApiUrl="https://app.roocode.com"
onDone={() => {}}
/>,
)
render(<CloudView userInfo={mockUserInfo} isAuthenticated={true} cloudApiUrl="https://app.roocode.com" />)
// Check that the remote control toggle is displayed
expect(screen.getByTestId("remote-control-toggle")).toBeInTheDocument()
@ -147,14 +140,7 @@ describe("CloudView", () => {
extensionBridgeEnabled: false,
}
render(
<CloudView
userInfo={mockUserInfo}
isAuthenticated={true}
cloudApiUrl="https://app.roocode.com"
onDone={() => {}}
/>,
)
render(<CloudView userInfo={mockUserInfo} isAuthenticated={true} cloudApiUrl="https://app.roocode.com" />)
// Check that the remote control toggle is NOT displayed
expect(screen.queryByTestId("remote-control-toggle")).not.toBeInTheDocument()
@ -172,14 +158,7 @@ describe("CloudView", () => {
extensionBridgeEnabled: true, // Bridge enabled but roomote control disabled
}
render(
<CloudView
userInfo={mockUserInfo}
isAuthenticated={true}
cloudApiUrl="https://app.roocode.com"
onDone={() => {}}
/>,
)
render(<CloudView userInfo={mockUserInfo} isAuthenticated={true} cloudApiUrl="https://app.roocode.com" />)
// Check that the remote control toggle is NOT displayed
expect(screen.queryByTestId("remote-control-toggle")).not.toBeInTheDocument()
@ -202,14 +181,7 @@ describe("CloudView", () => {
extensionBridgeEnabled: true,
}
render(
<CloudView
userInfo={mockUserInfo}
isAuthenticated={true}
cloudApiUrl="https://app.roocode.com"
onDone={() => {}}
/>,
)
render(<CloudView userInfo={mockUserInfo} isAuthenticated={true} cloudApiUrl="https://app.roocode.com" />)
// Check that the remote control toggle IS displayed for organization users
// (The ClineProvider would set featureRoomoteControlEnabled to true for org users)
@ -226,14 +198,7 @@ describe("CloudView", () => {
email: "test@example.com",
}
render(
<CloudView
userInfo={mockUserInfo}
isAuthenticated={true}
cloudApiUrl="https://app.roocode.com"
onDone={() => {}}
/>,
)
render(<CloudView userInfo={mockUserInfo} isAuthenticated={true} cloudApiUrl="https://app.roocode.com" />)
// Check that the cloud URL pill is NOT displayed for production URL
expect(screen.queryByText(/Roo Code Cloud URL:/)).not.toBeInTheDocument()
@ -245,14 +210,7 @@ describe("CloudView", () => {
email: "test@example.com",
}
render(
<CloudView
userInfo={mockUserInfo}
isAuthenticated={true}
cloudApiUrl="https://staging.roocode.com"
onDone={() => {}}
/>,
)
render(<CloudView userInfo={mockUserInfo} isAuthenticated={true} cloudApiUrl="https://staging.roocode.com" />)
// Check that the cloud URL pill is displayed with the staging URL
expect(screen.getByText(/Roo Code Cloud URL:/)).toBeInTheDocument()
@ -260,14 +218,7 @@ describe("CloudView", () => {
})
it("should display cloud URL pill for non-authenticated users when not pointing to production", () => {
render(
<CloudView
userInfo={null}
isAuthenticated={false}
cloudApiUrl="https://dev.roocode.com"
onDone={() => {}}
/>,
)
render(<CloudView userInfo={null} isAuthenticated={false} cloudApiUrl="https://dev.roocode.com" />)
// Check that the cloud URL pill is displayed even when not authenticated
expect(screen.getByText(/Roo Code Cloud URL:/)).toBeInTheDocument()
@ -280,7 +231,7 @@ describe("CloudView", () => {
email: "test@example.com",
}
render(<CloudView userInfo={mockUserInfo} isAuthenticated={true} onDone={() => {}} />)
render(<CloudView userInfo={mockUserInfo} isAuthenticated={true} />)
// Check that the cloud URL pill is NOT displayed when cloudApiUrl is undefined
expect(screen.queryByText(/Roo Code Cloud URL:/)).not.toBeInTheDocument()
@ -294,14 +245,7 @@ describe("CloudView", () => {
organizationName: "Test Organization",
}
render(
<CloudView
userInfo={mockUserInfo}
isAuthenticated={true}
cloudApiUrl="https://app.roocode.com"
onDone={() => {}}
/>,
)
render(<CloudView userInfo={mockUserInfo} isAuthenticated={true} cloudApiUrl="https://app.roocode.com" />)
// Check that the task sync toggle is disabled for organization users
const taskSyncToggle = screen.getByTestId("task-sync-toggle")
@ -326,14 +270,7 @@ describe("CloudView", () => {
// No organizationId - regular user
}
render(
<CloudView
userInfo={mockUserInfo}
isAuthenticated={true}
cloudApiUrl="https://app.roocode.com"
onDone={() => {}}
/>,
)
render(<CloudView userInfo={mockUserInfo} isAuthenticated={true} cloudApiUrl="https://app.roocode.com" />)
// Check that the task sync toggle is enabled for non-organization users
const taskSyncToggle = screen.getByTestId("task-sync-toggle")
@ -353,14 +290,7 @@ describe("CloudView", () => {
}
// Test with task sync enabled
render(
<CloudView
userInfo={mockUserInfo}
isAuthenticated={true}
cloudApiUrl="https://app.roocode.com"
onDone={() => {}}
/>,
)
render(<CloudView userInfo={mockUserInfo} isAuthenticated={true} cloudApiUrl="https://app.roocode.com" />)
// Check that the toggle shows the current state (enabled in this case)
const taskSyncToggle = screen.getByTestId("task-sync-toggle")

View file

@ -5,7 +5,7 @@ import { cva, type VariantProps } from "class-variance-authority"
import { cn } from "@/lib/utils"
const buttonVariants = cva(
"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-xl text-base font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 cursor-pointer active:opacity-80",
"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-full text-base font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 cursor-pointer active:opacity-80",
{
variants: {
variant: {

View file

@ -4,11 +4,13 @@
"logOut": "Tancar sessió",
"testApiAuthentication": "Provar autenticació d'API",
"signIn": "Connecta't a Roo Code Cloud",
"connect": "Connecta",
"cloudBenefitsTitle": "Connecta't a Roo Code Cloud",
"cloudBenefitWalkaway": "Segueix i controla tasques des de qualsevol lloc amb Roomote Control",
"cloudBenefitSharing": "Comparteix tasques amb altres",
"cloudBenefitHistory": "Accedeix al teu historial de tasques",
"connect": "Comença",
"cloudBenefitsTitle": "Prova Roo Code Cloud",
"cloudBenefitProvider": "Accedeix a models gratuïts i de pagament que funcionen molt bé amb Roo",
"cloudBenefitCloudAgents": "Dona tasques a agents autònoms al núvol",
"cloudBenefitTriggers": "Obtén revisions de codi a Github, inicia tasques des de Slack i més",
"cloudBenefitWalkaway": "Segueix i controla tasques des de qualsevol lloc (inclòs el telèfon)",
"cloudBenefitHistory": "Accedeix al teu historial de tasques des de qualsevol lloc i comparteix-les amb altres",
"cloudBenefitMetrics": "Obtén una visió holística del teu consum de tokens",
"visitCloudWebsite": "Visita Roo Code Cloud",
"taskSync": "Sincronització de tasques",

View file

@ -4,11 +4,13 @@
"logOut": "Abmelden",
"testApiAuthentication": "API-Authentifizierung testen",
"signIn": "Mit Roo Code Cloud verbinden",
"connect": "Jetzt verbinden",
"cloudBenefitsTitle": "Mit Roo Code Cloud verbinden",
"cloudBenefitWalkaway": "Verfolge und steuere Aufgaben von überall mit Roomote Control",
"cloudBenefitSharing": "Aufgaben mit anderen teilen",
"cloudBenefitHistory": "Auf deinen Aufgabenverlauf zugreifen",
"connect": "Loslegen",
"cloudBenefitsTitle": "Roo Code Cloud ausprobieren",
"cloudBenefitProvider": "Zugriff auf kostenlose und kostenpflichtige Modelle, die hervorragend mit Roo funktionieren",
"cloudBenefitCloudAgents": "Aufgaben an autonome Cloud-Agenten übergeben",
"cloudBenefitTriggers": "Code-Reviews auf Github erhalten, Aufgaben aus Slack starten und mehr",
"cloudBenefitWalkaway": "Aufgaben von überall verfolgen und steuern (auch vom Handy)",
"cloudBenefitHistory": "Von überall auf deinen Aufgabenverlauf zugreifen und ihn mit anderen teilen",
"cloudBenefitMetrics": "Erhalte einen ganzheitlichen Überblick über deinen Token-Verbrauch",
"visitCloudWebsite": "Roo Code Cloud besuchen",
"taskSync": "Aufgabensynchronisierung",

View file

@ -6,9 +6,11 @@
"signIn": "Connect to Roo Code Cloud",
"connect": "Get started",
"cloudBenefitsTitle": "Try Roo Code Cloud",
"cloudBenefitProvider": "Access free and paid models that work great with Roo",
"cloudBenefitCloudAgents": "Give tasks to autonomous Cloud agents",
"cloudBenefitTriggers": "Get code reviews on Github, start tasks from Slack and more",
"cloudBenefitWalkaway": "Follow and control tasks from anywhere (including your phone)",
"cloudBenefitSharing": "Share tasks with others",
"cloudBenefitHistory": "Access your task history from anywhere",
"cloudBenefitHistory": "Access your task history from anywhere and share them with others",
"cloudBenefitMetrics": "Get a holistic view of your token consumption",
"visitCloudWebsite": "Visit Roo Code Cloud",
"taskSync": "Task sync",

View file

@ -4,11 +4,13 @@
"logOut": "Cerrar sesión",
"testApiAuthentication": "Probar autenticación de API",
"signIn": "Conectar a Roo Code Cloud",
"connect": "Conectar ahora",
"cloudBenefitsTitle": "Conectar a Roo Code Cloud",
"cloudBenefitWalkaway": "Sigue y controla tareas desde cualquier lugar con Roomote Control",
"cloudBenefitSharing": "Comparte tareas con otros",
"cloudBenefitHistory": "Accede a tu historial de tareas",
"connect": "Empezar",
"cloudBenefitsTitle": "Prueba Roo Code Cloud",
"cloudBenefitProvider": "Accede a modelos gratuitos y de pago que funcionan genial con Roo",
"cloudBenefitCloudAgents": "Da tareas a agentes autónomos en la nube",
"cloudBenefitTriggers": "Obtén revisiones de código en Github, inicia tareas desde Slack y más",
"cloudBenefitWalkaway": "Sigue y controla tareas desde cualquier lugar (incluido tu teléfono)",
"cloudBenefitHistory": "Accede a tu historial de tareas desde cualquier lugar y compártelas con otros",
"cloudBenefitMetrics": "Obtén una visión holística de tu consumo de tokens",
"visitCloudWebsite": "Visitar Roo Code Cloud",
"taskSync": "Sincronización de tareas",

View file

@ -4,11 +4,13 @@
"logOut": "Déconnexion",
"testApiAuthentication": "Tester l'authentification API",
"signIn": "Se connecter à Roo Code Cloud",
"connect": "Se connecter maintenant",
"cloudBenefitsTitle": "Se connecter à Roo Code Cloud",
"cloudBenefitWalkaway": "Suivez et contrôlez les tâches depuis n'importe où avec Roomote Control",
"cloudBenefitSharing": "Partagez des tâches avec d'autres",
"cloudBenefitHistory": "Accédez à votre historique de tâches",
"connect": "Commencer",
"cloudBenefitsTitle": "Essayez Roo Code Cloud",
"cloudBenefitProvider": "Accédez à des modèles gratuits et payants qui fonctionnent parfaitement avec Roo",
"cloudBenefitCloudAgents": "Donnez des tâches à des agents Cloud autonomes",
"cloudBenefitTriggers": "Obtenez des revues de code sur Github, lancez des tâches depuis Slack et plus encore",
"cloudBenefitWalkaway": "Suivez et contrôlez les tâches de n'importe où (y compris votre téléphone)",
"cloudBenefitHistory": "Accédez à votre historique de tâches de n'importe où et partagez-les avec d'autres",
"cloudBenefitMetrics": "Obtenez une vue holistique de votre consommation de tokens",
"visitCloudWebsite": "Visiter Roo Code Cloud",
"taskSync": "Synchronisation des tâches",

View file

@ -4,11 +4,13 @@
"logOut": "लॉग आउट",
"testApiAuthentication": "API प्रमाणीकरण का परीक्षण करें",
"signIn": "Roo Code Cloud से कनेक्ट करें",
"connect": "अभी कनेक्ट करें",
"cloudBenefitsTitle": "Roo Code Cloud से कनेक्ट करें",
"cloudBenefitWalkaway": "Roomote Control के साथ कहीं से भी कार्यों को फॉलो और नियंत्रित करें",
"cloudBenefitSharing": "दूसरों के साथ कार्य साझा करें",
"cloudBenefitHistory": "अपने कार्य इतिहास तक पहुंचें",
"connect": "शुरू करें",
"cloudBenefitsTitle": "Roo Code Cloud आज़माएं",
"cloudBenefitProvider": "मुफ़्त और सशुल्क मॉडल एक्सेस करें जो Roo के साथ बढ़िया काम करते हैं",
"cloudBenefitCloudAgents": "स्वायत्त क्लाउड एजेंटों को कार्य दें",
"cloudBenefitTriggers": "Github पर कोड समीक्षाएं प्राप्त करें, Slack से कार्य शुरू करें और बहुत कुछ",
"cloudBenefitWalkaway": "कहीं से भी कार्यों का पालन और नियंत्रण करें (अपने फोन सहित)",
"cloudBenefitHistory": "कहीं से भी अपने कार्य इतिहास तक पहुंचें और उन्हें दूसरों के साथ साझा करें",
"cloudBenefitMetrics": "अपने टोकन उपभोग का समग्र दृश्य प्राप्त करें",
"visitCloudWebsite": "Roo Code Cloud पर जाएं",
"taskSync": "कार्य सिंक",

View file

@ -4,11 +4,13 @@
"logOut": "Keluar",
"testApiAuthentication": "Uji Autentikasi API",
"signIn": "Hubungkan ke Roo Code Cloud",
"connect": "Hubungkan Sekarang",
"cloudBenefitsTitle": "Hubungkan ke Roo Code Cloud",
"cloudBenefitWalkaway": "Ikuti dan kontrol tugas dari mana saja dengan Roomote Control",
"cloudBenefitSharing": "Bagikan tugas dengan orang lain",
"cloudBenefitHistory": "Akses riwayat tugas Anda",
"connect": "Mulai",
"cloudBenefitsTitle": "Coba Roo Code Cloud",
"cloudBenefitProvider": "Akses model gratis dan berbayar yang bekerja sangat baik dengan Roo",
"cloudBenefitCloudAgents": "Berikan tugas kepada agen Cloud otonom",
"cloudBenefitTriggers": "Dapatkan ulasan kode di Github, mulai tugas dari Slack, dan lainnya",
"cloudBenefitWalkaway": "Ikuti dan kontrol tugas dari mana saja (termasuk ponsel Anda)",
"cloudBenefitHistory": "Akses riwayat tugas Anda dari mana saja dan bagikan dengan orang lain",
"cloudBenefitMetrics": "Dapatkan tampilan holistik konsumsi token Anda",
"visitCloudWebsite": "Kunjungi Roo Code Cloud",
"taskSync": "Sinkronisasi tugas",

View file

@ -4,11 +4,13 @@
"logOut": "Disconnetti",
"testApiAuthentication": "Verifica autenticazione API",
"signIn": "Connetti a Roo Code Cloud",
"connect": "Connetti ora",
"cloudBenefitsTitle": "Connetti a Roo Code Cloud",
"cloudBenefitWalkaway": "Segui e controlla le attività da qualsiasi luogo con Roomote Control",
"cloudBenefitSharing": "Condividi attività con altri",
"cloudBenefitHistory": "Accedi alla cronologia delle tue attività",
"connect": "Inizia",
"cloudBenefitsTitle": "Prova Roo Code Cloud",
"cloudBenefitProvider": "Accedi a modelli gratuiti e a pagamento che funzionano perfettamente con Roo",
"cloudBenefitCloudAgents": "Assegna attività ad agenti Cloud autonomi",
"cloudBenefitTriggers": "Ottieni revisioni del codice su Github, avvia attività da Slack e altro",
"cloudBenefitWalkaway": "Segui e controlla le attività da qualsiasi luogo (incluso il tuo telefono)",
"cloudBenefitHistory": "Accedi alla cronologia delle tue attività da qualsiasi luogo e condividile con altri",
"cloudBenefitMetrics": "Ottieni una visione olistica del tuo consumo di token",
"visitCloudWebsite": "Visita Roo Code Cloud",
"taskSync": "Sincronizzazione attività",

View file

@ -4,11 +4,13 @@
"logOut": "ログアウト",
"testApiAuthentication": "API認証をテスト",
"signIn": "Roo Code Cloud に接続",
"connect": "今すぐ接続",
"cloudBenefitsTitle": "Roo Code Cloudに接続",
"cloudBenefitWalkaway": "Roomote Controlでどこからでもタスクをフォローし制御",
"cloudBenefitSharing": "他の人とタスクを共有",
"cloudBenefitHistory": "タスク履歴にアクセス",
"connect": "始める",
"cloudBenefitsTitle": "Roo Code Cloudを試す",
"cloudBenefitProvider": "Rooと相性の良い無料および有料モデルにアクセス",
"cloudBenefitCloudAgents": "自律型クラウドエージェントにタスクを依頼",
"cloudBenefitTriggers": "Githubでコードレビューを取得、Slackからタスクを開始など",
"cloudBenefitWalkaway": "どこからでも(スマートフォンを含む)タスクを追跡および制御",
"cloudBenefitHistory": "どこからでもタスク履歴にアクセスし、他の人と共有",
"cloudBenefitMetrics": "トークン消費の全体像を把握",
"visitCloudWebsite": "Roo Code Cloudを訪問",
"taskSync": "タスク同期",

View file

@ -4,11 +4,13 @@
"logOut": "로그아웃",
"testApiAuthentication": "API 인증 테스트",
"signIn": "Roo Code Cloud에 연결",
"connect": "지금 연결",
"cloudBenefitsTitle": "Roo Code Cloud에 연결",
"cloudBenefitWalkaway": "Roomote Control로 어디서나 작업을 팔로우하고 제어하세요",
"cloudBenefitSharing": "다른 사람과 작업 공유",
"cloudBenefitHistory": "작업 기록에 액세스",
"connect": "시작하기",
"cloudBenefitsTitle": "Roo Code Cloud 체험하기",
"cloudBenefitProvider": "Roo와 잘 작동하는 무료 및 유료 모델에 액세스하세요",
"cloudBenefitCloudAgents": "자율 클라우드 에이전트에게 작업 부여",
"cloudBenefitTriggers": "GitHub에서 코드 리뷰 받기, Slack에서 작업 시작 등",
"cloudBenefitWalkaway": "어디서나(휴대전화 포함) 작업을 팔로우하고 제어하세요",
"cloudBenefitHistory": "어디서나 작업 기록에 액세스하고 다른 사람과 공유하세요",
"cloudBenefitMetrics": "토큰 소비에 대한 전체적인 보기 얻기",
"visitCloudWebsite": "Roo Code Cloud 방문",
"taskSync": "작업 동기화",

View file

@ -4,11 +4,13 @@
"logOut": "Uitloggen",
"testApiAuthentication": "API-authenticatie testen",
"signIn": "Verbind met Roo Code Cloud",
"connect": "Nu verbinden",
"cloudBenefitsTitle": "Verbind met Roo Code Cloud",
"cloudBenefitWalkaway": "Volg en beheer taken van overal met Roomote Control",
"cloudBenefitSharing": "Deel taken met anderen",
"cloudBenefitHistory": "Toegang tot je taakgeschiedenis",
"connect": "Aan de slag",
"cloudBenefitsTitle": "Probeer Roo Code Cloud",
"cloudBenefitProvider": "Toegang tot gratis en betaalde modellen die geweldig werken met Roo",
"cloudBenefitCloudAgents": "Geef taken aan autonome Cloud-agents",
"cloudBenefitTriggers": "Krijg code reviews op Github, start taken vanuit Slack en meer",
"cloudBenefitWalkaway": "Volg en beheer taken van overal (inclusief je telefoon)",
"cloudBenefitHistory": "Toegang tot je taakgeschiedenis van overal en deel ze met anderen",
"cloudBenefitMetrics": "Krijg een holistisch overzicht van je tokenverbruik",
"visitCloudWebsite": "Bezoek Roo Code Cloud",
"taskSync": "Taaksynchronisatie",

View file

@ -4,11 +4,13 @@
"logOut": "Wyloguj",
"testApiAuthentication": "Testuj uwierzytelnianie API",
"signIn": "Połącz z Roo Code Cloud",
"connect": "Połącz teraz",
"cloudBenefitsTitle": "Połącz z Roo Code Cloud",
"cloudBenefitWalkaway": "Śledź i kontroluj zadania z dowolnego miejsca za pomocą Roomote Control",
"cloudBenefitSharing": "Udostępniaj zadania innym",
"cloudBenefitHistory": "Uzyskaj dostęp do historii zadań",
"connect": "Zacznij",
"cloudBenefitsTitle": "Wypróbuj Roo Code Cloud",
"cloudBenefitProvider": "Uzyskaj dostęp do darmowych i płatnych modeli, które świetnie współpracują z Roo",
"cloudBenefitCloudAgents": "Zlecaj zadania autonomicznym agentom w chmurze",
"cloudBenefitTriggers": "Otrzymuj recenzje kodu na Githubie, uruchamiaj zadania ze Slacka i nie tylko",
"cloudBenefitWalkaway": "Śledź i kontroluj zadania z dowolnego miejsca (również z telefonu)",
"cloudBenefitHistory": "Uzyskaj dostęp do historii zadań z dowolnego miejsca i udostępniaj je innym",
"cloudBenefitMetrics": "Uzyskaj całościowy widok zużycia tokenów",
"visitCloudWebsite": "Odwiedź Roo Code Cloud",
"taskSync": "Synchronizacja zadań",

View file

@ -4,11 +4,13 @@
"logOut": "Sair",
"testApiAuthentication": "Testar Autenticação de API",
"signIn": "Conectar ao Roo Code Cloud",
"connect": "Conectar Agora",
"cloudBenefitsTitle": "Conectar ao Roo Code Cloud",
"cloudBenefitWalkaway": "Acompanhe e controle tarefas de qualquer lugar com Roomote Control",
"cloudBenefitSharing": "Compartilhe tarefas com outros",
"cloudBenefitHistory": "Acesse seu histórico de tarefas",
"connect": "Começar",
"cloudBenefitsTitle": "Experimente o Roo Code Cloud",
"cloudBenefitProvider": "Acesse modelos gratuitos e pagos que funcionam muito bem com o Roo",
"cloudBenefitCloudAgents": "Dê tarefas a agentes autônomos na nuvem",
"cloudBenefitTriggers": "Obtenha revisões de código no Github, inicie tarefas do Slack e muito mais",
"cloudBenefitWalkaway": "Acompanhe e controle tarefas de qualquer lugar (incluindo seu telefone)",
"cloudBenefitHistory": "Acesse seu histórico de tarefas de qualquer lugar e compartilhe com outros",
"cloudBenefitMetrics": "Obtenha uma visão holística do seu consumo de tokens",
"visitCloudWebsite": "Visitar Roo Code Cloud",
"taskSync": "Sincronização de tarefas",

View file

@ -4,11 +4,13 @@
"logOut": "Выход",
"testApiAuthentication": "Проверить аутентификацию API",
"signIn": "Подключиться к Roo Code Cloud",
"connect": "Подключиться сейчас",
"cloudBenefitsTitle": "Подключиться к Roo Code Cloud",
"cloudBenefitWalkaway": "Отслеживайте и управляйте задачами откуда угодно с Roomote Control",
"cloudBenefitSharing": "Делитесь задачами с другими",
"cloudBenefitHistory": "Получите доступ к истории задач",
"connect": "Начать",
"cloudBenefitsTitle": "Попробуйте Roo Code Cloud",
"cloudBenefitProvider": "Доступ к бесплатным и платным моделям, которые отлично работают с Roo",
"cloudBenefitCloudAgents": "Поручайте задачи автономным облачным агентам",
"cloudBenefitTriggers": "Получайте код-ревью на Github, запускайте задачи из Slack и многое другое",
"cloudBenefitWalkaway": "Отслеживайте и управляйте задачами откуда угодно (включая телефон)",
"cloudBenefitHistory": "Доступ к истории задач откуда угодно и возможность делиться ими с другими",
"cloudBenefitMetrics": "Получите целостное представление о потреблении токенов",
"visitCloudWebsite": "Посетить Roo Code Cloud",
"taskSync": "Синхронизация задач",

View file

@ -4,11 +4,13 @@
"logOut": ıkış yap",
"testApiAuthentication": "API Kimlik Doğrulamayı Test Et",
"signIn": "Roo Code Cloud'a bağlan",
"connect": "Şimdi Bağlan",
"cloudBenefitsTitle": "Roo Code Cloud'a bağlan",
"cloudBenefitWalkaway": "Roomote Control ile görevleri her yerden takip et ve kontrol et",
"cloudBenefitSharing": "Görevleri başkalarıyla paylaş",
"cloudBenefitHistory": "Görev geçmişine eriş",
"connect": "Başlayın",
"cloudBenefitsTitle": "Roo Code Cloud'u Deneyin",
"cloudBenefitProvider": "Roo ile harika çalışan ücretsiz ve ücretli modellere erişin",
"cloudBenefitCloudAgents": "Otonom Bulut ajanlarına görevler verin",
"cloudBenefitTriggers": "Github'da kod incelemeleri alın, Slack'ten görevler başlatın ve daha fazlasını yapın",
"cloudBenefitWalkaway": "Görevleri her yerden (telefonunuz dahil) takip edin ve kontrol edin",
"cloudBenefitHistory": "Görev geçmişinize her yerden erişin ve başkalarıyla paylaşın",
"cloudBenefitMetrics": "Token tüketiminizin bütünsel görünümünü elde edin",
"visitCloudWebsite": "Roo Code Cloud'u ziyaret et",
"taskSync": "Görev senkronizasyonu",

View file

@ -4,11 +4,13 @@
"logOut": "Đăng xuất",
"testApiAuthentication": "Kiểm tra xác thực API",
"signIn": "Kết nối với Roo Code Cloud",
"connect": "Kết nối ngay",
"cloudBenefitsTitle": "Kết nối với Roo Code Cloud",
"cloudBenefitWalkaway": "Theo dõi và điều khiển tác vụ từ bất kỳ đâu với Roomote Control",
"cloudBenefitSharing": "Chia sẻ tác vụ với người khác",
"cloudBenefitHistory": "Truy cập lịch sử tác vụ của bạn",
"connect": "Bắt đầu",
"cloudBenefitsTitle": "Dùng thử Roo Code Cloud",
"cloudBenefitProvider": "Truy cập các mô hình miễn phí và trả phí hoạt động tuyệt vời với Roo",
"cloudBenefitCloudAgents": "Giao nhiệm vụ cho các agent đám mây tự trị",
"cloudBenefitTriggers": "Nhận đánh giá mã trên Github, bắt đầu tác vụ từ Slack và hơn thế nữa",
"cloudBenefitWalkaway": "Theo dõi và kiểm soát các tác vụ từ mọi nơi (bao gồm cả điện thoại của bạn)",
"cloudBenefitHistory": "Truy cập lịch sử tác vụ của bạn từ mọi nơi và chia sẻ chúng với người khác",
"cloudBenefitMetrics": "Có cái nhìn toàn diện về mức tiêu thụ token của bạn",
"visitCloudWebsite": "Truy cập Roo Code Cloud",
"taskSync": "Đồng bộ tác vụ",

View file

@ -4,11 +4,13 @@
"logOut": "退出登录",
"testApiAuthentication": "测试 API 认证",
"signIn": "连接到 Roo Code Cloud",
"connect": "立即连接",
"cloudBenefitsTitle": "连接到 Roo Code Cloud",
"cloudBenefitWalkaway": "使用 Roomote Control 随时随地跟踪和控制任务",
"cloudBenefitSharing": "与他人共享任务",
"cloudBenefitHistory": "访问您的任务历史",
"connect": "开始使用",
"cloudBenefitsTitle": "试用 Roo Code Cloud",
"cloudBenefitProvider": "访问与 Roo 完美配合的免费和付费模型",
"cloudBenefitCloudAgents": "将任务分配给自主云代理",
"cloudBenefitTriggers": "在 GitHub 上获取代码审查,从 Slack 启动任务等等",
"cloudBenefitWalkaway": "随时随地(包括您的手机)跟踪和控制任务",
"cloudBenefitHistory": "随时随地访问您的任务历史记录并与他人共享",
"cloudBenefitMetrics": "获取您的令牌消耗的整体视图",
"visitCloudWebsite": "访问 Roo Code Cloud",
"taskSync": "任务同步",

View file

@ -4,11 +4,13 @@
"logOut": "登出",
"testApiAuthentication": "測試 API 認證",
"signIn": "連線至 Roo Code Cloud",
"connect": "立即連線",
"cloudBenefitsTitle": "連線至 Roo Code Cloud",
"cloudBenefitWalkaway": "使用 Roomote Control 隨時隨地追蹤和控制任務",
"cloudBenefitSharing": "與他人分享任務",
"cloudBenefitHistory": "存取您的任務歷史",
"connect": "開始使用",
"cloudBenefitsTitle": "試用 Roo Code Cloud",
"cloudBenefitProvider": "存取與 Roo 完美配合的免費和付費模型",
"cloudBenefitCloudAgents": "將任務分配給自主雲端代理",
"cloudBenefitTriggers": "在 Github 上獲取程式碼審查,從 Slack 啟動任務等等",
"cloudBenefitWalkaway": "隨時隨地(包括您的手機)追蹤和控制任務",
"cloudBenefitHistory": "隨時隨地存取您的任務歷史記錄並與他人分享",
"cloudBenefitMetrics": "獲得您的代幣消耗的整體視圖",
"visitCloudWebsite": "造訪 Roo Code Cloud",
"taskSync": "任務同步",