From 627e640c69e150bb935f3e3b902254f75467b02e Mon Sep 17 00:00:00 2001 From: LukeParkerDev <10430890+Hona@users.noreply.github.com> Date: Thu, 6 Aug 2026 13:16:34 +1000 Subject: [PATCH] fix(app): resolve parity plurals, stream lifecycle, and menu state bugs --- .../components/prompt-input/submit.test.ts | 2 + .../src/components/session-workspace-menu.tsx | 94 ++++++++++--------- .../settings-v2/dialog-settings-v2.tsx | 4 +- packages/app/src/context/server-sdk.tsx | 47 ---------- packages/app/src/i18n/ar.ts | 28 +++++- packages/app/src/i18n/az.ts | 46 +++++++++ packages/app/src/i18n/br.ts | 18 ++++ packages/app/src/i18n/bs.ts | 17 ++++ packages/app/src/i18n/da.ts | 15 +++ packages/app/src/i18n/de.ts | 17 +++- packages/app/src/i18n/es.ts | 17 ++++ packages/app/src/i18n/fi.ts | 46 +++++++++ packages/app/src/i18n/fr.ts | 17 ++++ packages/app/src/i18n/hi.ts | 46 +++++++++ packages/app/src/i18n/id.ts | 46 +++++++++ packages/app/src/i18n/it.ts | 51 ++++++++++ packages/app/src/i18n/ja.ts | 15 +++ packages/app/src/i18n/ko.ts | 15 +++ packages/app/src/i18n/nl.ts | 46 +++++++++ packages/app/src/i18n/no.ts | 17 +++- packages/app/src/i18n/pa.ts | 46 +++++++++ packages/app/src/i18n/pl.ts | 19 ++++ packages/app/src/i18n/ru.ts | 19 ++++ packages/app/src/i18n/sv.ts | 46 +++++++++ packages/app/src/i18n/th.ts | 15 +++ packages/app/src/i18n/tr.ts | 17 +++- packages/app/src/i18n/uk.ts | 19 ++++ packages/app/src/i18n/ur.ts | 46 +++++++++ packages/app/src/i18n/vi.ts | 46 +++++++++ packages/app/src/i18n/zh.ts | 17 +++- packages/app/src/i18n/zht.ts | 17 +++- .../pages/new-session/new-session-view.tsx | 11 +-- .../session/timeline/message-timeline.tsx | 4 +- packages/app/src/utils/workspace.test.ts | 13 +++ packages/app/src/utils/workspace.ts | 10 +- 35 files changed, 837 insertions(+), 112 deletions(-) diff --git a/packages/app/src/components/prompt-input/submit.test.ts b/packages/app/src/components/prompt-input/submit.test.ts index ef352ed8ec0..3a058a443be 100644 --- a/packages/app/src/components/prompt-input/submit.test.ts +++ b/packages/app/src/components/prompt-input/submit.test.ts @@ -170,6 +170,7 @@ beforeAll(async () => { mock.module("@opencode-ai/ui/toast", () => ({ Toast: { Region: () => null }, + toaster: { create: () => undefined, show: () => undefined, dismiss: () => undefined }, showToast: () => 0, })) @@ -794,6 +795,7 @@ describe("prompt submit worktree selection", () => { }) await submit.handleSubmit({ preventDefault: () => undefined } as unknown as Event) + await settle() expect(sentCommands).toEqual([ { diff --git a/packages/app/src/components/session-workspace-menu.tsx b/packages/app/src/components/session-workspace-menu.tsx index ce3e0d49153..1ac2ad20cb1 100644 --- a/packages/app/src/components/session-workspace-menu.tsx +++ b/packages/app/src/components/session-workspace-menu.tsx @@ -61,53 +61,57 @@ export function SessionWorkspaceMenu(props: { const source = props.directory setStore("selected", selection) - const destination = - selection === "create" - ? await createWorkspace(root, sessionID, messageID, sdk, (message) => fail(scope, sessionID, message), { - createFailed: language.t("prompt.toast.worktreeCreateFailed.title"), - stillPreparing: language.t("workspace.error.stillPreparing"), - }) - : selection - if (!destination) return + try { + const destination = + selection === "create" + ? await createWorkspace(root, sessionID, messageID, sdk, (message) => fail(scope, sessionID, message), { + createFailed: language.t("prompt.toast.worktreeCreateFailed.title"), + stillPreparing: language.t("workspace.error.stillPreparing"), + }) + : selection + if (!destination) return - WorkspaceOperation.start(scope, sessionID, selection === "create" ? "create" : "move", destination, messageID) - if (sync.session.data.session_working(sessionID)) { - fail(scope, sessionID, language.t("workspace.move.failed")) - return - } - await workspaceRequestWithTimeout( - (signal) => - sdk.client.experimental.controlPlane.moveSession( - { - sessionID, - destination: { directory: destination }, - moveChanges: true, - }, - { signal }, - ), - language.t("workspace.move.failed"), - WORKSPACE_PREPARATION_TIMEOUT_MS, - ) - .then(async () => { - for (const attempt of Array.from({ length: 20 }, (_, index) => index)) { - const session = await workspaceRequestWithTimeout( - (signal) => sync.session.resolve(sessionID, { force: true, signal }), - language.t("workspace.move.failed"), - WORKSPACE_PLACEMENT_REFRESH_TIMEOUT_MS, - ).catch(() => undefined) - if (session && pathKey(session.directory) === pathKey(destination)) { - WorkspaceOperation.complete(scope, sessionID, destination) - sync.reindexSession(sessionID, source) - return - } - if (WorkspaceOperation.get(scope, sessionID)?.status === "complete") return - await new Promise((resolve) => setTimeout(resolve, Math.min(250 + attempt * 50, 1_000))) - } + WorkspaceOperation.start(scope, sessionID, selection === "create" ? "create" : "move", destination, messageID) + if (sync.session.data.session_working(sessionID)) { fail(scope, sessionID, language.t("workspace.move.failed")) - }) - .catch((error) => - fail(scope, sessionID, error instanceof Error ? error.message : language.t("common.requestFailed")), + return + } + await workspaceRequestWithTimeout( + (signal) => + sdk.client.experimental.controlPlane.moveSession( + { + sessionID, + destination: { directory: destination }, + moveChanges: true, + }, + { signal }, + ), + language.t("workspace.move.failed"), + WORKSPACE_PREPARATION_TIMEOUT_MS, ) + .then(async () => { + for (const attempt of Array.from({ length: 20 }, (_, index) => index)) { + const session = await workspaceRequestWithTimeout( + (signal) => sync.session.resolve(sessionID, { force: true, signal }), + language.t("workspace.move.failed"), + WORKSPACE_PLACEMENT_REFRESH_TIMEOUT_MS, + ).catch(() => undefined) + if (session && pathKey(session.directory) === pathKey(destination)) { + WorkspaceOperation.complete(scope, sessionID, destination) + sync.reindexSession(sessionID, source) + return + } + if (WorkspaceOperation.get(scope, sessionID)?.status === "complete") return + await new Promise((resolve) => setTimeout(resolve, Math.min(250 + attempt * 50, 1_000))) + } + fail(scope, sessionID, language.t("workspace.move.failed")) + }) + .catch((error) => + fail(scope, sessionID, error instanceof Error ? error.message : language.t("common.requestFailed")), + ) + } finally { + setStore("selected", undefined) + } } return ( @@ -141,7 +145,7 @@ export function SessionWorkspaceMenu(props: { {language.t("session.new.workspace.existing").replace(/(…|\.{3})$/, "")} - + {(workspace) => ( void move(workspace)}> diff --git a/packages/app/src/components/settings-v2/dialog-settings-v2.tsx b/packages/app/src/components/settings-v2/dialog-settings-v2.tsx index d3bc5237775..1e0443d26e6 100644 --- a/packages/app/src/components/settings-v2/dialog-settings-v2.tsx +++ b/packages/app/src/components/settings-v2/dialog-settings-v2.tsx @@ -1,7 +1,7 @@ import { Component, createMemo, createSignal, startTransition } from "solid-js" import { Dialog } from "@opencode-ai/ui/v2/dialog-v2" import { TabsV2 } from "@opencode-ai/ui/v2/tabs-v2" -import { Icon } from "@opencode-ai/ui/icon" +import { Icon } from "@opencode-ai/ui/v2/icon" import { useLanguage } from "@/context/language" import { usePlatform } from "@/context/platform" import { SettingsGeneralV2 } from "./general" @@ -70,7 +70,7 @@ export const DialogSettings: Component<{ {language.t("settings.section.server")}
- + {language.t("settings.tab.workspaces")} diff --git a/packages/app/src/context/server-sdk.tsx b/packages/app/src/context/server-sdk.tsx index d6f2f260d3c..1a52a394214 100644 --- a/packages/app/src/context/server-sdk.tsx +++ b/packages/app/src/context/server-sdk.tsx @@ -291,57 +291,12 @@ function createServerSdkContextBase(server: ServerConnection.Any, scope: ServerS } let streamErrorLogged = false - let worktreeStreamErrorLogged = false const wait = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms)) let attempt: AbortController | undefined - let worktreeAttempt: AbortController | undefined let run: Promise | undefined let started = false let generation = 0 - const consumeWorktreeEvents = async (active: number) => { - // Current worktree lifecycle events are still emitted only on the global compatibility stream. - while (!abort.signal.aborted && started && generation === active) { - const controller = new AbortController() - worktreeAttempt = controller - const onAbort = () => controller.abort() - abort.signal.addEventListener("abort", onAbort) - try { - const events = (await eventSdk.global.event({ signal: controller.signal })).stream - let yielded = Date.now() - for await (const event of events) { - const queued = adaptWorktreeCompatibilityEvent({ - directory: event.directory, - payload: event.payload as Event, - }) - if (queued) { - worktreeStreamErrorLogged = false - if (enqueueServerEvent(queue, queued)) schedule() - } - - if (Date.now() - yielded < STREAM_YIELD_MS) continue - yielded = Date.now() - await wait(0) - } - } catch (error) { - if (!isStreamClosed(error, controller.signal) && !worktreeStreamErrorLogged) { - worktreeStreamErrorLogged = true - console.error("[global-sdk] worktree event stream failed", { - url: server.http.url, - fetch: eventFetch ? "platform" : "webview", - error, - }) - } - } finally { - abort.signal.removeEventListener("abort", onAbort) - if (worktreeAttempt === controller) worktreeAttempt = undefined - } - - if (abort.signal.aborted || !started || generation !== active) return - await wait(RECONNECT_DELAY_MS) - } - } - const start = () => { if (started) return run started = true @@ -350,7 +305,6 @@ function createServerSdkContextBase(server: ServerConnection.Any, scope: ServerS const current = (async () => { if (previous) await previous const kind = await protocol - if (kind === "v2") void consumeWorktreeEvents(active) // oxlint-disable-next-line no-unmodified-loop-condition -- `started` is set to false by stop() which also aborts; both flags are checked to allow graceful exit while (!abort.signal.aborted && started && generation === active) { attempt = new AbortController() @@ -406,7 +360,6 @@ function createServerSdkContextBase(server: ServerConnection.Any, scope: ServerS started = false generation++ attempt?.abort() - worktreeAttempt?.abort() } onMount(() => { diff --git a/packages/app/src/i18n/ar.ts b/packages/app/src/i18n/ar.ts index b7daf06cedd..30a767c8390 100644 --- a/packages/app/src/i18n/ar.ts +++ b/packages/app/src/i18n/ar.ts @@ -1042,10 +1042,18 @@ export const dict = { "settings.tab.workspaces": "مساحات العمل", "settings.workspaces.filter.all": "جميع المشاريع", "settings.workspaces.empty": "لا توجد مساحات عمل", + "settings.workspaces.count.zero": "لا توجد مساحات عمل ({{count}})", "settings.workspaces.count.one": "{{count}} مساحة عمل", - "settings.workspaces.count.other": "{{count}} مساحات عمل", + "settings.workspaces.count.two": "مساحتا عمل ({{count}})", + "settings.workspaces.count.few": "{{count}} مساحات عمل", + "settings.workspaces.count.many": "{{count}} مساحة عمل", + "settings.workspaces.count.other": "{{count}} مساحة عمل", + "settings.workspaces.sessions.zero": "لا توجد جلسات ({{count}}) في {{project}}", "settings.workspaces.sessions.one": "{{count}} جلسة في {{project}}", - "settings.workspaces.sessions.other": "{{count}} جلسات في {{project}}", + "settings.workspaces.sessions.two": "جلستان ({{count}}) في {{project}}", + "settings.workspaces.sessions.few": "{{count}} جلسات في {{project}}", + "settings.workspaces.sessions.many": "{{count}} جلسة في {{project}}", + "settings.workspaces.sessions.other": "{{count}} جلسة في {{project}}", "settings.workspaces.lastActiveSession": "آخر جلسة نشطة", "settings.workspaces.deleteAll": "حذف جميع مساحات العمل", "settings.workspaces.deleteAll.confirm": "حذف جميع مساحات العمل البالغ عددها {{count}}؟", @@ -1061,11 +1069,18 @@ export const dict = { "settings.workspaces.default.local": "دليل محلي", "settings.workspaces.default.new": "مساحة عمل جديدة", "workspace.move.title": "نقل إلى مساحة العمل", + "workspace.move.menu.title": "نقل الجلسة إلى", "workspace.move.failed": "تعذّر نقل الجلسة", "workspace.lifecycle.creating": "جارٍ إنشاء مساحة العمل", "workspace.lifecycle.created": "تم إنشاء مساحة العمل", + "workspace.lifecycle.starting": "جارٍ بدء الجلسة", + "workspace.onboarding.title": "عزل الجلسات باستخدام مساحات العمل", + "workspace.onboarding.description": "تحصل كل جلسة على نسختها الخاصة، حتى لا يتداخل أي شيء مع مستودعك المحلي", "workspace.lifecycle.moving": "جارٍ النقل إلى مساحة العمل", "workspace.lifecycle.set": "تم تعيين مساحة العمل", + "session.summary.title": "تفاصيل الجلسة", + "session.summary.noBranch": "لا يوجد فرع", + "session.summary.basedOn": "بناءً على {{branch}}", "workspace.type.local": "محلي", "workspace.type.sandbox": "بيئة معزولة", "workspace.create.failed.title": "فشل إنشاء مساحة العمل", @@ -1188,4 +1203,13 @@ export const dict = { "error.childStore.persistedProjectIconCreateFailed": "فشل إنشاء أيقونة المشروع الدائمة", "error.childStore.storeCreateFailed": "فشل إنشاء المخزن", "terminal.connectionLost.abnormalClose": "تم إغلاق WebSocket بشكل غير طبيعي: {{code}}", + + "command.session.export": "تصدير الجلسة", + "command.session.export.description": "تصدير بيانات الجلسة", + "context.export.session": "تصدير الجلسة", + "toast.session.export.success.title": "تم تصدير الجلسة", + "toast.session.export.success.description": "تم حفظ {{filename}} بنجاح", + "toast.session.export.failed.title": "فشل تصدير الجلسة", + "toast.session.export.failed.description": "حدث خطأ أثناء تصدير الجلسة", + "common.export": "تصدير", } diff --git a/packages/app/src/i18n/az.ts b/packages/app/src/i18n/az.ts index df3506c3d55..11f79695a85 100644 --- a/packages/app/src/i18n/az.ts +++ b/packages/app/src/i18n/az.ts @@ -1152,4 +1152,50 @@ export const dict = { "workspace.reset.archived.one": "1 sessiya arxivlənəcək.", "workspace.reset.archived.many": "{{count}} sessiya arxivlənəcək.", "workspace.reset.note": "Bu iş sahəsini standart branch ilə uyğunlaşdırmaq üçün sıfırlayacaq.", + "command.session.export": "Export session", + "command.session.export.description": "Export the full session transcript as JSON", + "context.export.session": "Export session", + "toast.session.export.success.title": "Session exported", + "toast.session.export.success.description": "Saved session to {{filename}}", + "toast.session.export.failed.title": "Failed to export session", + "toast.session.export.failed.description": "An error occurred while exporting the session", + "common.export": "Export", + "common.viewAll": "View all", + "session.new.workspace.local.tooltip": "Use current checkout", + "session.new.workspace.new.tooltip": "Create isolated checkout", + "session.new.workspace.fromBranch": "from {{branch}}", + "session.new.workspace.trigger.tooltip": "Select where to run session", + "session.new.workspace.search.placeholder": "Search workspaces", + "settings.tab.workspaces": "Workspaces", + "settings.workspaces.filter.all": "All projects", + "settings.workspaces.empty": "No workspaces", + "settings.workspaces.count.one": "{{count}} workspace", + "settings.workspaces.count.other": "{{count}} workspaces", + "settings.workspaces.sessions.one": "{{count}} session in {{project}}", + "settings.workspaces.sessions.other": "{{count}} sessions in {{project}}", + "settings.workspaces.lastActiveSession": "Last active session", + "settings.workspaces.deleteAll": "Delete all workspaces", + "settings.workspaces.deleteAll.confirm": "Delete all {{count}} workspaces?", + "settings.workspaces.delete.warning": "The workspace directory and branch will be permanently removed. Deletion proceeds only if it is clean, inactive, and has no linked sessions.", + "settings.workspaces.deleteAll.warning": "The {{count}} selected workspaces in {{project}} will be permanently removed only if each is clean, inactive, and has no linked sessions.", + "settings.workspaces.delete.blocked.active": "The active workspace cannot be deleted.", + "settings.workspaces.delete.blocked.linked": "This workspace has linked sessions and cannot be deleted.", + "settings.workspaces.default.title": "Default environment", + "settings.workspaces.default.description": "Choose where new sessions start", + "settings.workspaces.default.lastUsed": "Last used per project", + "settings.workspaces.default.local": "Local directory", + "settings.workspaces.default.new": "New workspace", + "workspace.move.title": "Move to workspace", + "workspace.move.menu.title": "Move session to", + "workspace.move.failed": "Failed to move session", + "workspace.lifecycle.creating": "Creating workspace", + "workspace.lifecycle.created": "Workspace created", + "workspace.lifecycle.starting": "Starting session", + "workspace.onboarding.title": "Isolate sessions with workspaces", + "workspace.onboarding.description": "Each gets its own checkout, so nothing interferes with your local repository", + "workspace.lifecycle.moving": "Moving to workspace", + "workspace.lifecycle.set": "Workspace set", + "session.summary.title": "Session details", + "session.summary.noBranch": "No branch", + "session.summary.basedOn": "Based on {{branch}}", } diff --git a/packages/app/src/i18n/br.ts b/packages/app/src/i18n/br.ts index c39cbe5aa30..dea8badca4a 100644 --- a/packages/app/src/i18n/br.ts +++ b/packages/app/src/i18n/br.ts @@ -1051,8 +1051,10 @@ export const dict = { "settings.workspaces.filter.all": "Todos os projetos", "settings.workspaces.empty": "Nenhum espaço de trabalho", "settings.workspaces.count.one": "{{count}} espaço de trabalho", + "settings.workspaces.count.many": "{{count}} espaços de trabalho", "settings.workspaces.count.other": "{{count}} espaços de trabalho", "settings.workspaces.sessions.one": "{{count}} sessão em {{project}}", + "settings.workspaces.sessions.many": "{{count}} sessões em {{project}}", "settings.workspaces.sessions.other": "{{count}} sessões em {{project}}", "settings.workspaces.lastActiveSession": "Última sessão ativa", "settings.workspaces.deleteAll": "Excluir todos os espaços de trabalho", @@ -1070,11 +1072,18 @@ export const dict = { "settings.workspaces.default.local": "Diretório local", "settings.workspaces.default.new": "Novo espaço de trabalho", "workspace.move.title": "Mover para o espaço de trabalho", + "workspace.move.menu.title": "Mover sessão para", "workspace.move.failed": "Não foi possível mover a sessão", "workspace.lifecycle.creating": "Criando espaço de trabalho", "workspace.lifecycle.created": "Espaço de trabalho criado", + "workspace.lifecycle.starting": "Iniciando sessão", + "workspace.onboarding.title": "Isole sessões com espaços de trabalho", + "workspace.onboarding.description": "Cada um recebe seu próprio checkout, para não interferir com seu repositório local", "workspace.lifecycle.moving": "Movendo para o espaço de trabalho", "workspace.lifecycle.set": "Espaço de trabalho definido", + "session.summary.title": "Detalhes da sessão", + "session.summary.noBranch": "Nenhum branch", + "session.summary.basedOn": "Com base em {{branch}}", "workspace.type.local": "local", "workspace.type.sandbox": "sandbox", "workspace.create.failed.title": "Falha ao criar espaço de trabalho", @@ -1199,4 +1208,13 @@ export const dict = { "error.childStore.persistedProjectIconCreateFailed": "Falha ao criar ícone de projeto persistente", "error.childStore.storeCreateFailed": "Falha ao criar armazenamento", "terminal.connectionLost.abnormalClose": "WebSocket fechado anormalmente: {{code}}", + + "command.session.export": "Export session", + "command.session.export.description": "Export the full session transcript as JSON", + "context.export.session": "Export session", + "toast.session.export.success.title": "Session exported", + "toast.session.export.success.description": "Saved session to {{filename}}", + "toast.session.export.failed.title": "Failed to export session", + "toast.session.export.failed.description": "An error occurred while exporting the session", + "common.export": "Export", } diff --git a/packages/app/src/i18n/bs.ts b/packages/app/src/i18n/bs.ts index e7682a91e7b..0c45b7c9315 100644 --- a/packages/app/src/i18n/bs.ts +++ b/packages/app/src/i18n/bs.ts @@ -1127,8 +1127,10 @@ export const dict = { "settings.workspaces.filter.all": "Svi projekti", "settings.workspaces.empty": "Nema radnih prostora", "settings.workspaces.count.one": "{{count}} radni prostor", + "settings.workspaces.count.few": "{{count}} radna prostora", "settings.workspaces.count.other": "{{count}} radnih prostora", "settings.workspaces.sessions.one": "{{count}} sesija u projektu {{project}}", + "settings.workspaces.sessions.few": "{{count}} sesije u projektu {{project}}", "settings.workspaces.sessions.other": "{{count}} sesija u projektu {{project}}", "settings.workspaces.lastActiveSession": "Posljednja aktivna sesija", "settings.workspaces.deleteAll": "Izbriši sve radne prostore", @@ -1145,11 +1147,18 @@ export const dict = { "settings.workspaces.default.local": "Lokalni direktorij", "settings.workspaces.default.new": "Novi radni prostor", "workspace.move.title": "Premjesti u radni prostor", + "workspace.move.menu.title": "Premjesti sesiju u", "workspace.move.failed": "Premještanje sesije nije uspjelo", "workspace.lifecycle.creating": "Kreiranje radnog prostora", "workspace.lifecycle.created": "Radni prostor je kreiran", + "workspace.lifecycle.starting": "Pokretanje sesije", + "workspace.onboarding.title": "Izolujte sesije pomoću radnih prostora", + "workspace.onboarding.description": "Svaki dobija vlastiti checkout, tako da ništa ne ometa vaš lokalni repozitorij", "workspace.lifecycle.moving": "Premještanje u radni prostor", "workspace.lifecycle.set": "Radni prostor je postavljen", + "session.summary.title": "Detalji sesije", + "session.summary.noBranch": "Nema grane", + "session.summary.basedOn": "Na osnovu {{branch}}", "workspace.type.local": "lokalno", "workspace.type.sandbox": "sandbox", "workspace.create.failed.title": "Neuspješno kreiranje radnog prostora", @@ -1274,4 +1283,12 @@ export const dict = { "error.childStore.persistedProjectIconCreateFailed": "Nije uspjelo kreiranje trajne ikone projekta", "error.childStore.storeCreateFailed": "Nije uspjelo kreiranje skladišta", "terminal.connectionLost.abnormalClose": "WebSocket zatvoren nenormalno: {{code}}", + "command.session.export": "Export session", + "command.session.export.description": "Export the full session transcript as JSON", + "context.export.session": "Export session", + "toast.session.export.success.title": "Session exported", + "toast.session.export.success.description": "Saved session to {{filename}}", + "toast.session.export.failed.title": "Failed to export session", + "toast.session.export.failed.description": "An error occurred while exporting the session", + "common.export": "Export", } diff --git a/packages/app/src/i18n/da.ts b/packages/app/src/i18n/da.ts index bca2f56b3d3..28a8b690c6b 100644 --- a/packages/app/src/i18n/da.ts +++ b/packages/app/src/i18n/da.ts @@ -1265,4 +1265,19 @@ export const dict = { "help.tabs.persistence": "Dine faner er stadig åbne, når du åbner appen igen.", "help.tabs.worktrees": "Det nye design understøtter endnu ikke Git Worktrees, men understøttelsen kommer snart. Hvis du foretrækker at fortsætte med det tidligere layout, kan du skifte mellem layoutene under Indstillinger. Bemærk, at det nye layout bliver permanent om nogle få uger.", + "command.session.export": "Export session", + "command.session.export.description": "Export the full session transcript as JSON", + "context.export.session": "Export session", + "toast.session.export.success.title": "Session exported", + "toast.session.export.success.description": "Saved session to {{filename}}", + "toast.session.export.failed.title": "Failed to export session", + "toast.session.export.failed.description": "An error occurred while exporting the session", + "common.export": "Export", + "workspace.move.menu.title": "Move session to", + "workspace.lifecycle.starting": "Starting session", + "workspace.onboarding.title": "Isolate sessions with workspaces", + "workspace.onboarding.description": "Each gets its own checkout, so nothing interferes with your local repository", + "session.summary.title": "Session details", + "session.summary.noBranch": "No branch", + "session.summary.basedOn": "Based on {{branch}}", } diff --git a/packages/app/src/i18n/de.ts b/packages/app/src/i18n/de.ts index c77f7f6738e..c802abd1bcd 100644 --- a/packages/app/src/i18n/de.ts +++ b/packages/app/src/i18n/de.ts @@ -1203,4 +1203,19 @@ export const dict = { "help.tabs.persistence": "Wenn Sie die App erneut öffnen, sind Ihre Tabs weiterhin geöffnet.", "help.tabs.worktrees": "Das neue Design unterstützt Git-Worktrees noch nicht. Diese Funktion folgt in Kürze. Wenn Sie das bisherige Layout vorerst weiterverwenden möchten, können Sie in den Einstellungen zwischen den Layouts wechseln. Beachten Sie jedoch, dass das neue Layout in einigen Wochen dauerhaft verwendet wird.", -} satisfies Partial> + "command.session.export": "Export session", + "command.session.export.description": "Export the full session transcript as JSON", + "context.export.session": "Export session", + "toast.session.export.success.title": "Session exported", + "toast.session.export.success.description": "Saved session to {{filename}}", + "toast.session.export.failed.title": "Failed to export session", + "toast.session.export.failed.description": "An error occurred while exporting the session", + "common.export": "Export", + "workspace.move.menu.title": "Move session to", + "workspace.lifecycle.starting": "Starting session", + "workspace.onboarding.title": "Isolate sessions with workspaces", + "workspace.onboarding.description": "Each gets its own checkout, so nothing interferes with your local repository", + "session.summary.title": "Session details", + "session.summary.noBranch": "No branch", + "session.summary.basedOn": "Based on {{branch}}", +} diff --git a/packages/app/src/i18n/es.ts b/packages/app/src/i18n/es.ts index 4c97144741c..f7aa6095fe0 100644 --- a/packages/app/src/i18n/es.ts +++ b/packages/app/src/i18n/es.ts @@ -1135,8 +1135,10 @@ export const dict = { "settings.workspaces.filter.all": "Todos los proyectos", "settings.workspaces.empty": "No hay espacios de trabajo", "settings.workspaces.count.one": "{{count}} espacio de trabajo", + "settings.workspaces.count.many": "{{count}} espacios de trabajo", "settings.workspaces.count.other": "{{count}} espacios de trabajo", "settings.workspaces.sessions.one": "{{count}} sesión en {{project}}", + "settings.workspaces.sessions.many": "{{count}} sesiones en {{project}}", "settings.workspaces.sessions.other": "{{count}} sesiones en {{project}}", "settings.workspaces.lastActiveSession": "Última sesión activa", "settings.workspaces.deleteAll": "Eliminar todos los espacios de trabajo", @@ -1154,11 +1156,18 @@ export const dict = { "settings.workspaces.default.local": "Directorio local", "settings.workspaces.default.new": "Nuevo espacio de trabajo", "workspace.move.title": "Mover al espacio de trabajo", + "workspace.move.menu.title": "Mover sesión a", "workspace.move.failed": "No se pudo mover la sesión", "workspace.lifecycle.creating": "Creando espacio de trabajo", "workspace.lifecycle.created": "Espacio de trabajo creado", + "workspace.lifecycle.starting": "Iniciando sesión", + "workspace.onboarding.title": "Aísla sesiones con espacios de trabajo", + "workspace.onboarding.description": "Cada uno obtiene su propio checkout, para no interferir con tu repositorio local", "workspace.lifecycle.moving": "Moviendo al espacio de trabajo", "workspace.lifecycle.set": "Espacio de trabajo establecido", + "session.summary.title": "Detalles de la sesión", + "session.summary.noBranch": "Sin rama", + "session.summary.basedOn": "Basado en {{branch}}", "workspace.type.local": "local", "workspace.type.sandbox": "sandbox", "workspace.create.failed.title": "Fallo al crear espacio de trabajo", @@ -1283,4 +1292,12 @@ export const dict = { "error.childStore.persistedProjectIconCreateFailed": "Error al crear icono de proyecto persistente", "error.childStore.storeCreateFailed": "Error al crear almacén", "terminal.connectionLost.abnormalClose": "WebSocket cerrado anormalmente: {{code}}", + "command.session.export": "Export session", + "command.session.export.description": "Export the full session transcript as JSON", + "context.export.session": "Export session", + "toast.session.export.success.title": "Session exported", + "toast.session.export.success.description": "Saved session to {{filename}}", + "toast.session.export.failed.title": "Failed to export session", + "toast.session.export.failed.description": "An error occurred while exporting the session", + "common.export": "Export", } diff --git a/packages/app/src/i18n/fi.ts b/packages/app/src/i18n/fi.ts index 7955cda59a6..4ed775e6f99 100644 --- a/packages/app/src/i18n/fi.ts +++ b/packages/app/src/i18n/fi.ts @@ -1152,4 +1152,50 @@ export const dict = { "help.tabs.persistence": "Kun avaat sovelluksen uudelleen, välilehtesi ovat yhä avoinna.", "help.tabs.worktrees": "Uusi ulkoasu ei vielä tue Git-työpuita, mutta tuki on tulossa pian. Jos haluat jatkaa aiemman ulkoasun käyttöä, voit vaihtaa ulkoasua asetuksissa. Huomaa kuitenkin, että uudesta ulkoasusta tulee pysyvä muutaman viikon kuluttua.", + "command.session.export": "Export session", + "command.session.export.description": "Export the full session transcript as JSON", + "context.export.session": "Export session", + "toast.session.export.success.title": "Session exported", + "toast.session.export.success.description": "Saved session to {{filename}}", + "toast.session.export.failed.title": "Failed to export session", + "toast.session.export.failed.description": "An error occurred while exporting the session", + "common.export": "Export", + "common.viewAll": "View all", + "session.new.workspace.local.tooltip": "Use current checkout", + "session.new.workspace.new.tooltip": "Create isolated checkout", + "session.new.workspace.fromBranch": "from {{branch}}", + "session.new.workspace.trigger.tooltip": "Select where to run session", + "session.new.workspace.search.placeholder": "Search workspaces", + "settings.tab.workspaces": "Workspaces", + "settings.workspaces.filter.all": "All projects", + "settings.workspaces.empty": "No workspaces", + "settings.workspaces.count.one": "{{count}} workspace", + "settings.workspaces.count.other": "{{count}} workspaces", + "settings.workspaces.sessions.one": "{{count}} session in {{project}}", + "settings.workspaces.sessions.other": "{{count}} sessions in {{project}}", + "settings.workspaces.lastActiveSession": "Last active session", + "settings.workspaces.deleteAll": "Delete all workspaces", + "settings.workspaces.deleteAll.confirm": "Delete all {{count}} workspaces?", + "settings.workspaces.delete.warning": "The workspace directory and branch will be permanently removed. Deletion proceeds only if it is clean, inactive, and has no linked sessions.", + "settings.workspaces.deleteAll.warning": "The {{count}} selected workspaces in {{project}} will be permanently removed only if each is clean, inactive, and has no linked sessions.", + "settings.workspaces.delete.blocked.active": "The active workspace cannot be deleted.", + "settings.workspaces.delete.blocked.linked": "This workspace has linked sessions and cannot be deleted.", + "settings.workspaces.default.title": "Default environment", + "settings.workspaces.default.description": "Choose where new sessions start", + "settings.workspaces.default.lastUsed": "Last used per project", + "settings.workspaces.default.local": "Local directory", + "settings.workspaces.default.new": "New workspace", + "workspace.move.title": "Move to workspace", + "workspace.move.menu.title": "Move session to", + "workspace.move.failed": "Failed to move session", + "workspace.lifecycle.creating": "Creating workspace", + "workspace.lifecycle.created": "Workspace created", + "workspace.lifecycle.starting": "Starting session", + "workspace.onboarding.title": "Isolate sessions with workspaces", + "workspace.onboarding.description": "Each gets its own checkout, so nothing interferes with your local repository", + "workspace.lifecycle.moving": "Moving to workspace", + "workspace.lifecycle.set": "Workspace set", + "session.summary.title": "Session details", + "session.summary.noBranch": "No branch", + "session.summary.basedOn": "Based on {{branch}}", } diff --git a/packages/app/src/i18n/fr.ts b/packages/app/src/i18n/fr.ts index f4ceda65574..55db57fc41f 100644 --- a/packages/app/src/i18n/fr.ts +++ b/packages/app/src/i18n/fr.ts @@ -1061,8 +1061,10 @@ export const dict = { "settings.workspaces.filter.all": "Tous les projets", "settings.workspaces.empty": "Aucun espace de travail", "settings.workspaces.count.one": "{{count}} espace de travail", + "settings.workspaces.count.many": "{{count}} espaces de travail", "settings.workspaces.count.other": "{{count}} espaces de travail", "settings.workspaces.sessions.one": "{{count}} session dans {{project}}", + "settings.workspaces.sessions.many": "{{count}} sessions dans {{project}}", "settings.workspaces.sessions.other": "{{count}} sessions dans {{project}}", "settings.workspaces.lastActiveSession": "Dernière session active", "settings.workspaces.deleteAll": "Supprimer tous les espaces de travail", @@ -1080,11 +1082,18 @@ export const dict = { "settings.workspaces.default.local": "Dossier local", "settings.workspaces.default.new": "Nouvel espace de travail", "workspace.move.title": "Déplacer vers l’espace de travail", + "workspace.move.menu.title": "Déplacer la session vers", "workspace.move.failed": "Impossible de déplacer la session", "workspace.lifecycle.creating": "Création de l’espace de travail", "workspace.lifecycle.created": "Espace de travail créé", + "workspace.lifecycle.starting": "Démarrage de la session", + "workspace.onboarding.title": "Isolez vos sessions avec les espaces de travail", + "workspace.onboarding.description": "Chacun dispose de son propre checkout pour ne pas interférer avec votre dépôt local", "workspace.lifecycle.moving": "Déplacement vers l’espace de travail", "workspace.lifecycle.set": "Espace de travail défini", + "session.summary.title": "Détails de la session", + "session.summary.noBranch": "Aucune branche", + "session.summary.basedOn": "Basé sur {{branch}}", "workspace.type.local": "local", "workspace.type.sandbox": "bac à sable", "workspace.create.failed.title": "Échec de la création de l'espace de travail", @@ -1217,4 +1226,12 @@ export const dict = { "titlebar.update": "Mettre à jour", "titlebar.updateVersion": "Mettre à jour {{version}}", + "command.session.export": "Export session", + "command.session.export.description": "Export the full session transcript as JSON", + "context.export.session": "Export session", + "toast.session.export.success.title": "Session exported", + "toast.session.export.success.description": "Saved session to {{filename}}", + "toast.session.export.failed.title": "Failed to export session", + "toast.session.export.failed.description": "An error occurred while exporting the session", + "common.export": "Export", } diff --git a/packages/app/src/i18n/hi.ts b/packages/app/src/i18n/hi.ts index a704e6233ef..5e6ee8c9f30 100644 --- a/packages/app/src/i18n/hi.ts +++ b/packages/app/src/i18n/hi.ts @@ -1147,4 +1147,50 @@ export const dict = { "workspace.reset.archived.one": "1 सेशन संग्रहित किया जाएगा।", "workspace.reset.archived.many": "{{count}} सेशन संग्रहित किए जाएँगे।", "workspace.reset.note": "यह डिफ़ॉल्ट शाखा से मिलान करने के लिए वर्कस्पेस को रीसेट कर देगा।", + "command.session.export": "Export session", + "command.session.export.description": "Export the full session transcript as JSON", + "context.export.session": "Export session", + "toast.session.export.success.title": "Session exported", + "toast.session.export.success.description": "Saved session to {{filename}}", + "toast.session.export.failed.title": "Failed to export session", + "toast.session.export.failed.description": "An error occurred while exporting the session", + "common.export": "Export", + "common.viewAll": "View all", + "session.new.workspace.local.tooltip": "Use current checkout", + "session.new.workspace.new.tooltip": "Create isolated checkout", + "session.new.workspace.fromBranch": "from {{branch}}", + "session.new.workspace.trigger.tooltip": "Select where to run session", + "session.new.workspace.search.placeholder": "Search workspaces", + "settings.tab.workspaces": "Workspaces", + "settings.workspaces.filter.all": "All projects", + "settings.workspaces.empty": "No workspaces", + "settings.workspaces.count.one": "{{count}} workspace", + "settings.workspaces.count.other": "{{count}} workspaces", + "settings.workspaces.sessions.one": "{{count}} session in {{project}}", + "settings.workspaces.sessions.other": "{{count}} sessions in {{project}}", + "settings.workspaces.lastActiveSession": "Last active session", + "settings.workspaces.deleteAll": "Delete all workspaces", + "settings.workspaces.deleteAll.confirm": "Delete all {{count}} workspaces?", + "settings.workspaces.delete.warning": "The workspace directory and branch will be permanently removed. Deletion proceeds only if it is clean, inactive, and has no linked sessions.", + "settings.workspaces.deleteAll.warning": "The {{count}} selected workspaces in {{project}} will be permanently removed only if each is clean, inactive, and has no linked sessions.", + "settings.workspaces.delete.blocked.active": "The active workspace cannot be deleted.", + "settings.workspaces.delete.blocked.linked": "This workspace has linked sessions and cannot be deleted.", + "settings.workspaces.default.title": "Default environment", + "settings.workspaces.default.description": "Choose where new sessions start", + "settings.workspaces.default.lastUsed": "Last used per project", + "settings.workspaces.default.local": "Local directory", + "settings.workspaces.default.new": "New workspace", + "workspace.move.title": "Move to workspace", + "workspace.move.menu.title": "Move session to", + "workspace.move.failed": "Failed to move session", + "workspace.lifecycle.creating": "Creating workspace", + "workspace.lifecycle.created": "Workspace created", + "workspace.lifecycle.starting": "Starting session", + "workspace.onboarding.title": "Isolate sessions with workspaces", + "workspace.onboarding.description": "Each gets its own checkout, so nothing interferes with your local repository", + "workspace.lifecycle.moving": "Moving to workspace", + "workspace.lifecycle.set": "Workspace set", + "session.summary.title": "Session details", + "session.summary.noBranch": "No branch", + "session.summary.basedOn": "Based on {{branch}}", } diff --git a/packages/app/src/i18n/id.ts b/packages/app/src/i18n/id.ts index e693869089e..35bbac6ee1b 100644 --- a/packages/app/src/i18n/id.ts +++ b/packages/app/src/i18n/id.ts @@ -1234,4 +1234,50 @@ export const dict = { "workspace.reset.archived.one": "1 sesi akan diarsipkan.", "workspace.reset.archived.many": "{{count}} sesi akan diarsipkan.", "workspace.reset.note": "Ini akan mengatur ulang ruang kerja agar cocok dengan cabang bawaan.", + "command.session.export": "Export session", + "command.session.export.description": "Export the full session transcript as JSON", + "context.export.session": "Export session", + "toast.session.export.success.title": "Session exported", + "toast.session.export.success.description": "Saved session to {{filename}}", + "toast.session.export.failed.title": "Failed to export session", + "toast.session.export.failed.description": "An error occurred while exporting the session", + "common.export": "Export", + "common.viewAll": "View all", + "session.new.workspace.local.tooltip": "Use current checkout", + "session.new.workspace.new.tooltip": "Create isolated checkout", + "session.new.workspace.fromBranch": "from {{branch}}", + "session.new.workspace.trigger.tooltip": "Select where to run session", + "session.new.workspace.search.placeholder": "Search workspaces", + "settings.tab.workspaces": "Workspaces", + "settings.workspaces.filter.all": "All projects", + "settings.workspaces.empty": "No workspaces", + "settings.workspaces.count.one": "{{count}} workspace", + "settings.workspaces.count.other": "{{count}} workspaces", + "settings.workspaces.sessions.one": "{{count}} session in {{project}}", + "settings.workspaces.sessions.other": "{{count}} sessions in {{project}}", + "settings.workspaces.lastActiveSession": "Last active session", + "settings.workspaces.deleteAll": "Delete all workspaces", + "settings.workspaces.deleteAll.confirm": "Delete all {{count}} workspaces?", + "settings.workspaces.delete.warning": "The workspace directory and branch will be permanently removed. Deletion proceeds only if it is clean, inactive, and has no linked sessions.", + "settings.workspaces.deleteAll.warning": "The {{count}} selected workspaces in {{project}} will be permanently removed only if each is clean, inactive, and has no linked sessions.", + "settings.workspaces.delete.blocked.active": "The active workspace cannot be deleted.", + "settings.workspaces.delete.blocked.linked": "This workspace has linked sessions and cannot be deleted.", + "settings.workspaces.default.title": "Default environment", + "settings.workspaces.default.description": "Choose where new sessions start", + "settings.workspaces.default.lastUsed": "Last used per project", + "settings.workspaces.default.local": "Local directory", + "settings.workspaces.default.new": "New workspace", + "workspace.move.title": "Move to workspace", + "workspace.move.menu.title": "Move session to", + "workspace.move.failed": "Failed to move session", + "workspace.lifecycle.creating": "Creating workspace", + "workspace.lifecycle.created": "Workspace created", + "workspace.lifecycle.starting": "Starting session", + "workspace.onboarding.title": "Isolate sessions with workspaces", + "workspace.onboarding.description": "Each gets its own checkout, so nothing interferes with your local repository", + "workspace.lifecycle.moving": "Moving to workspace", + "workspace.lifecycle.set": "Workspace set", + "session.summary.title": "Session details", + "session.summary.noBranch": "No branch", + "session.summary.basedOn": "Based on {{branch}}", } diff --git a/packages/app/src/i18n/it.ts b/packages/app/src/i18n/it.ts index 3f4089018dd..0caa391f4ba 100644 --- a/packages/app/src/i18n/it.ts +++ b/packages/app/src/i18n/it.ts @@ -1160,4 +1160,55 @@ export const dict = { "desktop.wsl.error.failedPort": "Impossibile ottenere la porta", "desktop.picker.error.notSelected": "Il file non è stato selezionato nella finestra di selezione", "desktop.picker.error.sizeLimit": "Gli allegati selezionati superano il limite di {{limit}} MB", + + "common.viewAll": "Mostra tutto", + "session.new.workspace.local.tooltip": "Usa il checkout corrente", + "session.new.workspace.new.tooltip": "Crea un checkout isolato", + "session.new.workspace.fromBranch": "da {{branch}}", + "session.new.workspace.trigger.tooltip": "Seleziona dove eseguire la sessione", + "session.new.workspace.search.placeholder": "Cerca aree di lavoro", + "settings.tab.workspaces": "Aree di lavoro", + "settings.workspaces.filter.all": "Tutti i progetti", + "settings.workspaces.empty": "Nessuna area di lavoro", + "settings.workspaces.count.one": "{{count}} area di lavoro", + "settings.workspaces.count.many": "{{count}} aree di lavoro", + "settings.workspaces.count.other": "{{count}} aree di lavoro", + "settings.workspaces.sessions.one": "{{count}} sessione in {{project}}", + "settings.workspaces.sessions.many": "{{count}} sessioni in {{project}}", + "settings.workspaces.sessions.other": "{{count}} sessioni in {{project}}", + "settings.workspaces.lastActiveSession": "Ultima sessione attiva", + "settings.workspaces.deleteAll": "Elimina tutte le aree di lavoro", + "settings.workspaces.deleteAll.confirm": "Eliminare tutte le {{count}} aree di lavoro?", + "settings.workspaces.delete.warning": + "La directory e il branch dell'area di lavoro verranno rimossi definitivamente. L'eliminazione procede solo se l'area è pulita, inattiva e non ha sessioni collegate.", + "settings.workspaces.deleteAll.warning": + "Le {{count}} aree di lavoro selezionate in {{project}} verranno rimosse definitivamente solo se ciascuna è pulita, inattiva e non ha sessioni collegate.", + "settings.workspaces.delete.blocked.active": "L'area di lavoro attiva non può essere eliminata.", + "settings.workspaces.delete.blocked.linked": "Questa area di lavoro ha sessioni collegate e non può essere eliminata.", + "settings.workspaces.default.title": "Ambiente predefinito", + "settings.workspaces.default.description": "Scegli dove avviare le nuove sessioni", + "settings.workspaces.default.lastUsed": "Ultimo usato per progetto", + "settings.workspaces.default.local": "Directory locale", + "settings.workspaces.default.new": "Nuova area di lavoro", + "workspace.move.title": "Sposta nell'area di lavoro", + "workspace.move.menu.title": "Sposta la sessione in", + "workspace.move.failed": "Impossibile spostare la sessione", + "workspace.lifecycle.creating": "Creazione dell'area di lavoro", + "workspace.lifecycle.created": "Area di lavoro creata", + "workspace.lifecycle.starting": "Avvio sessione", + "workspace.onboarding.title": "Isola le sessioni con le aree di lavoro", + "workspace.onboarding.description": "Ognuna ottiene il proprio checkout per non interferire con il repository locale", + "workspace.lifecycle.moving": "Spostamento nell'area di lavoro", + "workspace.lifecycle.set": "Area di lavoro impostata", + "session.summary.title": "Dettagli della sessione", + "session.summary.noBranch": "Nessun branch", + "session.summary.basedOn": "Basato su {{branch}}", + "command.session.export": "Export session", + "command.session.export.description": "Export the full session transcript as JSON", + "context.export.session": "Export session", + "toast.session.export.success.title": "Session exported", + "toast.session.export.success.description": "Saved session to {{filename}}", + "toast.session.export.failed.title": "Failed to export session", + "toast.session.export.failed.description": "An error occurred while exporting the session", + "common.export": "Export", } diff --git a/packages/app/src/i18n/ja.ts b/packages/app/src/i18n/ja.ts index 0ed09171dd1..69cc4a2fed1 100644 --- a/packages/app/src/i18n/ja.ts +++ b/packages/app/src/i18n/ja.ts @@ -1186,4 +1186,19 @@ export const dict = { "titlebar.update": "アップデート", "titlebar.updateVersion": "アップデート {{version}}", + "command.session.export": "Export session", + "command.session.export.description": "Export the full session transcript as JSON", + "context.export.session": "Export session", + "toast.session.export.success.title": "Session exported", + "toast.session.export.success.description": "Saved session to {{filename}}", + "toast.session.export.failed.title": "Failed to export session", + "toast.session.export.failed.description": "An error occurred while exporting the session", + "common.export": "Export", + "workspace.move.menu.title": "Move session to", + "workspace.lifecycle.starting": "Starting session", + "workspace.onboarding.title": "Isolate sessions with workspaces", + "workspace.onboarding.description": "Each gets its own checkout, so nothing interferes with your local repository", + "session.summary.title": "Session details", + "session.summary.noBranch": "No branch", + "session.summary.basedOn": "Based on {{branch}}", } diff --git a/packages/app/src/i18n/ko.ts b/packages/app/src/i18n/ko.ts index dd54eb5f893..2c4a0a1debc 100644 --- a/packages/app/src/i18n/ko.ts +++ b/packages/app/src/i18n/ko.ts @@ -1184,4 +1184,19 @@ export const dict = { "desktop.picker.error.notSelected": "선택기에서 파일을 선택하지 않았습니다", "desktop.picker.error.sizeLimit": "선택한 첨부 파일이 {{limit}} MB 제한을 초과합니다", + "command.session.export": "Export session", + "command.session.export.description": "Export the full session transcript as JSON", + "context.export.session": "Export session", + "toast.session.export.success.title": "Session exported", + "toast.session.export.success.description": "Saved session to {{filename}}", + "toast.session.export.failed.title": "Failed to export session", + "toast.session.export.failed.description": "An error occurred while exporting the session", + "common.export": "Export", + "workspace.move.menu.title": "Move session to", + "workspace.lifecycle.starting": "Starting session", + "workspace.onboarding.title": "Isolate sessions with workspaces", + "workspace.onboarding.description": "Each gets its own checkout, so nothing interferes with your local repository", + "session.summary.title": "Session details", + "session.summary.noBranch": "No branch", + "session.summary.basedOn": "Based on {{branch}}", } diff --git a/packages/app/src/i18n/nl.ts b/packages/app/src/i18n/nl.ts index 7ac999c7a79..6107e879665 100644 --- a/packages/app/src/i18n/nl.ts +++ b/packages/app/src/i18n/nl.ts @@ -1155,4 +1155,50 @@ export const dict = { "workspace.reset.archived.many": "{{count}} sessies worden gearchiveerd.", "workspace.reset.note": "Hierdoor wordt de werkruimte opnieuw ingesteld zodat deze overeenkomt met de standaardbranch.", + "command.session.export": "Export session", + "command.session.export.description": "Export the full session transcript as JSON", + "context.export.session": "Export session", + "toast.session.export.success.title": "Session exported", + "toast.session.export.success.description": "Saved session to {{filename}}", + "toast.session.export.failed.title": "Failed to export session", + "toast.session.export.failed.description": "An error occurred while exporting the session", + "common.export": "Export", + "common.viewAll": "View all", + "session.new.workspace.local.tooltip": "Use current checkout", + "session.new.workspace.new.tooltip": "Create isolated checkout", + "session.new.workspace.fromBranch": "from {{branch}}", + "session.new.workspace.trigger.tooltip": "Select where to run session", + "session.new.workspace.search.placeholder": "Search workspaces", + "settings.tab.workspaces": "Workspaces", + "settings.workspaces.filter.all": "All projects", + "settings.workspaces.empty": "No workspaces", + "settings.workspaces.count.one": "{{count}} workspace", + "settings.workspaces.count.other": "{{count}} workspaces", + "settings.workspaces.sessions.one": "{{count}} session in {{project}}", + "settings.workspaces.sessions.other": "{{count}} sessions in {{project}}", + "settings.workspaces.lastActiveSession": "Last active session", + "settings.workspaces.deleteAll": "Delete all workspaces", + "settings.workspaces.deleteAll.confirm": "Delete all {{count}} workspaces?", + "settings.workspaces.delete.warning": "The workspace directory and branch will be permanently removed. Deletion proceeds only if it is clean, inactive, and has no linked sessions.", + "settings.workspaces.deleteAll.warning": "The {{count}} selected workspaces in {{project}} will be permanently removed only if each is clean, inactive, and has no linked sessions.", + "settings.workspaces.delete.blocked.active": "The active workspace cannot be deleted.", + "settings.workspaces.delete.blocked.linked": "This workspace has linked sessions and cannot be deleted.", + "settings.workspaces.default.title": "Default environment", + "settings.workspaces.default.description": "Choose where new sessions start", + "settings.workspaces.default.lastUsed": "Last used per project", + "settings.workspaces.default.local": "Local directory", + "settings.workspaces.default.new": "New workspace", + "workspace.move.title": "Move to workspace", + "workspace.move.menu.title": "Move session to", + "workspace.move.failed": "Failed to move session", + "workspace.lifecycle.creating": "Creating workspace", + "workspace.lifecycle.created": "Workspace created", + "workspace.lifecycle.starting": "Starting session", + "workspace.onboarding.title": "Isolate sessions with workspaces", + "workspace.onboarding.description": "Each gets its own checkout, so nothing interferes with your local repository", + "workspace.lifecycle.moving": "Moving to workspace", + "workspace.lifecycle.set": "Workspace set", + "session.summary.title": "Session details", + "session.summary.noBranch": "No branch", + "session.summary.basedOn": "Based on {{branch}}", } diff --git a/packages/app/src/i18n/no.ts b/packages/app/src/i18n/no.ts index 3350d0582e3..cd71b4819d2 100644 --- a/packages/app/src/i18n/no.ts +++ b/packages/app/src/i18n/no.ts @@ -1284,4 +1284,19 @@ export const dict = { "settings.general.row.pinchZoom.description": "Tillat knipebevegelser på styreflaten og Ctrl-rulling for å zoome", "settings.updates.action.downloading": "Laster ned...", "settings.updates.action.installing": "Installerer...", -} satisfies Partial> + "command.session.export": "Export session", + "command.session.export.description": "Export the full session transcript as JSON", + "context.export.session": "Export session", + "toast.session.export.success.title": "Session exported", + "toast.session.export.success.description": "Saved session to {{filename}}", + "toast.session.export.failed.title": "Failed to export session", + "toast.session.export.failed.description": "An error occurred while exporting the session", + "common.export": "Export", + "workspace.move.menu.title": "Move session to", + "workspace.lifecycle.starting": "Starting session", + "workspace.onboarding.title": "Isolate sessions with workspaces", + "workspace.onboarding.description": "Each gets its own checkout, so nothing interferes with your local repository", + "session.summary.title": "Session details", + "session.summary.noBranch": "No branch", + "session.summary.basedOn": "Based on {{branch}}", +} diff --git a/packages/app/src/i18n/pa.ts b/packages/app/src/i18n/pa.ts index 4e0ff16f87e..1609ee78240 100644 --- a/packages/app/src/i18n/pa.ts +++ b/packages/app/src/i18n/pa.ts @@ -1145,4 +1145,50 @@ export const dict = { "workspace.reset.archived.one": "1 سیشن آرکائیو کیتا جائے گا۔", "workspace.reset.archived.many": "{{count}} سیشن آرکائیو کیتے جان گے۔", "workspace.reset.note": "ایہ ورک اسپیس نو ڈیفالٹ برانچ نال ملاون لئی ری سیٹ کرے گا۔", + "command.session.export": "Export session", + "command.session.export.description": "Export the full session transcript as JSON", + "context.export.session": "Export session", + "toast.session.export.success.title": "Session exported", + "toast.session.export.success.description": "Saved session to {{filename}}", + "toast.session.export.failed.title": "Failed to export session", + "toast.session.export.failed.description": "An error occurred while exporting the session", + "common.export": "Export", + "common.viewAll": "View all", + "session.new.workspace.local.tooltip": "Use current checkout", + "session.new.workspace.new.tooltip": "Create isolated checkout", + "session.new.workspace.fromBranch": "from {{branch}}", + "session.new.workspace.trigger.tooltip": "Select where to run session", + "session.new.workspace.search.placeholder": "Search workspaces", + "settings.tab.workspaces": "Workspaces", + "settings.workspaces.filter.all": "All projects", + "settings.workspaces.empty": "No workspaces", + "settings.workspaces.count.one": "{{count}} workspace", + "settings.workspaces.count.other": "{{count}} workspaces", + "settings.workspaces.sessions.one": "{{count}} session in {{project}}", + "settings.workspaces.sessions.other": "{{count}} sessions in {{project}}", + "settings.workspaces.lastActiveSession": "Last active session", + "settings.workspaces.deleteAll": "Delete all workspaces", + "settings.workspaces.deleteAll.confirm": "Delete all {{count}} workspaces?", + "settings.workspaces.delete.warning": "The workspace directory and branch will be permanently removed. Deletion proceeds only if it is clean, inactive, and has no linked sessions.", + "settings.workspaces.deleteAll.warning": "The {{count}} selected workspaces in {{project}} will be permanently removed only if each is clean, inactive, and has no linked sessions.", + "settings.workspaces.delete.blocked.active": "The active workspace cannot be deleted.", + "settings.workspaces.delete.blocked.linked": "This workspace has linked sessions and cannot be deleted.", + "settings.workspaces.default.title": "Default environment", + "settings.workspaces.default.description": "Choose where new sessions start", + "settings.workspaces.default.lastUsed": "Last used per project", + "settings.workspaces.default.local": "Local directory", + "settings.workspaces.default.new": "New workspace", + "workspace.move.title": "Move to workspace", + "workspace.move.menu.title": "Move session to", + "workspace.move.failed": "Failed to move session", + "workspace.lifecycle.creating": "Creating workspace", + "workspace.lifecycle.created": "Workspace created", + "workspace.lifecycle.starting": "Starting session", + "workspace.onboarding.title": "Isolate sessions with workspaces", + "workspace.onboarding.description": "Each gets its own checkout, so nothing interferes with your local repository", + "workspace.lifecycle.moving": "Moving to workspace", + "workspace.lifecycle.set": "Workspace set", + "session.summary.title": "Session details", + "session.summary.noBranch": "No branch", + "session.summary.basedOn": "Based on {{branch}}", } diff --git a/packages/app/src/i18n/pl.ts b/packages/app/src/i18n/pl.ts index 1eaa8d5cdb7..b199ad928bc 100644 --- a/packages/app/src/i18n/pl.ts +++ b/packages/app/src/i18n/pl.ts @@ -1053,8 +1053,12 @@ export const dict = { "settings.workspaces.filter.all": "Wszystkie projekty", "settings.workspaces.empty": "Brak obszarów roboczych", "settings.workspaces.count.one": "{{count}} obszar roboczy", + "settings.workspaces.count.few": "{{count}} obszary robocze", + "settings.workspaces.count.many": "{{count}} obszarów roboczych", "settings.workspaces.count.other": "{{count}} obszarów roboczych", "settings.workspaces.sessions.one": "{{count}} sesja w {{project}}", + "settings.workspaces.sessions.few": "{{count}} sesje w {{project}}", + "settings.workspaces.sessions.many": "{{count}} sesji w {{project}}", "settings.workspaces.sessions.other": "{{count}} sesji w {{project}}", "settings.workspaces.lastActiveSession": "Ostatnia aktywna sesja", "settings.workspaces.deleteAll": "Usuń wszystkie obszary robocze", @@ -1071,11 +1075,18 @@ export const dict = { "settings.workspaces.default.local": "Katalog lokalny", "settings.workspaces.default.new": "Nowy obszar roboczy", "workspace.move.title": "Przenieś do obszaru roboczego", + "workspace.move.menu.title": "Przenieś sesję do", "workspace.move.failed": "Nie udało się przenieść sesji", "workspace.lifecycle.creating": "Tworzenie obszaru roboczego", "workspace.lifecycle.created": "Utworzono obszar roboczy", + "workspace.lifecycle.starting": "Uruchamianie sesji", + "workspace.onboarding.title": "Izoluj sesje za pomocą przestrzeni roboczych", + "workspace.onboarding.description": "Każda otrzymuje własny checkout, więc nic nie zakłóca Twojego lokalnego repozytorium", "workspace.lifecycle.moving": "Przenoszenie do obszaru roboczego", "workspace.lifecycle.set": "Ustawiono obszar roboczy", + "session.summary.title": "Szczegóły sesji", + "session.summary.noBranch": "Brak gałęzi", + "session.summary.basedOn": "Na podstawie {{branch}}", "workspace.type.local": "lokalna", "workspace.type.sandbox": "piaskownica", "workspace.create.failed.title": "Nie udało się utworzyć przestrzeni roboczej", @@ -1201,4 +1212,12 @@ export const dict = { "error.childStore.persistedProjectIconCreateFailed": "Nie udało się utworzyć trwałej ikony projektu", "error.childStore.storeCreateFailed": "Nie udało się utworzyć magazynu", "terminal.connectionLost.abnormalClose": "WebSocket zamknięty nieprawidłowo: {{code}}", + "command.session.export": "Export session", + "command.session.export.description": "Export the full session transcript as JSON", + "context.export.session": "Export session", + "toast.session.export.success.title": "Session exported", + "toast.session.export.success.description": "Saved session to {{filename}}", + "toast.session.export.failed.title": "Failed to export session", + "toast.session.export.failed.description": "An error occurred while exporting the session", + "common.export": "Export", } diff --git a/packages/app/src/i18n/ru.ts b/packages/app/src/i18n/ru.ts index d2f0e1a893f..4719071092d 100644 --- a/packages/app/src/i18n/ru.ts +++ b/packages/app/src/i18n/ru.ts @@ -1132,8 +1132,12 @@ export const dict = { "settings.workspaces.filter.all": "Все проекты", "settings.workspaces.empty": "Нет рабочих пространств", "settings.workspaces.count.one": "{{count}} рабочее пространство", + "settings.workspaces.count.few": "{{count}} рабочих пространства", + "settings.workspaces.count.many": "{{count}} рабочих пространств", "settings.workspaces.count.other": "{{count}} рабочих пространств", "settings.workspaces.sessions.one": "{{count}} сессия в {{project}}", + "settings.workspaces.sessions.few": "{{count}} сессии в {{project}}", + "settings.workspaces.sessions.many": "{{count}} сессий в {{project}}", "settings.workspaces.sessions.other": "{{count}} сессий в {{project}}", "settings.workspaces.lastActiveSession": "Последний активный сеанс", "settings.workspaces.deleteAll": "Удалить все рабочие пространства", @@ -1151,11 +1155,18 @@ export const dict = { "settings.workspaces.default.local": "Локальный каталог", "settings.workspaces.default.new": "Новое рабочее пространство", "workspace.move.title": "Переместить в рабочую область", + "workspace.move.menu.title": "Переместить сессию в", "workspace.move.failed": "Не удалось переместить сеанс", "workspace.lifecycle.creating": "Создание рабочей области", "workspace.lifecycle.created": "Рабочая область создана", + "workspace.lifecycle.starting": "Запуск сессии", + "workspace.onboarding.title": "Изолируйте сессии с помощью рабочих пространств", + "workspace.onboarding.description": "Каждая получает отдельную копию, чтобы не влиять на ваш локальный репозиторий", "workspace.lifecycle.moving": "Перемещение в рабочую область", "workspace.lifecycle.set": "Рабочая область задана", + "session.summary.title": "Сведения о сеансе", + "session.summary.noBranch": "Нет ветки", + "session.summary.basedOn": "На основе {{branch}}", "workspace.type.local": "локальное", "workspace.type.sandbox": "песочница", "workspace.create.failed.title": "Не удалось создать рабочее пространство", @@ -1280,4 +1291,12 @@ export const dict = { "error.childStore.persistedProjectIconCreateFailed": "Не удалось создать постоянный значок проекта", "error.childStore.storeCreateFailed": "Не удалось создать хранилище", "terminal.connectionLost.abnormalClose": "WebSocket закрыт аварийно: {{code}}", + "command.session.export": "Export session", + "command.session.export.description": "Export the full session transcript as JSON", + "context.export.session": "Export session", + "toast.session.export.success.title": "Session exported", + "toast.session.export.success.description": "Saved session to {{filename}}", + "toast.session.export.failed.title": "Failed to export session", + "toast.session.export.failed.description": "An error occurred while exporting the session", + "common.export": "Export", } diff --git a/packages/app/src/i18n/sv.ts b/packages/app/src/i18n/sv.ts index ab5007238b6..9bab2f8502d 100644 --- a/packages/app/src/i18n/sv.ts +++ b/packages/app/src/i18n/sv.ts @@ -1144,4 +1144,50 @@ export const dict = { "workspace.reset.archived.one": "1 session kommer att arkiveras.", "workspace.reset.archived.many": "{{count}} sessioner kommer att arkiveras.", "workspace.reset.note": "Detta kommer att återställa arbetsytan så att den matchar standardgrenen.", + "command.session.export": "Export session", + "command.session.export.description": "Export the full session transcript as JSON", + "context.export.session": "Export session", + "toast.session.export.success.title": "Session exported", + "toast.session.export.success.description": "Saved session to {{filename}}", + "toast.session.export.failed.title": "Failed to export session", + "toast.session.export.failed.description": "An error occurred while exporting the session", + "common.export": "Export", + "common.viewAll": "View all", + "session.new.workspace.local.tooltip": "Use current checkout", + "session.new.workspace.new.tooltip": "Create isolated checkout", + "session.new.workspace.fromBranch": "from {{branch}}", + "session.new.workspace.trigger.tooltip": "Select where to run session", + "session.new.workspace.search.placeholder": "Search workspaces", + "settings.tab.workspaces": "Workspaces", + "settings.workspaces.filter.all": "All projects", + "settings.workspaces.empty": "No workspaces", + "settings.workspaces.count.one": "{{count}} workspace", + "settings.workspaces.count.other": "{{count}} workspaces", + "settings.workspaces.sessions.one": "{{count}} session in {{project}}", + "settings.workspaces.sessions.other": "{{count}} sessions in {{project}}", + "settings.workspaces.lastActiveSession": "Last active session", + "settings.workspaces.deleteAll": "Delete all workspaces", + "settings.workspaces.deleteAll.confirm": "Delete all {{count}} workspaces?", + "settings.workspaces.delete.warning": "The workspace directory and branch will be permanently removed. Deletion proceeds only if it is clean, inactive, and has no linked sessions.", + "settings.workspaces.deleteAll.warning": "The {{count}} selected workspaces in {{project}} will be permanently removed only if each is clean, inactive, and has no linked sessions.", + "settings.workspaces.delete.blocked.active": "The active workspace cannot be deleted.", + "settings.workspaces.delete.blocked.linked": "This workspace has linked sessions and cannot be deleted.", + "settings.workspaces.default.title": "Default environment", + "settings.workspaces.default.description": "Choose where new sessions start", + "settings.workspaces.default.lastUsed": "Last used per project", + "settings.workspaces.default.local": "Local directory", + "settings.workspaces.default.new": "New workspace", + "workspace.move.title": "Move to workspace", + "workspace.move.menu.title": "Move session to", + "workspace.move.failed": "Failed to move session", + "workspace.lifecycle.creating": "Creating workspace", + "workspace.lifecycle.created": "Workspace created", + "workspace.lifecycle.starting": "Starting session", + "workspace.onboarding.title": "Isolate sessions with workspaces", + "workspace.onboarding.description": "Each gets its own checkout, so nothing interferes with your local repository", + "workspace.lifecycle.moving": "Moving to workspace", + "workspace.lifecycle.set": "Workspace set", + "session.summary.title": "Session details", + "session.summary.noBranch": "No branch", + "session.summary.basedOn": "Based on {{branch}}", } diff --git a/packages/app/src/i18n/th.ts b/packages/app/src/i18n/th.ts index a4713107096..94e0d2ae993 100644 --- a/packages/app/src/i18n/th.ts +++ b/packages/app/src/i18n/th.ts @@ -1255,4 +1255,19 @@ export const dict = { "error.childStore.persistedProjectIconCreateFailed": "ไม่สามารถสร้างไอคอนโปรเจกต์ถาวร", "error.childStore.storeCreateFailed": "ไม่สามารถสร้างที่เก็บ", "terminal.connectionLost.abnormalClose": "WebSocket ปิดอย่างผิดปกติ: {{code}}", + "command.session.export": "Export session", + "command.session.export.description": "Export the full session transcript as JSON", + "context.export.session": "Export session", + "toast.session.export.success.title": "Session exported", + "toast.session.export.success.description": "Saved session to {{filename}}", + "toast.session.export.failed.title": "Failed to export session", + "toast.session.export.failed.description": "An error occurred while exporting the session", + "common.export": "Export", + "workspace.move.menu.title": "Move session to", + "workspace.lifecycle.starting": "Starting session", + "workspace.onboarding.title": "Isolate sessions with workspaces", + "workspace.onboarding.description": "Each gets its own checkout, so nothing interferes with your local repository", + "session.summary.title": "Session details", + "session.summary.noBranch": "No branch", + "session.summary.basedOn": "Based on {{branch}}", } diff --git a/packages/app/src/i18n/tr.ts b/packages/app/src/i18n/tr.ts index aa02f982821..fe35be7ad32 100644 --- a/packages/app/src/i18n/tr.ts +++ b/packages/app/src/i18n/tr.ts @@ -1277,4 +1277,19 @@ export const dict = { "error.childStore.persistedProjectIconCreateFailed": "Kalıcı proje simgesi oluşturulamadı", "error.childStore.storeCreateFailed": "Depo oluşturulamadı", "terminal.connectionLost.abnormalClose": "WebSocket anormal şekilde kapandı: {{code}}", -} satisfies Partial> + "command.session.export": "Export session", + "command.session.export.description": "Export the full session transcript as JSON", + "context.export.session": "Export session", + "toast.session.export.success.title": "Session exported", + "toast.session.export.success.description": "Saved session to {{filename}}", + "toast.session.export.failed.title": "Failed to export session", + "toast.session.export.failed.description": "An error occurred while exporting the session", + "common.export": "Export", + "workspace.move.menu.title": "Move session to", + "workspace.lifecycle.starting": "Starting session", + "workspace.onboarding.title": "Isolate sessions with workspaces", + "workspace.onboarding.description": "Each gets its own checkout, so nothing interferes with your local repository", + "session.summary.title": "Session details", + "session.summary.noBranch": "No branch", + "session.summary.basedOn": "Based on {{branch}}", +} diff --git a/packages/app/src/i18n/uk.ts b/packages/app/src/i18n/uk.ts index e089b946d7c..57fc2969cf0 100644 --- a/packages/app/src/i18n/uk.ts +++ b/packages/app/src/i18n/uk.ts @@ -1237,8 +1237,12 @@ export const dict = { "settings.workspaces.filter.all": "Усі проєкти", "settings.workspaces.empty": "Немає робочих просторів", "settings.workspaces.count.one": "{{count}} робочий простір", + "settings.workspaces.count.few": "{{count}} робочі простори", + "settings.workspaces.count.many": "{{count}} робочих просторів", "settings.workspaces.count.other": "{{count}} робочих просторів", "settings.workspaces.sessions.one": "{{count}} сесія в {{project}}", + "settings.workspaces.sessions.few": "{{count}} сесії в {{project}}", + "settings.workspaces.sessions.many": "{{count}} сесій у {{project}}", "settings.workspaces.sessions.other": "{{count}} сесій у {{project}}", "settings.workspaces.lastActiveSession": "Останній активний сеанс", "settings.workspaces.deleteAll": "Видалити всі робочі простори", @@ -1255,11 +1259,18 @@ export const dict = { "settings.workspaces.default.local": "Локальний каталог", "settings.workspaces.default.new": "Новий робочий простір", "workspace.move.title": "Перемістити до робочого простору", + "workspace.move.menu.title": "Перемістити сесію до", "workspace.move.failed": "Не вдалося перемістити сеанс", "workspace.lifecycle.creating": "Створення робочого простору", "workspace.lifecycle.created": "Робочий простір створено", + "workspace.lifecycle.starting": "Запуск сесії", + "workspace.onboarding.title": "Ізолюйте сесії за допомогою робочих просторів", + "workspace.onboarding.description": "Кожен отримує власний checkout, тому ніщо не заважає вашому локальному репозиторію", "workspace.lifecycle.moving": "Переміщення до робочого простору", "workspace.lifecycle.set": "Робочий простір установлено", + "session.summary.title": "Відомості про сеанс", + "session.summary.noBranch": "Немає гілки", + "session.summary.basedOn": "На основі {{branch}}", "workspace.type.local": "локальна", "workspace.type.sandbox": "пісочниця", "workspace.create.failed.title": "Не вдалося створити робочу область", @@ -1284,4 +1295,12 @@ export const dict = { "workspace.reset.archived.one": "1 сесію буде заархівовано.", "workspace.reset.archived.many": "{{count}} сесій буде заархівовано.", "workspace.reset.note": "Це скине робочу область, щоб вона відповідала гілці за замовчуванням.", + "command.session.export": "Export session", + "command.session.export.description": "Export the full session transcript as JSON", + "context.export.session": "Export session", + "toast.session.export.success.title": "Session exported", + "toast.session.export.success.description": "Saved session to {{filename}}", + "toast.session.export.failed.title": "Failed to export session", + "toast.session.export.failed.description": "An error occurred while exporting the session", + "common.export": "Export", } diff --git a/packages/app/src/i18n/ur.ts b/packages/app/src/i18n/ur.ts index 661c013ebe7..1f536ef0d87 100644 --- a/packages/app/src/i18n/ur.ts +++ b/packages/app/src/i18n/ur.ts @@ -1148,4 +1148,50 @@ export const dict = { "workspace.reset.archived.one": "1 سیشن آرکائیو کیا جائے گا۔", "workspace.reset.archived.many": "{{count}} سیشنز آرکائیو کیے جائیں گے۔", "workspace.reset.note": "یہ ڈیفالٹ برانچ سے ملنے کے لیے ورک اسپیس کو دوبارہ ترتیب دے گا۔", + "command.session.export": "Export session", + "command.session.export.description": "Export the full session transcript as JSON", + "context.export.session": "Export session", + "toast.session.export.success.title": "Session exported", + "toast.session.export.success.description": "Saved session to {{filename}}", + "toast.session.export.failed.title": "Failed to export session", + "toast.session.export.failed.description": "An error occurred while exporting the session", + "common.export": "Export", + "common.viewAll": "View all", + "session.new.workspace.local.tooltip": "Use current checkout", + "session.new.workspace.new.tooltip": "Create isolated checkout", + "session.new.workspace.fromBranch": "from {{branch}}", + "session.new.workspace.trigger.tooltip": "Select where to run session", + "session.new.workspace.search.placeholder": "Search workspaces", + "settings.tab.workspaces": "Workspaces", + "settings.workspaces.filter.all": "All projects", + "settings.workspaces.empty": "No workspaces", + "settings.workspaces.count.one": "{{count}} workspace", + "settings.workspaces.count.other": "{{count}} workspaces", + "settings.workspaces.sessions.one": "{{count}} session in {{project}}", + "settings.workspaces.sessions.other": "{{count}} sessions in {{project}}", + "settings.workspaces.lastActiveSession": "Last active session", + "settings.workspaces.deleteAll": "Delete all workspaces", + "settings.workspaces.deleteAll.confirm": "Delete all {{count}} workspaces?", + "settings.workspaces.delete.warning": "The workspace directory and branch will be permanently removed. Deletion proceeds only if it is clean, inactive, and has no linked sessions.", + "settings.workspaces.deleteAll.warning": "The {{count}} selected workspaces in {{project}} will be permanently removed only if each is clean, inactive, and has no linked sessions.", + "settings.workspaces.delete.blocked.active": "The active workspace cannot be deleted.", + "settings.workspaces.delete.blocked.linked": "This workspace has linked sessions and cannot be deleted.", + "settings.workspaces.default.title": "Default environment", + "settings.workspaces.default.description": "Choose where new sessions start", + "settings.workspaces.default.lastUsed": "Last used per project", + "settings.workspaces.default.local": "Local directory", + "settings.workspaces.default.new": "New workspace", + "workspace.move.title": "Move to workspace", + "workspace.move.menu.title": "Move session to", + "workspace.move.failed": "Failed to move session", + "workspace.lifecycle.creating": "Creating workspace", + "workspace.lifecycle.created": "Workspace created", + "workspace.lifecycle.starting": "Starting session", + "workspace.onboarding.title": "Isolate sessions with workspaces", + "workspace.onboarding.description": "Each gets its own checkout, so nothing interferes with your local repository", + "workspace.lifecycle.moving": "Moving to workspace", + "workspace.lifecycle.set": "Workspace set", + "session.summary.title": "Session details", + "session.summary.noBranch": "No branch", + "session.summary.basedOn": "Based on {{branch}}", } diff --git a/packages/app/src/i18n/vi.ts b/packages/app/src/i18n/vi.ts index 1e243ba17d6..516b05d823b 100644 --- a/packages/app/src/i18n/vi.ts +++ b/packages/app/src/i18n/vi.ts @@ -1153,4 +1153,50 @@ export const dict = { "workspace.reset.archived.one": "1 phiên sẽ được lưu trữ.", "workspace.reset.archived.many": "{{count}} phiên sẽ được lưu trữ.", "workspace.reset.note": "Điều này sẽ thiết lập lại không gian làm việc để phù hợp với nhánh mặc định.", + "command.session.export": "Export session", + "command.session.export.description": "Export the full session transcript as JSON", + "context.export.session": "Export session", + "toast.session.export.success.title": "Session exported", + "toast.session.export.success.description": "Saved session to {{filename}}", + "toast.session.export.failed.title": "Failed to export session", + "toast.session.export.failed.description": "An error occurred while exporting the session", + "common.export": "Export", + "common.viewAll": "View all", + "session.new.workspace.local.tooltip": "Use current checkout", + "session.new.workspace.new.tooltip": "Create isolated checkout", + "session.new.workspace.fromBranch": "from {{branch}}", + "session.new.workspace.trigger.tooltip": "Select where to run session", + "session.new.workspace.search.placeholder": "Search workspaces", + "settings.tab.workspaces": "Workspaces", + "settings.workspaces.filter.all": "All projects", + "settings.workspaces.empty": "No workspaces", + "settings.workspaces.count.one": "{{count}} workspace", + "settings.workspaces.count.other": "{{count}} workspaces", + "settings.workspaces.sessions.one": "{{count}} session in {{project}}", + "settings.workspaces.sessions.other": "{{count}} sessions in {{project}}", + "settings.workspaces.lastActiveSession": "Last active session", + "settings.workspaces.deleteAll": "Delete all workspaces", + "settings.workspaces.deleteAll.confirm": "Delete all {{count}} workspaces?", + "settings.workspaces.delete.warning": "The workspace directory and branch will be permanently removed. Deletion proceeds only if it is clean, inactive, and has no linked sessions.", + "settings.workspaces.deleteAll.warning": "The {{count}} selected workspaces in {{project}} will be permanently removed only if each is clean, inactive, and has no linked sessions.", + "settings.workspaces.delete.blocked.active": "The active workspace cannot be deleted.", + "settings.workspaces.delete.blocked.linked": "This workspace has linked sessions and cannot be deleted.", + "settings.workspaces.default.title": "Default environment", + "settings.workspaces.default.description": "Choose where new sessions start", + "settings.workspaces.default.lastUsed": "Last used per project", + "settings.workspaces.default.local": "Local directory", + "settings.workspaces.default.new": "New workspace", + "workspace.move.title": "Move to workspace", + "workspace.move.menu.title": "Move session to", + "workspace.move.failed": "Failed to move session", + "workspace.lifecycle.creating": "Creating workspace", + "workspace.lifecycle.created": "Workspace created", + "workspace.lifecycle.starting": "Starting session", + "workspace.onboarding.title": "Isolate sessions with workspaces", + "workspace.onboarding.description": "Each gets its own checkout, so nothing interferes with your local repository", + "workspace.lifecycle.moving": "Moving to workspace", + "workspace.lifecycle.set": "Workspace set", + "session.summary.title": "Session details", + "session.summary.noBranch": "No branch", + "session.summary.basedOn": "Based on {{branch}}", } diff --git a/packages/app/src/i18n/zh.ts b/packages/app/src/i18n/zh.ts index bddf98a4259..b9e5f6f921f 100644 --- a/packages/app/src/i18n/zh.ts +++ b/packages/app/src/i18n/zh.ts @@ -1244,4 +1244,19 @@ export const dict = { "error.childStore.persistedProjectIconCreateFailed": "创建持久化项目图标失败", "error.childStore.storeCreateFailed": "创建存储失败", "terminal.connectionLost.abnormalClose": "WebSocket 异常关闭:{{code}}", -} satisfies Partial> + "command.session.export": "Export session", + "command.session.export.description": "Export the full session transcript as JSON", + "context.export.session": "Export session", + "toast.session.export.success.title": "Session exported", + "toast.session.export.success.description": "Saved session to {{filename}}", + "toast.session.export.failed.title": "Failed to export session", + "toast.session.export.failed.description": "An error occurred while exporting the session", + "common.export": "Export", + "workspace.move.menu.title": "Move session to", + "workspace.lifecycle.starting": "Starting session", + "workspace.onboarding.title": "Isolate sessions with workspaces", + "workspace.onboarding.description": "Each gets its own checkout, so nothing interferes with your local repository", + "session.summary.title": "Session details", + "session.summary.noBranch": "No branch", + "session.summary.basedOn": "Based on {{branch}}", +} diff --git a/packages/app/src/i18n/zht.ts b/packages/app/src/i18n/zht.ts index d3df431e8a6..81c390b81b9 100644 --- a/packages/app/src/i18n/zht.ts +++ b/packages/app/src/i18n/zht.ts @@ -1240,4 +1240,19 @@ export const dict = { "error.childStore.persistedProjectIconCreateFailed": "建立持續性專案圖示失敗", "error.childStore.storeCreateFailed": "建立儲存區失敗", "terminal.connectionLost.abnormalClose": "WebSocket 異常關閉:{{code}}", -} satisfies Partial> + "command.session.export": "Export session", + "command.session.export.description": "Export the full session transcript as JSON", + "context.export.session": "Export session", + "toast.session.export.success.title": "Session exported", + "toast.session.export.success.description": "Saved session to {{filename}}", + "toast.session.export.failed.title": "Failed to export session", + "toast.session.export.failed.description": "An error occurred while exporting the session", + "common.export": "Export", + "workspace.move.menu.title": "Move session to", + "workspace.lifecycle.starting": "Starting session", + "workspace.onboarding.title": "Isolate sessions with workspaces", + "workspace.onboarding.description": "Each gets its own checkout, so nothing interferes with your local repository", + "session.summary.title": "Session details", + "session.summary.noBranch": "No branch", + "session.summary.basedOn": "Based on {{branch}}", +} diff --git a/packages/app/src/pages/new-session/new-session-view.tsx b/packages/app/src/pages/new-session/new-session-view.tsx index 3c84b1d58ef..4e1373bf0f8 100644 --- a/packages/app/src/pages/new-session/new-session-view.tsx +++ b/packages/app/src/pages/new-session/new-session-view.tsx @@ -1,6 +1,6 @@ import { useDialog } from "@opencode-ai/ui/context/dialog" import { Tooltip } from "@opencode-ai/ui/tooltip" -import { Icon as IconV2 } from "@opencode-ai/ui/v2/icon" +import { Icon } from "@opencode-ai/ui/v2/icon" import { TooltipV2 } from "@opencode-ai/ui/v2/tooltip-v2" import { WordmarkV2 } from "@opencode-ai/ui/v2/wordmark-v2" import { Show, createMemo, createSignal, type Accessor } from "solid-js" @@ -33,10 +33,7 @@ export function NewSessionView(props: { }) { const [onboarding, setOnboarding, , onboardingReady] = persisted( Persist.global("workspace-onboarding"), - createStore({ cardDismissed: false, used: false }), - ) - const showCard = createMemo( - () => onboardingReady() && props.workspace.bar.visible() && !onboarding.cardDismissed && !onboarding.used, + createStore({ used: false }), ) const select = (value: string) => { props.workspace.selection.set(value) @@ -151,7 +148,7 @@ function ProviderTip() { > {language.t("home.providerTip")} setPersistedState("dismissedAt", Date.now())} > - +
diff --git a/packages/app/src/pages/session/timeline/message-timeline.tsx b/packages/app/src/pages/session/timeline/message-timeline.tsx index 4ceb43dfa33..d4591bcd2f3 100644 --- a/packages/app/src/pages/session/timeline/message-timeline.tsx +++ b/packages/app/src/pages/session/timeline/message-timeline.tsx @@ -290,7 +290,7 @@ function WorkspaceMoveAction(props: { : "flex h-[46px] w-full items-center gap-2 rounded-b-[6px] px-3 pr-9 pt-2.5 text-[13px] font-[440] leading-5 tracking-[-0.04px] text-v2-text-text-muted focus-visible:outline-none" } > - + {language.t("workspace.move.title")}