diff --git a/apps/app/src/app/app-settings/authorized-folders-panel.tsx b/apps/app/src/app/app-settings/authorized-folders-panel.tsx index 3b4c85c49..66b1554fa 100644 --- a/apps/app/src/app/app-settings/authorized-folders-panel.tsx +++ b/apps/app/src/app/app-settings/authorized-folders-panel.tsx @@ -9,7 +9,7 @@ import { import { Folder, FolderLock, FolderSearch, X } from "lucide-solid"; -import { currentLocale, t } from "../../i18n"; +import { t } from "../../i18n"; import Button from "../components/button"; import type { OpenworkServerCapabilities, @@ -87,7 +87,9 @@ const readAuthorizedFoldersFromConfig = (opencodeConfig: Record const buildAuthorizedFoldersStatus = (preservedCount: number, action?: string) => { const preservedLabel = preservedCount > 0 - ? `Preserving ${preservedCount} non-folder permission ${preservedCount === 1 ? "entry" : "entries"}.` + ? preservedCount === 1 + ? t("context_panel.preserving_entry") + : t("context_panel.preserving_entries", undefined, { count: preservedCount }) : null; if (action && preservedLabel) return `${action} ${preservedLabel}`; return action ?? preservedLabel; @@ -133,13 +135,13 @@ export default function AuthorizedFoldersPanel(props: AuthorizedFoldersPanelProp (props.openworkServerCapabilities?.config?.write ?? false), ); const authorizedFoldersHint = createMemo(() => { - if (!openworkServerReady()) return "OpenWork server is disconnected."; - if (!openworkServerWorkspaceReady()) return "No active server workspace is selected."; + if (!openworkServerReady()) return t("context_panel.server_disconnected"); + if (!openworkServerWorkspaceReady()) return t("context_panel.no_server_workspace"); if (!canReadConfig()) { - return "OpenWork server config access is unavailable for this workspace."; + return t("context_panel.config_access_unavailable"); } if (!canWriteConfig()) { - return "OpenWork server is connected read-only for workspace config."; + return t("context_panel.config_read_only"); } return null; }); @@ -206,14 +208,14 @@ export default function AuthorizedFoldersPanel(props: AuthorizedFoldersPanelProp const openworkWorkspaceId = props.runtimeWorkspaceId; if (!openworkClient || !openworkWorkspaceId || !canWriteConfig()) { setAuthorizedFoldersError( - "A writable OpenWork server workspace is required to update authorized folders.", + t("context_panel.writable_workspace_required"), ); return false; } setAuthorizedFoldersSaving(true); setAuthorizedFoldersError(null); - setAuthorizedFoldersStatus("Saving authorized folders..."); + setAuthorizedFoldersStatus(t("context_panel.saving_folders")); try { const currentConfig = await openworkClient.getConfig(openworkWorkspaceId); @@ -236,7 +238,7 @@ export default function AuthorizedFoldersPanel(props: AuthorizedFoldersPanelProp setAuthorizedFoldersStatus( buildAuthorizedFoldersStatus( Object.keys(currentAuthorizedFolders.hiddenEntries).length, - "Authorized folders updated.", + t("context_panel.folders_updated"), ), ); props.onConfigUpdated(); @@ -257,13 +259,13 @@ export default function AuthorizedFoldersPanel(props: AuthorizedFoldersPanelProp if (!normalized) return; if (workspaceRoot && normalized === workspaceRoot) { setAuthorizedFolderDraft(""); - setAuthorizedFoldersStatus("Workspace root is already available."); + setAuthorizedFoldersStatus(t("context_panel.workspace_root_available")); setAuthorizedFoldersError(null); return; } if (authorizedFolders().includes(normalized)) { setAuthorizedFolderDraft(""); - setAuthorizedFoldersStatus("Folder is already authorized."); + setAuthorizedFoldersStatus(t("context_panel.folder_already_authorized")); setAuthorizedFoldersError(null); return; } @@ -283,7 +285,7 @@ export default function AuthorizedFoldersPanel(props: AuthorizedFoldersPanelProp if (!isTauriRuntime()) return; try { const selection = await pickDirectory({ - title: t("onboarding.authorize_folder", currentLocale()), + title: t("onboarding.authorize_folder"), }); const folder = typeof selection === "string" @@ -297,12 +299,12 @@ export default function AuthorizedFoldersPanel(props: AuthorizedFoldersPanelProp setAuthorizedFolderDraft(normalized); if (workspaceRoot && normalized === workspaceRoot) { setAuthorizedFolderDraft(""); - setAuthorizedFoldersStatus("Workspace root is already available."); + setAuthorizedFoldersStatus(t("context_panel.workspace_root_available")); setAuthorizedFoldersError(null); return; } if (authorizedFolders().includes(normalized)) { - setAuthorizedFoldersStatus("Folder is already authorized."); + setAuthorizedFoldersStatus(t("context_panel.folder_already_authorized")); setAuthorizedFoldersError(null); return; } @@ -321,10 +323,10 @@ export default function AuthorizedFoldersPanel(props: AuthorizedFoldersPanelProp
- Authorized folders + {t("context_panel.authorized_folders")}
- Grant this workspace access to read and edit files in directories outside of its root. + {t("context_panel.authorized_folders_desc")}
@@ -333,7 +335,7 @@ export default function AuthorizedFoldersPanel(props: AuthorizedFoldersPanelProp fallback={
{authorizedFoldersHint() ?? - "Connect to a writable OpenWork server workspace to edit authorized folders."} + t("context_panel.authorized_folders_no_access")}
} > @@ -353,9 +355,9 @@ export default function AuthorizedFoldersPanel(props: AuthorizedFoldersPanelProp
-
No external folders authorized
+
{t("context_panel.no_external_folders")}
- Add a folder to let this workspace read and edit files outside its root directory. + {t("context_panel.add_folder_hint")}
} @@ -380,7 +382,7 @@ export default function AuthorizedFoldersPanel(props: AuthorizedFoldersPanelProp {folderName} - Workspace root + {t("context_panel.workspace_root_badge")} @@ -391,7 +393,7 @@ export default function AuthorizedFoldersPanel(props: AuthorizedFoldersPanelProp when={!isWorkspaceRoot} fallback={ - Always available + {t("context_panel.always_available")} } > @@ -404,7 +406,7 @@ export default function AuthorizedFoldersPanel(props: AuthorizedFoldersPanelProp authorizedFoldersSaving() || !canWriteConfig() } - aria-label={`Remove ${folderName}`} + aria-label={t("context_panel.remove_folder", undefined, { name: folderName })} > @@ -446,7 +448,7 @@ export default function AuthorizedFoldersPanel(props: AuthorizedFoldersPanelProp onPaste={(event) => { event.preventDefault(); }} - placeholder="Type a folder path to authorize..." + placeholder={t("context_panel.input_placeholder")} disabled={ authorizedFoldersLoading() || authorizedFoldersSaving() || @@ -467,7 +469,7 @@ export default function AuthorizedFoldersPanel(props: AuthorizedFoldersPanelProp !canWriteConfig() } > - Browse + {t("context_panel.browse_button")} @@ -482,7 +484,7 @@ export default function AuthorizedFoldersPanel(props: AuthorizedFoldersPanelProp !authorizedFolderDraft().trim() } > - {authorizedFoldersSaving() ? "Adding..." : "Add"} + {authorizedFoldersSaving() ? t("context_panel.adding_button") : t("context_panel.add_button")} diff --git a/apps/app/src/app/components/den-settings-panel.tsx b/apps/app/src/app/components/den-settings-panel.tsx index 3f813a42c..5527443a3 100644 --- a/apps/app/src/app/components/den-settings-panel.tsx +++ b/apps/app/src/app/components/den-settings-panel.tsx @@ -799,7 +799,7 @@ export default function DenSettingsPanel(props: DenSettingsPanelProps) { if (!result.ok) { throw new Error(result.message); } - setStatusMessage(`${result.message} ${t("reload.toast_description", currentLocale())}`); + setStatusMessage(`${result.message} ${t("den.reload_workspace")}`); } catch (error) { setSkillHubActionError(error instanceof Error ? error.message : `Failed to import ${hub.name}.`); } finally { @@ -821,7 +821,7 @@ export default function DenSettingsPanel(props: DenSettingsPanelProps) { if (!result.ok) { throw new Error(result.message); } - setStatusMessage(`${result.message} ${t("reload.toast_description", currentLocale())}`); + setStatusMessage(`${result.message} ${t("den.reload_workspace")}`); } catch (error) { setSkillHubActionError(error instanceof Error ? error.message : `Failed to remove ${imported.name}.`); } finally { @@ -843,7 +843,7 @@ export default function DenSettingsPanel(props: DenSettingsPanelProps) { if (!result.ok) { throw new Error(result.message); } - setStatusMessage(`${result.message} ${t("reload.toast_description", currentLocale())}`); + setStatusMessage(`${result.message} ${t("den.reload_workspace")}`); } catch (error) { setSkillHubActionError(error instanceof Error ? error.message : `Failed to sync ${hub.name}.`); } finally { @@ -861,9 +861,9 @@ export default function DenSettingsPanel(props: DenSettingsPanelProps) { try { const message = await props.connectCloudProvider(cloudProviderId); - setStatusMessage(`${message || `Imported ${providerName}.`} ${t("reload.toast_description", currentLocale())}`); + setStatusMessage(`${message || t("den.imported_provider", undefined, { name: providerName })} ${t("den.reload_workspace")}`); } catch (error) { - setProviderActionError(error instanceof Error ? error.message : `Failed to import ${providerName}.`); + setProviderActionError(error instanceof Error ? error.message : t("den.import_provider_failed", undefined, { name: providerName })); } finally { setProviderActionId(null); setProviderActionKind(null); @@ -879,9 +879,9 @@ export default function DenSettingsPanel(props: DenSettingsPanelProps) { try { const message = await props.removeCloudProvider(cloudProviderId); - setStatusMessage(`${message || `Removed ${providerName}.`} ${t("reload.toast_description", currentLocale())}`); + setStatusMessage(`${message || t("den.removed_provider", undefined, { name: providerName })} ${t("den.reload_workspace")}`); } catch (error) { - setProviderActionError(error instanceof Error ? error.message : `Failed to remove ${providerName}.`); + setProviderActionError(error instanceof Error ? error.message : t("den.remove_provider_failed", undefined, { name: providerName })); } finally { setProviderActionId(null); setProviderActionKind(null); @@ -897,9 +897,9 @@ export default function DenSettingsPanel(props: DenSettingsPanelProps) { try { await props.connectCloudProvider(cloudProviderId); - setStatusMessage(`Synced ${providerName}. ${t("reload.toast_description", currentLocale())}`); + setStatusMessage(`${t("den.synced_provider", undefined, { name: providerName })} ${t("den.reload_workspace")}`); } catch (error) { - setProviderActionError(error instanceof Error ? error.message : `Failed to sync ${providerName}.`); + setProviderActionError(error instanceof Error ? error.message : t("den.sync_provider_failed", undefined, { name: providerName })); } finally { setProviderActionId(null); setProviderActionKind(null); diff --git a/apps/app/src/app/components/model-picker-modal.tsx b/apps/app/src/app/components/model-picker-modal.tsx index 0ce5df734..f63caa9b7 100644 --- a/apps/app/src/app/components/model-picker-modal.tsx +++ b/apps/app/src/app/components/model-picker-modal.tsx @@ -1,7 +1,7 @@ import { For, Show, createEffect, createMemo, createSignal } from "solid-js"; import { CheckCircle2, Circle, Search, X } from "lucide-solid"; -import { t, currentLocale } from "../../i18n"; +import { t } from "../../i18n"; import Button from "./button"; import ProviderIcon from "./provider-icon"; @@ -24,7 +24,7 @@ export type ModelPickerModalProps = { export default function ModelPickerModal(props: ModelPickerModalProps) { let searchInputRef: HTMLInputElement | undefined; - const translate = (key: string) => t(key, currentLocale()); + const translate = (key: string, params?: Record) => t(key, undefined, params); type RenderedItem = | { kind: "model"; opt: ModelOption } @@ -306,9 +306,9 @@ export default function ModelPickerModal(props: ModelPickerModalProps) { {provider.title}
- Connect this provider to browse and save models + {translate("model_picker.connect_provider_hint")} - {provider.matchCount} {provider.matchCount === 1 ? "model" : "models"} + {translate(provider.matchCount === 1 ? "model_picker.model_count_one" : "model_picker.model_count", { count: provider.matchCount })}
@@ -324,12 +324,12 @@ export default function ModelPickerModal(props: ModelPickerModalProps) {

- {props.target === "default" ? "Default model" : "Chat model"} + {translate(props.target === "default" ? "model_picker.default_model_title" : "model_picker.chat_model_title")}

- {props.target === "default" - ? "Choose the default model for new chats, then fine-tune reasoning profiles on its card before pressing Done." - : "Choose the model for this chat. If a model supports reasoning profiles, configure them on its card."} + {translate(props.target === "default" + ? "model_picker.default_model_desc" + : "model_picker.chat_model_desc")}

@@ -364,7 +364,7 @@ export default function ModelPickerModal(props: ModelPickerModalProps) { 0}>
- Recommended + {translate("model_picker.recommended")}
{({ opt, index }) => renderOption(opt, index)}
@@ -373,7 +373,7 @@ export default function ModelPickerModal(props: ModelPickerModalProps) { 0}>
- Other connected models + {translate("model_picker.other_connected_models")}
{({ opt, index }) => renderOption(opt, index)}
@@ -382,7 +382,7 @@ export default function ModelPickerModal(props: ModelPickerModalProps) { 0}>
- More providers + {translate("model_picker.more_providers")}
{(provider) => renderProviderLink(provider, provider.index)} @@ -392,7 +392,7 @@ export default function ModelPickerModal(props: ModelPickerModalProps) {
- No models match your search. + {translate("model_picker.no_results")}
diff --git a/apps/app/src/app/components/session/workspace-session-list.tsx b/apps/app/src/app/components/session/workspace-session-list.tsx index 99dfd0576..f79e7576c 100644 --- a/apps/app/src/app/components/session/workspace-session-list.tsx +++ b/apps/app/src/app/components/session/workspace-session-list.tsx @@ -14,7 +14,7 @@ import { Plus, } from "lucide-solid"; -import { DEFAULT_SESSION_TITLE, getDisplaySessionTitle } from "../../lib/session-title"; +import { getDisplaySessionTitle } from "../../lib/session-title"; import type { WorkspaceInfo } from "../../lib/tauri"; import type { WorkspaceConnectionState, @@ -348,7 +348,7 @@ export default function WorkspaceSessionList(props: Props) { const depth = () => row.depth; const isSelected = () => props.selectedSessionId === session().id; const displayTitle = () => - getDisplaySessionTitle(session().title, DEFAULT_SESSION_TITLE); + getDisplaySessionTitle(session().title); const hasChildren = () => (tree.descendantCountBySessionId.get(session().id) ?? 0) > 0; const hiddenChildCount = () => diff --git a/apps/app/src/app/constants.ts b/apps/app/src/app/constants.ts index 2ad7080c9..b5b18c840 100644 --- a/apps/app/src/app/constants.ts +++ b/apps/app/src/app/constants.ts @@ -1,4 +1,5 @@ import type { ModelRef, SuggestedPlugin } from "./types"; +import { t } from "../i18n"; export const MODEL_PREF_KEY = "openwork.defaultModel"; export const SESSION_MODEL_PREF_KEY = "openwork.sessionModels"; @@ -16,7 +17,7 @@ export const SUGGESTED_PLUGINS: SuggestedPlugin[] = [ { name: "opencode-scheduler", packageName: "opencode-scheduler", - description: "Run scheduled jobs with the OpenCode scheduler plugin.", + get description() { return t("plugins.scheduler_desc"); }, tags: ["automation", "jobs"], installMode: "simple", }, @@ -37,44 +38,44 @@ export const CHROME_DEVTOOLS_MCP_COMMAND = ["npx", "-y", "chrome-devtools-mcp@la export const MCP_QUICK_CONNECT: McpDirectoryInfo[] = [ { - name: "Notion", - description: "Pages, databases, and project docs in sync.", + get name() { return t("mcp.quick_connect_notion_title"); }, + get description() { return t("mcp.quick_connect_notion_desc"); }, url: "https://mcp.notion.com/mcp", type: "remote", oauth: true, }, { - name: "Linear", - description: "Plan sprints and ship tickets faster.", + get name() { return t("mcp.quick_connect_linear_title"); }, + get description() { return t("mcp.quick_connect_linear_desc"); }, url: "https://mcp.linear.app/mcp", type: "remote", oauth: true, }, { - name: "Sentry", - description: "Track releases and resolve production errors.", + get name() { return t("mcp.quick_connect_sentry_title"); }, + get description() { return t("mcp.quick_connect_sentry_desc"); }, url: "https://mcp.sentry.dev/mcp", type: "remote", oauth: true, }, { - name: "Stripe", - description: "Inspect payments, invoices, and subscriptions.", + get name() { return t("mcp.quick_connect_stripe_title"); }, + get description() { return t("mcp.quick_connect_stripe_desc"); }, url: "https://mcp.stripe.com", type: "remote", oauth: true, }, { - name: "Context7", - description: "Search product docs with richer context.", + get name() { return t("mcp.quick_connect_context7_title"); }, + get description() { return t("mcp.quick_connect_context7_desc"); }, url: "https://mcp.context7.com/mcp", type: "remote", oauth: false, }, { id: CHROME_DEVTOOLS_MCP_ID, - name: "Control Chrome", - description: "Drive Chrome tabs with browser automation.", + get name() { return t("mcp.quick_connect_chrome_title"); }, + get description() { return t("mcp.quick_connect_chrome_desc"); }, type: "local", command: [...CHROME_DEVTOOLS_MCP_COMMAND], oauth: false, diff --git a/apps/app/src/app/lib/model-behavior.ts b/apps/app/src/app/lib/model-behavior.ts index a842dbd11..287deb3c8 100644 --- a/apps/app/src/app/lib/model-behavior.ts +++ b/apps/app/src/app/lib/model-behavior.ts @@ -1,6 +1,6 @@ import type { ProviderListItem } from "../types"; import type { ModelBehaviorOption } from "../types"; -import { t, currentLocale } from "../../i18n"; +import { t } from "../../i18n"; type ProviderModel = ProviderListItem["models"][string]; @@ -14,11 +14,13 @@ const WELL_KNOWN_VARIANT_ORDER = [ "max", ] as const; -const DEFAULT_BEHAVIOR_OPTION: ModelBehaviorOption = { - value: null, - label: "Provider default", - description: "Use the model's built-in default reasoning behavior.", -}; +function defaultBehaviorOption(): ModelBehaviorOption { + return { + value: null, + label: t("settings.provider_default_label"), + description: t("settings.provider_default_desc"), + }; +} const humanize = (value: string) => { const cleaned = value.replace(/[_-]+/g, " ").replace(/\s+/g, " ").trim(); @@ -70,51 +72,51 @@ const sortVariantKeys = (keys: string[]) => const getBehaviorTitle = (providerID: string, model: ProviderModel, variantKeys: string[]) => { if (variantKeys.length > 0) { - if (providerID === "anthropic") return "Extended thinking"; - if (providerID === "google") return "Reasoning budget"; + if (providerID === "anthropic") return t("model_behavior.title_extended_thinking"); + if (providerID === "google") return t("model_behavior.title_reasoning_budget"); if ( providerID === "openai" || providerID === "opencode" || variantKeys.some((key) => ["none", "minimal", "low", "medium", "high", "xhigh"].includes(key)) ) { - return "Reasoning effort"; + return t("model_behavior.title_reasoning_effort"); } - return t("app.model_behavior_title", currentLocale()); + return t("app.model_behavior_title"); } - if (model.reasoning) return "Built-in reasoning"; - return "Standard generation"; + if (model.reasoning) return t("model_behavior.title_builtin_reasoning"); + return t("model_behavior.title_standard_generation"); }; const getVariantLabel = (providerID: string, key: string) => { - if (key === "none") return "Fast"; - if (key === "minimal") return "Quick"; - if (key === "low") return "Light"; - if (key === "medium") return "Balanced"; - if (key === "high") return providerID === "anthropic" ? "Extended" : "Deep"; - if (key === "xhigh" || key === "max") return "Maximum"; + if (key === "none") return t("model_behavior.label_fast"); + if (key === "minimal") return t("model_behavior.label_quick"); + if (key === "low") return t("model_behavior.label_light"); + if (key === "medium") return t("model_behavior.label_balanced"); + if (key === "high") return providerID === "anthropic" ? t("model_behavior.label_extended") : t("model_behavior.label_deep"); + if (key === "xhigh" || key === "max") return t("model_behavior.label_maximum"); return humanize(key); }; export const formatGenericBehaviorLabel = (value: string | null) => { const normalized = normalizeModelBehaviorValue(value); - if (!normalized) return DEFAULT_BEHAVIOR_OPTION.label; + if (!normalized) return defaultBehaviorOption().label; return getVariantLabel("generic", normalized); }; const getVariantDescription = (providerID: string, key: string, label: string) => { - if (key === "none") return "Favor speed with the lightest reasoning path."; - if (key === "minimal") return "Use a very small amount of reasoning."; + if (key === "none") return t("model_behavior.desc_none"); + if (key === "minimal") return t("model_behavior.desc_minimal"); if (key === "low") return providerID === "google" - ? "Use a lighter reasoning budget for quicker responses." - : "Use a lighter reasoning pass before answering."; - if (key === "medium") return "Balance speed and reasoning depth."; + ? t("model_behavior.desc_low_google") + : t("model_behavior.desc_low"); + if (key === "medium") return t("model_behavior.desc_medium"); if (key === "high") return providerID === "anthropic" - ? "Use the standard extended-thinking budget." - : "Spend more time reasoning before answering."; + ? t("model_behavior.desc_high_anthropic") + : t("model_behavior.desc_high"); if (key === "xhigh" || key === "max") return providerID === "anthropic" - ? "Use the largest extended-thinking budget available." - : "Use the provider's deepest reasoning profile."; - return `Use the ${label.toLowerCase()} profile.`; + ? t("model_behavior.desc_max_anthropic") + : t("model_behavior.desc_max"); + return t("model_behavior.desc_generic", undefined, { label: label.toLowerCase() }); }; export const getModelBehaviorOptions = ( @@ -124,7 +126,7 @@ export const getModelBehaviorOptions = ( const variantKeys = sortVariantKeys(getVariantKeys(model)); if (!variantKeys.length) return []; return [ - DEFAULT_BEHAVIOR_OPTION, + defaultBehaviorOption(), ...variantKeys.map((key) => { const label = getVariantLabel(providerID, key); return { @@ -161,8 +163,8 @@ export const getModelBehaviorSummary = ( if (options.length > 0) { return { title, - label: selected?.label ?? DEFAULT_BEHAVIOR_OPTION.label, - description: selected?.description ?? DEFAULT_BEHAVIOR_OPTION.description, + label: selected?.label ?? defaultBehaviorOption().label, + description: selected?.description ?? defaultBehaviorOption().description, options, }; } @@ -170,16 +172,16 @@ export const getModelBehaviorSummary = ( if (model.reasoning) { return { title, - label: "Built in", - description: "This model decides its own reasoning path and does not expose profiles here.", + label: t("model_behavior.label_builtin"), + description: t("model_behavior.desc_builtin"), options, }; } return { title, - label: "Standard", - description: "This model does not expose extra reasoning controls.", + label: t("model_behavior.label_standard"), + description: t("model_behavior.desc_standard"), options, }; }; diff --git a/apps/app/src/app/lib/session-title.ts b/apps/app/src/app/lib/session-title.ts index 86e39093b..aea996de9 100644 --- a/apps/app/src/app/lib/session-title.ts +++ b/apps/app/src/app/lib/session-title.ts @@ -1,3 +1,6 @@ +import { t } from "../../i18n"; + +/** Raw English string — used for prefix matching against stored titles. */ export const DEFAULT_SESSION_TITLE = "New session"; const GENERATED_SESSION_TITLE_PREFIX = `${DEFAULT_SESSION_TITLE} - `; @@ -11,9 +14,9 @@ export function isGeneratedSessionTitle(title: string | null | undefined) { export function getDisplaySessionTitle( title: string | null | undefined, - fallback = DEFAULT_SESSION_TITLE, + fallback?: string, ) { const trimmed = title?.trim() ?? ""; - if (!trimmed || isGeneratedSessionTitle(trimmed)) return fallback; + if (!trimmed || isGeneratedSessionTitle(trimmed)) return fallback ?? t("session.default_title"); return trimmed; } diff --git a/apps/app/src/app/lib/workspace-blueprints.ts b/apps/app/src/app/lib/workspace-blueprints.ts index 9a00061e7..671f29338 100644 --- a/apps/app/src/app/lib/workspace-blueprints.ts +++ b/apps/app/src/app/lib/workspace-blueprints.ts @@ -7,6 +7,7 @@ import type { WorkspaceOpenworkConfig, } from "../types"; import { parseTemplateFrontmatter } from "../utils"; +import { t } from "../../i18n"; import browserSetupTemplate from "../data/commands/browser-setup.md?raw"; @@ -15,16 +16,11 @@ const BROWSER_AUTOMATION_QUICKSTART_PROMPT = (() => { return (parsed?.body ?? browserSetupTemplate).trim(); })(); -export const DEFAULT_EMPTY_STATE_COPY = { - title: "What do you want to do?", - body: "Pick a starting point or just type below.", -}; -const DEFAULT_WELCOME_BLUEPRINT_MESSAGES: WorkspaceBlueprintSessionMessage[] = [ +const defaultWelcomeBlueprintMessages = (): WorkspaceBlueprintSessionMessage[] => [ { role: "assistant", - text: - "Hi welcome to OpenWork!\n\nPeople use us to write .csv files on their computer, connect to Chrome and automate repetitive tasks, and sync contacts to Notion.\n\nBut the only limit is your imagination.\n\nWhat would you want to do?", + text: t("blueprint.welcome_message"), }, ]; @@ -32,21 +28,21 @@ export function defaultBlueprintSessionsForPreset(_preset: string): WorkspaceBlu return [ { id: "welcome-to-openwork", - title: "Welcome to OpenWork", - messages: DEFAULT_WELCOME_BLUEPRINT_MESSAGES, + title: t("blueprint.welcome_title"), + messages: defaultWelcomeBlueprintMessages(), openOnFirstLoad: true, }, { id: "csv-playbook", - title: "CSV workflow ideas", + title: t("blueprint.csv_session_title"), messages: [ { role: "assistant", - text: "I can help you generate, clean, merge, and summarize CSV files. What kind of CSV work do you want to automate?", + text: t("blueprint.csv_session_assistant"), }, { role: "user", - text: "I want to combine exports from multiple tools into one clean CSV.", + text: t("blueprint.csv_session_user"), }, ], openOnFirstLoad: false, @@ -129,18 +125,16 @@ export function defaultBlueprintStartersForPreset(preset: string): WorkspaceBlue { id: "automation-command", kind: "prompt", - title: "Create a reusable command", - description: "Turn a repeated workflow into a slash command for this workspace.", - prompt: - "Help me create a reusable /command for this workspace. Ask what workflow I want to automate, then draft the command.", + title: t("blueprint.starter_command_title"), + description: t("blueprint.starter_command_desc"), + prompt: t("blueprint.starter_command_prompt"), }, { id: "automation-blueprint", kind: "session", - title: "Plan an automation blueprint", - description: "Design a repeatable workflow with skills, commands, and handoff steps.", - prompt: - "Help me design a reusable automation blueprint for this workspace. Ask what should be standardized, then propose the workflow.", + title: t("blueprint.starter_blueprint_title"), + description: t("blueprint.starter_blueprint_desc"), + prompt: t("blueprint.starter_blueprint_prompt"), }, ]; case "minimal": @@ -148,9 +142,9 @@ export function defaultBlueprintStartersForPreset(preset: string): WorkspaceBlue { id: "minimal-explore", kind: "prompt", - title: "Explore this workspace", - description: "Summarize the files and suggest the best first task to tackle.", - prompt: "Summarize this workspace, point out the most important files, and suggest the best first task.", + title: t("blueprint.starter_explore_title"), + description: t("blueprint.starter_explore_desc"), + prompt: t("blueprint.starter_explore_prompt"), }, ]; default: @@ -158,23 +152,23 @@ export function defaultBlueprintStartersForPreset(preset: string): WorkspaceBlue { id: "csv-help", kind: "prompt", - title: "Work on a CSV", - description: "Clean up or generate spreadsheet data.", - prompt: "Help me create or edit CSV files on this computer.", + title: t("blueprint.starter_csv_title"), + description: t("blueprint.starter_csv_desc"), + prompt: t("blueprint.starter_csv_prompt"), }, { id: "starter-connect-openai", kind: "action", - title: "Connect ChatGPT", - description: "Add your OpenAi provider so ChatGPT models are ready in new sessions.", + title: t("blueprint.starter_connect_openai_title"), + description: t("blueprint.starter_connect_openai_desc"), action: "connect-openai", }, { id: "browser-automation", kind: "session", - title: "Automate Chrome", - description: "Start a browser automation conversation right away.", - prompt: "Help me connect to Chrome and automate a repetitive task.", + title: t("blueprint.starter_chrome_title"), + description: t("blueprint.starter_chrome_desc"), + prompt: t("blueprint.starter_chrome_prompt"), }, ]; } @@ -184,16 +178,19 @@ export function defaultBlueprintCopyForPreset(preset: string) { switch (preset.trim().toLowerCase()) { case "automation": return { - title: "What do you want to automate?", - body: "Start from a reusable workflow or type your own task below.", + title: t("blueprint.automation_title"), + body: t("blueprint.automation_body"), }; case "minimal": return { - title: "Start with a task", - body: "Ask a question about this workspace or use a starter prompt.", + title: t("blueprint.minimal_title"), + body: t("blueprint.minimal_body"), }; default: - return DEFAULT_EMPTY_STATE_COPY; + return { + title: t("blueprint.empty_title"), + body: t("blueprint.empty_body"), + }; } } diff --git a/apps/app/src/app/pages/extensions.tsx b/apps/app/src/app/pages/extensions.tsx index 3fd5fa489..cc61c3306 100644 --- a/apps/app/src/app/pages/extensions.tsx +++ b/apps/app/src/app/pages/extensions.tsx @@ -75,7 +75,7 @@ export default function ExtensionsView(props: ExtensionsViewProps) {
- {connectedAppsCount()} {connectedAppsCount() === 1 ? t("extensions.app_count_one") : t("extensions.app_count_many")} + {t(connectedAppsCount() === 1 ? "extensions.app_count_one" : "extensions.app_count_many", undefined, { count: connectedAppsCount() })}
@@ -83,7 +83,7 @@ export default function ExtensionsView(props: ExtensionsViewProps) {
- {pluginCount()} {pluginCount() === 1 ? t("extensions.plugin_count_one") : t("extensions.plugin_count_many")} + {t(pluginCount() === 1 ? "extensions.plugin_count_one" : "extensions.plugin_count_many", undefined, { count: pluginCount() })}
diff --git a/apps/app/src/app/pages/session.tsx b/apps/app/src/app/pages/session.tsx index 0863a6c8d..2fd8251ec 100644 --- a/apps/app/src/app/pages/session.tsx +++ b/apps/app/src/app/pages/session.tsx @@ -92,7 +92,7 @@ import { defaultBlueprintCopyForPreset, defaultBlueprintStartersForPreset, } from "../lib/workspace-blueprints"; -import { DEFAULT_SESSION_TITLE, getDisplaySessionTitle } from "../lib/session-title"; +import { getDisplaySessionTitle } from "../lib/session-title"; import { useSessionDisplayPreferences } from "../app-settings/session-display-preferences"; import MessageList from "../components/session/message-list"; @@ -455,7 +455,7 @@ export default function SessionView(props: SessionViewProps) { for (const session of group.sessions) { const sessionId = session.id?.trim() ?? ""; if (!sessionId) continue; - const title = getDisplaySessionTitle(session.title, DEFAULT_SESSION_TITLE); + const title = getDisplaySessionTitle(session.title); const slug = session.slug?.trim() ?? ""; const updatedAt = session.time?.updated ?? session.time?.created ?? 0; out.push({ @@ -2123,7 +2123,7 @@ export default function SessionView(props: SessionViewProps) { if (!id) return ""; for (const group of props.workspaceSessionGroups) { const match = group.sessions.find((session) => session.id === id); - if (match) return getDisplaySessionTitle(match.title, DEFAULT_SESSION_TITLE); + if (match) return getDisplaySessionTitle(match.title); } return ""; } @@ -2209,7 +2209,7 @@ export default function SessionView(props: SessionViewProps) { if (showPendingSessionTransition()) { return pendingSessionTransitionTitle() || t("session.loading_session"); } - return selectedSessionTitle() || DEFAULT_SESSION_TITLE; + return selectedSessionTitle() || t("session.default_title"); }); createEffect(() => { diff --git a/apps/app/src/app/pages/settings.tsx b/apps/app/src/app/pages/settings.tsx index 3bb771544..ea68b5f77 100644 --- a/apps/app/src/app/pages/settings.tsx +++ b/apps/app/src/app/pages/settings.tsx @@ -85,7 +85,7 @@ import { pickFile, sandboxDebugProbe, } from "../lib/tauri"; -import { currentLocale, LANGUAGE_OPTIONS, t, type Language } from "../../i18n"; +import { LANGUAGE_OPTIONS, t, type Language } from "../../i18n"; export type SettingsViewProps = { startupPreference: StartupPreference | null; @@ -229,9 +229,8 @@ export default function SettingsView(props: SettingsViewProps) { const { showThinking, toggleShowThinking } = useSessionDisplayPreferences(); const platform = usePlatform(); const webDeployment = createMemo(() => getOpenWorkDeployment() === "web"); - const translate = (key: string) => t(key, currentLocale()); const engineCustomBinPathLabel = () => - props.engineCustomBinPath.trim() || translate("settings.no_binary_selected"); + props.engineCustomBinPath.trim() || t("settings.no_binary_selected"); const openExternalLink = (url: string) => { const resolved = url.trim(); @@ -242,7 +241,7 @@ export default function SettingsView(props: SettingsViewProps) { const handlePickEngineBinary = async () => { if (!isTauriRuntime()) return; try { - const selected = await pickFile({ title: translate("settings.select_binary") }); + const selected = await pickFile({ title: t("settings.select_binary") }); const path = Array.isArray(selected) ? selected[0] : selected; const trimmed = (path ?? "").trim(); if (!trimmed) return; @@ -315,24 +314,24 @@ export default function SettingsView(props: SettingsViewProps) { const state = updateState(); const version = updateVersion(); if (state === "available") { - return `${translate("session.update_available")}${version ? ` · v${version}` : ""}`; + return `${t("session.update_available")}${version ? ` · v${version}` : ""}`; } if (state === "ready") { - return `${translate("settings.toolbar_ready_to_install")}${version ? ` · v${version}` : ""}`; + return `${t("settings.toolbar_ready_to_install")}${version ? ` · v${version}` : ""}`; } if (state === "downloading") { const downloaded = updateDownloadedBytes() ?? 0; const percent = updateDownloadPercent(); - if (percent != null) return `${translate("session.downloading")} ${percent}%`; - return `${translate("session.downloading")} ${formatBytes(downloaded)}`; + if (percent != null) return `${t("session.downloading")} ${percent}%`; + return `${t("session.downloading")} ${formatBytes(downloaded)}`; } if (state === "checking") { - return translate("settings.checking_for_updates"); + return t("settings.checking_for_updates"); } if (state === "error") { - return translate("settings.update_error"); + return t("settings.update_error"); } - return translate("settings.update_uptodate"); + return t("settings.update_uptodate"); }); const updateToolbarTitle = createMemo(() => { @@ -353,10 +352,10 @@ export default function SettingsView(props: SettingsViewProps) { const updateToolbarActionLabel = createMemo(() => { const state = updateState(); - if (state === "available") return translate("settings.action_download"); - if (state === "ready") return translate("settings.action_install"); - if (state === "error") return translate("common.retry"); - if (state === "idle") return translate("settings.check_update"); + if (state === "available") return t("settings.action_download"); + if (state === "ready") return t("settings.action_install"); + if (state === "error") return t("common.retry"); + if (state === "idle") return t("settings.check_update"); return null; }); @@ -369,7 +368,7 @@ export default function SettingsView(props: SettingsViewProps) { const updateRestartBlockedMessage = createMemo(() => { if (updateState() !== "ready" || !props.anyActiveRuns) return null; - return translate("settings.restart_blocked_message"); + return t("settings.restart_blocked_message"); }); const handleUpdateToolbarAction = () => { @@ -429,18 +428,18 @@ export default function SettingsView(props: SettingsViewProps) { }); const providerConnectedCount = createMemo(() => connectedProviders().length); const providerSourceLabel = (source?: "env" | "api" | "config" | "custom") => { - if (source === "env") return translate("settings.provider_source_env"); - if (source === "api") return translate("providers.api_key_label"); - if (source === "config") return translate("settings.provider_source_config"); - if (source === "custom") return translate("settings.provider_source_custom"); + if (source === "env") return t("settings.provider_source_env"); + if (source === "api") return t("providers.api_key_label"); + if (source === "config") return t("settings.provider_source_config"); + if (source === "custom") return t("settings.provider_source_custom"); return null; }; const canDisconnectProvider = (source?: "env" | "api" | "config" | "custom") => source !== "env"; const providerStatusLabel = createMemo(() => { - if (!providerAvailableCount()) return translate("config.unavailable"); - if (!providerConnectedCount()) return translate("config.status_not_connected"); - return `${providerConnectedCount()} ${translate("settings.suffix_connected")}`; + if (!providerAvailableCount()) return t("config.unavailable"); + if (!providerConnectedCount()) return t("config.status_not_connected"); + return t("settings.connected_count", undefined, { count: providerConnectedCount() }); }); const providerStatusStyle = createMemo(() => { if (!providerAvailableCount()) @@ -451,11 +450,11 @@ export default function SettingsView(props: SettingsViewProps) { }); const providerSummary = createMemo(() => { if (!providerAvailableCount()) - return translate("settings.connect_opencode_hint"); + return t("settings.connect_opencode_hint"); const connected = providerConnectedCount(); const available = providerAvailableCount(); - if (!connected) return `${available} ${translate("settings.suffix_available")}`; - return `${connected} ${translate("settings.suffix_connected")} · ${available} ${translate("settings.suffix_available")}`; + if (!connected) return t("settings.available_count", undefined, { count: available }); + return `${t("settings.connected_count", undefined, { count: connected })} · ${t("settings.available_count", undefined, { count: available })}`; }); const handleOpenProviderAuth = async () => { @@ -467,7 +466,7 @@ export default function SettingsView(props: SettingsViewProps) { await props.openProviderAuthModal(); } catch (error) { const message = - error instanceof Error ? error.message : translate("settings.failed_open_providers"); + error instanceof Error ? error.message : t("settings.failed_open_providers"); setProviderConnectError(message); } }; @@ -485,7 +484,7 @@ export default function SettingsView(props: SettingsViewProps) { typeof window === "undefined" ? true : window.confirm( - `Disconnect ${resolved}? ${translate("settings.disconnect_confirm_suffix")}`, + `Disconnect ${resolved}? ${t("settings.disconnect_confirm_suffix")}`, ); if (!confirmed) return; setProviderDisconnectError(null); @@ -493,12 +492,12 @@ export default function SettingsView(props: SettingsViewProps) { setProviderDisconnectingId(resolved); try { const result = await props.disconnectProvider(resolved); - setProviderDisconnectStatus(result || `${translate("settings.disconnected_prefix")} ${resolved}.`); + setProviderDisconnectStatus(result || `${t("settings.disconnected_prefix")} ${resolved}.`); } catch (error) { const message = error instanceof Error ? error.message - : translate("providers.disconnect_failed"); + : t("providers.disconnect_failed"); setProviderDisconnectError(message); } finally { setProviderDisconnectingId(null); @@ -513,14 +512,14 @@ export default function SettingsView(props: SettingsViewProps) { try { const ok = await props.reconnectOpenworkServer(); if (!ok) { - setOpenworkReconnectError(translate("settings.reconnect_failed")); + setOpenworkReconnectError(t("settings.reconnect_failed")); return; } - setOpenworkReconnectStatus(translate("settings.reconnected")); + setOpenworkReconnectStatus(t("settings.reconnected")); } catch (error) { const message = error instanceof Error ? error.message : String(error); setOpenworkReconnectError( - message || translate("settings.reconnect_server_failed"), + message || t("settings.reconnect_server_failed"), ); } }; @@ -533,13 +532,13 @@ export default function SettingsView(props: SettingsViewProps) { try { const ok = await props.restartLocalServer(); if (!ok) { - setOpenworkRestartError(translate("settings.restart_failed")); + setOpenworkRestartError(t("settings.restart_failed")); return; } - setOpenworkRestartStatus(translate("settings.restarted")); + setOpenworkRestartStatus(t("settings.restarted")); } catch (error) { const message = error instanceof Error ? error.message : String(error); - setOpenworkRestartError(message || translate("settings.restart_server_failed")); + setOpenworkRestartError(message || t("settings.restart_server_failed")); } finally { setOpenworkRestartBusy(false); } @@ -548,11 +547,11 @@ export default function SettingsView(props: SettingsViewProps) { const openworkStatusLabel = createMemo(() => { switch (props.openworkServerStatus) { case "connected": - return translate("config.status_connected"); + return t("config.status_connected"); case "limited": - return translate("config.status_limited"); + return t("config.status_limited"); default: - return translate("config.status_not_connected"); + return t("config.status_not_connected"); } }); @@ -580,9 +579,9 @@ export default function SettingsView(props: SettingsViewProps) { const clientStatusLabel = createMemo(() => { const status = props.opencodeConnectStatus?.status; - if (status === "connecting") return translate("status.connecting"); - if (status === "error") return translate("settings.connection_failed"); - return props.clientConnected ? translate("status.connected") : translate("config.status_not_connected"); + if (status === "connecting") return t("status.connecting"); + if (status === "error") return t("settings.connection_failed"); + return props.clientConnected ? t("status.connected") : t("config.status_not_connected"); }); const clientStatusStyle = createMemo(() => { @@ -603,8 +602,8 @@ export default function SettingsView(props: SettingsViewProps) { }); const engineStatusLabel = createMemo(() => { - if (!isTauriRuntime()) return translate("config.unavailable"); - return props.engineInfo?.running ? translate("status.running") : translate("settings.offline"); + if (!isTauriRuntime()) return t("config.unavailable"); + return props.engineInfo?.running ? t("status.running") : t("settings.offline"); }); const engineStatusStyle = createMemo(() => { @@ -616,10 +615,10 @@ export default function SettingsView(props: SettingsViewProps) { const opencodeConnectStatusLabel = createMemo(() => { const status = props.opencodeConnectStatus?.status; - if (!status) return translate("status.idle"); - if (status === "connected") return translate("status.connected"); - if (status === "connecting") return translate("status.connecting"); - return translate("settings.failed"); + if (!status) return t("status.idle"); + if (status === "connected") return t("status.connected"); + if (status === "connecting") return t("status.connecting"); + return t("settings.failed"); }); const opencodeConnectStatusStyle = createMemo(() => { @@ -639,8 +638,8 @@ export default function SettingsView(props: SettingsViewProps) { }); const opencodeRouterStatusLabel = createMemo(() => { - if (!isTauriRuntime()) return translate("config.unavailable"); - return props.opencodeRouterInfo?.running ? translate("status.running") : translate("settings.offline"); + if (!isTauriRuntime()) return t("config.unavailable"); + return props.opencodeRouterInfo?.running ? t("status.running") : t("settings.offline"); }); const opencodeRouterStatusStyle = createMemo(() => { @@ -676,7 +675,7 @@ export default function SettingsView(props: SettingsViewProps) { const opencodePassword = props.engineInfo?.opencodePassword?.trim() || undefined; if (!workspacePath) { - setOpenCodeRouterRestartError(translate("settings.no_worker_path")); + setOpenCodeRouterRestartError(t("settings.no_worker_path")); return; } setOpenCodeRouterRestarting(true); @@ -744,8 +743,8 @@ export default function SettingsView(props: SettingsViewProps) { }; const orchestratorStatusLabel = createMemo(() => { - if (!props.orchestratorStatus) return translate("config.unavailable"); - return props.orchestratorStatus.running ? translate("status.running") : translate("settings.offline"); + if (!props.orchestratorStatus) return t("config.unavailable"); + return props.orchestratorStatus.running ? t("status.running") : t("settings.offline"); }); const orchestratorStatusStyle = createMemo(() => { @@ -757,10 +756,10 @@ export default function SettingsView(props: SettingsViewProps) { }); const openworkAuditStatusLabel = createMemo(() => { - if (!props.runtimeWorkspaceId) return translate("config.unavailable"); - if (props.openworkAuditStatus === "loading") return translate("settings.audit_loading"); - if (props.openworkAuditStatus === "error") return translate("settings.audit_error"); - return translate("settings.audit_ready"); + if (!props.runtimeWorkspaceId) return t("config.unavailable"); + if (props.openworkAuditStatus === "loading") return t("settings.audit_loading"); + if (props.openworkAuditStatus === "error") return t("settings.audit_error"); + return t("settings.audit_ready"); }); const openworkAuditStatusStyle = createMemo(() => { @@ -780,35 +779,35 @@ export default function SettingsView(props: SettingsViewProps) { () => props.startupPreference === "local", ); const startupLabel = createMemo(() => { - if (props.startupPreference === "local") return translate("settings.startup_local"); - if (props.startupPreference === "server") return translate("settings.startup_server"); - return translate("settings.startup_not_set"); + if (props.startupPreference === "local") return t("settings.startup_local"); + if (props.startupPreference === "server") return t("settings.startup_server"); + return t("settings.startup_not_set"); }); const tabLabel = (tab: SettingsTab) => { switch (tab) { case "den": - return translate("settings.tab_cloud"); + return t("settings.tab_cloud"); case "automations": - return translate("settings.tab_automations"); + return t("settings.tab_automations"); case "skills": - return translate("settings.tab_skills"); + return t("settings.tab_skills"); case "extensions": - return translate("settings.tab_extensions"); + return t("settings.tab_extensions"); case "messaging": - return translate("settings.tab_messaging"); + return t("settings.tab_messaging"); case "advanced": - return translate("settings.tab_advanced"); + return t("settings.tab_advanced"); case "appearance": - return translate("settings.tab_appearance"); + return t("settings.tab_appearance"); case "updates": - return translate("settings.tab_updates"); + return t("settings.tab_updates"); case "recovery": - return translate("settings.tab_recovery"); + return t("settings.tab_recovery"); case "debug": - return translate("settings.tab_debug"); + return t("settings.tab_debug"); default: - return translate("settings.tab_general"); + return t("settings.tab_general"); } }; @@ -844,12 +843,12 @@ export default function SettingsView(props: SettingsViewProps) { const formatActor = (entry: OpenworkAuditEntry) => { const actor = entry.actor; - if (!actor) return translate("settings.actor_unknown"); - if (actor.type === "host") return translate("settings.actor_host"); + if (!actor) return t("settings.actor_unknown"); + if (actor.type === "host") return t("settings.actor_host"); if (actor.type === "remote") { - return actor.clientId ? `${translate("settings.actor_remote")}:${actor.clientId}` : translate("settings.actor_remote"); + return actor.clientId ? `${t("settings.actor_remote")}:${actor.clientId}` : t("settings.actor_remote"); } - return translate("settings.actor_unknown"); + return t("settings.actor_unknown"); }; const formatCapability = (cap?: { @@ -857,56 +856,56 @@ export default function SettingsView(props: SettingsViewProps) { write?: boolean; source?: string; }) => { - if (!cap) return translate("config.unavailable"); - const parts = [cap.read ? translate("settings.cap_read") : null, cap.write ? translate("settings.cap_write") : null] + if (!cap) return t("config.unavailable"); + const parts = [cap.read ? t("settings.cap_read") : null, cap.write ? t("settings.cap_write") : null] .filter(Boolean) .join(" / "); - const label = parts || translate("settings.no_access"); + const label = parts || t("settings.no_access"); return cap.source ? `${label} · ${cap.source}` : label; }; const engineStdout = () => { - if (!isTauriRuntime()) return translate("settings.desktop_only_hint"); - return props.engineInfo?.lastStdout?.trim() || translate("settings.no_stdout"); + if (!isTauriRuntime()) return t("settings.desktop_only_hint"); + return props.engineInfo?.lastStdout?.trim() || t("settings.no_stdout"); }; const engineStderr = () => { - if (!isTauriRuntime()) return translate("settings.desktop_only_hint"); - return props.engineInfo?.lastStderr?.trim() || translate("settings.no_stderr"); + if (!isTauriRuntime()) return t("settings.desktop_only_hint"); + return props.engineInfo?.lastStderr?.trim() || t("settings.no_stderr"); }; const openworkStdout = () => { - if (!props.openworkServerHostInfo) return translate("settings.logs_on_host"); + if (!props.openworkServerHostInfo) return t("settings.logs_on_host"); return ( props.openworkServerHostInfo.lastStdout?.trim() || - translate("settings.no_stdout") + t("settings.no_stdout") ); }; const openworkStderr = () => { - if (!props.openworkServerHostInfo) return translate("settings.logs_on_host"); + if (!props.openworkServerHostInfo) return t("settings.logs_on_host"); return ( props.openworkServerHostInfo.lastStderr?.trim() || - translate("settings.no_stderr") + t("settings.no_stderr") ); }; const opencodeRouterStdout = () => { - if (!isTauriRuntime()) return translate("settings.desktop_only_hint"); + if (!isTauriRuntime()) return t("settings.desktop_only_hint"); return ( - props.opencodeRouterInfo?.lastStdout?.trim() || translate("settings.no_stdout") + props.opencodeRouterInfo?.lastStdout?.trim() || t("settings.no_stdout") ); }; const opencodeRouterStderr = () => { - if (!isTauriRuntime()) return translate("settings.desktop_only_hint"); + if (!isTauriRuntime()) return t("settings.desktop_only_hint"); return ( - props.opencodeRouterInfo?.lastStderr?.trim() || translate("settings.no_stderr") + props.opencodeRouterInfo?.lastStderr?.trim() || t("settings.no_stderr") ); }; const formatOrchestratorBinary = (binary?: OrchestratorBinaryInfo | null) => { - if (!binary) return translate("settings.binary_unavailable"); + if (!binary) return t("settings.binary_unavailable"); const version = binary.actualVersion || binary.expectedVersion || "unknown"; return `${binary.source} · ${version}`; }; @@ -922,7 +921,7 @@ export default function SettingsView(props: SettingsViewProps) { props.orchestratorStatus?.binaries?.opencode?.path ?? "—"; const orchestratorSidecarSummary = () => { const info = props.orchestratorStatus?.sidecar; - if (!info) return translate("settings.sidecar_config_unavailable"); + if (!info) return t("settings.sidecar_config_unavailable"); const source = info.source ?? "auto"; const target = info.target ?? "unknown"; return `${source} · ${target}`; @@ -1111,24 +1110,24 @@ export default function SettingsView(props: SettingsViewProps) { const copyRuntimeDebugReport = async () => { if (typeof navigator === "undefined" || !navigator.clipboard?.writeText) { - setDebugReportStatus(translate("settings.clipboard_unavailable")); + setDebugReportStatus(t("settings.clipboard_unavailable")); return; } try { await navigator.clipboard.writeText(runtimeDebugReportJson()); - setDebugReportStatus(translate("settings.copied_debug_report")); + setDebugReportStatus(t("settings.copied_debug_report")); } catch (error) { setDebugReportStatus( error instanceof Error ? error.message - : translate("settings.copy_failed"), + : t("settings.copy_failed"), ); } }; const exportRuntimeDebugReport = () => { if (typeof window === "undefined" || typeof document === "undefined") { - setDebugReportStatus(translate("settings.export_unavailable")); + setDebugReportStatus(t("settings.export_unavailable")); return; } try { @@ -1145,12 +1144,12 @@ export default function SettingsView(props: SettingsViewProps) { anchor.download = `openwork-debug-report-${stamp}.json`; anchor.click(); window.URL.revokeObjectURL(url); - setDebugReportStatus(translate("settings.exported_debug_report")); + setDebugReportStatus(t("settings.exported_debug_report")); } catch (error) { setDebugReportStatus( error instanceof Error ? error.message - : translate("settings.export_failed"), + : t("settings.export_failed"), ); } }; @@ -1161,24 +1160,24 @@ export default function SettingsView(props: SettingsViewProps) { const copyDeveloperLog = async () => { if (typeof navigator === "undefined" || !navigator.clipboard?.writeText) { - setDevLogStatus("Clipboard is unavailable in this environment."); + setDevLogStatus(t("settings.devlog_clipboard_unavailable")); return; } try { await navigator.clipboard.writeText(developerLogText()); - setDevLogStatus("Copied developer log output."); + setDevLogStatus(t("settings.devlog_copied")); } catch (error) { setDevLogStatus( error instanceof Error ? error.message - : "Failed to copy developer log output.", + : t("settings.devlog_copy_failed"), ); } }; const exportDeveloperLog = () => { if (typeof window === "undefined" || typeof document === "undefined") { - setDevLogStatus("Export is unavailable in this environment."); + setDevLogStatus(t("settings.devlog_export_unavailable")); return; } try { @@ -1195,26 +1194,26 @@ export default function SettingsView(props: SettingsViewProps) { anchor.download = `openwork-dev-log-${stamp}.log`; anchor.click(); window.URL.revokeObjectURL(url); - setDevLogStatus("Exported developer log output."); + setDevLogStatus(t("settings.devlog_exported")); } catch (error) { setDevLogStatus( error instanceof Error ? error.message - : "Failed to export developer log output.", + : t("settings.devlog_export_failed"), ); } }; const clearDeveloperLog = () => { clearDevLogs(); - setDevLogStatus("Cleared developer log output."); + setDevLogStatus(t("settings.devlog_cleared")); }; const revealWorkspaceConfig = async () => { if (!isTauriRuntime() || revealConfigBusy()) return; const path = workspaceConfigPath(); if (!path) { - setConfigActionStatus(translate("settings.select_workspace_first")); + setConfigActionStatus(t("settings.select_workspace_first")); return; } setRevealConfigBusy(true); @@ -1227,12 +1226,12 @@ export default function SettingsView(props: SettingsViewProps) { } else { await revealItemInDir(path); } - setConfigActionStatus(translate("settings.revealed_workspace_config")); + setConfigActionStatus(t("settings.revealed_workspace_config")); } catch (error) { setConfigActionStatus( error instanceof Error ? error.message - : translate("settings.reveal_config_failed"), + : t("settings.reveal_config_failed"), ); } finally { setRevealConfigBusy(false); @@ -1248,7 +1247,7 @@ export default function SettingsView(props: SettingsViewProps) { setConfigActionStatus(result.message); } catch (error) { setConfigActionStatus( - error instanceof Error ? error.message : translate("settings.reset_config_failed"), + error instanceof Error ? error.message : t("settings.reset_config_failed"), ); } finally { setResetConfigBusy(false); @@ -1263,8 +1262,8 @@ export default function SettingsView(props: SettingsViewProps) { ? true : window.confirm( devMode - ? translate("settings.nuke_confirm_dev") - : translate("settings.nuke_confirm_prod"), + ? t("settings.nuke_confirm_dev") + : t("settings.nuke_confirm_prod"), ); if (!confirmed) return; setNukeConfigBusy(true); @@ -1287,12 +1286,12 @@ export default function SettingsView(props: SettingsViewProps) { }); await nukeOpenworkAndOpencodeConfigAndExit(); - setNukeConfigStatus(translate("settings.nuke_success")); + setNukeConfigStatus(t("settings.nuke_success")); } catch (error) { setNukeConfigStatus( error instanceof Error ? error.message - : translate("settings.nuke_failed"), + : t("settings.nuke_failed"), ); setNukeConfigBusy(false); } @@ -1306,15 +1305,15 @@ export default function SettingsView(props: SettingsViewProps) { const report = await sandboxDebugProbe(); setSandboxProbeResult(report); if (report.ready) { - setSandboxProbeStatus(translate("settings.sandbox_probe_success")); + setSandboxProbeStatus(t("settings.sandbox_probe_success")); } else { setSandboxProbeStatus( - report.error?.trim() || translate("settings.sandbox_probe_errors"), + report.error?.trim() || t("settings.sandbox_probe_errors"), ); } } catch (error) { setSandboxProbeStatus( - error instanceof Error ? error.message : translate("settings.sandbox_probe_failed"), + error instanceof Error ? error.message : t("settings.sandbox_probe_failed"), ); } finally { setSandboxProbeBusy(false); @@ -1330,7 +1329,7 @@ export default function SettingsView(props: SettingsViewProps) { setDebugDeepLinkStatus(result.message); } catch (error) { setDebugDeepLinkStatus( - error instanceof Error ? error.message : translate("settings.deeplink_failed"), + error instanceof Error ? error.message : t("settings.deeplink_failed"), ); } finally { setDebugDeepLinkBusy(false); @@ -1351,32 +1350,32 @@ export default function SettingsView(props: SettingsViewProps) { const tabDescription = (tab: SettingsTab) => { switch (tab) { case "den": - return translate("settings.tab_description_den"); + return t("settings.tab_description_den"); case "automations": - return translate("settings.tab_description_automations"); + return t("settings.tab_description_automations"); case "skills": - return translate("settings.tab_description_skills"); + return t("settings.tab_description_skills"); case "extensions": - return translate("settings.tab_description_extensions"); + return t("settings.tab_description_extensions"); case "messaging": - return translate("settings.tab_description_messaging"); + return t("settings.tab_description_messaging"); case "advanced": - return translate("settings.tab_description_advanced"); + return t("settings.tab_description_advanced"); case "appearance": - return translate("settings.tab_description_appearance"); + return t("settings.tab_description_appearance"); case "updates": - return translate("settings.tab_description_updates"); + return t("settings.tab_description_updates"); case "recovery": - return translate("settings.tab_description_recovery"); + return t("settings.tab_description_recovery"); case "debug": - return translate("settings.tab_description_debug"); + return t("settings.tab_description_debug"); default: - return translate("settings.tab_description_general"); + return t("settings.tab_description_general"); } }; const activeTabGroup = createMemo(() => - workspaceTabs().includes(activeTab()) ? translate("settings.group_workspace") : translate("settings.group_global"), + workspaceTabs().includes(activeTab()) ? t("settings.group_workspace") : t("settings.group_global"), ); return ( @@ -1384,7 +1383,7 @@ export default function SettingsView(props: SettingsViewProps) {
@@ -1979,17 +1978,17 @@ export default function SettingsView(props: SettingsViewProps) {
-
{translate("settings.opencode_section_label")}
+
{t("settings.opencode_section_label")}
- {translate("settings.opencode_runtime_desc")} + {t("settings.opencode_runtime_desc")}
-
{translate("settings.enable_exa")}
+
{t("settings.enable_exa")}
- {translate("settings.enable_exa_desc")} + {t("settings.enable_exa_desc")}
- {translate("settings.exa_restart_hint")} + {t("settings.exa_restart_hint")}
-
{translate("settings.developer_mode_title")}
+
{t("settings.developer_mode_title")}
- {translate("settings.developer_mode_desc")} + {t("settings.developer_mode_desc")}
{props.developerMode - ? translate("settings.developer_panel_enabled") - : translate("settings.developer_panel_disabled")} + ? t("settings.developer_panel_enabled") + : t("settings.developer_panel_disabled")}
@@ -2045,10 +2044,10 @@ export default function SettingsView(props: SettingsViewProps) {
- {translate("settings.open_deeplink_title")} + {t("settings.open_deeplink_title")}
- {translate("settings.open_deeplink_desc")} + {t("settings.open_deeplink_desc")}
@@ -2086,10 +2085,10 @@ export default function SettingsView(props: SettingsViewProps) { !debugDeepLinkInput().trim() } > - {debugDeepLinkBusy() ? translate("settings.opening") : translate("settings.open_deeplink_action")} + {debugDeepLinkBusy() ? t("settings.opening") : t("settings.open_deeplink_action")}
- {translate("settings.deeplink_hint")} + {t("settings.deeplink_hint")}
@@ -2105,7 +2104,7 @@ export default function SettingsView(props: SettingsViewProps) {
-
{translate("settings.connection_title")}
+
{t("settings.connection_title")}
{props.headerStatus}
{props.baseUrl} @@ -2126,8 +2125,8 @@ export default function SettingsView(props: SettingsViewProps) { class={`text-dls-secondary ${props.openworkReconnectBusy ? "animate-spin" : ""}`} /> {props.openworkReconnectBusy - ? translate("settings.reconnecting") - : translate("settings.reconnect_server")} + ? t("settings.reconnecting") + : t("settings.reconnect_server")} @@ -2153,7 +2152,7 @@ export default function SettingsView(props: SettingsViewProps) { disabled={props.busy} > - {translate("settings.stop_local_server")} + {t("settings.stop_local_server")} - {translate("settings.disconnect_server")} + {t("settings.disconnect_server")}
@@ -2217,9 +2216,9 @@ export default function SettingsView(props: SettingsViewProps) {
-
{translate("settings.updates_title")}
+
{t("settings.updates_title")}
- {translate("settings.updates_desc")} + {t("settings.updates_desc")}
@@ -2239,10 +2238,10 @@ export default function SettingsView(props: SettingsViewProps) {
- {translate("settings.background_checks_title")} + {t("settings.background_checks_title")}
- {translate("settings.background_checks_desc")} + {t("settings.background_checks_desc")}
-
{translate("settings.auto_update_title")}
+
{t("settings.auto_update_title")}
- {translate("settings.auto_update_desc")} + {t("settings.auto_update_desc")}
@@ -2282,21 +2281,21 @@ export default function SettingsView(props: SettingsViewProps) {
- {translate("settings.update_checking")} + {t("settings.update_checking")} {t("settings.update_available_version", undefined, { version: updateVersion() ?? "" })} - {translate("settings.update_downloading")} + {t("settings.update_downloading")} {t("settings.update_ready_version", undefined, { version: updateVersion() ?? "" })} - {translate("settings.update_check_failed")} + {t("settings.update_check_failed")} - {translate("settings.update_uptodate")} + {t("settings.update_uptodate")}
- {translate("settings.update_check_button")} + {t("settings.update_check_button")} @@ -2358,7 +2357,7 @@ export default function SettingsView(props: SettingsViewProps) { props.busy || updateState() === "downloading" } > - {translate("settings.update_download_button")} + {t("settings.update_download_button")} @@ -2370,7 +2369,7 @@ export default function SettingsView(props: SettingsViewProps) { disabled={props.busy || props.anyActiveRuns} title={updateRestartBlockedMessage() ?? ""} > - {translate("settings.update_install_button")} + {t("settings.update_install_button")}
@@ -2395,13 +2394,13 @@ export default function SettingsView(props: SettingsViewProps) { >
{props.updateEnv?.reason ?? - translate("settings.updates_not_supported")} + t("settings.updates_not_supported")}
} >
- {translate("settings.updates_desktop_only")} + {t("settings.updates_desktop_only")}
@@ -2412,13 +2411,13 @@ export default function SettingsView(props: SettingsViewProps) {
- {translate("settings.workspace_config_title")} + {t("settings.workspace_config_title")}
- {translate("settings.workspace_config_desc")} + {t("settings.workspace_config_desc")}
- {workspaceConfigPath() || translate("settings.no_active_workspace")} + {workspaceConfigPath() || t("settings.no_active_workspace")}
@@ -2463,9 +2462,9 @@ export default function SettingsView(props: SettingsViewProps) {
-
{translate("settings.opencode_cache")}
+
{t("settings.opencode_cache")}
- {translate("settings.opencode_cache_description")} + {t("settings.opencode_cache_description")}
@@ -2481,19 +2480,19 @@ export default function SettingsView(props: SettingsViewProps) { title={ isTauriRuntime() ? "" - : translate("settings.cache_repair_requires_desktop") + : t("settings.cache_repair_requires_desktop") } > - {props.cacheRepairBusy ? translate("settings.repairing_cache") : translate("settings.repair_cache")} + {props.cacheRepairBusy ? t("settings.repairing_cache") : t("settings.repair_cache")}
- {translate("settings.docker_containers_title")} + {t("settings.docker_containers_title")}
- {translate("settings.docker_containers_desc")} + {t("settings.docker_containers_desc")}
@@ -2512,15 +2511,15 @@ export default function SettingsView(props: SettingsViewProps) { } title={ !isTauriRuntime() - ? translate("settings.docker_requires_desktop") + ? t("settings.docker_requires_desktop") : props.anyActiveRuns - ? translate("settings.stop_runs_before_cleanup") + ? t("settings.stop_runs_before_cleanup") : "" } > {props.dockerCleanupBusy - ? translate("settings.removing_containers") - : translate("settings.delete_containers")} + ? t("settings.removing_containers") + : t("settings.delete_containers")}
@@ -2530,7 +2529,7 @@ export default function SettingsView(props: SettingsViewProps) {

- {translate("settings.debug_section_title")} + {t("settings.debug_section_title")}

@@ -2538,10 +2537,10 @@ export default function SettingsView(props: SettingsViewProps) {
- {translate("settings.runtime_debug_title")} + {t("settings.runtime_debug_title")}
- {translate("settings.runtime_debug_desc")} + {t("settings.runtime_debug_desc")}
@@ -2551,7 +2550,7 @@ export default function SettingsView(props: SettingsViewProps) { onClick={copyRuntimeDebugReport} > - {translate("settings.copy_json")} + {t("settings.copy_json")}
@@ -2634,10 +2633,10 @@ export default function SettingsView(props: SettingsViewProps) {
- {translate("settings.sandbox_probe_title")} + {t("settings.sandbox_probe_title")}
- {translate("settings.sandbox_probe_desc")} + {t("settings.sandbox_probe_desc")}
@@ -2668,7 +2667,7 @@ export default function SettingsView(props: SettingsViewProps) {
{t("settings.sandbox_run_id", undefined, { id: result().runId ?? "—" })}
-
{t("settings.sandbox_result", undefined, { status: result().ready ? translate("settings.sandbox_ready") : translate("settings.sandbox_error") })}
+
{t("settings.sandbox_result", undefined, { status: result().ready ? t("settings.sandbox_ready") : t("settings.sandbox_error") })}
{(err) =>
{err()}
}
@@ -2681,7 +2680,7 @@ export default function SettingsView(props: SettingsViewProps) { )}
- {translate("settings.sandbox_export_hint")} + {t("settings.sandbox_export_hint")}
@@ -2689,7 +2688,7 @@ export default function SettingsView(props: SettingsViewProps) {
-
{translate("settings.startup_title")}
+
{t("settings.startup_title")}
@@ -2717,7 +2716,7 @@ export default function SettingsView(props: SettingsViewProps) { onClick={props.stopHost} disabled={props.busy} > - {translate("settings.switch")} + {t("settings.switch")}
@@ -2726,7 +2725,7 @@ export default function SettingsView(props: SettingsViewProps) { class="w-full justify-between group" onClick={props.onResetStartupPreference} > - {translate("settings.reset_startup_pref")} + {t("settings.reset_startup_pref")}

- {translate("settings.startup_reset_hint")} + {t("settings.startup_reset_hint")}

@@ -2746,20 +2745,20 @@ export default function SettingsView(props: SettingsViewProps) { >
-
{translate("settings.engine_title")}
+
{t("settings.engine_title")}
- {translate("settings.engine_desc")} + {t("settings.engine_desc")}
- {translate("settings.startup_remote_warning")} + {t("settings.startup_remote_warning")}
-
{translate("settings.engine_source_debug")}
+
{t("settings.engine_source_debug")}
props.setEngineSource("sidecar")} disabled={props.busy} > - {translate("settings.engine_bundled")} + {t("settings.engine_bundled")}
- {translate("settings.engine_bundled_hint")} + {t("settings.engine_bundled_hint")}
@@ -2815,7 +2814,7 @@ export default function SettingsView(props: SettingsViewProps) { >
- {translate("settings.custom_binary_label")} + {t("settings.custom_binary_label")}
- {translate("settings.choose")} + {t("settings.choose")}
- {translate("settings.custom_binary_hint")} + {t("settings.custom_binary_hint")}
-
{translate("settings.engine_runtime_label")}
+
{t("settings.engine_runtime_label")}
- {translate("settings.runtime_applies_hint")} + {t("settings.runtime_applies_hint")}
@@ -2894,18 +2893,18 @@ export default function SettingsView(props: SettingsViewProps) {
- {translate("settings.reset_recovery_title")} + {t("settings.reset_recovery_title")}
- {translate("settings.reset_recovery_desc")} + {t("settings.reset_recovery_desc")}
-
{translate("settings.reset_onboarding_title")}
+
{t("settings.reset_onboarding_title")}
- {translate("settings.reset_onboarding_description")} + {t("settings.reset_onboarding_description")}
-
{translate("settings.reset_app_data_title")}
+
{t("settings.reset_app_data_title")}
- {translate("settings.reset_app_data_description")} + {t("settings.reset_app_data_description")}
- {translate("settings.reset_requires_confirm")} + {t("settings.reset_requires_confirm")}
-
{translate("settings.devtools_title")}
+
{t("settings.devtools_title")}
- {translate("settings.devtools_desc")} + {t("settings.devtools_desc")}
- {translate("settings.service_restarts_title")} + {t("settings.service_restarts_title")}
- {translate("settings.service_restarts_desc")} + {t("settings.service_restarts_desc")}
@@ -2986,8 +2985,8 @@ export default function SettingsView(props: SettingsViewProps) { class={`w-3.5 h-3.5 mr-1.5 ${openworkRestartBusy() ? "animate-spin" : ""}`} /> {openworkRestartBusy() - ? translate("settings.restarting") - : translate("settings.restart_orchestrator")} + ? t("settings.restarting") + : t("settings.restart_orchestrator")}
@@ -3059,10 +3058,10 @@ export default function SettingsView(props: SettingsViewProps) {
- {translate("settings.versions_title")} + {t("settings.versions_title")}
- {translate("settings.versions_desc")} + {t("settings.versions_desc")}
@@ -3091,10 +3090,10 @@ export default function SettingsView(props: SettingsViewProps) {
- {translate("settings.opencode_sdk_title")} + {t("settings.opencode_sdk_title")}
- {translate("settings.opencode_engine_sidecar_desc")} + {t("settings.opencode_engine_sidecar_desc")}
- {props.engineInfo?.baseUrl ?? translate("settings.base_url_unavailable")} + {props.engineInfo?.baseUrl ?? t("settings.base_url_unavailable")}
{props.engineInfo?.projectDir ?? - translate("settings.no_project_directory")} + t("settings.no_project_directory")}
{t("settings.diag_pid", undefined, { pid: String(props.engineInfo?.pid ?? "—") })} @@ -3118,7 +3117,7 @@ export default function SettingsView(props: SettingsViewProps) {
- {translate("settings.last_stdout")} + {t("settings.last_stdout")}
                             {engineStdout()}
@@ -3126,7 +3125,7 @@ export default function SettingsView(props: SettingsViewProps) {
                         
- {translate("settings.last_stderr")} + {t("settings.last_stderr")}
                             {engineStderr()}
@@ -3139,10 +3138,10 @@ export default function SettingsView(props: SettingsViewProps) {
                       
- {translate("settings.orchestrator_daemon_title")} + {t("settings.orchestrator_daemon_title")}
- {translate("settings.orchestrator_daemon_layer_desc")} + {t("settings.orchestrator_daemon_layer_desc")}
{props.orchestratorStatus?.dataDir ?? - translate("settings.data_dir_unavailable")} + t("settings.data_dir_unavailable")}
{t("settings.diag_daemon_url", undefined, { url: props.orchestratorStatus?.daemon?.baseUrl ?? "—" })} @@ -3181,7 +3180,7 @@ export default function SettingsView(props: SettingsViewProps) {
- {translate("settings.last_error")} + {t("settings.last_error")}
                             {props.orchestratorStatus?.lastError}
@@ -3194,10 +3193,10 @@ export default function SettingsView(props: SettingsViewProps) {
                       
- {translate("settings.opencode_sdk_title")} + {t("settings.opencode_sdk_title")}
- {translate("settings.opencode_sdk_desc")} + {t("settings.opencode_sdk_desc")}
{props.opencodeConnectStatus?.baseUrl ?? - translate("settings.opencode_url_unavailable")} + t("settings.opencode_url_unavailable")}
{props.opencodeConnectStatus?.directory ?? - translate("settings.no_worker_directory")} + t("settings.no_worker_directory")}
{t("settings.diag_last_attempt", undefined, { time: opencodeConnectTimestamp() ?? "—" })} @@ -3260,7 +3259,7 @@ export default function SettingsView(props: SettingsViewProps) {
- {translate("settings.last_error")} + {t("settings.last_error")}
                             {props.opencodeConnectStatus?.error}
@@ -3273,10 +3272,10 @@ export default function SettingsView(props: SettingsViewProps) {
                       
- {translate("settings.openwork_server_label")} + {t("settings.openwork_server_label")}
- {translate("settings.openwork_config_sidecar_desc")} + {t("settings.openwork_config_sidecar_desc")}
{(props.openworkServerHostInfo?.baseUrl ?? props.openworkServerUrl) || - translate("settings.base_url_unavailable")} + t("settings.base_url_unavailable")}
{t("settings.diag_pid", undefined, { pid: String(props.openworkServerHostInfo?.pid ?? "—") })} @@ -3298,7 +3297,7 @@ export default function SettingsView(props: SettingsViewProps) {
- {translate("settings.last_stdout")} + {t("settings.last_stdout")}
                             {openworkStdout()}
@@ -3306,7 +3305,7 @@ export default function SettingsView(props: SettingsViewProps) {
                         
- {translate("settings.last_stderr")} + {t("settings.last_stderr")}
                             {openworkStderr()}
@@ -3319,10 +3318,10 @@ export default function SettingsView(props: SettingsViewProps) {
                       
- {translate("settings.opencode_router_sidecar")} + {t("settings.opencode_router_sidecar")}
- {translate("settings.messaging_bridge_service")} + {t("settings.messaging_bridge_service")}
{props.opencodeRouterInfo?.opencodeUrl?.trim() || - translate("settings.opencode_url_unavailable")} + t("settings.opencode_url_unavailable")}
{props.opencodeRouterInfo?.workspacePath?.trim() || - translate("settings.no_worker_directory")} + t("settings.no_worker_directory")}
{t("settings.diag_health_port", undefined, { port: String(props.opencodeRouterInfo?.healthPort ?? "—") })} @@ -3360,8 +3359,8 @@ export default function SettingsView(props: SettingsViewProps) { class={`w-3.5 h-3.5 mr-1.5 ${opencodeRouterRestarting() ? "animate-spin" : ""}`} /> {opencodeRouterRestarting() - ? translate("settings.restarting") - : translate("settings.restart_opencode_router")} + ? t("settings.restarting") + : t("settings.restart_opencode_router")}
@@ -3382,7 +3381,7 @@ export default function SettingsView(props: SettingsViewProps) {
- {translate("settings.last_stdout")} + {t("settings.last_stdout")}
                             {opencodeRouterStdout()}
@@ -3390,7 +3389,7 @@ export default function SettingsView(props: SettingsViewProps) {
                         
- {translate("settings.last_stderr")} + {t("settings.last_stderr")}
                             {opencodeRouterStderr()}
@@ -3403,7 +3402,7 @@ export default function SettingsView(props: SettingsViewProps) {
                   
- {translate("settings.openwork_diagnostics_title")} + {t("settings.openwork_diagnostics_title")}
{props.openworkServerDiagnostics?.version ?? "—"} @@ -3413,7 +3412,7 @@ export default function SettingsView(props: SettingsViewProps) { when={props.openworkServerDiagnostics} fallback={
- {translate("settings.diagnostics_unavailable")} + {t("settings.diagnostics_unavailable")}
} > @@ -3434,7 +3433,7 @@ export default function SettingsView(props: SettingsViewProps) { {t("settings.diag_runtime_workspace", undefined, { id: diag().activeWorkspaceId ?? "—" })}
- {t("settings.diag_config_path", undefined, { path: diag().server.configPath ?? translate("settings.diag_default") })} + {t("settings.diag_config_path", undefined, { path: diag().server.configPath ?? t("settings.diag_default") })}
{t("settings.diag_token_source", undefined, { source: diag().tokenSource.client })}
@@ -3448,19 +3447,19 @@ export default function SettingsView(props: SettingsViewProps) {
- {translate("settings.capabilities_title")} + {t("settings.capabilities_title")}
{props.runtimeWorkspaceId ? t("settings.worker_id_label", undefined, { id: props.runtimeWorkspaceId }) - : translate("settings.worker_unresolved")} + : t("settings.worker_unresolved")}
- {translate("settings.capabilities_unavailable")} + {t("settings.capabilities_unavailable")}
} > @@ -3474,15 +3473,15 @@ export default function SettingsView(props: SettingsViewProps) {
{t("settings.cap_proxy", undefined, { value: caps().proxy?.opencodeRouter - ? translate("settings.enabled") - : translate("settings.disabled") + ? t("settings.enabled") + : t("settings.disabled") })}
{t("settings.cap_browser_tools", undefined, { value: (() => { const browser = caps().toolProviders?.browser; - if (!browser?.enabled) return translate("settings.disabled"); + if (!browser?.enabled) return t("settings.disabled"); return `${browser.mode} · ${browser.placement}`; })() })} @@ -3491,10 +3490,10 @@ export default function SettingsView(props: SettingsViewProps) { {t("settings.cap_file_tools", undefined, { value: (() => { const files = caps().toolProviders?.files; - if (!files) return translate("config.unavailable"); + if (!files) return t("config.unavailable"); const parts = [ - files.injection ? translate("settings.cap_inbox_on") : translate("settings.cap_inbox_off"), - files.outbox ? translate("settings.cap_outbox_on") : translate("settings.cap_outbox_off"), + files.injection ? t("settings.cap_inbox_on") : t("settings.cap_inbox_off"), + files.outbox ? t("settings.cap_outbox_on") : t("settings.cap_outbox_off"), ]; return parts.join(" · "); })() @@ -3505,8 +3504,8 @@ export default function SettingsView(props: SettingsViewProps) { value: (() => { const sandbox = caps().sandbox; return sandbox - ? `${sandbox.backend} (${sandbox.enabled ? translate("settings.on") : translate("settings.off")})` - : translate("config.unavailable"); + ? `${sandbox.backend} (${sandbox.enabled ? t("settings.on") : t("settings.off")})` + : t("config.unavailable"); })() })}
@@ -3518,14 +3517,14 @@ export default function SettingsView(props: SettingsViewProps) {
- {translate("settings.pending_permissions")} + {t("settings.pending_permissions")}
                         {props.safeStringify(props.pendingPermissions)}
                       
-
{translate("settings.recent_events")}
+
{t("settings.recent_events")}
                         {props.safeStringify(props.events)}
                       
@@ -3535,7 +3534,7 @@ export default function SettingsView(props: SettingsViewProps) {
- {translate("settings.workspace_debug_events_label")} + {t("settings.workspace_debug_events_label")}
@@ -3554,7 +3553,7 @@ export default function SettingsView(props: SettingsViewProps) {
                   
- {translate("settings.audit_log_title")} + {t("settings.audit_log_title")}
0} fallback={
- {translate("settings.no_audit_entries")} + {t("settings.no_audit_entries")}
} > @@ -3605,12 +3604,12 @@ export default function SettingsView(props: SettingsViewProps) {
- {translate("settings.reset_openwork_title")} + {t("settings.reset_openwork_title")}
{opencodeDevModeEnabled() - ? translate("settings.reset_openwork_desc_dev") - : translate("settings.reset_openwork_desc_prod")} + ? t("settings.reset_openwork_desc_dev") + : t("settings.reset_openwork_desc_prod")}
{opencodeDevModeEnabled() - ? translate("settings.dev_mode_badge") - : translate("settings.production_mode_badge")} + ? t("settings.dev_mode_badge") + : t("settings.production_mode_badge")}
- {translate("settings.quit_hint")} + {t("settings.quit_hint")}
@@ -3639,11 +3638,11 @@ export default function SettingsView(props: SettingsViewProps) { > {nukeConfigBusy() - ? translate("settings.removing_local_state") - : translate("settings.delete_local_config")} + ? t("settings.removing_local_state") + : t("settings.delete_local_config")}
- {translate("settings.nuke_hint")} + {t("settings.nuke_hint")}
diff --git a/apps/app/src/app/system-state.ts b/apps/app/src/app/system-state.ts index a2c7caf2f..133f213bd 100644 --- a/apps/app/src/app/system-state.ts +++ b/apps/app/src/app/system-state.ts @@ -2,6 +2,7 @@ import { createEffect, createMemo, createSignal, type Accessor } from "solid-js" import type { Session } from "@opencode-ai/sdk/v2/client"; import type { ProviderListItem } from "./types"; +import { t } from "../i18n"; import { check } from "@tauri-apps/plugin-updater"; import { relaunch } from "@tauri-apps/plugin-process"; @@ -144,7 +145,7 @@ export function createSystemState(options: { function openResetModal(mode: ResetOpenworkMode) { if (anyActiveRuns()) { - options.setError("Stop active runs before resetting."); + options.setError(t("system.stop_active_runs_before_reset")); return; } @@ -158,7 +159,7 @@ export function createSystemState(options: { if (resetModalBusy()) return; if (anyActiveRuns()) { - options.setError("Stop active runs before resetting."); + options.setError(t("system.stop_active_runs_before_reset")); return; } @@ -216,60 +217,20 @@ export function createSystemState(options: { } const reloadCopy = createMemo(() => { + const title = t("system.reload_required"); const reasons = reloadReasons(); - if (!reasons.length) { - return { - title: "Reload required", - body: "OpenWork detected changes that require reloading the OpenCode instance.", - }; - } - - if (reasons.length === 1 && reasons[0] === "plugins") { - return { - title: "Reload required", - body: "OpenCode loads npm plugins at startup. Reload the engine to apply opencode.json changes.", - }; - } - - if (reasons.length === 1 && reasons[0] === "skills") { - return { - title: "Reload required", - body: "OpenCode can cache skill discovery/state. Reload the engine to make newly installed skills available.", - }; - } - - if (reasons.length === 1 && reasons[0] === "agents") { - return { - title: "Reload required", - body: "OpenCode loads agents at startup. Reload the engine to make updated agents available.", - }; - } - - if (reasons.length === 1 && reasons[0] === "commands") { - return { - title: "Reload required", - body: "OpenCode loads commands at startup. Reload the engine to make updated commands available.", - }; - } - - if (reasons.length === 1 && reasons[0] === "config") { - return { - title: "Reload required", - body: "OpenCode reads opencode.json at startup. Reload the engine to apply configuration changes.", - }; - } - - if (reasons.length === 1 && reasons[0] === "mcp") { - return { - title: "Reload required", - body: "OpenCode loads MCP servers at startup. Reload the engine to activate the new connection.", - }; - } - return { - title: "Reload required", - body: "OpenWork detected OpenCode configuration changes. Reload the engine to apply them.", - }; + const bodyKey = + reasons.length === 1 && reasons[0] === "plugins" ? "system.reload_body_plugins" + : reasons.length === 1 && reasons[0] === "skills" ? "system.reload_body_skills" + : reasons.length === 1 && reasons[0] === "agents" ? "system.reload_body_agents" + : reasons.length === 1 && reasons[0] === "commands" ? "system.reload_body_commands" + : reasons.length === 1 && reasons[0] === "config" ? "system.reload_body_config" + : reasons.length === 1 && reasons[0] === "mcp" ? "system.reload_body_mcp" + : reasons.length > 0 ? "system.reload_body_mixed" + : "system.reload_body_default"; + + return { title, body: t(bodyKey) }; }); const canReloadEngine = createMemo(() => { @@ -293,7 +254,7 @@ export function createSystemState(options: { const override = options.canReloadWorkspaceEngine?.(); if (override === false) { - setReloadError("Reload is unavailable for this worker."); + setReloadError(t("system.reload_unavailable")); return; } @@ -309,7 +270,7 @@ export function createSystemState(options: { if (options.reloadWorkspaceEngine) { const ok = await options.reloadWorkspaceEngine(); if (ok === false) { - setReloadError("Failed to reload the engine."); + setReloadError(t("system.reload_failed")); return; } } else { @@ -379,7 +340,7 @@ export function createSystemState(options: { async function repairOpencodeCache() { if (!isTauriRuntime()) { - setCacheRepairResult("Cache repair requires the desktop app."); + setCacheRepairResult(t("system.cache_repair_requires_desktop")); return; } @@ -397,9 +358,9 @@ export function createSystemState(options: { } if (result.removed.length) { - setCacheRepairResult("OpenCode cache repaired. Restart the engine if it was running."); + setCacheRepairResult(t("settings.cache_repaired")); } else { - setCacheRepairResult("No OpenCode cache found. Nothing to repair."); + setCacheRepairResult(t("settings.cache_nothing_to_repair")); } } catch (e) { setCacheRepairResult(e instanceof Error ? e.message : safeStringify(e)); @@ -410,7 +371,7 @@ export function createSystemState(options: { async function cleanupOpenworkDockerContainers() { if (!isTauriRuntime()) { - setDockerCleanupResult("Docker cleanup requires the desktop app."); + setDockerCleanupResult(t("system.docker_cleanup_requires_desktop")); return; } @@ -463,7 +424,7 @@ export function createSystemState(options: { updateStatus().state === "idle" ? (updateStatus() as { state: "idle"; lastCheckedAt: number | null }).lastCheckedAt : null, - message: env.reason ?? "Updates are not supported in this environment.", + message: env.reason ?? t("system.updates_not_supported"), }); } return; @@ -578,7 +539,7 @@ export function createSystemState(options: { if (!pending) return; if (anyActiveRuns()) { - options.setError("Stop active runs before installing an update."); + options.setError(t("system.stop_runs_before_update")); return; } diff --git a/apps/app/src/app/utils/index.ts b/apps/app/src/app/utils/index.ts index afdebaddb..39d24c186 100644 --- a/apps/app/src/app/utils/index.ts +++ b/apps/app/src/app/utils/index.ts @@ -1,4 +1,5 @@ import type { Part, Session } from "@opencode-ai/sdk/v2/client"; +import { t } from "../../i18n"; import type { ArtifactItem, MessageGroup, @@ -256,19 +257,19 @@ export function formatRelativeTime(timestampMs: number) { const delta = Date.now() - timestampMs; if (delta < 0) { - return "just now"; + return t("time.just_now"); } if (delta < 60_000) { - return `${Math.max(1, Math.round(delta / 1000))}s ago`; + return t("time.seconds_ago", undefined, { count: Math.max(1, Math.round(delta / 1000)) }); } if (delta < 60 * 60_000) { - return `${Math.max(1, Math.round(delta / 60_000))}m ago`; + return t("time.minutes_ago", undefined, { count: Math.max(1, Math.round(delta / 60_000)) }); } if (delta < 24 * 60 * 60_000) { - return `${Math.max(1, Math.round(delta / (60 * 60_000)))}h ago`; + return t("time.hours_ago", undefined, { count: Math.max(1, Math.round(delta / (60 * 60_000))) }); } return new Date(timestampMs).toLocaleDateString(); diff --git a/apps/app/src/i18n/locales/en.ts b/apps/app/src/i18n/locales/en.ts index ed04e2129..a5783b179 100644 --- a/apps/app/src/i18n/locales/en.ts +++ b/apps/app/src/i18n/locales/en.ts @@ -4,2044 +4,199 @@ */ export default { - // ==================== Dashboard ==================== - "dashboard.title": "Dashboard", - "dashboard.sessions": "Sessions", - "dashboard.commands": "Commands", - "dashboard.skills": "Skills", - "dashboard.plugins": "Plugins", - "dashboard.mcps": "Apps", - "dashboard.settings": "Settings", - "dashboard.home": "Home", - "dashboard.runs": "Runs", - "dashboard.find_workspace": "Find workspace...", - "dashboard.workspaces": "Workspaces", - "dashboard.no_workspaces": "No matching workspaces.", - "dashboard.new_workspace": "New Workspace...", - "dashboard.new_remote_workspace": "Add Remote Workspace...", - "dashboard.forget_workspace": "Forget workspace", - "dashboard.remote": "Remote", - "dashboard.connection": "Connection", - "dashboard.local_engine": "Local Engine", - "dashboard.client_mode": "Client Mode", - "dashboard.connected": "Connected", - "dashboard.not_connected": "Not connected", - "dashboard.stop_disconnect": "Stop & Disconnect", - "dashboard.disconnect": "Disconnect", - "dashboard.new_task": "New Task", - "dashboard.new": "New", - "dashboard.busy": "Busy", - "dashboard.hero_title": "What should we do today?", - "dashboard.hero_description": - "Describe an outcome. OpenWork will run it and keep an audit trail.", - "dashboard.quick_start_commands": "Quick Start Commands", - "dashboard.view_all": "View all", - "dashboard.no_commands": - "No commands yet. Starter commands will appear here.", - "dashboard.run_command": "Run a saved command", - "dashboard.recent_sessions": "Recent Sessions", - "dashboard.this_workspace": "this workspace", - "dashboard.no_sessions": "No sessions yet.", - "dashboard.idle": "Idle", - "dashboard.running": "Running", - "dashboard.completed": "Completed", - "dashboard.failed": "Failed", - "dashboard.repairing_cache": "Repairing cache", - "dashboard.repair_cache": "Repair cache", - "dashboard.retry": "Retry", - "dashboard.alpha": "Alpha", - "dashboard.create_workspace_title": "Create Workspace", - "dashboard.create_workspace_subtitle": - "Initialize a new folder-based workspace.", - "dashboard.create_workspace_confirm": "Create Workspace", - "dashboard.create_sandbox_confirm": "Create as sandbox", - "share_skill_destination.title": "Where should this skill go?", - "share_skill_destination.subtitle": - "Choose an existing workspace or create a new one before importing this shared skill.", - "share_skill_destination.skill_label": "Shared skill", - "share_skill_destination.fallback_skill_name": "Shared skill", - "share_skill_destination.trigger_label": "Trigger", - "share_skill_destination.current_badge": "Current", - "share_skill_destination.existing_workers": "Existing workspaces", - "share_skill_destination.no_workers": - "No workspaces are ready yet. Create one or connect a remote workspace to install this skill.", - "share_skill_destination.new_destination": "New destination", - "share_skill_destination.selection_ready": "Ready to add", - "share_skill_destination.selected_badge": "Selected", - "share_skill_destination.selected_hint": - "Selected. Review the destination below, then confirm.", - "share_skill_destination.footer_idle": "Choose a workspace to continue.", - "share_skill_destination.footer_selected": "Selected workspace:", - "share_skill_destination.confirm_button": "Add skill to workspace", - "share_skill_destination.confirm_busy": "Adding skill...", - "share_skill_destination.local_badge": "Local", - "share_skill_destination.remote_badge": "Remote", - "share_skill_destination.sandbox_badge": "Sandbox", - "share_skill_destination.create_worker": "Create new workspace", - "share_skill_destination.create_worker_desc": - "Open the workspace setup flow, then add this skill after the new workspace is ready.", - "share_skill_destination.connect_remote": "Connect remote workspace", - "share_skill_destination.connect_remote_desc": - "Attach an OpenWork host, then choose it from the list to import this skill.", - "dashboard.sandbox_get_ready_title": "Sandboxes need Docker", - "dashboard.sandbox_get_ready_action": "Get your system ready", - "dashboard.sandbox_get_ready_desc": - "Run this workspace in an isolated Docker container for safer, more reproducible runs.", - "dashboard.sandbox_checking_docker": "Checking Docker...", - "dashboard.create_remote_workspace_title": "Add Remote Workspace", - "dashboard.create_remote_workspace_subtitle": - "Save an OpenWork server as a workspace.", - "dashboard.create_remote_workspace_confirm": "Add Workspace", - "dashboard.edit_remote_workspace_title": "Edit Remote Connection", - "dashboard.edit_remote_workspace_subtitle": - "Update the OpenWork server details for this workspace.", - "dashboard.edit_remote_workspace_confirm": "Save connection", - "dashboard.remote_workspace_title": "Remote workspace", - "dashboard.remote_workspace_hint": - "Track an OpenWork server and reconnect anytime.", - "dashboard.remote_base_url_label": "OpenWork server URL", - "dashboard.remote_base_url_placeholder": "http://127.0.0.1:", - "dashboard.remote_base_url_required": "Add a server URL to continue.", - "dashboard.openwork_host_label": "OpenWork server URL", - "dashboard.openwork_host_placeholder": "https://your-server.openwork.app", - "dashboard.openwork_host_hint": "Use the URL shared by your OpenWork server.", - "dashboard.openwork_host_token_label": "Collaborator or owner token", - "dashboard.openwork_host_token_placeholder": "Paste your token", - "dashboard.openwork_host_token_hint": - "Optional. Paste a collaborator token for routine access or an owner token when this client must answer permission prompts.", - "dashboard.remote_mode_openwork_alpha": "OpenWork server", - "dashboard.remote_mode_direct": "Direct (legacy)", - "dashboard.remote_connection_openwork": "OpenWork", - "dashboard.remote_connection_direct": "Direct", - "dashboard.remote_directory_label": "Workspace directory (optional)", - "dashboard.remote_directory_placeholder": "/home/team/project", - "dashboard.remote_directory_hint": "Leave blank to use the server default.", - "dashboard.remote_display_name_label": "Display name (optional)", - "dashboard.remote_display_name_placeholder": "Design team workspace", - "dashboard.select_folder": "Select Folder", - "dashboard.choose_folder": "Choose a folder", - "dashboard.choose_folder_next": "Share files with your workspace.", - "dashboard.change": "Change", - "dashboard.opening": "Opening...", - "dashboard.choose_preset": "Choose Preset", - "dashboard.choose_folder_continue": "Choose a folder to continue.", - "dashboard.starter_workspace": "Starter workspace", - "dashboard.starter_workspace_desc": - "Preconfigured to show you how to use plugins, commands, and skills.", - "dashboard.empty_workspace": "Empty workspace", - "dashboard.empty_workspace_desc": - "Start with a blank folder and add what you need.", - "dashboard.blueprints_workspace": "Blueprints", - "dashboard.blueprints_workspace_desc": - "Start with an automation-ready workspace for reusable skills, commands, and shared flows.", - - // ==================== Workspace ==================== - "workspace.rename_title": "Edit workspace name", - "workspace.rename_description": "Update the name shown in the sidebar.", - "workspace.rename_label": "Workspace name", - "workspace.rename_placeholder": "Design team workspace", - - // ==================== Session ==================== - "session.no_selected": "No session selected", - "session.back_to_dashboard": "Back to dashboard", - "session.new_task": "New task", - "session.recents": "Recents", - "session.recents_notice": - "These tasks run locally and aren't synced across devices.", - "session.ready_to_work_title": "Ready to work", - "session.ready_to_work_description": - "Describe a task. I'll show progress and ask for permissions when needed.", - "session.document_label": "Document", - "session.standard_label": "Standard", - "session.no_artifacts_fallback": "No artifacts yet.", - "session.active_plugins_label": "Active plugins", - "session.active_plugins_count": "{count}", - "session.no_plugins_loaded": "No plugins loaded.", - "session.selected_folders_label": "Selected folders", - "session.selected_folders_count": "{count}", - "session.working_files_label": "Working files", - "session.none_yet_label": "None yet.", - "session.permission_required_title": "Permission Required", - "session.permission_required_description": - "OpenCode is requesting permission to continue.", - "session.permission_label_uppercase": "Permission", - "session.scope_label_uppercase": "Scope", - "session.details_label": "Details", - "session.steps_notice_text": "Steps will show as the task unfolds.", - "session.ready_to_work": "Ready to work", - "session.ready_description": - "Describe a task. I'll show progress and ask for permissions when needed.", - "session.hide_steps": "Hide steps", - "session.view_steps": "View steps", - "session.open": "Open", - "session.reveal": "Reveal", - "session.opened_toast": "Opened in default app.", - "session.revealed_toast": "Revealed in file manager.", - "session.artifact_path_missing": "Artifact path missing.", - "session.desktop_only": "Open is only available in the desktop app.", - "session.open_failed": "Could not open artifact.", - "session.model": "Model", - "session.ready": "Ready", - "session.connect_provider": "Connect a provider to customize this.", - "session.running": "Running", - "session.progress": "Progress", - "session.steps_notice": "Steps will show as the task unfolds.", - "session.artifacts": "Artifacts", - "session.no_artifacts": "No artifacts yet.", - "session.context": "Context", - "session.active_plugins": "Active plugins", - "session.no_plugins": "No plugins loaded.", - "session.selected_folders": "Selected folders", - "session.working_files": "Working files", - "session.none_yet": "None yet.", - "session.document": "Document", - "session.standard": "Standard", - "session.try_notion_prompt": "Try it now: set up my CRM in Notion", - "session.insert_prompt": "Insert prompt", - "session.placeholder": "Ask OpenWork...", - "session.run": "Run", - "session.permission_required": "Permission Required", - "session.permission_description": - "OpenCode is requesting permission to continue.", - "session.permission_label": "Permission", - "session.scope_label": "Scope", - "session.details": "Details", - "session.deny": "Deny", - "session.once": "Once", - "session.allow_for_session": "Allow for session", - - "session.tasks_local_hint": - "These tasks run locally and aren't synced across devices.", - "session.recents_label": "Recents", - "session.model_standard": "Standard", - "session.run_button_title": "Run", - "session.rename_title": "Rename session", - "session.rename_description": "Update the name for this session.", - "session.rename_label": "Session name", - "session.rename_placeholder": "Enter a new name", - "session.provider_connected": "Provider connected", - "session.oauth_failed": "OAuth failed", - "session.api_key_saved": "API key saved", - "session.failed_to_save_api_key": "Failed to save API key", - "session.quick_actions_title": "Quick actions (Ctrl/Cmd+K)", - "session.quick_actions_label": "Quick actions", - "session.menu_label": "Menu", - "session.search_conversation_title": "Search conversation (Ctrl/Cmd+F)", - "session.search_conversation_label": "Search conversation", - "session.undo_title": "Undo last message", - "session.revert_label": "Revert", - "session.redo_title": "Redo last reverted message", - "session.redo_aria_label": "Redo last reverted message", - // ==================== Commands ==================== - "commands.new": "New", - "commands.empty_state": - "Save a prompt or command so you can run it again in one tap.", - "commands.workspace": "This workspace", - "commands.global": "Every workspace", - "commands.other": "Other commands", - "commands.run": "Run", - "commands.modal_title": "Save a reusable flow", - "commands.modal_description": "Store a prompt or command for quick reuse.", - "commands.name_label": "Command name", - "commands.name_placeholder": "e.g. daily-standup", - "commands.name_hint": "This becomes /daily-standup in OpenCode.", - "commands.description_label": "Description (optional)", - "commands.description_placeholder": "What does this command do?", - "commands.template_label": "Instructions", - "commands.template_placeholder": "Write the instructions you want to reuse…", - "commands.template_hint": "Use $ARGUMENTS to accept details.", - "commands.details_required": "Details", - "commands.default_description": "Run a saved command", - "commands.command_label": "Command", - "commands.details_label": "Details", - "commands.details_placeholder": "Add optional details", - "commands.details_hint": "These details are passed to the command.", - "commands.run_modal_title": "Run command", - "commands.run_modal_description": "Add optional details before running.", - "commands.run_modal_run": "Run command", - "commands.name_will_be": "Will be created as", - "commands.override_title": "Replace existing command?", - "commands.override_description": "A command with this name already exists.", - "commands.override_warning": - 'This will replace the existing "{name}" command. This action cannot be undone.', - "commands.override_confirm": "Replace", - "commands.override_cancel": "Keep existing", - - // ==================== Skills ==================== - "skills.title": "Skills", - "skills.subtitle": "Manage skills for this workspace.", - "skills.refresh": "Refresh", - "skills.add_title": "Add skills", - "skills.add_description": - "Install a starter command, import a skill, or open the folder.", - "skills.install_from_openpackage": "Install from OpenPackage", - "skills.host_mode_only": "Local workspace only", - "skills.install": "Install", - "skills.installed_label": "Installed", - "skills.install_hint": - "Installs OpenPackage packages into the current workspace. Skills should land in `.opencode/skills`.", - "skills.import_local": "Import local skill", - "skills.import_local_hint": - "Copy an existing skill folder into this workspace.", - "skills.import": "Import", - "skills.curated_packages": "Curated packages", - "skills.view": "View", - "skills.search_placeholder": - "Search packages or lists (e.g. claude, registry, community)", - "skills.no_matches": "No curated matches. Try a different search.", - "skills.install_package": "Install", - "skills.registry_notice": - "Publishing to the OpenPackage registry requires authentication today. A registry search + curated list sync is planned.", - "skills.installed": "Installed skills", - "skills.no_skills": - "No skills detected in `.opencode/skills`, `.claude/skills`, or `~/.agents/skills`.", - "skills.desktop_required": "Skill management requires the desktop app.", - "skills.host_only_error": - "Skill management requires a local workspace or connected OpenWork server.", - "skills.install_skill_creator": "Install skill creator", - "skills.install_skill_creator_hint": - "This skill allows you to create other skills from within the chat.", - "skills.installing_skill_creator": "Installing skill creator...", - "skills.skill_creator_installed": "Skill creator installed.", - "skills.skill_creator_already_installed": - "Skill creator is already installed.", - "skills.install_failed": "Skill install failed.", - "skills.reveal_folder": "Open skills folder", - "skills.reveal_folder_hint": "Open the skill directory in Finder.", - "skills.reveal_button": "Reveal in Finder", - "skills.reveal_failed": "Failed to open skills folder.", - "skills.uninstall": "Uninstall", - "skills.uninstall_title": "Uninstall skill?", - "skills.uninstall_warning": - "This will permanently delete the `{name}` skill from your workspace.", - "skills.uninstall_failed": "Failed to uninstall skill.", - "skills.uninstalled": "Skill removed.", - "skills.share_title": "Share skill", - "skills.share_chooser_subtitle": - "Save to your OpenWork Cloud organization or publish a public install link.", - "skills.share_subtitle_public": - "Anyone with the link can install this skill.", - "skills.share_subtitle_team": "Stored in your organization for teammates.", - "skills.share_option_team_title": "Share with team", - "skills.share_option_team_desc": - "Add this skill to your active OpenWork Cloud organization.", - "skills.share_option_public_title": "Public link", - "skills.share_option_public_desc": - "Create a link anyone can use to install this skill.", - "skills.share_public_intro": - "Publish a public link. Anyone with the URL can install this skill.", - "skills.share_publisher_label": "Publisher", - "skills.share_public_create": "Create link", - "skills.share_public_regenerate": "Regenerate link", - "skills.share_public_creating": "Publishing…", - "skills.share_copy_link": "Copy", - "skills.share_team_intro": - "Save this skill to your active organization so teammates can install it from Cloud.", - "skills.share_team_org_fallback": "Active Cloud org", - "skills.share_team_hub_label": "Add to skill hub (optional)", - "skills.share_team_hub_none": "Organization only — not in a hub", - "skills.share_team_hubs_loading": "Loading hubs…", - "skills.share_team_sign_in": "Sign in to share with team", - "skills.share_team_sign_in_hint": - "OpenWork Cloud opens in your browser. Return here after signing in.", - "skills.share_team_save": "Save to team", - "skills.share_team_saving": "Saving…", - "skills.share_team_success": - "Saved to {org}. Teammates can install it from your organization skills.", - "skills.share_team_choose_org": - "Choose an organization in Settings → Cloud before sharing with your team.", - "skills.share_back": "Back", - "skills.share_close": "Close", - "skills.share_done": "Done", - "skills.source_placeholder": "github:anthropics/claude-code", - "skills.notion_crm_title": "Notion CRM Enrichment Skills", - "skills.notion_crm_description": - "Add enrichment workflows for contacts, pipelines, and follow-ups.", - "skills.notion_crm_card_description": - "Enrich Notion CRM data with ready-made skills.", - "skills.connect_host_to_load": "Connect an OpenWork server to load skills.", - "skills.pick_workspace_first": "Pick a workspace folder first.", - "skills.no_skills_found": "No skills found yet.", - "skills.installed_description": "Skills available in this workspace.", - "skills.failed_to_load": "Failed to load skills", - "skills.plugin_management_host_only": - "Plugin management requires the desktop app.", - "skills.plugins_host_only": "Plugins are only available in the desktop app.", - "skills.pick_project_for_plugins": - "Pick a project folder to manage project plugins.", - "skills.pick_project_for_active": - "Pick a project folder to load active plugins.", - "skills.no_opencode_found": - "No opencode.json found yet. Add a plugin to create one.", - "skills.no_opencode_workspace": "No opencode.json in this workspace yet.", - "skills.failed_parse_opencode": "Failed to parse opencode.json", - "skills.failed_load_opencode": "Failed to load opencode.json", - "skills.failed_load_active": "Failed to load active plugins.", - "skills.enter_plugin_name": "Enter a plugin package name.", - "skills.plugin_already_listed": "Plugin already listed in opencode.json.", - "skills.failed_update_opencode": "Failed to update opencode.json", - "skills.opackage_install_host_only": - "OpenPackage installs require the desktop app.", - "skills.pick_project_first": "Pick a project folder first.", - "skills.enter_opackage_source": - "Enter an OpenPackage source (e.g. github:anthropics/claude-code).", - "skills.installing_opackage": "Installing OpenPackage...", - "skills.install_complete": "Installed.", - "skills.curated_list_notice": - "This is a curated list, not an OpenPackage yet. Copy the link or watch the PRD for planned registry search integration.", - "skills.import_host_only": "Skill import requires the desktop app.", - "skills.select_skill_folder": "Select skill folder", - "skills.import_failed": "Import failed ({status})", - "skills.imported": "Imported.", - "skills.unknown_error": "Unknown error", - "skills.filter_all": "All", - "skills.filter_installed": "Installed", - "skills.filter_cloud": "Team", - "skills.filter_hub": "Hub", - "skills.catalog_search_placeholder": "Search installed, team, and hub skills", - "skills.cloud_section_title": "From your organization", - "skills.cloud_section_subtitle": - "Skills shared with you through OpenWork Cloud — including team skill hubs you can access.", - "skills.cloud_refresh": "Refresh team skills", - "skills.cloud_org_fallback": "OpenWork Cloud", - "skills.cloud_sign_in_hint": - "Sign in to OpenWork Cloud to browse team and org skills.", - "skills.cloud_sign_in": "Sign in to Cloud", - "skills.cloud_choose_org_hint": - "Choose an organization in Settings → Cloud to load team skills.", - "skills.cloud_choose_org_detail": - "Use the Cloud panel to pick your active org, then refresh this list.", - "skills.cloud_org_empty": "No organization skills are available yet.", - "skills.cloud_org_load_failed": "Failed to load organization skills.", - "skills.cloud_no_search_matches": "No skills match that search.", - "skills.cloud_install_need_server": - "Connect to an OpenWork server with skills write access to install team skills on this worker.", - "skills.cloud_installed": "Installed {name} on this worker.", - "skills.cloud_installing": "Installing {title}…", - "skills.cloud_installing_short": "Installing", - "skills.cloud_add_skill": "Add skill", - "skills.cloud_badge": "Cloud", - "skills.cloud_hub_label": "Hub: {name}", - "skills.cloud_shared_org": "Org", - "skills.cloud_shared_public": "Public", - "skills.cloud_footer_label": "Team", - - // ==================== Plugins ==================== - "plugins.title": "OpenCode plugins", - "plugins.description": - "Manage `opencode.json` for your project or global OpenCode plugins.", - "plugins.config_label": "Config", - "plugins.config_not_loaded": "Not loaded yet", - "plugins.suggested_label": "Suggested plugins", - "plugins.no_plugins_yet": "No plugins configured yet.", - "plugins.enabled_label": "Enabled", - "plugins.open_label": "Open", - "plugins.path_label": "Path", - "plugins.scope_project": "Project", - "plugins.scope_global": "Global", - "plugins.refresh": "Refresh", - "plugins.config": "Config", - "plugins.not_loaded": "Not loaded yet", - "plugins.suggested": "Suggested plugins", - "plugins.hide_setup": "Hide setup", - "plugins.setup": "Setup", - "plugins.added": "Added", - "plugins.add": "Add", - "plugins.enabled": "Enabled", - "plugins.no_plugins": "No plugins configured yet.", - "plugins.add_label": "Add plugin", - "plugins.placeholder": "opencode-wakatime", - "plugins.add_hint": "Add npm package names, e.g. opencode-wakatime", - - // ==================== Apps (MCP) ==================== - "mcp.apps_title": "Apps", - "mcp.apps_subtitle": - "Connect your favorite tools so OpenWork can use them on your behalf.", - "mcp.app_connected": "app connected", - "mcp.apps_connected": "apps connected", - "mcp.title": "Apps", - "mcp.description": "Connect your tools with one click.", - "mcp.alpha_banner_title": - "Apps are in early access while we polish the experience.", - "mcp.alpha_banner_help": - "If you want to help, open a PR and include a short video showing the sign-in flow works end to end.", - "mcp.mcps_title": "Apps", - "mcp.connect_mcp_hint": "Connect apps to expand what OpenWork can do.", - "mcp.finish_setup": "Almost there", - "mcp.finish_setup_hint": "Tap Activate to finish connecting your app.", - "mcp.activate_button": "Activate", - "mcp.reload_banner_title": "Almost there", - "mcp.reload_banner_description": - "Tap Activate to finish connecting your app.", - "mcp.reload_banner_description_blocked": - "A task is running. Stop it first, then activate.", - "mcp.reload_banner_blocked_hint": "Stop the running task to activate.", - "mcp.available_apps": "Available apps", - "mcp.one_click_connect": "One-click connect", - "mcp.tap_to_connect": "Tap to connect", - "mcp.connected_badge": "Connected", - "mcp.your_apps": "Your apps", - "mcp.last_synced": "Synced", - "mcp.no_apps_yet": "No apps connected yet", - "mcp.no_apps_hint": "Connect one above to get started.", - "mcp.quick_connect_title": "Available apps", - "mcp.oauth_only_label": "One-click", - "mcp.connected_status": "Connected", - "mcp.no_env_vars": "No extra setup needed.", - "mcp.connected_title": "Your apps", - "mcp.from_opencode_json": "From config", - "mcp.no_servers_yet": "No apps connected yet.", - "mcp.edit_config_title": "Edit config file", - "mcp.edit_config_description": - "Apps are stored in your workspace config file.", - "mcp.docs_link": "Learn more", - "mcp.scope_project": "This workspace", - "mcp.scope_global": "All workspaces", - "mcp.config_label": "Config", - "mcp.config_file": "Config file", - "mcp.config_not_loaded": "Not loaded yet", - "mcp.open_file_label": "Open file", - "mcp.reveal_in_finder": "Show in Finder", - "mcp.opening_label": "Opening...", - "mcp.file_not_found": "Config file not created yet", - "mcp.config_load_failed": "Couldn't load the config file", - "mcp.open_file": "Open file", - "mcp.pick_workspace_error": "Choose a workspace folder first.", - "mcp.reveal_config_failed": "Couldn't open the config file", - "mcp.alpha_warning": - "Apps are in early access while we polish the experience.", - "mcp.github_issue": "View issue #9510 on GitHub", - "mcp.contribution_guide": - "If you want to help, open a PR and include a short video showing the sign-in flow works end to end.", - "mcp.advanced_settings": "Advanced settings", - "mcp.advanced_settings_hint": - "Edit config files and manage connections manually.", - "mcp.hide_advanced": "Hide advanced settings", - "mcp.show_advanced": "Show advanced settings", - "mcp.mcps_label": "Apps", - "mcp.mcps_description": "Connect apps to expand what OpenWork can do.", - "mcp.configured": "configured", - "mcp.updated": "Synced", - "mcp.reload_required": "Activation needed", - "mcp.reload_description": "Activate to start using the new connection.", - "mcp.reload_engine": "Activate", - "mcp.quick_connect": "Available apps", - "mcp.oauth_only": "One-click", - "mcp.connecting": "Connecting...", - "mcp.connect": "Connect", - "mcp.connected": "Connected", - "mcp.connected_label": "Connected", - "mcp.no_env_required": "No extra setup needed.", - "mcp.config_source": "From config", - "mcp.no_servers": "No apps connected yet.", - "mcp.advanced": "Advanced", - "mcp.advanced_description": "For custom connections.", - "mcp.hide": "Hide", - "mcp.show": "Show", - "mcp.server_name": "App name", - "mcp.server_name_placeholder": "github-copilot", - "mcp.server_url": "Server URL", - "mcp.server_url_placeholder": "https://api.githubcopilot.com/mcp/", - "mcp.oauth": "Sign in", - "mcp.api_key": "API key", - "mcp.enabled": "Enabled", - "mcp.disabled": "Disabled", - "mcp.add_mcp": "Add app", - "mcp.verify_connection": "Test connection", - "mcp.cli_guidance": "Terminal command (advanced)", - "mcp.config_locations": - "Config can live in opencode.json, opencode.jsonc, or .opencode/opencode.json.", - "mcp.app_details": "App details", - "mcp.details_title": "App details", - "mcp.select_app_hint": "Select an app to see details.", - "mcp.select_server_hint": "Select an app to see details.", - "mcp.connection_type": "Connection", - "mcp.type_cloud": "Cloud (sign in with your account)", - "mcp.type_local": "Local (runs on this device)", - "mcp.capabilities_label": "Features", - "mcp.cap_tools": "AI tools", - "mcp.cap_signin": "Account sign-in", - "mcp.tools_enabled_label": "AI tools", - "mcp.oauth_ready_label": "Account sign-in", - "mcp.usage_hint_text": - "Mention the app name in your prompt to use its tools.", - "mcp.issue_label": "Issue", - "mcp.technical_details": "Technical details", - "mcp.next_steps_label": "What to do", - "mcp.reload_step": "Activate after connecting a new app.", - "mcp.auth_step": "Sign in when prompted.", - "mcp.connection_failed": "Connection issue — try again", - "mcp.needs_auth": "Sign in required", - "mcp.register_client": "Setup required", - "mcp.status_disabled": "Paused", - "mcp.disconnected": "Offline", - "mcp.failed": "Issue", - "mcp.friendly_status_ready": "Ready", - "mcp.friendly_status_needs_signin": "Sign in needed", - "mcp.friendly_status_paused": "Paused", - "mcp.friendly_status_offline": "Offline", - "mcp.friendly_status_issue": "Issue", - "mcp.host_mode_only": "Apps require the desktop app.", - "mcp.pick_workspace_first": "Choose a workspace folder first.", - "mcp.desktop_required": "Apps require the desktop app.", - "mcp.connect_server_first": "Connect to the server first.", - "mcp.reload_required_after_add": "Activate to start using the new app.", - "mcp.connect_failed": "Couldn't connect. Try again.", - "mcp.enter_name_and_url": "Enter an app name and URL.", - "mcp.enter_url_first": "Enter a URL first.", - "mcp.use_debug_command": "Run opencode mcp debug to troubleshoot.", - "mcp.add_failed": "Couldn't add the app.", - "mcp.remove_app": "Remove", - "mcp.remove_failed": "Couldn't remove the app.", - "mcp.remove_modal_title": "Remove app", - "mcp.remove_modal_message": - "Are you sure you want to remove {server}? You can always add it back later.", - - // Add MCP Modal - "mcp.add_modal_title": "Add Custom App", - "mcp.add_modal_subtitle": - "Connect a custom MCP server by URL or local command.", - "mcp.custom_app_cta_hint": - "Connect your own MCP server, internal tool, or hosted app.", - "mcp.server_type": "Type", - "mcp.type_remote": "Remote (URL)", - "mcp.type_local_cmd": "Local (command)", - "mcp.server_command": "Command", - "mcp.server_command_placeholder": - "npx -y @modelcontextprotocol/server-sequential-thinking", - "mcp.server_command_hint": "The shell command to start the server.", - "mcp.sign_in_section_label": "Sign-in", - "mcp.oauth_optional_label": "This app requires sign-in", - "mcp.oauth_optional_hint": - "Uses OAuth in the browser to connect your account.", - "mcp.remote_workspace_url_hint": - "Remote workers connect fastest with URL-based MCP servers.", - "mcp.add_server_button": "Add App", - "mcp.name_required": "Enter a server name.", - "mcp.url_or_command_required": - "Enter a URL for remote or a command for local servers.", - "mcp.control_chrome_setup_title": "Set up Control Chrome", - "mcp.control_chrome_setup_subtitle": - "Turn on Chrome access, then choose whether OpenWork should use its own clean profile or attach to the Chrome you already use.", - "mcp.control_chrome_browser_title": "1. Turn on Chrome access", - "mcp.control_chrome_browser_hint": "In Chrome 144 or newer, do this first:", - "mcp.control_chrome_browser_step_one": - "Open chrome://inspect/#remote-debugging.", - "mcp.control_chrome_browser_step_two": "Enable remote debugging.", - "mcp.control_chrome_browser_step_three": - "Allow incoming debugging connections when Chrome asks.", - "mcp.control_chrome_docs": "Official MCP guide", - "mcp.control_chrome_profile_title": "2. Choose which Chrome to use", - "mcp.control_chrome_profile_hint": - "Control Chrome normally opens a separate Chrome profile. Turn this on if you want OpenWork to reuse the Chrome window you already have open.", - "mcp.control_chrome_toggle_label": "Use my existing Chrome profile", - "mcp.control_chrome_toggle_hint": - "When this is on, OpenWork adds --autoConnect so the MCP attaches to a Chrome instance you already started.", - "mcp.control_chrome_toggle_on": - "OpenWork will reuse your current tabs, cookies, and sign-ins.", - "mcp.control_chrome_toggle_off": - "OpenWork will launch a separate Chrome profile just for automation.", - "mcp.control_chrome_connect": "Add Control Chrome", - "mcp.control_chrome_save": "Save settings", - "mcp.control_chrome_edit": "Edit settings", - - "mcp.logout_label": "OAuth", - "mcp.logout_action": "Log out", - "mcp.logout_working": "Logging out...", - "mcp.logout_hint": - "Removes stored OAuth credentials. You'll need to sign in again.", - "mcp.login_action": "Sign in", - "mcp.login_hint": "Connect your account to finish setting up this app.", - "mcp.login_unavailable": "This app does not support sign-in from OpenWork.", - "mcp.logout_modal_title": "Log out of this app?", - "mcp.logout_modal_message": - "This will remove stored OAuth credentials for {server}. You'll need to sign in again to use this app.", - "mcp.logout_success": "Logged out of {server}.", - "mcp.logout_failed": "Failed to log out.", - - // MCP Auth Modal - "mcp.auth.open_browser_signin": "We'll open your browser to finish sign-in.", - "mcp.auth.connect_server": "Connect {server}", - "mcp.auth.already_connected": "Already Connected", - "mcp.auth.already_connected_description": - "{server} is already authenticated and ready to use.", - "mcp.auth.configured_previously": - "The MCP may have been configured globally or in a previous session. You can close this modal and start using the MCP tools right away.", - "mcp.auth.reload_engine_retry": "Apply changes and retry", - "mcp.auth.retry_now": "Retry Now", - "mcp.auth.retry": "Retry", - "mcp.auth.reload_failed": "Failed to reload the worker before sign-in.", - "mcp.auth.applying_changes_title": "Applying changes before sign-in", - "mcp.auth.applying_changes_body": - "We are restarting the worker so the new MCP is ready to authenticate.", - "mcp.auth.waiting_for_conversation_title": - "Waiting for conversation to complete", - "mcp.auth.waiting_for_conversation_body": - "We will redirect you to authenticate as soon as possible.", - "mcp.auth.waiting_for_session": "Waiting for {session} to finish working", - "mcp.auth.force_stop": "Force stop", - "mcp.auth.force_stopping": "Stopping...", - "mcp.auth.reload_before_oauth": - "Reload the engine to finish setting up this MCP before starting OAuth.", - "mcp.auth.reload_notice": - "For this to take effect, OpenWork needs to refresh the worker service. This can interrupt a running session.", - "mcp.auth.reload_blocked": - "Reload is paused while a session is running. Stop the run to finish setup.", - "mcp.auth.reload_remote_confirm": - "For this to take effect, OpenWork needs to refresh the worker service. This might stop your running session. Continue?", - "mcp.auth.reload_needed": - "Finish setup by reloading the engine, then try connecting again.", - "mcp.auth.manual_finish_title": "Remote server?", - "mcp.auth.manual_finish_hint": - "Paste the callback URL (localhost:19876) or just the code to finish connecting.", - "mcp.auth.callback_label": "Callback URL or code", - "mcp.auth.callback_placeholder": - "http://127.0.0.1:19876/mcp/oauth/callback?code=...", - "mcp.auth.complete_connection": "Complete connection", - "mcp.auth.callback_invalid": - "Paste the callback URL or the code parameter to finish OAuth.", - "mcp.auth.port_forward_hint": - "Tip: forward the callback port if needed: ssh -L 19876:127.0.0.1:19876 user@host", - "mcp.auth.step1_title": "Opening your browser", - "mcp.auth.step1_description": - "We'll launch {server}'s sign-in flow automatically.", - "mcp.auth.step2_title": "Authorize OpenWork", - "mcp.auth.step2_description": "Sign in and approve access when prompted.", - "mcp.auth.step3_title": "Return here when you're done", - "mcp.auth.step3_description": - "We'll finish connecting as soon as authorization completes.", - "mcp.auth.waiting_authorization": - "Waiting for authorization to complete in your browser...", - "mcp.auth.follow_browser_steps": - "Follow the authorization steps in the browser.", - "mcp.auth.reopen_browser_link": "Click here to re-open the browser", - "mcp.auth.done": "Done", - "mcp.auth.cancel": "Cancel", - "mcp.auth.im_done": "I'm done", - "mcp.auth.client_registration_required": - "Client registration is required before OAuth can continue.", - "mcp.auth.server_disabled": - "This MCP server is disabled. Enable it and try again.", - "mcp.auth.oauth_failed": "OAuth authentication failed.", - "mcp.auth.invalid_refresh_token": - "The OAuth refresh token is invalid or expired. Reauthorize to continue.", - "mcp.auth.reauth_action": "Reauthorize OAuth", - "mcp.auth.reauth_running": "Reauthorizing...", - "mcp.auth.reauth_failed": "Reauthorization failed.", - "mcp.auth.reauth_cli_hint": "Run: opencode mcp auth {server}", - "mcp.auth.reauth_remote_hint": - "Reauthorize from the machine running this worker.", - "mcp.auth.authorization_still_required": - "Authorization is still required. Try again to restart the flow.", - "mcp.auth.oauth_not_supported_hint": - "This could mean:\n• The MCP server doesn't advertise OAuth capabilities\n• The engine needs to reload to discover server capabilities\n• Try: opencode mcp auth {server} from the CLI", - "mcp.auth.try_reload_engine": "{message}. Try reloading the engine first.", - "mcp.auth.failed_to_start_oauth": "Failed to start OAuth flow", - "mcp.auth.oauth_completed_reload": - "OAuth completed. Reload the engine to activate the MCP.", - - // ==================== Settings ==================== - "settings.title": "Settings", - "settings.connection": "Connection", - "settings.engine_source": "Engine source", - "settings.from_path": "From PATH", - "settings.from_sidecar": "Bundled sidecar", - "settings.engine_source_description": - "PATH uses your installed OpenCode (default). Sidecar will use a bundled binary when available.", - "settings.sidecar_unsupported": "Sidecar is available on Windows", - "settings.sidecar_unavailable_detail": "Sidecar is bundled when available.", - "settings.model": "Model", - "settings.model_description": "Defaults + thinking controls for runs.", - "settings.change": "Change", - "settings.engine_path": "PATH", - "settings.engine_sidecar": "Sidecar", - "settings.thinking": "Thinking", - "settings.thinking_description": "Show thinking parts (Developer mode only).", - "settings.on": "On", - "settings.off": "Off", - "settings.model_variant": "Model variant", - "settings.edit": "Edit", - "settings.default_model": "Default model", - "settings.session_model": "Model", - "settings.model_description_default": - "Choose from your configured providers. This selection will be used for new sessions.", - "settings.model_description_session": - "Choose from your configured providers. This selection applies to your next message.", - "settings.search_models": "Search models…", - "settings.showing_models": "Showing {count} of {total}", - "settings.model_variant_prompt": - "Model variant (provider-specific, e.g. high/max/minimal). Leave blank to clear.", - "settings.model_fallback": "Fallback", - "settings.model_default": "Default", - "settings.model_free": "Free", - "settings.model_reasoning": "Reasoning", - "settings.done": "Done", - "settings.updates": "Updates", - "settings.updates_description": "Keep OpenWork up to date.", - "settings.automatic_checks": "Automatic checks", - "settings.automatic_checks_description": "Once per day (quiet)", - "settings.update_checking": "Checking...", - "settings.update_available": "Update available: v", - "settings.update_downloading": "Downloading...", - "settings.update_ready": "Ready to install: v", - "settings.update_error": "Update check failed", - "settings.update_uptodate": "Up to date", - "settings.last_checked": "Last checked", - "settings.published": "Published", - "settings.check_update": "Check", - "settings.install_restart": "Install & Restart", - "settings.update_not_supported": - "Updates are not supported in this environment.", - "settings.update_desktop_only": - "Updates are only available in the desktop app.", - "settings.startup": "Startup", - "settings.mode_label": "mode", - "settings.switch_mode": "Switch", - "settings.reset_startup": "Reset default startup mode", - "settings.reset_startup_description": - "This clears your saved preference and shows mode selection on next launch.", - "settings.advanced": "Advanced", - "settings.advanced_description": - "Reset OpenWork local state to retest onboarding.", - "settings.reset_onboarding": "Reset onboarding", - "settings.reset_onboarding_description": - "Clears OpenWork preferences and restarts the app.", - "settings.reset_app_data": "Reset app data", - "settings.reset_app_data_description": - "More aggressive. Clears OpenWork cache + app data.", - "settings.reset": "Reset", - "settings.requires_typing": "Requires typing", - "settings.will_restart": "and will restart the app.", - "settings.reset_onboarding_title": "Reset onboarding", - "settings.reset_app_data_title": "Reset app data", - "settings.reset_confirmation_hint": - 'Type RESET to confirm. OpenWork will restart.', - "settings.reset_onboarding_warning": - "Clears OpenWork local preferences and workspace onboarding markers.", - "settings.reset_app_data_warning": - "Clears OpenWork cache and app data on this device.", - "settings.reset_stop_active_runs": "Stop active runs before resetting.", - "settings.reset_confirmation_label": "Confirmation", - "settings.reset_confirmation_placeholder": "Type RESET", - "settings.reset_cancel": "Cancel", - "settings.reset_confirm_button": "Reset & Restart", - "settings.developer": "Developer", - "settings.opencode_cache": "OpenCode cache", - "settings.opencode_cache_description": - "Repairs cached data used to start the engine. Safe to run.", - "settings.repair_cache": "Repair cache", - "settings.repairing_cache": "Repairing cache", - "settings.cache_repair_requires_desktop": - "Cache repair requires the desktop app", - "settings.pending_permissions": "Pending permissions", - "settings.recent_events": "Recent events", - "settings.notion_connected": "Connected", - "settings.reload_required": "Reload required", - "settings.connection_failed": "Connection failed", - "settings.notion_not_connected": "Not connected", - "settings.show_thinking": "Show thinking", - "settings.update": "Update", - "settings.about": "About", - "settings.version": "Version", - "settings.check_for_updates": "Check for updates", - "settings.download_update": "Download update", - "settings.install_update": "Install update and restart", - "settings.enable_developer_mode": "Enable Developer Mode", - "settings.disable_developer_mode": "Disable Developer Mode", - "settings.stop_engine": "Stop engine", - "settings.disconnect": "Disconnect", - "settings.language": "Language", - "settings.language.description": "Choose your preferred language", - "settings.connection_title": "Connection", - "settings.engine_source_label": "Engine source", - "settings.engine_source_hint": - "PATH uses your installed OpenCode (default). Sidecar will use a bundled binary when available.", - "settings.sidecar_unavailable": "Sidecar is bundled when available.", - "settings.model_title": "Model", - "settings.model_hint": "Defaults + thinking controls for runs.", - "settings.thinking_label": "Thinking", - "settings.thinking_hint": "Show thinking parts (Developer mode only).", - "settings.model_variant_label": "Model variant", - "settings.appearance_title": "Appearance", - "settings.appearance_hint": "Match the system or force light/dark mode.", - "settings.theme_system": "System", - "settings.theme_light": "Light", - "settings.theme_dark": "Dark", - "settings.theme_system_hint": - "System mode follows your OS preference automatically.", - "settings.updates_title": "Updates", - "settings.updates_hint": "Keep OpenWork up to date.", - "settings.automatic_checks_label": "Automatic checks", - "settings.automatic_checks_hint": "Once per day (quiet)", - "settings.last_checked_time": "Last checked {time}", - "settings.published_date": "Published {date}", - "settings.update_not_supported_hint": - "Updates are not supported in this environment.", - "settings.update_desktop_only_hint": - "Updates are only available in the desktop app.", - "settings.startup_title": "Startup", - "settings.mode_suffix": "mode", - "settings.reset_startup_label": "Reset default startup mode", - "settings.reset_startup_hint": - "This clears your saved preference and shows mode selection on next launch.", - "settings.advanced_title": "Advanced", - "settings.advanced_hint": "Reset OpenWork local state to retest onboarding.", - "settings.reset_onboarding_label": "Reset onboarding", - "settings.reset_onboarding_hint": - "Clears OpenWork preferences and restarts the app.", - "settings.reset_app_data_label": "Reset app data", - "settings.reset_app_data_hint": - "More aggressive. Clears OpenWork cache + app data.", - "settings.reset_requires_hint": - "Requires typing RESET and will restart the app.", - "settings.developer_title": "Developer", - "settings.opencode_cache_label": "OpenCode cache", - "settings.opencode_cache_hint": - "Repairs cached data used to start the engine. Safe to run.", - "settings.pending_permissions_label": "Pending permissions", - "settings.recent_events_label": "Recent events", - "settings.stop_active_runs_hint": "Stop active runs to update", - "settings.stop_active_runs_reset_hint": "Stop active runs to reset", - "settings.stop_runs_to_update": "Stop active runs to update", - "settings.stop_runs_to_reset": "Stop active runs to reset", - "settings.updates_not_supported": - "Updates are not supported in this environment.", - "settings.updates_desktop_only": - "Updates are only available in the desktop app.", - - // ==================== Reload ==================== - "reload.toast_title": "Updates available", - "reload.toast_description": "Reload workspace to apply config changes.", - "reload.toast_warning": "Stops all active tasks.", - "reload.toast_warning_active": "Reloading stops {count} active tasks.", - "reload.toast_reload": "Reload", - "reload.toast_reload_stopped": "Reload & Stop Tasks", - "reload.toast_reloading": "Reloading...", - "reload.toast_dismiss": "Later", - "reload.toast_blocked_host": "Reloading is only available for local workers.", - "reload.toast_blocked_connect": "Connect to this workspace to reload.", - "reload.toast_blocked_runs": - "Waiting for active tasks to complete before reloading.", - - // ==================== Onboarding ==================== - "onboarding.starting_host": "Starting OpenWork server...", - "onboarding.searching_host": "Connecting to OpenWork server...", - "onboarding.getting_ready": "Getting everything ready", - "onboarding.verifying": "Verifying secure handshake", - "onboarding.create_first_workspace": "Create your first workspace", - "onboarding.create_workspace": "Create a workspace", - "onboarding.workspace_description": - "Choose a folder and preset to set up your workspace.", - "onboarding.start": "Start OpenWork", - "onboarding.back": "Back", - "onboarding.advanced_settings": "Advanced settings", - "onboarding.opencode_engine": "OpenCode engine", - "onboarding.refresh": "Refresh", - "onboarding.checking_cli": "Checking OpenCode CLI...", - "onboarding.cli_not_found": "OpenCode CLI not found.", - "onboarding.cli_needs_update": "OpenCode CLI needs an update for serve.", - "onboarding.opencode": "OpenCode", - "onboarding.cli_ready": "OpenCode CLI ready.", - "onboarding.cli_version": "OpenCode {version}", - "onboarding.windows_install_instruction": - "Install OpenCode for Windows, then restart OpenWork. Ensure opencode.exe is on PATH.", - "onboarding.install_instruction": - "Install OpenCode to enable the local server (no terminal required).", - "onboarding.install": "Install OpenCode", - "onboarding.recheck": "Re-check", - "onboarding.ready_message": "OpenCode is ready to start the local server.", - "onboarding.resolved_path": "Resolved path", - "onboarding.version": "Version", - "onboarding.search_notes": "Search notes", - "onboarding.serve_help": "serve --help output", - "onboarding.workspace_folder_label": - "A workspace is a folder with its own skills, plugins, and commands.", - "onboarding.theme_label": "Theme", - "onboarding.theme_current": "Current: {mode}", - "onboarding.theme_system": "System", - "onboarding.theme_light": "Light", - "onboarding.theme_dark": "Dark", - "onboarding.access_label": "Access", - "onboarding.folders_allowed": "{count} folder{plural} allowed", - "onboarding.manage_access_hint": - "You can manage access in advanced settings.", - "onboarding.open_settings_hint": - "Need engine or access options? Open Settings.", - "onboarding.open_settings": "Open Settings", - "onboarding.add_folder_path": "Add folder path", - "onboarding.pick": "Pick", - "onboarding.add": "Add", - "onboarding.remove": "Remove", - "onboarding.cli_label": "OpenCode CLI", - "onboarding.cli_checking": "Checking install...", - "onboarding.cli_not_found_hint": - "Not found. Install to run the local server.", - "onboarding.cli_version_installed": "Installed", - "onboarding.cli_recheck": "Re-check", - "onboarding.cli_install_commands": - "Install OpenCode with one of the commands below, then restart OpenWork.", - "onboarding.show_search_notes": "Show search notes", - "onboarding.last_checked": "Last checked {time}", - "onboarding.server_url_placeholder": "http://localhost:8088", - "onboarding.directory_placeholder": "my-project", - "onboarding.connect_host": "Connect to server", - "onboarding.connect_description": - "Pair with an existing OpenCode server (LAN or tunnel).", - "onboarding.server_url": "Server URL", - "onboarding.directory": "Directory (optional)", - "onboarding.directory_hint": "Use if your server runs multiple workers.", - "onboarding.connect": "Connect", - "onboarding.remote_workspace_title": "Connect to OpenWork server", - "onboarding.remote_workspace_description": - "Connect to an OpenWork server to access a workspace from anywhere.", - "onboarding.remote_workspace_action": "Connect", - "onboarding.remote_workspace_card_title": "Connect a remote workspace", - "onboarding.remote_workspace_card_description": - "Connect to an OpenWork server to access a shared workspace.", - "onboarding.advanced_openwork_host": "OpenWork server", - "onboarding.advanced_openwork_hint": - "Use a server URL and access token for shared access.", - "onboarding.advanced_opencode_direct": "Advanced: OpenCode direct", - "onboarding.advanced_opencode_hint": - "Connect straight to an OpenCode engine when no server is available.", - "onboarding.welcome_title": "How would you like to run OpenWork today?", - "onboarding.run_local": "Run locally", - "onboarding.run_local_description": - "OpenWork runs OpenCode locally and keeps your work private.", - "onboarding.engine_running": "Engine already running", - "onboarding.attach_description": - "Attach to the existing session on this device.", - "onboarding.attach": "Attach", - "onboarding.remember_choice": "Remember my choice for next time", - "onboarding.client_mode": "Connect as a Client (Remote Pairing)", - "onboarding.default_workspace_path": "~/OpenWork/Worker", - "onboarding.authorize_folder": "Authorize folder", - "onboarding.choose_workspace_folder": "Choose workspace folder", - - // ==================== Common ==================== - "common.alpha": "Alpha", - "common.change": "Change", - "common.refresh": "Refresh", - "common.new": "New", - "common.install": "Install", - "common.delete": "Delete", - "common.edit": "Edit", - "common.save": "Save", - "common.cancel": "Cancel", - "common.close": "Close", - "common.open": "Open", - "common.show": "Show", - "common.hide": "Hide", - "common.path": "Path", - "common.choose": "Choose", - "common.retry": "Retry", - "common.untitled": "Untitled", - "common.default_parens": "(default)", - "common.on": "On", - "common.off": "Off", - - // ==================== Status ==================== - "status.connected": "Connected", - "status.disconnected": "Disconnected", - "status.idle": "Idle", - "status.busy": "Busy", - "status.running": "Running", - "status.live": "Live", - "status.connecting": "Connecting", - "status.creating_workspace": "Creating workspace", - "status.deleting_command": "Deleting command", - "status.saving_workspace_command": "Saving workspace command", - "status.saving_command": "Saving command", - "status.loading_session": "Loading session", - "status.creating_task": "Creating new task", - "status.starting_engine": "Starting engine", - "status.reloading_engine": "Reloading engine", - "status.restarting_engine": "Restarting engine", - "status.installing_opencode": "Installing OpenCode", - "status.disconnecting": "Disconnecting", - - // ==================== Workspace Switching ==================== - "workspace.switching_title": "Opening {name}", - "workspace.switching_title_unknown": "Opening workspace", - "workspace.switching_subtitle": "We’ll bring your recent work back.", - "workspace.switching_status_preparing": "Getting things ready", - "workspace.switching_status_connecting": "Checking your connection", - "workspace.switching_status_loading": "Loading recent tasks", - "workspace.switching_status_almost": "Almost there", - - "app.connection_lost": "Server connection lost. Please reload.", - "app.unknown_error": "Unknown error", - "app.error.tauri_required": "This action requires the Tauri app runtime.", - "app.error.choose_folder": "Choose a folder to continue.", - "app.error.pick_workspace_folder": "Pick a workspace folder first.", - "app.error.remote_base_url_required": "Add a server URL to continue.", - "app.error.host_requires_local": - "Select a local workspace to start the engine.", - "app.error.sidecar_unsupported_windows": - "Sidecar OpenCode is bundled on Windows when available. Falling back to PATH.", - "app.error.install_failed": "OpenCode install failed. See logs above.", - "app.error.command_name_template_required": - "Command name and instructions are required.", - "app.error.workspace_commands_desktop": "Commands require the desktop app.", - "app.error.command_scope_unknown": - "This command can't be managed in this mode.", - - // ==================== App top-level ==================== - "app.shared_setup": "Shared setup", - "app.skill_added": "Skill added", - "app.worker_fallback": "Worker", - "app.local_worker_detail": "Local worker", - "app.remote_worker_detail": "Remote worker", - "app.import_shared_bundle": "Import shared bundle", - "app.import_bundle_desc": "Choose how to import this bundle.", - "app.local_disabled_reason": - "Create local workspaces in the desktop app. Remote and shared workspaces still work here.", - "app.reload_stop_tasks": "Reload & Stop Tasks", - "app.reload_now": "Reload now", - "app.reload_later": "Later", - "app.error_request_failed": "Request failed", - "app.error_command_not_resolved": "Command was not resolved.", - "app.error_auth_failed": "Authentication failed", - "app.error_rate_limit": "Rate limit exceeded", - "app.error_compact_no_session": - "Select a session with messages before running /compact.", - "app.error_not_connected": "Not connected to a server", - "app.error_compact_no_session_id": "Select a session before compacting.", - "app.error_compact_empty": "Nothing to compact yet.", - "app.error_session_name_required": "Session name is required", - "app.error_audit_load": "Failed to load audit log.", - "app.error_restart_local_worker": - "Failed to restart the local worker with the updated sharing setting.", - "app.error_remote_access": "Failed to update remote access.", - "app.error_deep_link_unrecognized": - "That link is not a recognized OpenWork deep link or share URL.", - "app.deep_link_auth_queued": "Queued the Cloud auth deep link for OpenWork.", - "app.deep_link_remote_queued": - "Queued remote worker link. OpenWork should move into the connect flow.", - "app.error_desktop_signin": - "Desktop sign-in completed, but OpenWork Cloud did not return a session token.", - "app.error_cloud_signin": "Failed to complete OpenWork Cloud sign-in.", - "app.error_pick_local_folder": - "Pick a local worker folder before restarting the local server.", - "app.error_connect_first": - "Connect to this worker before applying runtime changes.", - "app.error_runtime_changes": "Failed to apply runtime changes.", - "app.reset_config_ok": - "Reset app config defaults. Restart OpenWork if any stale settings remain.", - "app.error_reset_config": "Failed to reset app config defaults.", - "app.model_behavior_title": "Model behavior", - "app.model_behavior_desc": - "Choose the model first to see provider-specific behavior controls.", - "app.error_update_opencode_json": "Failed to update opencode.json", - "app.error_auto_compact_scope": - "Auto context compaction can only be changed for a local workspace or a writable OpenWork server workspace.", - "app.skills_hint_disconnected": - "OpenWork server unavailable. Add the server URL/token in Advanced to manage skills.", - "app.skills_hint_limited": - "OpenWork server needs a host token to install/update skills. Add it in Advanced and reconnect.", - "app.skills_hint_readonly": - "OpenWork server is read-only for skills. Add a host token in Advanced to enable installs.", - "app.plugins_hint_disconnected": - "OpenWork server unavailable. Plugins are read-only.", - "app.plugins_hint_limited": "OpenWork server needs a token to edit plugins.", - "app.plugins_hint_readonly": "OpenWork server is read-only for plugins.", - "app.compact_command_desc": "Summarize this session to reduce context size.", - "app.error_connection_failed_url": - "Connection failed. Check the URL and token.", - "app.error_connection_failed": "Connection failed", - - // ==================== Status bar labels ==================== - "status.openwork_ready": "OpenWork Ready", - "status.limited_mode": "Limited Mode", - "status.disconnected_label": "Disconnected", - "status.ready_for_tasks": "Ready for new tasks", - "status.developer_mode": "Developer mode", - "status.providers_connected": "{count} provider{plural} connected", - "status.mcp_connected": "{count} MCP connected", - "status.limited_hint": "Reconnect to restore full OpenWork features", - "status.limited_mcp_hint": - "{count} MCP connected · reconnect for full features", - "status.disconnected_hint": "Open settings to reconnect", - "status.back": "Back to previous screen", - "status.feedback": "Feedback", - "status.send_feedback": "Send feedback", - "status.settings": "Settings", - - // ==================== Message List ==================== - "message.waiting_subagent": "Waiting for the subagent transcript to arrive.", - "message.tool_request_label": "Request", - "message.tool_result_label": "Result", - - // ==================== Message List (additional) ==================== - "message_list.copy_message": "Copy message", - - // ==================== Composer ==================== - "composer.no_matches": "No matches found.", - "composer.loading_agents": "Loading agents...", - "composer.run_task": "Run task", - "composer.stop": "Stop", - "composer.agent_label": "Agent", - "composer.default_agent": "Default agent", - "composer.loading_commands": "Loading commands...", - "composer.no_commands": "No commands found.", - "composer.configure": "Configure", - "composer.tools_label": "Commands, skills, and MCPs", - "composer.mcps_label": "MCPs", - "composer.skill_source": "Skill", - "composer.attach_files": "Attach files", - "composer.image_kind": "Image", - "composer.file_kind": "File", - "composer.expand_pasted": "Click to expand pasted text", - "composer.failed_read_attachment": "Failed to read attachment", - "composer.attachments_unavailable": "Attachments are unavailable.", - "composer.file_exceeds_limit": "{name} exceeds the 8MB limit.", - "composer.file_too_large_encoding": - "{name} is too large after encoding. Try a smaller image.", - "composer.uploaded_single_file": - "Uploaded {name} to the shared folder and inserted a link.", - "composer.uploaded_multiple_files": - "Uploaded {count} files to the shared folder and inserted links.", - "composer.upload_failed_local_links": - "Couldn't upload to the shared folder. Inserted local links instead.", - "composer.unsupported_attachment_type": "Unsupported attachment type.", - "composer.inserted_links_unsupported": - "Inserted links for unsupported files.", - "composer.remote_worker_paste_warning": - "This is a remote worker. Sandboxes are remote too. To share files with it, upload them to the Shared folder in the sidebar.", - "composer.upload_to_shared_folder": "Upload to shared folder", - "composer.placeholder": "Describe your task...", - "composer.behavior_label": "Behavior", - - // ==================== Context Panel ==================== - "context_panel.context": "Context", - "context_panel.working_files": "Working files", - "context_panel.plugins": "Plugins", - "context_panel.no_plugins": "No plugins loaded.", - "context_panel.mcp": "MCP", - "context_panel.no_mcp": "No MCP servers loaded.", - "context_panel.skills": "Skills", - "context_panel.no_skills": "No skills loaded.", - "context_panel.authorized_folders": "Authorized folders", - "context_panel.none_yet": "None yet.", - "context_panel.mcp_disabled": "Disabled", - "context_panel.mcp_disconnected": "Disconnected", - "context_panel.mcp_connected": "Connected", - "context_panel.mcp_needs_auth": "Needs auth", - "context_panel.mcp_register_client": "Register client", - "context_panel.mcp_failed": "Failed", - "context_panel.open_file": "Open {path}", - - // ==================== Inbox Panel ==================== - "inbox_panel.shared_folder": "Shared folder", - "inbox_panel.refresh_tooltip": "Refresh shared folder", - "inbox_panel.uploading": "Uploading...", - "inbox_panel.upload_prompt": "Drop files or click to upload", - "inbox_panel.helper_text": "Share files with this worker from the app.", - "inbox_panel.connect_to_see": "Connect to see shared files.", - "inbox_panel.no_files": "No shared files yet.", - "inbox_panel.showing_first": "Showing first {count}.", - "inbox_panel.upload_needs_worker": - "Connect to a worker to upload files to the shared folder.", - "inbox_panel.uploading_label": "Uploading {label}...", - "inbox_panel.upload_success": "Uploaded to the shared folder.", - "inbox_panel.upload_failed": "Shared folder upload failed", - "inbox_panel.copy_failed": - "Copy failed. Your browser may block clipboard access.", - "inbox_panel.connect_to_download": - "Connect to a worker to download shared files.", - "inbox_panel.missing_file_id": "Missing shared file id.", - "inbox_panel.download": "Download", - "inbox_panel.load_failed": "Failed to load shared folder", - "inbox_panel.drop_to_upload": "Drop files here to upload", - "inbox_panel.connect_to_upload": "Connect to a worker to upload", - - // ==================== Session Sidebar ==================== - "sidebar.no_workspaces": - "No workspaces in this session yet. Add one to get started.", - "sidebar.needs_attention": "Needs attention", - "sidebar.active": "Active", - "sidebar.switch": "Switch", - "sidebar.expand": "Expand", - "sidebar.collapse": "Collapse", - "sidebar.drag_reorder": "Drag to reorder", - "sidebar.edit_connection": "Edit connection", - "sidebar.test_connection": "Test connection", - "sidebar.stop_sandbox": "Stop sandbox", - "sidebar.remove_workspace": "Remove workspace", - "sidebar.show_fewer": "Show fewer", - "sidebar.show_more": "Show {count} more", - "sidebar.add_workspace": "Add new workspace", - "sidebar.new_worker": "New worker", - "sidebar.connect_remote": "Connect remote", - "sidebar.import_config": "Import config", - "sidebar.progress": "Progress", - "sidebar.delete_session": "Delete session", - "sidebar.no_sessions_yet": "No sessions yet", - - // ==================== Workspace Session List ==================== - "workspace_list.connecting": "Connecting...", - "workspace_list.workspace_fallback": "Workspace", - "workspace_list.reveal_explorer": "Reveal in Explorer", - "workspace_list.reveal_finder": "Reveal in Finder", - "workspace_list.show_more": "Show {count} more", - "workspace_list.show_more_fallback": "Show more", - "workspace_list.workspace_options": "Workspace options", - "workspace_list.session_actions": "Session actions", - "workspace_list.hide_child_sessions": "Hide child sessions", - "workspace_list.show_child_sessions": "Show child sessions", - "workspace_list.edit_name": "Edit name", - "workspace_list.share": "Share...", - "workspace_list.recover": "Recover", - "workspace_list.test_connection": "Test connection", - "workspace_list.edit_connection": "Edit connection", - "workspace_list.remove_workspace": "Remove workspace", - "workspace_list.rename_session": "Rename session", - "workspace_list.delete_session": "Delete session", - "workspace_list.add_workspace": "Add workspace", - "workspace_list.new_workspace": "New workspace", - "workspace_list.connect_remote": "Connect remote workspace", - "workspace_list.import_config": "Import config", - "workspace_list.desktop_only_hint": - "Create local workspaces in the desktop app.", - - // ==================== Workspace badges ==================== - "workspace.sandbox_badge": "Sandbox", - "workspace.remote_badge": "Remote", - "workspace.local_badge": "Local", - - // ==================== Workspace Right Sidebar ==================== - "workspace_sidebar.configuration": "configuration", - "workspace_sidebar.close_sidebar": "Close sidebar", - "workspace_sidebar.collapse_sidebar": "Collapse sidebar", - "workspace_sidebar.expand_sidebar": "Expand sidebar", - "workspace_sidebar.automations": "Automations", - "workspace_sidebar.extensions": "Extensions", - "workspace_sidebar.messaging": "Messaging", - - // ==================== Common extras ==================== - "common.unknown": "Unknown", - - // ==================== Den settings panel (cont.) ==================== - "den.cloud_section_title": "OpenWork Cloud", - "den.cloud_section_desc": - "Sign in, pick an org, and open Cloud workers or team templates.", - "den.cloud_sleep_hint": - "Sign in to OpenWork Cloud to keep your tasks alive even when your computer sleeps.", - "den.cloud_control_plane_url_label": "Cloud control plane URL", - "den.cloud_control_plane_url_hint": - "Developer mode only. Use this to target a local or self-hosted Cloud control plane. Changing it signs you out so the app can re-hydrate against the new control plane.", - "den.cloud_control_plane_reset": "Reset", - "den.cloud_control_plane_save": "Save URL", - "den.cloud_control_plane_open": "Open in browser", - "den.signin_title": "Sign in to OpenWork Cloud", - "den.signin_button": "Sign in", - "den.create_account": "Create account", - "den.hide_signin_code": "Hide sign-in code", - "den.paste_signin_code": "Paste sign-in code", - "den.signin_link_label": "Sign-in link or one-time code", - "den.signin_link_placeholder": "openwork://den-auth?... or pasted code", - "den.signin_link_hint": - "If your browser doesn't bounce back into OpenWork automatically, paste the sign-in link or one-time code from OpenWork Cloud here.", - "den.finishing": "Finishing...", - "den.finish_signin": "Finish sign-in", - "den.signin_code_note": - "Accepts an openwork://den-auth link or the raw one-time grant.", - "den.auto_reconnect_hint": - "Finish auth in your browser and OpenWork will reconnect here automatically.", - "den.cloud_account_title": "Cloud account", - "den.cloud_account_hint": "Manage your connected account and organization.", - "den.signing_out": "Signing out...", - "den.sign_out": "Sign out", - "den.active_org_title": "Active org", - "den.active_org_hint": - "Cloud workers and team templates are scoped to the selected org.", - "den.no_org_selected": "No org selected", - "den.needs_attention": "Needs attention", - "den.checking_session": "Checking session", - "den.signed_out": "Signed out", - "den.cloud_workers_title": "Cloud workers", - "den.cloud_workers_hint": - "Open workers directly into OpenWork using the same remote-connect flow the app already uses elsewhere.", - "den.refresh": "Refresh", - "den.no_cloud_workers": - "No cloud workers are visible for this org yet. Create one in Cloud, then refresh this tab.", - "den.worker_mine_badge": "Mine", - "den.worker_secondary_cloud": "Cloud worker", - "den.worker_not_ready_title": "This worker is not ready to open yet.", - "den.open": "Open", - "den.opening": "Opening...", - "den.import_all": "Import all", - "den.import_provider": "Import", - "den.importing": "Importing...", - "den.removing": "Removing...", - "den.sync": "Sync", - "den.syncing": "Syncing...", - "den.uninstall": "Uninstall", - "den.imported_badge": "Imported", - "den.out_of_sync_badge": "Out of sync", - "den.removed_from_cloud_badge": "Removed from cloud", - "den.credentials_ready_badge": "Credential ready", - "den.team_templates_title": "Team templates", - "den.team_templates_hint": - "Open reusable workspace templates shared with this organization.", - "den.team_template_badge": "Team template", - "den.no_team_templates": - "No team templates yet. Use Share \u2192 Template \u2192 Share with team.", - "den.choose_org_for_templates": "Choose an org to view team templates.", - "den.skill_hubs_title": "Skill hubs", - "den.skill_hubs_hint": "Import every skill from a shared cloud hub into this workspace in one step.", - "den.choose_org_for_skill_hubs": "Choose an org to view cloud skill hubs.", - "den.no_skill_hubs": "No cloud skill hubs are available for this org yet.", - "den.skill_hub_skills_badge": "{count} skills", - "den.skill_hub_detail": "Import {count} shared skills into .opencode/skills.", - "den.skill_hub_imported_detail": "Imported {count} skills into this workspace.", - "den.skill_hub_sync_detail": "Cloud now has {liveCount} skills; this workspace imported {importedCount}. Sync to update the installed set.", - "den.skill_hub_removed_detail": "This hub was removed from cloud. Uninstall the {importedCount} imported skills from this workspace.", - "den.cloud_providers_title": "Cloud providers", - "den.cloud_providers_hint": "Import managed LLM providers into opencode.jsonc and use the org credential in this workspace.", - "den.choose_org_for_providers": "Choose an org to view cloud providers.", - "den.no_cloud_providers": "No cloud providers are available for this org yet.", - "den.cloud_provider_detail": "{count} models · {source} provider", - "den.cloud_provider_sync_detail": "Cloud provider changed. Sync the {count} model {source} config into opencode.jsonc.", - "den.cloud_provider_removed_detail": "This imported provider is no longer in cloud. Uninstall the local {providerId} config.", - "den.error_base_url": - "Enter a valid http:// or https:// Cloud control plane URL.", - "den.error_choose_org": "Choose an org before opening a worker.", - "den.error_worker_not_ready": - "Worker is not ready to open yet. Try again after provisioning finishes.", - "den.error_load_orgs": "Failed to load orgs.", - "den.error_load_workers": "Failed to load workers.", - "den.error_load_templates": "Failed to load team templates.", - "den.error_no_session": "No active Cloud session found.", - "den.error_paste_valid_code": - "Paste a valid OpenWork sign-in link or one-time sign-in code.", - "den.error_signin_failed": "Failed to complete OpenWork Cloud sign-in.", - "den.error_no_token": - "Desktop sign-in completed, but OpenWork Cloud did not return a session token.", - "den.status_browser_signin": - "Finish signing in in your browser to connect OpenWork.", - "den.status_browser_signup": - "Finish account creation in your browser to connect OpenWork.", - "den.status_cloud_signin_done": "Connected OpenWork Cloud.", - "den.status_base_url_updated": - "Updated the Cloud control plane URL. Sign in again to continue.", - "den.status_signed_out": - "Signed out and cleared your OpenWork Cloud session on this device.", - "den.status_signed_in_as": "Signed in as {email}.", - "den.status_cloud_signed_in_as": "Connected OpenWork Cloud as {email}.", - "den.status_loaded_orgs": "Loaded {count} org{plural}.", - "den.status_loaded_workers": "Loaded {count} worker{plural} for {name}.", - "den.status_no_workers": "No workers found for {name}.", - "den.status_loaded_templates": "Loaded {count} template{plural} for {name}.", - "den.status_no_templates": "No team templates found for {name}.", - "den.status_opened_worker": "Opened {name} in OpenWork.", - "den.status_opened_template": "Opened {name} from {org}.", - "den.status_opened_template_fallback": "Opened {name} from team templates.", - "den.signing_in": "Finishing OpenWork Cloud sign-in...", - "den.org_switched": "Switched to {name}.", - "den.org_owner_suffix": "(Owner)", - "den.org_member_suffix": "(Member)", - "den.worker_provider_label": "{provider} worker", - "den.error_open_worker": "Failed to open {name} in OpenWork.", - "den.error_open_worker_fallback": "Failed to open {name}.", - "den.error_open_template": "Failed to open {name}.", - - // ==================== Create workspace modal ==================== - // Utility labels - "dashboard.recently_updated": "Recently updated", - "dashboard.unknown_creator": "Unknown creator", - "dashboard.cloud_worker": "Cloud worker", - "dashboard.access_token": "Access token", - // Screen titles / subtitles - "dashboard.create_local_workspace_title": "Local workspace", - "dashboard.create_local_workspace_subtitle": - "Create a workspace on this device and optionally start from a team template.", - "dashboard.create_remote_custom_title": "Connect custom remote", - "dashboard.create_remote_custom_subtitle": - "Attach to a self-hosted OpenWork worker.", - "dashboard.create_shared_title": "Shared workspaces", - "dashboard.create_shared_subtitle_signed_in": - "Browse cloud workers shared with your organization and connect in one step.", - "dashboard.create_shared_subtitle_signed_out": - "Sign in to OpenWork Cloud to access workers shared with your organization.", - // Chooser cards - "dashboard.chooser_local_desc": - "Create a workspace on this device and optionally start from a team template.", - "dashboard.chooser_remote_desc": - "Attach to a self-hosted OpenWork worker using a URL and access token.", - "dashboard.chooser_shared_desc": - "Browse cloud workers shared with your organization and connect in one step.", - // Local body - "dashboard.workspace_folder_title": "Workspace folder", - "dashboard.workspace_folder_hint": - "Choose where this workspace should live on your device.", - "dashboard.no_folder_selected": "No folder selected yet.", - "dashboard.team_templates_title": "Team templates", - "dashboard.team_templates_hint": - "Choose a starting point, or leave blank to create an empty workspace.", - "dashboard.team_templates_syncing": "Syncing", - "dashboard.team_templates_none": - "No shared workspace templates found for this org yet.", - "dashboard.template_selected_badge": "Selected", - // Remote body - "dashboard.remote_server_details_title": "Remote server details", - "dashboard.remote_server_details_hint": - "Attach to a self-hosted OpenWork worker.", - "dashboard.worker_url_label": "Worker URL", - "dashboard.worker_url_hint": - "Paste the URL for the OpenWork worker you want to connect to.", - "dashboard.access_token_optional_hint": - "Add a token only if the worker requires one.", - "dashboard.display_name_label": "Display name", - "dashboard.display_name_optional": "(optional)", - // Cloud sign-in screen - "dashboard.cloud_signin_title": "Sign in to OpenWork Cloud", - "dashboard.cloud_signin_hint": - "Access remote workers shared with your organization.", - "dashboard.cloud_signin_button": "Continue with Cloud", - "dashboard.cloud_signin_next": - "You'll pick a team and connect to an existing workspace next.", - // Worker status badges - "dashboard.worker_status_ready": "Ready", - "dashboard.worker_status_starting": "Starting", - "dashboard.worker_status_attention": "Attention", - "dashboard.worker_status_stopped": "Stopped", - "dashboard.worker_status_unknown": "Unknown", - // Errors - "dashboard.error_choose_org": - "Choose an organization before opening a workspace.", - "dashboard.error_load_orgs": "Failed to load organizations.", - "dashboard.error_load_shared_workspaces": "Failed to load shared workspaces.", - "dashboard.error_workspace_not_ready": - "Workspace is not ready to connect yet. Try again in a moment.", - "dashboard.error_connect_worker": "Failed to connect to {name}.", - "dashboard.error_create_template": "Failed to create {name}.", - "dashboard.desktop_badge": "Desktop", - "dashboard.import_config": "Import config", - "dashboard.importing": "Importing\u2026", - // Shared signed-in body - "dashboard.search_shared_workspaces": "Search shared workspaces", - "dashboard.shared_workspaces_loading": "Loading shared workspaces\u2026", - "dashboard.shared_workspaces_no_match": - "No shared workspaces match that search.", - "dashboard.shared_workspaces_none": "No shared workspaces available yet.", - "dashboard.workspace_connecting": "Connecting", - "dashboard.workspace_connect": "Connect", - "dashboard.workspace_connect_unavailable": - "Connecting shared workspaces is unavailable here.", - "dashboard.workspace_not_ready_title": - "This workspace is not ready to connect yet.", - "dashboard.shared_workspaces_refreshing": "Refreshing workspaces\u2026", - "dashboard.open_cloud_dashboard": "Open cloud dashboard", - // Sandbox progress - "dashboard.sandbox_setup": "Sandbox setup", - "dashboard.sandbox_hide_logs": "Hide logs", - "dashboard.sandbox_show_logs": "Show logs", - "dashboard.sandbox_live_logs": "Live Logs", - "dashboard.docker_debug_details": "Docker debug details", - // Buttons / footer - "dashboard.creating": "Creating...", - "dashboard.connect_remote_button": "Connect remote", - "dashboard.connecting": "Connecting...", - // Modal aria-labels - "dashboard.modal_back": "Back", - "dashboard.modal_close": "Close add workspace modal", - - // ==================== Den settings panel ==================== - "den_settings.title": "Cloud", - "den_settings.sign_in": "Sign in", - "den_settings.sign_out": "Sign out", - "den_settings.sign_in_hint": - "Sign in to OpenWork Cloud to access shared workspaces and team features.", - "den_settings.signed_in_as": "Signed in as", - "den_settings.manage_account": "Manage account", - "den_settings.workers_title": "Shared workspaces", - "den_settings.workers_hint": - "Cloud workspaces shared with your organization.", - "den_settings.no_workers": "No shared workspaces found.", - "den_settings.open_workspace": "Open workspace", - "den_settings.refresh": "Refresh", - - // ==================== Share workspace modal ==================== - "share.title": "Share workspace", - "share.workspace_fallback": "Workspace", - "share.field_password": "Password", - "share.field_worker_url": "Worker URL", - "share.hide_password": "Hide password", - "share.reveal_password": "Reveal password", - "share.copy_hint": "Copy", - "share.copy_link_hint": "Copy link", - "share.close_hint": "Close", - "share.back_hint": "Back to share options", - "share.publishing": "Publishing...", - "share.included_in_template": "Included in this template", - "share.template_item_settings": "Workspace settings", - "share.template_item_settings_desc": - "The shared workspace profile and default behavior.", - "share.template_item_skills": "Included skills", - "share.template_item_skills_desc": "Custom skills saved in this workspace.", - "share.template_item_config": "Commands and config", - "share.template_item_config_desc": - "Reusable commands plus OpenWork/OpenCode config.", - "share.view_template": "Share a template", - "share.view_template_public": "Public template", - "share.view_template_team": "Share with team", - "share.view_access": "Access workspace remotely", - "share.option_template_title": "Share a template", - "share.option_template_desc": - "Package this setup so someone else can start from the same environment.", - "share.option_access_title": "Access workspace remotely", - "share.option_access_desc": - "Reveal the live connection details needed to reach this running workspace from another machine.", - "share.template_intro": - "Share a reusable setup without granting live access to this running workspace.", - "share.option_team_title": "Share with team", - "share.option_team_desc": - "Save this workspace template to your active OpenWork Cloud organization.", - "share.option_public_title": "Public template", - "share.option_public_desc": - "Create a share link anyone can use to start from this template.", - "share.public_intro": "Share this workspace as a public template link.", - "share.workspace_template_title": "Workspace template", - "share.workspace_template_desc": - "Share the core setup and workspace defaults.", - "share.create_template_link": "Create template link", - "share.regenerate_link": "Regenerate link", - "share.team_intro": - "Save this template to your active OpenWork Cloud organization so teammates can open it later from Cloud settings.", - "share.active_cloud_org": "Active Cloud org", - "share.template_name_label": "Template name", - "share.sign_in_to_share": "Sign in to share with team", - "share.saving": "Saving...", - "share.save_to_team": "Save to team", - "share.cloud_signin_note": - "OpenWork Cloud opens in your browser and returns here after sign-in.", - "share.warning_basic": - "Share with trusted people only. These credentials grant live access to this workspace.", - "share.warning_full": - "These credentials grant live access to this workspace. Sharing this workspace remotely may allow anyone with access to your network to control your worker.", - "share.remote_access_title": "Remote access", - "share.remote_access_desc": - "Off by default. Turn this on only when you want this worker reachable from another machine.", - "share.remote_access_enabled": "Remote access is currently enabled.", - "share.remote_access_disabled": "Remote access is currently disabled.", - "share.remote_save_busy": "Saving...", - "share.remote_save": "Save", - "share.credentials_disabled_hint": - "Enable remote access and click Save to restart the worker and reveal the live connection details for this workspace.", - "share.connection_details_label": "Connection details", - "share.connect_messaging_title": "Connect messaging", - "share.connect_messaging_desc": - "Use this workspace from Slack, Telegram, and others.", - "share.setup": "Setup", - "share.optional_collaborator": "Optional collaborator access", - "share.collaborator_hint": "Routine access without permission approvals.", - "share.chooser_subtitle": "Choose how you want to share this workspace.", - "share.subtitle_template_public": - "Create a public workspace template link anyone can import.", - "share.subtitle_template_team": - "Save a workspace template to your active OpenWork Cloud organization.", - "share.subtitle_access": - "Reveal the live connection details needed to reach this workspace from another machine.", - - // ==================== Dashboard page (session/share strings) ==================== - "scheduled.title": "Automations", - "extensions.title": "Extensions", - "settings.tab_automations": "Automations", - "settings.tab_skills": "Skills", - "settings.tab_extensions": "Extensions", - "settings.tab_messaging": "Messaging", - "settings.tab_advanced": "Advanced", - "settings.tab_appearance": "Appearance", - "settings.tab_updates": "Updates", - "settings.tab_recovery": "Recovery", - "settings.tab_cloud": "Cloud", - "settings.tab_debug": "Debug", - "settings.tab_general": "Settings", - "session.provider_auth_in_progress": "Provider auth is already in progress.", - "session.share_worker_url": "Worker URL", - "session.share_desktop_required": "Desktop app required", - "session.share_starting_server": "Starting server...", - "session.share_url_worker_hint": - "Use on phones or laptops connecting to this worker.", - "session.share_url_resolving_hint": - "Worker URL is resolving; host URL shown as fallback.", - "session.share_password": "Password", - "session.share_password_owner_hint": - "Use when the remote client must answer permission prompts.", - "session.share_collaborator_token": "Collaborator token", - - // ==================== Workspace (additions) ==================== - "workspace.needs_attention": "Needs attention", - "workspace.active": "Active", - "workspace.switch": "Switch", - "workspace.no_tasks": "No tasks yet.", - "workspace.new_task_inline": "+ New task", - "workspace.loading_tasks": "Loading tasks...", - "workspace.selected": "Selected", - - // ==================== Common (additions) ==================== - "common.copy": "Copy", - "common.copied": "Copied", - "common.reset": "Reset", - "common.add": "Add", - "common.done": "Done", - - // ==================== Session view ==================== - "session.permission_message": - "OpenCode is requesting permission to continue.", - "session.doom_loop_title": "Doom Loop Detected", - "session.doom_loop_message": - "OpenCode detected repeated tool calls with identical input and is asking whether it should continue after repeated failures.", - "session.doom_loop_label": "Doom Loop", - "session.doom_loop_tool_label": "Tool", - "session.doom_loop_repeated_call_label": "Repeated call", - "session.doom_loop_repeated_tool_call": "Repeated tool call", - "session.doom_loop_note": - "Reject to stop the loop, or allow if you want the agent to keep trying.", - "session.default_agent": "Default agent", - "session.workspace_label": "Workspace", - "session.no_matches": "No matches", - "session.status_delegating": "Delegating", - "session.status_planning": "Planning", - "session.status_gathering_context": "Gathering context", - "session.status_searching_codebase": "Searching codebase", - "session.status_searching_web": "Searching the web", - "session.status_writing_file": "Writing file", - "session.status_running_shell": "Running shell", - "session.status_working": "Working", - "session.status_thinking": "Thinking", - "session.phase_sending": "Sending", - "session.phase_retrying": "Retrying", - "session.phase_responding": "Responding", - "session.phase_run_failed": "Run failed", - "session.compacting_auto": "OpenCode is auto-compacting this session", - "session.compacting_manual": "OpenCode is compacting this session", - "session.compaction_started": - "OpenCode started compacting the session context.", - "session.compaction_finished": - "OpenCode finished compacting the session context.", - "session.no_session_selected": "No session selected", - "session.stopping_run": "Stopping the run...", - "session.stopped": "Stopped.", - "session.failed_to_stop": "Failed to stop", - "session.nothing_to_retry": "Nothing to retry yet", - "session.trying_again": "Trying again...", - "session.nothing_to_undo": "Nothing to undo yet.", - "session.reverted_last_message": "Reverted the last user message.", - "session.failed_to_undo": "Failed to undo", - "session.nothing_to_redo": "Nothing to redo.", - "session.restored_message": "Restored the reverted message.", - "session.failed_to_redo": "Failed to redo", - "session.nothing_to_compact": "Nothing to compact yet.", - "session.compacting": "Compacting session context...", - "session.compacted": "Session compacted.", - "session.failed_to_compact": "Failed to compact session", - "session.deleted": "Session deleted", - "session.failed_to_delete": "Failed to delete session", - "session.failed_to_load_agents": "Failed to load agents", - "session.failed_to_create_session": "Failed to create session", - "session.failed_to_load_providers": "Failed to load providers", - "session.cmd_new_session_title": "Create new session", - "session.cmd_new_session_detail": - "Start a fresh task in the current workspace", - "session.cmd_new_session_meta": "Create", - "session.cmd_rename_title": "Rename current session", - "session.cmd_rename_detail_fallback": - "Give your selected session a clearer name", - "session.cmd_rename_meta": "Rename", - "session.cmd_compact_title": "Compact Conversation", - "session.cmd_compact_detail": - "Send a compact instruction to OpenCode for this session", - "session.cmd_compact_detail_empty": "No user messages to compact yet", - "session.cmd_compact_meta": "Compact", - "session.cmd_sessions_title": "Search sessions", - "session.cmd_sessions_meta": "Jump", - "session.cmd_model_title": "Change model", - "session.cmd_model_meta": "Open", - "session.cmd_model_fallback": "Model", - "session.cmd_provider_title": "Connect provider", - "session.cmd_provider_detail": "Open provider connection flow", - "session.cmd_provider_meta": "Open", - "session.cmd_current_workspace": "Current workspace", - "session.cmd_switch": "Switch", - "session.palette_title_sessions": "Search sessions", - "session.palette_title_actions": "Quick actions", - "session.palette_placeholder_sessions": "Find by session title or workspace", - "session.palette_placeholder_actions": "Search actions", - "session.search_placeholder": "Search in this chat", - "session.search_prev": "Prev", - "session.search_next": "Next", - "session.undo_label": "Revert", - "session.redo_label": "Redo", - "session.loading_title": "Loading session", - "session.loading_detail": "Pulling in the latest messages for this task.", - "session.workspace_setup_label": "Workspace setup", - "session.workspace_setup_title": "Set up your first workspace", - "session.workspace_setup_desc": - "Start with a guided OpenWork workspace, or choose an existing folder you want to work in.", - "session.create_workspace_title": "Create workspace", - "session.create_workspace_desc": - "Open the workspace creator and choose how you want to start.", - "session.pick_folder_title": "Pick a folder you want to work in", - "session.pick_folder_desc": - "Choose an existing project or notes folder and OpenWork will use it as your workspace.", - "session.loading_earlier": "Loading earlier messages...", - "session.load_earlier": "Load earlier messages", - "session.jump_to_start": "Jump to start of message", - "session.jump_to_latest": "Jump to latest", - "session.flyout_new_task": "New Task", - "session.flyout_file_modified": "File Modified", - "session.attachments_add_token": "Add a server token to attach files.", - "session.attachments_connect_server": - "Connect to OpenWork server to attach files.", - "session.unable_to_reveal": "Unable to reveal workspace", - "session.workspace_path_unavailable": "Workspace path is unavailable.", - "session.reveal_desktop_only": "Reveal is available in the desktop app.", - "session.file_open_remote_unavailable": - "File open is unavailable for remote workspaces.", - "session.file_open_desktop_only": - "File open is available in the desktop app.", - "session.pick_workspace_to_open": "Pick a workspace to open files.", - "session.unable_to_open_file": "Unable to open file", - "session.share_collaborator_label": "Collaborator token", - "session.share_desktop_app_required": "Desktop app required", - "session.share_worker_url_phones_hint": - "Use on phones or laptops connecting to this worker.", - "session.share_worker_url_resolving_hint": - "Worker URL is resolving; host URL shown as fallback.", - "session.share_owner_permission_hint": - "Use when the remote client must answer permission prompts.", - "session.share_collaborator_hint": - "Routine remote access when you do not need owner-only actions.", - "session.share_collaborator_host_hint": - "Routine remote access to this host without owner-only actions.", - "session.share_set_token_hint": "Set token in workspace settings", - "session.share_connected_with_hint": - "This workspace is currently connected with this password.", - "session.share_opencode_base_url": "OpenCode base URL", - "session.share_note_direct_runtime": - "Engine runtime is set to Direct. Switching local workers can restart the host and disconnect clients. The token may change after a restart.", - "session.share_select_workspace": "Select a workspace first.", - "session.share_openwork_workers_only": - "Share service links are available for OpenWork workers.", - "session.share_local_host_not_ready": "Local OpenWork host is not ready yet.", - "session.share_missing_host_url": "Missing OpenWork host URL.", - "session.share_missing_token": "Missing OpenWork token.", - "session.share_active_cloud_org": "Active Cloud org", - "session.share_choose_org": - "Choose an organization in Settings -> Cloud before sharing with your team.", - "session.share_resolve_local_workspace_failed": - "Could not resolve this workspace on the local OpenWork host.", - "session.share_host_url_and_token_required": - "OpenWork host URL and token are required.", - "session.share_resolve_remote_workspace_failed": - "Could not resolve this workspace on the OpenWork host.", - "session.share_workspace_template_desc": - "Full OpenWork workspace template with config, commands, skills, and extra .opencode files.", - "session.share_publish_workspace_failed": - "Failed to publish workspace profile", - "session.share_sign_in_required": - "Sign in to OpenWork Cloud in Settings to share with your team.", - "session.share_team_fallback_name": "your team templates", - "session.share_saved_to_org": "Saved {name} to {org}.", - "session.share_save_team_template_failed": "Failed to save team template", - "session.share_skills_set_desc": - "Complete skills set from an OpenWork workspace.", - "session.share_no_skills": "No skills found in this workspace.", - "session.share_publish_skills_failed": "Failed to publish skills set", - "session.export_desktop_only_local": - "Export is available for local workers in the desktop app.", - "session.export_local_only": "Export is only supported for local workers.", - "session.export_desktop_only": "Export is available in the desktop app.", - "session.export_already_running": "Export is already running.", - "session.update_ready": "Update ready", - "session.install_update": "Install update", - "session.downloading": "Downloading", - "session.update_available": "Update available", - "session.connect_failed": "Connect failed", - "session.upload_connect_server": - "Connect to the OpenWork server to upload files to the shared folder.", - "session.uploaded_to_shared_folder": "Uploaded to the shared folder.", - "session.create_or_connect_workspace": "Create or connect a workspace", - "session.allow_once": "Once", - "session.connect_to_sync": "Connect to OpenWork server to sync remote files.", - "session.obsidian_worker_relative_only": - "Only worker-relative files can be opened in Obsidian.", - "session.resize_workspace_column": "Resize workspace column", - "dashboard.close_settings": "Close settings", - "dashboard.nav_ids": "IDs", - "session.downloading_percent": "Downloading {percent}%", - "session.update_ready_stop_runs_title": - "Update ready {version}. Stop active runs to restart.", - "session.restart_update_title": "Restart to apply update {version}", - "session.downloading_update_title": "Downloading update {version}", - "session.update_available_title": "Update available {version}", - "session.file_open_failed": "File open failed", - "session.remote_sync_failed": "Remote file sync failed", - "session.shared_folder_upload_failed": "Shared folder upload failed", - "session.status_compacting": "Compacting Context", - "session.status_active": "Session Active", - "session.status_ready_session": "Session Ready", - "session.status_ready": "Ready", - "session.delete_session_title": "Delete session?", - "session.delete_named_session_message": - 'This will permanently delete "{title}" and its messages.', - "session.delete_session_generic": - "This will permanently delete the selected session and its messages.", - "session.deleting": "Deleting...", - "session.delete": "Delete", - "session.loading_session": "Loading session", - "session.workspace_fallback": "Workspace", - "session.model_fallback": "Model", - "session.close_quick_actions": "Close quick actions", - "session.prev_match": "Previous match", - "session.next_match": "Next match", - "session.close_search": "Close search", - "session.unable_to_open_obsidian": "Unable to open file in Obsidian", - "session.search_position": "{current} of {total}", - "session.conflict_sync_toast": - "Conflict syncing {path}. Saved local changes to {conflictPath}.", - "session.todo_progress": "{completed} out of {total} tasks completed", - "session.uploading_to_shared_folder": - "Uploading {label} to the shared folder...", - "session.uploaded_with_summary": "Uploaded to the shared folder: {summary}", - "session.cmd_sessions_detail": "{count} available across workspaces", - "session.cmd_model_detail": "{model} · {variant}", - "session.show_earlier": "Show {count} earlier message{plural}", - "session.back": "Back", - "session.no_matches_command": "No matches.", - "session.palette_hint_navigate": "Arrow keys to navigate", - "session.palette_hint_run": "Enter to run · Esc to close", - - // ==================== Message List (tool headlines & subagent) ==================== - "message_list.tool_run_command": "Run {command}", - "message_list.tool_run_command_fallback": "Run command", - "message_list.tool_reviewed_file": "Reviewed {file}", - "message_list.tool_reviewed_file_fallback": "Reviewed file", - "message_list.tool_updated_file": "Updated {file}", - "message_list.tool_updated_file_fallback": "Updated file", - "message_list.tool_update_file": "Update {file}", - "message_list.tool_update_file_fallback": "Update file", - "message_list.tool_searched_pattern": "Searched {pattern}", - "message_list.tool_searched_code_fallback": "Searched code", - "message_list.tool_reviewed_path": "Reviewed {path}", - "message_list.tool_reviewed_files_fallback": "Reviewed files", - "message_list.tool_delegate_agent": "Delegate {agent}", - "message_list.tool_delegate_task_fallback": "Delegate task", - "message_list.tool_update_todo": "Update todo list", - "message_list.tool_read_todo": "Read todo list", - "message_list.tool_checked_url": "Checked {url}", - "message_list.tool_checked_web_fallback": "Checked web page", - "message_list.tool_load_skill_named": "Load skill {name}", - "message_list.tool_load_skill_fallback": "Load skill", - "message_list.subagent_type_task": "{agentType} task", - "message_list.subagent_session_fallback": "Subagent session", - "message_list.subagent_loading_transcript": "Loading transcript", - "message_list.subagent_running": "Running", - "message_list.subagent_message_count": "{count} message{plural}", - "message_list.subagent_waiting_transcript": "Waiting for transcript", - "message_list.open_session": "Open session", - "message_list.step_updates_progress": "Updates progress", - - // ==================== Inbox Panel (additional) ==================== - "inbox_panel.copied_path": "Copied: {path}", - "inbox_panel.download_failed": "Download failed", - - // ==================== Restored Page i18n Keys ==================== - // automations + "app.compact_command_desc": "Summarize this session to reduce context size.", + "app.connection_lost": "Server connection lost. Please reload.", + "app.deep_link_auth_queued": "Queued the Cloud auth deep link for OpenWork.", + "app.deep_link_remote_queued": "Queued remote worker link. OpenWork should move into the connect flow.", + "app.error.choose_folder": "Choose a folder to continue.", + "app.error.host_requires_local": "Select a local workspace to start the engine.", + "app.error.install_failed": "OpenCode install failed. See logs above.", + "app.error.pick_workspace_folder": "Pick a workspace folder first.", + "app.error.remote_base_url_required": "Add a server URL to continue.", + "app.error.tauri_required": "This action requires the Tauri app runtime.", + "app.error_audit_load": "Failed to load audit log.", + "app.error_auth_failed": "Authentication failed", + "app.error_auto_compact_scope": "Auto context compaction can only be changed for a local workspace or a writable OpenWork server workspace.", + "app.error_cloud_signin": "Failed to complete OpenWork Cloud sign-in.", + "app.error_command_not_resolved": "Command was not resolved.", + "app.error_compact_empty": "Nothing to compact yet.", + "app.error_compact_no_session": "Select a session with messages before running /compact.", + "app.error_compact_no_session_id": "Select a session before compacting.", + "app.error_connect_first": "Connect to this worker before applying runtime changes.", + "app.error_connection_failed": "Connection failed", + "app.error_connection_failed_url": "Connection failed. Check the URL and token.", + "app.error_deep_link_unrecognized": "That link is not a recognized OpenWork deep link or share URL.", + "app.error_desktop_signin": "Desktop sign-in completed, but OpenWork Cloud did not return a session token.", + "app.error_not_connected": "Not connected to a server", + "app.error_pick_local_folder": "Pick a local worker folder before restarting the local server.", + "app.error_rate_limit": "Rate limit exceeded", + "app.error_remote_access": "Failed to update remote access.", + "app.error_request_failed": "Request failed", + "app.error_reset_config": "Failed to reset app config defaults.", + "app.error_restart_local_worker": "Failed to restart the local worker with the updated sharing setting.", + "app.error_runtime_changes": "Failed to apply runtime changes.", + "app.error_session_name_required": "Session name is required", + "app.error_update_opencode_json": "Failed to update opencode.json", + "app.import_bundle_desc": "Choose how to import this bundle.", + "app.import_shared_bundle": "Import shared bundle", + "app.local_disabled_reason": "Create local workspaces in the desktop app. Remote and shared workspaces still work here.", + "app.local_worker_detail": "Local worker", + "app.model_behavior_desc": "Choose the model first to see provider-specific behavior controls.", + "app.model_behavior_title": "Model behavior", + "app.plugins_hint_disconnected": "OpenWork server unavailable. Plugins are read-only.", + "app.plugins_hint_limited": "OpenWork server needs a token to edit plugins.", + "app.plugins_hint_readonly": "OpenWork server is read-only for plugins.", + "app.reload_later": "Later", + "app.reload_now": "Reload now", + "app.reload_stop_tasks": "Reload & Stop Tasks", + "app.remote_worker_detail": "Remote worker", + "app.reset_config_ok": "Reset app config defaults. Restart OpenWork if any stale settings remain.", + "app.shared_setup": "Shared setup", + "app.skill_added": "Skill added", + "app.skills_hint_disconnected": "OpenWork server unavailable. Add the server URL/token in Advanced to manage skills.", + "app.skills_hint_limited": "OpenWork server needs a host token to install/update skills. Add it in Advanced and reconnect.", + "app.skills_hint_readonly": "OpenWork server is read-only for skills. Add a host token in Advanced to enable installs.", + "app.unknown_error": "Unknown error", + "app.worker_fallback": "Worker", "automations.desktop_required": "Scheduled tasks require the desktop app.", "automations.failed_to_load": "Failed to load scheduled tasks.", "automations.prompt_empty": "Automation prompt is empty.", "automations.prompt_required": "Prompt is required.", "automations.schedule_required": "Schedule is required.", - "automations.server_needs_token": - "OpenWork server needs a token to load scheduled tasks.", + "automations.server_needs_token": "OpenWork server needs a token to load scheduled tasks.", "automations.server_not_ready": "OpenWork server not ready.", - "automations.server_unavailable": - "OpenWork server unavailable. Connect to sync scheduled tasks.", - - // common + "automations.server_unavailable": "OpenWork server unavailable. Connect to sync scheduled tasks.", + "blueprint.automation_body": "Start from a reusable workflow or type your own task below.", + "blueprint.automation_title": "What do you want to automate?", + "blueprint.csv_session_assistant": "I can help you generate, clean, merge, and summarize CSV files. What kind of CSV work do you want to automate?", + "blueprint.csv_session_title": "CSV workflow ideas", + "blueprint.csv_session_user": "I want to combine exports from multiple tools into one clean CSV.", + "blueprint.empty_body": "Pick a starting point or just type below.", + "blueprint.empty_title": "What do you want to do?", + "blueprint.minimal_body": "Ask a question about this workspace or use a starter prompt.", + "blueprint.minimal_title": "Start with a task", + "blueprint.starter_blueprint_desc": "Design a repeatable workflow with skills, commands, and handoff steps.", + "blueprint.starter_blueprint_prompt": "Help me design a reusable automation blueprint for this workspace. Ask what should be standardized, then propose the workflow.", + "blueprint.starter_blueprint_title": "Plan an automation blueprint", + "blueprint.starter_chrome_desc": "Start a browser automation conversation right away.", + "blueprint.starter_chrome_prompt": "Help me connect to Chrome and automate a repetitive task.", + "blueprint.starter_chrome_title": "Automate Chrome", + "blueprint.starter_command_desc": "Turn a repeated workflow into a slash command for this workspace.", + "blueprint.starter_command_prompt": "Help me create a reusable /command for this workspace. Ask what workflow I want to automate, then draft the command.", + "blueprint.starter_command_title": "Create a reusable command", + "blueprint.starter_connect_openai_desc": "Add your OpenAI provider so ChatGPT models are ready in new sessions.", + "blueprint.starter_connect_openai_title": "Connect ChatGPT", + "blueprint.starter_csv_desc": "Clean up or generate spreadsheet data.", + "blueprint.starter_csv_prompt": "Help me create or edit CSV files on this computer.", + "blueprint.starter_csv_title": "Work on a CSV", + "blueprint.starter_explore_desc": "Summarize the files and suggest the best first task to tackle.", + "blueprint.starter_explore_prompt": "Summarize this workspace, point out the most important files, and suggest the best first task.", + "blueprint.starter_explore_title": "Explore this workspace", + "blueprint.welcome_message": "Hi welcome to OpenWork!\n\nPeople use us to write .csv files on their computer, connect to Chrome and automate repetitive tasks, and sync contacts to Notion.\n\nBut the only limit is your imagination.\n\nWhat would you want to do?", + "blueprint.welcome_title": "Welcome to OpenWork", + "common.add": "Add", + "common.cancel": "Cancel", + "common.choose": "Choose", + "common.close": "Close", + "common.default_parens": "(default)", + "common.done": "Done", + "common.edit": "Edit", + "common.hide": "Hide", + "common.install": "Install", "common.navigate": "navigate", "common.next": "Next", + "common.off": "Off", + "common.on": "On", + "common.path": "Path", "common.question": "Question", + "common.refresh": "Refresh", "common.remove": "Remove", + "common.reset": "Reset", + "common.retry": "Retry", + "common.save": "Save", "common.select": "select", + "common.show": "Show", "common.something_went_wrong": "Something went wrong", "common.submit": "Submit", - - // config - "config.auto_reload_desc": - "Reload automatically after agents/skills/commands/config change (only when idle).", + "common.unknown": "Unknown", + "composer.agent_label": "Agent", + "composer.attach_files": "Attach files", + "composer.attachments_unavailable": "Attachments are unavailable.", + "composer.behavior_label": "Behavior", + "composer.configure": "Configure", + "composer.default_agent": "Default agent", + "composer.expand_pasted": "Click to expand pasted text", + "composer.failed_read_attachment": "Failed to read attachment", + "composer.file_exceeds_limit": "{name} exceeds the 8MB limit.", + "composer.file_kind": "File", + "composer.file_too_large_encoding": "{name} is too large after encoding. Try a smaller image.", + "composer.image_kind": "Image", + "composer.inserted_links_unsupported": "Inserted links for unsupported files.", + "composer.loading_agents": "Loading agents...", + "composer.loading_commands": "Loading commands...", + "composer.mcps_label": "MCPs", + "composer.no_commands": "No commands found.", + "composer.no_matches": "No matches found.", + "composer.placeholder": "Describe your task...", + "composer.remote_worker_paste_warning": "This is a remote worker. Sandboxes are remote too. To share files with it, upload them to the Shared folder in the sidebar.", + "composer.run_task": "Run task", + "composer.skill_source": "Skill", + "composer.stop": "Stop", + "composer.tools_label": "Commands, skills, and MCPs", + "composer.unsupported_attachment_type": "Unsupported attachment type.", + "composer.upload_failed_local_links": "Couldn't upload to the shared folder. Inserted local links instead.", + "composer.upload_to_shared_folder": "Upload to shared folder", + "composer.uploaded_multiple_files": "Uploaded {count} files to the shared folder and inserted links.", + "composer.uploaded_single_file": "Uploaded {name} to the shared folder and inserted a link.", + "config.auto_reload_desc": "Reload automatically after agents/skills/commands/config change (only when idle).", "config.auto_reload_title": "Auto reload (local)", - "config.auto_reload_unavailable": - "Available for local workspaces in the desktop app.", - "config.collaborator_token_disabled_hint": - "Stored in advance for remote sharing, but remote access is currently disabled.", + "config.auto_reload_unavailable": "Available for local workspaces in the desktop app.", + "config.collaborator_token_disabled_hint": "Stored in advance for remote sharing, but remote access is currently disabled.", "config.collaborator_token_label": "Collaborator token", - "config.collaborator_token_remote_hint": - "Routine remote access for phones or laptops connecting to this server.", + "config.collaborator_token_remote_hint": "Routine remote access for phones or laptops connecting to this server.", "config.connection_failed": "Connection failed.", - "config.connection_failed_check": - "Connection failed. Check the host URL and token.", + "config.connection_failed_check": "Connection failed. Check the host URL and token.", "config.connection_status_updated": "Connection status updated.", "config.connection_successful": "Connection successful.", "config.copied": "Copied", "config.copy": "Copy", - "config.desktop_only_hint": - "Some config features (local server sharing + messaging bridge) require the desktop app.", + "config.desktop_only_hint": "Some config features (local server sharing + messaging bridge) require the desktop app.", "config.diagnostics_desc": "Copy sanitized runtime state for debugging.", "config.diagnostics_title": "Diagnostics bundle", "config.enable_auto_reload_first": "Enable auto reload first", - "config.engine_reload_desc": - "Restart the OpenCode server for this workspace.", + "config.engine_reload_desc": "Restart the OpenCode server for this workspace.", "config.engine_reload_title": "Engine reload", - "config.host_admin_token_hint": - "Internal host-only token for approvals CLI and admin APIs. Do not use this in the remote app connect flow.", + "config.host_admin_token_hint": "Internal host-only token for approvals CLI and admin APIs. Do not use this in the remote app connect flow.", "config.host_admin_token_label": "Host admin token", "config.host_local_only": "Local only", "config.host_offline": "Offline", "config.host_remote_enabled": "Remote enabled", - "config.local_ip_hint": - "Use your local IP on the same Wi-Fi for the fastest connection.", - "config.mdns_hint": - ".local names are easier to remember but may not resolve on all networks.", - "config.messaging_identities_desc": - "Manage Telegram/Slack identities and routing in the Identities tab.", + "config.local_ip_hint": "Use your local IP on the same Wi-Fi for the fastest connection.", + "config.mdns_hint": ".local names are easier to remember but may not resolve on all networks.", + "config.messaging_identities_desc": "Manage Telegram/Slack identities and routing in the Identities tab.", "config.messaging_identities_title": "Messaging identities", "config.not_set": "Not set", - "config.owner_token_disabled_hint": - "Only relevant after you enable remote access for this worker.", + "config.owner_token_disabled_hint": "Only relevant after you enable remote access for this worker.", "config.owner_token_label": "Owner token", - "config.owner_token_remote_hint": - "Use this when a remote client needs to answer permission prompts or take owner-only actions.", + "config.owner_token_remote_hint": "Use this when a remote client needs to answer permission prompts or take owner-only actions.", "config.reload_active_tasks_warning": "Reloading will stop active tasks.", - "config.reload_availability_hint": - "Reloading is only available for local workers or connected OpenWork servers.", + "config.reload_availability_hint": "Reloading is only available for local workers or connected OpenWork servers.", "config.reload_connect_hint": "Connect to this worker to reload.", "config.reload_engine": "Reload engine", - "config.reload_now_desc": - "Applies config updates and reconnects your session.", + "config.reload_now_desc": "Applies config updates and reconnects your session.", "config.reload_now_title": "Reload now", "config.reloading": "Reloading...", - "config.remote_access_off_hint": - "Remote access is off. Use Share workspace to enable it before connecting from another machine.", + "config.remote_access_off_hint": "Remote access is off. Use Share workspace to enable it before connecting from another machine.", "config.resolved_worker_url": "Resolved worker URL:", - "config.resume_sessions_desc": - "If a reload was queued while tasks were running, send a resume message afterward.", + "config.resume_sessions_desc": "If a reload was queued while tasks were running, send a resume message afterward.", "config.resume_sessions_title": "Resume sessions after auto reload", - "config.server_needed_hint": - "OpenWork server connection needed to sync skills, plugins, and commands.", - "config.server_section_desc": - "Connect to an OpenWork server. Use the URL plus a collaborator or owner token from your server admin.", + "config.server_needed_hint": "OpenWork server connection needed to sync skills, plugins, and commands.", + "config.server_section_desc": "Connect to an OpenWork server. Use the URL plus a collaborator or owner token from your server admin.", "config.server_section_title": "OpenWork server", - "config.server_sharing_desc": - "Share these details with a trusted device. Keep the server on the same network for the fastest setup.", - "config.server_sharing_menu_hint": - "For per-workspace sharing links, use Share... in the workspace menu.", + "config.server_sharing_desc": "Share these details with a trusted device. Keep the server on the same network for the fastest setup.", + "config.server_sharing_menu_hint": "For per-workspace sharing links, use Share... in the workspace menu.", "config.server_sharing_title": "OpenWork server sharing", - "config.server_url_hint": - "Use the URL shared by your OpenWork server. Local desktop workers reuse a persistent high port in the 48000-51000 range.", + "config.server_url_hint": "Use the URL shared by your OpenWork server. Local desktop workers reuse a persistent high port in the 48000-51000 range.", "config.server_url_input_label": "OpenWork server URL", "config.server_url_label": "OpenWork Server URL", "config.starting_server": "Starting server…", @@ -2051,44 +206,304 @@ export default { "config.test_connection": "Test connection", "config.testing": "Testing...", "config.testing_connection": "Testing connection...", - "config.token_hint": - "Optional. Paste a collaborator token for routine access or an owner token when this client must answer permission prompts.", + "config.token_hint": "Optional. Paste a collaborator token for routine access or an owner token when this client must answer permission prompts.", "config.token_label": "Collaborator or owner token", "config.token_placeholder": "Paste your token", "config.unavailable": "Unavailable", "config.worker_id": "Worker ID:", - "config.workspace_config_desc": - "These settings affect the selected workspace. Runtime-only actions apply to whichever workspace is currently connected.", + "config.workspace_config_desc": "These settings affect the selected workspace. Runtime-only actions apply to whichever workspace is currently connected.", "config.workspace_config_title": "Workspace config", "config.workspace_id_prefix": "Workspace:", - - // extensions - "extensions.app_count_many": "apps connected", - "extensions.app_count_one": "app connected", + "context_panel.add_button": "Add", + "context_panel.add_folder_hint": "Add a folder to let this workspace read and edit files outside its root directory.", + "context_panel.adding_button": "Adding...", + "context_panel.always_available": "Always available", + "context_panel.authorized_folders": "Authorized folders", + "context_panel.authorized_folders_desc": "Grant this workspace access to read and edit files in directories outside of its root.", + "context_panel.authorized_folders_no_access": "Connect to a writable OpenWork server workspace to edit authorized folders.", + "context_panel.browse_button": "Browse", + "context_panel.config_access_unavailable": "OpenWork server config access is unavailable for this workspace.", + "context_panel.config_read_only": "OpenWork server is connected read-only for workspace config.", + "context_panel.context": "Context", + "context_panel.folder_already_authorized": "Folder is already authorized.", + "context_panel.folders_updated": "Authorized folders updated.", + "context_panel.input_placeholder": "Type a folder path to authorize...", + "context_panel.mcp": "MCP", + "context_panel.mcp_connected": "Connected", + "context_panel.mcp_disabled": "Disabled", + "context_panel.mcp_disconnected": "Disconnected", + "context_panel.mcp_failed": "Failed", + "context_panel.mcp_needs_auth": "Needs auth", + "context_panel.mcp_register_client": "Register client", + "context_panel.no_external_folders": "No external folders authorized", + "context_panel.no_mcp": "No MCP servers loaded.", + "context_panel.no_plugins": "No plugins loaded.", + "context_panel.no_server_workspace": "No active server workspace is selected.", + "context_panel.no_skills": "No skills loaded.", + "context_panel.none_yet": "None yet.", + "context_panel.plugins": "Plugins", + "context_panel.preserving_entries": "Preserving {count} non-folder permission entries.", + "context_panel.preserving_entry": "Preserving 1 non-folder permission entry.", + "context_panel.remove_folder": "Remove {name}", + "context_panel.saving_folders": "Saving authorized folders...", + "context_panel.server_disconnected": "OpenWork server is disconnected.", + "context_panel.skills": "Skills", + "context_panel.working_files": "Working files", + "context_panel.workspace_root_available": "Workspace root is already available.", + "context_panel.workspace_root_badge": "Workspace root", + "context_panel.writable_workspace_required": "A writable OpenWork server workspace is required to update authorized folders.", + "dashboard.access_token": "Access token", + "dashboard.access_token_optional_hint": "Add a token only if the worker requires one.", + "dashboard.blueprints_workspace": "Blueprints", + "dashboard.blueprints_workspace_desc": "Start with an automation-ready workspace for reusable skills, commands, and shared flows.", + "dashboard.change": "Change", + "dashboard.choose_folder": "Choose a folder", + "dashboard.choose_folder_continue": "Choose a folder to continue.", + "dashboard.choose_folder_next": "Share files with your workspace.", + "dashboard.choose_preset": "Choose Preset", + "dashboard.chooser_local_desc": "Create a workspace on this device and optionally start from a team template.", + "dashboard.chooser_remote_desc": "Attach to a self-hosted OpenWork worker using a URL and access token.", + "dashboard.chooser_shared_desc": "Browse cloud workers shared with your organization and connect in one step.", + "dashboard.close_settings": "Close settings", + "dashboard.cloud_signin_button": "Continue with Cloud", + "dashboard.cloud_signin_hint": "Access remote workers shared with your organization.", + "dashboard.cloud_signin_next": "You'll pick a team and connect to an existing workspace next.", + "dashboard.cloud_signin_title": "Sign in to OpenWork Cloud", + "dashboard.cloud_worker": "Cloud worker", + "dashboard.commands": "Commands", + "dashboard.connect_remote_button": "Connect remote", + "dashboard.connected": "Connected", + "dashboard.connecting": "Connecting...", + "dashboard.create_local_workspace_subtitle": "Create a workspace on this device and optionally start from a team template.", + "dashboard.create_local_workspace_title": "Local workspace", + "dashboard.create_remote_custom_subtitle": "Attach to a self-hosted OpenWork worker.", + "dashboard.create_remote_custom_title": "Connect custom remote", + "dashboard.create_remote_workspace_confirm": "Add Workspace", + "dashboard.create_remote_workspace_subtitle": "Save an OpenWork server as a workspace.", + "dashboard.create_remote_workspace_title": "Add Remote Workspace", + "dashboard.create_sandbox_confirm": "Create as sandbox", + "dashboard.create_shared_subtitle_signed_in": "Browse cloud workers shared with your organization and connect in one step.", + "dashboard.create_shared_subtitle_signed_out": "Sign in to OpenWork Cloud to access workers shared with your organization.", + "dashboard.create_shared_title": "Shared workspaces", + "dashboard.create_workspace_confirm": "Create Workspace", + "dashboard.create_workspace_subtitle": "Initialize a new folder-based workspace.", + "dashboard.create_workspace_title": "Create Workspace", + "dashboard.creating": "Creating...", + "dashboard.desktop_badge": "Desktop", + "dashboard.display_name_label": "Display name", + "dashboard.display_name_optional": "(optional)", + "dashboard.docker_debug_details": "Docker debug details", + "dashboard.edit_remote_workspace_confirm": "Save connection", + "dashboard.edit_remote_workspace_subtitle": "Update the OpenWork server details for this workspace.", + "dashboard.edit_remote_workspace_title": "Edit Remote Connection", + "dashboard.empty_workspace": "Empty workspace", + "dashboard.empty_workspace_desc": "Start with a blank folder and add what you need.", + "dashboard.error_choose_org": "Choose an organization before opening a workspace.", + "dashboard.error_connect_worker": "Failed to connect to {name}.", + "dashboard.error_create_template": "Failed to create {name}.", + "dashboard.error_load_orgs": "Failed to load organizations.", + "dashboard.error_load_shared_workspaces": "Failed to load shared workspaces.", + "dashboard.error_workspace_not_ready": "Workspace is not ready to connect yet. Try again in a moment.", + "dashboard.import_config": "Import config", + "dashboard.importing": "Importing…", + "dashboard.modal_back": "Back", + "dashboard.modal_close": "Close add workspace modal", + "dashboard.nav_ids": "IDs", + "dashboard.no_folder_selected": "No folder selected yet.", + "dashboard.open_cloud_dashboard": "Open cloud dashboard", + "dashboard.opening": "Opening...", + "dashboard.openwork_host_hint": "Use the URL shared by your OpenWork server.", + "dashboard.openwork_host_label": "OpenWork server URL", + "dashboard.openwork_host_placeholder": "https://your-server.openwork.app", + "dashboard.openwork_host_token_hint": "Optional. Paste a collaborator token for routine access or an owner token when this client must answer permission prompts.", + "dashboard.openwork_host_token_label": "Collaborator or owner token", + "dashboard.openwork_host_token_placeholder": "Paste your token", + "dashboard.recently_updated": "Recently updated", + "dashboard.remote": "Remote", + "dashboard.remote_base_url_required": "Add a server URL to continue.", + "dashboard.remote_connection_direct": "Direct", + "dashboard.remote_connection_openwork": "OpenWork", + "dashboard.remote_directory_hint": "Leave blank to use the server default.", + "dashboard.remote_directory_label": "Workspace directory (optional)", + "dashboard.remote_directory_placeholder": "/home/team/project", + "dashboard.remote_display_name_label": "Display name (optional)", + "dashboard.remote_display_name_placeholder": "Design team workspace", + "dashboard.remote_server_details_hint": "Attach to a self-hosted OpenWork worker.", + "dashboard.remote_server_details_title": "Remote server details", + "dashboard.remote_workspace_hint": "Track an OpenWork server and reconnect anytime.", + "dashboard.remote_workspace_title": "Remote workspace", + "dashboard.repair_cache": "Repair cache", + "dashboard.repairing_cache": "Repairing cache", + "dashboard.sandbox_checking_docker": "Checking Docker...", + "dashboard.sandbox_get_ready_action": "Get your system ready", + "dashboard.sandbox_get_ready_desc": "Run this workspace in an isolated Docker container for safer, more reproducible runs.", + "dashboard.sandbox_get_ready_title": "Sandboxes need Docker", + "dashboard.sandbox_hide_logs": "Hide logs", + "dashboard.sandbox_live_logs": "Live Logs", + "dashboard.sandbox_setup": "Sandbox setup", + "dashboard.sandbox_show_logs": "Show logs", + "dashboard.search_shared_workspaces": "Search shared workspaces", + "dashboard.select_folder": "Select Folder", + "dashboard.settings": "Settings", + "dashboard.shared_workspaces_loading": "Loading shared workspaces…", + "dashboard.shared_workspaces_no_match": "No shared workspaces match that search.", + "dashboard.shared_workspaces_none": "No shared workspaces available yet.", + "dashboard.shared_workspaces_refreshing": "Refreshing workspaces…", + "dashboard.skills": "Skills", + "dashboard.starter_workspace": "Starter workspace", + "dashboard.starter_workspace_desc": "Preconfigured to show you how to use plugins, commands, and skills.", + "dashboard.team_templates_hint": "Choose a starting point, or leave blank to create an empty workspace.", + "dashboard.team_templates_none": "No shared workspace templates found for this org yet.", + "dashboard.team_templates_syncing": "Syncing", + "dashboard.team_templates_title": "Team templates", + "dashboard.template_selected_badge": "Selected", + "dashboard.unknown_creator": "Unknown creator", + "dashboard.worker_status_attention": "Attention", + "dashboard.worker_status_ready": "Ready", + "dashboard.worker_status_starting": "Starting", + "dashboard.worker_status_stopped": "Stopped", + "dashboard.worker_status_unknown": "Unknown", + "dashboard.worker_url_hint": "Paste the URL for the OpenWork worker you want to connect to.", + "dashboard.worker_url_label": "Worker URL", + "dashboard.workspace_connect": "Connect", + "dashboard.workspace_connect_unavailable": "Connecting shared workspaces is unavailable here.", + "dashboard.workspace_connecting": "Connecting", + "dashboard.workspace_folder_hint": "Choose where this workspace should live on your device.", + "dashboard.workspace_folder_title": "Workspace folder", + "dashboard.workspace_not_ready_title": "This workspace is not ready to connect yet.", + "dashboard.workspaces": "Workspaces", + "den.active_org_hint": "Cloud workers and team templates are scoped to the selected org.", + "den.active_org_title": "Active org", + "den.auto_reconnect_hint": "Finish auth in your browser and OpenWork will reconnect here automatically.", + "den.checking_session": "Checking session", + "den.choose_org_for_providers": "Choose an org to view cloud providers.", + "den.choose_org_for_skill_hubs": "Choose an org to view cloud skill hubs.", + "den.choose_org_for_templates": "Choose an org to view team templates.", + "den.cloud_account_hint": "Manage your connected account and organization.", + "den.cloud_account_title": "Cloud account", + "den.cloud_control_plane_open": "Open in browser", + "den.cloud_control_plane_reset": "Reset", + "den.cloud_control_plane_save": "Save URL", + "den.cloud_control_plane_url_hint": "Developer mode only. Use this to target a local or self-hosted Cloud control plane. Changing it signs you out so the app can re-hydrate against the new control plane.", + "den.cloud_control_plane_url_label": "Cloud control plane URL", + "den.cloud_provider_detail": "{count} models · {source} provider", + "den.cloud_provider_removed_detail": "This imported provider is no longer in cloud. Uninstall the local {providerId} config.", + "den.cloud_provider_sync_detail": "Cloud provider changed. Sync the {count} model {source} config into opencode.jsonc.", + "den.cloud_providers_hint": "Import managed LLM providers into opencode.jsonc and use the org credential in this workspace.", + "den.cloud_providers_title": "Cloud providers", + "den.cloud_section_desc": "Sign in, pick an org, and open Cloud workers or team templates.", + "den.cloud_section_title": "OpenWork Cloud", + "den.cloud_sleep_hint": "Sign in to OpenWork Cloud to keep your tasks alive even when your computer sleeps.", + "den.cloud_workers_hint": "Open workers directly into OpenWork using the same remote-connect flow the app already uses elsewhere.", + "den.cloud_workers_title": "Cloud workers", + "den.create_account": "Create account", + "den.credentials_ready_badge": "Credential ready", + "den.error_base_url": "Enter a valid http:// or https:// Cloud control plane URL.", + "den.error_choose_org": "Choose an org before opening a worker.", + "den.error_load_orgs": "Failed to load orgs.", + "den.error_load_templates": "Failed to load team templates.", + "den.error_load_workers": "Failed to load workers.", + "den.error_no_session": "No active Cloud session found.", + "den.error_no_token": "Desktop sign-in completed, but OpenWork Cloud did not return a session token.", + "den.error_open_template": "Failed to open {name}.", + "den.error_open_worker": "Failed to open {name} in OpenWork.", + "den.error_open_worker_fallback": "Failed to open {name}.", + "den.error_paste_valid_code": "Paste a valid OpenWork sign-in link or one-time sign-in code.", + "den.error_signin_failed": "Failed to complete OpenWork Cloud sign-in.", + "den.error_worker_not_ready": "Worker is not ready to open yet. Try again after provisioning finishes.", + "den.finish_signin": "Finish sign-in", + "den.finishing": "Finishing...", + "den.hide_signin_code": "Hide sign-in code", + "den.import_all": "Import all", + "den.import_provider": "Import", + "den.import_provider_failed": "Failed to import {name}.", + "den.imported_badge": "Imported", + "den.imported_provider": "Imported {name}.", + "den.importing": "Importing...", + "den.needs_attention": "Needs attention", + "den.no_cloud_providers": "No cloud providers are available for this org yet.", + "den.no_cloud_workers": "No cloud workers are visible for this org yet. Create one in Cloud, then refresh this tab.", + "den.no_org_selected": "No org selected", + "den.no_skill_hubs": "No cloud skill hubs are available for this org yet.", + "den.no_team_templates": "No team templates yet. Use Share → Template → Share with team.", + "den.open": "Open", + "den.opening": "Opening...", + "den.org_member_suffix": "(Member)", + "den.org_owner_suffix": "(Owner)", + "den.org_switched": "Switched to {name}.", + "den.out_of_sync_badge": "Out of sync", + "den.paste_signin_code": "Paste sign-in code", + "den.refresh": "Refresh", + "den.reload_workspace": "Reload workspace to apply config changes.", + "den.remove_provider_failed": "Failed to remove {name}.", + "den.removed_from_cloud_badge": "Removed from cloud", + "den.removed_provider": "Removed {name}.", + "den.removing": "Removing...", + "den.sign_out": "Sign out", + "den.signed_out": "Signed out", + "den.signin_button": "Sign in", + "den.signin_code_note": "Accepts an openwork://den-auth link or the raw one-time grant.", + "den.signin_link_hint": "If your browser doesn't bounce back into OpenWork automatically, paste the sign-in link or one-time code from OpenWork Cloud here.", + "den.signin_link_label": "Sign-in link or one-time code", + "den.signin_link_placeholder": "openwork://den-auth?... or pasted code", + "den.signin_title": "Sign in to OpenWork Cloud", + "den.signing_in": "Finishing OpenWork Cloud sign-in...", + "den.signing_out": "Signing out...", + "den.skill_hub_detail": "Import {count} shared skills into .opencode/skills.", + "den.skill_hub_imported_detail": "Imported {count} skills into this workspace.", + "den.skill_hub_removed_detail": "This hub was removed from cloud. Uninstall the {importedCount} imported skills from this workspace.", + "den.skill_hub_skills_badge": "{count} skills", + "den.skill_hub_sync_detail": "Cloud now has {liveCount} skills; this workspace imported {importedCount}. Sync to update the installed set.", + "den.skill_hubs_hint": "Import every skill from a shared cloud hub into this workspace in one step.", + "den.skill_hubs_title": "Skill hubs", + "den.status_base_url_updated": "Updated the Cloud control plane URL. Sign in again to continue.", + "den.status_browser_signin": "Finish signing in in your browser to connect OpenWork.", + "den.status_browser_signup": "Finish account creation in your browser to connect OpenWork.", + "den.status_cloud_signed_in_as": "Connected OpenWork Cloud as {email}.", + "den.status_cloud_signin_done": "Connected OpenWork Cloud.", + "den.status_loaded_orgs": "Loaded {count} org{plural}.", + "den.status_loaded_templates": "Loaded {count} template{plural} for {name}.", + "den.status_loaded_workers": "Loaded {count} worker{plural} for {name}.", + "den.status_no_templates": "No team templates found for {name}.", + "den.status_no_workers": "No workers found for {name}.", + "den.status_opened_template": "Opened {name} from {org}.", + "den.status_opened_template_fallback": "Opened {name} from team templates.", + "den.status_opened_worker": "Opened {name} in OpenWork.", + "den.status_signed_in_as": "Signed in as {email}.", + "den.status_signed_out": "Signed out and cleared your OpenWork Cloud session on this device.", + "den.sync": "Sync", + "den.sync_provider_failed": "Failed to sync {name}.", + "den.synced_provider": "Synced {name}.", + "den.syncing": "Syncing...", + "den.team_template_badge": "Team template", + "den.team_templates_hint": "Open reusable workspace templates shared with this organization.", + "den.team_templates_title": "Team templates", + "den.uninstall": "Uninstall", + "den.worker_mine_badge": "Mine", + "den.worker_not_ready_title": "This worker is not ready to open yet.", + "den.worker_provider_label": "{provider} worker", + "den.worker_secondary_cloud": "Cloud worker", + "extensions.app_count_one": "{count} app connected", + "extensions.app_count_many": "{count} apps connected", "extensions.apps_mcp_header": "Apps (MCP)", "extensions.filter_all": "All", "extensions.filter_apps": "Apps", "extensions.filter_plugins": "Plugins", - "extensions.plugin_count_many": "plugins", - "extensions.plugin_count_one": "plugin", + "extensions.plugin_count_one": "{count} plugin", + "extensions.plugin_count_many": "{count} plugins", "extensions.plugins_opencode_header": "Plugins (OpenCode)", "extensions.subtitle": "Apps (MCP) and OpenCode plugins live in one place.", - - // identities - "identities.agent_behavior_desc": - "One file per workspace. Add optional first line @agent to route via a specific OpenCode agent.", + "extensions.title": "Extensions", + "identities.agent_behavior_desc": "One file per workspace. Add optional first line @agent to route via a specific OpenCode agent.", "identities.agent_behavior_title": "Messaging agent behavior", "identities.agent_created": "Created default messaging agent file.", - "identities.agent_file_changed": - "File changed remotely. Reload and save again.", + "identities.agent_file_changed": "File changed remotely. Reload and save again.", "identities.agent_loading": "Loading agent file…", "identities.agent_none": "none", "identities.agent_not_found": "Agent file not found in this workspace yet.", - "identities.agent_placeholder": - "Add messaging behavior instructions for opencodeRouter here...", + "identities.agent_placeholder": "Add messaging behavior instructions for opencodeRouter here...", "identities.agent_saved": "Saved messaging behavior.", - "identities.agent_scope_status": - "Active scope: workspace · status: {status} · selected agent: {agent}", + "identities.agent_scope_status": "Active scope: workspace · status: {status} · selected agent: {agent}", "identities.agent_status_loaded": "loaded", "identities.agent_status_missing": "missing", "identities.agent_worker_scope_unavailable": "Worker scope unavailable.", @@ -2097,12 +512,10 @@ export default { "identities.auto_bind_label": "Auto-bind peer to directory on direct send", "identities.available_channels": "Available channels", "identities.bot_token_label": "Bot token", - "identities.bot_token_placeholder": - "Paste Telegram bot token from @BotFather", + "identities.bot_token_placeholder": "Paste Telegram bot token from @BotFather", "identities.botfather_step1_open": "1. Open @BotFather in Telegram", "identities.botfather_step1_run": "and run /newbot", - "identities.botfather_step3_choose": - "3. Choose a name and username for your bot", + "identities.botfather_step3_choose": "3. Choose a name and username for your bot", "identities.botfather_step3_or_private": "for open inbox or", "identities.botfather_step3_private": "Private", "identities.botfather_step3_public": "Public", @@ -2111,8 +524,7 @@ export default { "identities.channels_connected": "connected", "identities.channels_label": "Channels", "identities.configured_suffix": "configured", - "identities.connect_server_desc": - "Identities are available when you are connected to an OpenWork host.", + "identities.connect_server_desc": "Identities are available when you are connected to an OpenWork host.", "identities.connect_server_title": "Connect to an OpenWork server", "identities.connect_slack": "Connect Slack", "identities.connected_badge": "Connected", @@ -2126,24 +538,21 @@ export default { "identities.default_routing": "Default routing", "identities.directory_label": "Directory (optional)", "identities.disable_messaging": "Disable messaging", - "identities.disable_messaging_message": - "This will turn off messaging for this workspace. Telegram and Slack setup will be hidden until messaging is enabled again, and you will need to restart the worker to fully stop the messaging sidecar.", + "identities.disable_messaging_message": "This will turn off messaging for this workspace. Telegram and Slack setup will be hidden until messaging is enabled again, and you will need to restart the worker to fully stop the messaging sidecar.", "identities.disable_messaging_title": "Disable messaging for this worker?", "identities.disabled_label": "Disabled", "identities.disabling": "Disabling...", "identities.disconnect": "Disconnect", "identities.dispatched_messages": "Dispatched {sent}/{attempted} messages.", "identities.enable_messaging": "Enable messaging", - "identities.enable_messaging_risk": - "Messaging can expose this worker to remote commands. If a bot is public or compromised, it can access files, credentials, and API keys available to this worker.", + "identities.enable_messaging_risk": "Messaging can expose this worker to remote commands. If a bot is public or compromised, it can access files, credentials, and API keys available to this worker.", "identities.enable_messaging_title": "Enable messaging for this worker?", "identities.enabled_label": "Enabled", "identities.enabling": "Enabling...", "identities.health_offline": "Offline", "identities.health_running": "Running", "identities.health_unavailable": "Unavailable", - "identities.health_unavailable_status": - "OpenCodeRouter health unavailable ({status})", + "identities.health_unavailable_status": "OpenCodeRouter health unavailable ({status})", "identities.health_unknown": "Unknown", "identities.hours_ago": "{hours}h ago", "identities.identities_label": "Identities", @@ -2151,27 +560,20 @@ export default { "identities.last_activity": "Last activity", "identities.later": "Later", "identities.message_label": "Message", - "identities.message_routing_desc": - "Control which conversations go to which workspace folder. Messages are routed to the worker's default folder unless you set up rules here.", + "identities.message_routing_desc": "Control which conversations go to which workspace folder. Messages are routed to the worker's default folder unless you set up rules here.", "identities.message_routing_title": "Message routing", "identities.messages_today": "Messages today", - "identities.messaging_disabled_hint": - "Enable messaging only if you understand the risk and plan to secure access (for example, private Telegram pairing).", - "identities.messaging_disabled_restart": - "Messaging disabled. Restart this worker to stop the messaging sidecar.", - "identities.messaging_disabled_risk": - "Messaging bots can execute actions against your local worker. If exposed publicly, they may allow access to files, credentials, and API keys available to this worker.", + "identities.messaging_disabled_hint": "Enable messaging only if you understand the risk and plan to secure access (for example, private Telegram pairing).", + "identities.messaging_disabled_restart": "Messaging disabled. Restart this worker to stop the messaging sidecar.", + "identities.messaging_disabled_risk": "Messaging bots can execute actions against your local worker. If exposed publicly, they may allow access to files, credentials, and API keys available to this worker.", "identities.messaging_disabled_title": "Messaging is disabled by default", - "identities.messaging_enabled_restart": - "Messaging enabled. Restart this worker to apply before configuring channels.", - "identities.messaging_sidecar_not_running": - "Messaging is enabled in this workspace, but the messaging sidecar is not running yet. Restart this worker, then return to Messaging settings to connect Telegram or Slack.", + "identities.messaging_enabled_restart": "Messaging enabled. Restart this worker to apply before configuring channels.", + "identities.messaging_sidecar_not_running": "Messaging is enabled in this workspace, but the messaging sidecar is not running yet. Restart this worker, then return to Messaging settings to connect Telegram or Slack.", "identities.minutes_ago": "{minutes}m ago", "identities.not_set": "Not set", "identities.open_bot_link": "Open @{username} in Telegram", "identities.pairing_code_copied": "Pairing code copied.", - "identities.pairing_code_copy_failed": - "Could not copy pairing code. Copy it manually.", + "identities.pairing_code_copy_failed": "Could not copy pairing code. Copy it manually.", "identities.pairing_code_instruction_prefix": "Send", "identities.peer_id_label": "Peer ID (optional)", "identities.peer_id_placeholder_slack": "e.g. slack:U12345678", @@ -2179,24 +581,18 @@ export default { "identities.private_label": "Private", "identities.private_pairing_code": "Private pairing code", "identities.public_bot_confirm": "Yes I understand the risk", - "identities.public_bot_warning_message": - "Your bot will be accessible to the public and anyone who gets access to your bot will be able to have full access to your local worker including any files or API keys that you've given it. If you create a private bot, you can limit who can access it by requiring a pairing token. Are you sure you want to make your bot public?", + "identities.public_bot_warning_message": "Your bot will be accessible to the public and anyone who gets access to your bot will be able to have full access to your local worker including any files or API keys that you've given it. If you create a private bot, you can limit who can access it by requiring a pairing token. Are you sure you want to make your bot public?", "identities.public_bot_warning_title": "Make this bot public?", "identities.public_label": "Public", "identities.quick_setup": "Quick setup", - "identities.reconnect_failed": - "Reconnect failed. Check OpenWork URL/token and try again.", + "identities.reconnect_failed": "Reconnect failed. Check OpenWork URL/token and try again.", "identities.reconnected": "Reconnected.", - "identities.reconnected_refreshing": - "Reconnected. Refreshing worker state...", + "identities.reconnected_refreshing": "Reconnected. Refreshing worker state...", "identities.reload": "Reload", "identities.repair_reconnect": "Repair & reconnect", - "identities.restart_failed": - "Restart failed. Please restart the worker from Settings and try again.", - "identities.restart_to_disable_messaging": - "Messaging was disabled for this workspace. Restart the worker now to stop the messaging sidecar.", - "identities.restart_to_enable_messaging": - "Messaging was enabled for this workspace. Restart the worker now to start the messaging sidecar and unlock Telegram and Slack setup.", + "identities.restart_failed": "Restart failed. Please restart the worker from Settings and try again.", + "identities.restart_to_disable_messaging": "Messaging was disabled for this workspace. Restart the worker now to stop the messaging sidecar.", + "identities.restart_to_enable_messaging": "Messaging was enabled for this workspace. Restart the worker now to start the messaging sidecar and unlock Telegram and Slack setup.", "identities.restart_worker": "Restart worker", "identities.restart_worker_title": "Restart worker now?", "identities.restarting": "Restarting...", @@ -2206,31 +602,24 @@ export default { "identities.save_behavior": "Save behavior", "identities.saving": "Saving...", "identities.send_test_button": "Send test message", - "identities.send_test_desc": - "Validate outbound wiring. Use a peer ID for direct send, or leave peer ID empty to fan out by bindings in a directory.", + "identities.send_test_desc": "Validate outbound wiring. Use a peer ID for direct send, or leave peer ID empty to fan out by bindings in a directory.", "identities.send_test_title": "Send test message", "identities.sending": "Sending...", - "identities.slack_desc": - "Your worker appears as a bot in Slack channels. Team members can message it directly or mention it in threads.", - "identities.slack_intro": - "Connect your Slack workspace to let team members interact with this worker in channels and DMs.", + "identities.slack_desc": "Your worker appears as a bot in Slack channels. Team members can message it directly or mention it in threads.", + "identities.slack_intro": "Connect your Slack workspace to let team members interact with this worker in channels and DMs.", "identities.slack_unavailable": "Slack identities unavailable.", "identities.status_active": "Active", "identities.status_label": "Status", "identities.status_stopped": "Stopped", "identities.stopped_label": "Stopped", - "identities.subtitle": - "Let people reach your worker through messaging apps. Connect a channel and your worker will automatically read and respond to messages.", + "identities.subtitle": "Let people reach your worker through messaging apps. Connect a channel and your worker will automatically read and respond to messages.", "identities.tab_general": "General", - "identities.telegram_bot_access_desc": - "Public bot: first Telegram chat auto-links. Private bot: requires a pairing code before any messages run tools.", + "identities.telegram_bot_access_desc": "Public bot: first Telegram chat auto-links. Private bot: requires a pairing code before any messages run tools.", "identities.telegram_delete_failed": "Failed to delete.", "identities.telegram_deleted": "Deleted.", "identities.telegram_deleted_pending": "Deleted (pending apply).", - "identities.telegram_desc": - "Connect a Telegram bot in public mode (open inbox) or private mode (pairing code required).", - "identities.telegram_private_saved_pair": - "Private bot saved. Pair via /pair {code}", + "identities.telegram_desc": "Connect a Telegram bot in public mode (open inbox) or private mode (pairing code required).", + "identities.telegram_private_saved_pair": "Private bot saved. Pair via /pair {code}", "identities.telegram_save_failed": "Failed to save.", "identities.telegram_saved": "Saved.", "identities.telegram_saved_pending": "Saved (pending apply).", @@ -2241,31 +630,354 @@ export default { "identities.worker_offline": "Worker offline", "identities.worker_online": "Worker online", "identities.worker_restarted": "Worker restarted.", - "identities.worker_restarted_refreshing": - "Worker restarted. Refreshing messaging status...", + "identities.worker_restarted_refreshing": "Worker restarted. Refreshing messaging status...", "identities.worker_scope_unavailable": "Worker scope unavailable.", - "identities.worker_scope_unavailable_detail": - "Worker scope unavailable. Reconnect using a worker URL or switch to a known worker.", + "identities.worker_scope_unavailable_detail": "Worker scope unavailable. Reconnect using a worker URL or switch to a known worker.", "identities.worker_unavailable": "Worker unavailable", - "identities.workspace_id_required": - "Workspace ID is required to manage identities. Reconnect with a workspace URL or select a workspace mapped on this host.", + "identities.workspace_id_required": "Workspace ID is required to manage identities. Reconnect with a workspace URL or select a workspace mapped on this host.", "identities.workspace_scope_prefix": "Workspace scope:", - - // mcp + "inbox_panel.connect_to_download": "Connect to a worker to download shared files.", + "inbox_panel.connect_to_see": "Connect to see shared files.", + "inbox_panel.connect_to_upload": "Connect to a worker to upload", + "inbox_panel.copy_failed": "Copy failed. Your browser may block clipboard access.", + "inbox_panel.download": "Download", + "inbox_panel.drop_to_upload": "Drop files here to upload", + "inbox_panel.helper_text": "Share files with this worker from the app.", + "inbox_panel.load_failed": "Failed to load shared folder", + "inbox_panel.missing_file_id": "Missing shared file id.", + "inbox_panel.no_files": "No shared files yet.", + "inbox_panel.refresh_tooltip": "Refresh shared folder", + "inbox_panel.shared_folder": "Shared folder", + "inbox_panel.showing_first": "Showing first {count}.", + "inbox_panel.upload_failed": "Shared folder upload failed", + "inbox_panel.upload_needs_worker": "Connect to a worker to upload files to the shared folder.", + "inbox_panel.upload_prompt": "Drop files or click to upload", + "inbox_panel.upload_success": "Uploaded to the shared folder.", + "inbox_panel.uploading": "Uploading...", + "inbox_panel.uploading_label": "Uploading {label}...", + "mcp.activate_button": "Activate", + "mcp.add_modal_subtitle": "Connect a custom MCP server by URL or local command.", + "mcp.add_modal_title": "Add Custom App", + "mcp.add_server_button": "Add App", + "mcp.advanced": "Advanced", + "mcp.advanced_settings": "Advanced settings", + "mcp.advanced_settings_hint": "Edit config files and manage connections manually.", + "mcp.app_connected": "app connected", + "mcp.apps_connected": "apps connected", + "mcp.apps_subtitle": "Connect your favorite tools so OpenWork can use them on your behalf.", + "mcp.apps_title": "Apps", + "mcp.auth.already_connected": "Already Connected", + "mcp.auth.already_connected_description": "{server} is already authenticated and ready to use.", + "mcp.auth.applying_changes_body": "We are restarting the worker so the new MCP is ready to authenticate.", + "mcp.auth.applying_changes_title": "Applying changes before sign-in", "mcp.auth.authorization_link": "Authorization link", + "mcp.auth.authorization_still_required": "Authorization is still required. Try again to restart the flow.", + "mcp.auth.callback_invalid": "Paste the callback URL or the code parameter to finish OAuth.", + "mcp.auth.callback_label": "Callback URL or code", + "mcp.auth.callback_placeholder": "http://127.0.0.1:19876/mcp/oauth/callback?code=...", + "mcp.auth.cancel": "Cancel", + "mcp.auth.client_registration_required": "Client registration is required before OAuth can continue.", + "mcp.auth.complete_connection": "Complete connection", + "mcp.auth.configured_previously": "The MCP may have been configured globally or in a previous session. You can close this modal and start using the MCP tools right away.", + "mcp.auth.connect_server": "Connect {server}", "mcp.auth.copied": "Copied", "mcp.auth.copy_link": "Copy link", + "mcp.auth.done": "Done", + "mcp.auth.failed_to_start_oauth": "Failed to start OAuth flow", + "mcp.auth.follow_browser_steps": "Follow the authorization steps in the browser.", + "mcp.auth.force_stop": "Force stop", + "mcp.auth.force_stopping": "Stopping...", + "mcp.auth.im_done": "I'm done", + "mcp.auth.invalid_refresh_token": "The OAuth refresh token is invalid or expired. Reauthorize to continue.", + "mcp.auth.manual_finish_hint": "Paste the callback URL (localhost:19876) or just the code to finish connecting.", + "mcp.auth.manual_finish_title": "Remote server?", + "mcp.auth.oauth_completed_reload": "OAuth completed. Reload the engine to activate the MCP.", + "mcp.auth.oauth_failed": "OAuth authentication failed.", + "mcp.auth.oauth_not_supported_hint": "This could mean:\n• The MCP server doesn't advertise OAuth capabilities\n• The engine needs to reload to discover server capabilities\n• Try: opencode mcp auth {server} from the CLI", + "mcp.auth.open_browser_signin": "We'll open your browser to finish sign-in.", + "mcp.auth.port_forward_hint": "Tip: forward the callback port if needed: ssh -L 19876:127.0.0.1:19876 user@host", + "mcp.auth.reauth_action": "Reauthorize OAuth", + "mcp.auth.reauth_cli_hint": "Run: opencode mcp auth {server}", + "mcp.auth.reauth_failed": "Reauthorization failed.", + "mcp.auth.reauth_remote_hint": "Reauthorize from the machine running this worker.", + "mcp.auth.reauth_running": "Reauthorizing...", + "mcp.auth.reload_blocked": "Reload is paused while a session is running. Stop the run to finish setup.", + "mcp.auth.reload_engine_retry": "Apply changes and retry", + "mcp.auth.reload_failed": "Failed to reload the worker before sign-in.", + "mcp.auth.reload_notice": "For this to take effect, OpenWork needs to refresh the worker service. This can interrupt a running session.", + "mcp.auth.reload_remote_confirm": "For this to take effect, OpenWork needs to refresh the worker service. This might stop your running session. Continue?", + "mcp.auth.reopen_browser_link": "Click here to re-open the browser", "mcp.auth.request_timed_out": "Request timed out.", - - // plugins - "plugins.desc": - "Manage `opencode.json` for your project or global OpenCode plugins.", + "mcp.auth.retry": "Retry", + "mcp.auth.retry_now": "Retry Now", + "mcp.auth.server_disabled": "This MCP server is disabled. Enable it and try again.", + "mcp.auth.step1_description": "We'll launch {server}'s sign-in flow automatically.", + "mcp.auth.step1_title": "Opening your browser", + "mcp.auth.step2_description": "Sign in and approve access when prompted.", + "mcp.auth.step2_title": "Authorize OpenWork", + "mcp.auth.step3_description": "We'll finish connecting as soon as authorization completes.", + "mcp.auth.step3_title": "Return here when you're done", + "mcp.auth.try_reload_engine": "{message}. Try reloading the engine first.", + "mcp.auth.waiting_authorization": "Waiting for authorization to complete in your browser...", + "mcp.auth.waiting_for_conversation_body": "We will redirect you to authenticate as soon as possible.", + "mcp.auth.waiting_for_conversation_title": "Waiting for conversation to complete", + "mcp.auth.waiting_for_session": "Waiting for {session} to finish working", + "mcp.available_apps": "Available apps", + "mcp.cap_signin": "Account sign-in", + "mcp.cap_tools": "AI tools", + "mcp.config_file": "Config file", + "mcp.config_load_failed": "Couldn't load the config file", + "mcp.config_not_loaded": "Not loaded yet", + "mcp.config_source": "From config", + "mcp.configured": "configured", + "mcp.connect": "Connect", + "mcp.connect_failed": "Couldn't connect. Try again.", + "mcp.connect_server_first": "Connect to the server first.", + "mcp.connected": "Connected", + "mcp.connected_badge": "Connected", + "mcp.connecting": "Connecting...", + "mcp.connection_failed": "Connection issue — try again", + "mcp.connection_type": "Connection", + "mcp.control_chrome_browser_hint": "In Chrome 144 or newer, do this first:", + "mcp.control_chrome_browser_step_one": "Open chrome://inspect/#remote-debugging.", + "mcp.control_chrome_browser_step_two": "Enable remote debugging.", + "mcp.control_chrome_browser_step_three": "Allow incoming debugging connections when Chrome asks.", + "mcp.control_chrome_browser_title": "1. Turn on Chrome access", + "mcp.control_chrome_connect": "Add Control Chrome", + "mcp.control_chrome_docs": "Official MCP guide", + "mcp.control_chrome_edit": "Edit settings", + "mcp.control_chrome_profile_hint": "Control Chrome normally opens a separate Chrome profile. Turn this on if you want OpenWork to reuse the Chrome window you already have open.", + "mcp.control_chrome_profile_title": "2. Choose which Chrome to use", + "mcp.control_chrome_save": "Save settings", + "mcp.control_chrome_setup_subtitle": "Turn on Chrome access, then choose whether OpenWork should use its own clean profile or attach to the Chrome you already use.", + "mcp.control_chrome_setup_title": "Set up Control Chrome", + "mcp.control_chrome_toggle_hint": "When this is on, OpenWork adds --autoConnect so the MCP attaches to a Chrome instance you already started.", + "mcp.control_chrome_toggle_label": "Use my existing Chrome profile", + "mcp.control_chrome_toggle_off": "OpenWork will launch a separate Chrome profile just for automation.", + "mcp.control_chrome_toggle_on": "OpenWork will reuse your current tabs, cookies, and sign-ins.", + "mcp.custom_app_cta_hint": "Connect your own MCP server, internal tool, or hosted app.", + "mcp.desktop_required": "Apps require the desktop app.", + "mcp.docs_link": "Learn more", + "mcp.file_not_found": "Config file not created yet", + "mcp.finish_setup": "Almost there", + "mcp.finish_setup_hint": "Tap Activate to finish connecting your app.", + "mcp.friendly_status_issue": "Issue", + "mcp.friendly_status_needs_signin": "Sign in needed", + "mcp.friendly_status_offline": "Offline", + "mcp.friendly_status_paused": "Paused", + "mcp.friendly_status_ready": "Ready", + "mcp.last_synced": "Synced", + "mcp.login_action": "Sign in", + "mcp.login_hint": "Connect your account to finish setting up this app.", + "mcp.login_unavailable": "This app does not support sign-in from OpenWork.", + "mcp.logout_action": "Log out", + "mcp.logout_failed": "Failed to log out.", + "mcp.logout_hint": "Removes stored OAuth credentials. You'll need to sign in again.", + "mcp.logout_label": "OAuth", + "mcp.logout_modal_message": "This will remove stored OAuth credentials for {server}. You'll need to sign in again to use this app.", + "mcp.logout_modal_title": "Log out of this app?", + "mcp.logout_success": "Logged out of {server}.", + "mcp.logout_working": "Logging out...", + "mcp.name_required": "Enter a server name.", + "mcp.no_apps_hint": "Connect one above to get started.", + "mcp.no_apps_yet": "No apps connected yet", + "mcp.oauth": "Sign in", + "mcp.oauth_optional_hint": "Uses OAuth in the browser to connect your account.", + "mcp.oauth_optional_label": "This app requires sign-in", + "mcp.one_click_connect": "One-click connect", + "mcp.open_file": "Open file", + "mcp.opening_label": "Opening...", + "mcp.pick_workspace_error": "Choose a workspace folder first.", + "mcp.pick_workspace_first": "Choose a workspace folder first.", + "mcp.quick_connect_chrome_desc": "Drive Chrome tabs with browser automation.", + "mcp.quick_connect_chrome_title": "Control Chrome", + "mcp.quick_connect_context7_desc": "Search product docs with richer context.", + "mcp.quick_connect_context7_title": "Context7", + "mcp.quick_connect_linear_desc": "Plan sprints and ship tickets faster.", + "mcp.quick_connect_linear_title": "Linear", + "mcp.quick_connect_notion_desc": "Pages, databases, and project docs in sync.", + "mcp.quick_connect_notion_title": "Notion", + "mcp.quick_connect_sentry_desc": "Track releases and resolve production errors.", + "mcp.quick_connect_sentry_title": "Sentry", + "mcp.quick_connect_stripe_desc": "Inspect payments, invoices, and subscriptions.", + "mcp.quick_connect_stripe_title": "Stripe", + "mcp.reload_banner_blocked_hint": "Stop the running task to activate.", + "mcp.reload_banner_description": "Tap Activate to finish connecting your app.", + "mcp.reload_banner_description_blocked": "A task is running. Stop it first, then activate.", + "mcp.remote_workspace_url_hint": "Remote workers connect fastest with URL-based MCP servers.", + "mcp.remove_app": "Remove", + "mcp.remove_failed": "Couldn't remove the app.", + "mcp.remove_modal_message": "Are you sure you want to remove {server}? You can always add it back later.", + "mcp.remove_modal_title": "Remove app", + "mcp.reveal_config_failed": "Couldn't open the config file", + "mcp.reveal_in_finder": "Show in Finder", + "mcp.scope_global": "All workspaces", + "mcp.scope_project": "This workspace", + "mcp.server_command": "Command", + "mcp.server_command_hint": "The shell command to start the server.", + "mcp.server_command_placeholder": "npx -y @modelcontextprotocol/server-sequential-thinking", + "mcp.server_name": "App name", + "mcp.server_name_placeholder": "github-copilot", + "mcp.server_type": "Type", + "mcp.server_url": "Server URL", + "mcp.server_url_placeholder": "https://api.githubcopilot.com/mcp/", + "mcp.sign_in_section_label": "Sign-in", + "mcp.tap_to_connect": "Tap to connect", + "mcp.technical_details": "Technical details", + "mcp.type_cloud": "Cloud (sign in with your account)", + "mcp.type_local": "Local (runs on this device)", + "mcp.type_local_cmd": "Local (command)", + "mcp.type_remote": "Remote (URL)", + "mcp.url_or_command_required": "Enter a URL for remote or a command for local servers.", + "mcp.your_apps": "Your apps", + "message.tool_request_label": "Request", + "message.tool_result_label": "Result", + "message.waiting_subagent": "Waiting for the subagent transcript to arrive.", + "message_list.copy_message": "Copy message", + "message_list.open_session": "Open session", + "message_list.step_updates_progress": "Updates progress", + "message_list.subagent_loading_transcript": "Loading transcript", + "message_list.subagent_message_count": "{count} message{plural}", + "message_list.subagent_running": "Running", + "message_list.subagent_session_fallback": "Subagent session", + "message_list.subagent_type_task": "{agentType} task", + "message_list.subagent_waiting_transcript": "Waiting for transcript", + "message_list.tool_checked_url": "Checked {url}", + "message_list.tool_checked_web_fallback": "Checked web page", + "message_list.tool_delegate_agent": "Delegate {agent}", + "message_list.tool_delegate_task_fallback": "Delegate task", + "message_list.tool_load_skill_fallback": "Load skill", + "message_list.tool_load_skill_named": "Load skill {name}", + "message_list.tool_read_todo": "Read todo list", + "message_list.tool_reviewed_file": "Reviewed {file}", + "message_list.tool_reviewed_file_fallback": "Reviewed file", + "message_list.tool_reviewed_files_fallback": "Reviewed files", + "message_list.tool_reviewed_path": "Reviewed {path}", + "message_list.tool_run_command": "Run {command}", + "message_list.tool_run_command_fallback": "Run command", + "message_list.tool_searched_code_fallback": "Searched code", + "message_list.tool_searched_pattern": "Searched {pattern}", + "message_list.tool_update_file": "Update {file}", + "message_list.tool_update_file_fallback": "Update file", + "message_list.tool_update_todo": "Update todo list", + "message_list.tool_updated_file": "Updated {file}", + "message_list.tool_updated_file_fallback": "Updated file", + "model_behavior.desc_builtin": "This model decides its own reasoning path and does not expose profiles here.", + "model_behavior.desc_generic": "Use the {label} profile.", + "model_behavior.desc_high": "Spend more time reasoning before answering.", + "model_behavior.desc_high_anthropic": "Use the standard extended-thinking budget.", + "model_behavior.desc_low": "Use a lighter reasoning pass before answering.", + "model_behavior.desc_low_google": "Use a lighter reasoning budget for quicker responses.", + "model_behavior.desc_max": "Use the provider's deepest reasoning profile.", + "model_behavior.desc_max_anthropic": "Use the largest extended-thinking budget available.", + "model_behavior.desc_medium": "Balance speed and reasoning depth.", + "model_behavior.desc_minimal": "Use a very small amount of reasoning.", + "model_behavior.desc_none": "Favor speed with the lightest reasoning path.", + "model_behavior.desc_standard": "This model does not expose extra reasoning controls.", + "model_behavior.label_balanced": "Balanced", + "model_behavior.label_builtin": "Built in", + "model_behavior.label_deep": "Deep", + "model_behavior.label_extended": "Extended", + "model_behavior.label_fast": "Fast", + "model_behavior.label_light": "Light", + "model_behavior.label_maximum": "Maximum", + "model_behavior.label_quick": "Quick", + "model_behavior.label_standard": "Standard", + "model_behavior.title_builtin_reasoning": "Built-in reasoning", + "model_behavior.title_extended_thinking": "Extended thinking", + "model_behavior.title_reasoning_budget": "Reasoning budget", + "model_behavior.title_reasoning_effort": "Reasoning effort", + "model_behavior.title_standard_generation": "Standard generation", + "model_picker.chat_model_desc": "Choose the model for this chat. If a model supports reasoning profiles, configure them on its card.", + "model_picker.chat_model_title": "Chat model", + "model_picker.connect_provider_hint": "Connect this provider to browse and save models", + "model_picker.default_model_desc": "Choose the default model for new chats, then fine-tune reasoning profiles on its card before pressing Done.", + "model_picker.default_model_title": "Default model", + "model_picker.model_count": "{count} models", + "model_picker.model_count_one": "1 model", + "model_picker.more_providers": "More providers", + "model_picker.no_results": "No models match your search.", + "model_picker.other_connected_models": "Other connected models", + "model_picker.recommended": "Recommended", + "onboarding.access_label": "Access", + "onboarding.add": "Add", + "onboarding.add_folder_path": "Add folder path", + "onboarding.advanced_settings": "Advanced settings", + "onboarding.attach": "Attach", + "onboarding.attach_description": "Attach to the existing session on this device.", + "onboarding.authorize_folder": "Authorize folder", + "onboarding.back": "Back", + "onboarding.checking_cli": "Checking OpenCode CLI...", + "onboarding.choose_workspace_folder": "Choose workspace folder", + "onboarding.cli_checking": "Checking install...", + "onboarding.cli_install_commands": "Install OpenCode with one of the commands below, then restart OpenWork.", + "onboarding.cli_label": "OpenCode CLI", + "onboarding.cli_needs_update": "OpenCode CLI needs an update for serve.", + "onboarding.cli_not_found": "OpenCode CLI not found.", + "onboarding.cli_not_found_hint": "Not found. Install to run the local server.", + "onboarding.cli_ready": "OpenCode CLI ready.", + "onboarding.cli_recheck": "Re-check", + "onboarding.cli_version": "OpenCode {version}", + "onboarding.cli_version_installed": "Installed", + "onboarding.create_first_workspace": "Create your first workspace", + "onboarding.create_workspace": "Create a workspace", + "onboarding.engine_running": "Engine already running", + "onboarding.folders_allowed": "{count} folder{plural} allowed", + "onboarding.getting_ready": "Getting everything ready", + "onboarding.install": "Install OpenCode", + "onboarding.install_instruction": "Install OpenCode to enable the local server (no terminal required).", + "onboarding.last_checked": "Last checked {time}", + "onboarding.manage_access_hint": "You can manage access in advanced settings.", + "onboarding.open_settings": "Open Settings", + "onboarding.open_settings_hint": "Need engine or access options? Open Settings.", + "onboarding.pick": "Pick", + "onboarding.ready_message": "OpenCode is ready to start the local server.", + "onboarding.remember_choice": "Remember my choice for next time", + "onboarding.remote_workspace_action": "Connect", + "onboarding.remote_workspace_card_description": "Connect to an OpenWork server to access a shared workspace.", + "onboarding.remote_workspace_card_title": "Connect a remote workspace", + "onboarding.remote_workspace_description": "Connect to an OpenWork server to access a workspace from anywhere.", + "onboarding.remote_workspace_title": "Connect to OpenWork server", + "onboarding.remove": "Remove", + "onboarding.resolved_path": "Resolved path", + "onboarding.run_local": "Run locally", + "onboarding.run_local_description": "OpenWork runs OpenCode locally and keeps your work private.", + "onboarding.search_notes": "Search notes", + "onboarding.searching_host": "Connecting to OpenWork server...", + "onboarding.serve_help": "serve --help output", + "onboarding.show_search_notes": "Show search notes", + "onboarding.start": "Start OpenWork", + "onboarding.starting_host": "Starting OpenWork server...", + "onboarding.theme_current": "Current: {mode}", + "onboarding.theme_dark": "Dark", + "onboarding.theme_label": "Theme", + "onboarding.theme_light": "Light", + "onboarding.theme_system": "System", + "onboarding.verifying": "Verifying secure handshake", + "onboarding.version": "Version", + "onboarding.welcome_title": "How would you like to run OpenWork today?", + "onboarding.windows_install_instruction": "Install OpenCode for Windows, then restart OpenWork. Ensure opencode.exe is on PATH.", + "onboarding.workspace_folder_label": "A workspace is a folder with its own skills, plugins, and commands.", + "plugins.add": "Add", + "plugins.add_hint": "Add npm package names, e.g. opencode-wakatime", + "plugins.add_label": "Add plugin", + "plugins.added": "Added", + "plugins.config": "Config", + "plugins.config_label": "Config", + "plugins.desc": "Manage `opencode.json` for your project or global OpenCode plugins.", "plugins.empty": "No plugins configured yet.", + "plugins.enabled": "Enabled", + "plugins.hide_setup": "Hide setup", + "plugins.not_loaded": "Not loaded yet", "plugins.not_loaded_yet": "Not loaded yet", "plugins.remove": "Remove", + "plugins.scheduler_desc": "Run scheduled jobs with the OpenCode scheduler plugin.", + "plugins.scope_global": "Global", + "plugins.scope_project": "Project", + "plugins.setup": "Setup", + "plugins.suggested": "Suggested plugins", "plugins.suggested_heading": "Suggested plugins", - - // providers + "plugins.title": "OpenCode plugins", "providers.api_key_label": "API key", "providers.api_key_required": "API key is required", "providers.auth_failed": "Authentication failed", @@ -2277,28 +989,21 @@ export default { "providers.no_oauth_prefix": "No OAuth flow available for", "providers.no_providers_available": "No providers available", "providers.not_connected": "Not connected to a server", - "providers.not_oauth_flow_prefix": - "Selected auth method is not an OAuth flow for", + "providers.not_oauth_flow_prefix": "Selected auth method is not an OAuth flow for", "providers.oauth_failed": "Failed to complete OAuth", "providers.oauth_method_required": "OAuth method is required", "providers.provider_error": "Provider error ({provider})", "providers.provider_id_required": "Provider ID is required", "providers.rate_limit_exceeded": "Rate limit exceeded", - "providers.removal_unsupported": - "Provider auth removal is not supported by this client.", + "providers.removal_unsupported": "Provider auth removal is not supported by this client.", "providers.request_failed": "Request failed", "providers.save_api_key_failed": "Failed to save API key", - "providers.still_connected_suffix": - ", but the worker still reports it as connected. Clear any remaining API key or OAuth credentials and restart the worker to fully disconnect.", + "providers.still_connected_suffix": ", but the worker still reports it as connected. Clear any remaining API key or OAuth credentials and restart the worker to fully disconnect.", "providers.unknown_provider": "Unknown provider", "providers.use_api_key_suffix": "Use an API key instead.", - - // question_modal "question_modal.custom_answer_label": "Or type a custom answer", "question_modal.custom_answer_placeholder": "Type your answer here...", "question_modal.question_counter": "Question {current} of {total}", - - // scheduled "scheduled.at_time": "At {time}", "scheduled.badge_end_of_day": "End-of-day", "scheduled.badge_every_few_hours": "Every few hours", @@ -2307,8 +1012,7 @@ export default { "scheduled.badge_weekday_morning": "Weekday morning", "scheduled.badge_weekend_review": "Weekend review", "scheduled.create_button": "Create", - "scheduled.create_desc": - "Automations are scheduled by running a prompt in a new thread. We'll prefill a prompt for you to send.", + "scheduled.create_desc": "Automations are scheduled by running a prompt in a new thread. We'll prefill a prompt for you to send.", "scheduled.create_title": "Create automation", "scheduled.created_prefix": "Created", "scheduled.custom_schedule": "Custom schedule", @@ -2322,15 +1026,13 @@ export default { "scheduled.day_wed": "Wed", "scheduled.days_at": "{days} at {time}", "scheduled.default_automation_name": "Daily bug scan", - "scheduled.delete_confirm_desc": - "This removes the schedule and deletes the job definition from {source}.", + "scheduled.delete_confirm_desc": "This removes the schedule and deletes the job definition from {source}.", "scheduled.delete_confirm_title": "Delete automation?", "scheduled.delete_error_fallback": "Failed to delete job.", "scheduled.delete_label": "Delete", "scheduled.deleting": "Deleting", "scheduled.desktop_required": "Scheduled tasks require the desktop app.", - "scheduled.empty_hint": - "No automations yet. Pick a template or create your own automation prompt.", + "scheduled.empty_hint": "No automations yet. Pick a template or create your own automation prompt.", "scheduled.every_day_at": "Every day at {time}", "scheduled.every_hour": "Every hour", "scheduled.every_n_hours": "Every {interval} hours", @@ -2342,10 +1044,8 @@ export default { "scheduled.filter_templates": "Templates", "scheduled.hours_suffix": "hours", "scheduled.install_scheduler": "Install scheduler", - "scheduled.install_scheduler_hint": - "Automations run through the opencode-scheduler plugin. Add it to this workspace to enable scheduling.", - "scheduled.install_scheduler_title": - "Install the scheduler to unlock automations", + "scheduled.install_scheduler_hint": "Automations run through the opencode-scheduler plugin. Add it to this workspace to enable scheduling.", + "scheduled.install_scheduler_title": "Install the scheduler to unlock automations", "scheduled.installing": "Installing...", "scheduled.interval_mode": "Interval", "scheduled.last_run_prefix": "Last run", @@ -2357,17 +1057,14 @@ export default { "scheduled.no_templates_match": "No templates match this search.", "scheduled.not_run_yet": "Not run yet", "scheduled.not_synced_yet": "Not synced yet", - "scheduled.page_description": - "Schedule recurring tasks for this worker, monitor what is already registered, and start from a reusable template.", + "scheduled.page_description": "Schedule recurring tasks for this worker, monitor what is already registered, and start from a reusable template.", "scheduled.prepare_error_fallback": "Failed to prepare automation in chat.", "scheduled.prepared_automation_in_chat": "Prepared automation in chat.", "scheduled.prepared_job_in_chat": "Prepared {name} in chat.", "scheduled.quick_start_templates": "Quick start templates", - "scheduled.quick_start_templates_desc": - "Start from a proven recurring workflow, then tailor the prompt before you prepare it in chat.", + "scheduled.quick_start_templates_desc": "Start from a proven recurring workflow, then tailor the prompt before you prepare it in chat.", "scheduled.refreshing": "Refreshing", - "scheduled.reload_activate_hint": - "OpenCode loads plugins at startup. Reload OpenWork to activate opencode-scheduler.", + "scheduled.reload_activate_hint": "OpenCode loads plugins at startup. Reload OpenWork to activate opencode-scheduler.", "scheduled.reload_activate_title": "Reload OpenWork to activate automations", "scheduled.reload_openwork": "Reload OpenWork", "scheduled.reloading": "Reloading...", @@ -2379,62 +1076,281 @@ export default { "scheduled.search_placeholder": "Search automations or templates", "scheduled.source_local": "From local scheduler", "scheduled.source_remote": "From OpenWork server", - "scheduled.subtitle_local": - "Automations that run on a schedule from this device.", - "scheduled.subtitle_remote": - "Automations that run on a schedule from the connected OpenWork server.", + "scheduled.subtitle_local": "Automations that run on a schedule from this device.", + "scheduled.subtitle_remote": "Automations that run on a schedule from the connected OpenWork server.", "scheduled.success_status": "Success", "scheduled.task_summary_no_prompt": "No prompt or command found.", "scheduled.task_summary_prompt": "Prompt", "scheduled.template_badge": "Template", "scheduled.template_count": "{count} templates", - "scheduled.tpl_daily_planning_desc": - "Build a focused plan from your tasks and calendar.", + "scheduled.title": "Automations", + "scheduled.tpl_daily_planning_desc": "Build a focused plan from your tasks and calendar.", "scheduled.tpl_daily_planning_name": "Daily planning brief", - "scheduled.tpl_habit_checkin_desc": - "Run a quick accountability check through the day.", + "scheduled.tpl_habit_checkin_desc": "Run a quick accountability check through the day.", "scheduled.tpl_habit_checkin_name": "Habit check-in", - "scheduled.tpl_inbox_zero_desc": - "Summarize unread messages and draft short replies.", + "scheduled.tpl_inbox_zero_desc": "Summarize unread messages and draft short replies.", "scheduled.tpl_inbox_zero_name": "Inbox zero helper", - "scheduled.tpl_learning_digest_desc": - "Turn saved links and notes into a weekly digest.", + "scheduled.tpl_learning_digest_desc": "Turn saved links and notes into a weekly digest.", "scheduled.tpl_learning_digest_name": "Learning digest", - "scheduled.tpl_meeting_prep_desc": - "Generate prep bullets for tomorrow's meetings.", + "scheduled.tpl_meeting_prep_desc": "Generate prep bullets for tomorrow's meetings.", "scheduled.tpl_meeting_prep_name": "Meeting prep notes", - "scheduled.tpl_weekly_wins_desc": - "Create a Friday recap of wins, blockers, and next steps.", + "scheduled.tpl_weekly_wins_desc": "Create a Friday recap of wins, blockers, and next steps.", "scheduled.tpl_weekly_wins_name": "Weekly wins recap", "scheduled.view_scheduler_docs": "View scheduler docs", "scheduled.weekdays_at": "Weekdays at {time}", "scheduled.weekends_at": "Weekends at {time}", - "scheduled.worker_root_hint": - "Worker root is inferred from the selected workspace.", + "scheduled.worker_root_hint": "Worker root is inferred from the selected workspace.", "scheduled.your_automations": "Your automations", - - // settings + "session.allow_for_session": "Allow for session", + "session.allow_once": "Once", + "session.api_key_saved": "API key saved", + "session.attachments_add_token": "Add a server token to attach files.", + "session.attachments_connect_server": "Connect to OpenWork server to attach files.", + "session.back": "Back", + "session.close_quick_actions": "Close quick actions", + "session.close_search": "Close search", + "session.cmd_compact_detail": "Send a compact instruction to OpenCode for this session", + "session.cmd_compact_detail_empty": "No user messages to compact yet", + "session.cmd_compact_meta": "Compact", + "session.cmd_compact_title": "Compact Conversation", + "session.cmd_current_workspace": "Current workspace", + "session.cmd_model_detail": "{model} · {variant}", + "session.cmd_model_fallback": "Model", + "session.cmd_model_meta": "Open", + "session.cmd_model_title": "Change model", + "session.cmd_new_session_detail": "Start a fresh task in the current workspace", + "session.cmd_new_session_meta": "Create", + "session.cmd_new_session_title": "Create new session", + "session.cmd_provider_detail": "Open provider connection flow", + "session.cmd_provider_meta": "Open", + "session.cmd_provider_title": "Connect provider", + "session.cmd_rename_detail_fallback": "Give your selected session a clearer name", + "session.cmd_rename_meta": "Rename", + "session.cmd_rename_title": "Rename current session", + "session.cmd_sessions_detail": "{count} available across workspaces", + "session.cmd_sessions_meta": "Jump", + "session.cmd_sessions_title": "Search sessions", + "session.cmd_switch": "Switch", + "session.compacted": "Session compacted.", + "session.compacting": "Compacting session context...", + "session.compacting_auto": "OpenCode is auto-compacting this session", + "session.compacting_manual": "OpenCode is compacting this session", + "session.compaction_finished": "OpenCode finished compacting the session context.", + "session.compaction_started": "OpenCode started compacting the session context.", + "session.conflict_sync_toast": "Conflict syncing {path}. Saved local changes to {conflictPath}.", + "session.connect_failed": "Connect failed", + "session.connect_to_sync": "Connect to OpenWork server to sync remote files.", + "session.create_or_connect_workspace": "Create or connect a workspace", + "session.create_workspace_desc": "Open the workspace creator and choose how you want to start.", + "session.create_workspace_title": "Create workspace", + "session.default_agent": "Default agent", + "session.default_title": "New session", + "session.delete": "Delete", + "session.delete_named_session_message": "This will permanently delete \"{title}\" and its messages.", + "session.delete_session_generic": "This will permanently delete the selected session and its messages.", + "session.delete_session_title": "Delete session?", + "session.deleted": "Session deleted", + "session.deleting": "Deleting...", + "session.deny": "Deny", + "session.details": "Details", + "session.details_label": "Details", + "session.doom_loop_label": "Doom Loop", + "session.doom_loop_message": "OpenCode detected repeated tool calls with identical input and is asking whether it should continue after repeated failures.", + "session.doom_loop_note": "Reject to stop the loop, or allow if you want the agent to keep trying.", + "session.doom_loop_repeated_call_label": "Repeated call", + "session.doom_loop_repeated_tool_call": "Repeated tool call", + "session.doom_loop_title": "Doom Loop Detected", + "session.doom_loop_tool_label": "Tool", + "session.downloading": "Downloading", + "session.downloading_percent": "Downloading {percent}%", + "session.downloading_update_title": "Downloading update {version}", + "session.export_already_running": "Export is already running.", + "session.export_desktop_only": "Export is available in the desktop app.", + "session.export_desktop_only_local": "Export is available for local workers in the desktop app.", + "session.export_local_only": "Export is only supported for local workers.", + "session.failed_to_compact": "Failed to compact session", + "session.failed_to_create_session": "Failed to create session", + "session.failed_to_delete": "Failed to delete session", + "session.failed_to_load_agents": "Failed to load agents", + "session.failed_to_load_providers": "Failed to load providers", + "session.failed_to_redo": "Failed to redo", + "session.failed_to_save_api_key": "Failed to save API key", + "session.failed_to_stop": "Failed to stop", + "session.failed_to_undo": "Failed to undo", + "session.file_open_desktop_only": "File open is available in the desktop app.", + "session.file_open_failed": "File open failed", + "session.file_open_remote_unavailable": "File open is unavailable for remote workspaces.", + "session.flyout_file_modified": "File Modified", + "session.flyout_new_task": "New Task", + "session.install_update": "Install update", + "session.jump_to_latest": "Jump to latest", + "session.jump_to_start": "Jump to start of message", + "session.load_earlier": "Load earlier messages", + "session.loading_detail": "Pulling in the latest messages for this task.", + "session.loading_earlier": "Loading earlier messages...", + "session.loading_session": "Loading session", + "session.loading_title": "Loading session", + "session.menu_label": "Menu", + "session.model": "Model", + "session.model_fallback": "Model", + "session.new_task": "New task", + "session.next_match": "Next match", + "session.no_matches": "No matches", + "session.no_matches_command": "No matches.", + "session.no_session_selected": "No session selected", + "session.nothing_to_compact": "Nothing to compact yet.", + "session.nothing_to_redo": "Nothing to redo.", + "session.nothing_to_retry": "Nothing to retry yet", + "session.nothing_to_undo": "Nothing to undo yet.", + "session.oauth_failed": "OAuth failed", + "session.obsidian_worker_relative_only": "Only worker-relative files can be opened in Obsidian.", + "session.open": "Open", + "session.palette_hint_navigate": "Arrow keys to navigate", + "session.palette_hint_run": "Enter to run · Esc to close", + "session.palette_placeholder_actions": "Search actions", + "session.palette_placeholder_sessions": "Find by session title or workspace", + "session.palette_title_actions": "Quick actions", + "session.palette_title_sessions": "Search sessions", + "session.permission_label": "Permission", + "session.permission_message": "OpenCode is requesting permission to continue.", + "session.permission_required": "Permission Required", + "session.phase_responding": "Responding", + "session.phase_retrying": "Retrying", + "session.phase_run_failed": "Run failed", + "session.phase_sending": "Sending", + "session.pick_folder_desc": "Choose an existing project or notes folder and OpenWork will use it as your workspace.", + "session.pick_folder_title": "Pick a folder you want to work in", + "session.pick_workspace_to_open": "Pick a workspace to open files.", + "session.prev_match": "Previous match", + "session.provider_auth_in_progress": "Provider auth is already in progress.", + "session.provider_connected": "Provider connected", + "session.quick_actions_label": "Quick actions", + "session.quick_actions_title": "Quick actions (Ctrl/Cmd+K)", + "session.redo_aria_label": "Redo last reverted message", + "session.redo_label": "Redo", + "session.redo_title": "Redo last reverted message", + "session.remote_sync_failed": "Remote file sync failed", + "session.rename_description": "Update the name for this session.", + "session.rename_label": "Session name", + "session.rename_placeholder": "Enter a new name", + "session.rename_title": "Rename session", + "session.resize_workspace_column": "Resize workspace column", + "session.restart_update_title": "Restart to apply update {version}", + "session.restored_message": "Restored the reverted message.", + "session.reveal": "Reveal", + "session.reveal_desktop_only": "Reveal is available in the desktop app.", + "session.revert_label": "Revert", + "session.reverted_last_message": "Reverted the last user message.", + "session.run": "Run", + "session.scope_label": "Scope", + "session.search_conversation_label": "Search conversation", + "session.search_conversation_title": "Search conversation (Ctrl/Cmd+F)", + "session.search_next": "Next", + "session.search_placeholder": "Search in this chat", + "session.search_position": "{current} of {total}", + "session.search_prev": "Prev", + "session.share_active_cloud_org": "Active Cloud org", + "session.share_choose_org": "Choose an organization in Settings -> Cloud before sharing with your team.", + "session.share_collaborator_hint": "Routine remote access when you do not need owner-only actions.", + "session.share_collaborator_host_hint": "Routine remote access to this host without owner-only actions.", + "session.share_collaborator_label": "Collaborator token", + "session.share_collaborator_token": "Collaborator token", + "session.share_connected_with_hint": "This workspace is currently connected with this password.", + "session.share_desktop_app_required": "Desktop app required", + "session.share_desktop_required": "Desktop app required", + "session.share_host_url_and_token_required": "OpenWork host URL and token are required.", + "session.share_local_host_not_ready": "Local OpenWork host is not ready yet.", + "session.share_missing_host_url": "Missing OpenWork host URL.", + "session.share_missing_token": "Missing OpenWork token.", + "session.share_no_skills": "No skills found in this workspace.", + "session.share_note_direct_runtime": "Engine runtime is set to Direct. Switching local workers can restart the host and disconnect clients. The token may change after a restart.", + "session.share_opencode_base_url": "OpenCode base URL", + "session.share_openwork_workers_only": "Share service links are available for OpenWork workers.", + "session.share_owner_permission_hint": "Use when the remote client must answer permission prompts.", + "session.share_password": "Password", + "session.share_password_owner_hint": "Use when the remote client must answer permission prompts.", + "session.share_publish_skills_failed": "Failed to publish skills set", + "session.share_publish_workspace_failed": "Failed to publish workspace profile", + "session.share_resolve_local_workspace_failed": "Could not resolve this workspace on the local OpenWork host.", + "session.share_resolve_remote_workspace_failed": "Could not resolve this workspace on the OpenWork host.", + "session.share_save_team_template_failed": "Failed to save team template", + "session.share_saved_to_org": "Saved {name} to {org}.", + "session.share_select_workspace": "Select a workspace first.", + "session.share_set_token_hint": "Set token in workspace settings", + "session.share_sign_in_required": "Sign in to OpenWork Cloud in Settings to share with your team.", + "session.share_skills_set_desc": "Complete skills set from an OpenWork workspace.", + "session.share_starting_server": "Starting server...", + "session.share_team_fallback_name": "your team templates", + "session.share_url_resolving_hint": "Worker URL is resolving; host URL shown as fallback.", + "session.share_url_worker_hint": "Use on phones or laptops connecting to this worker.", + "session.share_worker_url": "Worker URL", + "session.share_worker_url_phones_hint": "Use on phones or laptops connecting to this worker.", + "session.share_worker_url_resolving_hint": "Worker URL is resolving; host URL shown as fallback.", + "session.share_workspace_template_desc": "Full OpenWork workspace template with config, commands, skills, and extra .opencode files.", + "session.shared_folder_upload_failed": "Shared folder upload failed", + "session.show_earlier": "Show {count} earlier message{plural}", + "session.status_active": "Session Active", + "session.status_compacting": "Compacting Context", + "session.status_delegating": "Delegating", + "session.status_gathering_context": "Gathering context", + "session.status_planning": "Planning", + "session.status_ready": "Ready", + "session.status_ready_session": "Session Ready", + "session.status_running_shell": "Running shell", + "session.status_searching_codebase": "Searching codebase", + "session.status_searching_web": "Searching the web", + "session.status_thinking": "Thinking", + "session.status_working": "Working", + "session.status_writing_file": "Writing file", + "session.stopped": "Stopped.", + "session.stopping_run": "Stopping the run...", + "session.todo_progress": "{completed} out of {total} tasks completed", + "session.trying_again": "Trying again...", + "session.unable_to_open_file": "Unable to open file", + "session.unable_to_open_obsidian": "Unable to open file in Obsidian", + "session.unable_to_reveal": "Unable to reveal workspace", + "session.undo_label": "Revert", + "session.undo_title": "Undo last message", + "session.update_available": "Update available", + "session.update_available_title": "Update available {version}", + "session.update_ready": "Update ready", + "session.update_ready_stop_runs_title": "Update ready {version}. Stop active runs to restart.", + "session.upload_connect_server": "Connect to the OpenWork server to upload files to the shared folder.", + "session.uploaded_to_shared_folder": "Uploaded to the shared folder.", + "session.uploaded_with_summary": "Uploaded to the shared folder: {summary}", + "session.uploading_to_shared_folder": "Uploading {label} to the shared folder...", + "session.workspace_fallback": "Workspace", + "session.workspace_label": "Workspace", + "session.workspace_path_unavailable": "Workspace path is unavailable.", + "session.workspace_setup_desc": "Start with a guided OpenWork workspace, or choose an existing folder you want to work in.", + "session.workspace_setup_label": "Workspace setup", + "session.workspace_setup_title": "Set up your first workspace", "settings.action_download": "Download", "settings.action_install": "Install", "settings.actor_host": "host", "settings.actor_remote": "remote", "settings.actor_unknown": "unknown", - "settings.api_keys_info": - "API keys are stored locally by OpenCode. Environment-backed providers must be changed in the worker environment and then reloaded.", + "settings.advanced": "Advanced", + "settings.advanced_title": "Advanced", + "settings.api_keys_info": "API keys are stored locally by OpenCode. Environment-backed providers must be changed in the worker environment and then reloaded.", + "settings.appearance_hint": "Match the system or force light/dark mode.", + "settings.appearance_title": "Appearance", "settings.audit_error": "Error", "settings.audit_loading": "Loading", "settings.audit_log_title": "Audit log", - "settings.audit_ready": "Error", + "settings.audit_ready": "Ready", "settings.auto_compact": "Auto context compaction", - "settings.auto_compact_desc": - "Controls OpenCode compaction.auto for this workspace. Reload the engine after changing it.", + "settings.auto_compact_desc": "Controls OpenCode compaction.auto for this workspace. Reload the engine after changing it.", "settings.auto_update_desc": "Download updates automatically (prompts to", "settings.auto_update_title": "Auto-update", - "settings.background_checks_desc": - "OpenWork always checks on launch. Also checks once", + "settings.available_count": "{count} available", + "settings.background_checks_desc": "OpenWork always checks on launch. Also checks once", "settings.background_checks_title": "Background checks", "settings.base_url_unavailable": "Base URL unavailable", "settings.binary_unavailable": "Binary unavailable", + "settings.cache_nothing_to_repair": "No OpenCode cache found. Nothing to repair.", + "settings.cache_repair_requires_desktop": "Cache repair requires the desktop app", + "settings.cache_repaired": "OpenCode cache repaired. Restart the engine if it was running.", "settings.cap_browser_tools": "Browser tools: {value}", "settings.cap_commands": "Commands: {value}", "settings.cap_config": "Config: {value}", @@ -2451,21 +1367,24 @@ export default { "settings.cap_skills": "Skills: {value}", "settings.cap_write": "write", "settings.capabilities_title": "OpenWork server capabilities", - "settings.capabilities_unavailable": - "Capabilities unavailable. Connect with a client token.", + "settings.capabilities_unavailable": "Capabilities unavailable. Connect with a client token.", + "settings.change": "Change", + "settings.check_update": "Check", "settings.checking_for_updates": "Checking for updates", "settings.choose": "Choose", "settings.clear": "Clear", - "settings.clipboard_unavailable": - "Clipboard is unavailable in this environment.", + "settings.clipboard_unavailable": "Clipboard is unavailable in this environment.", "settings.configure": "Configure", "settings.connect_opencode_hint": "Connect to OpenCode to load providers.", "settings.connect_provider": "Connect provider", + "settings.connected_count": "{count} connected", + "settings.connection": "Connection", + "settings.connection_failed": "Connection failed", + "settings.connection_title": "Connection", "settings.copied_debug_report": "Copied runtime report JSON.", "settings.copy_failed": "Failed to copy runtime report.", "settings.copy_json": "Copy JSON", - "settings.custom_binary_hint": - "Use this to point OpenWork at a local OpenCode build", + "settings.custom_binary_hint": "Use this to point OpenWork at a local OpenCode build", "settings.custom_binary_label": "Custom OpenCode binary", "settings.data_dir_unavailable": "Data directory unavailable", "settings.debug_commit": "Commit: {sha}", @@ -2476,17 +1395,24 @@ export default { "settings.debug_orchestrator_version": "Orchestrator: {version}", "settings.debug_section_title": "Developer", "settings.deeplink_failed": "Failed to open deep link.", - "settings.deeplink_hint": - "Accepts openwork://, openwork-dev://, or a raw supported https://share.openworklabs.com/b/... URL.", + "settings.deeplink_hint": "Accepts openwork://, openwork-dev://, or a raw supported https://share.openworklabs.com/b/... URL.", + "settings.default_model": "Default model", "settings.delete_containers": "Removing containers...", "settings.delete_local_config": "Removing local state...", "settings.desktop_only_hint": "Available in the desktop app.", "settings.dev_mode_badge": "Dev mode", - "settings.developer_mode_desc": - "Enables debug tools, diagnostics, and the Developer tab.", + "settings.developer": "Developer", + "settings.developer_mode_desc": "Enables debug tools, diagnostics, and the Developer tab.", "settings.developer_mode_title": "Developer mode", "settings.developer_panel_disabled": "Developer panel enabled.", "settings.developer_panel_enabled": "Developer panel enabled.", + "settings.devlog_cleared": "Cleared developer log output.", + "settings.devlog_clipboard_unavailable": "Clipboard is unavailable in this environment.", + "settings.devlog_copied": "Copied developer log output.", + "settings.devlog_copy_failed": "Failed to copy developer log output.", + "settings.devlog_export_failed": "Failed to export developer log output.", + "settings.devlog_export_unavailable": "Export is unavailable in this environment.", + "settings.devlog_exported": "Exported developer log output.", "settings.devtools_desc": "Sidecar health, capabilities, and audit trail.", "settings.devtools_title": "Devtools", "settings.diag_approval": "Approval: {mode} ({ms}ms)", @@ -2514,65 +1440,69 @@ export default { "settings.diag_version": "Version: {version}", "settings.diag_workspaces": "Workspaces: {count}", "settings.diagnostics_unavailable": "Diagnostics unavailable.", - "settings.disabled": "{caps().proxy?.opencodeRouter", - "settings.disconnect_confirm_suffix": - "Disconnect {resolved}? This removes stored API keys or OAuth credentials for this provider.", + "settings.disable_developer_mode": "Disable Developer Mode", + "settings.disabled": "Disabled", + "settings.disconnect": "Disconnect", + "settings.disconnect_confirm_suffix": "Disconnect {resolved}? This removes stored API keys or OAuth credentials for this provider.", "settings.disconnect_server": "Disconnect server", "settings.disconnected_prefix": "Disconnected {resolved}.", "settings.disconnecting": "Disconnecting...", - "settings.docker_containers_desc": - "Force-remove Docker containers launched by OpenWork", + "settings.docker_containers_desc": "Force-remove Docker containers launched by OpenWork", "settings.docker_containers_title": "OpenWork Docker containers", "settings.docker_requires_desktop": "Docker cleanup requires the desktop app", + "settings.done": "Done", "settings.downloading_bytes": "Downloading {downloaded}", - "settings.downloading_progress": - "Downloading {downloaded} / {total} ({percent}%)", + "settings.downloading_progress": "Downloading {downloaded} / {total} ({percent}%)", + "settings.enable_developer_mode": "Enable Developer Mode", "settings.enable_exa": "Enable Exa web search", - "settings.enable_exa_desc": - "Applies when OpenWork Orchestrator launches OpenCode. Off by", - "settings.enabled": "Config:", + "settings.enable_exa_desc": "Applies when OpenWork Orchestrator launches OpenCode. Off by", + "settings.enabled": "Enabled", "settings.engine_bundled": "Bundled (recommended)", - "settings.engine_bundled_hint": - "Bundled engine is the most reliable option. Use System", + "settings.engine_bundled_hint": "Bundled engine is the most reliable option. Use System", "settings.engine_custom_binary": "Custom binary", "settings.engine_desc": "Choose how OpenCode runs locally.", "settings.engine_runtime_label": "Engine runtime", + "settings.engine_source": "Engine source", "settings.engine_source_debug": "Engine source", "settings.engine_system_path": "System install (PATH)", "settings.engine_title": "Engine", - "settings.exa_restart_hint": - "Restart OpenCode or the orchestrator after changing this setting.", + "settings.exa_restart_hint": "Restart OpenCode or the orchestrator after changing this setting.", "settings.export": "Export", "settings.export_failed": "Failed to export runtime report.", "settings.export_unavailable": "Export is unavailable in this environment.", "settings.exported_debug_report": "Exported runtime report JSON.", - "settings.failed": "Connecting", + "settings.failed": "Failed", "settings.failed_open_providers": "Failed to open providers", "settings.feedback_badge": "We read every message", - "settings.feedback_desc": - "Tell us what feels great and what feels rough. Feedback goes straight to the team and helps us prioritize what ships next.", + "settings.feedback_desc": "Tell us what feels great and what feels rough. Feedback goes straight to the team and helps us prioritize what ships next.", "settings.feedback_title": "Help shape OpenWork", - "settings.group_global": "Workspace", - "settings.group_workspace": "Global", + "settings.group_global": "Global", + "settings.group_workspace": "Workspace", "settings.hide_titlebar": "Hide titlebar", - "settings.hide_titlebar_desc": - "Hide the window titlebar. Useful for tiling window", + "settings.hide_titlebar_desc": "Hide the window titlebar. Useful for tiling window", "settings.join_discord": "Join Discord", + "settings.language": "Language", + "settings.language.description": "Choose your preferred language", "settings.last_error": "Last error", "settings.last_stderr": "Last stderr", "settings.last_stdout": "Last stdout", "settings.loading_providers": "Loading providers...", "settings.logs_on_host": "Logs are available on the host.", - "settings.managed_by_env": "Disconnect", + "settings.managed_by_env": "Managed by env", "settings.messaging_bridge_service": "Messaging bridge service.", - "settings.messaging_section_desc": - "Manage Telegram/Slack identities and bindings in the Identities tab.", + "settings.messaging_section_desc": "Manage Telegram/Slack identities and bindings in the Identities tab.", "settings.messaging_section_title": "Messaging", + "settings.model": "Model", "settings.model_behavior": "Model behavior", - "settings.model_behavior_desc": - "Open the default model picker to choose reasoning profiles when they are available.", - "settings.model_section_desc": - "Pick the default chat model and review how it reasons.", + "settings.model_behavior_desc": "Open the default model picker to choose reasoning profiles when they are available.", + "settings.model_default": "Default", + "settings.model_description": "Defaults + thinking controls for runs.", + "settings.model_description_default": "Choose from your configured providers. This selection will be used for new sessions.", + "settings.model_description_session": "Choose from your configured providers. This selection applies to your next message.", + "settings.model_fallback": "Fallback", + "settings.model_reasoning": "Reasoning", + "settings.model_section_desc": "Pick the default chat model and review how it reasons.", + "settings.model_title": "Model", "settings.no_access": "no access", "settings.no_active_workspace": "No active local workspace.", "settings.no_audit_entries": "No audit entries yet.", @@ -2583,27 +1513,25 @@ export default { "settings.no_stdout": "No stdout captured yet.", "settings.no_worker_directory": "No project directory", "settings.no_worker_path": "No worker path available", - "settings.nuke_confirm_dev": - "This is irreversible. It WILL delete all OpenWork data for this dev build and all isolated OpenCode dev config, auth, cache, data, and state, then quit OpenWork. Continue?", - "settings.nuke_confirm_prod": - "This is irreversible. It WILL delete all OpenWork data for this dev build and all isolated OpenCode dev config, auth, cache, data, and state, then quit OpenWork. Continue?", + "settings.nuke_confirm_dev": "This is irreversible. It WILL delete all OpenWork data for this dev build and all isolated OpenCode dev config, auth, cache, data, and state, then quit OpenWork. Continue?", + "settings.nuke_confirm_prod": "This is irreversible. It WILL delete all OpenWork data for this dev build and all isolated OpenCode dev config, auth, cache, data, and state, then quit OpenWork. Continue?", "settings.nuke_failed": "Failed to remove OpenWork and OpenCode state.", - "settings.nuke_hint": - "Use this only when you want to fully reset the desktop app and its OpenCode runtime state.", - "settings.nuke_success": - "Removed OpenWork and OpenCode state. OpenWork is closing...", - "settings.offline": "Unavailable", + "settings.nuke_hint": "Use this only when you want to fully reset the desktop app and its OpenCode runtime state.", + "settings.nuke_success": "Removed OpenWork and OpenCode state. OpenWork is closing...", + "settings.off": "Off", + "settings.offline": "Offline", + "settings.on": "On", "settings.open_deeplink_action": "Opening...", "settings.open_deeplink_button": "Hide", - "settings.open_deeplink_desc": "font-mono", + "settings.open_deeplink_desc": "Paste an OpenWork deeplink or share URL to open it.", "settings.open_deeplink_title": "Open Deeplink", - "settings.opencode_engine_desc": - "Local runtime for agents, tools, and model providers.", + "settings.opencode_cache": "OpenCode cache", + "settings.opencode_cache_description": "Repairs cached data used to start the engine. Safe to run.", + "settings.opencode_engine_desc": "Local runtime for agents, tools, and model providers.", "settings.opencode_engine_label": "OpenCode engine", "settings.opencode_engine_sidecar_desc": "Local execution sidecar.", "settings.opencode_router_sidecar": "OpenCodeRouter sidecar", - "settings.opencode_runtime_desc": - "Runtime options for the local engine and orchestrator bridge.", + "settings.opencode_runtime_desc": "Runtime options for the local engine and orchestrator bridge.", "settings.opencode_sdk_desc": "UI connection diagnostics.", "settings.opencode_sdk_title": "OpenCode engine", "settings.opencode_section_label": "OpenCode", @@ -2611,44 +1539,59 @@ export default { "settings.opening": "Open deeplink", "settings.openwork_config_sidecar_desc": "Config and approvals sidecar.", "settings.openwork_diagnostics_title": "OpenWork server diagnostics", - "settings.openwork_server_desc": - "Session control plane for app sync, workers, and remote", + "settings.openwork_server_desc": "Session control plane for app sync, workers, and remote", "settings.openwork_server_label": "OpenWork server", "settings.orchestrator_daemon_layer_desc": "Workspace orchestration layer.", "settings.orchestrator_daemon_title": "Orchestrator daemon", - "settings.production_mode_badge": "Dev mode", + "settings.pending_permissions": "Pending permissions", + "settings.production_mode_badge": "Production", + "settings.provider_default_desc": "Use the model's built-in default reasoning behavior.", + "settings.provider_default_label": "Provider default", "settings.provider_source_config": "Config", "settings.provider_source_custom": "Custom", "settings.provider_source_env": "Environment", "settings.providers_desc": "Connect services for models and tools.", "settings.providers_title": "Providers", - "settings.quit_hint": - "OpenWork quits immediately after cleanup so the next launch starts from a blank local state for this mode.", - "settings.reconnect_failed": - "Reconnect failed. Check server URL/token and try again.", + "settings.quit_hint": "OpenWork quits immediately after cleanup so the next launch starts from a blank local state for this mode.", + "settings.recent_events": "Recent events", + "settings.reconnect_failed": "Reconnect failed. Check server URL/token and try again.", "settings.reconnect_server": "Reconnecting...", "settings.reconnect_server_failed": "Failed to reconnect OpenWork server.", "settings.reconnected": "Reconnected to OpenWork server.", "settings.reconnecting": "Reconnecting...", "settings.removing_containers": "Removing containers...", "settings.removing_local_state": "Removing local state...", + "settings.repair_cache": "Repair cache", + "settings.repairing_cache": "Repairing cache", "settings.report_issue": "Report an issue", + "settings.reset": "Reset", + "settings.reset_app_data": "Reset app data", + "settings.reset_app_data_description": "More aggressive. Clears OpenWork cache + app data.", + "settings.reset_app_data_title": "Reset app data", + "settings.reset_app_data_warning": "Clears OpenWork cache and app data on this device.", "settings.reset_button": "Reset", + "settings.reset_cancel": "Cancel", "settings.reset_config_defaults": "Resetting...", "settings.reset_config_failed": "Failed to reset app config.", - "settings.reset_openwork_desc_dev": - "With dev mode active, it only clears the isolated OpenCode dev state inside openwork-dev-data.", - "settings.reset_openwork_desc_prod": - "With dev mode active, it only clears the isolated OpenCode dev state inside openwork-dev-data.", + "settings.reset_confirm_button": "Reset & Restart", + "settings.reset_confirmation_hint": "Type RESET to confirm. OpenWork will restart.", + "settings.reset_confirmation_label": "Confirmation", + "settings.reset_confirmation_placeholder": "Type RESET", + "settings.reset_onboarding": "Reset onboarding", + "settings.reset_onboarding_description": "Clears OpenWork preferences and restarts the app.", + "settings.reset_onboarding_title": "Reset onboarding", + "settings.reset_onboarding_warning": "Clears OpenWork local preferences and workspace onboarding markers.", + "settings.reset_openwork_desc_dev": "With dev mode active, it only clears the isolated OpenCode dev state inside openwork-dev-data.", + "settings.reset_openwork_desc_prod": "With dev mode active, it only clears the isolated OpenCode dev state inside openwork-dev-data.", "settings.reset_openwork_title": "Reset OpenWork + OpenCode state", "settings.reset_recovery_desc": "Clear data or restart the setup flow.", "settings.reset_recovery_title": "Reset & Recovery", - "settings.reset_requires_confirm": - "Requires typing RESET and will restart the app.", + "settings.reset_requires_confirm": "Requires typing RESET and will restart the app.", + "settings.reset_startup": "Reset default startup mode", "settings.reset_startup_pref": "Reset startup preference", + "settings.reset_stop_active_runs": "Stop active runs before resetting.", "settings.resetting": "Resetting...", - "settings.restart_blocked_message": - "OpenWork needs to restart to finish this update. To avoid interrupting your current work, install is paused until your active runs finish or you stop them.", + "settings.restart_blocked_message": "OpenWork needs to restart to finish this update. To avoid interrupting your current work, install is paused until your active runs finish or you stop them.", "settings.restart_failed": "Restart failed. Check logs and try again.", "settings.restart_local_server": "Restarting...", "settings.restart_opencode": "Restarting...", @@ -2660,94 +1603,102 @@ export default { "settings.restarting": "Restarting...", "settings.reveal_config": "Reveal config", "settings.reveal_config_failed": "Failed to reveal workspace config.", - "settings.reveal_config_requires_desktop": - "Reveal config requires the desktop app", + "settings.reveal_config_requires_desktop": "Reveal config requires the desktop app", "settings.revealed_workspace_config": "Revealed workspace config.", "settings.run_sandbox_probe": "Running probe...", "settings.running_probe": "Running probe...", - "settings.runtime_applies_hint": - "Applies the next time the engine starts or reloads.", - "settings.runtime_debug_desc": - "Readable diagnostics snapshot with one-click export.", + "settings.runtime_applies_hint": "Applies the next time the engine starts or reloads.", + "settings.runtime_debug_desc": "Readable diagnostics snapshot with one-click export.", "settings.runtime_debug_title": "Runtime debug report", "settings.runtime_desc": "Status for your local engine and OpenWork server.", "settings.runtime_direct": "Direct (OpenCode)", "settings.runtime_orchestrator": "OpenWork Orchestrator", "settings.runtime_title": "Runtime", - "settings.sandbox_error": "ready", + "settings.sandbox_error": "Error", "settings.sandbox_export_hint": "Use Export in Runtime debug report above to", - "settings.sandbox_probe_desc": - "Runs a temporary Docker sandbox startup check and", + "settings.sandbox_probe_desc": "Runs a temporary Docker sandbox startup check and", "settings.sandbox_probe_errors": "Sandbox probe completed with errors.", "settings.sandbox_probe_failed": "Sandbox probe failed.", - "settings.sandbox_probe_success": - "Sandbox probe succeeded. Export the debug report for support.", + "settings.sandbox_probe_success": "Sandbox probe succeeded. Export the debug report for support.", "settings.sandbox_probe_title": "Sandbox probe", - "settings.sandbox_ready": "error", + "settings.sandbox_ready": "Ready", "settings.sandbox_requires_desktop": "Sandbox probe requires desktop app", "settings.sandbox_result": "Result: {status}", "settings.sandbox_run_id": "Run ID: {id}", "settings.sandbox_stop_runs_hint": "Stop active runs before probing", + "settings.search_models": "Search models…", "settings.select_binary": "Select OpenCode binary", - "settings.select_workspace_first": - "Select a local workspace before revealing config.", + "settings.select_workspace_first": "Select a local workspace before revealing config.", "settings.send_feedback": "Send feedback", - "settings.service_restarts_desc": - "Restart specific host services without leaving this", + "settings.service_restarts_desc": "Restart specific host services without leaving this", "settings.service_restarts_title": "Service restarts", + "settings.session_model": "Model", "settings.show_model_reasoning": "Show model reasoning", - "settings.show_model_reasoning_desc": - "Expand reasoning traces in the UI when a model exposes them.", + "settings.show_model_reasoning_desc": "Expand reasoning traces in the UI when a model exposes them.", + "settings.showing_models": "Showing {count} of {total}", "settings.sidecar_config_unavailable": "Sidecar config unavailable", + "settings.startup": "Startup", "settings.startup_local": "Start local server", "settings.startup_not_set": "Connect to server", - "settings.startup_remote_warning": - "Startup preference is currently remote. Engine settings", - "settings.startup_reset_hint": - "This clears your saved preference and shows the connection", + "settings.startup_remote_warning": "Startup preference is currently remote. Engine settings", + "settings.startup_reset_hint": "This clears your saved preference and shows the connection", "settings.startup_server": "Connect to server", + "settings.startup_title": "Startup", "settings.stop_local_server": "Stop local server", "settings.stop_runs_before_cleanup": "Stop active runs before cleanup", - "settings.stop_runs_before_reset_config": - "Stop active runs before resetting config", - "settings.suffix_available": "{available} available", - "settings.suffix_connected": "connected", + "settings.stop_runs_before_reset_config": "Stop active runs before resetting config", + "settings.stop_runs_to_reset": "Stop active runs to reset", "settings.switch": "Switch", - "settings.tab_description_advanced": - "Inspect runtime health, connection state, and developer-facing controls.", - "settings.tab_description_appearance": - "Adjust how OpenWork looks across desktop, system theme, and app chrome.", - "settings.tab_description_automations": - "Create and manage scheduled automations from workspace settings.", - "settings.tab_description_debug": - "Review runtime diagnostics, logs, and low-level debugging utilities.", - "settings.tab_description_den": - "Manage your OpenWork Cloud connection, hosted workers, and workspace access.", - "settings.tab_description_extensions": - "Manage MCP apps and OpenCode plugins for this workspace.", - "settings.tab_description_general": - "Connect providers, choose the default model, authorize folders, and control the selected OpenWork workspace plus its runtime connection.", - "settings.tab_description_messaging": - "Configure router identities and inbox behavior from workspace settings.", - "settings.tab_description_model": - "Tune the default model, runtime behavior, and assistant output settings.", - "settings.tab_description_recovery": - "Repair migration state, reset workspace defaults, and recover local settings.", - "settings.tab_description_skills": - "Browse, edit, and install skills without leaving settings.", - "settings.tab_description_updates": - "Keep the app current with quiet background checks and install controls.", + "settings.tab_advanced": "Advanced", + "settings.tab_appearance": "Appearance", + "settings.tab_automations": "Automations", + "settings.tab_cloud": "Cloud", + "settings.tab_debug": "Debug", + "settings.tab_description_advanced": "Inspect runtime health, connection state, and developer-facing controls.", + "settings.tab_description_appearance": "Adjust how OpenWork looks across desktop, system theme, and app chrome.", + "settings.tab_description_automations": "Create and manage scheduled automations from workspace settings.", + "settings.tab_description_debug": "Review runtime diagnostics, logs, and low-level debugging utilities.", + "settings.tab_description_den": "Manage your OpenWork Cloud connection, hosted workers, and workspace access.", + "settings.tab_description_extensions": "Manage MCP apps and OpenCode plugins for this workspace.", + "settings.tab_description_general": "Connect providers, choose the default model, authorize folders, and control the selected OpenWork workspace plus its runtime connection.", + "settings.tab_description_messaging": "Configure router identities and inbox behavior from workspace settings.", + "settings.tab_description_model": "Tune the default model, runtime behavior, and assistant output settings.", + "settings.tab_description_recovery": "Repair migration state, reset workspace defaults, and recover local settings.", + "settings.tab_description_skills": "Browse, edit, and install skills without leaving settings.", + "settings.tab_description_updates": "Keep the app current with quiet background checks and install controls.", + "settings.tab_extensions": "Extensions", + "settings.tab_general": "Settings", + "settings.tab_messaging": "Messaging", "settings.tab_model": "Model", + "settings.tab_recovery": "Recovery", + "settings.tab_skills": "Skills", + "settings.tab_updates": "Updates", + "settings.theme_dark": "Dark", + "settings.theme_light": "Light", + "settings.theme_system": "System", + "settings.theme_system_hint": "System mode follows your OS preference automatically.", "settings.toolbar_ready_to_install": "Ready to install", + "settings.update": "Update", + "settings.update_available": "Update available: v", "settings.update_available_version": "Update available: v{version}", "settings.update_check_button": "Check", "settings.update_check_failed": "Update check failed", + "settings.update_checking": "Checking...", "settings.update_download_button": "Download", + "settings.update_downloading": "Downloading...", + "settings.update_error": "Update check failed", "settings.update_install_button": "Install & Restart", "settings.update_last_checked": "Last checked {time}", "settings.update_published": "Published {date}", + "settings.update_ready": "Ready to install: v", "settings.update_ready_version": "Ready to install: v{version}", + "settings.update_uptodate": "Up to date", + "settings.updates": "Updates", "settings.updates_desc": "Keep OpenWork up to date.", + "settings.updates_desktop_only": "Updates are only available in the desktop app.", + "settings.updates_not_supported": "Updates are not supported in this environment.", + "settings.updates_title": "Updates", + "settings.version": "Version", "settings.versions_desc": "Sidecar + desktop build info.", "settings.versions_title": "Versions", "settings.window_appearance_desc": "Customize window appearance.", @@ -2757,57 +1708,343 @@ export default { "settings.workspace_config_title": "Workspace config", "settings.workspace_debug_events_label": "Workspace debug events", "settings.workspace_fallback_name": "Workspace", - - // share_skill_destination - "share_skill_destination.add_to_workspace": - "share_skill_destination.add_to_workspace", + "share.active_cloud_org": "Active Cloud org", + "share.back_hint": "Back to share options", + "share.chooser_subtitle": "Choose how you want to share this workspace.", + "share.close_hint": "Close", + "share.cloud_signin_note": "OpenWork Cloud opens in your browser and returns here after sign-in.", + "share.collaborator_hint": "Routine access without permission approvals.", + "share.connect_messaging_desc": "Use this workspace from Slack, Telegram, and others.", + "share.connect_messaging_title": "Connect messaging", + "share.connection_details_label": "Connection details", + "share.copy_hint": "Copy", + "share.copy_link_hint": "Copy link", + "share.create_template_link": "Create template link", + "share.credentials_disabled_hint": "Enable remote access and click Save to restart the worker and reveal the live connection details for this workspace.", + "share.field_password": "Password", + "share.field_worker_url": "Worker URL", + "share.hide_password": "Hide password", + "share.included_in_template": "Included in this template", + "share.option_access_desc": "Reveal the live connection details needed to reach this running workspace from another machine.", + "share.option_access_title": "Access workspace remotely", + "share.option_public_desc": "Create a share link anyone can use to start from this template.", + "share.option_public_title": "Public template", + "share.option_team_desc": "Save this workspace template to your active OpenWork Cloud organization.", + "share.option_team_title": "Share with team", + "share.option_template_desc": "Package this setup so someone else can start from the same environment.", + "share.option_template_title": "Share a template", + "share.optional_collaborator": "Optional collaborator access", + "share.public_intro": "Share this workspace as a public template link.", + "share.publishing": "Publishing...", + "share.regenerate_link": "Regenerate link", + "share.remote_access_desc": "Off by default. Turn this on only when you want this worker reachable from another machine.", + "share.remote_access_disabled": "Remote access is currently disabled.", + "share.remote_access_enabled": "Remote access is currently enabled.", + "share.remote_access_title": "Remote access", + "share.remote_save": "Save", + "share.remote_save_busy": "Saving...", + "share.reveal_password": "Reveal password", + "share.save_to_team": "Save to team", + "share.saving": "Saving...", + "share.setup": "Setup", + "share.sign_in_to_share": "Sign in to share with team", + "share.subtitle_access": "Reveal the live connection details needed to reach this workspace from another machine.", + "share.subtitle_template_public": "Create a public workspace template link anyone can import.", + "share.subtitle_template_team": "Save a workspace template to your active OpenWork Cloud organization.", + "share.team_intro": "Save this template to your active OpenWork Cloud organization so teammates can open it later from Cloud settings.", + "share.template_intro": "Share a reusable setup without granting live access to this running workspace.", + "share.template_item_config": "Commands and config", + "share.template_item_config_desc": "Reusable commands plus OpenWork/OpenCode config.", + "share.template_item_settings": "Workspace settings", + "share.template_item_settings_desc": "The shared workspace profile and default behavior.", + "share.template_item_skills": "Included skills", + "share.template_item_skills_desc": "Custom skills saved in this workspace.", + "share.template_name_label": "Template name", + "share.title": "Share workspace", + "share.view_access": "Access workspace remotely", + "share.view_template": "Share a template", + "share.view_template_public": "Public template", + "share.view_template_team": "Share with team", + "share.warning_basic": "Share with trusted people only. These credentials grant live access to this workspace.", + "share.warning_full": "These credentials grant live access to this workspace. Sharing this workspace remotely may allow anyone with access to your network to control your worker.", + "share.workspace_fallback": "Workspace", + "share.workspace_template_desc": "Share the core setup and workspace defaults.", + "share.workspace_template_title": "Workspace template", + "share_skill_destination.add_to_workspace": "share_skill_destination.add_to_workspace", "share_skill_destination.adding": "share_skill_destination.adding", - "share_skill_destination.connect_remote_hint": - "share_skill_destination.connect_remote_hint", - "share_skill_destination.create_worker_hint": - "share_skill_destination.create_worker_hint", - "share_skill_destination.more_options": - "share_skill_destination.more_options", - - // skills + "share_skill_destination.confirm_busy": "Adding skill...", + "share_skill_destination.confirm_button": "Add skill to workspace", + "share_skill_destination.connect_remote": "Connect remote workspace", + "share_skill_destination.connect_remote_desc": "Attach an OpenWork host, then choose it from the list to import this skill.", + "share_skill_destination.connect_remote_hint": "share_skill_destination.connect_remote_hint", + "share_skill_destination.create_worker": "Create new workspace", + "share_skill_destination.create_worker_desc": "Open the workspace setup flow, then add this skill after the new workspace is ready.", + "share_skill_destination.create_worker_hint": "share_skill_destination.create_worker_hint", + "share_skill_destination.current_badge": "Current", + "share_skill_destination.existing_workers": "Existing workspaces", + "share_skill_destination.fallback_skill_name": "Shared skill", + "share_skill_destination.footer_idle": "Choose a workspace to continue.", + "share_skill_destination.footer_selected": "Selected workspace:", + "share_skill_destination.local_badge": "Local", + "share_skill_destination.more_options": "share_skill_destination.more_options", + "share_skill_destination.new_destination": "New destination", + "share_skill_destination.no_workers": "No workspaces are ready yet. Create one or connect a remote workspace to install this skill.", + "share_skill_destination.remote_badge": "Remote", + "share_skill_destination.sandbox_badge": "Sandbox", + "share_skill_destination.selected_badge": "Selected", + "share_skill_destination.selected_hint": "Selected. Review the destination below, then confirm.", + "share_skill_destination.skill_label": "Shared skill", + "share_skill_destination.subtitle": "Choose an existing workspace or create a new one before importing this shared skill.", + "share_skill_destination.title": "Where should this skill go?", + "share_skill_destination.trigger_label": "Trigger", + "sidebar.active": "Active", + "sidebar.add_workspace": "Add new workspace", + "sidebar.collapse": "Collapse", + "sidebar.connect_remote": "Connect remote", + "sidebar.delete_session": "Delete session", + "sidebar.drag_reorder": "Drag to reorder", + "sidebar.edit_connection": "Edit connection", + "sidebar.expand": "Expand", + "sidebar.import_config": "Import config", + "sidebar.needs_attention": "Needs attention", + "sidebar.new_worker": "New worker", + "sidebar.no_workspaces": "No workspaces in this session yet. Add one to get started.", + "sidebar.progress": "Progress", + "sidebar.show_fewer": "Show fewer", + "sidebar.show_more": "Show {count} more", + "sidebar.stop_sandbox": "Stop sandbox", + "sidebar.switch": "Switch", + "sidebar.test_connection": "Test connection", "skills.add_custom_repo": "Add custom GitHub repo", "skills.add_git_repo": "Add git repo", "skills.add_openwork_hub": "Add OpenWork Hub", "skills.available_from_hub": "Available from Hub", + "skills.catalog_search_placeholder": "Search installed, team, and hub skills", + "skills.cloud_add_skill": "Add skill", + "skills.cloud_choose_org_detail": "Use the Cloud panel to pick your active org, then refresh this list.", + "skills.cloud_choose_org_hint": "Choose an organization in Settings → Cloud to load team skills.", + "skills.cloud_footer_label": "Team", + "skills.cloud_hub_label": "Hub: {name}", + "skills.cloud_install_need_server": "Connect to an OpenWork server with skills write access to install team skills on this worker.", + "skills.cloud_installed": "Installed {name} on this worker.", + "skills.cloud_installing": "Installing {title}…", + "skills.cloud_installing_short": "Installing", + "skills.cloud_no_search_matches": "No skills match that search.", + "skills.cloud_org_empty": "No organization skills are available yet.", + "skills.cloud_org_fallback": "OpenWork Cloud", + "skills.cloud_org_load_failed": "Failed to load organization skills.", + "skills.cloud_refresh": "Refresh team skills", + "skills.cloud_section_subtitle": "Skills shared with you through OpenWork Cloud — including team skill hubs you can access.", + "skills.cloud_section_title": "From your organization", + "skills.cloud_shared_org": "Org", + "skills.cloud_shared_public": "Public", + "skills.cloud_sign_in": "Sign in to Cloud", + "skills.cloud_sign_in_hint": "Sign in to OpenWork Cloud to browse team and org skills.", "skills.copy_link_failed": "Failed to copy link", "skills.create_in_chat": "Create skill in chat", + "skills.desktop_required": "Skill management requires the desktop app.", + "skills.enter_plugin_name": "Enter a plugin package name.", + "skills.failed_load_active": "Failed to load active plugins.", + "skills.failed_load_opencode": "Failed to load opencode.json", + "skills.failed_parse_opencode": "Failed to parse opencode.json", + "skills.failed_to_load": "Failed to load skills", + "skills.failed_update_opencode": "Failed to update opencode.json", + "skills.filter_all": "All", + "skills.filter_cloud": "Team", + "skills.filter_hub": "Hub", + "skills.filter_installed": "Installed", "skills.from_repo": "From {owner}/{repo}", - "skills.github_repo_hint": "font-mono", - "skills.hub_desc": - "Browse shared skills from GitHub-backed hubs and add them to this worker.", + "skills.github_repo_hint": "Enter a GitHub repo in owner/repo format.", + "skills.host_mode_only": "Local workspace only", + "skills.host_only_error": "Skill management requires a local workspace or connected OpenWork server.", + "skills.hub_desc": "Browse shared skills from GitHub-backed hubs and add them to this worker.", "skills.hub_label": "Hub", + "skills.import": "Import", + "skills.import_failed": "Import failed ({status})", + "skills.import_local": "Import local skill", + "skills.import_local_hint": "Copy an existing skill folder into this workspace.", "skills.import_local_skill": "Import local skill", + "skills.imported": "Imported.", + "skills.install": "Install", + "skills.install_failed": "Skill install failed.", "skills.install_name_title": "Install {name}", - "skills.installed_desc": - "Installed skills live on this worker and can be edited or shared.", + "skills.install_skill_creator": "Install skill creator", + "skills.install_skill_creator_hint": "This skill allows you to create other skills from within the chat.", + "skills.installed": "Installed skills", + "skills.installed_desc": "Installed skills live on this worker and can be edited or shared.", + "skills.installed_label": "Installed", "skills.installed_status": "Installed", "skills.installing": "Add skill", "skills.installing_prefix": "Installing {name}…", + "skills.installing_skill_creator": "Installing skill creator...", "skills.link_copied": "Link copied", "skills.loading": "Loading…", "skills.no_description": "No description yet.", "skills.no_hub_repo_label": "No hub repo selected", "skills.no_hub_repo_selected": "No hub skills available.", - "skills.no_hub_skills": - "No hub repo selected. Add a GitHub repo to browse skills.", + "skills.no_hub_skills": "No hub repo selected. Add a GitHub repo to browse skills.", + "skills.no_opencode_found": "No opencode.json found yet. Add a plugin to create one.", + "skills.no_opencode_workspace": "No opencode.json in this workspace yet.", + "skills.no_skills": "No skills detected in `.opencode/skills`, `.claude/skills`, or `~/.agents/skills`.", + "skills.no_skills_found": "No skills found yet.", "skills.owner_label": "Owner", "skills.owner_repo_required": "Owner and repo are required.", + "skills.pick_project_first": "Pick a project folder first.", + "skills.pick_project_for_active": "Pick a project folder to load active plugins.", + "skills.pick_project_for_plugins": "Pick a project folder to manage project plugins.", + "skills.pick_workspace_first": "Pick a workspace folder first.", + "skills.plugin_already_listed": "Plugin already listed in opencode.json.", + "skills.plugin_management_host_only": "Plugin management requires the desktop app.", + "skills.plugins_host_only": "Plugins are only available in the desktop app.", "skills.ref_label": "Ref (branch/tag/commit)", + "skills.refresh": "Refresh", "skills.refresh_hub": "Refresh hub", "skills.refresh_hub_title": "Refresh hub catalog", "skills.remove_saved_repo": "Remove saved repo", "skills.repo_label": "Repo", + "skills.reveal_failed": "Failed to open skills folder.", + "skills.reveal_folder": "Open skills folder", + "skills.reveal_folder_hint": "Open the skill directory in Finder.", "skills.save_and_load": "Save and load", "skills.save_failed": "Failed to save skill.", + "skills.select_skill_folder": "Select skill folder", + "skills.share_back": "Back", + "skills.share_chooser_subtitle": "Save to your OpenWork Cloud organization or publish a public install link.", + "skills.share_close": "Close", + "skills.share_copy_link": "Copy", + "skills.share_done": "Done", + "skills.share_option_public_desc": "Create a link anyone can use to install this skill.", + "skills.share_option_public_title": "Public link", + "skills.share_option_team_desc": "Add this skill to your active OpenWork Cloud organization.", + "skills.share_option_team_title": "Share with team", + "skills.share_public_create": "Create link", + "skills.share_public_creating": "Publishing…", + "skills.share_public_intro": "Publish a public link. Anyone with the URL can install this skill.", + "skills.share_public_regenerate": "Regenerate link", + "skills.share_publisher_label": "Publisher", + "skills.share_subtitle_public": "Anyone with the link can install this skill.", + "skills.share_subtitle_team": "Stored in your organization for teammates.", + "skills.share_team_choose_org": "Choose an organization in Settings → Cloud before sharing with your team.", + "skills.share_team_hub_label": "Add to skill hub (optional)", + "skills.share_team_hub_none": "Organization only — not in a hub", + "skills.share_team_hubs_loading": "Loading hubs…", + "skills.share_team_intro": "Save this skill to your active organization so teammates can install it from Cloud.", + "skills.share_team_org_fallback": "Active Cloud org", + "skills.share_team_save": "Save to team", + "skills.share_team_saving": "Saving…", + "skills.share_team_sign_in": "Sign in to share with team", + "skills.share_team_sign_in_hint": "OpenWork Cloud opens in your browser. Return here after signing in.", + "skills.share_team_success": "Saved to {org}. Teammates can install it from your organization skills.", + "skills.share_title": "Share skill", "skills.shown_count": "{count} shown", + "skills.skill_creator_already_installed": "Skill creator is already installed.", + "skills.skill_creator_installed": "Skill creator installed.", "skills.skill_load_failed": "Failed to load skill.", "skills.source_label": "Source", + "skills.subtitle": "Manage skills for this workspace.", + "skills.title": "Skills", "skills.trigger_label": "Trigger: {trigger}", - "skills.worker_profile_desc": - "Skills are the core abilities of this worker. Discover them from Hub, manage what is installed, and create new ones directly in chat.", + "skills.uninstall": "Uninstall", + "skills.uninstall_failed": "Failed to uninstall skill.", + "skills.uninstall_title": "Uninstall skill?", + "skills.uninstall_warning": "This will permanently delete the `{name}` skill from your workspace.", + "skills.uninstalled": "Skill removed.", + "skills.unknown_error": "Unknown error", + "skills.worker_profile_desc": "Skills are the core abilities of this worker. Discover them from Hub, manage what is installed, and create new ones directly in chat.", + "status.back": "Back to previous screen", + "status.connected": "Connected", + "status.connecting": "Connecting", + "status.creating_task": "Creating new task", + "status.creating_workspace": "Creating workspace", + "status.developer_mode": "Developer mode", + "status.disconnected": "Disconnected", + "status.disconnected_hint": "Open settings to reconnect", + "status.disconnected_label": "Disconnected", + "status.disconnecting": "Disconnecting", + "status.feedback": "Feedback", + "status.idle": "Idle", + "status.installing_opencode": "Installing OpenCode", + "status.limited_hint": "Reconnect to restore full OpenWork features", + "status.limited_mcp_hint": "{count} MCP connected · reconnect for full features", + "status.limited_mode": "Limited Mode", + "status.live": "Live", + "status.loading_session": "Loading session", + "status.mcp_connected": "{count} MCP connected", + "status.openwork_ready": "OpenWork Ready", + "status.providers_connected": "{count} provider{plural} connected", + "status.ready_for_tasks": "Ready for new tasks", + "status.reloading_engine": "Reloading engine", + "status.restarting_engine": "Restarting engine", + "status.running": "Running", + "status.send_feedback": "Send feedback", + "status.settings": "Settings", + "status.starting_engine": "Starting engine", + "system.cache_repair_requires_desktop": "Cache repair requires the desktop app.", + "system.docker_cleanup_requires_desktop": "Docker cleanup requires the desktop app.", + "system.reload_body_agents": "OpenCode loads agents at startup. Reload the engine to make updated agents available.", + "system.reload_body_commands": "OpenCode loads commands at startup. Reload the engine to make updated commands available.", + "system.reload_body_config": "OpenCode reads opencode.json at startup. Reload the engine to apply configuration changes.", + "system.reload_body_default": "OpenWork detected changes that require reloading the OpenCode instance.", + "system.reload_body_mcp": "OpenCode loads MCP servers at startup. Reload the engine to activate the new connection.", + "system.reload_body_mixed": "OpenWork detected OpenCode configuration changes. Reload the engine to apply them.", + "system.reload_body_plugins": "OpenCode loads npm plugins at startup. Reload the engine to apply opencode.json changes.", + "system.reload_body_skills": "OpenCode can cache skill discovery/state. Reload the engine to make newly installed skills available.", + "system.reload_failed": "Failed to reload the engine.", + "system.reload_required": "Reload required", + "system.reload_unavailable": "Reload is unavailable for this worker.", + "system.stop_active_runs_before_reset": "Stop active runs before resetting.", + "system.stop_runs_before_update": "Stop active runs before installing an update.", + "system.updates_not_supported": "Updates are not supported in this environment.", + "time.hours_ago": "{count}h ago", + "time.just_now": "just now", + "time.minutes_ago": "{count}m ago", + "time.seconds_ago": "{count}s ago", + "workspace.loading_tasks": "Loading tasks...", + "workspace.local_badge": "Local", + "workspace.new_task_inline": "+ New task", + "workspace.no_tasks": "No tasks yet.", + "workspace.remote_badge": "Remote", + "workspace.rename_description": "Update the name shown in the sidebar.", + "workspace.rename_label": "Workspace name", + "workspace.rename_placeholder": "Design team workspace", + "workspace.rename_title": "Edit workspace name", + "workspace.sandbox_badge": "Sandbox", + "workspace.selected": "Selected", + "workspace.switch": "Switch", + "workspace.switching_status_connecting": "Checking your connection", + "workspace.switching_status_loading": "Loading recent tasks", + "workspace.switching_status_preparing": "Getting things ready", + "workspace.switching_subtitle": "We’ll bring your recent work back.", + "workspace.switching_title": "Opening {name}", + "workspace.switching_title_unknown": "Opening workspace", + "workspace_list.add_workspace": "Add workspace", + "workspace_list.connect_remote": "Connect remote workspace", + "workspace_list.connecting": "Connecting...", + "workspace_list.delete_session": "Delete session", + "workspace_list.desktop_only_hint": "Create local workspaces in the desktop app.", + "workspace_list.edit_connection": "Edit connection", + "workspace_list.edit_name": "Edit name", + "workspace_list.hide_child_sessions": "Hide child sessions", + "workspace_list.import_config": "Import config", + "workspace_list.new_workspace": "New workspace", + "workspace_list.recover": "Recover", + "workspace_list.remove_workspace": "Remove workspace", + "workspace_list.rename_session": "Rename session", + "workspace_list.reveal_explorer": "Reveal in Explorer", + "workspace_list.reveal_finder": "Reveal in Finder", + "workspace_list.session_actions": "Session actions", + "workspace_list.share": "Share...", + "workspace_list.show_child_sessions": "Show child sessions", + "workspace_list.show_more": "Show {count} more", + "workspace_list.show_more_fallback": "Show more", + "workspace_list.test_connection": "Test connection", + "workspace_list.workspace_fallback": "Workspace", + "workspace_list.workspace_options": "Workspace options", + "workspace_sidebar.automations": "Automations", + "workspace_sidebar.close_sidebar": "Close sidebar", + "workspace_sidebar.collapse_sidebar": "Collapse sidebar", + "workspace_sidebar.configuration": "configuration", + "workspace_sidebar.expand_sidebar": "Expand sidebar", + "workspace_sidebar.extensions": "Extensions", + "workspace_sidebar.messaging": "Messaging", } as const; diff --git a/apps/app/src/i18n/locales/ja.ts b/apps/app/src/i18n/locales/ja.ts index 202f42512..2b7680322 100644 --- a/apps/app/src/i18n/locales/ja.ts +++ b/apps/app/src/i18n/locales/ja.ts @@ -3,880 +3,16 @@ */ export default { - // ==================== Dashboard ==================== - "dashboard.title": "ダッシュボード", - "dashboard.sessions": "セッション", - "dashboard.commands": "コマンド", - "dashboard.skills": "スキル", - "dashboard.plugins": "プラグイン", - "dashboard.mcps": "アプリ", - "dashboard.settings": "設定", - "dashboard.home": "ホーム", - "dashboard.runs": "実行", - "dashboard.find_workspace": "ワークスペースを検索…", - "dashboard.workspaces": "ワークスペース", - "dashboard.no_workspaces": "一致するワークスペースがありません。", - "dashboard.new_workspace": "新しいワークスペース…", - "dashboard.new_remote_workspace": "リモートワークスペースを追加…", - "dashboard.forget_workspace": "ワークスペースを削除", - "dashboard.remote": "リモート", - "dashboard.connection": "接続", - "dashboard.local_engine": "ローカルエンジン", - "dashboard.client_mode": "クライアントモード", - "dashboard.connected": "接続済み", - "dashboard.not_connected": "未接続", - "dashboard.stop_disconnect": "停止して切断", - "dashboard.disconnect": "切断", - "dashboard.new_task": "新しいタスク", - "dashboard.new": "新規", - "dashboard.busy": "ビジー", - "dashboard.hero_title": "今日は何をしましょうか?", - "dashboard.hero_description": "何でも依頼してください。OpenWorkが実行し、すべて記録に残します。", - "dashboard.quick_start_commands": "クイックスタートコマンド", - "dashboard.view_all": "すべて表示", - "dashboard.no_commands": "まだコマンドがありません。スターターコマンドがここに表示されます。", - "dashboard.run_command": "保存済みコマンドを実行", - "dashboard.recent_sessions": "最近のセッション", - "dashboard.this_workspace": "このワークスペース", - "dashboard.no_sessions": "まだセッションがありません。", - "dashboard.idle": "アイドル", - "dashboard.running": "実行中", - "dashboard.completed": "完了", - "dashboard.failed": "失敗", - "dashboard.repairing_cache": "キャッシュ修復中", - "dashboard.repair_cache": "キャッシュを修復", - "dashboard.retry": "再試行", - "dashboard.alpha": "アルファ", - "dashboard.create_workspace_title": "ワークスペースを作成", - "dashboard.create_workspace_subtitle": "新しいフォルダベースのワークスペースを作成します。", - "dashboard.create_workspace_confirm": "ワークスペースを作成", - "dashboard.create_sandbox_confirm": "サンドボックスとして作成", - "share_skill_destination.title": "このスキルをどこに追加しますか?", - "share_skill_destination.subtitle": "共有されたスキルをインポートする前に、既存のワークスペースを選択するか新しいワークスペースを作成してください。", - "share_skill_destination.skill_label": "共有スキル", - "share_skill_destination.fallback_skill_name": "共有スキル", - "share_skill_destination.trigger_label": "トリガー", - "share_skill_destination.current_badge": "現在", - "share_skill_destination.existing_workers": "既存のワークスペース", - "share_skill_destination.no_workers": "まだ準備できたワークスペースがありません。このスキルをインストールするには、ワークスペースを作成するかリモートワークスペースに接続してください。", - "share_skill_destination.new_destination": "新しい送信先", - "share_skill_destination.selection_ready": "追加準備完了", - "share_skill_destination.selected_badge": "選択済み", - "share_skill_destination.selected_hint": "選択済み。下の送信先を確認してから確定してください。", - "share_skill_destination.footer_idle": "続行するにはワークスペースを選択してください。", - "share_skill_destination.footer_selected": "選択されたワークスペース:", - "share_skill_destination.confirm_button": "ワークスペースにスキルを追加", - "share_skill_destination.confirm_busy": "スキルを追加中…", - "share_skill_destination.local_badge": "ローカル", - "share_skill_destination.remote_badge": "リモート", - "share_skill_destination.sandbox_badge": "サンドボックス", - "share_skill_destination.create_worker": "新しいワークスペースを作成", - "share_skill_destination.create_worker_desc": "ワークスペースセットアップフローを開き、新しいワークスペースの準備ができたらこのスキルを追加します。", - "share_skill_destination.connect_remote": "リモートワークスペースに接続", - "share_skill_destination.connect_remote_desc": "OpenWorkホストを接続し、リストから選択してこのスキルをインポートします。", - "dashboard.sandbox_get_ready_title": "サンドボックスにはDockerが必要です", - "dashboard.sandbox_get_ready_action": "システムを準備する", - "dashboard.sandbox_get_ready_desc": "このワークスペースをDockerコンテナで安全に実行できます。再現性も向上します。", - "dashboard.sandbox_checking_docker": "Dockerを確認中…", - "dashboard.create_remote_workspace_title": "リモートワークスペースを追加", - "dashboard.create_remote_workspace_subtitle": "OpenWorkサーバーをワークスペースとして保存します。", - "dashboard.create_remote_workspace_confirm": "ワークスペースを追加", - "dashboard.edit_remote_workspace_title": "リモート接続を編集", - "dashboard.edit_remote_workspace_subtitle": "このワークスペースのOpenWorkサーバー詳細を更新します。", - "dashboard.edit_remote_workspace_confirm": "接続を保存", - "dashboard.remote_workspace_title": "リモートワークスペース", - "dashboard.remote_workspace_hint": "OpenWorkサーバーを登録して、いつでも再接続できます。", - "dashboard.remote_base_url_label": "OpenWorkサーバーURL", - "dashboard.remote_base_url_placeholder": "http://127.0.0.1:", - "dashboard.remote_base_url_required": "続行するにはサーバーURLを追加してください。", - "dashboard.openwork_host_label": "OpenWorkサーバーURL", - "dashboard.openwork_host_placeholder": "https://your-server.openwork.app", - "dashboard.openwork_host_hint": "OpenWorkサーバーから共有されたURLを使用してください。", - "dashboard.openwork_host_token_label": "コラボレーターまたはオーナートークン", - "dashboard.openwork_host_token_placeholder": "トークンを貼り付け", - "dashboard.openwork_host_token_hint": "任意。通常アクセス用のコラボレータートークン、または許可プロンプトへの応答が必要な場合はオーナートークンを貼り付けてください。", - "dashboard.remote_mode_openwork_alpha": "OpenWorkサーバー", - "dashboard.remote_mode_direct": "ダイレクト(レガシー)", - "dashboard.remote_connection_openwork": "OpenWork", - "dashboard.remote_connection_direct": "ダイレクト", - "dashboard.remote_directory_label": "ワークスペースディレクトリ(任意)", - "dashboard.remote_directory_placeholder": "/home/team/project", - "dashboard.remote_directory_hint": "空欄ならサーバーのデフォルトを使います。", - "dashboard.remote_display_name_label": "表示名(任意)", - "dashboard.remote_display_name_placeholder": "デザインチームワークスペース", - "dashboard.select_folder": "フォルダを選択", - "dashboard.choose_folder": "フォルダを選択してください", - "dashboard.choose_folder_next": "ワークスペースとファイルを共有できます。", - "dashboard.change": "変更", - "dashboard.opening": "開いています…", - "dashboard.choose_preset": "プリセットを選択", - "dashboard.choose_folder_continue": "続行するにはフォルダを選択してください。", - "dashboard.starter_workspace": "スターターワークスペース", - "dashboard.starter_workspace_desc": "プラグイン、コマンド、スキルがすぐ使えるワークスペースです。", - "dashboard.empty_workspace": "空のワークスペース", - "dashboard.empty_workspace_desc": "空のフォルダから始めて、必要なものを追加します。", - "dashboard.blueprints_workspace": "ブループリント", - "dashboard.blueprints_workspace_desc": "スキル、コマンド、共有フローをすぐ活用できる自動化向けワークスペースです。", - - // ==================== Workspace ==================== - "workspace.rename_title": "ワークスペース名を編集", - "workspace.rename_description": "サイドバーに表示される名前を更新します。", - "workspace.rename_label": "ワークスペース名", - "workspace.rename_placeholder": "デザインチームワークスペース", - - // ==================== Session ==================== - "session.no_selected": "セッションが選択されていません", - "session.back_to_dashboard": "ダッシュボードに戻る", - "session.new_task": "新しいタスク", - "session.recents": "最近の履歴", - "session.recents_notice": "これらのタスクはローカルで実行され、デバイス間では同期されません。", - "session.ready_to_work_title": "作業準備完了", - "session.ready_to_work_description": "タスクを入力してください。進捗をお見せしながら、必要なときは確認を取ります。", - "session.document_label": "ドキュメント", - "session.standard_label": "スタンダード", - "session.no_artifacts_fallback": "まだアーティファクトがありません。", - "session.active_plugins_label": "アクティブなプラグイン", - "session.active_plugins_count": "{count}", - "session.no_plugins_loaded": "プラグインが読み込まれていません。", - "session.selected_folders_label": "選択されたフォルダ", - "session.selected_folders_count": "{count}", - "session.working_files_label": "作業ファイル", - "session.none_yet_label": "まだありません。", - "session.permission_required_title": "権限が必要です", - "session.permission_required_description": "OpenCodeが続行するために許可を求めています。", - "session.permission_label_uppercase": "権限", - "session.scope_label_uppercase": "スコープ", - "session.details_label": "詳細", - "session.steps_notice_text": "タスクの進行に応じてステップが表示されます。", - "session.ready_to_work": "作業準備完了", - "session.ready_description": "タスクを入力してください。進捗をお見せしながら、必要なときは確認を取ります。", - "session.hide_steps": "ステップを隠す", - "session.view_steps": "ステップを表示", - "session.open": "開く", - "session.reveal": "表示", - "session.opened_toast": "デフォルトアプリで開きました。", - "session.revealed_toast": "ファイルマネージャーで表示しました。", - "session.artifact_path_missing": "アーティファクトのパスがありません。", - "session.desktop_only": "この機能はデスクトップアプリでのみ利用可能です。", - "session.open_failed": "アーティファクトを開けませんでした。", - "session.model": "モデル", - "session.ready": "準備完了", - "session.connect_provider": "プロバイダーを接続するとカスタマイズできます。", - "session.running": "実行中", - "session.progress": "進行状況", - "session.steps_notice": "タスクの進行に応じてステップが表示されます。", - "session.artifacts": "アーティファクト", - "session.no_artifacts": "まだアーティファクトがありません。", - "session.context": "コンテキスト", - "session.active_plugins": "アクティブなプラグイン", - "session.no_plugins": "プラグインが読み込まれていません。", - "session.selected_folders": "選択されたフォルダ", - "session.working_files": "作業ファイル", - "session.none_yet": "まだありません。", - "session.document": "ドキュメント", - "session.standard": "スタンダード", - "session.try_notion_prompt": "試してみよう: NotionでCRMをセットアップ", - "session.insert_prompt": "プロンプトを挿入", - "session.placeholder": "OpenWorkに質問…", - "session.run": "実行", - "session.permission_required": "権限が必要です", - "session.permission_description": "OpenCodeが続行するために許可を求めています。", - "session.permission_label": "権限", - "session.scope_label": "スコープ", - "session.details": "詳細", - "session.deny": "拒否", - "session.once": "一度だけ", - "session.allow_for_session": "セッション中許可", - - "session.tasks_local_hint": "これらのタスクはローカルで実行され、デバイス間では同期されません。", - "session.recents_label": "最近の履歴", - "session.model_standard": "スタンダード", - "session.run_button_title": "実行", - "session.rename_title": "セッション名を変更", - "session.rename_description": "このセッションの名前を更新します。", - "session.rename_label": "セッション名", - "session.rename_placeholder": "新しい名前を入力", - // ==================== Commands ==================== - "commands.new": "新規", - "commands.empty_state": "プロンプトやコマンドを保存して、ワンタップで再実行できるようにしましょう。", - "commands.workspace": "このワークスペース", - "commands.global": "すべてのワークスペース", - "commands.other": "その他のコマンド", - "commands.run": "実行", - "commands.modal_title": "再利用可能なフローを保存", - "commands.modal_description": "プロンプトやコマンドを保存して素早く再利用できます。", - "commands.name_label": "コマンド名", - "commands.name_placeholder": "例: daily-standup", - "commands.name_hint": "OpenCodeで /daily-standup として使用できます。", - "commands.description_label": "説明(任意)", - "commands.description_placeholder": "このコマンドは何をしますか?", - "commands.template_label": "手順", - "commands.template_placeholder": "再利用したい手順を記述してください…", - "commands.template_hint": "詳細を受け取るには $ARGUMENTS を使用してください。", - "commands.details_required": "詳細", - "commands.default_description": "保存済みコマンドを実行", - "commands.command_label": "コマンド", - "commands.details_label": "詳細", - "commands.details_placeholder": "任意の詳細を追加", - "commands.details_hint": "これらの詳細はコマンドに渡されます。", - "commands.run_modal_title": "コマンドを実行", - "commands.run_modal_description": "実行前に任意の詳細を追加してください。", - "commands.run_modal_run": "コマンドを実行", - "commands.name_will_be": "作成されるコマンド名", - "commands.override_title": "既存のコマンドを置き換えますか?", - "commands.override_description": "同じ名前のコマンドが既に存在します。", - "commands.override_warning": "既存の \"{name}\" コマンドが置き換えられます。この操作は元に戻せません。", - "commands.override_confirm": "置き換え", - "commands.override_cancel": "既存を維持", - - // ==================== Skills ==================== - "skills.title": "スキル", - "skills.subtitle": "このワークスペースのスキルを管理します。", - "skills.refresh": "更新", - "skills.add_title": "スキルを追加", - "skills.add_description": "スターターコマンドをインストール、スキルをインポート、またはフォルダを開きます。", - "skills.install_from_openpackage": "OpenPackageからインストール", - "skills.host_mode_only": "ローカルワークスペースのみ", - "skills.install": "インストール", - "skills.installed_label": "インストール済み", - "skills.install_hint": "OpenPackageパッケージを現在のワークスペースにインストールします。スキルは`.opencode/skills`に配置されます。", - "skills.import_local": "ローカルスキルをインポート", - "skills.import_local_hint": "既存のスキルフォルダをこのワークスペースにコピーします。", - "skills.import": "インポート", - "skills.curated_packages": "厳選パッケージ", - "skills.view": "表示", - "skills.search_placeholder": "パッケージやリストを検索(例: claude, registry, community)", - "skills.no_matches": "一致する厳選パッケージがありません。別の検索語を試してください。", - "skills.install_package": "インストール", - "skills.registry_notice": "OpenPackageレジストリへの公開には現在認証が必要です。レジストリ検索と厳選リスト同期は今後対応予定です。", - "skills.installed": "インストール済みスキル", - "skills.no_skills": "`.opencode/skills`、`.claude/skills`、`~/.agents/skills`にスキルが検出されませんでした。", - "skills.desktop_required": "スキル管理にはデスクトップアプリが必要です。", - "skills.host_only_error": "スキル管理にはローカルワークスペースまたは接続されたOpenWorkサーバーが必要です。", - "skills.install_skill_creator": "スキルクリエイターをインストール", - "skills.install_skill_creator_hint": "このスキルを使って、チャット内から他のスキルを作成できます。", - "skills.installing_skill_creator": "スキルクリエイターをインストール中…", - "skills.skill_creator_installed": "スキルクリエイターをインストールしました", - "skills.skill_creator_already_installed": "スキルクリエイターは既にインストール済みです。", - "skills.install_failed": "スキルのインストールに失敗しました。", - "skills.reveal_folder": "スキルフォルダを開く", - "skills.reveal_folder_hint": "スキルディレクトリをFinderで開きます。", - "skills.reveal_button": "Finderで表示", - "skills.reveal_failed": "スキルフォルダを開けませんでした。", - "skills.uninstall": "アンインストール", - "skills.uninstall_title": "スキルをアンインストールしますか?", - "skills.uninstall_warning": "ワークスペースから`{name}`スキルを完全に削除します。", - "skills.uninstall_failed": "スキルのアンインストールに失敗しました。", - "skills.uninstalled": "スキルを削除しました", - "skills.share_title": "スキルを共有", - "skills.share_chooser_subtitle": "OpenWork Cloudの組織に保存するか、公開インストールリンクを発行します。", - "skills.share_subtitle_public": "リンクを知っている人は誰でもこのスキルをインストールできます。", - "skills.share_subtitle_team": "チーム向けに組織に保存されます。", - "skills.share_option_team_title": "チームと共有", - "skills.share_option_team_desc": "アクティブなOpenWork Cloud組織にこのスキルを追加します。", - "skills.share_option_public_title": "公開リンク", - "skills.share_option_public_desc": "誰でもこのスキルをインストールできるリンクを作成します。", - "skills.share_public_intro": "公開リンクを発行します。URLを知っている人は誰でもインストールできます。", - "skills.share_publisher_label": "パブリッシャー", - "skills.share_public_create": "リンクを作成", - "skills.share_public_regenerate": "リンクを再発行", - "skills.share_public_creating": "公開中…", - "skills.share_copy_link": "コピー", - "skills.share_team_intro": "チームがCloudからインストールできるよう、アクティブな組織に保存します。", - "skills.share_team_org_fallback": "アクティブなCloud組織", - "skills.share_team_hub_label": "スキルハブに追加(任意)", - "skills.share_team_hub_none": "組織のみ — ハブには入れない", - "skills.share_team_hubs_loading": "ハブを読み込み中…", - "skills.share_team_sign_in": "チーム共有のためにサインイン", - "skills.share_team_sign_in_hint": "ブラウザでOpenWork Cloudが開きます。サインイン後にここに戻ってください。", - "skills.share_team_save": "チームに保存", - "skills.share_team_saving": "保存中…", - "skills.share_team_success": "{org} に保存しました。チームは組織スキルからインストールできます。", - "skills.share_team_choose_org": "チーム共有の前に設定のCloudで組織を選んでください。", - "skills.share_back": "戻る", - "skills.share_close": "閉じる", - "skills.share_done": "完了", - "skills.source_placeholder": "github:anthropics/claude-code", - "skills.notion_crm_title": "Notion CRMエンリッチメントスキル", - "skills.notion_crm_description": "連絡先、パイプライン、フォローアップのエンリッチメントワークフローを追加します。", - "skills.notion_crm_card_description": "既製のスキルでNotion CRMデータをエンリッチします。", - "skills.connect_host_to_load": "スキルを読み込むにはOpenWorkサーバーに接続してください。", - "skills.pick_workspace_first": "最初にワークスペースフォルダを選択してください。", - "skills.no_skills_found": "まだスキルが見つかりません。", - "skills.installed_description": "このワークスペースで利用可能なスキル。", - "skills.failed_to_load": "スキルの読み込みに失敗しました", - "skills.plugin_management_host_only": "プラグイン管理にはデスクトップアプリが必要です。", - "skills.plugins_host_only": "プラグインはデスクトップアプリでのみ利用可能です。", - "skills.pick_project_for_plugins": "プロジェクトのプラグインを管理するにはプロジェクトフォルダを選択してください。", - "skills.pick_project_for_active": "アクティブなプラグインを読み込むにはプロジェクトフォルダを選択してください。", - "skills.no_opencode_found": "opencode.jsonがまだ見つかりません。プラグインを追加して作成してください。", - "skills.no_opencode_workspace": "このワークスペースにはまだopencode.jsonがありません。", - "skills.failed_parse_opencode": "opencode.jsonの解析に失敗しました", - "skills.failed_load_opencode": "opencode.jsonの読み込みに失敗しました", - "skills.failed_load_active": "アクティブなプラグインの読み込みに失敗しました。", - "skills.enter_plugin_name": "プラグインパッケージ名を入力してください。", - "skills.plugin_already_listed": "プラグインは既にopencode.jsonに登録されています。", - "skills.failed_update_opencode": "opencode.jsonの更新に失敗しました", - "skills.opackage_install_host_only": "OpenPackageのインストールにはデスクトップアプリが必要です。", - "skills.pick_project_first": "最初にプロジェクトフォルダを選択してください。", - "skills.enter_opackage_source": "OpenPackageソースを入力してください(例: github:anthropics/claude-code)。", - "skills.installing_opackage": "OpenPackageをインストール中…", - "skills.install_complete": "インストール済み", - "skills.curated_list_notice": "これは厳選リストであり、OpenPackageではありません。リンクをコピーするか、予定されているレジストリ検索統合についてPRDをご確認ください。", - "skills.import_host_only": "スキルのインポートにはデスクトップアプリが必要です。", - "skills.select_skill_folder": "スキルフォルダを選択", - "skills.import_failed": "インポートに失敗しました({status})", - "skills.imported": "インポート完了。", - "skills.unknown_error": "不明なエラー", - - // ==================== Plugins ==================== - "plugins.title": "OpenCodeプラグイン", - "plugins.description": "プロジェクトまたはグローバルのOpenCodeプラグイン用のopencode.jsonを管理します。", - "plugins.config_label": "設定", - "plugins.config_not_loaded": "まだ読み込まれていません", - "plugins.suggested_label": "おすすめのプラグイン", - "plugins.no_plugins_yet": "まだプラグインが設定されていません。", - "plugins.enabled_label": "有効", - "plugins.open_label": "開く", - "plugins.path_label": "パス", - "plugins.scope_project": "プロジェクト", - "plugins.scope_global": "グローバル", - "plugins.refresh": "更新", - "plugins.config": "設定", - "plugins.not_loaded": "まだ読み込まれていません", - "plugins.suggested": "おすすめのプラグイン", - "plugins.hide_setup": "セットアップを隠す", - "plugins.setup": "セットアップ", - "plugins.added": "追加済み", - "plugins.add": "追加", - "plugins.enabled": "有効", - "plugins.no_plugins": "まだプラグインが設定されていません。", - "plugins.add_label": "プラグインを追加", - "plugins.placeholder": "opencode-wakatime", - "plugins.add_hint": "npm パッケージ名を追加してください(例: opencode-wakatime)", - - // ==================== Apps (MCP) ==================== - "mcp.apps_title": "アプリ", - "mcp.apps_subtitle": "ツールを接続して、OpenWorkが代わりに操作できるようにしましょう。", - "mcp.app_connected": "アプリ接続済み", - "mcp.apps_connected": "アプリ接続済み", - "mcp.title": "アプリ", - "mcp.description": "ワンクリックでツールを接続。", - "mcp.alpha_banner_title": "アプリは早期アクセス中です。現在改善を進めています。", - "mcp.alpha_banner_help": "協力いただける場合は、PRを作成し、サインインフローの動作を確認できる短い動画を添付してください。", - "mcp.mcps_title": "アプリ", - "mcp.connect_mcp_hint": "アプリを接続してOpenWorkの機能を拡張しましょう。", - "mcp.finish_setup": "もう少しです", - "mcp.finish_setup_hint": "有効化をタップしてアプリの接続を完了してください。", - "mcp.activate_button": "有効化", - "mcp.reload_banner_title": "もう少しです", - "mcp.reload_banner_description": "有効化をタップしてアプリの接続を完了してください。", - "mcp.reload_banner_description_blocked": "タスクが実行中です。先に停止してから有効化してください。", - "mcp.reload_banner_blocked_hint": "実行中のタスクを停止して有効化してください。", - "mcp.available_apps": "利用可能なアプリ", - "mcp.one_click_connect": "ワンクリック接続", - "mcp.tap_to_connect": "タップして接続", - "mcp.connected_badge": "接続済み", - "mcp.your_apps": "接続済みアプリ", - "mcp.last_synced": "同期済み", - "mcp.no_apps_yet": "まだアプリが接続されていません", - "mcp.no_apps_hint": "上のアプリを接続して始めましょう。", - "mcp.quick_connect_title": "利用可能なアプリ", - "mcp.oauth_only_label": "ワンクリック", - "mcp.connected_status": "接続済み", - "mcp.no_env_vars": "追加のセットアップは不要です。", - "mcp.connected_title": "接続済みアプリ", - "mcp.from_opencode_json": "設定ファイルから", - "mcp.no_servers_yet": "まだアプリが接続されていません。", - "mcp.edit_config_title": "設定ファイルを編集", - "mcp.edit_config_description": "アプリはワークスペースの設定ファイルに保存されます。", - "mcp.docs_link": "詳細を見る", - "mcp.scope_project": "このワークスペース", - "mcp.scope_global": "すべてのワークスペース", - "mcp.config_label": "設定", - "mcp.config_file": "設定ファイル", - "mcp.config_not_loaded": "まだ読み込まれていません", - "mcp.open_file_label": "ファイルを開く", - "mcp.reveal_in_finder": "Finderで表示", - "mcp.opening_label": "開いています…", - "mcp.file_not_found": "設定ファイルがまだ作成されていません", - "mcp.config_load_failed": "設定ファイルを読み込めませんでした", - "mcp.open_file": "ファイルを開く", - "mcp.pick_workspace_error": "最初にワークスペースフォルダを選択してください。", - "mcp.reveal_config_failed": "設定ファイルを開けませんでした", - "mcp.alpha_warning": "アプリは早期アクセス中です。現在改善を進めています。", - "mcp.github_issue": "GitHubのissue #9510を見る", - "mcp.contribution_guide": "協力いただける場合は、PRを作成し、サインインフローの動作を確認できる短い動画を添付してください。", - "mcp.advanced_settings": "詳細設定", - "mcp.advanced_settings_hint": "設定ファイルを編集し、接続を手動で管理します。", - "mcp.hide_advanced": "詳細設定を隠す", - "mcp.show_advanced": "詳細設定を表示", - "mcp.mcps_label": "アプリ", - "mcp.mcps_description": "アプリを接続してOpenWorkの機能を拡張しましょう。", - "mcp.configured": "設定済み", - "mcp.updated": "同期済み", - "mcp.reload_required": "有効化が必要です", - "mcp.reload_description": "新しい接続の使用を開始するには有効化してください。", - "mcp.reload_engine": "有効化", - "mcp.quick_connect": "利用可能なアプリ", - "mcp.oauth_only": "ワンクリック", - "mcp.connecting": "接続中…", - "mcp.connect": "接続", - "mcp.connected": "接続済み", - "mcp.connected_label": "接続済み", - "mcp.no_env_required": "追加のセットアップは不要です。", - "mcp.config_source": "設定ファイルから", - "mcp.no_servers": "まだアプリが接続されていません。", - "mcp.advanced": "詳細", - "mcp.advanced_description": "カスタム接続用。", - "mcp.hide": "非表示", - "mcp.show": "表示", - "mcp.server_name": "アプリ名", - "mcp.server_name_placeholder": "github-copilot", - "mcp.server_url": "サーバーURL", - "mcp.server_url_placeholder": "https://api.githubcopilot.com/mcp/", - "mcp.oauth": "サインイン", - "mcp.api_key": "APIキー", - "mcp.enabled": "有効", - "mcp.disabled": "無効", - "mcp.add_mcp": "アプリを追加", - "mcp.verify_connection": "接続テスト", - "mcp.cli_guidance": "ターミナルコマンド(詳細)", - "mcp.config_locations": "設定はopencode.json、opencode.jsonc、または.opencode/opencode.jsonに配置できます。", - "mcp.app_details": "アプリ詳細", - "mcp.details_title": "アプリ詳細", - "mcp.select_app_hint": "アプリを選択して詳細を確認してください。", - "mcp.select_server_hint": "アプリを選択して詳細を確認してください。", - "mcp.connection_type": "接続", - "mcp.type_cloud": "クラウド(アカウントでサインイン)", - "mcp.type_local": "ローカル(このデバイスで実行)", - "mcp.capabilities_label": "機能", - "mcp.cap_tools": "AIツール", - "mcp.cap_signin": "アカウントサインイン", - "mcp.tools_enabled_label": "AIツール", - "mcp.oauth_ready_label": "アカウントサインイン", - "mcp.usage_hint_text": "プロンプトにアプリ名を入力してツールを使用してください。", - "mcp.issue_label": "Issue", - "mcp.technical_details": "技術的な詳細", - "mcp.next_steps_label": "次のステップ", - "mcp.reload_step": "新しいアプリを接続した後に有効化してください。", - "mcp.auth_step": "プロンプトが表示されたらサインインしてください。", - "mcp.connection_failed": "接続の問題 — 再試行してください", - "mcp.needs_auth": "サインインが必要です", - "mcp.register_client": "セットアップが必要です", - "mcp.status_disabled": "一時停止中", - "mcp.disconnected": "オフライン", - "mcp.failed": "問題", - "mcp.friendly_status_ready": "準備完了", - "mcp.friendly_status_needs_signin": "サインインが必要", - "mcp.friendly_status_paused": "一時停止中", - "mcp.friendly_status_offline": "オフライン", - "mcp.friendly_status_issue": "問題", - "mcp.host_mode_only": "アプリにはデスクトップアプリが必要です。", - "mcp.pick_workspace_first": "最初にワークスペースフォルダを選択してください。", - "mcp.desktop_required": "アプリにはデスクトップアプリが必要です。", - "mcp.connect_server_first": "先にサーバーに接続してください。", - "mcp.reload_required_after_add": "新しいアプリの使用を開始するには有効化してください。", - "mcp.connect_failed": "接続できませんでした。再試行してください。", - "mcp.enter_name_and_url": "アプリ名とURLを入力してください。", - "mcp.enter_url_first": "最初にURLを入力してください。", - "mcp.use_debug_command": "トラブルシューティングには opencode mcp debug を実行してください。", - "mcp.add_failed": "アプリを追加できませんでした。", - "mcp.remove_app": "削除", - "mcp.remove_failed": "アプリを削除できませんでした。", - "mcp.remove_modal_title": "アプリを削除", - "mcp.remove_modal_message": "{server} を削除してもよろしいですか?後で再度追加できます。", - - // Add MCP Modal - "mcp.add_modal_title": "カスタムアプリを追加", - "mcp.add_modal_subtitle": "URLまたはローカルコマンドでカスタムMCPサーバーを接続します。", - "mcp.custom_app_cta_hint": "独自のMCPサーバー、社内ツール、またはホスト型アプリを接続します。", - "mcp.server_type": "タイプ", - "mcp.type_remote": "リモート(URL)", - "mcp.type_local_cmd": "ローカル(コマンド)", - "mcp.server_command": "コマンド", - "mcp.server_command_placeholder": "npx -y @modelcontextprotocol/server-sequential-thinking", - "mcp.server_command_hint": "サーバーを起動するシェルコマンド。", - "mcp.sign_in_section_label": "サインイン", - "mcp.oauth_optional_label": "このアプリはサインインが必要です", - "mcp.oauth_optional_hint": "ブラウザでOAuthを使ってアカウントに接続します。", - "mcp.remote_workspace_url_hint": "リモートワーカーはURLベースのMCPサーバーとの接続が最も速いです。", - "mcp.add_server_button": "アプリを追加", - "mcp.name_required": "サーバー名を入力してください。", - "mcp.url_or_command_required": "リモートの場合はURL、ローカルの場合はコマンドを入力してください。", - - "mcp.logout_label": "OAuth", - "mcp.logout_action": "ログアウト", - "mcp.logout_working": "ログアウト中…", - "mcp.logout_hint": "保存されたOAuth認証情報を削除します。再度サインインが必要になります。", - "mcp.login_action": "サインイン", - "mcp.login_hint": "アカウントを接続してこのアプリのセットアップを完了してください。", - "mcp.login_unavailable": "このアプリはOpenWorkからのサインインに対応していません。", - "mcp.logout_modal_title": "このアプリからログアウトしますか?", - "mcp.logout_modal_message": "{server} の保存されたOAuth認証情報が削除されます。このアプリを使用するには再度サインインが必要です。", - "mcp.logout_success": "{server} からログアウトしました。", - "mcp.logout_failed": "ログアウトに失敗しました。", - - // MCP Auth Modal - "mcp.auth.open_browser_signin": "ブラウザを開いてサインインを完了します。", - "mcp.auth.connect_server": "{server} に接続", - "mcp.auth.already_connected": "既に接続済み", - "mcp.auth.already_connected_description": "{server} は既に認証済みで、使用する準備ができています。", - "mcp.auth.configured_previously": "MCPはグローバルまたは前のセッションで設定されている可能性があります。この画面を閉じて、すぐにMCPツールの使用を開始できます。", - "mcp.auth.reload_engine_retry": "変更を適用して再試行", - "mcp.auth.retry_now": "今すぐ再試行", - "mcp.auth.retry": "再試行", - "mcp.auth.reload_failed": "サインイン前にワーカーのリロードに失敗しました。", - "mcp.auth.applying_changes_title": "サインイン前に変更を適用中", - "mcp.auth.applying_changes_body": "新しいMCPが認証できるようにワーカーを再起動しています。", - "mcp.auth.waiting_for_conversation_title": "会話の完了を待っています", - "mcp.auth.waiting_for_conversation_body": "できるだけ早く認証画面にリダイレクトします。", - "mcp.auth.waiting_for_session": "{session} の作業完了を待っています", - "mcp.auth.force_stop": "強制停止", - "mcp.auth.force_stopping": "停止中…", - "mcp.auth.reload_before_oauth": "OAuthを開始する前にエンジンをリロードしてこのMCPのセットアップを完了してください。", - "mcp.auth.reload_notice": "この変更を反映するには、OpenWorkがワーカーサービスを更新する必要があります。実行中のセッションが中断される可能性があります。", - "mcp.auth.reload_blocked": "セッション実行中はリロードが一時停止されます。セットアップを完了するには実行を停止してください。", - "mcp.auth.reload_remote_confirm": "この変更を反映するには、OpenWorkがワーカーサービスを更新する必要があります。実行中のセッションが停止する可能性があります。続行しますか?", - "mcp.auth.reload_needed": "エンジンをリロードしてセットアップを完了し、再度接続を試みてください。", - "mcp.auth.manual_finish_title": "リモートサーバーですか?", - "mcp.auth.manual_finish_hint": "コールバックURL(localhost:19876)またはコードだけを貼り付けて接続を完了してください。", - "mcp.auth.callback_label": "コールバックURLまたはコード", - "mcp.auth.callback_placeholder": "http://127.0.0.1:19876/mcp/oauth/callback?code=...", - "mcp.auth.complete_connection": "接続を完了", - "mcp.auth.callback_invalid": "OAuthを完了するにはコールバックURLまたはcodeパラメータを貼り付けてください。", - "mcp.auth.port_forward_hint": "ヒント: 必要に応じてコールバックポートを転送してください: ssh -L 19876:127.0.0.1:19876 user@host", - "mcp.auth.step1_title": "ブラウザを開いています", - "mcp.auth.step1_description": "{server} のサインインフローを自動的に起動します。", - "mcp.auth.step2_title": "OpenWorkを承認", - "mcp.auth.step2_description": "サインインしてプロンプトが表示されたらアクセスを承認してください。", - "mcp.auth.step3_title": "完了したらここに戻ってください", - "mcp.auth.step3_description": "承認が完了次第、接続を完了します。", - "mcp.auth.waiting_authorization": "ブラウザでの承認完了を待っています…", - "mcp.auth.follow_browser_steps": "ブラウザで承認手順に従ってください。", - "mcp.auth.reopen_browser_link": "ここをクリックしてブラウザを再度開く", - "mcp.auth.done": "完了", - "mcp.auth.cancel": "キャンセル", - "mcp.auth.im_done": "完了しました", - "mcp.auth.client_registration_required": "OAuthを続行する前にクライアント登録が必要です。", - "mcp.auth.server_disabled": "このMCPサーバーは無効です。有効にしてから再試行してください。", - "mcp.auth.oauth_failed": "OAuth認証に失敗しました。", - "mcp.auth.invalid_refresh_token": "OAuthリフレッシュトークンが無効または期限切れです。続行するには再承認してください。", - "mcp.auth.reauth_action": "OAuthを再承認", - "mcp.auth.reauth_running": "再承認中…", - "mcp.auth.reauth_failed": "再承認に失敗しました。", - "mcp.auth.reauth_cli_hint": "実行: opencode mcp auth {server}", - "mcp.auth.reauth_remote_hint": "このワーカーを実行しているマシンから再承認してください。", - "mcp.auth.authorization_still_required": "承認がまだ必要です。フローを再開するには再試行してください。", - "mcp.auth.oauth_not_supported_hint": "考えられる原因:\n• MCPサーバーがOAuth機能を公開していません\n• エンジンをリロードしてサーバー機能を検出する必要があります\n• 試してみてください: opencode mcp auth {server}(CLIから)", - "mcp.auth.try_reload_engine": "{message}。まずエンジンのリロードを試してください。", - "mcp.auth.failed_to_start_oauth": "OAuthフローの開始に失敗しました", - "mcp.auth.oauth_completed_reload": "OAuthが完了しました。MCPを有効化するにはエンジンをリロードしてください。", - - // ==================== Settings ==================== - "settings.title": "設定", - "settings.connection": "接続", - "settings.engine_source": "エンジンソース", - "settings.from_path": "PATHから", - "settings.from_sidecar": "バンドルされたサイドカー", - "settings.engine_source_description": "PATHはインストール済みのOpenCodeを使用します(デフォルト)。サイドカーは利用可能な場合にバンドルされたバイナリを使用します。", - "settings.sidecar_unsupported": "サイドカーはWindowsで利用可能です", - "settings.sidecar_unavailable_detail": "サイドカーは利用可能な場合にバンドルされます。", - "settings.model": "モデル", - "settings.model_description": "実行のデフォルトとシンキング設定。", - "settings.change": "変更", - "settings.engine_path": "PATH", - "settings.engine_sidecar": "サイドカー", - "settings.thinking": "シンキング", - "settings.thinking_description": "シンキングの内容を表示(デベロッパーモードのみ)。", - "settings.on": "オン", - "settings.off": "オフ", - "settings.model_variant": "モデルバリアント", - "settings.edit": "編集", - "settings.default_model": "デフォルトモデル", - "settings.session_model": "モデル", - "settings.model_description_default": "設定済みのプロバイダーから選択してください。この選択は新しいセッションに使用されます。", - "settings.model_description_session": "設定済みのプロバイダーから選択してください。この選択は次のメッセージに適用されます。", - "settings.search_models": "モデルを検索…", - "settings.showing_models": "{total}件中{count}件を表示", - "settings.model_variant_prompt": "モデルバリアント(プロバイダー固有、例: high/max/minimal)。クリアするには空白のままにしてください。", - "settings.model_fallback": "フォールバック", - "settings.model_default": "デフォルト", - "settings.model_free": "無料", - "settings.model_reasoning": "推論", - "settings.done": "完了", - "settings.updates": "アップデート", - "settings.updates_description": "OpenWorkを最新の状態に保ちます。", - "settings.automatic_checks": "自動チェック", - "settings.automatic_checks_description": "1日1回(サイレント)", - "settings.update_checking": "確認中…", - "settings.update_available": "アップデート利用可能: v", - "settings.update_downloading": "ダウンロード中…", - "settings.update_ready": "インストール準備完了: v", - "settings.update_error": "アップデートの確認に失敗しました", - "settings.update_uptodate": "最新です", - "settings.last_checked": "最終確認", - "settings.published": "公開日", - "settings.check_update": "確認", - "settings.install_restart": "インストールして再起動", - "settings.update_not_supported": "この環境ではアップデートはサポートされていません。", - "settings.update_desktop_only": "アップデートはデスクトップアプリでのみ利用可能です。", - "settings.startup": "起動", - "settings.mode_label": "モード", - "settings.switch_mode": "切り替え", - "settings.reset_startup": "デフォルト起動モードをリセット", - "settings.reset_startup_description": "保存された設定をクリアし、次回起動時にモード選択を表示します。", - "settings.advanced": "詳細設定", - "settings.advanced_description": "初期設定をやり直すためにOpenWorkのローカル状態をリセットします。", - "settings.reset_onboarding": "オンボーディングをリセット", - "settings.reset_onboarding_description": "OpenWorkの設定をクリアしてアプリを再起動します。", - "settings.reset_app_data": "アプリデータをリセット", - "settings.reset_app_data_description": "より強力なリセット。OpenWorkのキャッシュとアプリデータをクリアします。", - "settings.reset": "リセット", - "settings.requires_typing": "入力が必要です", - "settings.will_restart": "アプリが再起動されます。", - "settings.reset_onboarding_title": "オンボーディングをリセット", - "settings.reset_app_data_title": "アプリデータをリセット", - "settings.reset_confirmation_hint": "確認のため RESET と入力してください。OpenWorkが再起動されます。", - "settings.reset_onboarding_warning": "OpenWorkのローカル設定とワークスペースのオンボーディングマーカーをクリアします。", - "settings.reset_app_data_warning": "このデバイスのOpenWorkキャッシュとアプリデータをクリアします。", - "settings.reset_stop_active_runs": "リセットする前にアクティブな実行を停止してください。", - "settings.reset_confirmation_label": "確認", - "settings.reset_confirmation_placeholder": "RESETと入力", - "settings.reset_cancel": "キャンセル", - "settings.reset_confirm_button": "リセットして再起動", - "settings.developer": "デベロッパー", - "settings.opencode_cache": "OpenCodeキャッシュ", - "settings.opencode_cache_description": "エンジンの起動に使用されるキャッシュデータを修復します。安全に実行できます。", - "settings.repair_cache": "キャッシュを修復", - "settings.repairing_cache": "キャッシュ修復中", - "settings.cache_repair_requires_desktop": "キャッシュの修復にはデスクトップアプリが必要です", - "settings.pending_permissions": "保留中の権限", - "settings.recent_events": "最近のイベント", - "settings.notion_connected": "接続済み", - "settings.reload_required": "リロードが必要です", - "settings.connection_failed": "接続に失敗しました", - "settings.notion_not_connected": "未接続", - "settings.show_thinking": "シンキングを表示", - "settings.update": "アップデート", - "settings.about": "情報", - "settings.version": "バージョン", - "settings.check_for_updates": "アップデートを確認", - "settings.download_update": "アップデートをダウンロード", - "settings.install_update": "アップデートをインストールして再起動", - "settings.enable_developer_mode": "デベロッパーモードを有効化", - "settings.disable_developer_mode": "デベロッパーモードを無効化", - "settings.stop_engine": "エンジンを停止", - "settings.disconnect": "切断", - "settings.language": "言語", - "settings.language.description": "使用する言語を選択してください", - "settings.connection_title": "接続", - "settings.engine_source_label": "エンジンソース", - "settings.engine_source_hint": "PATHはインストール済みのOpenCodeを使用します(デフォルト)。サイドカーは利用可能な場合にバンドルされたバイナリを使用します。", - "settings.sidecar_unavailable": "サイドカーは利用可能な場合にバンドルされます。", - "settings.model_title": "モデル", - "settings.model_hint": "実行のデフォルトとシンキング設定。", - "settings.thinking_label": "シンキング", - "settings.thinking_hint": "シンキングの内容を表示(デベロッパーモードのみ)。", - "settings.model_variant_label": "モデルバリアント", - "settings.appearance_title": "外観", - "settings.appearance_hint": "システムに合わせるか、ライト/ダークモードを強制します。", - "settings.theme_system": "システム", - "settings.theme_light": "ライト", - "settings.theme_dark": "ダーク", - "settings.theme_system_hint": "システムモードはOSの設定に自動的に従います。", - "settings.updates_title": "アップデート", - "settings.updates_hint": "OpenWorkを最新の状態に保ちます。", - "settings.automatic_checks_label": "自動チェック", - "settings.automatic_checks_hint": "1日1回(サイレント)", - "settings.last_checked_time": "最終確認 {time}", - "settings.published_date": "公開日 {date}", - "settings.update_not_supported_hint": "この環境ではアップデートはサポートされていません。", - "settings.update_desktop_only_hint": "アップデートはデスクトップアプリでのみ利用可能です。", - "settings.startup_title": "起動", - "settings.mode_suffix": "モード", - "settings.reset_startup_label": "デフォルト起動モードをリセット", - "settings.reset_startup_hint": "保存された設定をクリアし、次回起動時にモード選択を表示します。", - "settings.advanced_title": "詳細設定", - "settings.advanced_hint": "初期設定をやり直すためにOpenWorkのローカル状態をリセットします。", - "settings.reset_onboarding_label": "オンボーディングをリセット", - "settings.reset_onboarding_hint": "OpenWorkの設定をクリアしてアプリを再起動します。", - "settings.reset_app_data_label": "アプリデータをリセット", - "settings.reset_app_data_hint": "より強力なリセット。OpenWorkのキャッシュとアプリデータをクリアします。", - "settings.reset_requires_hint": "RESETの入力が必要で、アプリが再起動されます。", - "settings.developer_title": "デベロッパー", - "settings.opencode_cache_label": "OpenCodeキャッシュ", - "settings.opencode_cache_hint": "エンジンの起動に使用されるキャッシュデータを修復します。安全に実行できます。", - "settings.pending_permissions_label": "保留中の権限", - "settings.recent_events_label": "最近のイベント", - "settings.stop_active_runs_hint": "アップデートするにはアクティブな実行を停止してください", - "settings.stop_active_runs_reset_hint": "リセットするにはアクティブな実行を停止してください", - "settings.stop_runs_to_update": "アップデートするにはアクティブな実行を停止してください", - "settings.stop_runs_to_reset": "リセットするにはアクティブな実行を停止してください", - "settings.updates_not_supported": "この環境ではアップデートはサポートされていません。", - "settings.updates_desktop_only": "アップデートはデスクトップアプリでのみ利用可能です。", - - // ==================== Reload ==================== - "reload.toast_title": "アップデートがあります", - "reload.toast_description": "設定変更を適用するにはワークスペースをリロードしてください。", - "reload.toast_warning": "すべてのアクティブなタスクが停止されます。", - "reload.toast_warning_active": "リロードすると{count}件のアクティブなタスクが停止されます。", - "reload.toast_reload": "リロード", - "reload.toast_reload_stopped": "リロードしてタスクを停止", - "reload.toast_reloading": "リロード中…", - "reload.toast_dismiss": "後で", - "reload.toast_blocked_host": "リロードはローカルワークスペースでのみ利用可能です。", - "reload.toast_blocked_connect": "リロードするにはこのワークスペースに接続してください。", - "reload.toast_blocked_runs": "リロード前にアクティブなタスクの完了を待っています。", - - // ==================== Onboarding ==================== - "onboarding.starting_host": "OpenWorkサーバーを起動中…", - "onboarding.searching_host": "OpenWorkサーバーに接続中…", - "onboarding.getting_ready": "準備しています", - "onboarding.verifying": "安全な接続を確認中", - "onboarding.create_first_workspace": "最初のワークスペースを作成", - "onboarding.create_workspace": "ワークスペースを作成", - "onboarding.workspace_description": "フォルダとプリセットを選んでワークスペースを準備しましょう。", - "onboarding.start": "OpenWorkを開始", - "onboarding.back": "戻る", - "onboarding.advanced_settings": "詳細設定", - "onboarding.opencode_engine": "OpenCodeエンジン", - "onboarding.refresh": "更新", - "onboarding.checking_cli": "OpenCode CLIを確認中…", - "onboarding.cli_not_found": "OpenCode CLIが見つかりません。", - "onboarding.cli_needs_update": "OpenCode CLIのserve対応にはアップデートが必要です。", - "onboarding.opencode": "OpenCode", - "onboarding.cli_ready": "OpenCode CLI準備完了。", - "onboarding.cli_version": "OpenCode {version}", - "onboarding.windows_install_instruction": "Windows版OpenCodeをインストールしてからOpenWorkを再起動してください。opencode.exeがPATHにあることを確認してください。", - "onboarding.install_instruction": "ローカルサーバーを有効にするにはOpenCodeをインストールしてください(ターミナル不要)。", - "onboarding.install": "OpenCodeをインストール", - "onboarding.recheck": "再確認", - "onboarding.ready_message": "OpenCodeはローカルサーバーを起動する準備ができています。", - "onboarding.resolved_path": "解決されたパス", - "onboarding.version": "バージョン", - "onboarding.search_notes": "メモを検索", - "onboarding.serve_help": "serve --helpの出力", - "onboarding.workspace_folder_label": "ワークスペースは独自のスキル、プラグイン、コマンドを持つフォルダです。", - "onboarding.theme_label": "テーマ", - "onboarding.theme_current": "現在: {mode}", - "onboarding.theme_system": "システム", - "onboarding.theme_light": "ライト", - "onboarding.theme_dark": "ダーク", - "onboarding.access_label": "アクセス", - "onboarding.folders_allowed": "{count}個のフォルダが許可済み", - "onboarding.manage_access_hint": "アクセスは詳細設定で管理できます。", - "onboarding.open_settings_hint": "エンジンやアクセスのオプションが必要ですか?設定を開いてください。", - "onboarding.open_settings": "設定を開く", - "onboarding.add_folder_path": "フォルダパスを追加", - "onboarding.pick": "選択", - "onboarding.add": "追加", - "onboarding.remove": "削除", - "onboarding.cli_label": "OpenCode CLI", - "onboarding.cli_checking": "インストールを確認中…", - "onboarding.cli_not_found_hint": "見つかりません。ローカルサーバーの実行にはインストールが必要です。", - "onboarding.cli_version_installed": "インストール済み", - "onboarding.cli_recheck": "再確認", - "onboarding.cli_install_commands": "以下のコマンドでOpenCodeをインストールしてからOpenWorkを再起動してください。", - "onboarding.show_search_notes": "検索メモを表示", - "onboarding.last_checked": "最終確認 {time}", - "onboarding.server_url_placeholder": "http://localhost:8088", - "onboarding.directory_placeholder": "my-project", - "onboarding.connect_host": "サーバーに接続", - "onboarding.connect_description": "既存のOpenCodeサーバー(LANまたはトンネル)に接続します。", - "onboarding.server_url": "サーバーURL", - "onboarding.directory": "ディレクトリ(任意)", - "onboarding.directory_hint": "サーバーが複数のワーカーを実行している場合に使用してください。", - "onboarding.connect": "接続", - "onboarding.remote_workspace_title": "OpenWorkサーバーに接続", - "onboarding.remote_workspace_description": "OpenWorkサーバーに接続して、どこからでもワークスペースにアクセスできます。", - "onboarding.remote_workspace_action": "接続", - "onboarding.remote_workspace_card_title": "リモートワークスペースに接続", - "onboarding.remote_workspace_card_description": "OpenWorkサーバーに接続して共有ワークスペースにアクセスします。", - "onboarding.advanced_openwork_host": "OpenWorkサーバー", - "onboarding.advanced_openwork_hint": "共有アクセス用にサーバーURLとアクセストークンを使用します。", - "onboarding.advanced_opencode_direct": "詳細: OpenCodeダイレクト", - "onboarding.advanced_opencode_hint": "サーバーが利用できない場合にOpenCodeエンジンに直接接続します。", - "onboarding.welcome_title": "今日のOpenWorkの使い方は?", - "onboarding.run_local": "ローカルで実行", - "onboarding.run_local_description": "OpenWorkはOpenCodeをローカルで実行し、作業をプライベートに保ちます。", - "onboarding.engine_running": "エンジンは既に実行中です", - "onboarding.attach_description": "このデバイスの既存セッションにアタッチします。", - "onboarding.attach": "アタッチ", - "onboarding.remember_choice": "次回のためにこの選択を記憶する", - "onboarding.client_mode": "クライアントとして接続(リモートペアリング)", - "onboarding.default_workspace_path": "~/OpenWork/Worker", - "onboarding.authorize_folder": "フォルダを承認", - "onboarding.choose_workspace_folder": "ワークスペースフォルダを選択", - - // ==================== Common ==================== - "common.alpha": "アルファ", - "common.change": "変更", - "common.refresh": "更新", - "common.new": "新規", - "common.install": "インストール", - "common.delete": "削除", - "common.edit": "編集", - "common.save": "保存", - "common.cancel": "キャンセル", - "common.close": "閉じる", - "common.open": "開く", - "common.show": "表示", - "common.hide": "隠す", - "common.path": "パス", - "common.choose": "選択", - "common.retry": "再試行", - "common.untitled": "無題", - "common.default_parens": "(デフォルト)", - "common.on": "オン", - "common.off": "オフ", - - // ==================== Status ==================== - "status.connected": "接続済み", - "status.disconnected": "切断済み", - "status.idle": "アイドル", - "status.busy": "ビジー", - "status.running": "実行中", - "status.live": "ライブ", - "status.connecting": "接続中", - "status.creating_workspace": "ワークスペースを作成中", - "status.deleting_command": "コマンドを削除中", - "status.saving_workspace_command": "ワークスペースコマンドを保存中", - "status.saving_command": "コマンドを保存中", - "status.loading_session": "セッションを読み込み中", - "status.creating_task": "新しいタスクを作成中", - "status.starting_engine": "エンジンを起動中", - "status.reloading_engine": "エンジンをリロード中", - "status.restarting_engine": "エンジンを再起動中", - "status.installing_opencode": "OpenCodeをインストール中", - "status.disconnecting": "切断中", - - // ==================== Workspace Switching ==================== - "workspace.switching_title": "{name} を開いています", - "workspace.switching_title_unknown": "ワークスペースを開いています", - "workspace.switching_subtitle": "最近の作業をすぐにお見せします。", - "workspace.switching_status_preparing": "準備しています", - "workspace.switching_status_connecting": "接続を確認中", - "workspace.switching_status_loading": "最近のタスクを読み込み中", - "workspace.switching_status_almost": "もう少しです", - + "app.compact_command_desc": "このセッションを要約してコンテキストサイズを削減します。", "app.connection_lost": "サーバーとの接続が失われました。リロードしてください。", - "app.unknown_error": "不明なエラー", - "app.error.tauri_required": "この操作にはTauriアプリランタイムが必要です。", + "app.deep_link_auth_queued": "OpenWorkのCloud認証ディープリンクをキューに追加しました。", + "app.deep_link_remote_queued": "リモートワーカーのリンクをキューに追加しました。OpenWorkが接続フローに移行します。", "app.error.choose_folder": "続行するにはフォルダを選択してください。", - "app.error.pick_workspace_folder": "最初にワークスペースフォルダを選択してください。", - "app.error.remote_base_url_required": "続行するにはサーバーURLを追加してください。", "app.error.host_requires_local": "エンジンを起動するにはローカルワークスペースを選択してください。", - "app.error.sidecar_unsupported_windows": "サイドカーOpenCodeは利用可能な場合にWindowsにバンドルされます。PATHにフォールバックします。", "app.error.install_failed": "OpenCodeのインストールに失敗しました。上のログをご確認ください。", - "app.error.command_name_template_required": "コマンド名と手順が必要です。", - "app.error.workspace_commands_desktop": "コマンドにはデスクトップアプリが必要です。", - "app.error.command_scope_unknown": "このモードではこのコマンドを管理できません。", - - // ==================== App top-level ==================== - "app.compact_command_desc": "このセッションを要約してコンテキストサイズを削減します。", - "app.deep_link_auth_queued": "OpenWorkのCloud認証ディープリンクをキューに追加しました。", - "app.deep_link_remote_queued": "リモートワーカーのリンクをキューに追加しました。OpenWorkが接続フローに移行します。", + "app.error.pick_workspace_folder": "最初にワークスペースフォルダを選択してください。", + "app.error.remote_base_url_required": "続行するにはサーバーURLを追加してください。", + "app.error.tauri_required": "この操作にはTauriアプリランタイムが必要です。", "app.error_audit_load": "監査ログの読み込みに失敗しました。", "app.error_auth_failed": "認証に失敗しました", "app.error_auto_compact_scope": "自動コンテキスト圧縮は、ローカルワークスペースまたは書き込み可能なOpenWorkサーバーワークスペースでのみ変更できます。", @@ -919,21 +55,74 @@ export default { "app.skills_hint_disconnected": "OpenWorkサーバーに接続できません。スキルを管理するには詳細設定でサーバーURL/トークンを追加してください。", "app.skills_hint_limited": "OpenWorkサーバーでスキルのインストール/更新を行うにはホストトークンが必要です。詳細設定で追加して再接続してください。", "app.skills_hint_readonly": "OpenWorkサーバーのスキルは読み取り専用です。インストールを有効にするには詳細設定でホストトークンを追加してください。", + "app.unknown_error": "不明なエラー", "app.worker_fallback": "ワーカー", - - // ==================== Common extras ==================== + "automations.desktop_required": "スケジュール済みタスクにはデスクトップアプリが必要です。", + "automations.failed_to_load": "スケジュール済みタスクの読み込みに失敗しました。", + "automations.prompt_empty": "オートメーションプロンプトが空です。", + "automations.prompt_required": "プロンプトが必要です。", + "automations.schedule_required": "スケジュールが必要です。", + "automations.server_needs_token": "スケジュール済みタスクを読み込むにはOpenWorkサーバーのトークンが必要です。", + "automations.server_not_ready": "OpenWorkサーバーの準備ができていません。", + "automations.server_unavailable": "OpenWorkサーバーが利用できません。スケジュール済みタスクを同期するには接続してください。", + "blueprint.automation_body": "再利用可能なワークフローから始めるか、下にタスクを入力してください。", + "blueprint.automation_title": "何を自動化しますか?", + "blueprint.csv_session_assistant": "CSVファイルの生成、クリーンアップ、マージ、集計のお手伝いができます。どんなCSV作業を自動化しますか?", + "blueprint.csv_session_title": "CSVワークフローのアイデア", + "blueprint.csv_session_user": "複数のツールからのエクスポートを1つのきれいなCSVにまとめたいです。", + "blueprint.empty_body": "テンプレートを選ぶか、下に入力してください。", + "blueprint.empty_title": "何をしましょうか?", + "blueprint.minimal_body": "このワークスペースについて質問するか、スタータープロンプトを使ってください。", + "blueprint.minimal_title": "タスクから始める", + "blueprint.starter_blueprint_desc": "スキル、コマンド、ハンドオフステップを含む再利用可能なワークフローを設計します。", + "blueprint.starter_blueprint_prompt": "このワークスペースの再利用可能なオートメーション設計図の作成を手伝ってください。何を標準化すべきか聞いてから、ワークフローを提案してください。", + "blueprint.starter_blueprint_title": "オートメーション設計図を作成", + "blueprint.starter_chrome_desc": "ブラウザ自動化のセッションをすぐに開始します。", + "blueprint.starter_chrome_prompt": "Chromeに接続して、繰り返しのタスクを自動化するのを手伝ってください。", + "blueprint.starter_chrome_title": "Chromeを自動化", + "blueprint.starter_command_desc": "繰り返しのワークフローをこのワークスペースのスラッシュコマンドに変換します。", + "blueprint.starter_command_prompt": "このワークスペースで再利用可能な/コマンドの作成を手伝ってください。自動化したいワークフローを聞いてから、コマンドを作成してください。", + "blueprint.starter_command_title": "再利用可能なコマンドを作成", + "blueprint.starter_connect_openai_desc": "OpenAIプロバイダーを追加して、新しいセッションでChatGPTモデルをすぐに使えるようにします。", + "blueprint.starter_connect_openai_title": "ChatGPTに接続", + "blueprint.starter_csv_desc": "スプレッドシートデータのクリーンアップや生成。", + "blueprint.starter_csv_prompt": "このコンピュータでCSVファイルの作成や編集を手伝ってください。", + "blueprint.starter_csv_title": "CSVを操作", + "blueprint.starter_explore_desc": "ファイルを要約し、最初に取り組むべきタスクを提案します。", + "blueprint.starter_explore_prompt": "このワークスペースを要約し、最も重要なファイルを指摘し、最初に取り組むべきタスクを提案してください。", + "blueprint.starter_explore_title": "このワークスペースを探索", + "blueprint.welcome_message": "OpenWorkへようこそ!\n\nCSVファイルの作成、Chromeの自動化、Notionへの連絡先同期など、さまざまな作業に使われています。\n\n可能性は無限大です。\n\n何をしましょうか?", + "blueprint.welcome_title": "OpenWorkへようこそ", "common.add": "追加", - "common.copied": "コピー済み", - "common.copy": "コピー", + "common.cancel": "キャンセル", + "common.choose": "選択", + "common.close": "閉じる", + "common.default_parens": "(デフォルト)", "common.done": "完了", + "common.edit": "編集", + "common.hide": "隠す", + "common.install": "インストール", + "common.navigate": "移動", + "common.next": "次へ", + "common.off": "オフ", + "common.on": "オン", + "common.path": "パス", + "common.question": "質問", + "common.refresh": "更新", + "common.remove": "削除", "common.reset": "リセット", + "common.retry": "再試行", + "common.save": "保存", + "common.select": "選択", + "common.show": "表示", + "common.something_went_wrong": "エラーが発生しました", + "common.submit": "送信", "common.unknown": "不明", - - // ==================== Composer ==================== "composer.agent_label": "エージェント", "composer.attach_files": "ファイルを添付", "composer.attachments_unavailable": "添付ファイルは利用できません。", "composer.behavior_label": "動作", + "composer.configure": "設定", "composer.default_agent": "デフォルトエージェント", "composer.expand_pasted": "クリックで貼り付けたテキストを展開", "composer.failed_read_attachment": "添付ファイルの読み込みに失敗しました", @@ -944,25 +133,100 @@ export default { "composer.inserted_links_unsupported": "未対応ファイルのリンクを挿入しました。", "composer.loading_agents": "エージェントを読み込み中…", "composer.loading_commands": "コマンドを読み込み中…", - "composer.no_commands": "コマンドが見つかりません。", - "composer.configure": "設定", - "composer.tools_label": "コマンド、スキル、MCP", "composer.mcps_label": "MCP", + "composer.no_commands": "コマンドが見つかりません。", "composer.no_matches": "一致するものが見つかりません。", "composer.placeholder": "タスクを入力してください…", "composer.remote_worker_paste_warning": "これはリモートワーカーです。サンドボックスもリモートです。ファイルを共有するには、サイドバーの共有フォルダにアップロードしてください。", "composer.run_task": "タスクを実行", "composer.skill_source": "スキル", "composer.stop": "停止", + "composer.tools_label": "コマンド、スキル、MCP", "composer.unsupported_attachment_type": "未対応の添付ファイル形式です。", "composer.upload_failed_local_links": "共有フォルダにアップロードできませんでした。代わりにローカルリンクを挿入しました。", "composer.upload_to_shared_folder": "共有フォルダにアップロード", "composer.uploaded_multiple_files": "{count}件のファイルを共有フォルダにアップロードし、リンクを挿入しました。", "composer.uploaded_single_file": "{name}を共有フォルダにアップロードし、リンクを挿入しました。", - - // ==================== Context Panel ==================== + "config.auto_reload_desc": "エージェント/スキル/コマンド/設定の変更後に自動リロードします(アイドル時のみ)。", + "config.auto_reload_title": "自動リロード(ローカル)", + "config.auto_reload_unavailable": "デスクトップアプリのローカルワークスペースで利用可能です。", + "config.collaborator_token_disabled_hint": "リモート共有用に事前保存されていますが、リモートアクセスは現在無効です。", + "config.collaborator_token_label": "コラボレータートークン", + "config.collaborator_token_remote_hint": "スマートフォンやノートPCからこのサーバーに接続する通常のリモートアクセス用。", + "config.connection_failed": "接続に失敗しました。", + "config.connection_failed_check": "接続に失敗しました。ホストURLとトークンを確認してください。", + "config.connection_status_updated": "接続ステータスを更新しました。", + "config.connection_successful": "接続に成功しました。", + "config.copied": "コピー済み", + "config.copy": "コピー", + "config.desktop_only_hint": "一部の設定機能(ローカルサーバー共有やメッセージングブリッジ)にはデスクトップアプリが必要です。", + "config.diagnostics_desc": "サニタイズされたランタイム状態をデバッグ用にコピーします。", + "config.diagnostics_title": "診断バンドル", + "config.enable_auto_reload_first": "先に自動リロードを有効にしてください", + "config.engine_reload_desc": "このワークスペースのOpenCodeサーバーを再起動します。", + "config.engine_reload_title": "エンジンリロード", + "config.host_admin_token_hint": "承認CLIおよび管理APIのためのホスト専用内部トークンです。リモートアプリ接続フローには使用しないでください。", + "config.host_admin_token_label": "ホスト管理トークン", + "config.host_local_only": "ローカルのみ", + "config.host_offline": "オフライン", + "config.host_remote_enabled": "リモート有効", + "config.local_ip_hint": "同じWi-Fiでは、ローカルIPを使うと最も高速に接続できます。", + "config.mdns_hint": ".localの名前は覚えやすいですが、一部のネットワークでは解決できない場合があります。", + "config.messaging_identities_desc": "Telegram/Slackのアイデンティティとルーティングはアイデンティティタブで管理できます。", + "config.messaging_identities_title": "メッセージングアイデンティティ", + "config.not_set": "未設定", + "config.owner_token_disabled_hint": "このワーカーのリモートアクセスを有効にした後にのみ関連します。", + "config.owner_token_label": "オーナートークン", + "config.owner_token_remote_hint": "リモートクライアントが許可プロンプトへの応答やオーナー専用操作が必要な場合に使用します。", + "config.reload_active_tasks_warning": "リロードするとアクティブなタスクが停止します。", + "config.reload_availability_hint": "リロードはローカルワーカーまたは接続済みOpenWorkサーバーでのみ利用可能です。", + "config.reload_connect_hint": "リロードするにはこのワーカーに接続してください。", + "config.reload_engine": "エンジンをリロード", + "config.reload_now_desc": "設定の更新を適用し、セッションを再接続します。", + "config.reload_now_title": "今すぐリロード", + "config.reloading": "リロード中…", + "config.remote_access_off_hint": "リモートアクセスはオフです。別のマシンから接続する場合は、先にワークスペースの共有を有効にしてください。", + "config.resolved_worker_url": "解決済みワーカーURL:", + "config.resume_sessions_desc": "タスク実行中にリロードがキューされた場合、リロード後にリジュームメッセージを送信します。", + "config.resume_sessions_title": "自動リロード後にセッションを再開", + "config.server_needed_hint": "スキル、プラグイン、コマンドを同期するにはOpenWorkサーバー接続が必要です。", + "config.server_section_desc": "OpenWorkサーバーに接続します。サーバー管理者から共有されたURLとコラボレーターまたはオーナートークンを使用してください。", + "config.server_section_title": "OpenWorkサーバー", + "config.server_sharing_desc": "信頼できるデバイスとこれらの詳細を共有してください。最速のセットアップには同じネットワーク上のサーバーを使用してください。", + "config.server_sharing_menu_hint": "ワークスペースごとの共有リンクは、ワークスペースメニューの「共有…」から利用できます。", + "config.server_sharing_title": "OpenWorkサーバー共有", + "config.server_url_hint": "OpenWorkサーバーから共有されたURLを使用してください。ローカルデスクトップワーカーは48000〜51000の範囲の永続ハイポートを再利用します。", + "config.server_url_input_label": "OpenWorkサーバーURL", + "config.server_url_label": "OpenWorkサーバーURL", + "config.starting_server": "サーバーを起動中…", + "config.status_connected": "接続済み", + "config.status_limited": "制限あり", + "config.status_not_connected": "未接続", + "config.test_connection": "接続をテスト", + "config.testing": "テスト中…", + "config.testing_connection": "接続をテスト中…", + "config.token_hint": "任意。通常アクセス用のコラボレータートークン、または許可プロンプトへの応答が必要な場合はオーナートークンを貼り付けてください。", + "config.token_label": "コラボレーターまたはオーナートークン", + "config.token_placeholder": "トークンを貼り付け", + "config.unavailable": "利用不可", + "config.worker_id": "ワーカーID:", + "config.workspace_config_desc": "これらの設定は選択されたワークスペースに適用されます。ランタイム操作は現在接続中のワークスペースに適用されます。", + "config.workspace_config_title": "ワークスペース設定", + "config.workspace_id_prefix": "ワークスペース:", + "context_panel.add_button": "追加", + "context_panel.add_folder_hint": "フォルダを追加して、このワークスペースがルートディレクトリ外のファイルを読み書きできるようにします。", + "context_panel.adding_button": "追加中…", + "context_panel.always_available": "常に利用可能", "context_panel.authorized_folders": "許可されたフォルダ", + "context_panel.authorized_folders_desc": "このワークスペースにルートディレクトリ外のファイルへの読み書きアクセスを許可します。", + "context_panel.authorized_folders_no_access": "許可されたフォルダを編集するには、書き込み可能なOpenWorkサーバーワークスペースに接続してください。", + "context_panel.browse_button": "参照", + "context_panel.config_access_unavailable": "このワークスペースではOpenWorkサーバー設定へのアクセスが利用できません。", + "context_panel.config_read_only": "OpenWorkサーバーのワークスペース設定は読み取り専用です。", "context_panel.context": "コンテキスト", + "context_panel.folder_already_authorized": "このフォルダはすでに許可されています。", + "context_panel.folders_updated": "許可されたフォルダを更新しました。", + "context_panel.input_placeholder": "許可するフォルダパスを入力…", "context_panel.mcp": "MCP", "context_panel.mcp_connected": "接続済み", "context_panel.mcp_disabled": "無効", @@ -970,18 +234,32 @@ export default { "context_panel.mcp_failed": "失敗", "context_panel.mcp_needs_auth": "認証が必要", "context_panel.mcp_register_client": "クライアント登録", + "context_panel.no_external_folders": "外部フォルダが許可されていません", "context_panel.no_mcp": "MCPサーバーが読み込まれていません。", "context_panel.no_plugins": "プラグインが読み込まれていません。", + "context_panel.no_server_workspace": "アクティブなサーバーワークスペースが選択されていません。", "context_panel.no_skills": "スキルが読み込まれていません。", "context_panel.none_yet": "まだありません。", - "context_panel.open_file": "{path}を開く", "context_panel.plugins": "プラグイン", + "context_panel.preserving_entries": "フォルダ以外の権限エントリ({count}件)を維持しています。", + "context_panel.preserving_entry": "フォルダ以外の権限エントリ(1件)を維持しています。", + "context_panel.remove_folder": "{name}を削除", + "context_panel.saving_folders": "許可されたフォルダを保存中…", + "context_panel.server_disconnected": "OpenWorkサーバーが接続されていません。", "context_panel.skills": "スキル", "context_panel.working_files": "作業ファイル", - - // ==================== Dashboard (additions) ==================== + "context_panel.workspace_root_available": "ワークスペースルートはすでに利用可能です。", + "context_panel.workspace_root_badge": "ワークスペースルート", + "context_panel.writable_workspace_required": "許可されたフォルダを更新するには、書き込み可能なOpenWorkサーバーワークスペースが必要です。", "dashboard.access_token": "アクセストークン", "dashboard.access_token_optional_hint": "ワーカーがトークンを必要とする場合のみ追加してください。", + "dashboard.blueprints_workspace": "ブループリント", + "dashboard.blueprints_workspace_desc": "スキル、コマンド、共有フローをすぐ活用できる自動化向けワークスペースです。", + "dashboard.change": "変更", + "dashboard.choose_folder": "フォルダを選択してください", + "dashboard.choose_folder_continue": "続行するにはフォルダを選択してください。", + "dashboard.choose_folder_next": "ワークスペースとファイルを共有できます。", + "dashboard.choose_preset": "プリセットを選択", "dashboard.chooser_local_desc": "このデバイスにワークスペースを作成し、チームテンプレートから開始することもできます。", "dashboard.chooser_remote_desc": "URLとアクセストークンを使ってセルフホストのOpenWorkワーカーに接続します。", "dashboard.chooser_shared_desc": "組織で共有されたクラウドワーカーを参照し、ワンステップで接続します。", @@ -991,20 +269,34 @@ export default { "dashboard.cloud_signin_next": "次にチームを選択し、既存のワークスペースに接続します。", "dashboard.cloud_signin_title": "OpenWork Cloudにサインイン", "dashboard.cloud_worker": "クラウドワーカー", + "dashboard.commands": "コマンド", "dashboard.connect_remote_button": "リモート接続", + "dashboard.connected": "接続済み", "dashboard.connecting": "接続中…", "dashboard.create_local_workspace_subtitle": "このデバイスにワークスペースを作成し、チームテンプレートから開始することもできます。", "dashboard.create_local_workspace_title": "ローカルワークスペース", "dashboard.create_remote_custom_subtitle": "セルフホストのOpenWorkワーカーに接続します。", "dashboard.create_remote_custom_title": "カスタムリモートに接続", + "dashboard.create_remote_workspace_confirm": "ワークスペースを追加", + "dashboard.create_remote_workspace_subtitle": "OpenWorkサーバーをワークスペースとして保存します。", + "dashboard.create_remote_workspace_title": "リモートワークスペースを追加", + "dashboard.create_sandbox_confirm": "サンドボックスとして作成", "dashboard.create_shared_subtitle_signed_in": "組織で共有されたクラウドワーカーを参照し、ワンステップで接続します。", "dashboard.create_shared_subtitle_signed_out": "組織で共有されたワークスペースにアクセスするにはOpenWork Cloudにサインインしてください。", "dashboard.create_shared_title": "共有ワークスペース", + "dashboard.create_workspace_confirm": "ワークスペースを作成", + "dashboard.create_workspace_subtitle": "新しいフォルダベースのワークスペースを作成します。", + "dashboard.create_workspace_title": "ワークスペースを作成", "dashboard.creating": "作成中…", "dashboard.desktop_badge": "デスクトップ", "dashboard.display_name_label": "表示名", "dashboard.display_name_optional": "(任意)", "dashboard.docker_debug_details": "Dockerデバッグ詳細", + "dashboard.edit_remote_workspace_confirm": "接続を保存", + "dashboard.edit_remote_workspace_subtitle": "このワークスペースのOpenWorkサーバー詳細を更新します。", + "dashboard.edit_remote_workspace_title": "リモート接続を編集", + "dashboard.empty_workspace": "空のワークスペース", + "dashboard.empty_workspace_desc": "空のフォルダから始めて、必要なものを追加します。", "dashboard.error_choose_org": "ワークスペースを開く前に組織を選択してください。", "dashboard.error_connect_worker": "{name}への接続に失敗しました。", "dashboard.error_create_template": "{name}の作成に失敗しました。", @@ -1018,18 +310,47 @@ export default { "dashboard.nav_ids": "ID", "dashboard.no_folder_selected": "フォルダがまだ選択されていません。", "dashboard.open_cloud_dashboard": "クラウドダッシュボードを開く", + "dashboard.opening": "開いています…", + "dashboard.openwork_host_hint": "OpenWorkサーバーから共有されたURLを使用してください。", + "dashboard.openwork_host_label": "OpenWorkサーバーURL", + "dashboard.openwork_host_placeholder": "https://your-server.openwork.app", + "dashboard.openwork_host_token_hint": "任意。通常アクセス用のコラボレータートークン、または許可プロンプトへの応答が必要な場合はオーナートークンを貼り付けてください。", + "dashboard.openwork_host_token_label": "コラボレーターまたはオーナートークン", + "dashboard.openwork_host_token_placeholder": "トークンを貼り付け", "dashboard.recently_updated": "最近更新", + "dashboard.remote": "リモート", + "dashboard.remote_base_url_required": "続行するにはサーバーURLを追加してください。", + "dashboard.remote_connection_direct": "ダイレクト", + "dashboard.remote_connection_openwork": "OpenWork", + "dashboard.remote_directory_hint": "空欄ならサーバーのデフォルトを使います。", + "dashboard.remote_directory_label": "ワークスペースディレクトリ(任意)", + "dashboard.remote_directory_placeholder": "/home/team/project", + "dashboard.remote_display_name_label": "表示名(任意)", + "dashboard.remote_display_name_placeholder": "デザインチームワークスペース", "dashboard.remote_server_details_hint": "セルフホストのOpenWorkワーカーに接続します。", "dashboard.remote_server_details_title": "リモートサーバー詳細", + "dashboard.remote_workspace_hint": "OpenWorkサーバーを登録して、いつでも再接続できます。", + "dashboard.remote_workspace_title": "リモートワークスペース", + "dashboard.repair_cache": "キャッシュを修復", + "dashboard.repairing_cache": "キャッシュ修復中", + "dashboard.sandbox_checking_docker": "Dockerを確認中…", + "dashboard.sandbox_get_ready_action": "システムを準備する", + "dashboard.sandbox_get_ready_desc": "このワークスペースをDockerコンテナで安全に実行できます。再現性も向上します。", + "dashboard.sandbox_get_ready_title": "サンドボックスにはDockerが必要です", "dashboard.sandbox_hide_logs": "ログを隠す", "dashboard.sandbox_live_logs": "ライブログ", "dashboard.sandbox_setup": "サンドボックスセットアップ", "dashboard.sandbox_show_logs": "ログを表示", "dashboard.search_shared_workspaces": "共有ワークスペースを検索", + "dashboard.select_folder": "フォルダを選択", + "dashboard.settings": "設定", "dashboard.shared_workspaces_loading": "共有ワークスペースを読み込み中…", "dashboard.shared_workspaces_no_match": "検索に一致する共有ワークスペースがありません。", "dashboard.shared_workspaces_none": "利用可能な共有ワークスペースがまだありません。", "dashboard.shared_workspaces_refreshing": "ワークスペースを更新中…", + "dashboard.skills": "スキル", + "dashboard.starter_workspace": "スターターワークスペース", + "dashboard.starter_workspace_desc": "プラグイン、コマンド、スキルがすぐ使えるワークスペースです。", "dashboard.team_templates_hint": "開始点を選択するか、空白のまま空のワークスペースを作成します。", "dashboard.team_templates_none": "この組織にはまだ共有ワークスペーステンプレートがありません。", "dashboard.team_templates_syncing": "同期中", @@ -1049,12 +370,13 @@ export default { "dashboard.workspace_folder_hint": "このデバイスでワークスペースを配置する場所を選択してください。", "dashboard.workspace_folder_title": "ワークスペースフォルダ", "dashboard.workspace_not_ready_title": "このワークスペースはまだ接続できる状態ではありません。", - - // ==================== Den settings panel ==================== + "dashboard.workspaces": "ワークスペース", "den.active_org_hint": "クラウドワーカーとチームテンプレートは選択した組織にスコープされます。", "den.active_org_title": "アクティブな組織", "den.auto_reconnect_hint": "ブラウザで認証を完了すると、OpenWorkが自動的にここに再接続します。", "den.checking_session": "セッションを確認中", + "den.choose_org_for_providers": "クラウドプロバイダーを表示するには組織を選択してください。", + "den.choose_org_for_skill_hubs": "クラウドスキルハブを表示するには組織を選択してください。", "den.choose_org_for_templates": "チームテンプレートを表示するには組織を選択してください。", "den.cloud_account_hint": "接続済みアカウントと組織を管理します。", "den.cloud_account_title": "Cloudアカウント", @@ -1063,12 +385,18 @@ export default { "den.cloud_control_plane_save": "URLを保存", "den.cloud_control_plane_url_hint": "デベロッパーモード専用。ローカルまたはセルフホストのCloudコントロールプレーンを対象にする場合に使用します。変更するとサインアウトされ、新しいコントロールプレーンに対して再接続します。", "den.cloud_control_plane_url_label": "Cloudコントロールプレーン URL", + "den.cloud_provider_detail": "{count}モデル · {source}プロバイダー", + "den.cloud_provider_removed_detail": "このインポート済みプロバイダーはクラウドにありません。ローカルの{providerId}設定をアンインストールしてください。", + "den.cloud_provider_sync_detail": "クラウドプロバイダーが変更されました。{count}モデルの{source}設定をopencode.jsoncに同期してください。", + "den.cloud_providers_hint": "管理対象LLMプロバイダーをopencode.jsoncにインポートし、このワークスペースで組織の認証情報を使用します。", + "den.cloud_providers_title": "クラウドプロバイダー", "den.cloud_section_desc": "サインインして組織を選択し、Cloudワーカーやチームテンプレートを開きます。", "den.cloud_section_title": "OpenWork Cloud", "den.cloud_sleep_hint": "コンピュータがスリープしてもタスクを維持するには、OpenWork Cloudにサインインしてください。", "den.cloud_workers_hint": "アプリの既存のリモート接続フローを使って、ワーカーを直接OpenWorkで開きます。", "den.cloud_workers_title": "クラウドワーカー", "den.create_account": "アカウントを作成", + "den.credentials_ready_badge": "認証情報準備完了", "den.error_base_url": "有効なhttp://またはhttps://のCloudコントロールプレーンURLを入力してください。", "den.error_choose_org": "ワーカーを開く前に組織を選択してください。", "den.error_load_orgs": "組織の読み込みに失敗しました。", @@ -1085,44 +413,31 @@ export default { "den.finish_signin": "サインインを完了", "den.finishing": "完了中…", "den.hide_signin_code": "サインインコードを隠す", + "den.import_all": "すべてインポート", + "den.import_provider": "インポート", + "den.import_provider_failed": "{name}のインポートに失敗しました。", + "den.imported_badge": "インポート済み", + "den.imported_provider": "{name}をインポートしました。", + "den.importing": "インポート中…", "den.needs_attention": "要確認", + "den.no_cloud_providers": "この組織にはまだクラウドプロバイダーがありません。", "den.no_cloud_workers": "この組織にはまだクラウドワーカーがありません。Cloudで作成してから、このタブを更新してください。", "den.no_org_selected": "組織が選択されていません", + "den.no_skill_hubs": "この組織にはまだクラウドスキルハブがありません。", "den.no_team_templates": "チームテンプレートがまだありません。共有→テンプレート→チームと共有を使用してください。", "den.open": "開く", "den.opening": "開いています…", - "den.import_all": "Import all", - "den.import_provider": "Import", - "den.importing": "Importing...", - "den.removing": "Removing...", - "den.sync": "Sync", - "den.syncing": "Syncing...", - "den.uninstall": "Uninstall", - "den.imported_badge": "Imported", - "den.out_of_sync_badge": "Out of sync", - "den.removed_from_cloud_badge": "Removed from cloud", - "den.credentials_ready_badge": "Credential ready", - "den.skill_hubs_title": "Skill hubs", - "den.skill_hubs_hint": "Import every skill from a shared cloud hub into this workspace in one step.", - "den.choose_org_for_skill_hubs": "Choose an org to view cloud skill hubs.", - "den.no_skill_hubs": "No cloud skill hubs are available for this org yet.", - "den.skill_hub_skills_badge": "{count} skills", - "den.skill_hub_detail": "Import {count} shared skills into .opencode/skills.", - "den.skill_hub_imported_detail": "Imported {count} skills into this workspace.", - "den.skill_hub_sync_detail": "Cloud now has {liveCount} skills; this workspace imported {importedCount}. Sync to update the installed set.", - "den.skill_hub_removed_detail": "This hub was removed from cloud. Uninstall the {importedCount} imported skills from this workspace.", - "den.cloud_providers_title": "Cloud providers", - "den.cloud_providers_hint": "Import managed LLM providers into opencode.jsonc and use the org credential in this workspace.", - "den.choose_org_for_providers": "Choose an org to view cloud providers.", - "den.no_cloud_providers": "No cloud providers are available for this org yet.", - "den.cloud_provider_detail": "{count} models · {source} provider", - "den.cloud_provider_sync_detail": "Cloud provider changed. Sync the {count} model {source} config into opencode.jsonc.", - "den.cloud_provider_removed_detail": "This imported provider is no longer in cloud. Uninstall the local {providerId} config.", "den.org_member_suffix": "(メンバー)", "den.org_owner_suffix": "(オーナー)", "den.org_switched": "{name}に切り替えました。", + "den.out_of_sync_badge": "同期が必要", "den.paste_signin_code": "サインインコードを貼り付け", "den.refresh": "更新", + "den.reload_workspace": "設定変更を適用するにはワークスペースをリロードしてください。", + "den.remove_provider_failed": "{name}の削除に失敗しました。", + "den.removed_from_cloud_badge": "クラウドから削除済み", + "den.removed_provider": "{name}を削除しました。", + "den.removing": "削除中…", "den.sign_out": "サインアウト", "den.signed_out": "サインアウト済み", "den.signin_button": "サインイン", @@ -1133,6 +448,13 @@ export default { "den.signin_title": "OpenWork Cloudにサインイン", "den.signing_in": "OpenWork Cloudサインインを完了中…", "den.signing_out": "サインアウト中…", + "den.skill_hub_detail": "{count}件の共有スキルを.opencode/skillsにインポートします。", + "den.skill_hub_imported_detail": "このワークスペースに{count}件のスキルをインポートしました。", + "den.skill_hub_removed_detail": "このハブはクラウドから削除されました。このワークスペースの{importedCount}件のインポート済みスキルをアンインストールしてください。", + "den.skill_hub_skills_badge": "{count}件のスキル", + "den.skill_hub_sync_detail": "クラウドに{liveCount}件のスキルがあり、このワークスペースは{importedCount}件をインポート済みです。同期してインストール済みセットを更新してください。", + "den.skill_hubs_hint": "共有クラウドハブからすべてのスキルをこのワークスペースに一括インポートします。", + "den.skill_hubs_title": "スキルハブ", "den.status_base_url_updated": "Cloudコントロールプレーン URLを更新しました。続行するには再度サインインしてください。", "den.status_browser_signin": "ブラウザでサインインを完了してOpenWorkに接続してください。", "den.status_browser_signup": "ブラウザでアカウント作成を完了してOpenWorkに接続してください。", @@ -1148,40 +470,178 @@ export default { "den.status_opened_worker": "OpenWorkで{name}を開きました。", "den.status_signed_in_as": "{email}としてサインインしました。", "den.status_signed_out": "サインアウトし、このデバイスのOpenWork Cloudセッションを削除しました。", + "den.sync": "同期", + "den.sync_provider_failed": "{name}の同期に失敗しました。", + "den.synced_provider": "{name}を同期しました。", + "den.syncing": "同期中…", "den.team_template_badge": "チームテンプレート", "den.team_templates_hint": "この組織で共有された再利用可能なワークスペーステンプレートを開きます。", "den.team_templates_title": "チームテンプレート", + "den.uninstall": "アンインストール", "den.worker_mine_badge": "自分", "den.worker_not_ready_title": "このワーカーはまだ開ける状態ではありません。", "den.worker_provider_label": "{provider}ワーカー", "den.worker_secondary_cloud": "クラウドワーカー", - - // ==================== Den settings panel (settings page) ==================== - "den_settings.manage_account": "アカウントを管理", - "den_settings.no_workers": "共有ワークスペースが見つかりません。", - "den_settings.open_workspace": "ワークスペースを開く", - "den_settings.refresh": "更新", - "den_settings.sign_in": "サインイン", - "den_settings.sign_in_hint": "OpenWork Cloudにサインインして共有ワークスペースやチーム機能にアクセスできます。", - "den_settings.sign_out": "サインアウト", - "den_settings.signed_in_as": "サインイン中", - "den_settings.title": "Cloud", - "den_settings.workers_hint": "組織で共有されたクラウドワークスペース。", - "den_settings.workers_title": "共有ワークスペース", - - // ==================== Extensions ==================== + "extensions.app_count_one": "{count}件のアプリ接続済み", + "extensions.app_count_many": "{count}件のアプリ接続済み", + "extensions.apps_mcp_header": "アプリ(MCP)", + "extensions.filter_all": "すべて", + "extensions.filter_apps": "アプリ", + "extensions.filter_plugins": "プラグイン", + "extensions.plugin_count_one": "{count}件のプラグイン", + "extensions.plugin_count_many": "{count}件のプラグイン", + "extensions.plugins_opencode_header": "プラグイン(OpenCode)", + "extensions.subtitle": "アプリ(MCP)とOpenCodeプラグインをまとめて管理できます。", "extensions.title": "拡張機能", - - // ==================== Inbox Panel ==================== + "identities.agent_behavior_desc": "ワークスペースごとに1ファイルです。先頭行に@agent を追加すると特定のOpenCodeエージェント経由でルーティングされます。", + "identities.agent_behavior_title": "メッセージングエージェントの動作", + "identities.agent_created": "デフォルトのメッセージングエージェントファイルを作成しました。", + "identities.agent_file_changed": "ファイルがリモートで変更されました。リロードして再度保存してください。", + "identities.agent_loading": "エージェントファイルを読み込み中…", + "identities.agent_none": "なし", + "identities.agent_not_found": "このワークスペースにエージェントファイルがまだありません。", + "identities.agent_placeholder": "ここにopenCodeRouterのメッセージング動作を追加…", + "identities.agent_saved": "メッセージング動作を保存しました。", + "identities.agent_scope_status": "アクティブスコープ: ワークスペース · ステータス: {status} · 選択エージェント: {agent}", + "identities.agent_status_loaded": "読み込み済み", + "identities.agent_status_missing": "未設定", + "identities.agent_worker_scope_unavailable": "ワーカースコープが利用できません。", + "identities.all_channels": "すべてのチャンネル", + "identities.app_token_label": "アプリトークン", + "identities.auto_bind_label": "ダイレクト送信時にピアをディレクトリに自動バインド", + "identities.available_channels": "利用可能なチャンネル", + "identities.bot_token_label": "ボットトークン", + "identities.bot_token_placeholder": "@BotFatherからTelegramボットトークンを貼り付け", + "identities.botfather_step1_open": "1. Telegramで@BotFatherを開く", + "identities.botfather_step1_run": "/newbotを実行", + "identities.botfather_step3_choose": "3. ボットの名前とユーザー名を選択", + "identities.botfather_step3_or_private": "でオープン受信箱にするか", + "identities.botfather_step3_private": "プライベート", + "identities.botfather_step3_public": "パブリック", + "identities.botfather_step3_to_require": "にしてペアリングコードを要求", + "identities.channel_label": "チャンネル", + "identities.channels_connected": "接続済み", + "identities.channels_label": "チャンネル", + "identities.configured_suffix": "設定済み", + "identities.connect_server_desc": "OpenWorkホストに接続されている場合、アイデンティティが利用可能になります。", + "identities.connect_server_title": "OpenWorkサーバーに接続", + "identities.connect_slack": "Slackに接続", + "identities.connected_badge": "接続済み", + "identities.connecting": "接続中…", + "identities.copy_bot_token_hint": "ボットトークンをコピーして下に貼り付けてください。", + "identities.copy_code": "コードをコピー", + "identities.create_default_file": "デフォルトファイルを作成", + "identities.create_private_bot": "プライベートボットを作成", + "identities.create_public_bot": "パブリックボットを作成", + "identities.days_ago": "{days}日前", + "identities.default_routing": "デフォルトルーティング", + "identities.directory_label": "ディレクトリ(任意)", + "identities.disable_messaging": "メッセージングを無効化", + "identities.disable_messaging_message": "このワークスペースのメッセージングをオフにします。メッセージングを再度有効にするまでTelegramとSlackの設定は非表示になり、メッセージングサイドカーを完全に停止するにはワーカーの再起動が必要です。", + "identities.disable_messaging_title": "このワーカーのメッセージングを無効にしますか?", + "identities.disabled_label": "無効", + "identities.disabling": "無効化中…", + "identities.disconnect": "切断", + "identities.dispatched_messages": "{sent}/{attempted}件のメッセージを送信しました。", + "identities.enable_messaging": "メッセージングを有効化", + "identities.enable_messaging_risk": "メッセージングを有効にすると、このワーカーがリモートコマンドにさらされる可能性があります。ボットがパブリックまたは侵害された場合、このワーカーがアクセスできるファイル、認証情報、APIキーにアクセスされる恐れがあります。", + "identities.enable_messaging_title": "このワーカーのメッセージングを有効にしますか?", + "identities.enabled_label": "有効", + "identities.enabling": "有効化中…", + "identities.health_offline": "オフライン", + "identities.health_running": "実行中", + "identities.health_unavailable": "利用不可", + "identities.health_unavailable_status": "OpenCodeRouterのヘルスが利用不可({status})", + "identities.health_unknown": "不明", + "identities.hours_ago": "{hours}時間前", + "identities.identities_label": "アイデンティティ", + "identities.just_now": "たった今", + "identities.last_activity": "最終アクティビティ", + "identities.later": "後で", + "identities.message_label": "メッセージ", + "identities.message_routing_desc": "どの会話をどのワークスペースフォルダに送るかを制御します。ここでルールを設定しない限り、メッセージはワーカーのデフォルトフォルダにルーティングされます。", + "identities.message_routing_title": "メッセージルーティング", + "identities.messages_today": "今日のメッセージ", + "identities.messaging_disabled_hint": "リスクを理解し、アクセスを保護する予定がある場合のみメッセージングを有効にしてください(例: Telegramプライベートペアリング)。", + "identities.messaging_disabled_restart": "メッセージングが無効です。メッセージングサイドカーを停止するにはこのワーカーを再起動してください。", + "identities.messaging_disabled_risk": "メッセージングボットはローカルワーカーに対してアクションを実行できます。パブリックに公開された場合、このワーカーがアクセスできるファイル、認証情報、APIキーへのアクセスが可能になる恐れがあります。", + "identities.messaging_disabled_title": "メッセージングはデフォルトで無効です", + "identities.messaging_enabled_restart": "メッセージングが有効です。メッセージングサイドカーを起動してTelegramとSlackのセットアップを行うには、このワーカーを再起動してください。", + "identities.messaging_sidecar_not_running": "このワークスペースでメッセージングは有効ですが、メッセージングサイドカーがまだ実行されていません。このワーカーを再起動してから、メッセージング設定に戻ってTelegramまたはSlackに接続してください。", + "identities.minutes_ago": "{minutes}分前", + "identities.not_set": "未設定", + "identities.open_bot_link": "Telegramで@{username}を開く", + "identities.pairing_code_copied": "ペアリングコードをコピーしました。", + "identities.pairing_code_copy_failed": "ペアリングコードをコピーできませんでした。手動でコピーしてください。", + "identities.pairing_code_instruction_prefix": "送信", + "identities.peer_id_label": "ピアID(任意)", + "identities.peer_id_placeholder_slack": "例: slack:U12345678", + "identities.peer_id_placeholder_telegram": "例: telegram:123456789", + "identities.private_label": "プライベート", + "identities.private_pairing_code": "プライベートペアリングコード", + "identities.public_bot_confirm": "リスクを理解しました", + "identities.public_bot_warning_message": "ボットがパブリックになり、アクセスした人がローカルワーカーに完全アクセスできるようになります。ファイルやAPIキーも含まれます。プライベートボットを作成するとペアリングトークンでアクセスを制限できます。本当にパブリックにしますか?", + "identities.public_bot_warning_title": "このボットをパブリックにしますか?", + "identities.public_label": "パブリック", + "identities.quick_setup": "クイックセットアップ", + "identities.reconnect_failed": "再接続に失敗しました。OpenWork URL/トークンを確認して再試行してください。", + "identities.reconnected": "再接続しました。", + "identities.reconnected_refreshing": "再接続しました。ワーカーの状態を更新中…", + "identities.reload": "リロード", + "identities.repair_reconnect": "修復して再接続", + "identities.restart_failed": "再起動に失敗しました。設定からワーカーを再起動して再試行してください。", + "identities.restart_to_disable_messaging": "このワークスペースのメッセージングが無効になりました。メッセージングサイドカーを停止するにはワーカーを今すぐ再起動してください。", + "identities.restart_to_enable_messaging": "このワークスペースのメッセージングが有効になりました。メッセージングサイドカーを起動してTelegramとSlackのセットアップを行うには、ワーカーを今すぐ再起動してください。", + "identities.restart_worker": "ワーカーを再起動", + "identities.restart_worker_title": "ワーカーを今すぐ再起動しますか?", + "identities.restarting": "再起動中…", + "identities.routing_override_prefix": "すべてのメッセージの転送先:", + "identities.routing_override_suffix": "(オーバーライド有効)", + "identities.running_label": "実行中", + "identities.save_behavior": "動作を保存", + "identities.saving": "保存中…", + "identities.send_test_button": "テストメッセージを送信", + "identities.send_test_desc": "送信経路を検証します。ダイレクト送信にはピアIDを使用するか、ディレクトリ内のバインディングでファンアウトするにはピアIDを空にしてください。", + "identities.send_test_title": "テストメッセージを送信", + "identities.sending": "送信中…", + "identities.slack_desc": "ワーカーがSlackチャンネルでボットとして表示されます。チームメンバーがダイレクトメッセージやスレッドで操作できます。", + "identities.slack_intro": "Slackワークスペースに接続して、チームメンバーがチャンネルやDMでこのワーカーとやり取りできるようにします。", + "identities.slack_unavailable": "Slackアイデンティティが利用できません。", + "identities.status_active": "アクティブ", + "identities.status_label": "ステータス", + "identities.status_stopped": "停止", + "identities.stopped_label": "停止", + "identities.subtitle": "メッセージングアプリを通じてワーカーにアクセスできるようにします。チャンネルを接続すると、ワーカーが自動的にメッセージを読み取り応答します。", + "identities.tab_general": "一般", + "identities.telegram_bot_access_desc": "パブリックボット: 最初のTelegramチャットが自動リンクされます。プライベートボット: ツールの実行前にペアリングコードが必要です。", + "identities.telegram_delete_failed": "削除に失敗しました。", + "identities.telegram_deleted": "削除しました。", + "identities.telegram_deleted_pending": "削除済み(適用待ち)。", + "identities.telegram_desc": "Telegramボットをパブリックモード(オープン受信箱)またはプライベートモード(ペアリングコード必須)で接続します。", + "identities.telegram_private_saved_pair": "プライベートボットを保存しました。/pair {code}でペアリングしてください", + "identities.telegram_save_failed": "保存に失敗しました。", + "identities.telegram_saved": "保存しました。", + "identities.telegram_saved_pending": "保存済み(適用待ち)。", + "identities.telegram_saved_username": "保存しました(@{username})", + "identities.telegram_unavailable": "Telegramアイデンティティが利用できません。", + "identities.title": "メッセージングチャンネル", + "identities.unsaved_changes": "未保存の変更", + "identities.worker_offline": "ワーカーオフライン", + "identities.worker_online": "ワーカーオンライン", + "identities.worker_restarted": "ワーカーを再起動しました。", + "identities.worker_restarted_refreshing": "ワーカーを再起動しました。メッセージングステータスを更新中…", + "identities.worker_scope_unavailable": "ワーカースコープが利用できません。", + "identities.worker_scope_unavailable_detail": "ワーカースコープが利用できません。ワーカーURLで再接続するか、既知のワーカーに切り替えてください。", + "identities.worker_unavailable": "ワーカーが利用できません", + "identities.workspace_id_required": "アイデンティティを管理するにはワークスペースIDが必要です。ワークスペースURLで再接続するか、このホストにマッピングされたワークスペースを選択してください。", + "identities.workspace_scope_prefix": "ワークスペーススコープ:", "inbox_panel.connect_to_download": "共有ファイルをダウンロードするにはワーカーに接続してください。", "inbox_panel.connect_to_see": "共有ファイルを表示するには接続してください。", "inbox_panel.connect_to_upload": "アップロードするにはワーカーに接続してください", - "inbox_panel.copied_path": "コピーしました: {path}", "inbox_panel.copy_failed": "コピーに失敗しました。ブラウザがクリップボードアクセスをブロックしている可能性があります。", "inbox_panel.download": "ダウンロード", - "inbox_panel.download_failed": "ダウンロードに失敗しました", "inbox_panel.drop_to_upload": "ここにファイルをドロップしてアップロード", - "inbox_panel.helper_text": "アプリからこのワークスペースとファイルを共有できます。", + "inbox_panel.helper_text": "アプリからこのワーカーにファイルを共有できます。", "inbox_panel.load_failed": "共有フォルダの読み込みに失敗しました", "inbox_panel.missing_file_id": "共有ファイルIDが見つかりません。", "inbox_panel.no_files": "まだ共有ファイルがありません。", @@ -1194,12 +654,93 @@ export default { "inbox_panel.upload_success": "共有フォルダにアップロードしました。", "inbox_panel.uploading": "アップロード中…", "inbox_panel.uploading_label": "{label}をアップロード中…", - - // ==================== MCP (Control Chrome) ==================== + "mcp.activate_button": "有効化", + "mcp.add_modal_subtitle": "URLまたはローカルコマンドでカスタムMCPサーバーを接続します。", + "mcp.add_modal_title": "カスタムアプリを追加", + "mcp.add_server_button": "アプリを追加", + "mcp.advanced": "詳細", + "mcp.advanced_settings": "詳細設定", + "mcp.advanced_settings_hint": "設定ファイルを編集し、接続を手動で管理します。", + "mcp.app_connected": "アプリ接続済み", + "mcp.apps_connected": "アプリ接続済み", + "mcp.apps_subtitle": "ツールを接続して、OpenWorkが代わりに操作できるようにしましょう。", + "mcp.apps_title": "アプリ", + "mcp.auth.already_connected": "既に接続済み", + "mcp.auth.already_connected_description": "{server} は既に認証済みで、使用する準備ができています。", + "mcp.auth.applying_changes_body": "新しいMCPが認証できるようにワーカーを再起動しています。", + "mcp.auth.applying_changes_title": "サインイン前に変更を適用中", + "mcp.auth.authorization_link": "認証リンク", + "mcp.auth.authorization_still_required": "承認がまだ必要です。フローを再開するには再試行してください。", + "mcp.auth.callback_invalid": "OAuthを完了するにはコールバックURLまたはcodeパラメータを貼り付けてください。", + "mcp.auth.callback_label": "コールバックURLまたはコード", + "mcp.auth.callback_placeholder": "http://127.0.0.1:19876/mcp/oauth/callback?code=...", + "mcp.auth.cancel": "キャンセル", + "mcp.auth.client_registration_required": "OAuthを続行する前にクライアント登録が必要です。", + "mcp.auth.complete_connection": "接続を完了", + "mcp.auth.configured_previously": "MCPはグローバルまたは前のセッションで設定されている可能性があります。この画面を閉じて、すぐにMCPツールの使用を開始できます。", + "mcp.auth.connect_server": "{server} に接続", + "mcp.auth.copied": "コピー済み", + "mcp.auth.copy_link": "リンクをコピー", + "mcp.auth.done": "完了", + "mcp.auth.failed_to_start_oauth": "OAuthフローの開始に失敗しました", + "mcp.auth.follow_browser_steps": "ブラウザで承認手順に従ってください。", + "mcp.auth.force_stop": "強制停止", + "mcp.auth.force_stopping": "停止中…", + "mcp.auth.im_done": "完了しました", + "mcp.auth.invalid_refresh_token": "OAuthリフレッシュトークンが無効または期限切れです。続行するには再承認してください。", + "mcp.auth.manual_finish_hint": "コールバックURL(localhost:19876)またはコードだけを貼り付けて接続を完了してください。", + "mcp.auth.manual_finish_title": "リモートサーバーですか?", + "mcp.auth.oauth_completed_reload": "OAuthが完了しました。MCPを有効化するにはエンジンをリロードしてください。", + "mcp.auth.oauth_failed": "OAuth認証に失敗しました。", + "mcp.auth.oauth_not_supported_hint": "考えられる原因:\n• MCPサーバーがOAuth機能を公開していません\n• エンジンをリロードしてサーバー機能を検出する必要があります\n• 試してみてください: opencode mcp auth {server}(CLIから)", + "mcp.auth.open_browser_signin": "ブラウザを開いてサインインを完了します。", + "mcp.auth.port_forward_hint": "ヒント: 必要に応じてコールバックポートを転送してください: ssh -L 19876:127.0.0.1:19876 user@host", + "mcp.auth.reauth_action": "OAuthを再承認", + "mcp.auth.reauth_cli_hint": "実行: opencode mcp auth {server}", + "mcp.auth.reauth_failed": "再承認に失敗しました。", + "mcp.auth.reauth_remote_hint": "このワーカーを実行しているマシンから再承認してください。", + "mcp.auth.reauth_running": "再承認中…", + "mcp.auth.reload_blocked": "セッション実行中はリロードが一時停止されます。セットアップを完了するには実行を停止してください。", + "mcp.auth.reload_engine_retry": "変更を適用して再試行", + "mcp.auth.reload_failed": "サインイン前にワーカーのリロードに失敗しました。", + "mcp.auth.reload_notice": "この変更を反映するには、OpenWorkがワーカーサービスを更新する必要があります。実行中のセッションが中断される可能性があります。", + "mcp.auth.reload_remote_confirm": "この変更を反映するには、OpenWorkがワーカーサービスを更新する必要があります。実行中のセッションが停止する可能性があります。続行しますか?", + "mcp.auth.reopen_browser_link": "ここをクリックしてブラウザを再度開く", + "mcp.auth.request_timed_out": "リクエストがタイムアウトしました。", + "mcp.auth.retry": "再試行", + "mcp.auth.retry_now": "今すぐ再試行", + "mcp.auth.server_disabled": "このMCPサーバーは無効です。有効にしてから再試行してください。", + "mcp.auth.step1_description": "{server} のサインインフローを自動的に起動します。", + "mcp.auth.step1_title": "ブラウザを開いています", + "mcp.auth.step2_description": "サインインしてプロンプトが表示されたらアクセスを承認してください。", + "mcp.auth.step2_title": "OpenWorkを承認", + "mcp.auth.step3_description": "承認が完了次第、接続を完了します。", + "mcp.auth.step3_title": "完了したらここに戻ってください", + "mcp.auth.try_reload_engine": "{message}。まずエンジンのリロードを試してください。", + "mcp.auth.waiting_authorization": "ブラウザでの承認完了を待っています…", + "mcp.auth.waiting_for_conversation_body": "できるだけ早く認証画面にリダイレクトします。", + "mcp.auth.waiting_for_conversation_title": "会話の完了を待っています", + "mcp.auth.waiting_for_session": "{session} の作業完了を待っています", + "mcp.available_apps": "利用可能なアプリ", + "mcp.cap_signin": "アカウントサインイン", + "mcp.cap_tools": "AIツール", + "mcp.config_file": "設定ファイル", + "mcp.config_load_failed": "設定ファイルを読み込めませんでした", + "mcp.config_not_loaded": "まだ読み込まれていません", + "mcp.config_source": "設定ファイルから", + "mcp.configured": "設定済み", + "mcp.connect": "接続", + "mcp.connect_failed": "接続できませんでした。再試行してください。", + "mcp.connect_server_first": "先にサーバーに接続してください。", + "mcp.connected": "接続済み", + "mcp.connected_badge": "接続済み", + "mcp.connecting": "接続中…", + "mcp.connection_failed": "接続の問題 — 再試行してください", + "mcp.connection_type": "接続", "mcp.control_chrome_browser_hint": "Chrome 144以降では、まず次の手順を実行してください:", "mcp.control_chrome_browser_step_one": "chrome://inspect/#remote-debuggingを開く。", - "mcp.control_chrome_browser_step_three": "Chromeが求めたらデバッグ接続を許可する。", "mcp.control_chrome_browser_step_two": "リモートデバッグを有効にする。", + "mcp.control_chrome_browser_step_three": "Chromeが求めたらデバッグ接続を許可する。", "mcp.control_chrome_browser_title": "1. Chromeアクセスを有効にする", "mcp.control_chrome_connect": "Control Chromeを追加", "mcp.control_chrome_docs": "公式MCPガイド", @@ -1213,13 +754,84 @@ export default { "mcp.control_chrome_toggle_label": "既存のChromeプロファイルを使用", "mcp.control_chrome_toggle_off": "OpenWorkは自動化専用の別のChromeプロファイルを起動します。", "mcp.control_chrome_toggle_on": "OpenWorkは現在のタブ、Cookie、サインイン情報を再利用します。", - - // ==================== Message ==================== + "mcp.custom_app_cta_hint": "独自のMCPサーバー、社内ツール、またはホスト型アプリを接続します。", + "mcp.desktop_required": "アプリにはデスクトップアプリが必要です。", + "mcp.docs_link": "詳細を見る", + "mcp.file_not_found": "設定ファイルがまだ作成されていません", + "mcp.finish_setup": "もう少しです", + "mcp.finish_setup_hint": "有効化をタップしてアプリの接続を完了してください。", + "mcp.friendly_status_issue": "問題", + "mcp.friendly_status_needs_signin": "サインインが必要", + "mcp.friendly_status_offline": "オフライン", + "mcp.friendly_status_paused": "一時停止中", + "mcp.friendly_status_ready": "準備完了", + "mcp.last_synced": "同期済み", + "mcp.login_action": "サインイン", + "mcp.login_hint": "アカウントを接続してこのアプリのセットアップを完了してください。", + "mcp.login_unavailable": "このアプリはOpenWorkからのサインインに対応していません。", + "mcp.logout_action": "ログアウト", + "mcp.logout_failed": "ログアウトに失敗しました。", + "mcp.logout_hint": "保存されたOAuth認証情報を削除します。再度サインインが必要になります。", + "mcp.logout_label": "OAuth", + "mcp.logout_modal_message": "{server} の保存されたOAuth認証情報が削除されます。このアプリを使用するには再度サインインが必要です。", + "mcp.logout_modal_title": "このアプリからログアウトしますか?", + "mcp.logout_success": "{server} からログアウトしました。", + "mcp.logout_working": "ログアウト中…", + "mcp.name_required": "サーバー名を入力してください。", + "mcp.no_apps_hint": "上のアプリを接続して始めましょう。", + "mcp.no_apps_yet": "まだアプリが接続されていません", + "mcp.oauth": "サインイン", + "mcp.oauth_optional_hint": "ブラウザでOAuthを使ってアカウントに接続します。", + "mcp.oauth_optional_label": "このアプリはサインインが必要です", + "mcp.one_click_connect": "ワンクリック接続", + "mcp.open_file": "ファイルを開く", + "mcp.opening_label": "開いています…", + "mcp.pick_workspace_error": "最初にワークスペースフォルダを選択してください。", + "mcp.pick_workspace_first": "最初にワークスペースフォルダを選択してください。", + "mcp.quick_connect_chrome_desc": "ブラウザ自動化でChromeタブを操作。", + "mcp.quick_connect_chrome_title": "Chromeを操作", + "mcp.quick_connect_context7_desc": "より豊富なコンテキストで製品ドキュメントを検索。", + "mcp.quick_connect_context7_title": "Context7", + "mcp.quick_connect_linear_desc": "スプリントを計画し、チケットをより速く処理。", + "mcp.quick_connect_linear_title": "Linear", + "mcp.quick_connect_notion_desc": "ページ、データベース、プロジェクトドキュメントを同期。", + "mcp.quick_connect_notion_title": "Notion", + "mcp.quick_connect_sentry_desc": "リリースを追跡し、本番エラーを解決。", + "mcp.quick_connect_sentry_title": "Sentry", + "mcp.quick_connect_stripe_desc": "支払い、請求書、サブスクリプションを確認。", + "mcp.quick_connect_stripe_title": "Stripe", + "mcp.reload_banner_blocked_hint": "実行中のタスクを停止して有効化してください。", + "mcp.reload_banner_description": "有効化をタップしてアプリの接続を完了してください。", + "mcp.reload_banner_description_blocked": "タスクが実行中です。先に停止してから有効化してください。", + "mcp.remote_workspace_url_hint": "リモートワーカーはURLベースのMCPサーバーとの接続が最も速いです。", + "mcp.remove_app": "削除", + "mcp.remove_failed": "アプリを削除できませんでした。", + "mcp.remove_modal_message": "{server} を削除してもよろしいですか?後で再度追加できます。", + "mcp.remove_modal_title": "アプリを削除", + "mcp.reveal_config_failed": "設定ファイルを開けませんでした", + "mcp.reveal_in_finder": "Finderで表示", + "mcp.scope_global": "すべてのワークスペース", + "mcp.scope_project": "このワークスペース", + "mcp.server_command": "コマンド", + "mcp.server_command_hint": "サーバーを起動するシェルコマンド。", + "mcp.server_command_placeholder": "npx -y @modelcontextprotocol/server-sequential-thinking", + "mcp.server_name": "アプリ名", + "mcp.server_name_placeholder": "github-copilot", + "mcp.server_type": "タイプ", + "mcp.server_url": "サーバーURL", + "mcp.server_url_placeholder": "https://api.githubcopilot.com/mcp/", + "mcp.sign_in_section_label": "サインイン", + "mcp.tap_to_connect": "タップして接続", + "mcp.technical_details": "技術的な詳細", + "mcp.type_cloud": "クラウド(アカウントでサインイン)", + "mcp.type_local": "ローカル(このデバイスで実行)", + "mcp.type_local_cmd": "ローカル(コマンド)", + "mcp.type_remote": "リモート(URL)", + "mcp.url_or_command_required": "リモートの場合はURL、ローカルの場合はコマンドを入力してください。", + "mcp.your_apps": "接続済みアプリ", "message.tool_request_label": "リクエスト", "message.tool_result_label": "結果", "message.waiting_subagent": "サブエージェントのトランスクリプトの到着を待っています。", - - // ==================== Message List ==================== "message_list.copy_message": "メッセージをコピー", "message_list.open_session": "セッションを開く", "message_list.step_updates_progress": "進捗を更新", @@ -1249,11 +861,246 @@ export default { "message_list.tool_update_todo": "Todoリストを更新", "message_list.tool_updated_file": "{file}を更新済み", "message_list.tool_updated_file_fallback": "ファイル更新済み", - - // ==================== Scheduled ==================== + "model_behavior.desc_builtin": "このモデルは独自の推論パスを決定し、ここではプロファイルを公開しません。", + "model_behavior.desc_generic": "{label}プロファイルを使用します。", + "model_behavior.desc_high": "回答前により多くの時間をかけて推論します。", + "model_behavior.desc_high_anthropic": "標準の拡張シンキングバジェットを使用します。", + "model_behavior.desc_low": "回答前に軽めの推論パスを実行します。", + "model_behavior.desc_low_google": "より軽い推論バジェットで素早く応答します。", + "model_behavior.desc_max": "プロバイダーの最も深い推論プロファイルを使用します。", + "model_behavior.desc_max_anthropic": "利用可能な最大の拡張シンキングバジェットを使用します。", + "model_behavior.desc_medium": "速度と推論の深さをバランスします。", + "model_behavior.desc_minimal": "ごく少量の推論を使用します。", + "model_behavior.desc_none": "最軽量の推論パスで速度を優先します。", + "model_behavior.desc_standard": "このモデルは追加の推論コントロールを公開していません。", + "model_behavior.label_balanced": "バランス", + "model_behavior.label_builtin": "ビルトイン", + "model_behavior.label_deep": "ディープ", + "model_behavior.label_extended": "拡張", + "model_behavior.label_fast": "高速", + "model_behavior.label_light": "ライト", + "model_behavior.label_maximum": "最大", + "model_behavior.label_quick": "クイック", + "model_behavior.label_standard": "スタンダード", + "model_behavior.title_builtin_reasoning": "組み込み推論", + "model_behavior.title_extended_thinking": "拡張シンキング", + "model_behavior.title_reasoning_budget": "推論バジェット", + "model_behavior.title_reasoning_effort": "推論エフォート", + "model_behavior.title_standard_generation": "標準生成", + "model_picker.chat_model_desc": "このチャットのモデルを選択します。モデルが推論プロファイルをサポートしている場合は、カードで設定します。", + "model_picker.chat_model_title": "チャットモデル", + "model_picker.connect_provider_hint": "このプロバイダーに接続してモデルを閲覧・保存", + "model_picker.default_model_desc": "新しいチャットのデフォルトモデルを選択し、その後、カードで推論プロファイルを微調整してから「完了」を押します。", + "model_picker.default_model_title": "デフォルトモデル", + "model_picker.model_count": "{count}件のモデル", + "model_picker.model_count_one": "1件のモデル", + "model_picker.more_providers": "さらにプロバイダー", + "model_picker.no_results": "検索に一致するモデルがありません。", + "model_picker.other_connected_models": "その他の接続済みモデル", + "model_picker.recommended": "おすすめ", + "onboarding.access_label": "アクセス", + "onboarding.add": "追加", + "onboarding.add_folder_path": "フォルダパスを追加", + "onboarding.advanced_settings": "詳細設定", + "onboarding.attach": "アタッチ", + "onboarding.attach_description": "このデバイスの既存セッションにアタッチします。", + "onboarding.authorize_folder": "フォルダを承認", + "onboarding.back": "戻る", + "onboarding.checking_cli": "OpenCode CLIを確認中…", + "onboarding.choose_workspace_folder": "ワークスペースフォルダを選択", + "onboarding.cli_checking": "インストールを確認中…", + "onboarding.cli_install_commands": "以下のコマンドでOpenCodeをインストールしてからOpenWorkを再起動してください。", + "onboarding.cli_label": "OpenCode CLI", + "onboarding.cli_needs_update": "OpenCode CLIのserve対応にはアップデートが必要です。", + "onboarding.cli_not_found": "OpenCode CLIが見つかりません。", + "onboarding.cli_not_found_hint": "見つかりません。ローカルサーバーの実行にはインストールが必要です。", + "onboarding.cli_ready": "OpenCode CLI準備完了。", + "onboarding.cli_recheck": "再確認", + "onboarding.cli_version": "OpenCode {version}", + "onboarding.cli_version_installed": "インストール済み", + "onboarding.create_first_workspace": "最初のワークスペースを作成", + "onboarding.create_workspace": "ワークスペースを作成", + "onboarding.engine_running": "エンジンは既に実行中です", + "onboarding.folders_allowed": "{count}個のフォルダが許可済み", + "onboarding.getting_ready": "準備しています", + "onboarding.install": "OpenCodeをインストール", + "onboarding.install_instruction": "ローカルサーバーを有効にするにはOpenCodeをインストールしてください(ターミナル不要)。", + "onboarding.last_checked": "最終確認 {time}", + "onboarding.manage_access_hint": "アクセスは詳細設定で管理できます。", + "onboarding.open_settings": "設定を開く", + "onboarding.open_settings_hint": "エンジンやアクセスのオプションが必要ですか?設定を開いてください。", + "onboarding.pick": "選択", + "onboarding.ready_message": "OpenCodeはローカルサーバーを起動する準備ができています。", + "onboarding.remember_choice": "次回のためにこの選択を記憶する", + "onboarding.remote_workspace_action": "接続", + "onboarding.remote_workspace_card_description": "OpenWorkサーバーに接続して共有ワークスペースにアクセスします。", + "onboarding.remote_workspace_card_title": "リモートワークスペースに接続", + "onboarding.remote_workspace_description": "OpenWorkサーバーに接続して、どこからでもワークスペースにアクセスできます。", + "onboarding.remote_workspace_title": "OpenWorkサーバーに接続", + "onboarding.remove": "削除", + "onboarding.resolved_path": "解決されたパス", + "onboarding.run_local": "ローカルで実行", + "onboarding.run_local_description": "OpenWorkはOpenCodeをローカルで実行し、作業をプライベートに保ちます。", + "onboarding.search_notes": "メモを検索", + "onboarding.searching_host": "OpenWorkサーバーに接続中…", + "onboarding.serve_help": "serve --helpの出力", + "onboarding.show_search_notes": "検索メモを表示", + "onboarding.start": "OpenWorkを開始", + "onboarding.starting_host": "OpenWorkサーバーを起動中…", + "onboarding.theme_current": "現在: {mode}", + "onboarding.theme_dark": "ダーク", + "onboarding.theme_label": "テーマ", + "onboarding.theme_light": "ライト", + "onboarding.theme_system": "システム", + "onboarding.verifying": "安全な接続を確認中", + "onboarding.version": "バージョン", + "onboarding.welcome_title": "今日のOpenWorkの使い方は?", + "onboarding.windows_install_instruction": "Windows版OpenCodeをインストールしてからOpenWorkを再起動してください。opencode.exeがPATHにあることを確認してください。", + "onboarding.workspace_folder_label": "ワークスペースは独自のスキル、プラグイン、コマンドを持つフォルダです。", + "plugins.add": "追加", + "plugins.add_hint": "npmパッケージ名を追加してください(例: opencode-wakatime)", + "plugins.add_label": "プラグインを追加", + "plugins.added": "追加済み", + "plugins.config": "設定", + "plugins.config_label": "設定", + "plugins.desc": "プロジェクトまたはグローバルのOpenCodeプラグインの`opencode.json`を管理します。", + "plugins.empty": "まだプラグインが設定されていません。", + "plugins.enabled": "有効", + "plugins.hide_setup": "セットアップを隠す", + "plugins.not_loaded": "まだ読み込まれていません", + "plugins.not_loaded_yet": "まだ読み込まれていません", + "plugins.remove": "削除", + "plugins.scheduler_desc": "OpenCodeスケジューラプラグインでジョブをスケジュール実行します。", + "plugins.scope_global": "グローバル", + "plugins.scope_project": "プロジェクト", + "plugins.setup": "セットアップ", + "plugins.suggested": "おすすめのプラグイン", + "plugins.suggested_heading": "おすすめプラグイン", + "plugins.title": "OpenCodeプラグイン", + "providers.api_key_label": "APIキー", + "providers.api_key_required": "APIキーが必要です", + "providers.auth_failed": "認証に失敗しました", + "providers.connect_failed": "プロバイダーの接続に失敗しました", + "providers.disabled_in_config_suffix": "、OpenCode設定で無効にしました。", + "providers.disconnect_failed": "プロバイダーの切断に失敗しました", + "providers.disconnected_prefix": "切断済み", + "providers.load_failed": "プロバイダーの読み込みに失敗しました", + "providers.no_oauth_prefix": "OAuthフローがありません:", + "providers.no_providers_available": "利用可能なプロバイダーがありません", + "providers.not_connected": "サーバーに接続されていません", + "providers.not_oauth_flow_prefix": "選択された認証方法はOAuthフローではありません:", + "providers.oauth_failed": "OAuthの完了に失敗しました", + "providers.oauth_method_required": "OAuthメソッドが必要です", + "providers.provider_error": "プロバイダーエラー({provider})", + "providers.provider_id_required": "プロバイダーIDが必要です", + "providers.rate_limit_exceeded": "レートリミットを超過しました", + "providers.removal_unsupported": "プロバイダー認証の削除はこのクライアントではサポートされていません。", + "providers.request_failed": "リクエストに失敗しました", + "providers.save_api_key_failed": "APIキーの保存に失敗しました", + "providers.still_connected_suffix": "、ワーカーはまだ接続済みと報告しています。残存するAPIキーまたはOAuth認証情報をクリアし、ワーカーを再起動して完全に切断してください。", + "providers.unknown_provider": "不明なプロバイダー", + "providers.use_api_key_suffix": "代わりにAPIキーを使用してください。", + "question_modal.custom_answer_label": "またはカスタム回答を入力", + "question_modal.custom_answer_placeholder": "ここに回答を入力…", + "question_modal.question_counter": "質問{current}/{total}", + "scheduled.at_time": "{time}に", + "scheduled.badge_end_of_day": "1日の終わり", + "scheduled.badge_every_few_hours": "数時間ごと", + "scheduled.badge_friday_wrapup": "金曜まとめ", + "scheduled.badge_weekday_evening": "平日の夕方", + "scheduled.badge_weekday_morning": "平日の朝", + "scheduled.badge_weekend_review": "週末振り返り", + "scheduled.create_button": "作成", + "scheduled.create_desc": "オートメーションは新しいスレッドでプロンプトを実行してスケジュールされます。送信用のプロンプトを事前入力します。", + "scheduled.create_title": "オートメーションを作成", + "scheduled.created_prefix": "作成日", + "scheduled.custom_schedule": "カスタムスケジュール", + "scheduled.daily_mode": "毎日", + "scheduled.day_fri": "金", + "scheduled.day_mon": "月", + "scheduled.day_sat": "土", + "scheduled.day_sun": "日", + "scheduled.day_thu": "木", + "scheduled.day_tue": "火", + "scheduled.day_wed": "水", + "scheduled.days_at": "{days} {time}に", + "scheduled.default_automation_name": "デイリーバグスキャン", + "scheduled.delete_confirm_desc": "スケジュールを解除し、{source}からジョブ定義を削除します。", + "scheduled.delete_confirm_title": "このオートメーションを削除しますか?", + "scheduled.delete_error_fallback": "オートメーションの削除に失敗しました。", + "scheduled.delete_label": "削除", + "scheduled.deleting": "削除中", + "scheduled.desktop_required": "スケジュール済みタスクにはデスクトップアプリが必要です。", + "scheduled.empty_hint": "まだオートメーションがありません。テンプレートを選ぶか、独自のオートメーションプロンプトを作成してください。", + "scheduled.every_day_at": "毎日{time}に", + "scheduled.every_hour": "毎時", + "scheduled.every_n_hours": "{interval}時間ごと", + "scheduled.every_prefix": "毎", + "scheduled.explore_more": "さらに探す", + "scheduled.failed_status": "失敗", + "scheduled.filter_all": "すべて", + "scheduled.filter_scheduled": "スケジュール済み", + "scheduled.filter_templates": "テンプレート", + "scheduled.hours_suffix": "時間", + "scheduled.install_scheduler": "スケジューラをインストール", + "scheduled.install_scheduler_hint": "オートメーションはopencode-schedulerプラグインで実行されます。スケジュール機能を有効にするには、このワークスペースに追加してください。", + "scheduled.install_scheduler_title": "オートメーションを有効にするにはスケジューラをインストールしてください", + "scheduled.installing": "インストール中…", + "scheduled.interval_mode": "間隔", + "scheduled.last_run_prefix": "最終実行", + "scheduled.last_updated_prefix": "最終更新", + "scheduled.name_label": "名前", + "scheduled.never": "なし", + "scheduled.new_automation": "新しいオートメーション", + "scheduled.no_automations_match": "この検索に一致するオートメーションがありません。", + "scheduled.no_templates_match": "この検索に一致するテンプレートがありません。", + "scheduled.not_run_yet": "未実行", + "scheduled.not_synced_yet": "未同期", + "scheduled.page_description": "このワーカーの繰り返しタスクをスケジュールし、登録済みのものを確認し、再利用可能なテンプレートから始められます。", + "scheduled.prepare_error_fallback": "チャットでのオートメーション準備に失敗しました。", + "scheduled.prepared_automation_in_chat": "チャットでオートメーションを準備しました。", + "scheduled.prepared_job_in_chat": "チャットで{name}を準備しました。", + "scheduled.quick_start_templates": "クイックスタートテンプレート", + "scheduled.quick_start_templates_desc": "実績のある繰り返しワークフローから始めて、チャットで準備する前にプロンプトをカスタマイズしてください。", + "scheduled.refreshing": "更新中", + "scheduled.reload_activate_hint": "OpenCodeは起動時にプラグインを読み込みます。opencode-schedulerを有効にするにはOpenWorkをリロードしてください。", + "scheduled.reload_activate_title": "OpenWorkをリロードしてオートメーションを有効化", + "scheduled.reload_openwork": "OpenWorkをリロード", + "scheduled.reloading": "リロード中…", + "scheduled.removed_job": "{name}を削除しました。", + "scheduled.run_label": "実行", + "scheduled.running_status": "実行中", + "scheduled.schedule_label": "スケジュール", + "scheduled.scheduler_install_requested": "スケジューラのインストールをリクエストしました。", + "scheduled.search_placeholder": "オートメーションまたはテンプレートを検索", + "scheduled.source_local": "ローカルスケジューラから", + "scheduled.source_remote": "OpenWorkサーバーから", + "scheduled.subtitle_local": "このデバイスからスケジュールで実行されるオートメーション。", + "scheduled.subtitle_remote": "接続されたOpenWorkサーバーからスケジュールで実行されるオートメーション。", + "scheduled.success_status": "成功", + "scheduled.task_summary_no_prompt": "プロンプトまたはコマンドが見つかりません。", + "scheduled.task_summary_prompt": "プロンプト", + "scheduled.template_badge": "テンプレート", + "scheduled.template_count": "{count}件のテンプレート", "scheduled.title": "オートメーション", - - // ==================== Session (additions) ==================== + "scheduled.tpl_daily_planning_desc": "タスクとカレンダーから焦点を絞った計画を作成します。", + "scheduled.tpl_daily_planning_name": "デイリープランニングブリーフ", + "scheduled.tpl_habit_checkin_desc": "1日を通して短い振り返りを行います。", + "scheduled.tpl_habit_checkin_name": "習慣チェックイン", + "scheduled.tpl_inbox_zero_desc": "未読メッセージをまとめ、短い返信案を作成します。", + "scheduled.tpl_inbox_zero_name": "Inbox zeroヘルパー", + "scheduled.tpl_learning_digest_desc": "保存したリンクとメモを週次ダイジェストにまとめます。", + "scheduled.tpl_learning_digest_name": "学習ダイジェスト", + "scheduled.tpl_meeting_prep_desc": "明日のミーティングの準備ポイントを生成します。", + "scheduled.tpl_meeting_prep_name": "ミーティング準備メモ", + "scheduled.tpl_weekly_wins_desc": "金曜日に成果、ブロッカー、次のステップをまとめます。", + "scheduled.tpl_weekly_wins_name": "週間振り返り", + "scheduled.view_scheduler_docs": "スケジューラのドキュメントを表示", + "scheduled.weekdays_at": "平日{time}に", + "scheduled.weekends_at": "週末{time}に", + "scheduled.worker_root_hint": "ワーカールートは選択されたワークスペースから推定されます。", + "scheduled.your_automations": "オートメーション一覧", + "session.allow_for_session": "セッション中許可", "session.allow_once": "一度だけ", "session.api_key_saved": "APIキーを保存しました", "session.attachments_add_token": "ファイルを添付するにはサーバートークンを追加してください。", @@ -1272,7 +1119,7 @@ export default { "session.cmd_model_title": "モデルを変更", "session.cmd_new_session_detail": "現在のワークスペースで新しいタスクを開始", "session.cmd_new_session_meta": "作成", - "session.cmd_new_session_title": "新しいセッションを作成", + "session.cmd_new_session_title": "新規セッションを作成", "session.cmd_provider_detail": "プロバイダー接続フローを開く", "session.cmd_provider_meta": "開く", "session.cmd_provider_title": "プロバイダーを接続", @@ -1296,12 +1143,16 @@ export default { "session.create_workspace_desc": "ワークスペースクリエイターを開いて開始方法を選択します。", "session.create_workspace_title": "ワークスペースを作成", "session.default_agent": "デフォルトエージェント", + "session.default_title": "新規セッション", "session.delete": "削除", "session.delete_named_session_message": "「{title}」とそのメッセージを完全に削除します。", "session.delete_session_generic": "選択したセッションとそのメッセージを完全に削除します。", "session.delete_session_title": "セッションを削除しますか?", "session.deleted": "セッションを削除しました", "session.deleting": "削除中…", + "session.deny": "拒否", + "session.details": "詳細", + "session.details_label": "詳細", "session.doom_loop_label": "ドゥームループ", "session.doom_loop_message": "OpenCodeが同一入力でのツール呼び出しの繰り返しを検出しました。繰り返し失敗した後、続行するか確認しています。", "session.doom_loop_note": "ループを停止するには拒否、エージェントに再試行させるには許可を選択してください。", @@ -1339,7 +1190,9 @@ export default { "session.loading_session": "セッションを読み込み中", "session.loading_title": "セッションを読み込み中", "session.menu_label": "メニュー", + "session.model": "モデル", "session.model_fallback": "モデル", + "session.new_task": "新しいタスク", "session.next_match": "次の一致", "session.no_matches": "一致なし", "session.no_matches_command": "一致するものがありません。", @@ -1350,13 +1203,16 @@ export default { "session.nothing_to_undo": "元に戻すものがまだありません。", "session.oauth_failed": "OAuthに失敗しました", "session.obsidian_worker_relative_only": "Obsidianで開けるのはワーカー相対パスのファイルのみです。", + "session.open": "開く", "session.palette_hint_navigate": "矢印キーで移動", "session.palette_hint_run": "Enterで実行 · Escで閉じる", "session.palette_placeholder_actions": "アクションを検索", "session.palette_placeholder_sessions": "セッション名またはワークスペースで検索", "session.palette_title_actions": "クイックアクション", "session.palette_title_sessions": "セッションを検索", + "session.permission_label": "権限", "session.permission_message": "OpenCodeが続行するために許可を求めています。", + "session.permission_required": "権限が必要です", "session.phase_responding": "応答中", "session.phase_retrying": "再試行中", "session.phase_run_failed": "実行に失敗しました", @@ -1373,12 +1229,19 @@ export default { "session.redo_label": "やり直し", "session.redo_title": "最後に取り消したメッセージをやり直す", "session.remote_sync_failed": "リモートファイルの同期に失敗しました", + "session.rename_description": "このセッションの名前を更新します。", + "session.rename_label": "セッション名", + "session.rename_placeholder": "新しい名前を入力", + "session.rename_title": "セッション名を変更", "session.resize_workspace_column": "ワークスペース列のサイズを変更", "session.restart_update_title": "アップデート{version}を適用するには再起動してください", "session.restored_message": "取り消したメッセージを復元しました。", + "session.reveal": "表示", "session.reveal_desktop_only": "表示機能はデスクトップアプリで利用可能です。", "session.revert_label": "元に戻す", "session.reverted_last_message": "最後のユーザーメッセージを取り消しました。", + "session.run": "実行", + "session.scope_label": "スコープ", "session.search_conversation_label": "会話を検索", "session.search_conversation_title": "会話を検索(Ctrl/Cmd+F)", "session.search_next": "次へ", @@ -1461,21 +1324,389 @@ export default { "session.workspace_setup_desc": "ガイド付きOpenWorkワークスペースで開始するか、作業したい既存のフォルダを選択してください。", "session.workspace_setup_label": "ワークスペースセットアップ", "session.workspace_setup_title": "最初のワークスペースをセットアップ", - - // ==================== Settings tabs ==================== + "settings.action_download": "ダウンロード", + "settings.action_install": "インストール", + "settings.actor_host": "ホスト", + "settings.actor_remote": "リモート", + "settings.actor_unknown": "不明", + "settings.advanced": "詳細設定", + "settings.advanced_title": "詳細設定", + "settings.api_keys_info": "APIキーはOpenCodeによってローカルに保存されます。環境に基づくプロバイダーはワーカー環境で変更してからリロードしてください。", + "settings.appearance_hint": "システムに合わせるか、ライト/ダークモードを強制します。", + "settings.appearance_title": "外観", + "settings.audit_error": "エラー", + "settings.audit_loading": "読み込み中", + "settings.audit_log_title": "監査ログ", + "settings.audit_ready": "準備完了", + "settings.auto_compact": "自動コンテキスト圧縮", + "settings.auto_compact_desc": "このワークスペースのOpenCode compaction.autoを制御します。変更後にエンジンをリロードしてください。", + "settings.auto_update_desc": "アップデートを自動的にダウンロードします(インストール前に確認)。", + "settings.auto_update_title": "自動アップデート", + "settings.available_count": "{count}件利用可能", + "settings.background_checks_desc": "OpenWorkは起動時に常にチェックします。また1日1回バックグラウンドでチェックします。", + "settings.background_checks_title": "バックグラウンドチェック", + "settings.base_url_unavailable": "ベースURLが利用できません", + "settings.binary_unavailable": "バイナリが利用できません", + "settings.cache_nothing_to_repair": "OpenCodeキャッシュが見つかりません。修復の必要はありません。", + "settings.cache_repair_requires_desktop": "キャッシュの修復にはデスクトップアプリが必要です", + "settings.cache_repaired": "OpenCodeキャッシュを修復しました。エンジンが実行中だった場合は再起動してください。", + "settings.cap_browser_tools": "ブラウザツール: {value}", + "settings.cap_commands": "コマンド: {value}", + "settings.cap_config": "設定: {value}", + "settings.cap_file_tools": "ファイルツール: {value}", + "settings.cap_inbox_off": "インボックスオフ", + "settings.cap_inbox_on": "インボックスオン", + "settings.cap_mcp": "MCP: {value}", + "settings.cap_outbox_off": "アウトボックスオフ", + "settings.cap_outbox_on": "アウトボックスオン", + "settings.cap_plugins": "プラグイン: {value}", + "settings.cap_proxy": "プロキシ(OpenCodeRouter): {value}", + "settings.cap_read": "読み取り", + "settings.cap_sandbox": "サンドボックス: {value}", + "settings.cap_skills": "スキル: {value}", + "settings.cap_write": "書き込み", + "settings.capabilities_title": "OpenWorkサーバー機能", + "settings.capabilities_unavailable": "機能が利用できません。クライアントトークンで接続してください。", + "settings.change": "変更", + "settings.check_update": "確認", + "settings.checking_for_updates": "アップデートを確認中", + "settings.choose": "選択", + "settings.clear": "クリア", + "settings.clipboard_unavailable": "この環境ではクリップボードが利用できません。", + "settings.configure": "設定", + "settings.connect_opencode_hint": "プロバイダーを読み込むにはOpenCodeに接続してください。", + "settings.connect_provider": "プロバイダーを接続", + "settings.connected_count": "{count}件接続済み", + "settings.connection": "接続", + "settings.connection_failed": "接続に失敗しました", + "settings.connection_title": "接続", + "settings.copied_debug_report": "ランタイムレポートJSONをコピーしました。", + "settings.copy_failed": "ランタイムレポートのコピーに失敗しました。", + "settings.copy_json": "JSONをコピー", + "settings.custom_binary_hint": "ローカルのOpenCodeビルドを指定するために使用します", + "settings.custom_binary_label": "カスタムOpenCodeバイナリ", + "settings.data_dir_unavailable": "データディレクトリが利用できません", + "settings.debug_commit": "コミット: {sha}", + "settings.debug_desktop_app": "デスクトップアプリ: {version}", + "settings.debug_opencode_router_version": "OpenCodeRouter: {version}", + "settings.debug_opencode_version": "OpenCode: {version}", + "settings.debug_openwork_server_version": "OpenWorkサーバー: {version}", + "settings.debug_orchestrator_version": "オーケストレーター: {version}", + "settings.debug_section_title": "デベロッパー", + "settings.deeplink_failed": "ディープリンクを開けませんでした。", + "settings.deeplink_hint": "openwork://、openwork-dev://、またはhttps://share.openworklabs.com/b/...のURLを受け付けます。", + "settings.default_model": "デフォルトモデル", + "settings.delete_containers": "コンテナを削除中…", + "settings.delete_local_config": "ローカル状態を削除中…", + "settings.desktop_only_hint": "デスクトップアプリで利用可能です。", + "settings.dev_mode_badge": "デベロッパーモード", + "settings.developer": "デベロッパー", + "settings.developer_mode_desc": "デバッグツール、ダイアグノスティクス、デベロッパータブを有効にします。", + "settings.developer_mode_title": "デベロッパーモード", + "settings.developer_panel_disabled": "デベロッパーパネルが無効になりました。", + "settings.developer_panel_enabled": "デベロッパーパネルが有効になりました。", + "settings.devlog_cleared": "デベロッパーログ出力をクリアしました。", + "settings.devlog_clipboard_unavailable": "この環境ではクリップボードを使用できません。", + "settings.devlog_copied": "デベロッパーログ出力をコピーしました。", + "settings.devlog_copy_failed": "デベロッパーログ出力のコピーに失敗しました。", + "settings.devlog_export_failed": "デベロッパーログ出力のエクスポートに失敗しました。", + "settings.devlog_export_unavailable": "この環境ではエクスポートを使用できません。", + "settings.devlog_exported": "デベロッパーログ出力をエクスポートしました。", + "settings.devtools_desc": "サイドカーのヘルス、機能、監査証跡。", + "settings.devtools_title": "デベロッパーツール", + "settings.diag_approval": "承認: {mode}({ms}ms)", + "settings.diag_config_path": "設定パス: {path}", + "settings.diag_daemon_url": "デーモン: {url}", + "settings.diag_default": "デフォルト", + "settings.diag_health_port": "ヘルスポート: {port}", + "settings.diag_healthy_ms": "ヘルシー: {ms}ms", + "settings.diag_host_token_source": "ホストトークンソース: {source}", + "settings.diag_last_attempt": "最終試行: {time}", + "settings.diag_load_sessions_ms": "セッション読み込み: {ms}ms", + "settings.diag_opencode_binary": "OpenCodeバイナリ: {binary}", + "settings.diag_opencode_url": "OpenCode: {url}", + "settings.diag_pending_permissions_ms": "保留中の権限: {ms}ms", + "settings.diag_pid": "PID: {pid}", + "settings.diag_providers_ms": "プロバイダー: {ms}ms", + "settings.diag_read_only": "読み取り専用: {value}", + "settings.diag_reason": "理由: {reason}", + "settings.diag_runtime_workspace": "ランタイムワークスペース: {id}", + "settings.diag_selected_workspace": "選択されたワークスペース: {id}", + "settings.diag_sidecar": "サイドカー: {info}", + "settings.diag_started": "開始: {time}", + "settings.diag_token_source": "トークンソース: {source}", + "settings.diag_total_ms": "合計: {ms}ms", + "settings.diag_version": "バージョン: {version}", + "settings.diag_workspaces": "ワークスペース: {count}", + "settings.diagnostics_unavailable": "診断が利用できません。", + "settings.disable_developer_mode": "デベロッパーモードを無効化", + "settings.disabled": "無効", + "settings.disconnect": "切断", + "settings.disconnect_confirm_suffix": "{resolved}を切断しますか?このプロバイダーの保存済みAPIキーまたはOAuth認証情報が削除されます。", + "settings.disconnect_server": "サーバーを切断", + "settings.disconnected_prefix": "{resolved}を切断しました。", + "settings.disconnecting": "切断中…", + "settings.docker_containers_desc": "OpenWorkによって起動されたDockerコンテナを強制削除します。", + "settings.docker_containers_title": "OpenWork Dockerコンテナ", + "settings.docker_requires_desktop": "Dockerクリーンアップにはデスクトップアプリが必要です。", + "settings.done": "完了", + "settings.downloading_bytes": "{downloaded}をダウンロード中", + "settings.downloading_progress": "{downloaded}/{total}をダウンロード中({percent}%)", + "settings.enable_developer_mode": "デベロッパーモードを有効化", + "settings.enable_exa": "Exa ウェブ検索を有効化", + "settings.enable_exa_desc": "OpenWork OrchestratorがOpenCodeを起動する際に適用されます。", + "settings.enabled": "有効", + "settings.engine_bundled": "バンドル版(推奨)", + "settings.engine_bundled_hint": "バンドルエンジンが最も安定した選択肢です。システム", + "settings.engine_custom_binary": "カスタムバイナリ", + "settings.engine_desc": "OpenCodeのローカル実行方法を選択します。", + "settings.engine_runtime_label": "エンジンランタイム", + "settings.engine_source": "エンジンソース", + "settings.engine_source_debug": "エンジンソース", + "settings.engine_system_path": "システムインストール(PATH)", + "settings.engine_title": "エンジン", + "settings.exa_restart_hint": "この設定を変更した後、OpenCodeまたはオーケストレーターを再起動してください。", + "settings.export": "エクスポート", + "settings.export_failed": "ランタイムレポートのエクスポートに失敗しました。", + "settings.export_unavailable": "この環境ではエクスポートが利用できません。", + "settings.exported_debug_report": "ランタイムレポートJSONをエクスポートしました。", + "settings.failed": "失敗", + "settings.failed_open_providers": "プロバイダーを開けませんでした", + "settings.feedback_badge": "すべてのメッセージを読んでいます", + "settings.feedback_desc": "良い点や改善点を教えてください。フィードバックはチームに直接届き、次に何をリリースするかの優先順位付けに役立ちます。", + "settings.feedback_title": "OpenWorkを改善する", + "settings.group_global": "グローバル", + "settings.group_workspace": "ワークスペース", + "settings.hide_titlebar": "タイトルバーを非表示", + "settings.hide_titlebar_desc": "ウィンドウのタイトルバーを非表示にします。タイル型ウィンドウマネージャーに便利です。", + "settings.join_discord": "Discordに参加", + "settings.language": "言語", + "settings.language.description": "使用する言語を選択してください", + "settings.last_error": "最後のエラー", + "settings.last_stderr": "最後のstderr", + "settings.last_stdout": "最後のstdout", + "settings.loading_providers": "プロバイダーを読み込み中…", + "settings.logs_on_host": "ログはホストで確認できます。", + "settings.managed_by_env": "環境変数で管理", + "settings.messaging_bridge_service": "メッセージングブリッジサービス。", + "settings.messaging_section_desc": "「アイデンティティ」タブでTelegram/Slackアイデンティティとバインディングを管理します。", + "settings.messaging_section_title": "メッセージング", + "settings.model": "モデル", + "settings.model_behavior": "モデル動作", + "settings.model_behavior_desc": "デフォルトモデルピッカーを開いて、利用可能な場合に推論プロファイルを選択します。", + "settings.model_default": "デフォルト", + "settings.model_description": "実行のデフォルトとシンキング設定。", + "settings.model_description_default": "設定済みのプロバイダーから選択してください。この選択は新しいセッションに使用されます。", + "settings.model_description_session": "設定済みのプロバイダーから選択してください。この選択は次のメッセージに適用されます。", + "settings.model_fallback": "フォールバック", + "settings.model_reasoning": "推論", + "settings.model_section_desc": "デフォルトのチャットモデルを選択し、推論方法を確認します。", + "settings.model_title": "モデル", + "settings.no_access": "アクセスなし", + "settings.no_active_workspace": "アクティブなローカルワークスペースがありません。", + "settings.no_audit_entries": "まだ監査エントリがありません。", + "settings.no_binary_selected": "バイナリが選択されていません。", + "settings.no_custom_path_set": "カスタムパスが設定されていません", + "settings.no_project_directory": "プロジェクトディレクトリなし", + "settings.no_stderr": "まだstderrがキャプチャされていません。", + "settings.no_stdout": "まだstdoutがキャプチャされていません。", + "settings.no_worker_directory": "プロジェクトディレクトリなし", + "settings.no_worker_path": "ワーカーパスが利用できません", + "settings.nuke_confirm_dev": "この操作は元に戻せません。この開発ビルドのすべてのOpenWorkデータおよびすべてのOpenCode開発設定、認証、キャッシュ、データ、状態が削除され、その後OpenWorkが終了します。続行しますか?", + "settings.nuke_confirm_prod": "この操作は元に戻せません。この開発ビルドのすべてのOpenWorkデータおよびすべてのOpenCode開発設定、認証、キャッシュ、データ、状態が削除され、その後OpenWorkが終了します。続行しますか?", + "settings.nuke_failed": "OpenWorkとOpenCodeの状態の削除に失敗しました。", + "settings.nuke_hint": "デスクトップアプリとそのOpenCodeランタイム状態を完全にリセットする場合にのみ使用してください。", + "settings.nuke_success": "OpenWorkとOpenCodeの状態を削除しました。OpenWorkを終了しています…", + "settings.off": "オフ", + "settings.offline": "オフライン", + "settings.on": "オン", + "settings.open_deeplink_action": "開いています…", + "settings.open_deeplink_button": "開く", + "settings.open_deeplink_desc": "OpenWorkのディープリンクまたは共有URLを貼り付けて開きます。", + "settings.open_deeplink_title": "ディープリンクを開く", + "settings.opencode_cache": "OpenCodeキャッシュ", + "settings.opencode_cache_description": "エンジンの起動に使用されるキャッシュデータを修復します。安全に実行できます。", + "settings.opencode_engine_desc": "エージェント、ツール、モデルプロバイダーのローカルランタイム。", + "settings.opencode_engine_label": "OpenCodeエンジン", + "settings.opencode_engine_sidecar_desc": "ローカル実行サイドカー。", + "settings.opencode_router_sidecar": "OpenCodeRouterサイドカー", + "settings.opencode_runtime_desc": "ローカルエンジンとオーケストレーターブリッジのランタイムオプション。", + "settings.opencode_sdk_desc": "UI接続診断。", + "settings.opencode_sdk_title": "OpenCodeエンジン", + "settings.opencode_section_label": "OpenCode", + "settings.opencode_url_unavailable": "ベースURLが利用できません", + "settings.opening": "開いています…", + "settings.openwork_config_sidecar_desc": "設定と承認のサイドカー。", + "settings.openwork_diagnostics_title": "OpenWorkサーバー診断", + "settings.openwork_server_desc": "アプリ同期、ワーカー、リモート接続のセッションコントロールプレーン。", + "settings.openwork_server_label": "OpenWorkサーバー", + "settings.orchestrator_daemon_layer_desc": "ワークスペースオーケストレーション層。", + "settings.orchestrator_daemon_title": "オーケストレーターデーモン", + "settings.pending_permissions": "保留中の権限", + "settings.production_mode_badge": "プロダクション", + "settings.provider_default_desc": "モデルの組み込みデフォルト推論動作を使用します。", + "settings.provider_default_label": "プロバイダーのデフォルト", + "settings.provider_source_config": "設定", + "settings.provider_source_custom": "カスタム", + "settings.provider_source_env": "環境変数", + "settings.providers_desc": "モデルとツール用のサービスを接続します。", + "settings.providers_title": "プロバイダー", + "settings.quit_hint": "OpenWorkはクリーンアップ後すぐに終了し、次回起動時にこのモードのクリーンなローカル状態から開始します。", + "settings.recent_events": "最近のイベント", + "settings.reconnect_failed": "再接続に失敗しました。サーバーURL/トークンを確認して再試行してください。", + "settings.reconnect_server": "再接続中…", + "settings.reconnect_server_failed": "OpenWorkサーバーへの再接続に失敗しました。", + "settings.reconnected": "OpenWorkサーバーに再接続しました。", + "settings.reconnecting": "再接続中…", + "settings.removing_containers": "コンテナを削除中…", + "settings.removing_local_state": "ローカル状態を削除中…", + "settings.repair_cache": "キャッシュを修復", + "settings.repairing_cache": "キャッシュ修復中", + "settings.report_issue": "問題を報告", + "settings.reset": "リセット", + "settings.reset_app_data": "アプリデータをリセット", + "settings.reset_app_data_description": "より強力なリセット。OpenWorkのキャッシュとアプリデータをクリアします。", + "settings.reset_app_data_title": "アプリデータをリセット", + "settings.reset_app_data_warning": "このデバイスのOpenWorkキャッシュとアプリデータをクリアします。", + "settings.reset_button": "リセット", + "settings.reset_cancel": "キャンセル", + "settings.reset_config_defaults": "リセット中…", + "settings.reset_config_failed": "アプリ設定のリセットに失敗しました。", + "settings.reset_confirm_button": "リセットして再起動", + "settings.reset_confirmation_hint": "確認のため RESET と入力してください。OpenWorkが再起動されます。", + "settings.reset_confirmation_label": "確認", + "settings.reset_confirmation_placeholder": "RESETと入力", + "settings.reset_onboarding": "オンボーディングをリセット", + "settings.reset_onboarding_description": "OpenWorkの設定をクリアしてアプリを再起動します。", + "settings.reset_onboarding_title": "オンボーディングをリセット", + "settings.reset_onboarding_warning": "OpenWorkのローカル設定とワークスペースのオンボーディングマーカーをクリアします。", + "settings.reset_openwork_desc_dev": "開発モードが有効な場合、openwork-dev-data内のOpenCode開発状態のみをクリアします。", + "settings.reset_openwork_desc_prod": "開発モードが有効な場合、openwork-dev-data内のOpenCode開発状態のみをクリアします。", + "settings.reset_openwork_title": "OpenWork + OpenCodeの状態をリセット", + "settings.reset_recovery_desc": "データをクリアするか、セットアップフローを再実行します。", + "settings.reset_recovery_title": "リセットとリカバリー", + "settings.reset_requires_confirm": "RESETの入力が必要で、アプリが再起動します。", + "settings.reset_startup": "デフォルト起動モードをリセット", + "settings.reset_startup_pref": "起動設定をリセット", + "settings.reset_stop_active_runs": "リセットする前にアクティブな実行を停止してください。", + "settings.resetting": "リセット中…", + "settings.restart_blocked_message": "このアップデートを完了するにはOpenWorkの再起動が必要です。作業を中断しないため、アクティブな実行が終了するか停止するまでインストールは一時停止しています。", + "settings.restart_failed": "再起動に失敗しました。ログを確認してもう一度試してください。", + "settings.restart_local_server": "再起動中…", + "settings.restart_opencode": "再起動中…", + "settings.restart_opencode_router": "再起動中…", + "settings.restart_openwork_server": "OpenWorkサーバーを再起動中…", + "settings.restart_orchestrator": "オーケストレーターを再起動中…", + "settings.restart_server_failed": "ローカルサーバーの再起動に失敗しました。", + "settings.restarted": "ローカルサーバーを再起動しました。", + "settings.restarting": "再起動中…", + "settings.reveal_config": "設定ファイルを開く", + "settings.reveal_config_failed": "ワークスペース設定の表示に失敗しました。", + "settings.reveal_config_requires_desktop": "設定の表示にはデスクトップアプリが必要です", + "settings.revealed_workspace_config": "ワークスペース設定を表示しました。", + "settings.run_sandbox_probe": "プローブを実行中…", + "settings.running_probe": "プローブを実行中…", + "settings.runtime_applies_hint": "次回エンジン起動またはリロード時に適用されます。", + "settings.runtime_debug_desc": "ワンクリックエクスポート付きの読みやすい診断スナップショット。", + "settings.runtime_debug_title": "ランタイムデバッグレポート", + "settings.runtime_desc": "ローカルエンジンとOpenWorkサーバーのステータス。", + "settings.runtime_direct": "ダイレクト(OpenCode)", + "settings.runtime_orchestrator": "OpenWork Orchestrator", + "settings.runtime_title": "ランタイム", + "settings.sandbox_error": "エラー", + "settings.sandbox_export_hint": "上のランタイムデバッグレポートのエクスポートを使用して", + "settings.sandbox_probe_desc": "一時的なDockerサンドボックスの起動チェックを実行し、", + "settings.sandbox_probe_errors": "サンドボックスプローブがエラー付きで完了しました。", + "settings.sandbox_probe_failed": "サンドボックスプローブに失敗しました。", + "settings.sandbox_probe_success": "サンドボックスプローブに成功しました。サポート用にデバッグレポートをエクスポートしてください。", + "settings.sandbox_probe_title": "サンドボックスプローブ", + "settings.sandbox_ready": "準備完了", + "settings.sandbox_requires_desktop": "サンドボックスプローブにはデスクトップアプリが必要です", + "settings.sandbox_result": "結果: {status}", + "settings.sandbox_run_id": "実行ID: {id}", + "settings.sandbox_stop_runs_hint": "プローブの前にアクティブな実行を停止してください", + "settings.search_models": "モデルを検索…", + "settings.select_binary": "OpenCodeバイナリを選択", + "settings.select_workspace_first": "設定を表示する前にローカルワークスペースを選択してください。", + "settings.send_feedback": "フィードバックを送信", + "settings.service_restarts_desc": "この画面を離れずに特定のホストサービスを再起動します。", + "settings.service_restarts_title": "サービス再起動", + "settings.session_model": "モデル", + "settings.show_model_reasoning": "モデルの推論を表示", + "settings.show_model_reasoning_desc": "モデルが推論トレースを提供する場合、UIで展開表示します。", + "settings.showing_models": "{total}件中{count}件を表示", + "settings.sidecar_config_unavailable": "サイドカー設定が利用できません", + "settings.startup": "起動", + "settings.startup_local": "ローカルサーバーを起動", + "settings.startup_not_set": "サーバーに接続", + "settings.startup_remote_warning": "起動設定は現在リモートです。エンジン設定は", + "settings.startup_reset_hint": "保存された設定をクリアし、接続画面を表示します。", + "settings.startup_server": "サーバーに接続", + "settings.startup_title": "起動", + "settings.stop_local_server": "ローカルサーバーを停止", + "settings.stop_runs_before_cleanup": "クリーンアップの前にアクティブな実行を停止してください", + "settings.stop_runs_before_reset_config": "設定リセットの前にアクティブな実行を停止してください", + "settings.stop_runs_to_reset": "リセットするにはアクティブな実行を停止してください", + "settings.switch": "切り替え", "settings.tab_advanced": "詳細", "settings.tab_appearance": "外観", "settings.tab_automations": "オートメーション", - "settings.tab_cloud": "Cloud", + "settings.tab_cloud": "クラウド", "settings.tab_debug": "デバッグ", + "settings.tab_description_advanced": "初期設定をやり直すためにOpenWorkのローカル状態をリセットします。", + "settings.tab_description_appearance": "テーマとユーザーインターフェースの外観をカスタマイズします。", + "settings.tab_description_automations": "スケジュール済みタスク、テンプレート、ワーカーの実行を管理します。", + "settings.tab_description_debug": "ランタイムダイアログ、ログ、低レベルデバッグユーティリティを確認します。", + "settings.tab_description_den": "OpenWork Cloud接続、ホストワーカー、ワークスペースアクセスを管理します。", + "settings.tab_description_extensions": "このワークスペースのMCPアプリとOpenCodeプラグインを管理します。", + "settings.tab_description_general": "プロバイダーを接続し、デフォルトモデルを選択し、フォルダへのアクセスを許可し、OpenWorkワークスペースとそのランタイム接続を管理します。", + "settings.tab_description_messaging": "ワークスペース設定からルーターアイデンティティとインボックス動作を設定します。", + "settings.tab_description_model": "デフォルトモデル、ランタイム動作、アシスタント出力設定を調整します。", + "settings.tab_description_recovery": "マイグレーション状態を修復し、ワークスペースのデフォルトをリセットし、ローカル設定を復元します。", + "settings.tab_description_skills": "カスタムスキルをこのワークスペースに作成、保存、実行します。", + "settings.tab_description_updates": "OpenWorkを最新の状態に保ちます。", "settings.tab_extensions": "拡張機能", "settings.tab_general": "設定", "settings.tab_messaging": "メッセージ", + "settings.tab_model": "モデル", "settings.tab_recovery": "リカバリー", "settings.tab_skills": "スキル", "settings.tab_updates": "アップデート", - - // ==================== Share workspace modal ==================== + "settings.theme_dark": "ダーク", + "settings.theme_light": "ライト", + "settings.theme_system": "システム", + "settings.theme_system_hint": "システムモードはOSの設定に自動的に従います。", + "settings.toolbar_ready_to_install": "インストール準備完了", + "settings.update": "アップデート", + "settings.update_available": "アップデート利用可能: v", + "settings.update_available_version": "アップデート利用可能: v{version}", + "settings.update_check_button": "確認", + "settings.update_check_failed": "アップデートの確認に失敗しました", + "settings.update_checking": "確認中…", + "settings.update_download_button": "ダウンロード", + "settings.update_downloading": "ダウンロード中…", + "settings.update_error": "アップデートの確認に失敗しました", + "settings.update_install_button": "インストールして再起動", + "settings.update_last_checked": "最終確認 {time}", + "settings.update_published": "公開日 {date}", + "settings.update_ready": "インストール準備完了: v", + "settings.update_ready_version": "インストール準備完了: v{version}", + "settings.update_uptodate": "最新です", + "settings.updates": "アップデート", + "settings.updates_desc": "OpenWorkを最新の状態に保ちます。", + "settings.updates_desktop_only": "アップデートはデスクトップアプリでのみ利用可能です。", + "settings.updates_not_supported": "この環境ではアップデートはサポートされていません。", + "settings.updates_title": "アップデート", + "settings.version": "バージョン", + "settings.versions_desc": "サイドカーとデスクトップのビルド情報。", + "settings.versions_title": "バージョン", + "settings.window_appearance_desc": "ウィンドウの外観をカスタマイズします。", + "settings.worker_id_label": "ワーカー{id}", + "settings.worker_unresolved": "ワーカー{runtimeWorkspaceId}", + "settings.workspace_config_desc": ".opencode/openwork.json", + "settings.workspace_config_title": "ワークスペース設定", + "settings.workspace_debug_events_label": "ワークスペースデバッグイベント", + "settings.workspace_fallback_name": "ワークスペース", "share.active_cloud_org": "アクティブなCloud組織", "share.back_hint": "共有オプションに戻る", "share.chooser_subtitle": "このワークスペースの共有方法を選択してください。", @@ -1538,8 +1769,33 @@ export default { "share.workspace_fallback": "ワークスペース", "share.workspace_template_desc": "コアセットアップとワークスペースのデフォルトを共有します。", "share.workspace_template_title": "ワークスペーステンプレート", - - // ==================== Sidebar ==================== + "share_skill_destination.add_to_workspace": "ワークスペースに追加", + "share_skill_destination.adding": "追加中…", + "share_skill_destination.confirm_busy": "スキルを追加中…", + "share_skill_destination.confirm_button": "ワークスペースにスキルを追加", + "share_skill_destination.connect_remote": "リモートワークスペースに接続", + "share_skill_destination.connect_remote_desc": "OpenWorkホストを接続し、リストから選択してこのスキルをインポートします。", + "share_skill_destination.connect_remote_hint": "リモートワークスペースに接続してからリストで選択してください。", + "share_skill_destination.create_worker": "新しいワークスペースを作成", + "share_skill_destination.create_worker_desc": "ワークスペースセットアップフローを開き、新しいワークスペースの準備ができたらこのスキルを追加します。", + "share_skill_destination.create_worker_hint": "新しいワークスペースを作成してこのスキルを追加します。", + "share_skill_destination.current_badge": "現在", + "share_skill_destination.existing_workers": "既存のワークスペース", + "share_skill_destination.fallback_skill_name": "共有スキル", + "share_skill_destination.footer_idle": "続行するにはワークスペースを選択してください。", + "share_skill_destination.footer_selected": "選択されたワークスペース:", + "share_skill_destination.local_badge": "ローカル", + "share_skill_destination.more_options": "その他のオプション", + "share_skill_destination.new_destination": "新しい送信先", + "share_skill_destination.no_workers": "まだ準備できたワークスペースがありません。このスキルをインストールするには、ワークスペースを作成するかリモートワークスペースに接続してください。", + "share_skill_destination.remote_badge": "リモート", + "share_skill_destination.sandbox_badge": "サンドボックス", + "share_skill_destination.selected_badge": "選択済み", + "share_skill_destination.selected_hint": "選択済み。下の送信先を確認してから確定してください。", + "share_skill_destination.skill_label": "共有スキル", + "share_skill_destination.subtitle": "共有されたスキルをインポートする前に、既存のワークスペースを選択するか新しいワークスペースを作成してください。", + "share_skill_destination.title": "このスキルをどこに追加しますか?", + "share_skill_destination.trigger_label": "トリガー", "sidebar.active": "アクティブ", "sidebar.add_workspace": "新しいワークスペースを追加", "sidebar.collapse": "折りたたむ", @@ -1551,20 +1807,19 @@ export default { "sidebar.import_config": "設定をインポート", "sidebar.needs_attention": "要確認", "sidebar.new_worker": "新しいワーカー", - "sidebar.no_sessions_yet": "まだセッションがありません", "sidebar.no_workspaces": "このセッションにはまだワークスペースがありません。追加して始めましょう。", "sidebar.progress": "進行状況", - "sidebar.remove_workspace": "ワークスペースを削除", "sidebar.show_fewer": "表示を減らす", "sidebar.show_more": "さらに{count}件表示", "sidebar.stop_sandbox": "サンドボックスを停止", "sidebar.switch": "切り替え", "sidebar.test_connection": "接続テスト", - - // ==================== Skills (additions) ==================== + "skills.add_custom_repo": "カスタムGitHubリポを追加", + "skills.add_git_repo": "Gitリポを追加", + "skills.add_openwork_hub": "OpenWork Hubを追加", + "skills.available_from_hub": "ハブから利用可能", "skills.catalog_search_placeholder": "インストール済み、チーム、ハブのスキルを検索", "skills.cloud_add_skill": "スキルを追加", - "skills.cloud_badge": "Cloud", "skills.cloud_choose_org_detail": "Cloudパネルでアクティブな組織を選択してから、このリストを更新してください。", "skills.cloud_choose_org_hint": "チームスキルを読み込むには設定→Cloudで組織を選択してください。", "skills.cloud_footer_label": "チーム", @@ -1584,40 +1839,183 @@ export default { "skills.cloud_shared_public": "公開", "skills.cloud_sign_in": "Cloudにサインイン", "skills.cloud_sign_in_hint": "チームおよび組織のスキルを参照するにはOpenWork Cloudにサインインしてください。", + "skills.copy_link_failed": "リンクのコピーに失敗しました", + "skills.create_in_chat": "チャットでスキルを作成", + "skills.desktop_required": "スキル管理にはデスクトップアプリが必要です。", + "skills.enter_plugin_name": "プラグインパッケージ名を入力してください。", + "skills.failed_load_active": "アクティブなプラグインの読み込みに失敗しました。", + "skills.failed_load_opencode": "opencode.jsonの読み込みに失敗しました", + "skills.failed_parse_opencode": "opencode.jsonの解析に失敗しました", + "skills.failed_to_load": "スキルの読み込みに失敗しました", + "skills.failed_update_opencode": "opencode.jsonの更新に失敗しました", "skills.filter_all": "すべて", "skills.filter_cloud": "チーム", "skills.filter_hub": "ハブ", "skills.filter_installed": "インストール済み", - - // ==================== Status bar ==================== + "skills.from_repo": "{owner}/{repo}から", + "skills.github_repo_hint": "owner/repo形式でGitHubリポジトリを入力してください。", + "skills.host_mode_only": "ローカルワークスペースのみ", + "skills.host_only_error": "スキル管理にはローカルワークスペースまたは接続されたOpenWorkサーバーが必要です。", + "skills.hub_desc": "GitHubベースのハブから共有スキルを閲覧し、このワーカーに追加します。", + "skills.hub_label": "ハブ", + "skills.import": "インポート", + "skills.import_failed": "インポートに失敗しました({status})", + "skills.import_local": "ローカルスキルをインポート", + "skills.import_local_hint": "既存のスキルフォルダをこのワークスペースにコピーします。", + "skills.import_local_skill": "ローカルスキルをインポート", + "skills.imported": "インポート完了。", + "skills.install": "インストール", + "skills.install_failed": "スキルのインストールに失敗しました。", + "skills.install_name_title": "{name}をインストール", + "skills.install_skill_creator": "スキルクリエイターをインストール", + "skills.install_skill_creator_hint": "このスキルを使って、チャット内から他のスキルを作成できます。", + "skills.installed": "インストール済みスキル", + "skills.installed_desc": "インストール済みスキルはこのワーカーで実行でき、編集または共有できます。", + "skills.installed_label": "インストール済み", + "skills.installed_status": "インストール済み", + "skills.installing": "スキルを追加", + "skills.installing_prefix": "{name}をインストール中…", + "skills.installing_skill_creator": "スキルクリエイターをインストール中…", + "skills.link_copied": "リンクをコピーしました", + "skills.loading": "読み込み中…", + "skills.no_description": "説明はまだありません。", + "skills.no_hub_repo_label": "ハブリポが選択されていません", + "skills.no_hub_repo_selected": "ハブスキルが利用できません。", + "skills.no_hub_skills": "ハブリポが選択されていません。スキルを閲覧するにはGitHubリポを追加してください。", + "skills.no_opencode_found": "opencode.jsonがまだ見つかりません。プラグインを追加して作成してください。", + "skills.no_opencode_workspace": "このワークスペースにはまだopencode.jsonがありません。", + "skills.no_skills": "`.opencode/skills`、`.claude/skills`、`~/.agents/skills`にスキルが検出されませんでした。", + "skills.no_skills_found": "まだスキルが見つかりません。", + "skills.owner_label": "オーナー", + "skills.owner_repo_required": "オーナーとリポは必須です。", + "skills.pick_project_first": "最初にプロジェクトフォルダを選択してください。", + "skills.pick_project_for_active": "アクティブなプラグインを読み込むにはプロジェクトフォルダを選択してください。", + "skills.pick_project_for_plugins": "プロジェクトのプラグインを管理するにはプロジェクトフォルダを選択してください。", + "skills.pick_workspace_first": "最初にワークスペースフォルダを選択してください。", + "skills.plugin_already_listed": "プラグインは既にopencode.jsonに登録されています。", + "skills.plugin_management_host_only": "プラグイン管理にはデスクトップアプリが必要です。", + "skills.plugins_host_only": "プラグインはデスクトップアプリでのみ利用可能です。", + "skills.ref_label": "Ref(ブランチ/タグ/コミット)", + "skills.refresh": "更新", + "skills.refresh_hub": "ハブを更新", + "skills.refresh_hub_title": "ハブカタログを更新", + "skills.remove_saved_repo": "保存済みリポを削除", + "skills.repo_label": "リポ", + "skills.reveal_failed": "スキルフォルダを開けませんでした。", + "skills.reveal_folder": "スキルフォルダを開く", + "skills.reveal_folder_hint": "スキルディレクトリをFinderで開きます。", + "skills.save_and_load": "保存して読み込み", + "skills.save_failed": "スキルの保存に失敗しました。", + "skills.select_skill_folder": "スキルフォルダを選択", + "skills.share_back": "戻る", + "skills.share_chooser_subtitle": "OpenWork Cloudの組織に保存するか、公開インストールリンクを発行します。", + "skills.share_close": "閉じる", + "skills.share_copy_link": "コピー", + "skills.share_done": "完了", + "skills.share_option_public_desc": "誰でもこのスキルをインストールできるリンクを作成します。", + "skills.share_option_public_title": "公開リンク", + "skills.share_option_team_desc": "アクティブなOpenWork Cloud組織にこのスキルを追加します。", + "skills.share_option_team_title": "チームと共有", + "skills.share_public_create": "リンクを作成", + "skills.share_public_creating": "公開中…", + "skills.share_public_intro": "公開リンクを発行します。URLを知っている人は誰でもインストールできます。", + "skills.share_public_regenerate": "リンクを再発行", + "skills.share_publisher_label": "パブリッシャー", + "skills.share_subtitle_public": "リンクを知っている人は誰でもこのスキルをインストールできます。", + "skills.share_subtitle_team": "チーム向けに組織に保存されます。", + "skills.share_team_choose_org": "チーム共有の前に設定のCloudで組織を選んでください。", + "skills.share_team_hub_label": "スキルハブに追加(任意)", + "skills.share_team_hub_none": "組織のみ — ハブには入れない", + "skills.share_team_hubs_loading": "ハブを読み込み中…", + "skills.share_team_intro": "チームがCloudからインストールできるよう、アクティブな組織に保存します。", + "skills.share_team_org_fallback": "アクティブなCloud組織", + "skills.share_team_save": "チームに保存", + "skills.share_team_saving": "保存中…", + "skills.share_team_sign_in": "チーム共有のためにサインイン", + "skills.share_team_sign_in_hint": "ブラウザでOpenWork Cloudが開きます。サインイン後にここに戻ってください。", + "skills.share_team_success": "{org} に保存しました。チームは組織スキルからインストールできます。", + "skills.share_title": "スキルを共有", + "skills.shown_count": "{count}件表示", + "skills.skill_creator_already_installed": "スキルクリエイターは既にインストール済みです。", + "skills.skill_creator_installed": "スキルクリエイターをインストールしました。", + "skills.skill_load_failed": "スキルの読み込みに失敗しました。", + "skills.source_label": "ソース", + "skills.subtitle": "このワークスペースのスキルを管理します。", + "skills.title": "スキル", + "skills.trigger_label": "トリガー: {trigger}", + "skills.uninstall": "アンインストール", + "skills.uninstall_failed": "スキルのアンインストールに失敗しました。", + "skills.uninstall_title": "スキルをアンインストールしますか?", + "skills.uninstall_warning": "ワークスペースから`{name}`スキルを完全に削除します。", + "skills.uninstalled": "スキルを削除しました。", + "skills.unknown_error": "不明なエラー", + "skills.worker_profile_desc": "スキルはこのワーカーの主要な機能です。ハブから探し、インストール済みのものを管理し、チャットから直接作成できます。", "status.back": "前の画面に戻る", + "status.connected": "接続済み", + "status.connecting": "接続中", + "status.creating_task": "新しいタスクを作成中", + "status.creating_workspace": "ワークスペースを作成中", "status.developer_mode": "デベロッパーモード", + "status.disconnected": "切断済み", "status.disconnected_hint": "設定を開いて再接続してください", "status.disconnected_label": "切断済み", + "status.disconnecting": "切断中", "status.feedback": "フィードバック", + "status.idle": "アイドル", + "status.installing_opencode": "OpenCodeをインストール中", "status.limited_hint": "再接続してOpenWorkの全機能を復元", "status.limited_mcp_hint": "{count}件のMCP接続済み · 全機能には再接続が必要", "status.limited_mode": "制限モード", + "status.live": "ライブ", + "status.loading_session": "セッションを読み込み中", "status.mcp_connected": "{count}件のMCP接続済み", "status.openwork_ready": "OpenWork準備完了", "status.providers_connected": "{count}件のプロバイダーが接続済み", "status.ready_for_tasks": "新しいタスクの準備完了", + "status.reloading_engine": "エンジンをリロード中", + "status.restarting_engine": "エンジンを再起動中", + "status.running": "実行中", "status.send_feedback": "フィードバックを送信", "status.settings": "設定", - - // ==================== Workspace (additions) ==================== - "workspace.active": "アクティブ", + "status.starting_engine": "エンジンを起動中", + "system.cache_repair_requires_desktop": "キャッシュの修復にはデスクトップアプリが必要です。", + "system.docker_cleanup_requires_desktop": "Dockerクリーンアップにはデスクトップアプリが必要です。", + "system.reload_body_agents": "OpenCodeは起動時にエージェントを読み込みます。更新されたエージェントを利用可能にするにはエンジンをリロードしてください。", + "system.reload_body_commands": "OpenCodeは起動時にコマンドを読み込みます。更新されたコマンドを利用可能にするにはエンジンをリロードしてください。", + "system.reload_body_config": "OpenCodeは起動時にopencode.jsonを読み込みます。設定変更を適用するにはエンジンをリロードしてください。", + "system.reload_body_default": "OpenWorkがOpenCodeインスタンスのリロードが必要な変更を検出しました。", + "system.reload_body_mcp": "OpenCodeは起動時にMCPサーバーを読み込みます。新しい接続を有効にするにはエンジンをリロードしてください。", + "system.reload_body_mixed": "OpenWorkがOpenCode設定の変更を検出しました。エンジンをリロードして適用してください。", + "system.reload_body_plugins": "OpenCodeは起動時にnpmプラグインを読み込みます。opencode.jsonの変更を適用するにはエンジンをリロードしてください。", + "system.reload_body_skills": "OpenCodeはスキルの検出/状態をキャッシュできます。新しくインストールしたスキルを利用可能にするにはエンジンをリロードしてください。", + "system.reload_failed": "エンジンのリロードに失敗しました。", + "system.reload_required": "リロードが必要", + "system.reload_unavailable": "このワーカーではリロードできません。", + "system.stop_active_runs_before_reset": "リセットする前にアクティブな実行を停止してください。", + "system.stop_runs_before_update": "アップデートをインストールする前にアクティブな実行を停止してください。", + "system.updates_not_supported": "この環境ではアップデートはサポートされていません。", + "time.hours_ago": "{count}時間前", + "time.just_now": "たった今", + "time.minutes_ago": "{count}分前", + "time.seconds_ago": "{count}秒前", "workspace.loading_tasks": "タスクを読み込み中…", "workspace.local_badge": "ローカル", - "workspace.needs_attention": "要確認", "workspace.new_task_inline": "+ 新しいタスク", "workspace.no_tasks": "まだタスクがありません。", "workspace.remote_badge": "リモート", + "workspace.rename_description": "サイドバーに表示される名前を更新します。", + "workspace.rename_label": "ワークスペース名", + "workspace.rename_placeholder": "デザインチームワークスペース", + "workspace.rename_title": "ワークスペース名を編集", "workspace.sandbox_badge": "サンドボックス", "workspace.selected": "選択済み", "workspace.switch": "切り替え", - - // ==================== Workspace Session List ==================== + "workspace.switching_status_connecting": "接続を確認中", + "workspace.switching_status_loading": "最近のタスクを読み込み中", + "workspace.switching_status_preparing": "準備しています", + "workspace.switching_subtitle": "最近の作業をすぐにお見せします。", + "workspace.switching_title": "{name} を開いています", + "workspace.switching_title_unknown": "ワークスペースを開いています", "workspace_list.add_workspace": "ワークスペースを追加", "workspace_list.connect_remote": "リモートワークスペースに接続", "workspace_list.connecting": "接続中…", @@ -1641,8 +2039,6 @@ export default { "workspace_list.test_connection": "接続テスト", "workspace_list.workspace_fallback": "ワークスペース", "workspace_list.workspace_options": "ワークスペースオプション", - - // ==================== Workspace Right Sidebar ==================== "workspace_sidebar.automations": "オートメーション", "workspace_sidebar.close_sidebar": "サイドバーを閉じる", "workspace_sidebar.collapse_sidebar": "サイドバーを折りたたむ", diff --git a/apps/app/src/i18n/locales/pt-BR.ts b/apps/app/src/i18n/locales/pt-BR.ts index c64ff2244..dbf2a9dd4 100644 --- a/apps/app/src/i18n/locales/pt-BR.ts +++ b/apps/app/src/i18n/locales/pt-BR.ts @@ -4,880 +4,16 @@ */ export default { - // ==================== Dashboard ==================== - "dashboard.title": "Dashboard", - "dashboard.sessions": "Sessões", - "dashboard.commands": "Comandos", - "dashboard.skills": "Skills", - "dashboard.plugins": "Plugins", - "dashboard.mcps": "Apps", - "dashboard.settings": "Configurações", - "dashboard.home": "Home", - "dashboard.runs": "Execuções", - "dashboard.find_workspace": "Buscar workspace...", - "dashboard.workspaces": "Workspaces", - "dashboard.no_workspaces": "Nenhum workspace correspondente.", - "dashboard.new_workspace": "Novo Workspace...", - "dashboard.new_remote_workspace": "Adicionar Workspace Remoto...", - "dashboard.forget_workspace": "Esquecer workspace", - "dashboard.remote": "Remoto", - "dashboard.connection": "Conexão", - "dashboard.local_engine": "Engine Local", - "dashboard.client_mode": "Modo Cliente", - "dashboard.connected": "Conectado", - "dashboard.not_connected": "Não conectado", - "dashboard.stop_disconnect": "Parar e Desconectar", - "dashboard.disconnect": "Desconectar", - "dashboard.new_task": "Nova Tarefa", - "dashboard.new": "Novo", - "dashboard.busy": "Ocupado", - "dashboard.hero_title": "O que vamos fazer hoje?", - "dashboard.hero_description": "Descreva um resultado. O OpenWork vai executar e manter um histórico de auditoria.", - "dashboard.quick_start_commands": "Comandos de Início Rápido", - "dashboard.view_all": "Ver todos", - "dashboard.no_commands": "Nenhum comando ainda. Comandos iniciais aparecerão aqui.", - "dashboard.run_command": "Executar um comando salvo", - "dashboard.recent_sessions": "Sessões Recentes", - "dashboard.this_workspace": "este workspace", - "dashboard.no_sessions": "Nenhuma sessão ainda.", - "dashboard.idle": "Ocioso", - "dashboard.running": "Em execução", - "dashboard.completed": "Concluído", - "dashboard.failed": "Falhou", - "dashboard.repairing_cache": "Reparando cache", - "dashboard.repair_cache": "Reparar cache", - "dashboard.retry": "Tentar novamente", - "dashboard.alpha": "Alpha", - "dashboard.create_workspace_title": "Criar Workspace", - "dashboard.create_workspace_subtitle": "Inicializar um novo workspace baseado em pasta.", - "dashboard.create_workspace_confirm": "Criar Workspace", - "dashboard.create_sandbox_confirm": "Criar como sandbox", - "share_skill_destination.title": "Para onde esta skill deve ir?", - "share_skill_destination.subtitle": "Escolha um workspace existente ou crie um novo antes de importar esta skill compartilhada.", - "share_skill_destination.skill_label": "Skill compartilhada", - "share_skill_destination.fallback_skill_name": "Skill compartilhada", - "share_skill_destination.trigger_label": "Gatilho", - "share_skill_destination.current_badge": "Atual", - "share_skill_destination.existing_workers": "Workspaces existentes", - "share_skill_destination.no_workers": "Nenhum workspace está pronto ainda. Crie um ou conecte um workspace remoto para instalar esta skill.", - "share_skill_destination.new_destination": "Novo destino", - "share_skill_destination.selection_ready": "Pronto para adicionar", - "share_skill_destination.selected_badge": "Selecionado", - "share_skill_destination.selected_hint": "Selecionado. Revise o destino abaixo e confirme.", - "share_skill_destination.footer_idle": "Escolha um workspace para continuar.", - "share_skill_destination.footer_selected": "Workspace selecionado:", - "share_skill_destination.confirm_button": "Adicionar skill ao workspace", - "share_skill_destination.confirm_busy": "Adicionando skill...", - "share_skill_destination.local_badge": "Local", - "share_skill_destination.remote_badge": "Remoto", - "share_skill_destination.sandbox_badge": "Sandbox", - "share_skill_destination.create_worker": "Criar novo workspace", - "share_skill_destination.create_worker_desc": "Abrir o fluxo de configuração do workspace e adicionar esta skill após o novo workspace estar pronto.", - "share_skill_destination.connect_remote": "Conectar workspace remoto", - "share_skill_destination.connect_remote_desc": "Vincular um host OpenWork e selecioná-lo na lista para importar esta skill.", - "dashboard.sandbox_get_ready_title": "Sandboxes precisam do Docker", - "dashboard.sandbox_get_ready_action": "Preparar o sistema", - "dashboard.sandbox_get_ready_desc": "Execute este workspace em um container Docker isolado para execuções mais seguras e reproduzíveis.", - "dashboard.sandbox_checking_docker": "Verificando Docker...", - "dashboard.create_remote_workspace_title": "Adicionar Workspace Remoto", - "dashboard.create_remote_workspace_subtitle": "Salvar um servidor OpenWork como workspace.", - "dashboard.create_remote_workspace_confirm": "Adicionar Workspace", - "dashboard.edit_remote_workspace_title": "Editar Conexão Remota", - "dashboard.edit_remote_workspace_subtitle": "Atualizar os dados do servidor OpenWork para este workspace.", - "dashboard.edit_remote_workspace_confirm": "Salvar conexão", - "dashboard.remote_workspace_title": "Workspace remoto", - "dashboard.remote_workspace_hint": "Acompanhe um servidor OpenWork e reconecte a qualquer momento.", - "dashboard.remote_base_url_label": "URL do servidor OpenWork", - "dashboard.remote_base_url_placeholder": "http://127.0.0.1:", - "dashboard.remote_base_url_required": "Adicione uma URL de servidor para continuar.", - "dashboard.openwork_host_label": "URL do servidor OpenWork", - "dashboard.openwork_host_placeholder": "https://seu-servidor.openwork.app", - "dashboard.openwork_host_hint": "Use a URL fornecida pelo seu servidor OpenWork.", - "dashboard.openwork_host_token_label": "Token de colaborador ou proprietário", - "dashboard.openwork_host_token_placeholder": "Cole seu token", - "dashboard.openwork_host_token_hint": "Opcional. Cole um token de colaborador para acesso rotineiro ou um token de proprietário quando este cliente precisar responder a prompts de permissão.", - "dashboard.remote_mode_openwork_alpha": "Servidor OpenWork", - "dashboard.remote_mode_direct": "Direto (legado)", - "dashboard.remote_connection_openwork": "OpenWork", - "dashboard.remote_connection_direct": "Direto", - "dashboard.remote_directory_label": "Diretório do workspace (opcional)", - "dashboard.remote_directory_placeholder": "/home/equipe/projeto", - "dashboard.remote_directory_hint": "Deixe em branco para usar o padrão do servidor.", - "dashboard.remote_display_name_label": "Nome de exibição (opcional)", - "dashboard.remote_display_name_placeholder": "Workspace da equipe de design", - "dashboard.select_folder": "Selecionar Pasta", - "dashboard.choose_folder": "Escolher uma pasta", - "dashboard.choose_folder_next": "Compartilhar arquivos com seu workspace.", - "dashboard.change": "Alterar", - "dashboard.opening": "Abrindo...", - "dashboard.choose_preset": "Escolher Predefinição", - "dashboard.choose_folder_continue": "Escolha uma pasta para continuar.", - "dashboard.starter_workspace": "Workspace inicial", - "dashboard.starter_workspace_desc": "Pré-configurado para mostrar como usar plugins, comandos e skills.", - "dashboard.empty_workspace": "Workspace vazio", - "dashboard.empty_workspace_desc": "Comece com uma pasta em branco e adicione o que precisar.", - "dashboard.blueprints_workspace": "Blueprints", - "dashboard.blueprints_workspace_desc": "Comece com um workspace pronto para automação com skills reutilizáveis, comandos e fluxos compartilhados.", - - // ==================== Workspace ==================== - "workspace.rename_title": "Editar nome do workspace", - "workspace.rename_description": "Atualizar o nome exibido na barra lateral.", - "workspace.rename_label": "Nome do workspace", - "workspace.rename_placeholder": "Workspace da equipe de design", - - // ==================== Session ==================== - "session.no_selected": "Nenhuma sessão selecionada", - "session.back_to_dashboard": "Voltar ao dashboard", - "session.new_task": "Nova tarefa", - "session.recents": "Recentes", - "session.recents_notice": "Estas tarefas são executadas localmente e não sincronizam entre dispositivos.", - "session.ready_to_work_title": "Pronto para trabalhar", - "session.ready_to_work_description": "Descreva uma tarefa. Vou mostrar o progresso e pedir permissões quando necessário.", - "session.document_label": "Documento", - "session.standard_label": "Padrão", - "session.no_artifacts_fallback": "Nenhum artefato ainda.", - "session.active_plugins_label": "Plugins ativos", - "session.active_plugins_count": "{count}", - "session.no_plugins_loaded": "Nenhum plugin carregado.", - "session.selected_folders_label": "Pastas selecionadas", - "session.selected_folders_count": "{count}", - "session.working_files_label": "Arquivos de trabalho", - "session.none_yet_label": "Nenhum ainda.", - "session.permission_required_title": "Permissão Necessária", - "session.permission_required_description": "O OpenCode está solicitando permissão para continuar.", - "session.permission_label_uppercase": "Permissão", - "session.scope_label_uppercase": "Escopo", - "session.details_label": "Detalhes", - "session.steps_notice_text": "Os passos serão exibidos conforme a tarefa avança.", - "session.ready_to_work": "Pronto para trabalhar", - "session.ready_description": "Descreva uma tarefa. Vou mostrar o progresso e pedir permissões quando necessário.", - "session.hide_steps": "Ocultar passos", - "session.view_steps": "Ver passos", - "session.open": "Abrir", - "session.reveal": "Mostrar", - "session.opened_toast": "Aberto no app padrão.", - "session.revealed_toast": "Exibido no gerenciador de arquivos.", - "session.artifact_path_missing": "Caminho do artefato ausente.", - "session.desktop_only": "Abrir está disponível apenas no app desktop.", - "session.open_failed": "Não foi possível abrir o artefato.", - "session.model": "Modelo", - "session.ready": "Pronto", - "session.connect_provider": "Conecte um provedor para personalizar isso.", - "session.running": "Em execução", - "session.progress": "Progresso", - "session.steps_notice": "Os passos serão exibidos conforme a tarefa avança.", - "session.artifacts": "Artefatos", - "session.no_artifacts": "Nenhum artefato ainda.", - "session.context": "Contexto", - "session.active_plugins": "Plugins ativos", - "session.no_plugins": "Nenhum plugin carregado.", - "session.selected_folders": "Pastas selecionadas", - "session.working_files": "Arquivos de trabalho", - "session.none_yet": "Nenhum ainda.", - "session.document": "Documento", - "session.standard": "Padrão", - "session.try_notion_prompt": "Experimente agora: configure meu CRM no Notion", - "session.insert_prompt": "Inserir prompt", - "session.placeholder": "Pergunte ao OpenWork...", - "session.run": "Executar", - "session.permission_required": "Permissão Necessária", - "session.permission_description": "O OpenCode está solicitando permissão para continuar.", - "session.permission_label": "Permissão", - "session.scope_label": "Escopo", - "session.details": "Detalhes", - "session.deny": "Negar", - "session.once": "Uma vez", - "session.allow_for_session": "Permitir para esta sessão", - "session.tasks_local_hint": "Estas tarefas são executadas localmente e não sincronizam entre dispositivos.", - "session.recents_label": "Recentes", - "session.model_standard": "Padrão", - "session.run_button_title": "Executar", - "session.rename_title": "Renomear sessão", - "session.rename_description": "Atualizar o nome desta sessão.", - "session.rename_label": "Nome da sessão", - "session.rename_placeholder": "Digite um novo nome", - - // ==================== Commands ==================== - "commands.new": "Novo", - "commands.empty_state": "Salve um prompt ou comando para executá-lo novamente com um toque.", - "commands.workspace": "Este workspace", - "commands.global": "Todos os workspaces", - "commands.other": "Outros comandos", - "commands.run": "Executar", - "commands.modal_title": "Salvar um fluxo reutilizável", - "commands.modal_description": "Armazene um prompt ou comando para reutilização rápida.", - "commands.name_label": "Nome do comando", - "commands.name_placeholder": "ex: daily-standup", - "commands.name_hint": "Isso se torna /daily-standup no OpenCode.", - "commands.description_label": "Descrição (opcional)", - "commands.description_placeholder": "O que este comando faz?", - "commands.template_label": "Instruções", - "commands.template_placeholder": "Escreva as instruções que deseja reutilizar…", - "commands.template_hint": "Use $ARGUMENTS para aceitar detalhes.", - "commands.details_required": "Detalhes", - "commands.default_description": "Executar um comando salvo", - "commands.command_label": "Comando", - "commands.details_label": "Detalhes", - "commands.details_placeholder": "Adicionar detalhes opcionais", - "commands.details_hint": "Estes detalhes são passados ao comando.", - "commands.run_modal_title": "Executar comando", - "commands.run_modal_description": "Adicione detalhes opcionais antes de executar.", - "commands.run_modal_run": "Executar comando", - "commands.name_will_be": "Será criado como", - "commands.override_title": "Substituir comando existente?", - "commands.override_description": "Já existe um comando com este nome.", - "commands.override_warning": "Isso substituirá o comando \"{name}\" existente. Esta ação não pode ser desfeita.", - "commands.override_confirm": "Substituir", - "commands.override_cancel": "Manter existente", - - // ==================== Skills ==================== - "skills.title": "Skills", - "skills.subtitle": "Gerenciar skills para este workspace.", - "skills.refresh": "Atualizar", - "skills.add_title": "Adicionar skills", - "skills.add_description": "Instale um comando inicial, importe uma skill ou abra a pasta.", - "skills.install_from_openpackage": "Instalar do OpenPackage", - "skills.host_mode_only": "Apenas workspace local", - "skills.install": "Instalar", - "skills.installed_label": "Instalado", - "skills.install_hint": "Instala pacotes OpenPackage no workspace atual. As skills devem ficar em `.opencode/skills`.", - "skills.import_local": "Importar skill local", - "skills.import_local_hint": "Copiar uma pasta de skill existente para este workspace.", - "skills.import": "Importar", - "skills.curated_packages": "Pacotes selecionados", - "skills.view": "Visualizar", - "skills.search_placeholder": "Buscar pacotes ou listas (ex: claude, registry, community)", - "skills.no_matches": "Nenhuma correspondência curada. Tente uma busca diferente.", - "skills.install_package": "Instalar", - "skills.registry_notice": "Publicar no registro OpenPackage requer autenticação. Uma busca no registro e sincronização de lista está planejada.", - "skills.installed": "Skills instaladas", - "skills.no_skills": "Nenhuma skill detectada em `.opencode/skills`, `.claude/skills` ou `~/.agents/skills`.", - "skills.desktop_required": "O gerenciamento de skills requer o app desktop.", - "skills.host_only_error": "O gerenciamento de skills requer um workspace local ou servidor OpenWork conectado.", - "skills.install_skill_creator": "Instalar criador de skills", - "skills.install_skill_creator_hint": "Esta skill permite criar outras skills diretamente pelo chat.", - "skills.installing_skill_creator": "Instalando criador de skills...", - "skills.skill_creator_installed": "Criador de skills instalado.", - "skills.skill_creator_already_installed": "O criador de skills já está instalado.", - "skills.install_failed": "Falha na instalação da skill.", - "skills.reveal_folder": "Abrir pasta de skills", - "skills.reveal_folder_hint": "Abrir o diretório de skills no Finder.", - "skills.reveal_button": "Mostrar no Finder", - "skills.reveal_failed": "Falha ao abrir a pasta de skills.", - "skills.uninstall": "Desinstalar", - "skills.uninstall_title": "Desinstalar skill?", - "skills.uninstall_warning": "Isso excluirá permanentemente a skill `{name}` do seu workspace.", - "skills.uninstall_failed": "Falha ao desinstalar a skill.", - "skills.uninstalled": "Skill removida.", - "skills.share_title": "Compartilhar skill", - "skills.share_chooser_subtitle": "Salve na sua organização OpenWork Cloud ou publique um link de instalação público.", - "skills.share_subtitle_public": "Qualquer pessoa com o link pode instalar esta skill.", - "skills.share_subtitle_team": "Armazenada na organização para a equipe.", - "skills.share_option_team_title": "Compartilhar com a equipe", - "skills.share_option_team_desc": "Adicione esta skill à organização ativa do OpenWork Cloud.", - "skills.share_option_public_title": "Link público", - "skills.share_option_public_desc": "Crie um link para qualquer pessoa instalar esta skill.", - "skills.share_public_intro": "Publique um link público. Qualquer pessoa com a URL pode instalar esta skill.", - "skills.share_publisher_label": "Publicador", - "skills.share_public_create": "Criar link", - "skills.share_public_regenerate": "Regenerar link", - "skills.share_public_creating": "Publicando…", - "skills.share_copy_link": "Copiar", - "skills.share_team_intro": "Salve na organização ativa para a equipe instalar pelo Cloud.", - "skills.share_team_org_fallback": "Organização Cloud ativa", - "skills.share_team_hub_label": "Adicionar ao hub de skills (opcional)", - "skills.share_team_hub_none": "Somente organização — sem hub", - "skills.share_team_hubs_loading": "Carregando hubs…", - "skills.share_team_sign_in": "Entrar para compartilhar com a equipe", - "skills.share_team_sign_in_hint": "O OpenWork Cloud abre no navegador. Volte aqui após entrar.", - "skills.share_team_save": "Salvar para a equipe", - "skills.share_team_saving": "Salvando…", - "skills.share_team_success": "Salvo em {org}. A equipe pode instalar pelas skills da organização.", - "skills.share_team_choose_org": "Escolha uma organização em Configurações → Cloud antes de compartilhar.", - "skills.share_back": "Voltar", - "skills.share_close": "Fechar", - "skills.share_done": "Concluído", - "skills.source_placeholder": "github:anthropics/claude-code", - "skills.notion_crm_title": "Skills de Enriquecimento do Notion CRM", - "skills.notion_crm_description": "Adicionar fluxos de enriquecimento para contatos, pipelines e acompanhamentos.", - "skills.notion_crm_card_description": "Enriqueça dados do Notion CRM com skills prontas.", - "skills.connect_host_to_load": "Conecte um servidor OpenWork para carregar skills.", - "skills.pick_workspace_first": "Escolha primeiro uma pasta de workspace.", - "skills.no_skills_found": "Nenhuma skill encontrada ainda.", - "skills.installed_description": "Skills disponíveis neste workspace.", - "skills.failed_to_load": "Falha ao carregar skills", - "skills.plugin_management_host_only": "O gerenciamento de plugins requer o app desktop.", - "skills.plugins_host_only": "Plugins estão disponíveis apenas no app desktop.", - "skills.pick_project_for_plugins": "Escolha uma pasta de projeto para gerenciar os plugins do projeto.", - "skills.pick_project_for_active": "Escolha uma pasta de projeto para carregar os plugins ativos.", - "skills.no_opencode_found": "Nenhum opencode.json encontrado ainda. Adicione um plugin para criar um.", - "skills.no_opencode_workspace": "Nenhum opencode.json neste workspace ainda.", - "skills.failed_parse_opencode": "Falha ao processar opencode.json", - "skills.failed_load_opencode": "Falha ao carregar opencode.json", - "skills.failed_load_active": "Falha ao carregar plugins ativos.", - "skills.enter_plugin_name": "Digite o nome do pacote do plugin.", - "skills.plugin_already_listed": "Plugin já listado no opencode.json.", - "skills.failed_update_opencode": "Falha ao atualizar opencode.json", - "skills.opackage_install_host_only": "Instalações OpenPackage requerem o app desktop.", - "skills.pick_project_first": "Escolha primeiro uma pasta de projeto.", - "skills.enter_opackage_source": "Digite a fonte do OpenPackage (ex: github:anthropics/claude-code).", - "skills.installing_opackage": "Instalando OpenPackage...", - "skills.install_complete": "Instalado.", - "skills.curated_list_notice": "Esta é uma lista selecionada, não um OpenPackage ainda. Copie o link ou aguarde o PRD para a integração de busca no registro.", - "skills.import_host_only": "Importação de skill requer o app desktop.", - "skills.select_skill_folder": "Selecionar pasta da skill", - "skills.import_failed": "Falha na importação ({status})", - "skills.imported": "Importado.", - "skills.unknown_error": "Erro desconhecido", - - // ==================== Plugins ==================== - "plugins.title": "Plugins OpenCode", - "plugins.description": "Gerenciar `opencode.json` para os plugins do seu projeto ou globais do OpenCode.", - "plugins.config_label": "Config", - "plugins.config_not_loaded": "Ainda não carregado", - "plugins.suggested_label": "Plugins sugeridos", - "plugins.no_plugins_yet": "Nenhum plugin configurado ainda.", - "plugins.enabled_label": "Ativado", - "plugins.open_label": "Abrir", - "plugins.path_label": "Caminho", - "plugins.scope_project": "Projeto", - "plugins.scope_global": "Global", - "plugins.refresh": "Atualizar", - "plugins.config": "Config", - "plugins.not_loaded": "Ainda não carregado", - "plugins.suggested": "Plugins sugeridos", - "plugins.hide_setup": "Ocultar configuração", - "plugins.setup": "Configurar", - "plugins.added": "Adicionado", - "plugins.add": "Adicionar", - "plugins.enabled": "Ativado", - "plugins.no_plugins": "Nenhum plugin configurado ainda.", - "plugins.add_label": "Adicionar plugin", - "plugins.placeholder": "opencode-wakatime", - "plugins.add_hint": "Adicione nomes de pacotes npm, ex: opencode-wakatime", - - // ==================== Apps (MCP) ==================== - "mcp.apps_title": "Apps", - "mcp.apps_subtitle": "Conecte suas ferramentas favoritas para que o OpenWork as use em seu nome.", - "mcp.app_connected": "app conectado", - "mcp.apps_connected": "apps conectados", - "mcp.title": "Apps", - "mcp.description": "Conecte suas ferramentas com um clique.", - "mcp.alpha_banner_title": "Os Apps estão em acesso antecipado enquanto refinamos a experiência.", - "mcp.alpha_banner_help": "Se quiser ajudar, abra um PR e inclua um vídeo curto mostrando o fluxo de login funcionando de ponta a ponta.", - "mcp.mcps_title": "Apps", - "mcp.connect_mcp_hint": "Conecte apps para expandir o que o OpenWork pode fazer.", - "mcp.finish_setup": "Quase lá", - "mcp.finish_setup_hint": "Toque em Ativar para terminar de conectar seu app.", - "mcp.activate_button": "Ativar", - "mcp.reload_banner_title": "Quase lá", - "mcp.reload_banner_description": "Toque em Ativar para terminar de conectar seu app.", - "mcp.reload_banner_description_blocked": "Uma tarefa está em execução. Pare-a primeiro e então ative.", - "mcp.reload_banner_blocked_hint": "Pare a tarefa em execução para ativar.", - "mcp.available_apps": "Apps disponíveis", - "mcp.one_click_connect": "Conectar com um clique", - "mcp.tap_to_connect": "Toque para conectar", - "mcp.connected_badge": "Conectado", - "mcp.your_apps": "Seus apps", - "mcp.last_synced": "Sincronizado", - "mcp.no_apps_yet": "Nenhum app conectado ainda", - "mcp.no_apps_hint": "Conecte um acima para começar.", - "mcp.quick_connect_title": "Apps disponíveis", - "mcp.oauth_only_label": "Um clique", - "mcp.connected_status": "Conectado", - "mcp.no_env_vars": "Nenhuma configuração adicional necessária.", - "mcp.connected_title": "Seus apps", - "mcp.from_opencode_json": "Da configuração", - "mcp.no_servers_yet": "Nenhum app conectado ainda.", - "mcp.edit_config_title": "Editar arquivo de configuração", - "mcp.edit_config_description": "Os apps são armazenados no arquivo de configuração do seu workspace.", - "mcp.docs_link": "Saiba mais", - "mcp.scope_project": "Este workspace", - "mcp.scope_global": "Todos os workspaces", - "mcp.config_label": "Config", - "mcp.config_file": "Arquivo de configuração", - "mcp.config_not_loaded": "Ainda não carregado", - "mcp.open_file_label": "Abrir arquivo", - "mcp.reveal_in_finder": "Mostrar no Finder", - "mcp.opening_label": "Abrindo...", - "mcp.file_not_found": "Arquivo de configuração ainda não criado", - "mcp.config_load_failed": "Não foi possível carregar o arquivo de configuração", - "mcp.open_file": "Abrir arquivo", - "mcp.pick_workspace_error": "Escolha primeiro uma pasta de workspace.", - "mcp.reveal_config_failed": "Não foi possível abrir o arquivo de configuração", - "mcp.alpha_warning": "Os Apps estão em acesso antecipado enquanto refinamos a experiência.", - "mcp.github_issue": "Ver issue #9510 no GitHub", - "mcp.contribution_guide": "Se quiser ajudar, abra um PR e inclua um vídeo curto mostrando o fluxo de login funcionando de ponta a ponta.", - "mcp.advanced_settings": "Configurações avançadas", - "mcp.advanced_settings_hint": "Edite arquivos de configuração e gerencie conexões manualmente.", - "mcp.hide_advanced": "Ocultar configurações avançadas", - "mcp.show_advanced": "Mostrar configurações avançadas", - "mcp.mcps_label": "Apps", - "mcp.mcps_description": "Conecte apps para expandir o que o OpenWork pode fazer.", - "mcp.configured": "configurado", - "mcp.updated": "Sincronizado", - "mcp.reload_required": "Ativação necessária", - "mcp.reload_description": "Ative para começar a usar a nova conexão.", - "mcp.reload_engine": "Ativar", - "mcp.quick_connect": "Apps disponíveis", - "mcp.oauth_only": "Um clique", - "mcp.connecting": "Conectando...", - "mcp.connect": "Conectar", - "mcp.connected": "Conectado", - "mcp.connected_label": "Conectado", - "mcp.no_env_required": "Nenhuma configuração adicional necessária.", - "mcp.config_source": "Da configuração", - "mcp.no_servers": "Nenhum app conectado ainda.", - "mcp.advanced": "Avançado", - "mcp.advanced_description": "Para conexões personalizadas.", - "mcp.hide": "Ocultar", - "mcp.show": "Mostrar", - "mcp.server_name": "Nome do app", - "mcp.server_name_placeholder": "github-copilot", - "mcp.server_url": "URL do servidor", - "mcp.server_url_placeholder": "https://api.githubcopilot.com/mcp/", - "mcp.oauth": "Entrar", - "mcp.api_key": "Chave de API", - "mcp.enabled": "Ativado", - "mcp.disabled": "Desativado", - "mcp.add_mcp": "Adicionar app", - "mcp.verify_connection": "Testar conexão", - "mcp.cli_guidance": "Comando no terminal (avançado)", - "mcp.config_locations": "A configuração pode ficar em opencode.json, opencode.jsonc ou .opencode/opencode.json.", - "mcp.app_details": "Detalhes do app", - "mcp.details_title": "Detalhes do app", - "mcp.select_app_hint": "Selecione um app para ver os detalhes.", - "mcp.select_server_hint": "Selecione um app para ver os detalhes.", - "mcp.connection_type": "Conexão", - "mcp.type_cloud": "Nuvem (entrar com sua conta)", - "mcp.type_local": "Local (roda neste dispositivo)", - "mcp.capabilities_label": "Recursos", - "mcp.cap_tools": "Ferramentas de IA", - "mcp.cap_signin": "Login na conta", - "mcp.tools_enabled_label": "Ferramentas de IA", - "mcp.oauth_ready_label": "Login na conta", - "mcp.usage_hint_text": "Mencione o nome do app no seu prompt para usar suas ferramentas.", - "mcp.issue_label": "Problema", - "mcp.technical_details": "Detalhes técnicos", - "mcp.next_steps_label": "O que fazer", - "mcp.reload_step": "Ative após conectar um novo app.", - "mcp.auth_step": "Entre quando solicitado.", - "mcp.connection_failed": "Problema de conexão, tente novamente", - "mcp.needs_auth": "Login necessário", - "mcp.register_client": "Configuração necessária", - "mcp.status_disabled": "Pausado", - "mcp.disconnected": "Offline", - "mcp.failed": "Problema", - "mcp.friendly_status_ready": "Pronto", - "mcp.friendly_status_needs_signin": "Login necessário", - "mcp.friendly_status_paused": "Pausado", - "mcp.friendly_status_offline": "Offline", - "mcp.friendly_status_issue": "Problema", - "mcp.host_mode_only": "Apps requerem o app desktop.", - "mcp.pick_workspace_first": "Escolha primeiro uma pasta de workspace.", - "mcp.desktop_required": "Apps requerem o app desktop.", - "mcp.connect_server_first": "Conecte-se ao servidor primeiro.", - "mcp.reload_required_after_add": "Ative para começar a usar o novo app.", - "mcp.connect_failed": "Não foi possível conectar. Tente novamente.", - "mcp.enter_name_and_url": "Digite um nome e URL para o app.", - "mcp.enter_url_first": "Digite uma URL primeiro.", - "mcp.use_debug_command": "Execute opencode mcp debug para solucionar problemas.", - "mcp.add_failed": "Não foi possível adicionar o app.", - "mcp.remove_app": "Remover", - "mcp.remove_failed": "Não foi possível remover o app.", - "mcp.remove_modal_title": "Remover app", - "mcp.remove_modal_message": "Tem certeza que deseja remover {server}? Você pode adicioná-lo de volta a qualquer momento.", - - // Add MCP Modal - "mcp.add_modal_title": "Adicionar App Personalizado", - "mcp.add_modal_subtitle": "Conecte um servidor MCP personalizado por URL ou comando local.", - "mcp.custom_app_cta_hint": "Conecte seu próprio servidor MCP, ferramenta interna ou app hospedado.", - "mcp.server_type": "Tipo", - "mcp.type_remote": "Remoto (URL)", - "mcp.type_local_cmd": "Local (comando)", - "mcp.server_command": "Comando", - "mcp.server_command_placeholder": "npx -y @modelcontextprotocol/server-sequential-thinking", - "mcp.server_command_hint": "O comando shell para iniciar o servidor.", - "mcp.sign_in_section_label": "Login", - "mcp.oauth_optional_label": "Este app exige login", - "mcp.oauth_optional_hint": "Usa OAuth no navegador para conectar sua conta.", - "mcp.remote_workspace_url_hint": "Workers remotos conectam mais rápido com servidores MCP baseados em URL.", - "mcp.add_server_button": "Adicionar app", - "mcp.name_required": "Digite um nome para o servidor.", - "mcp.url_or_command_required": "Digite uma URL para servidores remotos ou um comando para servidores locais.", - - "mcp.logout_label": "OAuth", - "mcp.logout_action": "Sair", - "mcp.logout_working": "Saindo...", - "mcp.logout_hint": "Remove as credenciais OAuth armazenadas. Você precisará entrar novamente.", - "mcp.login_action": "Entrar", - "mcp.login_hint": "Conecte sua conta para terminar de configurar este app.", - "mcp.login_unavailable": "Este app não suporta login pelo OpenWork.", - "mcp.logout_modal_title": "Sair deste app?", - "mcp.logout_modal_message": "Isso removerá as credenciais OAuth armazenadas para {server}. Você precisará entrar novamente para usar este app.", - "mcp.logout_success": "Saiu de {server}.", - "mcp.logout_failed": "Falha ao sair.", - - // MCP Auth Modal - "mcp.auth.open_browser_signin": "Abriremos seu navegador para concluir o login.", - "mcp.auth.connect_server": "Conectar {server}", - "mcp.auth.already_connected": "Já Conectado", - "mcp.auth.already_connected_description": "{server} já está autenticado e pronto para uso.", - "mcp.auth.configured_previously": "O MCP pode ter sido configurado globalmente ou em uma sessão anterior. Você pode fechar este modal e começar a usar as ferramentas MCP imediatamente.", - "mcp.auth.reload_engine_retry": "Aplicar alterações e tentar novamente", - "mcp.auth.retry_now": "Tentar Agora", - "mcp.auth.retry": "Tentar novamente", - "mcp.auth.reload_failed": "Falha ao recarregar o worker antes do login.", - "mcp.auth.applying_changes_title": "Aplicando alterações antes do login", - "mcp.auth.applying_changes_body": "Estamos reiniciando o worker para que o novo MCP esteja pronto para autenticar.", - "mcp.auth.waiting_for_conversation_title": "Aguardando conversa ser concluída", - "mcp.auth.waiting_for_conversation_body": "Vamos redirecioná-lo para autenticar assim que possível.", - "mcp.auth.waiting_for_session": "Aguardando {session} terminar", - "mcp.auth.force_stop": "Forçar parada", - "mcp.auth.force_stopping": "Parando...", - "mcp.auth.reload_before_oauth": "Recarregue o engine para concluir a configuração deste MCP antes de iniciar o OAuth.", - "mcp.auth.reload_notice": "Para isso ter efeito, o OpenWork precisa reiniciar o serviço worker. Isso pode interromper uma sessão em andamento.", - "mcp.auth.reload_blocked": "O recarregamento está pausado enquanto uma sessão está em execução. Pare a execução para concluir a configuração.", - "mcp.auth.reload_remote_confirm": "Para isso ter efeito, o OpenWork precisa reiniciar o serviço worker. Isso pode parar sua sessão em andamento. Continuar?", - "mcp.auth.reload_needed": "Conclua a configuração recarregando o engine e tente conectar novamente.", - "mcp.auth.manual_finish_title": "Servidor remoto?", - "mcp.auth.manual_finish_hint": "Cole a URL de callback (localhost:19876) ou apenas o código para concluir a conexão.", - "mcp.auth.callback_label": "URL de callback ou código", - "mcp.auth.callback_placeholder": "http://127.0.0.1:19876/mcp/oauth/callback?code=...", - "mcp.auth.complete_connection": "Concluir conexão", - "mcp.auth.callback_invalid": "Cole a URL de callback ou o parâmetro de código para concluir o OAuth.", - "mcp.auth.port_forward_hint": "Dica: encaminhe a porta de callback se necessário: ssh -L 19876:127.0.0.1:19876 user@host", - "mcp.auth.step1_title": "Abrindo seu navegador", - "mcp.auth.step1_description": "Iniciaremos o fluxo de login do {server} automaticamente.", - "mcp.auth.step2_title": "Autorizar o OpenWork", - "mcp.auth.step2_description": "Entre e aprove o acesso quando solicitado.", - "mcp.auth.step3_title": "Volte aqui quando terminar", - "mcp.auth.step3_description": "Concluiremos a conexão assim que a autorização for completada.", - "mcp.auth.waiting_authorization": "Aguardando a autorização ser concluída no seu navegador...", - "mcp.auth.follow_browser_steps": "Siga os passos de autorização no navegador.", - "mcp.auth.reopen_browser_link": "Clique aqui para reabrir o navegador", - "mcp.auth.done": "Concluído", - "mcp.auth.cancel": "Cancelar", - "mcp.auth.im_done": "Terminei", - "mcp.auth.client_registration_required": "O registro do cliente é necessário antes de continuar com o OAuth.", - "mcp.auth.server_disabled": "Este servidor MCP está desativado. Ative-o e tente novamente.", - "mcp.auth.oauth_failed": "Falha na autenticação OAuth.", - "mcp.auth.invalid_refresh_token": "O token de atualização OAuth é inválido ou expirou. Reautorize para continuar.", - "mcp.auth.reauth_action": "Reautorizar OAuth", - "mcp.auth.reauth_running": "Reautorizando...", - "mcp.auth.reauth_failed": "Falha na reautorização.", - "mcp.auth.reauth_cli_hint": "Execute: opencode mcp auth {server}", - "mcp.auth.reauth_remote_hint": "Reautorize a partir da máquina que executa este worker.", - "mcp.auth.authorization_still_required": "A autorização ainda é necessária. Tente novamente para reiniciar o fluxo.", - "mcp.auth.oauth_not_supported_hint": "Isso pode significar:\n• O servidor MCP não anuncia capacidades OAuth\n• O engine precisa recarregar para descobrir as capacidades do servidor\n• Tente: opencode mcp auth {server} pela CLI", - "mcp.auth.try_reload_engine": "{message}. Tente recarregar o engine primeiro.", - "mcp.auth.failed_to_start_oauth": "Falha ao iniciar fluxo OAuth", - "mcp.auth.oauth_completed_reload": "OAuth concluído. Recarregue o engine para ativar o MCP.", - - // ==================== Settings ==================== - "settings.title": "Configurações", - "settings.connection": "Conexão", - "settings.engine_source": "Fonte do engine", - "settings.from_path": "Via PATH", - "settings.from_sidecar": "Sidecar integrado", - "settings.engine_source_description": "PATH usa o OpenCode instalado (padrão). Sidecar usará um binário integrado quando disponível.", - "settings.sidecar_unsupported": "Sidecar está disponível no Windows", - "settings.sidecar_unavailable_detail": "Sidecar é integrado quando disponível.", - "settings.model": "Modelo", - "settings.model_description": "Padrões e controles de raciocínio para execuções.", - "settings.change": "Alterar", - "settings.engine_path": "PATH", - "settings.engine_sidecar": "Sidecar", - "settings.thinking": "Raciocínio", - "settings.thinking_description": "Mostrar partes de raciocínio (apenas no modo Desenvolvedor).", - "settings.on": "Ativado", - "settings.off": "Desativado", - "settings.model_variant": "Variante do modelo", - "settings.edit": "Editar", - "settings.default_model": "Modelo padrão", - "settings.session_model": "Modelo", - "settings.model_description_default": "Escolha entre seus provedores configurados. Esta seleção será usada para novas sessões.", - "settings.model_description_session": "Escolha entre seus provedores configurados. Esta seleção se aplica à sua próxima mensagem.", - "settings.search_models": "Buscar modelos…", - "settings.showing_models": "Exibindo {count} de {total}", - "settings.model_variant_prompt": "Variante do modelo (específica do provedor, ex: high/max/minimal). Deixe em branco para limpar.", - "settings.model_fallback": "Alternativa", - "settings.model_default": "Padrão", - "settings.model_free": "Gratuito", - "settings.model_reasoning": "Raciocínio", - "settings.done": "Concluído", - "settings.updates": "Atualizações", - "settings.updates_description": "Manter o OpenWork atualizado.", - "settings.automatic_checks": "Verificações automáticas", - "settings.automatic_checks_description": "Uma vez por dia (silencioso)", - "settings.update_checking": "Verificando...", - "settings.update_available": "Atualização disponível: v", - "settings.update_downloading": "Baixando...", - "settings.update_ready": "Pronto para instalar: v", - "settings.update_error": "Falha na verificação de atualização", - "settings.update_uptodate": "Atualizado", - "settings.last_checked": "Última verificação", - "settings.published": "Publicado", - "settings.check_update": "Verificar", - "settings.install_restart": "Instalar e Reiniciar", - "settings.update_not_supported": "Atualizações não são suportadas neste ambiente.", - "settings.update_desktop_only": "Atualizações estão disponíveis apenas no app desktop.", - "settings.startup": "Inicialização", - "settings.mode_label": "modo", - "settings.switch_mode": "Alternar", - "settings.reset_startup": "Redefinir modo de inicialização padrão", - "settings.reset_startup_description": "Apaga sua preferência salva e exibe a seleção de modo na próxima inicialização.", - "settings.advanced": "Avançado", - "settings.advanced_description": "Redefinir estado local do OpenWork para retestar o onboarding.", - "settings.reset_onboarding": "Redefinir onboarding", - "settings.reset_onboarding_description": "Apaga as preferências do OpenWork e reinicia o app.", - "settings.reset_app_data": "Redefinir dados do app", - "settings.reset_app_data_description": "Mais agressivo. Apaga cache + dados do OpenWork.", - "settings.reset": "Redefinir", - "settings.requires_typing": "Requer digitação", - "settings.will_restart": "e reiniciará o app.", - "settings.reset_onboarding_title": "Redefinir onboarding", - "settings.reset_app_data_title": "Redefinir dados do app", - "settings.reset_confirmation_hint": "Digite RESET para confirmar. O OpenWork será reiniciado.", - "settings.reset_onboarding_warning": "Apaga preferências locais e marcadores de onboarding do workspace no OpenWork.", - "settings.reset_app_data_warning": "Apaga cache e dados do OpenWork neste dispositivo.", - "settings.reset_stop_active_runs": "Pare as execuções ativas antes de redefinir.", - "settings.reset_confirmation_label": "Confirmação", - "settings.reset_confirmation_placeholder": "Digite RESET", - "settings.reset_cancel": "Cancelar", - "settings.reset_confirm_button": "Redefinir e Reiniciar", - "settings.developer": "Desenvolvedor", - "settings.opencode_cache": "Cache do OpenCode", - "settings.opencode_cache_description": "Repara dados em cache usados para iniciar o engine. Seguro de executar.", - "settings.repair_cache": "Reparar cache", - "settings.repairing_cache": "Reparando cache", - "settings.cache_repair_requires_desktop": "O reparo de cache requer o app desktop", - "settings.pending_permissions": "Permissões pendentes", - "settings.recent_events": "Eventos recentes", - "settings.notion_connected": "Conectado", - "settings.reload_required": "Recarregamento necessário", - "settings.connection_failed": "Falha na conexão", - "settings.notion_not_connected": "Não conectado", - "settings.show_thinking": "Mostrar raciocínio", - "settings.update": "Atualizar", - "settings.about": "Sobre", - "settings.version": "Versão", - "settings.check_for_updates": "Verificar atualizações", - "settings.download_update": "Baixar atualização", - "settings.install_update": "Instalar atualização e reiniciar", - "settings.enable_developer_mode": "Ativar Modo Desenvolvedor", - "settings.disable_developer_mode": "Desativar Modo Desenvolvedor", - "settings.stop_engine": "Parar engine", - "settings.disconnect": "Desconectar", - "settings.language": "Idioma", - "settings.language.description": "Escolha seu idioma preferido", - "settings.connection_title": "Conexão", - "settings.engine_source_label": "Fonte do engine", - "settings.engine_source_hint": "PATH usa o OpenCode instalado (padrão). Sidecar usará um binário integrado quando disponível.", - "settings.sidecar_unavailable": "Sidecar é integrado quando disponível.", - "settings.model_title": "Modelo", - "settings.model_hint": "Padrões e controles de raciocínio para execuções.", - "settings.thinking_label": "Raciocínio", - "settings.thinking_hint": "Mostrar partes de raciocínio (apenas no modo Desenvolvedor).", - "settings.model_variant_label": "Variante do modelo", - "settings.appearance_title": "Aparência", - "settings.appearance_hint": "Seguir o sistema ou forçar modo claro/escuro.", - "settings.theme_system": "Sistema", - "settings.theme_light": "Claro", - "settings.theme_dark": "Escuro", - "settings.theme_system_hint": "O modo sistema segue automaticamente a preferência do seu SO.", - "settings.updates_title": "Atualizações", - "settings.updates_hint": "Manter o OpenWork atualizado.", - "settings.automatic_checks_label": "Verificações automáticas", - "settings.automatic_checks_hint": "Uma vez por dia (silencioso)", - "settings.last_checked_time": "Última verificação {time}", - "settings.published_date": "Publicado em {date}", - "settings.update_not_supported_hint": "Atualizações não são suportadas neste ambiente.", - "settings.update_desktop_only_hint": "Atualizações estão disponíveis apenas no app desktop.", - "settings.startup_title": "Inicialização", - "settings.mode_suffix": "modo", - "settings.reset_startup_label": "Redefinir modo de inicialização padrão", - "settings.reset_startup_hint": "Apaga sua preferência salva e exibe a seleção de modo na próxima inicialização.", - "settings.advanced_title": "Avançado", - "settings.advanced_hint": "Redefinir estado local do OpenWork para retestar o onboarding.", - "settings.reset_onboarding_label": "Redefinir onboarding", - "settings.reset_onboarding_hint": "Apaga as preferências do OpenWork e reinicia o app.", - "settings.reset_app_data_label": "Redefinir dados do app", - "settings.reset_app_data_hint": "Mais agressivo. Apaga cache + dados do OpenWork.", - "settings.reset_requires_hint": "Requer digitar RESET e reiniciará o app.", - "settings.developer_title": "Desenvolvedor", - "settings.opencode_cache_label": "Cache do OpenCode", - "settings.opencode_cache_hint": "Repara dados em cache usados para iniciar o engine. Seguro de executar.", - "settings.pending_permissions_label": "Permissões pendentes", - "settings.recent_events_label": "Eventos recentes", - "settings.stop_active_runs_hint": "Pare as execuções ativas para atualizar", - "settings.stop_active_runs_reset_hint": "Pare as execuções ativas para redefinir", - "settings.stop_runs_to_update": "Pare as execuções ativas para atualizar", - "settings.stop_runs_to_reset": "Pare as execuções ativas para redefinir", - "settings.updates_not_supported": "Atualizações não são suportadas neste ambiente.", - "settings.updates_desktop_only": "Atualizações estão disponíveis apenas no app desktop.", - - // ==================== Reload ==================== - "reload.toast_title": "Atualizações disponíveis", - "reload.toast_description": "Recarregue o workspace para aplicar as alterações de configuração.", - "reload.toast_warning": "Para todas as tarefas ativas.", - "reload.toast_warning_active": "O recarregamento parará {count} tarefas ativas.", - "reload.toast_reload": "Recarregar", - "reload.toast_reload_stopped": "Recarregar e Parar Tarefas", - "reload.toast_reloading": "Recarregando...", - "reload.toast_dismiss": "Depois", - "reload.toast_blocked_host": "O recarregamento está disponível apenas para workers locais.", - "reload.toast_blocked_connect": "Conecte-se a este workspace para recarregar.", - "reload.toast_blocked_runs": "Aguardando as tarefas ativas serem concluídas antes de recarregar.", - - // ==================== Onboarding ==================== - "onboarding.starting_host": "Iniciando servidor OpenWork...", - "onboarding.searching_host": "Conectando ao servidor OpenWork...", - "onboarding.getting_ready": "Preparando tudo", - "onboarding.verifying": "Verificando handshake seguro", - "onboarding.create_first_workspace": "Crie seu primeiro workspace", - "onboarding.create_workspace": "Criar um workspace", - "onboarding.workspace_description": "Escolha uma pasta e uma predefinição para configurar seu workspace.", - "onboarding.start": "Iniciar OpenWork", - "onboarding.back": "Voltar", - "onboarding.advanced_settings": "Configurações avançadas", - "onboarding.opencode_engine": "Engine OpenCode", - "onboarding.refresh": "Atualizar", - "onboarding.checking_cli": "Verificando OpenCode CLI...", - "onboarding.cli_not_found": "OpenCode CLI não encontrado.", - "onboarding.cli_needs_update": "O OpenCode CLI precisa de uma atualização para o serve.", - "onboarding.opencode": "OpenCode", - "onboarding.cli_ready": "OpenCode CLI pronto.", - "onboarding.cli_version": "OpenCode {version}", - "onboarding.windows_install_instruction": "Instale o OpenCode para Windows e reinicie o OpenWork. Certifique-se de que opencode.exe está no PATH.", - "onboarding.install_instruction": "Instale o OpenCode para ativar o servidor local (sem terminal necessário).", - "onboarding.install": "Instalar OpenCode", - "onboarding.recheck": "Verificar novamente", - "onboarding.ready_message": "O OpenCode está pronto para iniciar o servidor local.", - "onboarding.resolved_path": "Caminho resolvido", - "onboarding.version": "Versão", - "onboarding.search_notes": "Notas de busca", - "onboarding.serve_help": "saída de serve --help", - "onboarding.workspace_folder_label": "Um workspace é uma pasta com suas próprias skills, plugins e comandos.", - "onboarding.theme_label": "Tema", - "onboarding.theme_current": "Atual: {mode}", - "onboarding.theme_system": "Sistema", - "onboarding.theme_light": "Claro", - "onboarding.theme_dark": "Escuro", - "onboarding.access_label": "Acesso", - "onboarding.folders_allowed": "{count} pasta{plural} permitida{plural}", - "onboarding.manage_access_hint": "Você pode gerenciar o acesso nas configurações avançadas.", - "onboarding.open_settings_hint": "Precisa de opções de engine ou acesso? Abra as Configurações.", - "onboarding.open_settings": "Abrir Configurações", - "onboarding.add_folder_path": "Adicionar caminho de pasta", - "onboarding.pick": "Selecionar", - "onboarding.add": "Adicionar", - "onboarding.remove": "Remover", - "onboarding.cli_label": "OpenCode CLI", - "onboarding.cli_checking": "Verificando instalação...", - "onboarding.cli_not_found_hint": "Não encontrado. Instale para executar o servidor local.", - "onboarding.cli_version_installed": "Instalado", - "onboarding.cli_recheck": "Verificar novamente", - "onboarding.cli_install_commands": "Instale o OpenCode com um dos comandos abaixo e reinicie o OpenWork.", - "onboarding.show_search_notes": "Mostrar notas de busca", - "onboarding.last_checked": "Última verificação {time}", - "onboarding.server_url_placeholder": "http://localhost:8088", - "onboarding.directory_placeholder": "meu-projeto", - "onboarding.connect_host": "Conectar ao servidor", - "onboarding.connect_description": "Conectar-se a um servidor OpenCode existente (LAN ou túnel).", - "onboarding.server_url": "URL do servidor", - "onboarding.directory": "Diretório (opcional)", - "onboarding.directory_hint": "Use se o servidor executar múltiplos workers.", - "onboarding.connect": "Conectar", - "onboarding.remote_workspace_title": "Conectar ao servidor OpenWork", - "onboarding.remote_workspace_description": "Conecte-se a um servidor OpenWork para acessar um workspace de qualquer lugar.", - "onboarding.remote_workspace_action": "Conectar", - "onboarding.remote_workspace_card_title": "Conectar um workspace remoto", - "onboarding.remote_workspace_card_description": "Conecte-se a um servidor OpenWork para acessar um workspace compartilhado.", - "onboarding.advanced_openwork_host": "Servidor OpenWork", - "onboarding.advanced_openwork_hint": "Use uma URL de servidor e token de acesso para acesso compartilhado.", - "onboarding.advanced_opencode_direct": "Avançado: OpenCode direto", - "onboarding.advanced_opencode_hint": "Conecte diretamente a um engine OpenCode quando nenhum servidor estiver disponível.", - "onboarding.welcome_title": "Como você quer executar o OpenWork hoje?", - "onboarding.run_local": "Executar localmente", - "onboarding.run_local_description": "O OpenWork executa o OpenCode localmente e mantém seu trabalho privado.", - "onboarding.engine_running": "Engine já em execução", - "onboarding.attach_description": "Conectar à sessão existente neste dispositivo.", - "onboarding.attach": "Conectar", - "onboarding.remember_choice": "Lembrar minha escolha para a próxima vez", - "onboarding.client_mode": "Conectar como Cliente (Emparelhamento Remoto)", - "onboarding.default_workspace_path": "~/OpenWork/Worker", - "onboarding.authorize_folder": "Autorizar pasta", - "onboarding.choose_workspace_folder": "Escolher pasta do workspace", - - // ==================== Common ==================== - "common.alpha": "Alpha", - "common.change": "Alterar", - "common.refresh": "Atualizar", - "common.new": "Novo", - "common.install": "Instalar", - "common.delete": "Excluir", - "common.edit": "Editar", - "common.save": "Salvar", - "common.cancel": "Cancelar", - "common.close": "Fechar", - "common.open": "Abrir", - "common.show": "Mostrar", - "common.hide": "Ocultar", - "common.path": "Caminho", - "common.choose": "Escolher", - "common.retry": "Tentar novamente", - "common.untitled": "Sem título", - "common.default_parens": "(padrão)", - "common.on": "Ativado", - "common.off": "Desativado", - - // ==================== Status ==================== - "status.connected": "Conectado", - "status.disconnected": "Desconectado", - "status.idle": "Ocioso", - "status.busy": "Ocupado", - "status.running": "Em execução", - "status.live": "Ao vivo", - "status.connecting": "Conectando", - "status.creating_workspace": "Criando workspace", - "status.deleting_command": "Excluindo comando", - "status.saving_workspace_command": "Salvando comando do workspace", - "status.saving_command": "Salvando comando", - "status.loading_session": "Carregando sessão", - "status.creating_task": "Criando nova tarefa", - "status.starting_engine": "Iniciando engine", - "status.reloading_engine": "Recarregando engine", - "status.restarting_engine": "Reiniciando engine", - "status.installing_opencode": "Instalando OpenCode", - "status.disconnecting": "Desconectando", - - // ==================== Workspace Switching ==================== - "workspace.switching_title": "Abrindo {name}", - "workspace.switching_title_unknown": "Abrindo workspace", - "workspace.switching_subtitle": "Vamos trazer seu trabalho recente de volta.", - "workspace.switching_status_preparing": "Preparando tudo", - "workspace.switching_status_connecting": "Verificando sua conexão", - "workspace.switching_status_loading": "Carregando tarefas recentes", - "workspace.switching_status_almost": "Quase lá", - + "app.compact_command_desc": "Resumir esta sessão para reduzir o tamanho do contexto.", "app.connection_lost": "Conexão com o servidor perdida. Por favor, recarregue.", - "app.unknown_error": "Erro desconhecido", - "app.error.tauri_required": "Esta ação requer o runtime do app Tauri.", + "app.deep_link_auth_queued": "Link de autenticação Cloud enfileirado para o OpenWork.", + "app.deep_link_remote_queued": "Link de worker remoto enfileirado. O OpenWork deve entrar no fluxo de conexão.", "app.error.choose_folder": "Escolha uma pasta para continuar.", - "app.error.pick_workspace_folder": "Selecione primeiro uma pasta de workspace.", - "app.error.remote_base_url_required": "Adicione uma URL de servidor para continuar.", "app.error.host_requires_local": "Selecione um workspace local para iniciar o engine.", - "app.error.sidecar_unsupported_windows": "O OpenCode Sidecar é integrado no Windows quando disponível. Usando PATH como alternativa.", "app.error.install_failed": "Falha na instalação do OpenCode. Veja os logs acima.", - "app.error.command_name_template_required": "O nome e as instruções do comando são obrigatórios.", - "app.error.workspace_commands_desktop": "Comandos requerem o app desktop.", - "app.error.command_scope_unknown": "Este comando não pode ser gerenciado neste modo.", - - // ==================== App (additional) ==================== - "app.compact_command_desc": "Resumir esta sessão para reduzir o tamanho do contexto.", - "app.deep_link_auth_queued": "Link de autenticação Cloud enfileirado para o OpenWork.", - "app.deep_link_remote_queued": "Link de worker remoto enfileirado. O OpenWork deve entrar no fluxo de conexão.", + "app.error.pick_workspace_folder": "Selecione primeiro uma pasta de workspace.", + "app.error.remote_base_url_required": "Adicione uma URL de servidor para continuar.", + "app.error.tauri_required": "Esta ação requer o runtime do app Tauri.", "app.error_audit_load": "Falha ao carregar o log de auditoria.", "app.error_auth_failed": "Falha na autenticação", "app.error_auto_compact_scope": "A compactação automática de contexto só pode ser alterada para um workspace local ou um workspace de servidor OpenWork com permissão de escrita.", @@ -886,7 +22,7 @@ export default { "app.error_compact_empty": "Nada para compactar ainda.", "app.error_compact_no_session": "Selecione uma sessão com mensagens antes de executar /compact.", "app.error_compact_no_session_id": "Selecione uma sessão antes de compactar.", - "app.error_connect_first": "Conecte-se a este worker antes de aplicar alterações de runtime.", + "app.error_connect_first": "Conecte a este worker antes de aplicar alterações de runtime.", "app.error_connection_failed": "Falha na conexão", "app.error_connection_failed_url": "Falha na conexão. Verifique a URL e o token.", "app.error_deep_link_unrecognized": "Esse link não é um deep link ou URL de compartilhamento reconhecido do OpenWork.", @@ -920,21 +56,74 @@ export default { "app.skills_hint_disconnected": "Servidor OpenWork indisponível. Adicione a URL/token do servidor em Avançado para gerenciar skills.", "app.skills_hint_limited": "O servidor OpenWork precisa de um token de host para instalar/atualizar skills. Adicione-o em Avançado e reconecte.", "app.skills_hint_readonly": "O servidor OpenWork está em modo somente leitura para skills. Adicione um token de host em Avançado para habilitar instalações.", + "app.unknown_error": "Erro desconhecido", "app.worker_fallback": "Worker", - - // ==================== Common (additional) ==================== + "automations.desktop_required": "Tarefas agendadas requerem o app desktop.", + "automations.failed_to_load": "Falha ao carregar tarefas agendadas.", + "automations.prompt_empty": "O prompt da automação está vazio.", + "automations.prompt_required": "O prompt é obrigatório.", + "automations.schedule_required": "O agendamento é obrigatório.", + "automations.server_needs_token": "O servidor OpenWork precisa de um token para carregar tarefas agendadas.", + "automations.server_not_ready": "Servidor OpenWork não está pronto.", + "automations.server_unavailable": "Servidor OpenWork indisponível. Conecte para sincronizar tarefas agendadas.", + "blueprint.automation_body": "Comece com um workflow reutilizável ou digite sua tarefa abaixo.", + "blueprint.automation_title": "O que você quer automatizar?", + "blueprint.csv_session_assistant": "Posso ajudar a gerar, limpar, mesclar e resumir arquivos CSV. Que tipo de trabalho com CSV você quer automatizar?", + "blueprint.csv_session_title": "Ideias de workflow com CSV", + "blueprint.csv_session_user": "Quero combinar exportações de várias ferramentas em um CSV limpo.", + "blueprint.empty_body": "Escolha um ponto de partida ou digite abaixo.", + "blueprint.empty_title": "O que você quer fazer?", + "blueprint.minimal_body": "Faça uma pergunta sobre este workspace ou use um prompt inicial.", + "blueprint.minimal_title": "Comece com uma tarefa", + "blueprint.starter_blueprint_desc": "Projete um workflow reproduzível com skills, comandos e etapas de handoff.", + "blueprint.starter_blueprint_prompt": "Me ajude a projetar um blueprint de automação reutilizável para este workspace. Pergunte o que deve ser padronizado e depois proponha o workflow.", + "blueprint.starter_blueprint_title": "Planejar um blueprint de automação", + "blueprint.starter_chrome_desc": "Comece uma conversa de automação de navegador agora mesmo.", + "blueprint.starter_chrome_prompt": "Me ajude a conectar ao Chrome e automatizar uma tarefa repetitiva.", + "blueprint.starter_chrome_title": "Automatizar Chrome", + "blueprint.starter_command_desc": "Transforme um workflow repetido em um comando slash para este workspace.", + "blueprint.starter_command_prompt": "Me ajude a criar um /comando reutilizável para este workspace. Pergunte qual workflow eu quero automatizar e depois elabore o comando.", + "blueprint.starter_command_title": "Criar um comando reutilizável", + "blueprint.starter_connect_openai_desc": "Adicione seu provedor OpenAI para que os modelos ChatGPT estejam prontos em novas sessões.", + "blueprint.starter_connect_openai_title": "Conectar ChatGPT", + "blueprint.starter_csv_desc": "Limpe ou gere dados de planilha.", + "blueprint.starter_csv_prompt": "Me ajude a criar ou editar arquivos CSV neste computador.", + "blueprint.starter_csv_title": "Trabalhar com CSV", + "blueprint.starter_explore_desc": "Resuma os arquivos e sugira a melhor primeira tarefa a realizar.", + "blueprint.starter_explore_prompt": "Resuma este workspace, aponte os arquivos mais importantes e sugira a melhor primeira tarefa.", + "blueprint.starter_explore_title": "Explorar este workspace", + "blueprint.welcome_message": "Olá, boas-vindas ao OpenWork!\n\nAs pessoas usam o OpenWork para escrever arquivos .csv no computador, conectar ao Chrome e automatizar tarefas repetitivas, e sincronizar contatos com o Notion.\n\nMas o único limite é a sua imaginação.\n\nO que você gostaria de fazer?", + "blueprint.welcome_title": "Boas-vindas ao OpenWork", "common.add": "Adicionar", - "common.copied": "Copiado", - "common.copy": "Copiar", + "common.cancel": "Cancelar", + "common.choose": "Escolher", + "common.close": "Fechar", + "common.default_parens": "(padrão)", "common.done": "Concluído", + "common.edit": "Editar", + "common.hide": "Ocultar", + "common.install": "Instalar", + "common.navigate": "navegar", + "common.next": "Próximo", + "common.off": "Desativado", + "common.on": "Ativado", + "common.path": "Caminho", + "common.question": "Pergunta", + "common.refresh": "Atualizar", + "common.remove": "Remover", "common.reset": "Redefinir", + "common.retry": "Tentar novamente", + "common.save": "Salvar", + "common.select": "selecionar", + "common.show": "Mostrar", + "common.something_went_wrong": "Algo deu errado", + "common.submit": "Enviar", "common.unknown": "Desconhecido", - - // ==================== Composer ==================== "composer.agent_label": "Agente", "composer.attach_files": "Anexar arquivos", "composer.attachments_unavailable": "Anexos não estão disponíveis.", "composer.behavior_label": "Comportamento", + "composer.configure": "Configurar", "composer.default_agent": "Agente padrão", "composer.expand_pasted": "Clique para expandir o texto colado", "composer.failed_read_attachment": "Falha ao ler o anexo", @@ -945,25 +134,100 @@ export default { "composer.inserted_links_unsupported": "Links inseridos para arquivos não suportados.", "composer.loading_agents": "Carregando agentes...", "composer.loading_commands": "Carregando comandos...", - "composer.no_commands": "Nenhum comando encontrado.", - "composer.configure": "Configurar", - "composer.tools_label": "Comandos, skills e MCPs", "composer.mcps_label": "MCPs", + "composer.no_commands": "Nenhum comando encontrado.", "composer.no_matches": "Nenhuma correspondência encontrada.", "composer.placeholder": "Descreva sua tarefa...", "composer.remote_worker_paste_warning": "Este é um worker remoto. Sandboxes também são remotos. Para compartilhar arquivos, envie-os para a Pasta Compartilhada na barra lateral.", "composer.run_task": "Executar tarefa", "composer.skill_source": "Skill", "composer.stop": "Parar", + "composer.tools_label": "Comandos, skills e MCPs", "composer.unsupported_attachment_type": "Tipo de anexo não suportado.", "composer.upload_failed_local_links": "Não foi possível enviar para a pasta compartilhada. Links locais inseridos.", "composer.upload_to_shared_folder": "Enviar para pasta compartilhada", "composer.uploaded_multiple_files": "{count} arquivos enviados para a pasta compartilhada com links inseridos.", "composer.uploaded_single_file": "{name} enviado para a pasta compartilhada com link inserido.", - - // ==================== Context Panel ==================== + "config.auto_reload_desc": "Recarregar automaticamente após alterações em agentes/skills/comandos/config (apenas quando ocioso).", + "config.auto_reload_title": "Recarregamento automático (local)", + "config.auto_reload_unavailable": "Disponível para workspaces locais no app desktop.", + "config.collaborator_token_disabled_hint": "Armazenado antecipadamente para compartilhamento remoto, mas o acesso remoto está desativado.", + "config.collaborator_token_label": "Token de colaborador", + "config.collaborator_token_remote_hint": "Acesso remoto rotineiro para celulares ou laptops conectando a este servidor.", + "config.connection_failed": "Falha na conexão.", + "config.connection_failed_check": "Falha na conexão. Verifique a URL e o token do host.", + "config.connection_status_updated": "Status da conexão atualizado.", + "config.connection_successful": "Conexão bem-sucedida.", + "config.copied": "Copiado", + "config.copy": "Copiar", + "config.desktop_only_hint": "Alguns recursos de config (compartilhamento de servidor local + bridge de mensagens) requerem o app desktop.", + "config.diagnostics_desc": "Copiar estado de runtime sanitizado para depuração.", + "config.diagnostics_title": "Pacote de diagnósticos", + "config.enable_auto_reload_first": "Ative o recarregamento automático primeiro", + "config.engine_reload_desc": "Reiniciar o servidor OpenCode para este workspace.", + "config.engine_reload_title": "Recarregar engine", + "config.host_admin_token_hint": "Token interno apenas para o host, usado para CLI de aprovações e APIs admin. Não use no fluxo de conexão do app remoto.", + "config.host_admin_token_label": "Token admin do host", + "config.host_local_only": "Apenas local", + "config.host_offline": "Offline", + "config.host_remote_enabled": "Remoto ativado", + "config.local_ip_hint": "Use seu IP local na mesma rede Wi-Fi para a conexão mais rápida.", + "config.mdns_hint": "Nomes .local são mais fáceis de lembrar, mas podem não resolver em todas as redes.", + "config.messaging_identities_desc": "Gerencie identidades do Telegram/Slack e roteamento na aba Identidades.", + "config.messaging_identities_title": "Identidades de mensagens", + "config.not_set": "Não definido", + "config.owner_token_disabled_hint": "Relevante apenas após ativar o acesso remoto para este worker.", + "config.owner_token_label": "Token do proprietário", + "config.owner_token_remote_hint": "Use quando o cliente remoto precisar responder a prompts de permissão ou executar ações exclusivas do proprietário.", + "config.reload_active_tasks_warning": "O recarregamento parará as tarefas ativas.", + "config.reload_availability_hint": "O recarregamento está disponível apenas para workers locais ou servidores OpenWork conectados.", + "config.reload_connect_hint": "Conecte a este worker para recarregar.", + "config.reload_engine": "Recarregar engine", + "config.reload_now_desc": "Aplica atualizações de config e reconecta sua sessão.", + "config.reload_now_title": "Recarregar agora", + "config.reloading": "Recarregando...", + "config.remote_access_off_hint": "O acesso remoto está desativado. Use Compartilhar workspace para ativá-lo antes de conectar de outra máquina.", + "config.resolved_worker_url": "URL do worker resolvida:", + "config.resume_sessions_desc": "Se um recarregamento foi enfileirado enquanto tarefas estavam em execução, envia uma mensagem de retomada depois.", + "config.resume_sessions_title": "Retomar sessões após recarregamento automático", + "config.server_needed_hint": "Conexão com o servidor OpenWork necessária para sincronizar skills, plugins e comandos.", + "config.server_section_desc": "Conecte a um servidor OpenWork. Use a URL mais um token de colaborador ou proprietário do administrador do servidor.", + "config.server_section_title": "Servidor OpenWork", + "config.server_sharing_desc": "Compartilhe esses dados com um dispositivo de confiança. Mantenha o servidor na mesma rede para a configuração mais rápida.", + "config.server_sharing_menu_hint": "Para links de compartilhamento por workspace, use Compartilhar... no menu do workspace.", + "config.server_sharing_title": "Compartilhamento do servidor OpenWork", + "config.server_url_hint": "Use a URL compartilhada pelo seu servidor OpenWork. Workers locais do desktop reutilizam uma porta alta persistente na faixa 48000-51000.", + "config.server_url_input_label": "URL do servidor OpenWork", + "config.server_url_label": "URL do Servidor OpenWork", + "config.starting_server": "Iniciando servidor…", + "config.status_connected": "Conectado", + "config.status_limited": "Limitado", + "config.status_not_connected": "Não conectado", + "config.test_connection": "Testar conexão", + "config.testing": "Testando...", + "config.testing_connection": "Testando conexão...", + "config.token_hint": "Opcional. Cole um token de colaborador para acesso rotineiro ou um token de proprietário quando este cliente precisar responder a prompts de permissão.", + "config.token_label": "Token de colaborador ou proprietário", + "config.token_placeholder": "Cole seu token", + "config.unavailable": "Indisponível", + "config.worker_id": "ID do Worker:", + "config.workspace_config_desc": "Essas configurações afetam o workspace selecionado. Ações somente de runtime se aplicam ao workspace conectado no momento.", + "config.workspace_config_title": "Config do workspace", + "config.workspace_id_prefix": "Workspace:", + "context_panel.add_button": "Adicionar", + "context_panel.add_folder_hint": "Adicione uma pasta para permitir que este workspace leia e edite arquivos fora do diretório raiz.", + "context_panel.adding_button": "Adicionando...", + "context_panel.always_available": "Sempre disponível", "context_panel.authorized_folders": "Pastas autorizadas", + "context_panel.authorized_folders_desc": "Conceda a este workspace acesso para ler e editar arquivos em diretórios fora da raiz.", + "context_panel.authorized_folders_no_access": "Conecte a um workspace OpenWork com permissão de escrita para editar as pastas autorizadas.", + "context_panel.browse_button": "Navegar", + "context_panel.config_access_unavailable": "O acesso à configuração do servidor OpenWork não está disponível para este workspace.", + "context_panel.config_read_only": "O servidor OpenWork está conectado em modo somente leitura para configuração do workspace.", "context_panel.context": "Contexto", + "context_panel.folder_already_authorized": "Pasta já autorizada.", + "context_panel.folders_updated": "Pastas autorizadas atualizadas.", + "context_panel.input_placeholder": "Digite o caminho de uma pasta para autorizar...", "context_panel.mcp": "MCP", "context_panel.mcp_connected": "Conectado", "context_panel.mcp_disabled": "Desativado", @@ -971,18 +235,32 @@ export default { "context_panel.mcp_failed": "Falhou", "context_panel.mcp_needs_auth": "Requer autenticação", "context_panel.mcp_register_client": "Registrar cliente", + "context_panel.no_external_folders": "Nenhuma pasta externa autorizada", "context_panel.no_mcp": "Nenhum servidor MCP carregado.", "context_panel.no_plugins": "Nenhum plugin carregado.", + "context_panel.no_server_workspace": "Nenhum workspace de servidor ativo selecionado.", "context_panel.no_skills": "Nenhuma skill carregada.", "context_panel.none_yet": "Nenhum ainda.", - "context_panel.open_file": "Abrir {path}", "context_panel.plugins": "Plugins", + "context_panel.preserving_entries": "Preservando {count} entradas de permissão não relacionadas a pastas.", + "context_panel.preserving_entry": "Preservando 1 entrada de permissão não relacionada a pasta.", + "context_panel.remove_folder": "Remover {name}", + "context_panel.saving_folders": "Salvando pastas autorizadas...", + "context_panel.server_disconnected": "Servidor OpenWork desconectado.", "context_panel.skills": "Skills", "context_panel.working_files": "Arquivos de trabalho", - - // ==================== Dashboard (additional) ==================== + "context_panel.workspace_root_available": "A raiz do workspace já está disponível.", + "context_panel.workspace_root_badge": "Raiz do workspace", + "context_panel.writable_workspace_required": "É necessário um workspace OpenWork com permissão de escrita para atualizar as pastas autorizadas.", "dashboard.access_token": "Token de acesso", "dashboard.access_token_optional_hint": "Adicione um token apenas se o worker exigir.", + "dashboard.blueprints_workspace": "Blueprints", + "dashboard.blueprints_workspace_desc": "Comece com um workspace pronto para automação com skills reutilizáveis, comandos e fluxos compartilhados.", + "dashboard.change": "Alterar", + "dashboard.choose_folder": "Escolher uma pasta", + "dashboard.choose_folder_continue": "Escolha uma pasta para continuar.", + "dashboard.choose_folder_next": "Compartilhar arquivos com seu workspace.", + "dashboard.choose_preset": "Escolher Predefinição", "dashboard.chooser_local_desc": "Crie um workspace neste dispositivo e, opcionalmente, comece a partir de um template de equipe.", "dashboard.chooser_remote_desc": "Conecte a um worker OpenWork auto-hospedado usando uma URL e token de acesso.", "dashboard.chooser_shared_desc": "Navegue por workers na nuvem compartilhados com sua organização e conecte em um passo.", @@ -992,20 +270,34 @@ export default { "dashboard.cloud_signin_next": "Você escolherá uma equipe e se conectará a um workspace existente em seguida.", "dashboard.cloud_signin_title": "Entrar no OpenWork Cloud", "dashboard.cloud_worker": "Worker na nuvem", + "dashboard.commands": "Comandos", "dashboard.connect_remote_button": "Conectar remoto", + "dashboard.connected": "Conectado", "dashboard.connecting": "Conectando...", "dashboard.create_local_workspace_subtitle": "Crie um workspace neste dispositivo e, opcionalmente, comece a partir de um template de equipe.", "dashboard.create_local_workspace_title": "Workspace local", "dashboard.create_remote_custom_subtitle": "Conecte a um worker OpenWork auto-hospedado.", "dashboard.create_remote_custom_title": "Conectar remoto personalizado", + "dashboard.create_remote_workspace_confirm": "Adicionar Workspace", + "dashboard.create_remote_workspace_subtitle": "Salvar um servidor OpenWork como workspace.", + "dashboard.create_remote_workspace_title": "Adicionar Workspace Remoto", + "dashboard.create_sandbox_confirm": "Criar como sandbox", "dashboard.create_shared_subtitle_signed_in": "Navegue por workers na nuvem compartilhados com sua organização e conecte em um passo.", "dashboard.create_shared_subtitle_signed_out": "Entre no OpenWork Cloud para acessar workers compartilhados com sua organização.", "dashboard.create_shared_title": "Workspaces compartilhados", + "dashboard.create_workspace_confirm": "Criar Workspace", + "dashboard.create_workspace_subtitle": "Inicializar um novo workspace baseado em pasta.", + "dashboard.create_workspace_title": "Criar Workspace", "dashboard.creating": "Criando...", "dashboard.desktop_badge": "Desktop", "dashboard.display_name_label": "Nome de exibição", "dashboard.display_name_optional": "(opcional)", "dashboard.docker_debug_details": "Detalhes de depuração do Docker", + "dashboard.edit_remote_workspace_confirm": "Salvar conexão", + "dashboard.edit_remote_workspace_subtitle": "Atualizar os dados do servidor OpenWork para este workspace.", + "dashboard.edit_remote_workspace_title": "Editar Conexão Remota", + "dashboard.empty_workspace": "Workspace vazio", + "dashboard.empty_workspace_desc": "Comece com uma pasta em branco e adicione o que precisar.", "dashboard.error_choose_org": "Escolha uma organização antes de abrir um workspace.", "dashboard.error_connect_worker": "Falha ao conectar a {name}.", "dashboard.error_create_template": "Falha ao criar {name}.", @@ -1013,24 +305,53 @@ export default { "dashboard.error_load_shared_workspaces": "Falha ao carregar workspaces compartilhados.", "dashboard.error_workspace_not_ready": "O workspace ainda não está pronto para conectar. Tente novamente em instantes.", "dashboard.import_config": "Importar config", - "dashboard.importing": "Importando\u2026", + "dashboard.importing": "Importando…", "dashboard.modal_back": "Voltar", "dashboard.modal_close": "Fechar modal de adicionar workspace", "dashboard.nav_ids": "IDs", "dashboard.no_folder_selected": "Nenhuma pasta selecionada ainda.", "dashboard.open_cloud_dashboard": "Abrir painel da nuvem", + "dashboard.opening": "Abrindo...", + "dashboard.openwork_host_hint": "Use a URL fornecida pelo seu servidor OpenWork.", + "dashboard.openwork_host_label": "URL do servidor OpenWork", + "dashboard.openwork_host_placeholder": "https://seu-servidor.openwork.app", + "dashboard.openwork_host_token_hint": "Opcional. Cole um token de colaborador para acesso rotineiro ou um token de proprietário quando este cliente precisar responder a prompts de permissão.", + "dashboard.openwork_host_token_label": "Token de colaborador ou proprietário", + "dashboard.openwork_host_token_placeholder": "Cole seu token", "dashboard.recently_updated": "Atualizados recentemente", + "dashboard.remote": "Remoto", + "dashboard.remote_base_url_required": "Adicione uma URL de servidor para continuar.", + "dashboard.remote_connection_direct": "Direto", + "dashboard.remote_connection_openwork": "OpenWork", + "dashboard.remote_directory_hint": "Deixe em branco para usar o padrão do servidor.", + "dashboard.remote_directory_label": "Diretório do workspace (opcional)", + "dashboard.remote_directory_placeholder": "/home/equipe/projeto", + "dashboard.remote_display_name_label": "Nome de exibição (opcional)", + "dashboard.remote_display_name_placeholder": "Workspace da equipe de design", "dashboard.remote_server_details_hint": "Conecte a um worker OpenWork auto-hospedado.", "dashboard.remote_server_details_title": "Detalhes do servidor remoto", + "dashboard.remote_workspace_hint": "Acompanhe um servidor OpenWork e reconecte a qualquer momento.", + "dashboard.remote_workspace_title": "Workspace remoto", + "dashboard.repair_cache": "Reparar cache", + "dashboard.repairing_cache": "Reparando cache", + "dashboard.sandbox_checking_docker": "Verificando Docker...", + "dashboard.sandbox_get_ready_action": "Preparar o sistema", + "dashboard.sandbox_get_ready_desc": "Execute este workspace em um container Docker isolado para execuções mais seguras e reproduzíveis.", + "dashboard.sandbox_get_ready_title": "Sandboxes precisam do Docker", "dashboard.sandbox_hide_logs": "Ocultar logs", "dashboard.sandbox_live_logs": "Logs ao vivo", "dashboard.sandbox_setup": "Configuração do sandbox", "dashboard.sandbox_show_logs": "Mostrar logs", "dashboard.search_shared_workspaces": "Buscar workspaces compartilhados", - "dashboard.shared_workspaces_loading": "Carregando workspaces compartilhados\u2026", + "dashboard.select_folder": "Selecionar Pasta", + "dashboard.settings": "Configurações", + "dashboard.shared_workspaces_loading": "Carregando workspaces compartilhados…", "dashboard.shared_workspaces_no_match": "Nenhum workspace compartilhado corresponde a essa busca.", "dashboard.shared_workspaces_none": "Nenhum workspace compartilhado disponível ainda.", - "dashboard.shared_workspaces_refreshing": "Atualizando workspaces\u2026", + "dashboard.shared_workspaces_refreshing": "Atualizando workspaces…", + "dashboard.skills": "Skills", + "dashboard.starter_workspace": "Workspace inicial", + "dashboard.starter_workspace_desc": "Pré-configurado para mostrar como usar plugins, comandos e skills.", "dashboard.team_templates_hint": "Escolha um ponto de partida ou deixe em branco para criar um workspace vazio.", "dashboard.team_templates_none": "Nenhum template de equipe encontrado para esta organização ainda.", "dashboard.team_templates_syncing": "Sincronizando", @@ -1050,12 +371,13 @@ export default { "dashboard.workspace_folder_hint": "Escolha onde este workspace ficará no seu dispositivo.", "dashboard.workspace_folder_title": "Pasta do workspace", "dashboard.workspace_not_ready_title": "Este workspace ainda não está pronto para conectar.", - - // ==================== Den ==================== + "dashboard.workspaces": "Workspaces", "den.active_org_hint": "Workers na nuvem e templates de equipe estão vinculados à organização selecionada.", "den.active_org_title": "Organização ativa", "den.auto_reconnect_hint": "Conclua a autenticação no navegador e o OpenWork reconectará aqui automaticamente.", "den.checking_session": "Verificando sessão", + "den.choose_org_for_providers": "Escolha uma organização para ver provedores cloud.", + "den.choose_org_for_skill_hubs": "Escolha uma organização para ver hubs de skills cloud.", "den.choose_org_for_templates": "Escolha uma organização para ver os templates de equipe.", "den.cloud_account_hint": "Gerencie sua conta conectada e organização.", "den.cloud_account_title": "Conta Cloud", @@ -1064,12 +386,18 @@ export default { "den.cloud_control_plane_save": "Salvar URL", "den.cloud_control_plane_url_hint": "Apenas modo desenvolvedor. Use para apontar para um plano de controle Cloud local ou auto-hospedado. Alterá-lo desconecta você para que o app possa se re-hidratar no novo plano de controle.", "den.cloud_control_plane_url_label": "URL do plano de controle Cloud", + "den.cloud_provider_detail": "{count} modelos · provedor {source}", + "den.cloud_provider_removed_detail": "Este provedor importado não está mais no cloud. Desinstale a configuração local {providerId}.", + "den.cloud_provider_sync_detail": "O provedor cloud mudou. Sincronize a configuração {source} com {count} modelos para o opencode.jsonc.", + "den.cloud_providers_hint": "Importe provedores LLM gerenciados para o opencode.jsonc e use a credencial da organização neste workspace.", + "den.cloud_providers_title": "Provedores cloud", "den.cloud_section_desc": "Entre, escolha uma organização e abra workers Cloud ou templates de equipe.", "den.cloud_section_title": "OpenWork Cloud", "den.cloud_sleep_hint": "Entre no OpenWork Cloud para manter suas tarefas ativas mesmo quando seu computador entrar em suspensão.", "den.cloud_workers_hint": "Abra workers diretamente no OpenWork usando o mesmo fluxo de conexão remota que o app já usa.", "den.cloud_workers_title": "Workers na nuvem", "den.create_account": "Criar conta", + "den.credentials_ready_badge": "Credencial pronta", "den.error_base_url": "Digite uma URL de plano de controle Cloud válida com http:// ou https://.", "den.error_choose_org": "Escolha uma organização antes de abrir um worker.", "den.error_load_orgs": "Falha ao carregar organizações.", @@ -1086,44 +414,31 @@ export default { "den.finish_signin": "Concluir login", "den.finishing": "Concluindo...", "den.hide_signin_code": "Ocultar código de login", + "den.import_all": "Importar tudo", + "den.import_provider": "Importar", + "den.import_provider_failed": "Falha ao importar {name}.", + "den.imported_badge": "Importado", + "den.imported_provider": "{name} importado.", + "den.importing": "Importando…", "den.needs_attention": "Requer atenção", + "den.no_cloud_providers": "Nenhum provedor cloud disponível para esta organização.", "den.no_cloud_workers": "Nenhum worker na nuvem visível para esta organização ainda. Crie um no Cloud e atualize esta aba.", "den.no_org_selected": "Nenhuma organização selecionada", - "den.no_team_templates": "Nenhum template de equipe ainda. Use Compartilhar \u2192 Template \u2192 Compartilhar com a equipe.", + "den.no_skill_hubs": "Nenhum hub de skills cloud disponível para esta organização.", + "den.no_team_templates": "Nenhum template de equipe ainda. Use Compartilhar → Template → Compartilhar com a equipe.", "den.open": "Abrir", "den.opening": "Abrindo...", - "den.import_all": "Import all", - "den.import_provider": "Import", - "den.importing": "Importing...", - "den.removing": "Removing...", - "den.sync": "Sync", - "den.syncing": "Syncing...", - "den.uninstall": "Uninstall", - "den.imported_badge": "Imported", - "den.out_of_sync_badge": "Out of sync", - "den.removed_from_cloud_badge": "Removed from cloud", - "den.credentials_ready_badge": "Credential ready", - "den.skill_hubs_title": "Skill hubs", - "den.skill_hubs_hint": "Import every skill from a shared cloud hub into this workspace in one step.", - "den.choose_org_for_skill_hubs": "Choose an org to view cloud skill hubs.", - "den.no_skill_hubs": "No cloud skill hubs are available for this org yet.", - "den.skill_hub_skills_badge": "{count} skills", - "den.skill_hub_detail": "Import {count} shared skills into .opencode/skills.", - "den.skill_hub_imported_detail": "Imported {count} skills into this workspace.", - "den.skill_hub_sync_detail": "Cloud now has {liveCount} skills; this workspace imported {importedCount}. Sync to update the installed set.", - "den.skill_hub_removed_detail": "This hub was removed from cloud. Uninstall the {importedCount} imported skills from this workspace.", - "den.cloud_providers_title": "Cloud providers", - "den.cloud_providers_hint": "Import managed LLM providers into opencode.jsonc and use the org credential in this workspace.", - "den.choose_org_for_providers": "Choose an org to view cloud providers.", - "den.no_cloud_providers": "No cloud providers are available for this org yet.", - "den.cloud_provider_detail": "{count} models · {source} provider", - "den.cloud_provider_sync_detail": "Cloud provider changed. Sync the {count} model {source} config into opencode.jsonc.", - "den.cloud_provider_removed_detail": "This imported provider is no longer in cloud. Uninstall the local {providerId} config.", "den.org_member_suffix": "(Membro)", "den.org_owner_suffix": "(Proprietário)", "den.org_switched": "Alterado para {name}.", + "den.out_of_sync_badge": "Desatualizado", "den.paste_signin_code": "Colar código de login", "den.refresh": "Atualizar", + "den.reload_workspace": "Recarregue o workspace para aplicar as alterações.", + "den.remove_provider_failed": "Falha ao remover {name}.", + "den.removed_from_cloud_badge": "Removido do cloud", + "den.removed_provider": "{name} removido.", + "den.removing": "Removendo…", "den.sign_out": "Sair", "den.signed_out": "Desconectado", "den.signin_button": "Entrar", @@ -1134,12 +449,19 @@ export default { "den.signin_title": "Entrar no OpenWork Cloud", "den.signing_in": "Concluindo login no OpenWork Cloud...", "den.signing_out": "Saindo...", + "den.skill_hub_detail": "Importar {count} skills compartilhadas para .opencode/skills.", + "den.skill_hub_imported_detail": "Importadas {count} skills para este workspace.", + "den.skill_hub_removed_detail": "Este hub foi removido do cloud. Desinstale as {importedCount} skills importadas deste workspace.", + "den.skill_hub_skills_badge": "{count} skills", + "den.skill_hub_sync_detail": "O cloud agora tem {liveCount} skills; este workspace importou {importedCount}. Sincronize para atualizar.", + "den.skill_hubs_hint": "Importe todas as skills de um hub cloud compartilhado para este workspace de uma vez.", + "den.skill_hubs_title": "Hubs de skills", "den.status_base_url_updated": "URL do plano de controle Cloud atualizada. Entre novamente para continuar.", "den.status_browser_signin": "Conclua o login no navegador para conectar o OpenWork.", "den.status_browser_signup": "Conclua a criação da conta no navegador para conectar o OpenWork.", "den.status_cloud_signed_in_as": "OpenWork Cloud conectado como {email}.", "den.status_cloud_signin_done": "OpenWork Cloud conectado.", - "den.status_loaded_orgs": "{count} organização{plural} carregada{plural}.", + "den.status_loaded_orgs": "{count} org{plural} carregada{plural}.", "den.status_loaded_templates": "{count} template{plural} carregado{plural} para {name}.", "den.status_loaded_workers": "{count} worker{plural} carregado{plural} para {name}.", "den.status_no_templates": "Nenhum template de equipe encontrado para {name}.", @@ -1148,39 +470,177 @@ export default { "den.status_opened_template_fallback": "{name} aberto dos templates de equipe.", "den.status_opened_worker": "{name} aberto no OpenWork.", "den.status_signed_in_as": "Conectado como {email}.", - "den.status_signed_out": "Sessão do OpenWork Cloud desconectada e limpa neste dispositivo.", + "den.status_signed_out": "Saiu do OpenWork Cloud e a sessão foi limpa neste dispositivo.", + "den.sync": "Sincronizar", + "den.sync_provider_failed": "Falha ao sincronizar {name}.", + "den.synced_provider": "{name} sincronizado.", + "den.syncing": "Sincronizando…", "den.team_template_badge": "Template de equipe", "den.team_templates_hint": "Abra templates de workspace reutilizáveis compartilhados com esta organização.", "den.team_templates_title": "Templates de equipe", + "den.uninstall": "Desinstalar", "den.worker_mine_badge": "Meu", "den.worker_not_ready_title": "Este worker ainda não está pronto para abrir.", "den.worker_provider_label": "Worker {provider}", "den.worker_secondary_cloud": "Worker na nuvem", - - // ==================== Den Settings ==================== - "den_settings.manage_account": "Gerenciar conta", - "den_settings.no_workers": "Nenhum workspace compartilhado encontrado.", - "den_settings.open_workspace": "Abrir workspace", - "den_settings.refresh": "Atualizar", - "den_settings.sign_in": "Entrar", - "den_settings.sign_in_hint": "Entre no OpenWork Cloud para acessar workspaces compartilhados e recursos de equipe.", - "den_settings.sign_out": "Sair", - "den_settings.signed_in_as": "Conectado como", - "den_settings.title": "Cloud", - "den_settings.workers_hint": "Workspaces na nuvem compartilhados com sua organização.", - "den_settings.workers_title": "Workspaces compartilhados", - - // ==================== Extensions ==================== + "extensions.app_count_one": "{count} app conectado", + "extensions.app_count_many": "{count} apps conectados", + "extensions.apps_mcp_header": "Apps (MCP)", + "extensions.filter_all": "Todos", + "extensions.filter_apps": "Apps", + "extensions.filter_plugins": "Plugins", + "extensions.plugin_count_one": "{count} plugin", + "extensions.plugin_count_many": "{count} plugins", + "extensions.plugins_opencode_header": "Plugins (OpenCode)", + "extensions.subtitle": "Apps (MCP) e plugins OpenCode ficam em um só lugar.", "extensions.title": "Extensões", - - // ==================== Inbox Panel ==================== + "identities.agent_behavior_desc": "Um arquivo por workspace. Adicione uma primeira linha opcional @agent para rotear via um agente OpenCode específico.", + "identities.agent_behavior_title": "Comportamento do agente de mensagens", + "identities.agent_created": "Arquivo padrão do agente de mensagens criado.", + "identities.agent_file_changed": "Arquivo alterado remotamente. Recarregue e salve novamente.", + "identities.agent_loading": "Carregando arquivo do agente…", + "identities.agent_none": "nenhum", + "identities.agent_not_found": "Arquivo do agente não encontrado neste workspace ainda.", + "identities.agent_placeholder": "Adicione instruções de comportamento de mensagens para o opencodeRouter aqui...", + "identities.agent_saved": "Comportamento de mensagens salvo.", + "identities.agent_scope_status": "Escopo ativo: workspace · status: {status} · agente selecionado: {agent}", + "identities.agent_status_loaded": "carregado", + "identities.agent_status_missing": "ausente", + "identities.agent_worker_scope_unavailable": "Escopo do worker indisponível.", + "identities.all_channels": "Todos os canais", + "identities.app_token_label": "Token do app", + "identities.auto_bind_label": "Vincular peer ao diretório automaticamente ao enviar diretamente", + "identities.available_channels": "Canais disponíveis", + "identities.bot_token_label": "Token do bot", + "identities.bot_token_placeholder": "Cole o token do bot Telegram do @BotFather", + "identities.botfather_step1_open": "1. Abra o @BotFather no Telegram", + "identities.botfather_step1_run": "e execute /newbot", + "identities.botfather_step3_choose": "3. Escolha um nome e username para seu bot", + "identities.botfather_step3_or_private": "para caixa aberta ou", + "identities.botfather_step3_private": "Privado", + "identities.botfather_step3_public": "Público", + "identities.botfather_step3_to_require": "para exigir", + "identities.channel_label": "Canal", + "identities.channels_connected": "conectados", + "identities.channels_label": "Canais", + "identities.configured_suffix": "configurado", + "identities.connect_server_desc": "As identidades ficam disponíveis quando você está conectado a um servidor OpenWork.", + "identities.connect_server_title": "Conectar a um servidor OpenWork", + "identities.connect_slack": "Conectar Slack", + "identities.connected_badge": "Conectado", + "identities.connecting": "Conectando...", + "identities.copy_bot_token_hint": "Copie o token do bot e cole abaixo.", + "identities.copy_code": "Copiar código", + "identities.create_default_file": "Criar arquivo padrão", + "identities.create_private_bot": "Criar bot privado", + "identities.create_public_bot": "Criar bot público", + "identities.days_ago": "{days}d atrás", + "identities.default_routing": "Roteamento padrão", + "identities.directory_label": "Diretório (opcional)", + "identities.disable_messaging": "Desativar mensagens", + "identities.disable_messaging_message": "Isso desativará as mensagens para este workspace. A configuração do Telegram e Slack ficará oculta até que as mensagens sejam reativadas, e você precisará reiniciar o worker para parar completamente o sidecar de mensagens.", + "identities.disable_messaging_title": "Desativar mensagens para este worker?", + "identities.disabled_label": "Desativado", + "identities.disabling": "Desativando...", + "identities.disconnect": "Desconectar", + "identities.dispatched_messages": "{sent}/{attempted} mensagens despachadas.", + "identities.enable_messaging": "Ativar mensagens", + "identities.enable_messaging_risk": "Mensagens podem expor este worker a comandos remotos. Se o bot for público ou comprometido, pode acessar arquivos, credenciais e chaves de API disponíveis neste worker.", + "identities.enable_messaging_title": "Ativar mensagens para este worker?", + "identities.enabled_label": "Ativado", + "identities.enabling": "Ativando...", + "identities.health_offline": "Offline", + "identities.health_running": "Em execução", + "identities.health_unavailable": "Indisponível", + "identities.health_unavailable_status": "Status do OpenCodeRouter indisponível ({status})", + "identities.health_unknown": "Desconhecido", + "identities.hours_ago": "{hours}h atrás", + "identities.identities_label": "Identidades", + "identities.just_now": "Agora mesmo", + "identities.last_activity": "Última atividade", + "identities.later": "Depois", + "identities.message_label": "Mensagem", + "identities.message_routing_desc": "Controle quais conversas vão para qual pasta do workspace. Mensagens são roteadas para a pasta padrão do worker, a menos que você configure regras aqui.", + "identities.message_routing_title": "Roteamento de mensagens", + "identities.messages_today": "Mensagens hoje", + "identities.messaging_disabled_hint": "Ative as mensagens apenas se entender o risco e planejar proteger o acesso (por exemplo, emparelhamento privado do Telegram).", + "identities.messaging_disabled_restart": "Mensagens desativadas. Reinicie este worker para parar o sidecar de mensagens.", + "identities.messaging_disabled_risk": "Bots de mensagens podem executar ações contra seu worker local. Se expostos publicamente, podem permitir acesso a arquivos, credenciais e chaves de API disponíveis neste worker.", + "identities.messaging_disabled_title": "Mensagens desativadas por padrão", + "identities.messaging_enabled_restart": "Mensagens ativadas. Reinicie este worker para iniciar o sidecar de mensagens e desbloquear a configuração do Telegram e Slack.", + "identities.messaging_sidecar_not_running": "Mensagens estão ativadas neste workspace, mas o sidecar de mensagens ainda não está em execução. Reinicie este worker e volte às configurações de Mensagens para conectar o Telegram ou Slack.", + "identities.minutes_ago": "{minutes}m atrás", + "identities.not_set": "Não definido", + "identities.open_bot_link": "Abrir @{username} no Telegram", + "identities.pairing_code_copied": "Código de emparelhamento copiado.", + "identities.pairing_code_copy_failed": "Não foi possível copiar o código de emparelhamento. Copie manualmente.", + "identities.pairing_code_instruction_prefix": "Envie", + "identities.peer_id_label": "ID do peer (opcional)", + "identities.peer_id_placeholder_slack": "ex: slack:U12345678", + "identities.peer_id_placeholder_telegram": "ex: telegram:123456789", + "identities.private_label": "Privado", + "identities.private_pairing_code": "Código de emparelhamento privado", + "identities.public_bot_confirm": "Sim, entendo o risco", + "identities.public_bot_warning_message": "Seu bot será acessível ao público e qualquer pessoa que obter acesso ao bot terá acesso total ao seu worker local, incluindo arquivos e chaves de API que você concedeu. Se criar um bot privado, você pode limitar quem pode acessá-lo exigindo um token de emparelhamento. Tem certeza de que deseja tornar seu bot público?", + "identities.public_bot_warning_title": "Tornar este bot público?", + "identities.public_label": "Público", + "identities.quick_setup": "Configuração rápida", + "identities.reconnect_failed": "Falha ao reconectar. Verifique a URL/token do OpenWork e tente novamente.", + "identities.reconnected": "Reconectado.", + "identities.reconnected_refreshing": "Reconectado. Atualizando estado do worker...", + "identities.reload": "Recarregar", + "identities.repair_reconnect": "Reparar e reconectar", + "identities.restart_failed": "Falha ao reiniciar. Reinicie o worker nas Configurações e tente novamente.", + "identities.restart_to_disable_messaging": "Mensagens foram desativadas para este workspace. Reinicie o worker agora para parar o sidecar de mensagens.", + "identities.restart_to_enable_messaging": "Mensagens foram ativadas para este workspace. Reinicie o worker agora para iniciar o sidecar de mensagens e desbloquear a configuração do Telegram e Slack.", + "identities.restart_worker": "Reiniciar worker", + "identities.restart_worker_title": "Reiniciar worker agora?", + "identities.restarting": "Reiniciando...", + "identities.routing_override_prefix": "Todas as mensagens roteadas para", + "identities.routing_override_suffix": "(substituição ativa)", + "identities.running_label": "Em execução", + "identities.save_behavior": "Salvar comportamento", + "identities.saving": "Salvando...", + "identities.send_test_button": "Enviar mensagem de teste", + "identities.send_test_desc": "Validar a conexão de saída. Use um ID de peer para envio direto ou deixe o ID de peer vazio para distribuir por bindings em um diretório.", + "identities.send_test_title": "Enviar mensagem de teste", + "identities.sending": "Enviando...", + "identities.slack_desc": "Seu worker aparece como um bot nos canais do Slack. Membros da equipe podem enviar mensagens diretamente ou mencioná-lo em threads.", + "identities.slack_intro": "Conecte seu workspace do Slack para que membros da equipe interajam com este worker em canais e DMs.", + "identities.slack_unavailable": "Identidades do Slack indisponíveis.", + "identities.status_active": "Ativo", + "identities.status_label": "Status", + "identities.status_stopped": "Parado", + "identities.stopped_label": "Parado", + "identities.subtitle": "Permita que pessoas alcancem seu worker por apps de mensagens. Conecte um canal e seu worker lerá e responderá mensagens automaticamente.", + "identities.tab_general": "Geral", + "identities.telegram_bot_access_desc": "Bot público: o primeiro chat do Telegram vincula automaticamente. Bot privado: requer código de emparelhamento antes de qualquer mensagem executar ferramentas.", + "identities.telegram_delete_failed": "Falha ao excluir.", + "identities.telegram_deleted": "Excluído.", + "identities.telegram_deleted_pending": "Excluído (pendente aplicação).", + "identities.telegram_desc": "Conecte um bot Telegram em modo público (caixa aberta) ou modo privado (código de emparelhamento obrigatório).", + "identities.telegram_private_saved_pair": "Bot privado salvo. Emparelhe via /pair {code}", + "identities.telegram_save_failed": "Falha ao salvar.", + "identities.telegram_saved": "Salvo.", + "identities.telegram_saved_pending": "Salvo (pendente aplicação).", + "identities.telegram_saved_username": "Salvo (@{username})", + "identities.telegram_unavailable": "Identidades do Telegram indisponíveis.", + "identities.title": "Canais de mensagens", + "identities.unsaved_changes": "Alterações não salvas", + "identities.worker_offline": "Worker offline", + "identities.worker_online": "Worker online", + "identities.worker_restarted": "Worker reiniciado.", + "identities.worker_restarted_refreshing": "Worker reiniciado. Atualizando status de mensagens...", + "identities.worker_scope_unavailable": "Escopo do worker indisponível.", + "identities.worker_scope_unavailable_detail": "Escopo do worker indisponível. Reconecte usando uma URL de worker ou mude para um worker conhecido.", + "identities.worker_unavailable": "Worker indisponível", + "identities.workspace_id_required": "O ID do workspace é obrigatório para gerenciar identidades. Reconecte com uma URL de workspace ou selecione um workspace mapeado neste host.", + "identities.workspace_scope_prefix": "Escopo do workspace:", "inbox_panel.connect_to_download": "Conecte a um worker para baixar arquivos compartilhados.", "inbox_panel.connect_to_see": "Conecte para ver os arquivos compartilhados.", "inbox_panel.connect_to_upload": "Conecte a um worker para enviar", - "inbox_panel.copied_path": "Copiado: {path}", "inbox_panel.copy_failed": "Falha ao copiar. Seu navegador pode bloquear o acesso à área de transferência.", "inbox_panel.download": "Baixar", - "inbox_panel.download_failed": "Falha no download", "inbox_panel.drop_to_upload": "Solte os arquivos aqui para enviar", "inbox_panel.helper_text": "Compartilhe arquivos com este worker pelo app.", "inbox_panel.load_failed": "Falha ao carregar a pasta compartilhada", @@ -1195,12 +655,93 @@ export default { "inbox_panel.upload_success": "Enviado para a pasta compartilhada.", "inbox_panel.uploading": "Enviando...", "inbox_panel.uploading_label": "Enviando {label}...", - - // ==================== MCP (additional) ==================== + "mcp.activate_button": "Ativar", + "mcp.add_modal_subtitle": "Conecte um servidor MCP personalizado por URL ou comando local.", + "mcp.add_modal_title": "Adicionar App Personalizado", + "mcp.add_server_button": "Adicionar app", + "mcp.advanced": "Avançado", + "mcp.advanced_settings": "Configurações avançadas", + "mcp.advanced_settings_hint": "Edite arquivos de configuração e gerencie conexões manualmente.", + "mcp.app_connected": "app conectado", + "mcp.apps_connected": "apps conectados", + "mcp.apps_subtitle": "Conecte suas ferramentas favoritas para que o OpenWork as use em seu nome.", + "mcp.apps_title": "Apps", + "mcp.auth.already_connected": "Já Conectado", + "mcp.auth.already_connected_description": "{server} já está autenticado e pronto para uso.", + "mcp.auth.applying_changes_body": "Estamos reiniciando o worker para que o novo MCP esteja pronto para autenticar.", + "mcp.auth.applying_changes_title": "Aplicando alterações antes do login", + "mcp.auth.authorization_link": "Link de autorização", + "mcp.auth.authorization_still_required": "A autorização ainda é necessária. Tente novamente para reiniciar o fluxo.", + "mcp.auth.callback_invalid": "Cole a URL de callback ou o parâmetro de código para concluir o OAuth.", + "mcp.auth.callback_label": "URL de callback ou código", + "mcp.auth.callback_placeholder": "http://127.0.0.1:19876/mcp/oauth/callback?code=...", + "mcp.auth.cancel": "Cancelar", + "mcp.auth.client_registration_required": "O registro do cliente é necessário antes de continuar com o OAuth.", + "mcp.auth.complete_connection": "Concluir conexão", + "mcp.auth.configured_previously": "O MCP pode ter sido configurado globalmente ou em uma sessão anterior. Você pode fechar este modal e começar a usar as ferramentas MCP imediatamente.", + "mcp.auth.connect_server": "Conectar {server}", + "mcp.auth.copied": "Copiado", + "mcp.auth.copy_link": "Copiar link", + "mcp.auth.done": "Concluído", + "mcp.auth.failed_to_start_oauth": "Falha ao iniciar fluxo OAuth", + "mcp.auth.follow_browser_steps": "Siga os passos de autorização no navegador.", + "mcp.auth.force_stop": "Forçar parada", + "mcp.auth.force_stopping": "Parando...", + "mcp.auth.im_done": "Terminei", + "mcp.auth.invalid_refresh_token": "O token de atualização OAuth é inválido ou expirou. Reautorize para continuar.", + "mcp.auth.manual_finish_hint": "Cole a URL de callback (localhost:19876) ou apenas o código para concluir a conexão.", + "mcp.auth.manual_finish_title": "Servidor remoto?", + "mcp.auth.oauth_completed_reload": "OAuth concluído. Recarregue o engine para ativar o MCP.", + "mcp.auth.oauth_failed": "Falha na autenticação OAuth.", + "mcp.auth.oauth_not_supported_hint": "Isso pode significar:\n• O servidor MCP não anuncia capacidades OAuth\n• O engine precisa recarregar para descobrir as capacidades do servidor\n• Tente: opencode mcp auth {server} pela CLI", + "mcp.auth.open_browser_signin": "Abriremos seu navegador para concluir o login.", + "mcp.auth.port_forward_hint": "Dica: encaminhe a porta de callback se necessário: ssh -L 19876:127.0.0.1:19876 user@host", + "mcp.auth.reauth_action": "Reautorizar OAuth", + "mcp.auth.reauth_cli_hint": "Execute: opencode mcp auth {server}", + "mcp.auth.reauth_failed": "Falha na reautorização.", + "mcp.auth.reauth_remote_hint": "Reautorize a partir da máquina que executa este worker.", + "mcp.auth.reauth_running": "Reautorizando...", + "mcp.auth.reload_blocked": "O recarregamento está pausado enquanto uma sessão está em execução. Pare a execução para concluir a configuração.", + "mcp.auth.reload_engine_retry": "Aplicar alterações e tentar novamente", + "mcp.auth.reload_failed": "Falha ao recarregar o worker antes do login.", + "mcp.auth.reload_notice": "Para isso ter efeito, o OpenWork precisa reiniciar o serviço worker. Isso pode interromper uma sessão em andamento.", + "mcp.auth.reload_remote_confirm": "Para isso ter efeito, o OpenWork precisa reiniciar o serviço worker. Isso pode parar sua sessão em andamento. Continuar?", + "mcp.auth.reopen_browser_link": "Clique aqui para reabrir o navegador", + "mcp.auth.request_timed_out": "Tempo da solicitação expirou.", + "mcp.auth.retry": "Tentar novamente", + "mcp.auth.retry_now": "Tentar Agora", + "mcp.auth.server_disabled": "Este servidor MCP está desativado. Ative-o e tente novamente.", + "mcp.auth.step1_description": "Iniciaremos o fluxo de login do {server} automaticamente.", + "mcp.auth.step1_title": "Abrindo seu navegador", + "mcp.auth.step2_description": "Entre e aprove o acesso quando solicitado.", + "mcp.auth.step2_title": "Autorizar o OpenWork", + "mcp.auth.step3_description": "Concluiremos a conexão assim que a autorização for completada.", + "mcp.auth.step3_title": "Volte aqui quando terminar", + "mcp.auth.try_reload_engine": "{message}. Tente recarregar o engine primeiro.", + "mcp.auth.waiting_authorization": "Aguardando a autorização ser concluída no seu navegador...", + "mcp.auth.waiting_for_conversation_body": "Vamos redirecioná-lo para autenticar assim que possível.", + "mcp.auth.waiting_for_conversation_title": "Aguardando conversa ser concluída", + "mcp.auth.waiting_for_session": "Aguardando {session} terminar", + "mcp.available_apps": "Apps disponíveis", + "mcp.cap_signin": "Login na conta", + "mcp.cap_tools": "Ferramentas de IA", + "mcp.config_file": "Arquivo de configuração", + "mcp.config_load_failed": "Não foi possível carregar o arquivo de configuração", + "mcp.config_not_loaded": "Ainda não carregado", + "mcp.config_source": "Da configuração", + "mcp.configured": "configurado", + "mcp.connect": "Conectar", + "mcp.connect_failed": "Não foi possível conectar. Tente novamente.", + "mcp.connect_server_first": "Conecte ao servidor primeiro.", + "mcp.connected": "Conectado", + "mcp.connected_badge": "Conectado", + "mcp.connecting": "Conectando...", + "mcp.connection_failed": "Problema de conexão, tente novamente", + "mcp.connection_type": "Conexão", "mcp.control_chrome_browser_hint": "No Chrome 144 ou mais recente, faça isso primeiro:", "mcp.control_chrome_browser_step_one": "Abra chrome://inspect/#remote-debugging.", - "mcp.control_chrome_browser_step_three": "Permita conexões de depuração quando o Chrome solicitar.", "mcp.control_chrome_browser_step_two": "Ative a depuração remota.", + "mcp.control_chrome_browser_step_three": "Permita conexões de depuração quando o Chrome solicitar.", "mcp.control_chrome_browser_title": "1. Ativar acesso ao Chrome", "mcp.control_chrome_connect": "Adicionar Control Chrome", "mcp.control_chrome_docs": "Guia oficial do MCP", @@ -1214,13 +755,84 @@ export default { "mcp.control_chrome_toggle_label": "Usar meu perfil existente do Chrome", "mcp.control_chrome_toggle_off": "O OpenWork abrirá um perfil separado do Chrome apenas para automação.", "mcp.control_chrome_toggle_on": "O OpenWork reutilizará suas abas, cookies e logins atuais.", - - // ==================== Message ==================== + "mcp.custom_app_cta_hint": "Conecte seu próprio servidor MCP, ferramenta interna ou app hospedado.", + "mcp.desktop_required": "Apps requerem o app desktop.", + "mcp.docs_link": "Saiba mais", + "mcp.file_not_found": "Arquivo de configuração ainda não criado", + "mcp.finish_setup": "Quase lá", + "mcp.finish_setup_hint": "Toque em Ativar para terminar de conectar seu app.", + "mcp.friendly_status_issue": "Problema", + "mcp.friendly_status_needs_signin": "Login necessário", + "mcp.friendly_status_offline": "Offline", + "mcp.friendly_status_paused": "Pausado", + "mcp.friendly_status_ready": "Pronto", + "mcp.last_synced": "Sincronizado", + "mcp.login_action": "Entrar", + "mcp.login_hint": "Conecte sua conta para terminar de configurar este app.", + "mcp.login_unavailable": "Este app não suporta login pelo OpenWork.", + "mcp.logout_action": "Sair", + "mcp.logout_failed": "Falha ao sair.", + "mcp.logout_hint": "Remove as credenciais OAuth armazenadas. Você precisará entrar novamente.", + "mcp.logout_label": "OAuth", + "mcp.logout_modal_message": "Isso removerá as credenciais OAuth armazenadas para {server}. Você precisará entrar novamente para usar este app.", + "mcp.logout_modal_title": "Sair deste app?", + "mcp.logout_success": "Saiu de {server}.", + "mcp.logout_working": "Saindo...", + "mcp.name_required": "Digite um nome para o servidor.", + "mcp.no_apps_hint": "Conecte um acima para começar.", + "mcp.no_apps_yet": "Nenhum app conectado ainda", + "mcp.oauth": "Entrar", + "mcp.oauth_optional_hint": "Usa OAuth no navegador para conectar sua conta.", + "mcp.oauth_optional_label": "Este app exige login", + "mcp.one_click_connect": "Conectar com um clique", + "mcp.open_file": "Abrir arquivo", + "mcp.opening_label": "Abrindo...", + "mcp.pick_workspace_error": "Escolha primeiro uma pasta de workspace.", + "mcp.pick_workspace_first": "Escolha primeiro uma pasta de workspace.", + "mcp.quick_connect_chrome_desc": "Controle abas do Chrome com automação de navegador.", + "mcp.quick_connect_chrome_title": "Controlar Chrome", + "mcp.quick_connect_context7_desc": "Pesquise docs de produto com contexto mais rico.", + "mcp.quick_connect_context7_title": "Context7", + "mcp.quick_connect_linear_desc": "Planeje sprints e resolva tickets mais rápido.", + "mcp.quick_connect_linear_title": "Linear", + "mcp.quick_connect_notion_desc": "Páginas, bancos de dados e docs de projeto sincronizados.", + "mcp.quick_connect_notion_title": "Notion", + "mcp.quick_connect_sentry_desc": "Acompanhe releases e resolva erros de produção.", + "mcp.quick_connect_sentry_title": "Sentry", + "mcp.quick_connect_stripe_desc": "Inspecione pagamentos, faturas e assinaturas.", + "mcp.quick_connect_stripe_title": "Stripe", + "mcp.reload_banner_blocked_hint": "Pare a tarefa em execução para ativar.", + "mcp.reload_banner_description": "Toque em Ativar para terminar de conectar seu app.", + "mcp.reload_banner_description_blocked": "Uma tarefa está em execução. Pare-a primeiro e então ative.", + "mcp.remote_workspace_url_hint": "Workers remotos se conectam mais rápido com servidores MCP baseados em URL.", + "mcp.remove_app": "Remover", + "mcp.remove_failed": "Não foi possível remover o app.", + "mcp.remove_modal_message": "Tem certeza que deseja remover {server}? Você pode adicioná-lo de volta a qualquer momento.", + "mcp.remove_modal_title": "Remover app", + "mcp.reveal_config_failed": "Não foi possível abrir o arquivo de configuração", + "mcp.reveal_in_finder": "Mostrar no Finder", + "mcp.scope_global": "Todos os workspaces", + "mcp.scope_project": "Este workspace", + "mcp.server_command": "Comando", + "mcp.server_command_hint": "O comando shell para iniciar o servidor.", + "mcp.server_command_placeholder": "npx -y @modelcontextprotocol/server-sequential-thinking", + "mcp.server_name": "Nome do app", + "mcp.server_name_placeholder": "github-copilot", + "mcp.server_type": "Tipo", + "mcp.server_url": "URL do servidor", + "mcp.server_url_placeholder": "https://api.githubcopilot.com/mcp/", + "mcp.sign_in_section_label": "Login", + "mcp.tap_to_connect": "Toque para conectar", + "mcp.technical_details": "Detalhes técnicos", + "mcp.type_cloud": "Nuvem (entrar com sua conta)", + "mcp.type_local": "Local (roda neste dispositivo)", + "mcp.type_local_cmd": "Local (comando)", + "mcp.type_remote": "Remoto (URL)", + "mcp.url_or_command_required": "Digite uma URL para servidores remotos ou um comando para servidores locais.", + "mcp.your_apps": "Seus apps", "message.tool_request_label": "Solicitação", "message.tool_result_label": "Resultado", "message.waiting_subagent": "Aguardando a transcrição do subagente chegar.", - - // ==================== Message List ==================== "message_list.copy_message": "Copiar mensagem", "message_list.open_session": "Abrir sessão", "message_list.step_updates_progress": "Atualiza o progresso", @@ -1250,11 +862,246 @@ export default { "message_list.tool_update_todo": "Atualizar lista de tarefas", "message_list.tool_updated_file": "Atualizou {file}", "message_list.tool_updated_file_fallback": "Atualizou arquivo", - - // ==================== Scheduled ==================== + "model_behavior.desc_builtin": "Este modelo decide seu próprio caminho de raciocínio e não expõe perfis aqui.", + "model_behavior.desc_generic": "Usar o perfil {label}.", + "model_behavior.desc_high": "Dedicar mais tempo ao raciocínio antes de responder.", + "model_behavior.desc_high_anthropic": "Usar o orçamento padrão de extended thinking.", + "model_behavior.desc_low": "Usar um passo de raciocínio mais leve antes de responder.", + "model_behavior.desc_low_google": "Usar um orçamento de raciocínio mais leve para respostas rápidas.", + "model_behavior.desc_max": "Usar o perfil de raciocínio mais profundo do provedor.", + "model_behavior.desc_max_anthropic": "Usar o maior orçamento de extended thinking disponível.", + "model_behavior.desc_medium": "Equilibrar velocidade e profundidade de raciocínio.", + "model_behavior.desc_minimal": "Usar uma quantidade mínima de raciocínio.", + "model_behavior.desc_none": "Priorizar velocidade com o caminho de raciocínio mais leve.", + "model_behavior.desc_standard": "Este modelo não expõe controles de raciocínio extras.", + "model_behavior.label_balanced": "Equilibrado", + "model_behavior.label_builtin": "Integrado", + "model_behavior.label_deep": "Profundo", + "model_behavior.label_extended": "Estendido", + "model_behavior.label_fast": "Rápido", + "model_behavior.label_light": "Leve", + "model_behavior.label_maximum": "Máximo", + "model_behavior.label_quick": "Ágil", + "model_behavior.label_standard": "Padrão", + "model_behavior.title_builtin_reasoning": "Raciocínio integrado", + "model_behavior.title_extended_thinking": "Extended thinking", + "model_behavior.title_reasoning_budget": "Reasoning budget", + "model_behavior.title_reasoning_effort": "Reasoning effort", + "model_behavior.title_standard_generation": "Geração padrão", + "model_picker.chat_model_desc": "Escolha o modelo para este chat. Se o modelo suportar perfis de raciocínio, configure-os no cartão.", + "model_picker.chat_model_title": "Modelo do chat", + "model_picker.connect_provider_hint": "Conecte este provedor para explorar e salvar modelos", + "model_picker.default_model_desc": "Escolha o modelo padrão para novos chats e ajuste os perfis de raciocínio no cartão antes de clicar em Concluído.", + "model_picker.default_model_title": "Modelo padrão", + "model_picker.model_count": "{count} modelos", + "model_picker.model_count_one": "1 modelo", + "model_picker.more_providers": "Mais provedores", + "model_picker.no_results": "Nenhum modelo corresponde à sua busca.", + "model_picker.other_connected_models": "Outros modelos conectados", + "model_picker.recommended": "Recomendado", + "onboarding.access_label": "Acesso", + "onboarding.add": "Adicionar", + "onboarding.add_folder_path": "Adicionar caminho de pasta", + "onboarding.advanced_settings": "Configurações avançadas", + "onboarding.attach": "Conectar", + "onboarding.attach_description": "Conectar à sessão existente neste dispositivo.", + "onboarding.authorize_folder": "Autorizar pasta", + "onboarding.back": "Voltar", + "onboarding.checking_cli": "Verificando OpenCode CLI...", + "onboarding.choose_workspace_folder": "Escolher pasta do workspace", + "onboarding.cli_checking": "Verificando instalação...", + "onboarding.cli_install_commands": "Instale o OpenCode com um dos comandos abaixo e reinicie o OpenWork.", + "onboarding.cli_label": "OpenCode CLI", + "onboarding.cli_needs_update": "O OpenCode CLI precisa de uma atualização para o serve.", + "onboarding.cli_not_found": "OpenCode CLI não encontrado.", + "onboarding.cli_not_found_hint": "Não encontrado. Instale para executar o servidor local.", + "onboarding.cli_ready": "OpenCode CLI pronto.", + "onboarding.cli_recheck": "Verificar novamente", + "onboarding.cli_version": "OpenCode {version}", + "onboarding.cli_version_installed": "Instalado", + "onboarding.create_first_workspace": "Crie seu primeiro workspace", + "onboarding.create_workspace": "Criar um workspace", + "onboarding.engine_running": "Engine já em execução", + "onboarding.folders_allowed": "{count} pasta{plural} permitida{plural}", + "onboarding.getting_ready": "Preparando tudo", + "onboarding.install": "Instalar OpenCode", + "onboarding.install_instruction": "Instale o OpenCode para ativar o servidor local (sem terminal necessário).", + "onboarding.last_checked": "Última verificação {time}", + "onboarding.manage_access_hint": "Você pode gerenciar o acesso nas configurações avançadas.", + "onboarding.open_settings": "Abrir Configurações", + "onboarding.open_settings_hint": "Precisa de opções de engine ou acesso? Abra as Configurações.", + "onboarding.pick": "Selecionar", + "onboarding.ready_message": "O OpenCode está pronto para iniciar o servidor local.", + "onboarding.remember_choice": "Lembrar minha escolha para a próxima vez", + "onboarding.remote_workspace_action": "Conectar", + "onboarding.remote_workspace_card_description": "Conecte a um servidor OpenWork para acessar um workspace compartilhado.", + "onboarding.remote_workspace_card_title": "Conectar um workspace remoto", + "onboarding.remote_workspace_description": "Conecte a um servidor OpenWork para acessar um workspace de qualquer lugar.", + "onboarding.remote_workspace_title": "Conectar ao servidor OpenWork", + "onboarding.remove": "Remover", + "onboarding.resolved_path": "Caminho resolvido", + "onboarding.run_local": "Executar localmente", + "onboarding.run_local_description": "O OpenWork executa o OpenCode localmente e mantém seu trabalho privado.", + "onboarding.search_notes": "Notas de busca", + "onboarding.searching_host": "Conectando ao servidor OpenWork...", + "onboarding.serve_help": "saída de serve --help", + "onboarding.show_search_notes": "Mostrar notas de busca", + "onboarding.start": "Iniciar OpenWork", + "onboarding.starting_host": "Iniciando servidor OpenWork...", + "onboarding.theme_current": "Atual: {mode}", + "onboarding.theme_dark": "Escuro", + "onboarding.theme_label": "Tema", + "onboarding.theme_light": "Claro", + "onboarding.theme_system": "Sistema", + "onboarding.verifying": "Verificando handshake seguro", + "onboarding.version": "Versão", + "onboarding.welcome_title": "Como você quer executar o OpenWork hoje?", + "onboarding.windows_install_instruction": "Instale o OpenCode para Windows e reinicie o OpenWork. Certifique-se de que opencode.exe está no PATH.", + "onboarding.workspace_folder_label": "Um workspace é uma pasta com suas próprias skills, plugins e comandos.", + "plugins.add": "Adicionar", + "plugins.add_hint": "Adicione nomes de pacotes npm, ex: opencode-wakatime", + "plugins.add_label": "Adicionar plugin", + "plugins.added": "Adicionado", + "plugins.config": "Config", + "plugins.config_label": "Config", + "plugins.desc": "Gerenciar `opencode.json` para plugins do projeto ou globais do OpenCode.", + "plugins.empty": "Nenhum plugin configurado ainda.", + "plugins.enabled": "Ativado", + "plugins.hide_setup": "Ocultar configuração", + "plugins.not_loaded": "Ainda não carregado", + "plugins.not_loaded_yet": "Ainda não carregado", + "plugins.remove": "Remover", + "plugins.scheduler_desc": "Execute tarefas agendadas com o plugin de agendamento do OpenCode.", + "plugins.scope_global": "Global", + "plugins.scope_project": "Projeto", + "plugins.setup": "Configurar", + "plugins.suggested": "Plugins sugeridos", + "plugins.suggested_heading": "Plugins sugeridos", + "plugins.title": "Plugins OpenCode", + "providers.api_key_label": "Chave de API", + "providers.api_key_required": "A chave de API é obrigatória", + "providers.auth_failed": "Falha na autenticação", + "providers.connect_failed": "Falha ao conectar provedor", + "providers.disabled_in_config_suffix": "e desativado na configuração do OpenCode.", + "providers.disconnect_failed": "Falha ao desconectar provedor", + "providers.disconnected_prefix": "Desconectado", + "providers.load_failed": "Falha ao carregar provedores", + "providers.no_oauth_prefix": "Nenhum fluxo OAuth disponível para", + "providers.no_providers_available": "Nenhum provedor disponível", + "providers.not_connected": "Não conectado a um servidor", + "providers.not_oauth_flow_prefix": "O método de autenticação selecionado não é um fluxo OAuth para", + "providers.oauth_failed": "Falha ao concluir OAuth", + "providers.oauth_method_required": "O método OAuth é obrigatório", + "providers.provider_error": "Erro do provedor ({provider})", + "providers.provider_id_required": "O ID do provedor é obrigatório", + "providers.rate_limit_exceeded": "Limite de requisições excedido", + "providers.removal_unsupported": "A remoção da autenticação do provedor não é suportada por este cliente.", + "providers.request_failed": "Falha na requisição", + "providers.save_api_key_failed": "Falha ao salvar chave de API", + "providers.still_connected_suffix": ", mas o worker ainda reporta como conectado. Limpe qualquer chave de API ou credenciais OAuth restantes e reinicie o worker para desconectar completamente.", + "providers.unknown_provider": "Provedor desconhecido", + "providers.use_api_key_suffix": "Use uma chave de API em vez disso.", + "question_modal.custom_answer_label": "Ou digite uma resposta personalizada", + "question_modal.custom_answer_placeholder": "Digite sua resposta aqui...", + "question_modal.question_counter": "Pergunta {current} de {total}", + "scheduled.at_time": "Às {time}", + "scheduled.badge_end_of_day": "Fim do dia", + "scheduled.badge_every_few_hours": "A cada poucas horas", + "scheduled.badge_friday_wrapup": "Resumo de sexta", + "scheduled.badge_weekday_evening": "Noite de semana", + "scheduled.badge_weekday_morning": "Manhã de semana", + "scheduled.badge_weekend_review": "Revisão de fim de semana", + "scheduled.create_button": "Criar", + "scheduled.create_desc": "Automações são agendadas executando um prompt em uma nova conversa. Vamos preencher um prompt para você enviar.", + "scheduled.create_title": "Criar automação", + "scheduled.created_prefix": "Criado", + "scheduled.custom_schedule": "Agendamento personalizado", + "scheduled.daily_mode": "Diário", + "scheduled.day_fri": "Sex", + "scheduled.day_mon": "Seg", + "scheduled.day_sat": "Sáb", + "scheduled.day_sun": "Dom", + "scheduled.day_thu": "Qui", + "scheduled.day_tue": "Ter", + "scheduled.day_wed": "Qua", + "scheduled.days_at": "{days} às {time}", + "scheduled.default_automation_name": "Varredura diária de bugs", + "scheduled.delete_confirm_desc": "Isso remove o agendamento e exclui a definição do job de {source}.", + "scheduled.delete_confirm_title": "Excluir automação?", + "scheduled.delete_error_fallback": "Falha ao excluir job.", + "scheduled.delete_label": "Excluir", + "scheduled.deleting": "Excluindo", + "scheduled.desktop_required": "Tarefas agendadas requerem o app desktop.", + "scheduled.empty_hint": "Nenhuma automação ainda. Escolha um template ou crie seu próprio prompt de automação.", + "scheduled.every_day_at": "Todos os dias às {time}", + "scheduled.every_hour": "A cada hora", + "scheduled.every_n_hours": "A cada {interval} horas", + "scheduled.every_prefix": "A cada", + "scheduled.explore_more": "Explorar mais", + "scheduled.failed_status": "Falhou", + "scheduled.filter_all": "Todos", + "scheduled.filter_scheduled": "Agendados", + "scheduled.filter_templates": "Templates", + "scheduled.hours_suffix": "horas", + "scheduled.install_scheduler": "Instalar agendador", + "scheduled.install_scheduler_hint": "As automações rodam pelo plugin opencode-scheduler. Adicione-o a este workspace para ativar o agendamento.", + "scheduled.install_scheduler_title": "Instale o agendador para desbloquear automações", + "scheduled.installing": "Instalando...", + "scheduled.interval_mode": "Intervalo", + "scheduled.last_run_prefix": "Última execução", + "scheduled.last_updated_prefix": "Última atualização", + "scheduled.name_label": "Nome", + "scheduled.never": "Nunca", + "scheduled.new_automation": "Nova automação", + "scheduled.no_automations_match": "Nenhuma automação corresponde a essa busca.", + "scheduled.no_templates_match": "Nenhum template corresponde a essa busca.", + "scheduled.not_run_yet": "Ainda não executado", + "scheduled.not_synced_yet": "Ainda não sincronizado", + "scheduled.page_description": "Agende tarefas recorrentes para este worker, monitore o que já está registrado e comece a partir de um template reutilizável.", + "scheduled.prepare_error_fallback": "Falha ao preparar automação no chat.", + "scheduled.prepared_automation_in_chat": "Automação preparada no chat.", + "scheduled.prepared_job_in_chat": "{name} preparado no chat.", + "scheduled.quick_start_templates": "Templates de início rápido", + "scheduled.quick_start_templates_desc": "Comece com um workflow recorrente comprovado e ajuste o prompt antes de prepará-lo no chat.", + "scheduled.refreshing": "Atualizando", + "scheduled.reload_activate_hint": "O OpenCode carrega plugins na inicialização. Recarregue o OpenWork para ativar o opencode-scheduler.", + "scheduled.reload_activate_title": "Recarregue o OpenWork para ativar automações", + "scheduled.reload_openwork": "Recarregar OpenWork", + "scheduled.reloading": "Recarregando...", + "scheduled.removed_job": "{name} removido.", + "scheduled.run_label": "Executar", + "scheduled.running_status": "Em execução", + "scheduled.schedule_label": "Agendamento", + "scheduled.scheduler_install_requested": "Instalação do agendador solicitada.", + "scheduled.search_placeholder": "Buscar automações ou templates", + "scheduled.source_local": "Do agendador local", + "scheduled.source_remote": "Do servidor OpenWork", + "scheduled.subtitle_local": "Automações que rodam em um agendamento a partir deste dispositivo.", + "scheduled.subtitle_remote": "Automações que rodam em um agendamento a partir do servidor OpenWork conectado.", + "scheduled.success_status": "Sucesso", + "scheduled.task_summary_no_prompt": "Nenhum prompt ou comando encontrado.", + "scheduled.task_summary_prompt": "Prompt", + "scheduled.template_badge": "Template", + "scheduled.template_count": "{count} templates", "scheduled.title": "Automações", - - // ==================== Session (additional) ==================== + "scheduled.tpl_daily_planning_desc": "Monte um plano focado a partir das suas tarefas e calendário.", + "scheduled.tpl_daily_planning_name": "Briefing de planejamento diário", + "scheduled.tpl_habit_checkin_desc": "Faça um check-in rápido de hábitos ao longo do dia.", + "scheduled.tpl_habit_checkin_name": "Check-in de hábitos", + "scheduled.tpl_inbox_zero_desc": "Resuma mensagens não lidas e rascunhe respostas curtas.", + "scheduled.tpl_inbox_zero_name": "Assistente inbox zero", + "scheduled.tpl_learning_digest_desc": "Transforme links e anotações salvos em um resumo semanal.", + "scheduled.tpl_learning_digest_name": "Resumo de aprendizado", + "scheduled.tpl_meeting_prep_desc": "Gere pontos de preparação para as reuniões de amanhã.", + "scheduled.tpl_meeting_prep_name": "Notas de preparação para reunião", + "scheduled.tpl_weekly_wins_desc": "Crie um resumo de sexta com conquistas, bloqueios e próximos passos.", + "scheduled.tpl_weekly_wins_name": "Resumo semanal de conquistas", + "scheduled.view_scheduler_docs": "Ver documentação do agendador", + "scheduled.weekdays_at": "Dias úteis às {time}", + "scheduled.weekends_at": "Fins de semana às {time}", + "scheduled.worker_root_hint": "A raiz do worker é inferida a partir do workspace selecionado.", + "scheduled.your_automations": "Suas automações", + "session.allow_for_session": "Permitir para esta sessão", "session.allow_once": "Uma vez", "session.api_key_saved": "Chave de API salva", "session.attachments_add_token": "Adicione um token de servidor para anexar arquivos.", @@ -1280,7 +1127,7 @@ export default { "session.cmd_rename_detail_fallback": "Dê um nome mais claro à sessão selecionada", "session.cmd_rename_meta": "Renomear", "session.cmd_rename_title": "Renomear sessão atual", - "session.cmd_sessions_detail": "{count} disponíveis entre workspaces", + "session.cmd_sessions_detail": "{count} disponíveis nos workspaces", "session.cmd_sessions_meta": "Ir", "session.cmd_sessions_title": "Buscar sessões", "session.cmd_switch": "Alternar", @@ -1297,12 +1144,16 @@ export default { "session.create_workspace_desc": "Abra o criador de workspace e escolha como deseja começar.", "session.create_workspace_title": "Criar workspace", "session.default_agent": "Agente padrão", + "session.default_title": "Nova sessão", "session.delete": "Excluir", "session.delete_named_session_message": "Isso excluirá permanentemente \"{title}\" e suas mensagens.", "session.delete_session_generic": "Isso excluirá permanentemente a sessão selecionada e suas mensagens.", "session.delete_session_title": "Excluir sessão?", "session.deleted": "Sessão excluída", "session.deleting": "Excluindo...", + "session.deny": "Negar", + "session.details": "Detalhes", + "session.details_label": "Detalhes", "session.doom_loop_label": "Loop Infinito", "session.doom_loop_message": "O OpenCode detectou chamadas de ferramenta repetidas com a mesma entrada e está perguntando se deve continuar após falhas repetidas.", "session.doom_loop_note": "Rejeite para parar o loop ou permita se quiser que o agente continue tentando.", @@ -1340,7 +1191,9 @@ export default { "session.loading_session": "Carregando sessão", "session.loading_title": "Carregando sessão", "session.menu_label": "Menu", + "session.model": "Modelo", "session.model_fallback": "Modelo", + "session.new_task": "Nova tarefa", "session.next_match": "Próxima correspondência", "session.no_matches": "Sem correspondências", "session.no_matches_command": "Sem correspondências.", @@ -1351,13 +1204,16 @@ export default { "session.nothing_to_undo": "Nada para desfazer ainda.", "session.oauth_failed": "Falha no OAuth", "session.obsidian_worker_relative_only": "Apenas arquivos relativos ao worker podem ser abertos no Obsidian.", + "session.open": "Abrir", "session.palette_hint_navigate": "Setas para navegar", "session.palette_hint_run": "Enter para executar · Esc para fechar", "session.palette_placeholder_actions": "Buscar ações", "session.palette_placeholder_sessions": "Buscar por título de sessão ou workspace", "session.palette_title_actions": "Ações rápidas", "session.palette_title_sessions": "Buscar sessões", + "session.permission_label": "Permissão", "session.permission_message": "O OpenCode está solicitando permissão para continuar.", + "session.permission_required": "Permissão Necessária", "session.phase_responding": "Respondendo", "session.phase_retrying": "Tentando novamente", "session.phase_run_failed": "Execução falhou", @@ -1374,12 +1230,19 @@ export default { "session.redo_label": "Refazer", "session.redo_title": "Refazer última mensagem revertida", "session.remote_sync_failed": "Falha na sincronização de arquivos remotos", + "session.rename_description": "Atualizar o nome desta sessão.", + "session.rename_label": "Nome da sessão", + "session.rename_placeholder": "Digite um novo nome", + "session.rename_title": "Renomear sessão", "session.resize_workspace_column": "Redimensionar coluna do workspace", "session.restart_update_title": "Reinicie para aplicar a atualização {version}", "session.restored_message": "Mensagem revertida restaurada.", + "session.reveal": "Mostrar", "session.reveal_desktop_only": "Mostrar está disponível no app desktop.", "session.revert_label": "Reverter", "session.reverted_last_message": "Última mensagem do usuário revertida.", + "session.run": "Executar", + "session.scope_label": "Escopo", "session.search_conversation_label": "Buscar na conversa", "session.search_conversation_title": "Buscar na conversa (Ctrl/Cmd+F)", "session.search_next": "Próximo", @@ -1425,7 +1288,7 @@ export default { "session.share_worker_url_resolving_hint": "URL do worker está sendo resolvida; URL do host exibida como alternativa.", "session.share_workspace_template_desc": "Template completo de workspace OpenWork com config, comandos, skills e arquivos .opencode extras.", "session.shared_folder_upload_failed": "Falha no envio para a pasta compartilhada", - "session.show_earlier": "Mostrar {count} mensagem{plural} anterior(es)", + "session.show_earlier": "Mostrar {count} mensagem{plural} mais antiga{plural}", "session.status_active": "Sessão Ativa", "session.status_compacting": "Compactando Contexto", "session.status_delegating": "Delegando", @@ -1462,21 +1325,389 @@ export default { "session.workspace_setup_desc": "Comece com um workspace guiado do OpenWork ou escolha uma pasta existente.", "session.workspace_setup_label": "Configuração do workspace", "session.workspace_setup_title": "Configure seu primeiro workspace", - - // ==================== Settings (additional) ==================== + "settings.action_download": "Baixar", + "settings.action_install": "Instalar", + "settings.actor_host": "host", + "settings.actor_remote": "remoto", + "settings.actor_unknown": "desconhecido", + "settings.advanced": "Avançado", + "settings.advanced_title": "Avançado", + "settings.api_keys_info": "As chaves de API são armazenadas localmente pelo OpenCode. Provedores baseados em variáveis de ambiente devem ser alterados no ambiente do worker e recarregados.", + "settings.appearance_hint": "Seguir o sistema ou forçar modo claro/escuro.", + "settings.appearance_title": "Aparência", + "settings.audit_error": "Erro", + "settings.audit_loading": "Carregando", + "settings.audit_log_title": "Log de auditoria", + "settings.audit_ready": "Pronto", + "settings.auto_compact": "Compactação automática de contexto", + "settings.auto_compact_desc": "Controla a compactação automática do OpenCode para este workspace. Recarregue o engine após alterar.", + "settings.auto_update_desc": "Baixar atualizações automaticamente (solicita para", + "settings.auto_update_title": "Atualização automática", + "settings.available_count": "{count} disponíveis", + "settings.background_checks_desc": "O OpenWork sempre verifica ao iniciar. Também verifica uma vez", + "settings.background_checks_title": "Verificações em segundo plano", + "settings.base_url_unavailable": "URL base indisponível", + "settings.binary_unavailable": "Binário indisponível", + "settings.cache_nothing_to_repair": "Nenhum cache do OpenCode encontrado. Nada para reparar.", + "settings.cache_repair_requires_desktop": "O reparo de cache requer o app desktop", + "settings.cache_repaired": "Cache do OpenCode reparado. Reinicie o engine se estava em execução.", + "settings.cap_browser_tools": "Ferramentas do navegador: {value}", + "settings.cap_commands": "Comandos: {value}", + "settings.cap_config": "Config: {value}", + "settings.cap_file_tools": "Ferramentas de arquivo: {value}", + "settings.cap_inbox_off": "inbox desativado", + "settings.cap_inbox_on": "inbox ativado", + "settings.cap_mcp": "MCP: {value}", + "settings.cap_outbox_off": "outbox desativado", + "settings.cap_outbox_on": "outbox ativado", + "settings.cap_plugins": "Plugins: {value}", + "settings.cap_proxy": "Proxy (OpenCodeRouter): {value}", + "settings.cap_read": "leitura", + "settings.cap_sandbox": "Sandbox: {value}", + "settings.cap_skills": "Skills: {value}", + "settings.cap_write": "escrita", + "settings.capabilities_title": "Capacidades do servidor OpenWork", + "settings.capabilities_unavailable": "Capacidades indisponíveis. Conecte com um token de cliente.", + "settings.change": "Alterar", + "settings.check_update": "Verificar", + "settings.checking_for_updates": "Verificando atualizações", + "settings.choose": "Escolher", + "settings.clear": "Limpar", + "settings.clipboard_unavailable": "Área de transferência não disponível neste ambiente.", + "settings.configure": "Configurar", + "settings.connect_opencode_hint": "Conecte ao OpenCode para carregar provedores.", + "settings.connect_provider": "Conectar provedor", + "settings.connected_count": "{count} conectados", + "settings.connection": "Conexão", + "settings.connection_failed": "Falha na conexão", + "settings.connection_title": "Conexão", + "settings.copied_debug_report": "JSON do relatório de runtime copiado.", + "settings.copy_failed": "Falha ao copiar relatório de runtime.", + "settings.copy_json": "Copiar JSON", + "settings.custom_binary_hint": "Use para apontar o OpenWork para um build local do OpenCode", + "settings.custom_binary_label": "Binário personalizado do OpenCode", + "settings.data_dir_unavailable": "Diretório de dados indisponível", + "settings.debug_commit": "Commit: {sha}", + "settings.debug_desktop_app": "App desktop: {version}", + "settings.debug_opencode_router_version": "OpenCodeRouter: {version}", + "settings.debug_opencode_version": "OpenCode: {version}", + "settings.debug_openwork_server_version": "Servidor OpenWork: {version}", + "settings.debug_orchestrator_version": "Orchestrator: {version}", + "settings.debug_section_title": "Desenvolvedor", + "settings.deeplink_failed": "Falha ao abrir deep link.", + "settings.deeplink_hint": "Aceita openwork://, openwork-dev:// ou uma URL https://share.openworklabs.com/b/... raw suportada.", + "settings.default_model": "Modelo padrão", + "settings.delete_containers": "Removendo containers...", + "settings.delete_local_config": "Removendo estado local...", + "settings.desktop_only_hint": "Disponível no app desktop.", + "settings.dev_mode_badge": "Modo dev", + "settings.developer": "Desenvolvedor", + "settings.developer_mode_desc": "Ativa ferramentas de depuração, diagnósticos e a aba Desenvolvedor.", + "settings.developer_mode_title": "Modo desenvolvedor", + "settings.developer_panel_disabled": "Painel de desenvolvedor desativado.", + "settings.developer_panel_enabled": "Painel de desenvolvedor ativado.", + "settings.devlog_cleared": "Log de desenvolvedor limpo.", + "settings.devlog_clipboard_unavailable": "Área de transferência não disponível neste ambiente.", + "settings.devlog_copied": "Log de desenvolvedor copiado.", + "settings.devlog_copy_failed": "Falha ao copiar log de desenvolvedor.", + "settings.devlog_export_failed": "Falha ao exportar log de desenvolvedor.", + "settings.devlog_export_unavailable": "Exportação não disponível neste ambiente.", + "settings.devlog_exported": "Log de desenvolvedor exportado.", + "settings.devtools_desc": "Saúde do sidecar, capacidades e trilha de auditoria.", + "settings.devtools_title": "Ferramentas de desenvolvimento", + "settings.diag_approval": "Aprovação: {mode} ({ms}ms)", + "settings.diag_config_path": "Caminho da config: {path}", + "settings.diag_daemon_url": "Daemon: {url}", + "settings.diag_default": "padrão", + "settings.diag_health_port": "Porta de saúde: {port}", + "settings.diag_healthy_ms": "Saudável: {ms}ms", + "settings.diag_host_token_source": "Origem do token do host: {source}", + "settings.diag_last_attempt": "Última tentativa: {time}", + "settings.diag_load_sessions_ms": "Carregar sessões: {ms}ms", + "settings.diag_opencode_binary": "Binário OpenCode: {binary}", + "settings.diag_opencode_url": "OpenCode: {url}", + "settings.diag_pending_permissions_ms": "Permissões pendentes: {ms}ms", + "settings.diag_pid": "PID: {pid}", + "settings.diag_providers_ms": "Provedores: {ms}ms", + "settings.diag_read_only": "Somente leitura: {value}", + "settings.diag_reason": "Motivo: {reason}", + "settings.diag_runtime_workspace": "Workspace de runtime: {id}", + "settings.diag_selected_workspace": "Workspace selecionado: {id}", + "settings.diag_sidecar": "Sidecar: {info}", + "settings.diag_started": "Iniciado: {time}", + "settings.diag_token_source": "Origem do token: {source}", + "settings.diag_total_ms": "Total: {ms}ms", + "settings.diag_version": "Versão: {version}", + "settings.diag_workspaces": "Workspaces: {count}", + "settings.diagnostics_unavailable": "Diagnósticos indisponíveis.", + "settings.disable_developer_mode": "Desativar Modo Desenvolvedor", + "settings.disabled": "Desativado", + "settings.disconnect": "Desconectar", + "settings.disconnect_confirm_suffix": "Desconectar {resolved}? Isso remove chaves de API ou credenciais OAuth armazenadas para este provedor.", + "settings.disconnect_server": "Desconectar servidor", + "settings.disconnected_prefix": "Desconectado {resolved}.", + "settings.disconnecting": "Desconectando...", + "settings.docker_containers_desc": "Forçar remoção de containers Docker iniciados pelo OpenWork", + "settings.docker_containers_title": "Containers Docker do OpenWork", + "settings.docker_requires_desktop": "A limpeza do Docker requer o app desktop", + "settings.done": "Concluído", + "settings.downloading_bytes": "Baixando {downloaded}", + "settings.downloading_progress": "Baixando {downloaded} / {total} ({percent}%)", + "settings.enable_developer_mode": "Ativar Modo Desenvolvedor", + "settings.enable_exa": "Ativar busca web Exa", + "settings.enable_exa_desc": "Aplica-se quando o OpenWork Orchestrator inicia o OpenCode.", + "settings.enabled": "Ativado", + "settings.engine_bundled": "Integrado (recomendado)", + "settings.engine_bundled_hint": "O engine integrado é a opção mais confiável. Use Sistema", + "settings.engine_custom_binary": "Binário personalizado", + "settings.engine_desc": "Escolha como o OpenCode roda localmente.", + "settings.engine_runtime_label": "Runtime do engine", + "settings.engine_source": "Fonte do engine", + "settings.engine_source_debug": "Fonte do engine", + "settings.engine_system_path": "Instalação do sistema (PATH)", + "settings.engine_title": "Engine", + "settings.exa_restart_hint": "Reinicie o OpenCode ou o orchestrator após alterar esta configuração.", + "settings.export": "Exportar", + "settings.export_failed": "Falha ao exportar relatório de runtime.", + "settings.export_unavailable": "Exportação não disponível neste ambiente.", + "settings.exported_debug_report": "JSON do relatório de runtime exportado.", + "settings.failed": "Falhou", + "settings.failed_open_providers": "Falha ao abrir provedores", + "settings.feedback_badge": "Lemos cada mensagem", + "settings.feedback_desc": "Conte-nos o que está ótimo e o que está difícil. O feedback vai direto para a equipe e nos ajuda a priorizar o que lançamos a seguir.", + "settings.feedback_title": "Ajude a moldar o OpenWork", + "settings.group_global": "Global", + "settings.group_workspace": "Workspace", + "settings.hide_titlebar": "Ocultar barra de título", + "settings.hide_titlebar_desc": "Oculta a barra de título da janela. Útil para gerenciadores de janelas tipo tiling", + "settings.join_discord": "Entrar no Discord", + "settings.language": "Idioma", + "settings.language.description": "Escolha seu idioma preferido", + "settings.last_error": "Último erro", + "settings.last_stderr": "Último stderr", + "settings.last_stdout": "Último stdout", + "settings.loading_providers": "Carregando provedores...", + "settings.logs_on_host": "Logs estão disponíveis no host.", + "settings.managed_by_env": "Gerenciado por variável de ambiente", + "settings.messaging_bridge_service": "Serviço de bridge de mensagens.", + "settings.messaging_section_desc": "Gerencie identidades e bindings do Telegram/Slack na aba Identidades.", + "settings.messaging_section_title": "Mensagens", + "settings.model": "Modelo", + "settings.model_behavior": "Comportamento do modelo", + "settings.model_behavior_desc": "Abra o seletor de modelo padrão para escolher perfis de raciocínio quando disponíveis.", + "settings.model_default": "Padrão", + "settings.model_description": "Padrões e controles de raciocínio para execuções.", + "settings.model_description_default": "Escolha entre seus provedores configurados. Esta seleção será usada para novas sessões.", + "settings.model_description_session": "Escolha entre seus provedores configurados. Esta seleção se aplica à sua próxima mensagem.", + "settings.model_fallback": "Alternativa", + "settings.model_reasoning": "Raciocínio", + "settings.model_section_desc": "Escolha o modelo de chat padrão e veja como ele raciocina.", + "settings.model_title": "Modelo", + "settings.no_access": "sem acesso", + "settings.no_active_workspace": "Nenhum workspace local ativo.", + "settings.no_audit_entries": "Nenhuma entrada de auditoria ainda.", + "settings.no_binary_selected": "Nenhum binário selecionado.", + "settings.no_custom_path_set": "Nenhum caminho personalizado definido", + "settings.no_project_directory": "Nenhum diretório de projeto", + "settings.no_stderr": "Nenhum stderr capturado ainda.", + "settings.no_stdout": "Nenhum stdout capturado ainda.", + "settings.no_worker_directory": "Nenhum diretório de projeto", + "settings.no_worker_path": "Nenhum caminho de worker disponível", + "settings.nuke_confirm_dev": "Isso é irreversível. EXCLUIRÁ todos os dados do OpenWork para este build dev e toda config, auth, cache, dados e estado isolados do OpenCode dev, e fechará o OpenWork. Continuar?", + "settings.nuke_confirm_prod": "Isso é irreversível. EXCLUIRÁ todos os dados do OpenWork para este build dev e toda config, auth, cache, dados e estado isolados do OpenCode dev, e fechará o OpenWork. Continuar?", + "settings.nuke_failed": "Falha ao remover estado do OpenWork e OpenCode.", + "settings.nuke_hint": "Use apenas quando quiser resetar completamente o app desktop e o estado do runtime OpenCode.", + "settings.nuke_success": "Estado do OpenWork e OpenCode removido. O OpenWork está fechando...", + "settings.off": "Desativado", + "settings.offline": "Offline", + "settings.on": "Ativado", + "settings.open_deeplink_action": "Abrindo...", + "settings.open_deeplink_button": "Ocultar", + "settings.open_deeplink_desc": "Cole um deeplink ou URL compartilhada do OpenWork para abrir.", + "settings.open_deeplink_title": "Abrir Deeplink", + "settings.opencode_cache": "Cache do OpenCode", + "settings.opencode_cache_description": "Repara dados em cache usados para iniciar o engine. Seguro de executar.", + "settings.opencode_engine_desc": "Runtime local para agentes, ferramentas e provedores de modelos.", + "settings.opencode_engine_label": "Engine OpenCode", + "settings.opencode_engine_sidecar_desc": "Sidecar de execução local.", + "settings.opencode_router_sidecar": "Sidecar OpenCodeRouter", + "settings.opencode_runtime_desc": "Opções de runtime para o engine local e bridge do orchestrator.", + "settings.opencode_sdk_desc": "Diagnósticos de conexão da interface.", + "settings.opencode_sdk_title": "Engine OpenCode", + "settings.opencode_section_label": "OpenCode", + "settings.opencode_url_unavailable": "URL base indisponível", + "settings.opening": "Abrir deeplink", + "settings.openwork_config_sidecar_desc": "Sidecar de configuração e aprovações.", + "settings.openwork_diagnostics_title": "Diagnósticos do servidor OpenWork", + "settings.openwork_server_desc": "Plano de controle de sessão para sincronização do app, workers e acesso remoto.", + "settings.openwork_server_label": "Servidor OpenWork", + "settings.orchestrator_daemon_layer_desc": "Camada de orquestração de workspaces.", + "settings.orchestrator_daemon_title": "Daemon do orchestrator", + "settings.pending_permissions": "Permissões pendentes", + "settings.production_mode_badge": "Produção", + "settings.provider_default_desc": "Use o comportamento de raciocínio padrão integrado do modelo.", + "settings.provider_default_label": "Padrão do provedor", + "settings.provider_source_config": "Config", + "settings.provider_source_custom": "Personalizado", + "settings.provider_source_env": "Ambiente", + "settings.providers_desc": "Conecte serviços para modelos e ferramentas.", + "settings.providers_title": "Provedores", + "settings.quit_hint": "O OpenWork fecha imediatamente após a limpeza para que a próxima inicialização comece de um estado local limpo para este modo.", + "settings.recent_events": "Eventos recentes", + "settings.reconnect_failed": "Falha ao reconectar. Verifique a URL/token do servidor e tente novamente.", + "settings.reconnect_server": "Reconectando...", + "settings.reconnect_server_failed": "Falha ao reconectar o servidor OpenWork.", + "settings.reconnected": "Reconectado ao servidor OpenWork.", + "settings.reconnecting": "Reconectando...", + "settings.removing_containers": "Removendo containers...", + "settings.removing_local_state": "Removendo estado local...", + "settings.repair_cache": "Reparar cache", + "settings.repairing_cache": "Reparando cache", + "settings.report_issue": "Reportar um problema", + "settings.reset": "Redefinir", + "settings.reset_app_data": "Redefinir dados do app", + "settings.reset_app_data_description": "Mais agressivo. Apaga cache + dados do OpenWork.", + "settings.reset_app_data_title": "Redefinir dados do app", + "settings.reset_app_data_warning": "Apaga cache e dados do OpenWork neste dispositivo.", + "settings.reset_button": "Redefinir", + "settings.reset_cancel": "Cancelar", + "settings.reset_config_defaults": "Redefinindo...", + "settings.reset_config_failed": "Falha ao redefinir configurações do app.", + "settings.reset_confirm_button": "Redefinir e Reiniciar", + "settings.reset_confirmation_hint": "Digite RESET para confirmar. O OpenWork será reiniciado.", + "settings.reset_confirmation_label": "Confirmação", + "settings.reset_confirmation_placeholder": "Digite RESET", + "settings.reset_onboarding": "Redefinir onboarding", + "settings.reset_onboarding_description": "Apaga as preferências do OpenWork e reinicia o app.", + "settings.reset_onboarding_title": "Redefinir onboarding", + "settings.reset_onboarding_warning": "Apaga preferências locais e marcadores de onboarding do workspace no OpenWork.", + "settings.reset_openwork_desc_dev": "Com o modo dev ativo, limpa apenas o estado isolado do OpenCode dev dentro de openwork-dev-data.", + "settings.reset_openwork_desc_prod": "Com o modo dev ativo, limpa apenas o estado isolado do OpenCode dev dentro de openwork-dev-data.", + "settings.reset_openwork_title": "Redefinir estado do OpenWork + OpenCode", + "settings.reset_recovery_desc": "Limpar dados ou reiniciar o fluxo de configuração.", + "settings.reset_recovery_title": "Redefinir e Recuperação", + "settings.reset_requires_confirm": "Requer digitar RESET e reiniciará o app.", + "settings.reset_startup": "Redefinir modo de inicialização padrão", + "settings.reset_startup_pref": "Redefinir preferência de inicialização", + "settings.reset_stop_active_runs": "Pare as execuções ativas antes de redefinir.", + "settings.resetting": "Redefinindo...", + "settings.restart_blocked_message": "O OpenWork precisa reiniciar para concluir esta atualização. Para não interromper seu trabalho atual, a instalação está pausada até que suas execuções ativas terminem ou sejam paradas.", + "settings.restart_failed": "Falha ao reiniciar. Verifique os logs e tente novamente.", + "settings.restart_local_server": "Reiniciando...", + "settings.restart_opencode": "Reiniciando...", + "settings.restart_opencode_router": "Reiniciando...", + "settings.restart_openwork_server": "Reiniciando...", + "settings.restart_orchestrator": "Reiniciando...", + "settings.restart_server_failed": "Falha ao reiniciar o servidor local.", + "settings.restarted": "Servidor local reiniciado.", + "settings.restarting": "Reiniciando...", + "settings.reveal_config": "Revelar configuração", + "settings.reveal_config_failed": "Falha ao revelar configuração do workspace.", + "settings.reveal_config_requires_desktop": "Revelar configuração requer o app desktop", + "settings.revealed_workspace_config": "Configuração do workspace revelada.", + "settings.run_sandbox_probe": "Executando sonda...", + "settings.running_probe": "Executando sonda...", + "settings.runtime_applies_hint": "Aplica-se na próxima vez que o engine iniciar ou recarregar.", + "settings.runtime_debug_desc": "Snapshot de diagnósticos legível com exportação em um clique.", + "settings.runtime_debug_title": "Relatório de depuração do runtime", + "settings.runtime_desc": "Status do seu engine local e servidor OpenWork.", + "settings.runtime_direct": "Direto (OpenCode)", + "settings.runtime_orchestrator": "OpenWork Orchestrator", + "settings.runtime_title": "Runtime", + "settings.sandbox_error": "Erro", + "settings.sandbox_export_hint": "Use Exportar no relatório de depuração do runtime acima para", + "settings.sandbox_probe_desc": "Executa uma verificação temporária de inicialização do sandbox Docker e", + "settings.sandbox_probe_errors": "Sonda do sandbox concluída com erros.", + "settings.sandbox_probe_failed": "Sonda do sandbox falhou.", + "settings.sandbox_probe_success": "Sonda do sandbox bem-sucedida. Exporte o relatório de depuração para suporte.", + "settings.sandbox_probe_title": "Sonda do sandbox", + "settings.sandbox_ready": "Pronto", + "settings.sandbox_requires_desktop": "Sonda do sandbox requer o app desktop", + "settings.sandbox_result": "Resultado: {status}", + "settings.sandbox_run_id": "ID da execução: {id}", + "settings.sandbox_stop_runs_hint": "Pare as execuções ativas antes de sondar", + "settings.search_models": "Buscar modelos…", + "settings.select_binary": "Selecionar binário do OpenCode", + "settings.select_workspace_first": "Selecione um workspace local antes de revelar a configuração.", + "settings.send_feedback": "Enviar feedback", + "settings.service_restarts_desc": "Reiniciar serviços específicos do host sem sair desta", + "settings.service_restarts_title": "Reinicialização de serviços", + "settings.session_model": "Modelo", + "settings.show_model_reasoning": "Mostrar raciocínio do modelo", + "settings.show_model_reasoning_desc": "Expandir os traços de raciocínio na interface quando o modelo os expõe.", + "settings.showing_models": "Exibindo {count} de {total}", + "settings.sidecar_config_unavailable": "Configuração do sidecar indisponível", + "settings.startup": "Inicialização", + "settings.startup_local": "Iniciar servidor local", + "settings.startup_not_set": "Conectar ao servidor", + "settings.startup_remote_warning": "A preferência de inicialização é atualmente remota. Configurações do engine", + "settings.startup_reset_hint": "Apaga sua preferência salva e exibe a seleção de conexão", + "settings.startup_server": "Conectar ao servidor", + "settings.startup_title": "Inicialização", + "settings.stop_local_server": "Parar servidor local", + "settings.stop_runs_before_cleanup": "Pare as execuções ativas antes da limpeza", + "settings.stop_runs_before_reset_config": "Pare as execuções ativas antes de redefinir a configuração", + "settings.stop_runs_to_reset": "Pare as execuções ativas para redefinir", + "settings.switch": "Alternar", "settings.tab_advanced": "Avançado", "settings.tab_appearance": "Aparência", "settings.tab_automations": "Automações", "settings.tab_cloud": "Cloud", "settings.tab_debug": "Depuração", + "settings.tab_description_advanced": "Inspecione a saúde do runtime, estado da conexão e controles para desenvolvedores.", + "settings.tab_description_appearance": "Ajuste a aparência do OpenWork no desktop, tema do sistema e decoração do app.", + "settings.tab_description_automations": "Crie e gerencie automações agendadas nas configurações do workspace.", + "settings.tab_description_debug": "Revise diagnósticos do runtime, logs e utilitários de depuração de baixo nível.", + "settings.tab_description_den": "Gerencie sua conexão OpenWork Cloud, workers hospedados e acesso a workspaces.", + "settings.tab_description_extensions": "Gerencie apps MCP e plugins OpenCode para este workspace.", + "settings.tab_description_general": "Conecte provedores, escolha o modelo padrão, autorize pastas e controle o workspace OpenWork selecionado e sua conexão de runtime.", + "settings.tab_description_messaging": "Configure identidades do router e comportamento da caixa de entrada nas configurações do workspace.", + "settings.tab_description_model": "Ajuste o modelo padrão, comportamento do runtime e configurações de saída do assistente.", + "settings.tab_description_recovery": "Repare estado de migração, redefina padrões do workspace e recupere configurações locais.", + "settings.tab_description_skills": "Navegue, edite e instale skills sem sair das configurações.", + "settings.tab_description_updates": "Mantenha o app atualizado com verificações silenciosas em segundo plano e controles de instalação.", "settings.tab_extensions": "Extensões", "settings.tab_general": "Configurações", "settings.tab_messaging": "Mensagens", + "settings.tab_model": "Modelo", "settings.tab_recovery": "Recuperação", "settings.tab_skills": "Skills", "settings.tab_updates": "Atualizações", - - // ==================== Share ==================== + "settings.theme_dark": "Escuro", + "settings.theme_light": "Claro", + "settings.theme_system": "Sistema", + "settings.theme_system_hint": "O modo sistema segue automaticamente a preferência do seu SO.", + "settings.toolbar_ready_to_install": "Pronto para instalar", + "settings.update": "Atualizar", + "settings.update_available": "Atualização disponível: v", + "settings.update_available_version": "Atualização disponível: v{version}", + "settings.update_check_button": "Verificar", + "settings.update_check_failed": "Falha na verificação de atualização", + "settings.update_checking": "Verificando...", + "settings.update_download_button": "Baixar", + "settings.update_downloading": "Baixando...", + "settings.update_error": "Falha na verificação de atualização", + "settings.update_install_button": "Instalar e Reiniciar", + "settings.update_last_checked": "Última verificação {time}", + "settings.update_published": "Publicado em {date}", + "settings.update_ready": "Pronto para instalar: v", + "settings.update_ready_version": "Pronto para instalar: v{version}", + "settings.update_uptodate": "Atualizado", + "settings.updates": "Atualizações", + "settings.updates_desc": "Manter o OpenWork atualizado.", + "settings.updates_desktop_only": "Atualizações estão disponíveis apenas no app desktop.", + "settings.updates_not_supported": "Atualizações não são suportadas neste ambiente.", + "settings.updates_title": "Atualizações", + "settings.version": "Versão", + "settings.versions_desc": "Informações de build do Sidecar + desktop.", + "settings.versions_title": "Versões", + "settings.window_appearance_desc": "Personalizar aparência da janela.", + "settings.worker_id_label": "Worker {id}", + "settings.worker_unresolved": "Worker {runtimeWorkspaceId}", + "settings.workspace_config_desc": ".opencode/openwork.json", + "settings.workspace_config_title": "Config do workspace", + "settings.workspace_debug_events_label": "Eventos de depuração do workspace", + "settings.workspace_fallback_name": "Workspace", "share.active_cloud_org": "Organização Cloud ativa", "share.back_hint": "Voltar às opções de compartilhamento", "share.chooser_subtitle": "Escolha como deseja compartilhar este workspace.", @@ -1539,8 +1770,33 @@ export default { "share.workspace_fallback": "Workspace", "share.workspace_template_desc": "Compartilhe a configuração base e os padrões do workspace.", "share.workspace_template_title": "Template de workspace", - - // ==================== Sidebar ==================== + "share_skill_destination.add_to_workspace": "Adicionar ao workspace", + "share_skill_destination.adding": "Adicionando...", + "share_skill_destination.confirm_busy": "Adicionando skill...", + "share_skill_destination.confirm_button": "Adicionar skill ao workspace", + "share_skill_destination.connect_remote": "Conectar workspace remoto", + "share_skill_destination.connect_remote_desc": "Vincular um host OpenWork e selecioná-lo na lista para importar esta skill.", + "share_skill_destination.connect_remote_hint": "Vincule um host OpenWork e selecione-o na lista para importar esta skill.", + "share_skill_destination.create_worker": "Criar novo workspace", + "share_skill_destination.create_worker_desc": "Abrir o fluxo de configuração do workspace e adicionar esta skill após o novo workspace estar pronto.", + "share_skill_destination.create_worker_hint": "Abra o fluxo de configuração do workspace e adicione esta skill após o novo workspace estar pronto.", + "share_skill_destination.current_badge": "Atual", + "share_skill_destination.existing_workers": "Workspaces existentes", + "share_skill_destination.fallback_skill_name": "Skill compartilhada", + "share_skill_destination.footer_idle": "Escolha um workspace para continuar.", + "share_skill_destination.footer_selected": "Workspace selecionado:", + "share_skill_destination.local_badge": "Local", + "share_skill_destination.more_options": "Mais opções", + "share_skill_destination.new_destination": "Novo destino", + "share_skill_destination.no_workers": "Nenhum workspace está pronto ainda. Crie um ou conecte um workspace remoto para instalar esta skill.", + "share_skill_destination.remote_badge": "Remoto", + "share_skill_destination.sandbox_badge": "Sandbox", + "share_skill_destination.selected_badge": "Selecionado", + "share_skill_destination.selected_hint": "Selecionado. Revise o destino abaixo e confirme.", + "share_skill_destination.skill_label": "Skill compartilhada", + "share_skill_destination.subtitle": "Escolha um workspace existente ou crie um novo antes de importar esta skill compartilhada.", + "share_skill_destination.title": "Para onde esta skill deve ir?", + "share_skill_destination.trigger_label": "Gatilho", "sidebar.active": "Ativo", "sidebar.add_workspace": "Adicionar novo workspace", "sidebar.collapse": "Recolher", @@ -1552,74 +1808,215 @@ export default { "sidebar.import_config": "Importar config", "sidebar.needs_attention": "Requer atenção", "sidebar.new_worker": "Novo worker", - "sidebar.no_sessions_yet": "Nenhuma sessão ainda", "sidebar.no_workspaces": "Nenhum workspace nesta sessão ainda. Adicione um para começar.", "sidebar.progress": "Progresso", - "sidebar.remove_workspace": "Remover workspace", "sidebar.show_fewer": "Mostrar menos", "sidebar.show_more": "Mostrar mais {count}", "sidebar.stop_sandbox": "Parar sandbox", "sidebar.switch": "Alternar", "sidebar.test_connection": "Testar conexão", - - // ==================== Skills (additional) ==================== + "skills.add_custom_repo": "Adicionar repo GitHub personalizado", + "skills.add_git_repo": "Adicionar repo git", + "skills.add_openwork_hub": "Adicionar OpenWork Hub", + "skills.available_from_hub": "Disponível no Hub", "skills.catalog_search_placeholder": "Buscar skills instaladas, de equipe e de hub", "skills.cloud_add_skill": "Adicionar skill", - "skills.cloud_badge": "Cloud", "skills.cloud_choose_org_detail": "Use o painel Cloud para escolher sua organização ativa e atualize esta lista.", "skills.cloud_choose_org_hint": "Escolha uma organização em Configurações → Cloud para carregar skills da equipe.", "skills.cloud_footer_label": "Equipe", "skills.cloud_hub_label": "Hub: {name}", "skills.cloud_install_need_server": "Conecte a um servidor OpenWork com acesso de escrita a skills para instalar skills de equipe neste worker.", "skills.cloud_installed": "{name} instalado neste worker.", - "skills.cloud_installing": "Instalando {title}\u2026", + "skills.cloud_installing": "Instalando {title}…", "skills.cloud_installing_short": "Instalando", "skills.cloud_no_search_matches": "Nenhuma skill corresponde a essa busca.", "skills.cloud_org_empty": "Nenhuma skill da organização disponível ainda.", "skills.cloud_org_fallback": "OpenWork Cloud", "skills.cloud_org_load_failed": "Falha ao carregar skills da organização.", "skills.cloud_refresh": "Atualizar skills da equipe", - "skills.cloud_section_subtitle": - "Skills compartilhadas com você pelo OpenWork Cloud — incluindo hubs de skills da equipe que você pode acessar.", + "skills.cloud_section_subtitle": "Skills compartilhadas com você pelo OpenWork Cloud — incluindo hubs de skills da equipe que você pode acessar.", "skills.cloud_section_title": "Da sua organização", "skills.cloud_shared_org": "Org", "skills.cloud_shared_public": "Público", "skills.cloud_sign_in": "Entrar no Cloud", "skills.cloud_sign_in_hint": "Entre no OpenWork Cloud para navegar por skills de equipe e organização.", + "skills.copy_link_failed": "Falha ao copiar link", + "skills.create_in_chat": "Criar skill no chat", + "skills.desktop_required": "O gerenciamento de skills requer o app desktop.", + "skills.enter_plugin_name": "Digite o nome do pacote do plugin.", + "skills.failed_load_active": "Falha ao carregar plugins ativos.", + "skills.failed_load_opencode": "Falha ao carregar opencode.json", + "skills.failed_parse_opencode": "Falha ao processar opencode.json", + "skills.failed_to_load": "Falha ao carregar skills", + "skills.failed_update_opencode": "Falha ao atualizar opencode.json", "skills.filter_all": "Todas", "skills.filter_cloud": "Equipe", "skills.filter_hub": "Hub", "skills.filter_installed": "Instaladas", - - // ==================== Status (additional) ==================== + "skills.from_repo": "De {owner}/{repo}", + "skills.github_repo_hint": "Insira um repo GitHub no formato owner/repo.", + "skills.host_mode_only": "Apenas workspace local", + "skills.host_only_error": "O gerenciamento de skills requer um workspace local ou servidor OpenWork conectado.", + "skills.hub_desc": "Navegue por skills compartilhadas de hubs no GitHub e adicione-as a este worker.", + "skills.hub_label": "Hub", + "skills.import": "Importar", + "skills.import_failed": "Falha na importação ({status})", + "skills.import_local": "Importar skill local", + "skills.import_local_hint": "Copiar uma pasta de skill existente para este workspace.", + "skills.import_local_skill": "Importar skill local", + "skills.imported": "Importado.", + "skills.install": "Instalar", + "skills.install_failed": "Falha na instalação da skill.", + "skills.install_name_title": "Instalar {name}", + "skills.install_skill_creator": "Instalar criador de skills", + "skills.install_skill_creator_hint": "Esta skill permite criar outras skills diretamente pelo chat.", + "skills.installed": "Skills instaladas", + "skills.installed_desc": "Skills instaladas vivem neste worker e podem ser editadas ou compartilhadas.", + "skills.installed_label": "Instalado", + "skills.installed_status": "Instalado", + "skills.installing": "Adicionar skill", + "skills.installing_prefix": "Instalando {name}…", + "skills.installing_skill_creator": "Instalando criador de skills...", + "skills.link_copied": "Link copiado", + "skills.loading": "Carregando…", + "skills.no_description": "Sem descrição ainda.", + "skills.no_hub_repo_label": "Nenhum repo de hub selecionado", + "skills.no_hub_repo_selected": "Nenhuma skill de hub disponível.", + "skills.no_hub_skills": "Nenhum repo de hub selecionado. Adicione um repo GitHub para navegar por skills.", + "skills.no_opencode_found": "Nenhum opencode.json encontrado ainda. Adicione um plugin para criar um.", + "skills.no_opencode_workspace": "Nenhum opencode.json neste workspace ainda.", + "skills.no_skills": "Nenhuma skill detectada em `.opencode/skills`, `.claude/skills` ou `~/.agents/skills`.", + "skills.no_skills_found": "Nenhuma skill encontrada ainda.", + "skills.owner_label": "Proprietário", + "skills.owner_repo_required": "Proprietário e repo são obrigatórios.", + "skills.pick_project_first": "Escolha primeiro uma pasta de projeto.", + "skills.pick_project_for_active": "Escolha uma pasta de projeto para carregar os plugins ativos.", + "skills.pick_project_for_plugins": "Escolha uma pasta de projeto para gerenciar os plugins do projeto.", + "skills.pick_workspace_first": "Escolha primeiro uma pasta de workspace.", + "skills.plugin_already_listed": "Plugin já listado no opencode.json.", + "skills.plugin_management_host_only": "O gerenciamento de plugins requer o app desktop.", + "skills.plugins_host_only": "Plugins estão disponíveis apenas no app desktop.", + "skills.ref_label": "Ref (branch/tag/commit)", + "skills.refresh": "Atualizar", + "skills.refresh_hub": "Atualizar hub", + "skills.refresh_hub_title": "Atualizar catálogo do hub", + "skills.remove_saved_repo": "Remover repo salvo", + "skills.repo_label": "Repo", + "skills.reveal_failed": "Falha ao abrir a pasta de skills.", + "skills.reveal_folder": "Abrir pasta de skills", + "skills.reveal_folder_hint": "Abrir o diretório de skills no Finder.", + "skills.save_and_load": "Salvar e carregar", + "skills.save_failed": "Falha ao salvar skill.", + "skills.select_skill_folder": "Selecionar pasta da skill", + "skills.share_back": "Voltar", + "skills.share_chooser_subtitle": "Salve na sua organização OpenWork Cloud ou publique um link de instalação público.", + "skills.share_close": "Fechar", + "skills.share_copy_link": "Copiar", + "skills.share_done": "Concluído", + "skills.share_option_public_desc": "Crie um link para qualquer pessoa instalar esta skill.", + "skills.share_option_public_title": "Link público", + "skills.share_option_team_desc": "Adicione esta skill à organização ativa do OpenWork Cloud.", + "skills.share_option_team_title": "Compartilhar com a equipe", + "skills.share_public_create": "Criar link", + "skills.share_public_creating": "Publicando…", + "skills.share_public_intro": "Publique um link público. Qualquer pessoa com a URL pode instalar esta skill.", + "skills.share_public_regenerate": "Regenerar link", + "skills.share_publisher_label": "Publicador", + "skills.share_subtitle_public": "Qualquer pessoa com o link pode instalar esta skill.", + "skills.share_subtitle_team": "Salva na sua organização para a equipe.", + "skills.share_team_choose_org": "Escolha uma organização em Configurações → Cloud antes de compartilhar.", + "skills.share_team_hub_label": "Adicionar ao hub de skills (opcional)", + "skills.share_team_hub_none": "Somente organização — sem hub", + "skills.share_team_hubs_loading": "Carregando hubs…", + "skills.share_team_intro": "Salve na organização ativa para a equipe instalar pelo Cloud.", + "skills.share_team_org_fallback": "Organização Cloud ativa", + "skills.share_team_save": "Salvar para a equipe", + "skills.share_team_saving": "Salvando…", + "skills.share_team_sign_in": "Entrar para compartilhar com a equipe", + "skills.share_team_sign_in_hint": "O OpenWork Cloud abre no navegador. Volte aqui após entrar.", + "skills.share_team_success": "Salvo em {org}. A equipe pode instalar pelas skills da organização.", + "skills.share_title": "Compartilhar skill", + "skills.shown_count": "{count} exibidas", + "skills.skill_creator_already_installed": "O criador de skills já está instalado.", + "skills.skill_creator_installed": "Criador de skills instalado.", + "skills.skill_load_failed": "Falha ao carregar skill.", + "skills.source_label": "Fonte", + "skills.subtitle": "Gerenciar skills para este workspace.", + "skills.title": "Skills", + "skills.trigger_label": "Gatilho: {trigger}", + "skills.uninstall": "Desinstalar", + "skills.uninstall_failed": "Falha ao desinstalar a skill.", + "skills.uninstall_title": "Desinstalar skill?", + "skills.uninstall_warning": "Isso excluirá permanentemente a skill `{name}` do seu workspace.", + "skills.uninstalled": "Skill removida.", + "skills.unknown_error": "Erro desconhecido", + "skills.worker_profile_desc": "Skills são as habilidades principais deste worker. Descubra-as no Hub, gerencie as instaladas e crie novas diretamente no chat.", "status.back": "Voltar à tela anterior", + "status.connected": "Conectado", + "status.connecting": "Conectando", + "status.creating_task": "Criando nova tarefa", + "status.creating_workspace": "Criando workspace", "status.developer_mode": "Modo desenvolvedor", + "status.disconnected": "Desconectado", "status.disconnected_hint": "Abra as configurações para reconectar", "status.disconnected_label": "Desconectado", + "status.disconnecting": "Desconectando", "status.feedback": "Feedback", + "status.idle": "Ocioso", + "status.installing_opencode": "Instalando OpenCode", "status.limited_hint": "Reconecte para restaurar todos os recursos do OpenWork", "status.limited_mcp_hint": "{count} MCP conectados · reconecte para recursos completos", "status.limited_mode": "Modo Limitado", + "status.live": "Ao vivo", + "status.loading_session": "Carregando sessão", "status.mcp_connected": "{count} MCP conectados", "status.openwork_ready": "OpenWork Pronto", - "status.providers_connected": "{count} provedor{plural} conectado{plural}", + "status.providers_connected": "{count} provider{plural} conectado{plural}", "status.ready_for_tasks": "Pronto para novas tarefas", + "status.reloading_engine": "Recarregando engine", + "status.restarting_engine": "Reiniciando engine", + "status.running": "Em execução", "status.send_feedback": "Enviar feedback", "status.settings": "Configurações", - - // ==================== Workspace (additional) ==================== - "workspace.active": "Ativo", + "status.starting_engine": "Iniciando engine", + "system.cache_repair_requires_desktop": "Reparo de cache requer o app desktop.", + "system.docker_cleanup_requires_desktop": "Limpeza do Docker requer o app desktop.", + "system.reload_body_agents": "O OpenCode carrega agents na inicialização. Recarregue o engine para disponibilizar agents atualizados.", + "system.reload_body_commands": "O OpenCode carrega comandos na inicialização. Recarregue o engine para disponibilizar comandos atualizados.", + "system.reload_body_config": "O OpenCode lê opencode.json na inicialização. Recarregue o engine para aplicar mudanças de configuração.", + "system.reload_body_default": "O OpenWork detectou mudanças que exigem recarregar a instância do OpenCode.", + "system.reload_body_mcp": "O OpenCode carrega servidores MCP na inicialização. Recarregue o engine para ativar a nova conexão.", + "system.reload_body_mixed": "O OpenWork detectou mudanças na configuração do OpenCode. Recarregue o engine para aplicá-las.", + "system.reload_body_plugins": "O OpenCode carrega plugins npm na inicialização. Recarregue o engine para aplicar mudanças no opencode.json.", + "system.reload_body_skills": "O OpenCode pode cachear a descoberta de skills. Recarregue o engine para disponibilizar skills recém-instaladas.", + "system.reload_failed": "Falha ao recarregar o engine.", + "system.reload_required": "Recarregamento necessário", + "system.reload_unavailable": "Recarregamento não disponível para este worker.", + "system.stop_active_runs_before_reset": "Pare as execuções ativas antes de redefinir.", + "system.stop_runs_before_update": "Pare as execuções ativas antes de instalar uma atualização.", + "system.updates_not_supported": "Atualizações não são suportadas neste ambiente.", + "time.hours_ago": "{count}h atrás", + "time.just_now": "agora mesmo", + "time.minutes_ago": "{count}min atrás", + "time.seconds_ago": "{count}s atrás", "workspace.loading_tasks": "Carregando tarefas...", "workspace.local_badge": "Local", - "workspace.needs_attention": "Requer atenção", "workspace.new_task_inline": "+ Nova tarefa", "workspace.no_tasks": "Nenhuma tarefa ainda.", "workspace.remote_badge": "Remoto", + "workspace.rename_description": "Atualizar o nome exibido na barra lateral.", + "workspace.rename_label": "Nome do workspace", + "workspace.rename_placeholder": "Workspace da equipe de design", + "workspace.rename_title": "Editar nome do workspace", "workspace.sandbox_badge": "Sandbox", "workspace.selected": "Selecionado", "workspace.switch": "Alternar", - - // ==================== Workspace List ==================== + "workspace.switching_status_connecting": "Verificando sua conexão", + "workspace.switching_status_loading": "Carregando tarefas recentes", + "workspace.switching_status_preparing": "Preparando tudo", + "workspace.switching_subtitle": "Vamos trazer seu trabalho recente de volta.", + "workspace.switching_title": "Abrindo {name}", + "workspace.switching_title_unknown": "Abrindo workspace", "workspace_list.add_workspace": "Adicionar workspace", "workspace_list.connect_remote": "Conectar workspace remoto", "workspace_list.connecting": "Conectando...", @@ -1643,8 +2040,6 @@ export default { "workspace_list.test_connection": "Testar conexão", "workspace_list.workspace_fallback": "Workspace", "workspace_list.workspace_options": "Opções do workspace", - - // ==================== Workspace Sidebar ==================== "workspace_sidebar.automations": "Automações", "workspace_sidebar.close_sidebar": "Fechar barra lateral", "workspace_sidebar.collapse_sidebar": "Recolher barra lateral", diff --git a/apps/app/src/i18n/locales/th.ts b/apps/app/src/i18n/locales/th.ts index f7fd6f13d..ad8e334ef 100644 --- a/apps/app/src/i18n/locales/th.ts +++ b/apps/app/src/i18n/locales/th.ts @@ -4,1665 +4,2047 @@ */ export default { - // ==================== Dashboard ==================== - "dashboard.title": "แดชบอร์ด", - "dashboard.sessions": "เซสชัน", + "app.compact_command_desc": "สรุปเซสชันนี้เพื่อลดขนาดบริบท", + "app.connection_lost": "การเชื่อมต่อเซิร์ฟเวอร์ขาดหาย กรุณารีโหลด", + "app.deep_link_auth_queued": "จัดคิว deep link สำหรับ Cloud auth ใน OpenWork แล้ว", + "app.deep_link_remote_queued": "จัดคิวลิงก์ remote worker แล้ว OpenWork จะเข้าสู่ขั้นตอนเชื่อมต่อ", + "app.error.choose_folder": "เลือกโฟลเดอร์เพื่อดำเนินการต่อ", + "app.error.host_requires_local": "เลือกพื้นที่ทำงานภายในเครื่องเพื่อเริ่ม engine", + "app.error.install_failed": "ติดตั้ง OpenCode ไม่สำเร็จ ดู logs ด้านบน", + "app.error.pick_workspace_folder": "เลือกโฟลเดอร์พื้นที่ทำงานก่อน", + "app.error.remote_base_url_required": "เพิ่ม URL ของเซิร์ฟเวอร์เพื่อดำเนินการต่อ", + "app.error.tauri_required": "การดำเนินการนี้ต้องใช้ Tauri app runtime", + "app.error_audit_load": "โหลดบันทึกการตรวจสอบไม่สำเร็จ", + "app.error_auth_failed": "การยืนยันตัวตนล้มเหลว", + "app.error_auto_compact_scope": "การบีบอัดบริบทอัตโนมัติสามารถเปลี่ยนได้เฉพาะสำหรับพื้นที่ทำงานภายในเครื่องหรือ OpenWork server ที่เขียนได้", + "app.error_cloud_signin": "เข้าสู่ระบบ OpenWork Cloud ไม่สำเร็จ", + "app.error_command_not_resolved": "ไม่สามารถ resolve คำสั่ง", + "app.error_compact_empty": "ยังไม่มีสิ่งที่จะบีบอัด", + "app.error_compact_no_session": "เลือกเซสชันที่มีข้อความก่อนรัน /compact", + "app.error_compact_no_session_id": "เลือกเซสชันก่อนบีบอัด", + "app.error_connect_first": "เชื่อมต่อ worker นี้ก่อนใช้การเปลี่ยนแปลง runtime", + "app.error_connection_failed": "เชื่อมต่อไม่สำเร็จ", + "app.error_connection_failed_url": "เชื่อมต่อไม่สำเร็จ ตรวจสอบ URL และ token", + "app.error_deep_link_unrecognized": "ลิงก์นั้นไม่ใช่ deep link หรือ share URL ที่ OpenWork รู้จัก", + "app.error_desktop_signin": "การเข้าสู่ระบบเดสก์ท็อปเสร็จสิ้น แต่ OpenWork Cloud ไม่ส่งคืนโทเค็นเซสชัน", + "app.error_not_connected": "ไม่ได้เชื่อมต่อกับเซิร์ฟเวอร์", + "app.error_pick_local_folder": "เลือกโฟลเดอร์ local worker ก่อนรีสตาร์ท local server", + "app.error_rate_limit": "เกินขีดจำกัดอัตราการใช้งาน", + "app.error_remote_access": "อัปเดตการเข้าถึงระยะไกลไม่สำเร็จ", + "app.error_request_failed": "คำขอล้มเหลว", + "app.error_reset_config": "รีเซ็ตค่าเริ่มต้น app config ไม่สำเร็จ", + "app.error_restart_local_worker": "รีสตาร์ท local worker ด้วยการตั้งค่าการแชร์ที่อัปเดตไม่สำเร็จ", + "app.error_runtime_changes": "ใช้การเปลี่ยนแปลง runtime ไม่สำเร็จ", + "app.error_session_name_required": "ต้องใส่ชื่อเซสชัน", + "app.error_update_opencode_json": "อัปเดต opencode.json ไม่สำเร็จ", + "app.import_bundle_desc": "เลือกวิธีนำเข้า bundle นี้", + "app.import_shared_bundle": "นำเข้า bundle ที่แชร์", + "app.local_disabled_reason": "สร้างพื้นที่ทำงานภายในเครื่องในแอปเดสก์ท็อป พื้นที่ทำงานระยะไกลและที่แชร์ยังใช้งานได้ที่นี่", + "app.local_worker_detail": "Worker ภายในเครื่อง", + "app.model_behavior_desc": "เลือกโมเดลก่อนเพื่อดูการควบคุมพฤติกรรมเฉพาะผู้ให้บริการ", + "app.model_behavior_title": "พฤติกรรมโมเดล", + "app.plugins_hint_disconnected": "OpenWork server ไม่พร้อมใช้งาน Plugins เป็นแบบอ่านอย่างเดียว", + "app.plugins_hint_limited": "OpenWork server ต้องใช้ token เพื่อแก้ไข plugins", + "app.plugins_hint_readonly": "OpenWork server เป็นแบบอ่านอย่างเดียวสำหรับ plugins", + "app.reload_later": "ภายหลัง", + "app.reload_now": "รีโหลดตอนนี้", + "app.reload_stop_tasks": "รีโหลดและหยุดงาน", + "app.remote_worker_detail": "Worker ระยะไกล", + "app.reset_config_ok": "รีเซ็ตค่าเริ่มต้น app config แล้ว รีสตาร์ท OpenWork หากมีการตั้งค่าเก่าเหลืออยู่", + "app.shared_setup": "ตั้งค่าที่แชร์", + "app.skill_added": "เพิ่ม skill แล้ว", + "app.skills_hint_disconnected": "OpenWork server ไม่พร้อมใช้งาน เพิ่ม URL/token ของเซิร์ฟเวอร์ใน Advanced เพื่อจัดการ skills", + "app.skills_hint_limited": "OpenWork server ต้องใช้ host token เพื่อติดตั้ง/อัปเดต skills เพิ่มใน Advanced แล้วเชื่อมต่อใหม่", + "app.skills_hint_readonly": "OpenWork server เป็นแบบอ่านอย่างเดียวสำหรับ skills เพิ่ม host token ใน Advanced เพื่อเปิดการติดตั้ง", + "app.unknown_error": "ข้อผิดพลาดที่ไม่ทราบสาเหตุ", + "app.worker_fallback": "Worker", + "automations.desktop_required": "งานตามกำหนดเวลาต้องใช้แอปเดสก์ท็อป", + "automations.failed_to_load": "โหลดงานตามกำหนดเวลาไม่สำเร็จ", + "automations.prompt_empty": "พรอมต์ออโตเมชั่นว่างเปล่า", + "automations.prompt_required": "ต้องใส่พรอมต์", + "automations.schedule_required": "ต้องใส่กำหนดเวลา", + "automations.server_needs_token": "OpenWork server ต้องใช้ token เพื่อโหลดงานตามกำหนดเวลา", + "automations.server_not_ready": "OpenWork server ยังไม่พร้อม", + "automations.server_unavailable": "OpenWork server ไม่พร้อมใช้งาน เชื่อมต่อเพื่อซิงค์งานตามกำหนดเวลา", + "blueprint.automation_body": "เริ่มจาก workflow ที่ใช้ซ้ำได้ หรือพิมพ์งานของคุณด้านล่าง", + "blueprint.automation_title": "ต้องการให้ทำอะไรอัตโนมัติ?", + "blueprint.csv_session_assistant": "ฉันช่วยสร้าง ทำความสะอาด รวม และสรุปไฟล์ CSV ได้ ต้องการทำงาน CSV แบบไหน?", + "blueprint.csv_session_title": "ไอเดียการทำงาน CSV", + "blueprint.csv_session_user": "ฉันต้องการรวมข้อมูลส่งออกจากหลายเครื่องมือเป็น CSV เดียวที่สะอาด", + "blueprint.empty_body": "เลือกจุดเริ่มต้น หรือพิมพ์ด้านล่าง", + "blueprint.empty_title": "ต้องการทำอะไร?", + "blueprint.minimal_body": "ถามเกี่ยวกับพื้นที่ทำงานนี้ หรือใช้พรอมต์เริ่มต้น", + "blueprint.minimal_title": "เริ่มต้นด้วยงาน", + "blueprint.starter_blueprint_desc": "ออกแบบ workflow ที่ใช้ซ้ำได้ด้วย skills, คำสั่ง และขั้นตอนการส่งต่อ", + "blueprint.starter_blueprint_prompt": "ช่วยออกแบบ automation blueprint ที่ใช้ซ้ำได้สำหรับพื้นที่ทำงานนี้ ถามว่าควรทำให้เป็นมาตรฐานอย่างไร แล้วเสนอ workflow", + "blueprint.starter_blueprint_title": "วางแผน automation blueprint", + "blueprint.starter_chrome_desc": "เริ่มต้น browser automation ได้ทันที", + "blueprint.starter_chrome_prompt": "ช่วยเชื่อมต่อ Chrome และทำให้งานซ้ำๆ เป็นอัตโนมัติ", + "blueprint.starter_chrome_title": "ทำ Chrome อัตโนมัติ", + "blueprint.starter_command_desc": "เปลี่ยน workflow ที่ทำซ้ำๆ เป็น slash command สำหรับพื้นที่ทำงานนี้", + "blueprint.starter_command_prompt": "ช่วยสร้าง /command ที่ใช้ซ้ำได้สำหรับพื้นที่ทำงานนี้ ถามว่าต้องการทำ workflow อะไรอัตโนมัติ แล้วร่างคำสั่ง", + "blueprint.starter_command_title": "สร้างคำสั่งที่ใช้ซ้ำได้", + "blueprint.starter_connect_openai_desc": "เพิ่ม provider OpenAI เพื่อให้โมเดล ChatGPT พร้อมใช้งานในเซสชันใหม่", + "blueprint.starter_connect_openai_title": "เชื่อมต่อ ChatGPT", + "blueprint.starter_csv_desc": "ทำความสะอาดหรือสร้างข้อมูลสเปรดชีต", + "blueprint.starter_csv_prompt": "ช่วยสร้างหรือแก้ไขไฟล์ CSV บนคอมพิวเตอร์เครื่องนี้", + "blueprint.starter_csv_title": "ทำงานกับ CSV", + "blueprint.starter_explore_desc": "สรุปไฟล์ในพื้นที่ทำงานและแนะนำงานแรกที่ควรทำ", + "blueprint.starter_explore_prompt": "สรุปพื้นที่ทำงานนี้ ชี้ไฟล์สำคัญที่สุด แล้วแนะนำงานแรกที่ดีที่สุด", + "blueprint.starter_explore_title": "สำรวจพื้นที่ทำงานนี้", + "blueprint.welcome_message": "สวัสดี ยินดีต้อนรับสู่ OpenWork!\n\nผู้คนใช้ OpenWork เขียนไฟล์ .csv บนคอมพิวเตอร์ เชื่อมต่อ Chrome เพื่อทำงานซ้ำๆ อัตโนมัติ และซิงค์ผู้ติดต่อกับ Notion\n\nขีดจำกัดอยู่ที่จินตนาการของคุณ\n\nต้องการทำอะไร?", + "blueprint.welcome_title": "ยินดีต้อนรับสู่ OpenWork", + "common.add": "เพิ่ม", + "common.cancel": "ยกเลิก", + "common.choose": "เลือก", + "common.close": "ปิด", + "common.default_parens": "(ค่าเริ่มต้น)", + "common.done": "เสร็จสิ้น", + "common.edit": "แก้ไข", + "common.hide": "ซ่อน", + "common.install": "ติดตั้ง", + "common.navigate": "นำทาง", + "common.next": "ถัดไป", + "common.off": "ปิด", + "common.on": "เปิด", + "common.path": "เส้นทาง", + "common.question": "คำถาม", + "common.refresh": "รีเฟรช", + "common.remove": "ลบ", + "common.reset": "รีเซ็ต", + "common.retry": "ลองใหม่", + "common.save": "บันทึก", + "common.select": "เลือก", + "common.show": "แสดง", + "common.something_went_wrong": "เกิดข้อผิดพลาด", + "common.submit": "ส่ง", + "common.unknown": "ไม่ทราบ", + "composer.agent_label": "Agent", + "composer.attach_files": "แนบไฟล์", + "composer.attachments_unavailable": "ไฟล์แนบไม่พร้อมใช้งาน", + "composer.behavior_label": "พฤติกรรม", + "composer.configure": "ตั้งค่า", + "composer.default_agent": "Agent เริ่มต้น", + "composer.expand_pasted": "คลิกเพื่อขยายข้อความที่วาง", + "composer.failed_read_attachment": "อ่านไฟล์แนบไม่สำเร็จ", + "composer.file_exceeds_limit": "{name} เกินขีดจำกัด 8MB", + "composer.file_kind": "ไฟล์", + "composer.file_too_large_encoding": "{name} ใหญ่เกินไปหลังเข้ารหัส ลองใช้รูปภาพที่เล็กกว่า", + "composer.image_kind": "รูปภาพ", + "composer.inserted_links_unsupported": "แทรกลิงก์สำหรับไฟล์ที่ไม่รองรับ", + "composer.loading_agents": "กำลังโหลด agents...", + "composer.loading_commands": "กำลังโหลดคำสั่ง...", + "composer.mcps_label": "MCP", + "composer.no_commands": "ไม่พบคำสั่ง", + "composer.no_matches": "ไม่พบรายการที่ตรงกัน", + "composer.placeholder": "อธิบายงานของคุณ...", + "composer.remote_worker_paste_warning": "นี่คือ remote worker Sandbox ก็เป็น remote เช่นกัน หากต้องการแชร์ไฟล์ ให้อัปโหลดไปยังโฟลเดอร์ที่แชร์ในแถบด้านข้าง", + "composer.run_task": "รันงาน", + "composer.skill_source": "Skill", + "composer.stop": "หยุด", + "composer.tools_label": "คำสั่ง, Skills และ MCP", + "composer.unsupported_attachment_type": "ประเภทไฟล์แนบไม่รองรับ", + "composer.upload_failed_local_links": "อัปโหลดไปยังโฟลเดอร์ที่แชร์ไม่สำเร็จ แทรกลิงก์ภายในเครื่องแทน", + "composer.upload_to_shared_folder": "อัปโหลดไปยังโฟลเดอร์ที่แชร์", + "composer.uploaded_multiple_files": "อัปโหลด {count} ไฟล์ไปยังโฟลเดอร์ที่แชร์และแทรกลิงก์แล้ว", + "composer.uploaded_single_file": "อัปโหลด {name} ไปยังโฟลเดอร์ที่แชร์และแทรกลิงก์แล้ว", + "config.auto_reload_desc": "รีโหลดอัตโนมัติหลัง agents/skills/commands/config เปลี่ยน (เฉพาะเมื่อว่าง)", + "config.auto_reload_title": "รีโหลดอัตโนมัติ (ภายในเครื่อง)", + "config.auto_reload_unavailable": "ใช้ได้สำหรับพื้นที่ทำงานภายในเครื่องในแอปเดสก์ท็อป", + "config.collaborator_token_disabled_hint": "เก็บไว้ล่วงหน้าสำหรับการแชร์ระยะไกล แต่การเข้าถึงระยะไกลปิดอยู่", + "config.collaborator_token_label": "โทเค็นผู้ร่วมงาน", + "config.collaborator_token_remote_hint": "การเข้าถึงระยะไกลปกติสำหรับโทรศัพท์หรือแล็ปท็อปที่เชื่อมต่อกับเซิร์ฟเวอร์นี้", + "config.connection_failed": "เชื่อมต่อล้มเหลว", + "config.connection_failed_check": "เชื่อมต่อล้มเหลว ตรวจสอบ host URL และ token", + "config.connection_status_updated": "อัปเดตสถานะการเชื่อมต่อแล้ว", + "config.connection_successful": "เชื่อมต่อสำเร็จ", + "config.copied": "คัดลอกแล้ว", + "config.copy": "คัดลอก", + "config.desktop_only_hint": "ฟีเจอร์ config บางอย่าง (แชร์ local server + messaging bridge) ต้องใช้แอปเดสก์ท็อป", + "config.diagnostics_desc": "คัดลอกสถานะรันไทม์ที่ปลอดภัยสำหรับดีบัก", + "config.diagnostics_title": "ชุดข้อมูลวินิจฉัย", + "config.enable_auto_reload_first": "เปิดรีโหลดอัตโนมัติก่อน", + "config.engine_reload_desc": "รีสตาร์ท OpenCode server สำหรับพื้นที่ทำงานนี้", + "config.engine_reload_title": "รีโหลด engine", + "config.host_admin_token_hint": "Token ภายใน host สำหรับ approvals CLI และ admin API อย่าใช้ในขั้นตอนเชื่อมต่อแอป remote", + "config.host_admin_token_label": "Token ผู้ดูแล host", + "config.host_local_only": "ภายในเครื่องเท่านั้น", + "config.host_offline": "ออฟไลน์", + "config.host_remote_enabled": "เปิดใช้งานระยะไกล", + "config.local_ip_hint": "ใช้ IP ภายในเครื่องบน Wi-Fi เดียวกันเพื่อการเชื่อมต่อที่เร็วที่สุด", + "config.mdns_hint": "ชื่อ .local จดจำง่ายกว่าแต่อาจ resolve ไม่ได้ในทุกเครือข่าย", + "config.messaging_identities_desc": "จัดการ Telegram/Slack identities และ routing ในแท็บ Identities", + "config.messaging_identities_title": "Messaging identities", + "config.not_set": "ไม่ได้ตั้งค่า", + "config.owner_token_disabled_hint": "ใช้ได้หลังจากเปิดการเข้าถึงระยะไกลสำหรับ worker นี้", + "config.owner_token_label": "โทเค็นเจ้าของ", + "config.owner_token_remote_hint": "ใช้เมื่อ remote client ต้องตอบคำขออนุญาตหรือดำเนินการที่ต้องใช้สิทธิ์เจ้าของ", + "config.reload_active_tasks_warning": "การรีโหลดจะหยุดงานที่กำลังทำงาน", + "config.reload_availability_hint": "การรีโหลดใช้ได้เฉพาะ local workers หรือ OpenWork server ที่เชื่อมต่อ", + "config.reload_connect_hint": "เชื่อมต่อ worker นี้เพื่อรีโหลด", + "config.reload_engine": "รีโหลด engine", + "config.reload_now_desc": "ใช้การอัปเดต config และเชื่อมต่อเซสชันใหม่", + "config.reload_now_title": "รีโหลดตอนนี้", + "config.reloading": "กำลังรีโหลด...", + "config.remote_access_off_hint": "การเข้าถึงระยะไกลปิดอยู่ ใช้ แชร์พื้นที่ทำงาน เพื่อเปิดก่อนเชื่อมต่อจากเครื่องอื่น", + "config.resolved_worker_url": "URL ของ worker ที่ resolve:", + "config.resume_sessions_desc": "หากรีโหลดถูกจัดคิวขณะงานกำลังทำงาน ให้ส่งข้อความ resume หลังจากนั้น", + "config.resume_sessions_title": "กลับมาทำงานต่อหลังรีโหลดอัตโนมัติ", + "config.server_needed_hint": "ต้องเชื่อมต่อ OpenWork server เพื่อซิงค์ skills, plugins และ commands", + "config.server_section_desc": "เชื่อมต่อ OpenWork server ใช้ URL พร้อม collaborator หรือ owner token จากผู้ดูแลเซิร์ฟเวอร์", + "config.server_section_title": "OpenWork server", + "config.server_sharing_desc": "แชร์รายละเอียดเหล่านี้กับอุปกรณ์ที่เชื่อถือได้ ใช้เซิร์ฟเวอร์บนเครือข่ายเดียวกันเพื่อการตั้งค่าที่เร็วที่สุด", + "config.server_sharing_menu_hint": "สำหรับลิงก์แชร์เฉพาะพื้นที่ทำงาน ใช้ แชร์... ในเมนูพื้นที่ทำงาน", + "config.server_sharing_title": "แชร์ OpenWork server", + "config.server_url_hint": "ใช้ URL ที่แชร์โดย OpenWork server ของคุณ Desktop workers ใช้ port ถาวรในช่วง 48000-51000", + "config.server_url_input_label": "URL ของ OpenWork server", + "config.server_url_label": "URL ของ OpenWork Server", + "config.starting_server": "กำลังเริ่มเซิร์ฟเวอร์…", + "config.status_connected": "เชื่อมต่อแล้ว", + "config.status_limited": "จำกัด", + "config.status_not_connected": "ยังไม่ได้เชื่อมต่อ", + "config.test_connection": "ทดสอบการเชื่อมต่อ", + "config.testing": "กำลังทดสอบ...", + "config.testing_connection": "กำลังทดสอบการเชื่อมต่อ...", + "config.token_hint": "ไม่บังคับ วางโทเค็นผู้ร่วมงานสำหรับการเข้าถึงปกติ หรือโทเค็นเจ้าของเมื่อ client ต้องตอบคำขออนุญาต", + "config.token_label": "โทเค็นผู้ร่วมงานหรือเจ้าของ", + "config.token_placeholder": "วางโทเค็นของคุณ", + "config.unavailable": "ไม่พร้อมใช้งาน", + "config.worker_id": "Worker ID:", + "config.workspace_config_desc": "การตั้งค่าเหล่านี้มีผลต่อพื้นที่ทำงานที่เลือก การดำเนินการรันไทม์ใช้กับพื้นที่ทำงานที่เชื่อมต่ออยู่", + "config.workspace_config_title": "การตั้งค่าพื้นที่ทำงาน", + "config.workspace_id_prefix": "พื้นที่ทำงาน:", + "context_panel.add_button": "เพิ่ม", + "context_panel.add_folder_hint": "เพิ่มโฟลเดอร์เพื่อให้พื้นที่ทำงานนี้อ่านและแก้ไขไฟล์นอกไดเรกทอรีรูท", + "context_panel.adding_button": "กำลังเพิ่ม...", + "context_panel.always_available": "พร้อมใช้งานเสมอ", + "context_panel.authorized_folders": "โฟลเดอร์ที่อนุญาต", + "context_panel.authorized_folders_desc": "ให้พื้นที่ทำงานนี้เข้าถึงอ่านและแก้ไขไฟล์ในไดเรกทอรีนอกรูท", + "context_panel.authorized_folders_no_access": "เชื่อมต่อพื้นที่ทำงาน OpenWork server ที่เขียนได้เพื่อแก้ไขโฟลเดอร์ที่อนุญาต", + "context_panel.browse_button": "เรียกดู", + "context_panel.config_access_unavailable": "การเข้าถึง config ของ OpenWork server ไม่พร้อมใช้งานสำหรับพื้นที่ทำงานนี้", + "context_panel.config_read_only": "OpenWork server เชื่อมต่อแบบอ่านอย่างเดียวสำหรับ config พื้นที่ทำงาน", + "context_panel.context": "บริบท", + "context_panel.folder_already_authorized": "โฟลเดอร์ได้รับอนุญาตแล้ว", + "context_panel.folders_updated": "อัปเดตโฟลเดอร์ที่อนุญาตแล้ว", + "context_panel.input_placeholder": "พิมพ์เส้นทางโฟลเดอร์เพื่ออนุญาต...", + "context_panel.mcp": "MCP", + "context_panel.mcp_connected": "เชื่อมต่อแล้ว", + "context_panel.mcp_disabled": "ปิดใช้งาน", + "context_panel.mcp_disconnected": "ตัดการเชื่อมต่อ", + "context_panel.mcp_failed": "ล้มเหลว", + "context_panel.mcp_needs_auth": "ต้องยืนยันตัวตน", + "context_panel.mcp_register_client": "ลงทะเบียน client", + "context_panel.no_external_folders": "ยังไม่มีโฟลเดอร์ภายนอกที่อนุญาต", + "context_panel.no_mcp": "ไม่ได้โหลด MCP servers", + "context_panel.no_plugins": "ไม่ได้โหลด Plugins", + "context_panel.no_server_workspace": "ยังไม่ได้เลือกพื้นที่ทำงาน server ที่ใช้งาน", + "context_panel.no_skills": "ไม่ได้โหลด Skills", + "context_panel.none_yet": "ยังไม่มี", + "context_panel.plugins": "Plugins", + "context_panel.preserving_entries": "คงไว้ {count} รายการสิทธิ์ที่ไม่ใช่โฟลเดอร์", + "context_panel.preserving_entry": "คงไว้ 1 รายการสิทธิ์ที่ไม่ใช่โฟลเดอร์", + "context_panel.remove_folder": "ลบ {name}", + "context_panel.saving_folders": "กำลังบันทึกโฟลเดอร์ที่อนุญาต...", + "context_panel.server_disconnected": "OpenWork server ตัดการเชื่อมต่อแล้ว", + "context_panel.skills": "Skills", + "context_panel.working_files": "ไฟล์ที่กำลังทำงาน", + "context_panel.workspace_root_available": "รูทพื้นที่ทำงานพร้อมใช้งานแล้ว", + "context_panel.workspace_root_badge": "รูทพื้นที่ทำงาน", + "context_panel.writable_workspace_required": "ต้องมีพื้นที่ทำงาน OpenWork server ที่เขียนได้เพื่ออัปเดตโฟลเดอร์ที่อนุญาต", + "dashboard.access_token": "Access token", + "dashboard.access_token_optional_hint": "เพิ่ม token เฉพาะเมื่อ worker ต้องการ", + "dashboard.blueprints_workspace": "Blueprints", + "dashboard.blueprints_workspace_desc": "เริ่มด้วยพื้นที่ทำงานที่พร้อมสำหรับออโตเมชั่น สำหรับ skills, commands และ flows ที่แชร์ได้", + "dashboard.change": "เปลี่ยน", + "dashboard.choose_folder": "เลือกโฟลเดอร์", + "dashboard.choose_folder_continue": "เลือกโฟลเดอร์เพื่อดำเนินการต่อ", + "dashboard.choose_folder_next": "แชร์ไฟล์กับพื้นที่ทำงานของคุณ", + "dashboard.choose_preset": "เลือก Preset", + "dashboard.chooser_local_desc": "สร้างพื้นที่ทำงานบนอุปกรณ์นี้และเลือกเริ่มจากเทมเพลตทีม", + "dashboard.chooser_remote_desc": "แนบกับ OpenWork worker ที่โฮสต์เองด้วย URL และ access token", + "dashboard.chooser_shared_desc": "เรียกดู cloud workers ที่แชร์กับองค์กรของคุณและเชื่อมต่อในขั้นตอนเดียว", + "dashboard.close_settings": "ปิดการตั้งค่า", + "dashboard.cloud_signin_button": "ดำเนินการต่อกับ Cloud", + "dashboard.cloud_signin_hint": "เข้าถึง remote workers ที่แชร์กับองค์กรของคุณ", + "dashboard.cloud_signin_next": "คุณจะเลือกทีมและเชื่อมต่อกับพื้นที่ทำงานที่มีอยู่ในขั้นตอนถัดไป", + "dashboard.cloud_signin_title": "เข้าสู่ระบบ OpenWork Cloud", + "dashboard.cloud_worker": "Cloud worker", "dashboard.commands": "คำสั่ง", - "dashboard.skills": "Skills", - "dashboard.plugins": "Plugins", - "dashboard.mcps": "แอป", - "dashboard.settings": "การตั้งค่า", - "dashboard.home": "หน้าแรก", - "dashboard.runs": "การทำงาน", - "dashboard.find_workspace": "ค้นหาพื้นที่ทำงาน...", - "dashboard.workspaces": "พื้นที่ทำงาน", - "dashboard.no_workspaces": "ไม่พบพื้นที่ทำงานที่ตรงกัน", - "dashboard.new_workspace": "พื้นที่ทำงานใหม่...", - "dashboard.new_remote_workspace": "เพิ่มพื้นที่ทำงานระยะไกล...", - "dashboard.forget_workspace": "ลืมพื้นที่ทำงาน", - "dashboard.remote": "ระยะไกล", - "dashboard.connection": "การเชื่อมต่อ", - "dashboard.local_engine": "Engine ภายในเครื่อง", - "dashboard.client_mode": "โหมด Client", + "dashboard.connect_remote_button": "เชื่อมต่อระยะไกล", "dashboard.connected": "เชื่อมต่อแล้ว", - "dashboard.not_connected": "ยังไม่ได้เชื่อมต่อ", - "dashboard.stop_disconnect": "หยุดและตัดการเชื่อมต่อ", - "dashboard.disconnect": "ตัดการเชื่อมต่อ", - "dashboard.new_task": "งานใหม่", - "dashboard.new": "ใหม่", - "dashboard.busy": "กำลังทำงาน", - "dashboard.hero_title": "วันนี้ทำอะไรดี?", - "dashboard.hero_description": "บอกสิ่งที่ต้องการให้ทำ OpenWork จะดำเนินการและบันทึกประวัติให้", - "dashboard.quick_start_commands": "คำสั่งเริ่มต้นด่วน", - "dashboard.view_all": "ดูทั้งหมด", - "dashboard.no_commands": "ยังไม่มีคำสั่ง คำสั่งเริ่มต้นจะแสดงที่นี่", - "dashboard.run_command": "รันคำสั่งที่บันทึกไว้", - "dashboard.recent_sessions": "เซสชันล่าสุด", - "dashboard.this_workspace": "พื้นที่ทำงานนี้", - "dashboard.no_sessions": "ยังไม่มีเซสชัน", - "dashboard.idle": "ว่าง", - "dashboard.running": "กำลังทำงาน", - "dashboard.completed": "เสร็จสิ้น", - "dashboard.failed": "ล้มเหลว", - "dashboard.repairing_cache": "กำลังซ่อมแซมแคช", - "dashboard.repair_cache": "ซ่อมแซมแคช", - "dashboard.retry": "ลองใหม่", - "dashboard.alpha": "Alpha", - "dashboard.create_workspace_title": "สร้างพื้นที่ทำงาน", - "dashboard.create_workspace_subtitle": "เริ่มต้นพื้นที่ทำงานใหม่ตามโฟลเดอร์", - "dashboard.create_workspace_confirm": "สร้างพื้นที่ทำงาน", - "dashboard.create_sandbox_confirm": "สร้างเป็น sandbox", - "share_skill_destination.title": "Skill นี้ควรไปที่ไหน?", - "share_skill_destination.subtitle": "เลือกพื้นที่ทำงานที่มีอยู่หรือสร้างใหม่ก่อนนำเข้า skill ที่แชร์", - "share_skill_destination.skill_label": "Skill ที่แชร์", - "share_skill_destination.fallback_skill_name": "Skill ที่แชร์", - "share_skill_destination.trigger_label": "ทริกเกอร์", - "share_skill_destination.current_badge": "ปัจจุบัน", - "share_skill_destination.existing_workers": "พื้นที่ทำงานที่มีอยู่", - "share_skill_destination.no_workers": "ยังไม่มีพื้นที่ทำงานพร้อมใช้งาน สร้างใหม่หรือเชื่อมต่อพื้นที่ทำงานระยะไกลเพื่อติดตั้ง skill นี้", - "share_skill_destination.new_destination": "ปลายทางใหม่", - "share_skill_destination.selection_ready": "พร้อมเพิ่ม", - "share_skill_destination.selected_badge": "เลือกแล้ว", - "share_skill_destination.selected_hint": "เลือกแล้ว ตรวจสอบปลายทางด้านล่าง แล้วยืนยัน", - "share_skill_destination.footer_idle": "เลือกพื้นที่ทำงานเพื่อดำเนินการต่อ", - "share_skill_destination.footer_selected": "พื้นที่ทำงานที่เลือก:", - "share_skill_destination.confirm_button": "เพิ่ม skill ไปยังพื้นที่ทำงาน", - "share_skill_destination.confirm_busy": "กำลังเพิ่ม skill...", - "share_skill_destination.local_badge": "ภายในเครื่อง", - "share_skill_destination.remote_badge": "ระยะไกล", - "share_skill_destination.sandbox_badge": "Sandbox", - "share_skill_destination.create_worker": "สร้างพื้นที่ทำงานใหม่", - "share_skill_destination.create_worker_desc": "เปิดขั้นตอนสร้างพื้นที่ทำงาน แล้วเพิ่ม skill หลังจากพื้นที่ทำงานใหม่พร้อมใช้งาน", - "share_skill_destination.connect_remote": "เชื่อมต่อพื้นที่ทำงานระยะไกล", - "share_skill_destination.connect_remote_desc": "แนบ OpenWork host จากนั้นเลือกจากรายการเพื่อนำเข้า skill นี้", - "dashboard.sandbox_get_ready_title": "Sandbox ต้องใช้ Docker", - "dashboard.sandbox_get_ready_action": "เตรียมระบบให้พร้อม", - "dashboard.sandbox_get_ready_desc": "รันพื้นที่ทำงานนี้ใน Docker container แบบแยกส่วนเพื่อความปลอดภัยและการทำซ้ำที่ดีขึ้น", - "dashboard.sandbox_checking_docker": "กำลังตรวจสอบ Docker...", - "dashboard.create_remote_workspace_title": "เพิ่มพื้นที่ทำงานระยะไกล", - "dashboard.create_remote_workspace_subtitle": "บันทึก OpenWork server เป็นพื้นที่ทำงาน", + "dashboard.connecting": "กำลังเชื่อมต่อ...", + "dashboard.create_local_workspace_subtitle": "สร้างพื้นที่ทำงานบนอุปกรณ์นี้และเลือกเริ่มจากเทมเพลตทีม", + "dashboard.create_local_workspace_title": "พื้นที่ทำงานภายในเครื่อง", + "dashboard.create_remote_custom_subtitle": "แนบกับ OpenWork worker ที่โฮสต์เอง", + "dashboard.create_remote_custom_title": "เชื่อมต่อ remote กำหนดเอง", "dashboard.create_remote_workspace_confirm": "เพิ่มพื้นที่ทำงาน", - "dashboard.edit_remote_workspace_title": "แก้ไขการเชื่อมต่อระยะไกล", - "dashboard.edit_remote_workspace_subtitle": "อัปเดตรายละเอียด OpenWork server สำหรับพื้นที่ทำงานนี้", + "dashboard.create_remote_workspace_subtitle": "บันทึก OpenWork server เป็นพื้นที่ทำงาน", + "dashboard.create_remote_workspace_title": "เพิ่มพื้นที่ทำงานระยะไกล", + "dashboard.create_sandbox_confirm": "สร้างเป็น sandbox", + "dashboard.create_shared_subtitle_signed_in": "เรียกดู cloud workers ที่แชร์กับองค์กรของคุณและเชื่อมต่อในขั้นตอนเดียว", + "dashboard.create_shared_subtitle_signed_out": "เข้าสู่ระบบ OpenWork Cloud เพื่อเข้าถึง workers ที่แชร์กับองค์กรของคุณ", + "dashboard.create_shared_title": "พื้นที่ทำงานที่แชร์", + "dashboard.create_workspace_confirm": "สร้างพื้นที่ทำงาน", + "dashboard.create_workspace_subtitle": "เริ่มต้นพื้นที่ทำงานใหม่ตามโฟลเดอร์", + "dashboard.create_workspace_title": "สร้างพื้นที่ทำงาน", + "dashboard.creating": "กำลังสร้าง...", + "dashboard.desktop_badge": "เดสก์ท็อป", + "dashboard.display_name_label": "ชื่อที่แสดง", + "dashboard.display_name_optional": "(ไม่บังคับ)", + "dashboard.docker_debug_details": "รายละเอียด Docker debug", "dashboard.edit_remote_workspace_confirm": "บันทึกการเชื่อมต่อ", - "dashboard.remote_workspace_title": "พื้นที่ทำงานระยะไกล", - "dashboard.remote_workspace_hint": "ติดตาม OpenWork server และเชื่อมต่อใหม่ได้ทุกเมื่อ", - "dashboard.remote_base_url_label": "URL ของ OpenWork server", - "dashboard.remote_base_url_placeholder": "http://127.0.0.1:", - "dashboard.remote_base_url_required": "เพิ่ม URL ของเซิร์ฟเวอร์เพื่อดำเนินการต่อ", + "dashboard.edit_remote_workspace_subtitle": "อัปเดตรายละเอียด OpenWork server สำหรับพื้นที่ทำงานนี้", + "dashboard.edit_remote_workspace_title": "แก้ไขการเชื่อมต่อระยะไกล", + "dashboard.empty_workspace": "พื้นที่ทำงานว่าง", + "dashboard.empty_workspace_desc": "เริ่มด้วยโฟลเดอร์ว่างและเพิ่มสิ่งที่ต้องการ", + "dashboard.error_choose_org": "เลือกองค์กรก่อนเปิดพื้นที่ทำงาน", + "dashboard.error_connect_worker": "เชื่อมต่อ {name} ไม่สำเร็จ", + "dashboard.error_create_template": "สร้าง {name} ไม่สำเร็จ", + "dashboard.error_load_orgs": "โหลดองค์กรไม่สำเร็จ", + "dashboard.error_load_shared_workspaces": "โหลดพื้นที่ทำงานที่แชร์ไม่สำเร็จ", + "dashboard.error_workspace_not_ready": "พื้นที่ทำงานยังไม่พร้อมเชื่อมต่อ ลองอีกครั้งในอีกสักครู่", + "dashboard.import_config": "นำเข้า config", + "dashboard.importing": "กำลังนำเข้า…", + "dashboard.modal_back": "กลับ", + "dashboard.modal_close": "ปิดหน้าต่างเพิ่มพื้นที่ทำงาน", + "dashboard.nav_ids": "IDs", + "dashboard.no_folder_selected": "ยังไม่ได้เลือกโฟลเดอร์", + "dashboard.open_cloud_dashboard": "เปิดแดชบอร์ด Cloud", + "dashboard.opening": "กำลังเปิด...", + "dashboard.openwork_host_hint": "ใช้ URL ที่แชร์โดย OpenWork server ของคุณ", "dashboard.openwork_host_label": "URL ของ OpenWork server", "dashboard.openwork_host_placeholder": "https://your-server.openwork.app", - "dashboard.openwork_host_hint": "ใช้ URL ที่แชร์โดย OpenWork server ของคุณ", + "dashboard.openwork_host_token_hint": "ไม่บังคับ วางโทเค็นผู้ร่วมงานสำหรับการเข้าถึงปกติ หรือโทเค็นเจ้าของเมื่อ client ต้องตอบคำขออนุญาต", "dashboard.openwork_host_token_label": "โทเค็นผู้ร่วมงานหรือเจ้าของ", "dashboard.openwork_host_token_placeholder": "วางโทเค็นของคุณ", - "dashboard.openwork_host_token_hint": "ไม่บังคับ วางโทเค็นผู้ร่วมงานสำหรับการเข้าถึงปกติ หรือโทเค็นเจ้าของเมื่อ client ต้องตอบคำขออนุญาต", - "dashboard.remote_mode_openwork_alpha": "OpenWork server", - "dashboard.remote_mode_direct": "Direct (legacy)", - "dashboard.remote_connection_openwork": "OpenWork", + "dashboard.recently_updated": "อัปเดตล่าสุด", + "dashboard.remote": "ระยะไกล", + "dashboard.remote_base_url_required": "เพิ่ม URL ของเซิร์ฟเวอร์เพื่อดำเนินการต่อ", "dashboard.remote_connection_direct": "Direct", + "dashboard.remote_connection_openwork": "OpenWork", + "dashboard.remote_directory_hint": "เว้นว่างเพื่อใช้ค่าเริ่มต้นของเซิร์ฟเวอร์", "dashboard.remote_directory_label": "โฟลเดอร์พื้นที่ทำงาน (ไม่บังคับ)", "dashboard.remote_directory_placeholder": "/home/team/project", - "dashboard.remote_directory_hint": "เว้นว่างเพื่อใช้ค่าเริ่มต้นของเซิร์ฟเวอร์", "dashboard.remote_display_name_label": "ชื่อที่แสดง (ไม่บังคับ)", "dashboard.remote_display_name_placeholder": "พื้นที่ทำงานทีมออกแบบ", + "dashboard.remote_server_details_hint": "แนบกับ OpenWork worker ที่โฮสต์เอง", + "dashboard.remote_server_details_title": "รายละเอียดเซิร์ฟเวอร์ระยะไกล", + "dashboard.remote_workspace_hint": "ติดตาม OpenWork server และเชื่อมต่อใหม่ได้ทุกเมื่อ", + "dashboard.remote_workspace_title": "พื้นที่ทำงานระยะไกล", + "dashboard.repair_cache": "ซ่อมแซมแคช", + "dashboard.repairing_cache": "กำลังซ่อมแซมแคช", + "dashboard.sandbox_checking_docker": "กำลังตรวจสอบ Docker...", + "dashboard.sandbox_get_ready_action": "เตรียมระบบให้พร้อม", + "dashboard.sandbox_get_ready_desc": "รันพื้นที่ทำงานนี้ใน Docker container แบบแยกส่วนเพื่อความปลอดภัยและการทำซ้ำที่ดีขึ้น", + "dashboard.sandbox_get_ready_title": "Sandbox ต้องใช้ Docker", + "dashboard.sandbox_hide_logs": "ซ่อน logs", + "dashboard.sandbox_live_logs": "Logs แบบสด", + "dashboard.sandbox_setup": "ตั้งค่า Sandbox", + "dashboard.sandbox_show_logs": "แสดง logs", + "dashboard.search_shared_workspaces": "ค้นหาพื้นที่ทำงานที่แชร์", "dashboard.select_folder": "เลือกโฟลเดอร์", - "dashboard.choose_folder": "เลือกโฟลเดอร์", - "dashboard.choose_folder_next": "แชร์ไฟล์กับพื้นที่ทำงานของคุณ", - "dashboard.change": "เปลี่ยน", - "dashboard.opening": "กำลังเปิด...", - "dashboard.choose_preset": "เลือก Preset", - "dashboard.choose_folder_continue": "เลือกโฟลเดอร์เพื่อดำเนินการต่อ", + "dashboard.settings": "การตั้งค่า", + "dashboard.shared_workspaces_loading": "กำลังโหลดพื้นที่ทำงานที่แชร์…", + "dashboard.shared_workspaces_no_match": "ไม่พบพื้นที่ทำงานที่แชร์ที่ตรงกัน", + "dashboard.shared_workspaces_none": "ยังไม่มีพื้นที่ทำงานที่แชร์", + "dashboard.shared_workspaces_refreshing": "กำลังรีเฟรชพื้นที่ทำงาน…", + "dashboard.skills": "Skills", "dashboard.starter_workspace": "พื้นที่ทำงานเริ่มต้น", "dashboard.starter_workspace_desc": "ตั้งค่าไว้ล่วงหน้าเพื่อแสดงวิธีใช้ plugins, commands และ skills", - "dashboard.empty_workspace": "พื้นที่ทำงานว่าง", - "dashboard.empty_workspace_desc": "เริ่มด้วยโฟลเดอร์ว่างและเพิ่มสิ่งที่ต้องการ", - "dashboard.blueprints_workspace": "Blueprints", - "dashboard.blueprints_workspace_desc": "เริ่มด้วยพื้นที่ทำงานที่พร้อมสำหรับออโตเมชั่น สำหรับ skills, commands และ flows ที่แชร์ได้", - - // ==================== Workspace ==================== - "workspace.rename_title": "แก้ไขชื่อพื้นที่ทำงาน", - "workspace.rename_description": "อัปเดตชื่อที่แสดงในแถบด้านข้าง", - "workspace.rename_label": "ชื่อพื้นที่ทำงาน", - "workspace.rename_placeholder": "พื้นที่ทำงานทีมออกแบบ", - - // ==================== Session ==================== - "session.no_selected": "ยังไม่ได้เลือกเซสชัน", - "session.back_to_dashboard": "กลับไปแดชบอร์ด", - "session.new_task": "งานใหม่", - "session.recents": "ล่าสุด", - "session.recents_notice": "งานเหล่านี้ทำงานภายในเครื่องและไม่ซิงค์ข้ามอุปกรณ์", - "session.ready_to_work_title": "พร้อมทำงาน", - "session.ready_to_work_description": "อธิบายงาน เราจะแสดงความคืบหน้าและขออนุญาตเมื่อจำเป็น", - "session.document_label": "เอกสาร", - "session.standard_label": "มาตรฐาน", - "session.no_artifacts_fallback": "ยังไม่มี Artifact", - "session.active_plugins_label": "Plugins ที่ใช้งาน", - "session.active_plugins_count": "{count}", - "session.no_plugins_loaded": "ไม่ได้โหลด Plugins", - "session.selected_folders_label": "โฟลเดอร์ที่เลือก", - "session.selected_folders_count": "{count}", - "session.working_files_label": "ไฟล์ที่กำลังทำงาน", - "session.none_yet_label": "ยังไม่มี", - "session.permission_required_title": "ต้องการอนุญาต", - "session.permission_required_description": "OpenCode กำลังขออนุญาตเพื่อดำเนินการต่อ", - "session.permission_label_uppercase": "การอนุญาต", - "session.scope_label_uppercase": "ขอบเขต", - "session.details_label": "รายละเอียด", - "session.steps_notice_text": "ขั้นตอนจะแสดงเมื่องานดำเนินไป", - "session.ready_to_work": "พร้อมทำงาน", - "session.ready_description": "อธิบายงาน เราจะแสดงความคืบหน้าและขออนุญาตเมื่อจำเป็น", - "session.hide_steps": "ซ่อนขั้นตอน", - "session.view_steps": "ดูขั้นตอน", - "session.open": "เปิด", - "session.reveal": "เปิดในตัวจัดการไฟล์", - "session.opened_toast": "เปิดในแอปเริ่มต้นแล้ว", - "session.revealed_toast": "เปิดในตัวจัดการไฟล์แล้ว", - "session.artifact_path_missing": "ไม่พบเส้นทาง Artifact", - "session.desktop_only": "การเปิดไฟล์ใช้งานได้เฉพาะในแอปเดสก์ท็อป", - "session.open_failed": "ไม่สามารถเปิด Artifact", - "session.model": "โมเดล", - "session.ready": "พร้อม", - "session.connect_provider": "เชื่อมต่อผู้ให้บริการเพื่อปรับแต่งนี้", - "session.running": "กำลังทำงาน", - "session.progress": "ความคืบหน้า", - "session.steps_notice": "ขั้นตอนจะแสดงเมื่องานดำเนินไป", - "session.artifacts": "Artifacts", - "session.no_artifacts": "ยังไม่มี Artifact", - "session.context": "บริบท", - "session.active_plugins": "Plugins ที่ใช้งาน", - "session.no_plugins": "ไม่ได้โหลด Plugins", - "session.selected_folders": "โฟลเดอร์ที่เลือก", - "session.working_files": "ไฟล์ที่กำลังทำงาน", - "session.none_yet": "ยังไม่มี", - "session.document": "เอกสาร", - "session.standard": "มาตรฐาน", - "session.try_notion_prompt": "ลองตอนนี้: ตั้งค่า CRM ใน Notion ให้ฉัน", - "session.insert_prompt": "แทรก prompt", - "session.placeholder": "ถาม OpenWork...", - "session.run": "รัน", - "session.permission_required": "ต้องการอนุญาต", - "session.permission_description": "OpenCode กำลังขออนุญาตเพื่อดำเนินการต่อ", - "session.permission_label": "การอนุญาต", - "session.scope_label": "ขอบเขต", - "session.details": "รายละเอียด", - "session.deny": "ปฏิเสธ", - "session.once": "ครั้งเดียว", - "session.allow_for_session": "อนุญาตตลอดเซสชัน", - - "session.tasks_local_hint": "งานเหล่านี้ทำงานภายในเครื่องและไม่ซิงค์ข้ามอุปกรณ์", - "session.recents_label": "ล่าสุด", - "session.model_standard": "มาตรฐาน", - "session.run_button_title": "รัน", - "session.rename_title": "เปลี่ยนชื่อเซสชัน", - "session.rename_description": "อัปเดตชื่อสำหรับเซสชันนี้", - "session.rename_label": "ชื่อเซสชัน", - "session.rename_placeholder": "ใส่ชื่อใหม่", - "session.provider_connected": "เชื่อมต่อผู้ให้บริการแล้ว", - "session.oauth_failed": "OAuth ล้มเหลว", - "session.api_key_saved": "บันทึก API key แล้ว", - "session.failed_to_save_api_key": "บันทึก API key ไม่สำเร็จ", - "session.quick_actions_title": "การดำเนินการด่วน (Ctrl/Cmd+K)", - "session.quick_actions_label": "การดำเนินการด่วน", - "session.menu_label": "เมนู", - "session.search_conversation_title": "ค้นหาในบทสนทนา (Ctrl/Cmd+F)", - "session.search_conversation_label": "ค้นหาในบทสนทนา", - "session.undo_title": "เลิกทำข้อความล่าสุด", - "session.revert_label": "ย้อนกลับ", - "session.redo_title": "ทำซ้ำข้อความที่ย้อนกลับ", - "session.redo_aria_label": "ทำซ้ำข้อความที่ย้อนกลับ", - // ==================== Commands ==================== - "commands.new": "ใหม่", - "commands.empty_state": "บันทึก prompt หรือคำสั่งเพื่อรันซ้ำได้ในแตะเดียว", - "commands.workspace": "พื้นที่ทำงานนี้", - "commands.global": "ทุกพื้นที่ทำงาน", - "commands.other": "คำสั่งอื่น", - "commands.run": "รัน", - "commands.modal_title": "บันทึกโฟลว์ที่ใช้ซ้ำได้", - "commands.modal_description": "จัดเก็บ prompt หรือคำสั่งสำหรับใช้ซ้ำอย่างรวดเร็ว", - "commands.name_label": "ชื่อคำสั่ง", - "commands.name_placeholder": "เช่น daily-standup", - "commands.name_hint": "จะกลายเป็น /daily-standup ใน OpenCode", - "commands.description_label": "คำอธิบาย (ไม่บังคับ)", - "commands.description_placeholder": "คำสั่งนี้ทำอะไร?", - "commands.template_label": "คำแนะนำ", - "commands.template_placeholder": "เขียนคำแนะนำที่ต้องการใช้ซ้ำ…", - "commands.template_hint": "ใช้ $ARGUMENTS เพื่อรับรายละเอียด", - "commands.details_required": "รายละเอียด", - "commands.default_description": "รันคำสั่งที่บันทึกไว้", - "commands.command_label": "คำสั่ง", - "commands.details_label": "รายละเอียด", - "commands.details_placeholder": "เพิ่มรายละเอียดเพิ่มเติม", - "commands.details_hint": "รายละเอียดเหล่านี้จะถูกส่งไปยังคำสั่ง", - "commands.run_modal_title": "รันคำสั่ง", - "commands.run_modal_description": "เพิ่มรายละเอียดก่อนรัน", - "commands.run_modal_run": "รันคำสั่ง", - "commands.name_will_be": "จะถูกสร้างเป็น", - "commands.override_title": "แทนที่คำสั่งที่มีอยู่?", - "commands.override_description": "คำสั่งที่มีชื่อนี้มีอยู่แล้ว", - "commands.override_warning": "การดำเนินการนี้จะแทนที่คำสั่ง \"{name}\" ที่มีอยู่ ไม่สามารถเลิกทำได้", - "commands.override_confirm": "แทนที่", - "commands.override_cancel": "เก็บไว้ตามเดิม", - - // ==================== Skills ==================== - "skills.title": "Skills", - "skills.subtitle": "จัดการ Skills สำหรับพื้นที่ทำงานนี้", - "skills.refresh": "รีเฟรช", - "skills.add_title": "เพิ่ม Skills", - "skills.add_description": "ติดตั้งคำสั่งเริ่มต้น นำเข้า skill หรือเปิดโฟลเดอร์", - "skills.install_from_openpackage": "ติดตั้งจาก OpenPackage", - "skills.host_mode_only": "เฉพาะพื้นที่ทำงานภายในเครื่อง", - "skills.install": "ติดตั้ง", - "skills.installed_label": "ติดตั้งแล้ว", - "skills.install_hint": "ติดตั้งแพ็กเกจ OpenPackage ไปยังพื้นที่ทำงานปัจจุบัน Skills จะอยู่ใน `.opencode/skills`", - "skills.import_local": "นำเข้า skill ภายในเครื่อง", - "skills.import_local_hint": "คัดลอกโฟลเดอร์ skill ที่มีอยู่ไปยังพื้นที่ทำงานนี้", - "skills.import": "นำเข้า", - "skills.curated_packages": "แพ็กเกจที่คัดสรร", - "skills.view": "ดู", - "skills.search_placeholder": "ค้นหาแพ็กเกจหรือรายการ (เช่น claude, registry, community)", - "skills.no_matches": "ไม่พบรายการที่คัดสรรที่ตรงกัน ลองค้นหาอื่น", - "skills.install_package": "ติดตั้ง", - "skills.registry_notice": "การเผยแพร่ไปยัง OpenPackage registry ต้องยืนยันตัวตน การค้นหา registry + การซิงค์รายการที่คัดสรรอยู่ในแผน", - "skills.installed": "Skills ที่ติดตั้ง", - "skills.no_skills": "ไม่พบ skills ใน `.opencode/skills`, `.claude/skills` หรือ `~/.agents/skills`", - "skills.desktop_required": "การจัดการ Skills ต้องใช้แอปเดสก์ท็อป", - "skills.host_only_error": "การจัดการ Skills ต้องใช้พื้นที่ทำงานภายในเครื่องหรือ OpenWork server ที่เชื่อมต่อ", - "skills.install_skill_creator": "ติดตั้ง skill creator", - "skills.install_skill_creator_hint": "Skill นี้ช่วยให้คุณสร้าง skills อื่นจากภายในแชท", - "skills.installing_skill_creator": "กำลังติดตั้ง skill creator...", - "skills.skill_creator_installed": "ติดตั้ง skill creator แล้ว", - "skills.skill_creator_already_installed": "ติดตั้ง skill creator แล้ว", - "skills.install_failed": "ติดตั้ง skill ไม่สำเร็จ", - "skills.reveal_folder": "เปิดโฟลเดอร์ skills", - "skills.reveal_folder_hint": "เปิดโฟลเดอร์ skills ในตัวจัดการไฟล์", - "skills.reveal_button": "เปิดในตัวจัดการไฟล์", - "skills.reveal_failed": "เปิดโฟลเดอร์ skills ไม่สำเร็จ", - "skills.uninstall": "ถอนการติดตั้ง", - "skills.uninstall_title": "ถอนการติดตั้ง skill?", - "skills.uninstall_warning": "การดำเนินการนี้จะลบ skill `{name}` ออกจากพื้นที่ทำงานอย่างถาวร", - "skills.uninstall_failed": "ถอนการติดตั้ง skill ไม่สำเร็จ", - "skills.uninstalled": "ลบ skill แล้ว", - "skills.share_title": "แชร์ skill", - "skills.share_chooser_subtitle": "บันทึกไปยังองค์กร OpenWork Cloud หรือเผยแพร่ลิงก์ติดตั้งสาธารณะ", - "skills.share_subtitle_public": "ทุกคนที่มีลิงก์สามารถติดตั้ง skill นี้ได้", - "skills.share_subtitle_team": "จัดเก็บในองค์กรสำหรับเพื่อนร่วมทีม", - "skills.share_option_team_title": "แชร์กับทีม", - "skills.share_option_team_desc": "เพิ่ม skill นี้ไปยังองค์กร OpenWork Cloud ที่ใช้งาน", - "skills.share_option_public_title": "ลิงก์สาธารณะ", - "skills.share_option_public_desc": "สร้างลิงก์ที่ทุกคนสามารถใช้ติดตั้ง skill นี้ได้", - "skills.share_public_intro": "เผยแพร่ลิงก์สาธารณะ ทุกคนที่มี URL สามารถติดตั้ง skill นี้ได้", - "skills.share_publisher_label": "ผู้เผยแพร่", - "skills.share_public_create": "สร้างลิงก์", - "skills.share_public_regenerate": "สร้างลิงก์ใหม่", - "skills.share_public_creating": "กำลังเผยแพร่…", - "skills.share_copy_link": "คัดลอก", - "skills.share_team_intro": "บันทึก skill นี้ไปยังองค์กรที่ใช้งานเพื่อให้เพื่อนร่วมทีมติดตั้งจาก Cloud ได้", - "skills.share_team_org_fallback": "องค์กร Cloud ที่ใช้งาน", - "skills.share_team_hub_label": "เพิ่มไปยัง skill hub (ไม่บังคับ)", - "skills.share_team_hub_none": "เฉพาะองค์กร — ไม่อยู่ใน hub", - "skills.share_team_hubs_loading": "กำลังโหลด hubs…", - "skills.share_team_sign_in": "เข้าสู่ระบบเพื่อแชร์กับทีม", - "skills.share_team_sign_in_hint": "OpenWork Cloud จะเปิดในเบราว์เซอร์ กลับมาที่นี่หลังเข้าสู่ระบบ", - "skills.share_team_save": "บันทึกไปยังทีม", - "skills.share_team_saving": "กำลังบันทึก…", - "skills.share_team_success": "บันทึกไปยัง {org} แล้ว เพื่อนร่วมทีมสามารถติดตั้งจาก skills ขององค์กร", - "skills.share_team_choose_org": "เลือกองค์กรใน Settings → Cloud ก่อนแชร์กับทีม", - "skills.share_back": "กลับ", - "skills.share_close": "ปิด", - "skills.share_done": "เสร็จสิ้น", - "skills.source_placeholder": "github:anthropics/claude-code", - "skills.notion_crm_title": "Notion CRM Enrichment Skills", - "skills.notion_crm_description": "เพิ่ม workflow การเสริมข้อมูลสำหรับผู้ติดต่อ, pipeline และการติดตาม", - "skills.notion_crm_card_description": "เสริมข้อมูล Notion CRM ด้วย skills สำเร็จรูป", - "skills.connect_host_to_load": "เชื่อมต่อ OpenWork server เพื่อโหลด skills", - "skills.pick_workspace_first": "เลือกโฟลเดอร์พื้นที่ทำงานก่อน", - "skills.no_skills_found": "ยังไม่พบ skills", - "skills.installed_description": "Skills ที่ใช้ได้ในพื้นที่ทำงานนี้", - "skills.failed_to_load": "โหลด skills ไม่สำเร็จ", - "skills.plugin_management_host_only": "การจัดการ plugins ต้องใช้แอปเดสก์ท็อป", - "skills.plugins_host_only": "Plugins ใช้งานได้เฉพาะในแอปเดสก์ท็อป", - "skills.pick_project_for_plugins": "เลือกโฟลเดอร์โปรเจกต์เพื่อจัดการ plugins ของโปรเจกต์", - "skills.pick_project_for_active": "เลือกโฟลเดอร์โปรเจกต์เพื่อโหลด plugins ที่ใช้งาน", - "skills.no_opencode_found": "ยังไม่พบ opencode.json เพิ่ม plugin เพื่อสร้าง", - "skills.no_opencode_workspace": "ยังไม่มี opencode.json ในพื้นที่ทำงานนี้", - "skills.failed_parse_opencode": "แปลง opencode.json ไม่สำเร็จ", - "skills.failed_load_opencode": "โหลด opencode.json ไม่สำเร็จ", - "skills.failed_load_active": "โหลด plugins ที่ใช้งานไม่สำเร็จ", - "skills.enter_plugin_name": "ใส่ชื่อแพ็กเกจ plugin", - "skills.plugin_already_listed": "Plugin มีอยู่ใน opencode.json แล้ว", - "skills.failed_update_opencode": "อัปเดต opencode.json ไม่สำเร็จ", - "skills.opackage_install_host_only": "การติดตั้ง OpenPackage ต้องใช้แอปเดสก์ท็อป", - "skills.pick_project_first": "เลือกโฟลเดอร์โปรเจกต์ก่อน", - "skills.enter_opackage_source": "ใส่แหล่ง OpenPackage (เช่น github:anthropics/claude-code)", - "skills.installing_opackage": "กำลังติดตั้ง OpenPackage...", - "skills.install_complete": "ติดตั้งแล้ว", - "skills.curated_list_notice": "นี่คือรายการที่คัดสรร ยังไม่ใช่ OpenPackage คัดลอกลิงก์หรือติดตาม PRD สำหรับแผนการค้นหา registry", - "skills.import_host_only": "การนำเข้า skill ต้องใช้แอปเดสก์ท็อป", - "skills.select_skill_folder": "เลือกโฟลเดอร์ skill", - "skills.import_failed": "นำเข้าไม่สำเร็จ ({status})", - "skills.imported": "นำเข้าแล้ว", - "skills.unknown_error": "ข้อผิดพลาดที่ไม่ทราบสาเหตุ", - "skills.filter_all": "ทั้งหมด", - "skills.filter_installed": "ติดตั้งแล้ว", - "skills.filter_cloud": "ทีม", - "skills.filter_hub": "Hub", - "skills.catalog_search_placeholder": "ค้นหา skills ที่ติดตั้ง, ทีม และ hub", - "skills.cloud_section_title": "จากองค์กรของคุณ", - "skills.cloud_section_subtitle": - "Skills ที่แชร์กับคุณผ่าน OpenWork Cloud — รวมถึง skill hub ของทีมที่คุณเข้าถึงได้", - "skills.cloud_refresh": "รีเฟรช skills ของทีม", - "skills.cloud_org_fallback": "OpenWork Cloud", - "skills.cloud_sign_in_hint": "เข้าสู่ระบบ OpenWork Cloud เพื่อเรียกดู skills ของทีมและองค์กร", - "skills.cloud_sign_in": "เข้าสู่ระบบ Cloud", - "skills.cloud_choose_org_hint": "เลือกองค์กรใน Settings → Cloud เพื่อโหลด skills ของทีม", - "skills.cloud_choose_org_detail": "ใช้แผง Cloud เพื่อเลือกองค์กรที่ใช้งาน แล้วรีเฟรชรายการนี้", - "skills.cloud_org_empty": "ยังไม่มี skills ขององค์กร", - "skills.cloud_org_load_failed": "โหลด skills ขององค์กรไม่สำเร็จ", - "skills.cloud_no_search_matches": "ไม่พบ skills ที่ตรงกับการค้นหา", - "skills.cloud_install_need_server": "เชื่อมต่อ OpenWork server ที่มีสิทธิ์เขียน skills เพื่อติดตั้ง skills ของทีมบน worker นี้", - "skills.cloud_installed": "ติดตั้ง {name} บน worker นี้แล้ว", - "skills.cloud_installing": "กำลังติดตั้ง {title}…", - "skills.cloud_installing_short": "กำลังติดตั้ง", - "skills.cloud_add_skill": "เพิ่ม skill", - "skills.cloud_badge": "Cloud", - "skills.cloud_hub_label": "Hub: {name}", - "skills.cloud_shared_org": "องค์กร", - "skills.cloud_shared_public": "สาธารณะ", - "skills.cloud_footer_label": "ทีม", - - // ==================== Plugins ==================== - "plugins.title": "OpenCode plugins", - "plugins.description": "จัดการ `opencode.json` สำหรับโปรเจกต์หรือ OpenCode plugins ทั่วไป", - "plugins.config_label": "การตั้งค่า", - "plugins.config_not_loaded": "ยังไม่ได้โหลด", - "plugins.suggested_label": "Plugins ที่แนะนำ", - "plugins.no_plugins_yet": "ยังไม่มี plugins ที่ตั้งค่า", - "plugins.enabled_label": "เปิดใช้งาน", - "plugins.open_label": "เปิด", - "plugins.path_label": "เส้นทาง", - "plugins.scope_project": "โปรเจกต์", - "plugins.scope_global": "ทั่วไป", - "plugins.refresh": "รีเฟรช", - "plugins.config": "การตั้งค่า", - "plugins.not_loaded": "ยังไม่ได้โหลด", - "plugins.suggested": "Plugins ที่แนะนำ", - "plugins.hide_setup": "ซ่อนการตั้งค่า", - "plugins.setup": "ตั้งค่า", - "plugins.added": "เพิ่มแล้ว", - "plugins.add": "เพิ่ม", - "plugins.enabled": "เปิดใช้งาน", - "plugins.no_plugins": "ยังไม่มี plugins ที่ตั้งค่า", - "plugins.add_label": "เพิ่ม plugin", - "plugins.placeholder": "opencode-wakatime", - "plugins.add_hint": "เพิ่มชื่อแพ็กเกจ npm เช่น opencode-wakatime", - - // ==================== Apps (MCP) ==================== - "mcp.apps_title": "แอป", - "mcp.apps_subtitle": "เชื่อมต่อเครื่องมือที่คุณชื่นชอบเพื่อให้ OpenWork ใช้งานแทนคุณ", - "mcp.app_connected": "แอปที่เชื่อมต่อ", - "mcp.apps_connected": "แอปที่เชื่อมต่อ", - "mcp.title": "แอป", - "mcp.description": "เชื่อมต่อเครื่องมือของคุณด้วยคลิกเดียว", - "mcp.alpha_banner_title": "แอปอยู่ในช่วง early access ขณะที่เราปรับปรุงประสบการณ์", - "mcp.alpha_banner_help": "หากต้องการช่วย ให้เปิด PR พร้อมวิดีโอสั้นที่แสดงว่าขั้นตอนการเข้าสู่ระบบทำงานได้ตลอด", - "mcp.mcps_title": "แอป", - "mcp.connect_mcp_hint": "เชื่อมต่อแอปเพื่อขยายความสามารถของ OpenWork", - "mcp.finish_setup": "เกือบเสร็จแล้ว", - "mcp.finish_setup_hint": "แตะ เปิดใช้งาน เพื่อเชื่อมต่อแอปให้เสร็จ", - "mcp.activate_button": "เปิดใช้งาน", - "mcp.reload_banner_title": "เกือบเสร็จแล้ว", - "mcp.reload_banner_description": "แตะ เปิดใช้งาน เพื่อเชื่อมต่อแอปให้เสร็จ", - "mcp.reload_banner_description_blocked": "มีงานกำลังทำงานอยู่ หยุดก่อน แล้วเปิดใช้งาน", - "mcp.reload_banner_blocked_hint": "หยุดงานที่กำลังทำงานเพื่อเปิดใช้งาน", - "mcp.available_apps": "แอปที่ใช้ได้", - "mcp.one_click_connect": "เชื่อมต่อด้วยคลิกเดียว", - "mcp.tap_to_connect": "แตะเพื่อเชื่อมต่อ", - "mcp.connected_badge": "เชื่อมต่อแล้ว", - "mcp.your_apps": "แอปของคุณ", - "mcp.last_synced": "ซิงค์แล้ว", - "mcp.no_apps_yet": "ยังไม่มีแอปที่เชื่อมต่อ", - "mcp.no_apps_hint": "เชื่อมต่อแอปด้านบนเพื่อเริ่มต้น", - "mcp.quick_connect_title": "แอปที่ใช้ได้", - "mcp.oauth_only_label": "คลิกเดียว", - "mcp.connected_status": "เชื่อมต่อแล้ว", - "mcp.no_env_vars": "ไม่ต้องตั้งค่าเพิ่มเติม", - "mcp.connected_title": "แอปของคุณ", - "mcp.from_opencode_json": "จากไฟล์ config", - "mcp.no_servers_yet": "ยังไม่มีแอปที่เชื่อมต่อ", - "mcp.edit_config_title": "แก้ไขไฟล์ config", - "mcp.edit_config_description": "แอปถูกเก็บในไฟล์ config ของพื้นที่ทำงาน", - "mcp.docs_link": "เรียนรู้เพิ่มเติม", - "mcp.scope_project": "พื้นที่ทำงานนี้", - "mcp.scope_global": "ทุกพื้นที่ทำงาน", - "mcp.config_label": "การตั้งค่า", - "mcp.config_file": "ไฟล์ config", - "mcp.config_not_loaded": "ยังไม่ได้โหลด", - "mcp.open_file_label": "เปิดไฟล์", - "mcp.reveal_in_finder": "เปิดในตัวจัดการไฟล์", - "mcp.opening_label": "กำลังเปิด...", - "mcp.file_not_found": "ยังไม่ได้สร้างไฟล์ config", - "mcp.config_load_failed": "ไม่สามารถโหลดไฟล์ config", - "mcp.open_file": "เปิดไฟล์", - "mcp.pick_workspace_error": "เลือกโฟลเดอร์พื้นที่ทำงานก่อน", - "mcp.reveal_config_failed": "ไม่สามารถเปิดไฟล์ config", - "mcp.alpha_warning": "แอปอยู่ในช่วง early access ขณะที่เราปรับปรุงประสบการณ์", - "mcp.github_issue": "ดู issue #9510 บน GitHub", - "mcp.contribution_guide": "หากต้องการช่วย ให้เปิด PR พร้อมวิดีโอสั้นที่แสดงว่าขั้นตอนการเข้าสู่ระบบทำงานได้ตลอด", - "mcp.advanced_settings": "การตั้งค่าขั้นสูง", - "mcp.advanced_settings_hint": "แก้ไขไฟล์ config และจัดการการเชื่อมต่อด้วยตนเอง", - "mcp.hide_advanced": "ซ่อนการตั้งค่าขั้นสูง", - "mcp.show_advanced": "แสดงการตั้งค่าขั้นสูง", - "mcp.mcps_label": "แอป", - "mcp.mcps_description": "เชื่อมต่อแอปเพื่อขยายความสามารถของ OpenWork", - "mcp.configured": "ตั้งค่าแล้ว", - "mcp.updated": "ซิงค์แล้ว", - "mcp.reload_required": "ต้องเปิดใช้งาน", - "mcp.reload_description": "เปิดใช้งานเพื่อเริ่มใช้การเชื่อมต่อใหม่", - "mcp.reload_engine": "เปิดใช้งาน", - "mcp.quick_connect": "แอปที่ใช้ได้", - "mcp.oauth_only": "คลิกเดียว", - "mcp.connecting": "กำลังเชื่อมต่อ...", - "mcp.connect": "เชื่อมต่อ", - "mcp.connected": "เชื่อมต่อแล้ว", - "mcp.connected_label": "เชื่อมต่อแล้ว", - "mcp.no_env_required": "ไม่ต้องตั้งค่าเพิ่มเติม", - "mcp.config_source": "จากไฟล์ config", - "mcp.no_servers": "ยังไม่มีแอปที่เชื่อมต่อ", - "mcp.advanced": "ขั้นสูง", - "mcp.advanced_description": "สำหรับการเชื่อมต่อแบบกำหนดเอง", - "mcp.hide": "ซ่อน", - "mcp.show": "แสดง", - "mcp.server_name": "ชื่อแอป", - "mcp.server_name_placeholder": "github-copilot", - "mcp.server_url": "URL ของเซิร์ฟเวอร์", - "mcp.server_url_placeholder": "https://api.githubcopilot.com/mcp/", - "mcp.oauth": "เข้าสู่ระบบ", - "mcp.api_key": "API key", - "mcp.enabled": "เปิดใช้งาน", - "mcp.disabled": "ปิดใช้งาน", - "mcp.add_mcp": "เพิ่มแอป", - "mcp.verify_connection": "ทดสอบการเชื่อมต่อ", - "mcp.cli_guidance": "คำสั่ง Terminal (ขั้นสูง)", - "mcp.config_locations": "Config สามารถอยู่ใน opencode.json, opencode.jsonc หรือ .opencode/opencode.json", - "mcp.app_details": "รายละเอียดแอป", - "mcp.details_title": "รายละเอียดแอป", - "mcp.select_app_hint": "เลือกแอปเพื่อดูรายละเอียด", - "mcp.select_server_hint": "เลือกแอปเพื่อดูรายละเอียด", - "mcp.connection_type": "การเชื่อมต่อ", - "mcp.type_cloud": "Cloud (เข้าสู่ระบบด้วยบัญชีของคุณ)", - "mcp.type_local": "ภายในเครื่อง (ทำงานบนอุปกรณ์นี้)", - "mcp.capabilities_label": "ฟีเจอร์", - "mcp.cap_tools": "เครื่องมือ AI", - "mcp.cap_signin": "เข้าสู่ระบบบัญชี", - "mcp.tools_enabled_label": "เครื่องมือ AI", - "mcp.oauth_ready_label": "เข้าสู่ระบบบัญชี", - "mcp.usage_hint_text": "พูดถึงชื่อแอปใน prompt เพื่อใช้เครื่องมือของแอป", - "mcp.issue_label": "ปัญหา", - "mcp.technical_details": "รายละเอียดทางเทคนิค", - "mcp.next_steps_label": "สิ่งที่ต้องทำ", - "mcp.reload_step": "เปิดใช้งานหลังจากเชื่อมต่อแอปใหม่", - "mcp.auth_step": "เข้าสู่ระบบเมื่อมีการแจ้ง", - "mcp.connection_failed": "มีปัญหาการเชื่อมต่อ — ลองอีกครั้ง", - "mcp.needs_auth": "ต้องเข้าสู่ระบบ", - "mcp.register_client": "ต้องตั้งค่า", - "mcp.status_disabled": "หยุดชั่วคราว", - "mcp.disconnected": "ออฟไลน์", - "mcp.failed": "มีปัญหา", - "mcp.friendly_status_ready": "พร้อม", - "mcp.friendly_status_needs_signin": "ต้องเข้าสู่ระบบ", - "mcp.friendly_status_paused": "หยุดชั่วคราว", - "mcp.friendly_status_offline": "ออฟไลน์", - "mcp.friendly_status_issue": "มีปัญหา", - "mcp.host_mode_only": "แอปต้องใช้แอปเดสก์ท็อป", - "mcp.pick_workspace_first": "เลือกโฟลเดอร์พื้นที่ทำงานก่อน", - "mcp.desktop_required": "แอปต้องใช้แอปเดสก์ท็อป", - "mcp.connect_server_first": "เชื่อมต่อเซิร์ฟเวอร์ก่อน", - "mcp.reload_required_after_add": "เปิดใช้งานเพื่อเริ่มใช้แอปใหม่", - "mcp.connect_failed": "เชื่อมต่อไม่สำเร็จ ลองอีกครั้ง", - "mcp.enter_name_and_url": "ใส่ชื่อแอปและ URL", - "mcp.enter_url_first": "ใส่ URL ก่อน", - "mcp.use_debug_command": "รัน opencode mcp debug เพื่อแก้ปัญหา", - "mcp.add_failed": "เพิ่มแอปไม่สำเร็จ", - "mcp.remove_app": "ลบ", - "mcp.remove_failed": "ลบแอปไม่สำเร็จ", - "mcp.remove_modal_title": "ลบแอป", - "mcp.remove_modal_message": "คุณแน่ใจหรือไม่ว่าต้องการลบ {server}? คุณสามารถเพิ่มกลับได้ในภายหลัง", - - // Add MCP Modal - "mcp.add_modal_title": "เพิ่มแอปกำหนดเอง", - "mcp.add_modal_subtitle": "เชื่อมต่อ MCP server กำหนดเองด้วย URL หรือคำสั่งภายในเครื่อง", - "mcp.custom_app_cta_hint": "เชื่อมต่อ MCP server, เครื่องมือภายใน หรือแอปที่โฮสต์ของคุณเอง", - "mcp.server_type": "ประเภท", - "mcp.type_remote": "ระยะไกล (URL)", - "mcp.type_local_cmd": "ภายในเครื่อง (คำสั่ง)", - "mcp.server_command": "คำสั่ง", - "mcp.server_command_placeholder": "npx -y @modelcontextprotocol/server-sequential-thinking", - "mcp.server_command_hint": "คำสั่ง shell สำหรับเริ่มเซิร์ฟเวอร์", - "mcp.sign_in_section_label": "การเข้าสู่ระบบ", - "mcp.oauth_optional_label": "แอปนี้ต้องเข้าสู่ระบบ", - "mcp.oauth_optional_hint": "ใช้ OAuth ในเบราว์เซอร์เพื่อเชื่อมต่อบัญชีของคุณ", - "mcp.remote_workspace_url_hint": "Remote workers เชื่อมต่อได้เร็วที่สุดกับ MCP server แบบ URL", - "mcp.add_server_button": "เพิ่มแอป", - "mcp.name_required": "ใส่ชื่อเซิร์ฟเวอร์", - "mcp.url_or_command_required": "ใส่ URL สำหรับระยะไกล หรือคำสั่งสำหรับเซิร์ฟเวอร์ภายในเครื่อง", - "mcp.control_chrome_setup_title": "ตั้งค่า Control Chrome", - "mcp.control_chrome_setup_subtitle": "เปิดการเข้าถึง Chrome แล้วเลือกว่า OpenWork ควรใช้โปรไฟล์ใหม่หรือแนบกับ Chrome ที่คุณใช้อยู่", - "mcp.control_chrome_browser_title": "1. เปิดการเข้าถึง Chrome", - "mcp.control_chrome_browser_hint": "ใน Chrome 144 หรือใหม่กว่า ทำสิ่งนี้ก่อน:", - "mcp.control_chrome_browser_step_one": "เปิด chrome://inspect/#remote-debugging", - "mcp.control_chrome_browser_step_two": "เปิดใช้งาน remote debugging", - "mcp.control_chrome_browser_step_three": "อนุญาตการเชื่อมต่อ debugging ขาเข้าเมื่อ Chrome ถาม", - "mcp.control_chrome_docs": "คู่มือ MCP อย่างเป็นทางการ", - "mcp.control_chrome_profile_title": "2. เลือก Chrome ที่จะใช้", - "mcp.control_chrome_profile_hint": "Control Chrome ปกติจะเปิดโปรไฟล์ Chrome แยก เปิดตัวเลือกนี้หากต้องการให้ OpenWork ใช้หน้าต่าง Chrome ที่เปิดอยู่", - "mcp.control_chrome_toggle_label": "ใช้โปรไฟล์ Chrome ที่มีอยู่", - "mcp.control_chrome_toggle_hint": "เมื่อเปิดใช้งาน OpenWork จะเพิ่ม --autoConnect เพื่อให้ MCP แนบกับ Chrome ที่คุณเริ่มไว้แล้ว", - "mcp.control_chrome_toggle_on": "OpenWork จะใช้แท็บ, คุกกี้ และข้อมูลเข้าสู่ระบบปัจจุบันของคุณ", - "mcp.control_chrome_toggle_off": "OpenWork จะเปิดโปรไฟล์ Chrome แยกสำหรับ automation", - "mcp.control_chrome_connect": "เพิ่ม Control Chrome", - "mcp.control_chrome_save": "บันทึกการตั้งค่า", - "mcp.control_chrome_edit": "แก้ไขการตั้งค่า", - - "mcp.logout_label": "OAuth", - "mcp.logout_action": "ออกจากระบบ", - "mcp.logout_working": "กำลังออกจากระบบ...", - "mcp.logout_hint": "ลบข้อมูล OAuth ที่เก็บไว้ คุณจะต้องเข้าสู่ระบบอีกครั้ง", - "mcp.login_action": "เข้าสู่ระบบ", - "mcp.login_hint": "เชื่อมต่อบัญชีของคุณเพื่อตั้งค่าแอปนี้ให้เสร็จ", - "mcp.login_unavailable": "แอปนี้ไม่รองรับการเข้าสู่ระบบจาก OpenWork", - "mcp.logout_modal_title": "ออกจากระบบแอปนี้?", - "mcp.logout_modal_message": "การดำเนินการนี้จะลบข้อมูล OAuth ที่เก็บไว้สำหรับ {server} คุณจะต้องเข้าสู่ระบบอีกครั้งเพื่อใช้แอปนี้", - "mcp.logout_success": "ออกจากระบบ {server} แล้ว", - "mcp.logout_failed": "ออกจากระบบไม่สำเร็จ", - - // MCP Auth Modal - "mcp.auth.open_browser_signin": "เราจะเปิดเบราว์เซอร์เพื่อเข้าสู่ระบบ", - "mcp.auth.connect_server": "เชื่อมต่อ {server}", - "mcp.auth.already_connected": "เชื่อมต่อแล้ว", - "mcp.auth.already_connected_description": "{server} ได้ยืนยันตัวตนแล้วและพร้อมใช้งาน", - "mcp.auth.configured_previously": "MCP อาจถูกตั้งค่าไว้แบบทั่วไปหรือในเซสชันก่อนหน้า คุณสามารถปิดหน้าต่างนี้และเริ่มใช้เครื่องมือ MCP ได้ทันที", - "mcp.auth.reload_engine_retry": "ใช้การเปลี่ยนแปลงและลองอีกครั้ง", - "mcp.auth.retry_now": "ลองอีกครั้งทันที", - "mcp.auth.retry": "ลองอีกครั้ง", - "mcp.auth.reload_failed": "รีโหลด worker ก่อนเข้าสู่ระบบไม่สำเร็จ", - "mcp.auth.applying_changes_title": "กำลังใช้การเปลี่ยนแปลงก่อนเข้าสู่ระบบ", - "mcp.auth.applying_changes_body": "เรากำลังรีสตาร์ท worker เพื่อให้ MCP ใหม่พร้อมยืนยันตัวตน", - "mcp.auth.waiting_for_conversation_title": "กำลังรอให้บทสนทนาเสร็จสิ้น", - "mcp.auth.waiting_for_conversation_body": "เราจะนำคุณไปยืนยันตัวตนโดยเร็วที่สุด", - "mcp.auth.waiting_for_session": "กำลังรอให้ {session} ทำงานเสร็จ", - "mcp.auth.force_stop": "บังคับหยุด", - "mcp.auth.force_stopping": "กำลังหยุด...", - "mcp.auth.reload_before_oauth": "รีโหลด engine เพื่อตั้งค่า MCP ให้เสร็จก่อนเริ่ม OAuth", - "mcp.auth.reload_notice": "เพื่อให้มีผล OpenWork ต้องรีเฟรชบริการ worker ซึ่งอาจหยุดเซสชันที่กำลังทำงาน", - "mcp.auth.reload_blocked": "การรีโหลดหยุดชั่วคราวขณะเซสชันกำลังทำงาน หยุดการทำงานเพื่อตั้งค่าให้เสร็จ", - "mcp.auth.reload_remote_confirm": "เพื่อให้มีผล OpenWork ต้องรีเฟรชบริการ worker ซึ่งอาจหยุดเซสชันที่กำลังทำงาน ดำเนินการต่อ?", - "mcp.auth.reload_needed": "ตั้งค่าให้เสร็จโดยรีโหลด engine แล้วลองเชื่อมต่อใหม่", - "mcp.auth.manual_finish_title": "เซิร์ฟเวอร์ระยะไกล?", - "mcp.auth.manual_finish_hint": "วาง callback URL (localhost:19876) หรือรหัสเพื่อเชื่อมต่อให้เสร็จ", - "mcp.auth.callback_label": "Callback URL หรือรหัส", - "mcp.auth.callback_placeholder": "http://127.0.0.1:19876/mcp/oauth/callback?code=...", - "mcp.auth.complete_connection": "เชื่อมต่อให้เสร็จ", - "mcp.auth.callback_invalid": "วาง callback URL หรือพารามิเตอร์ code เพื่อเสร็จสิ้น OAuth", - "mcp.auth.port_forward_hint": "เคล็ดลับ: forward callback port ถ้าจำเป็น: ssh -L 19876:127.0.0.1:19876 user@host", - "mcp.auth.step1_title": "กำลังเปิดเบราว์เซอร์", - "mcp.auth.step1_description": "เราจะเปิดขั้นตอนเข้าสู่ระบบของ {server} โดยอัตโนมัติ", - "mcp.auth.step2_title": "อนุมัติ OpenWork", - "mcp.auth.step2_description": "เข้าสู่ระบบและอนุมัติการเข้าถึงเมื่อมีการแจ้ง", - "mcp.auth.step3_title": "กลับมาที่นี่เมื่อเสร็จแล้ว", - "mcp.auth.step3_description": "เราจะเชื่อมต่อให้เสร็จทันทีที่การอนุมัติเสร็จสิ้น", - "mcp.auth.waiting_authorization": "กำลังรอการอนุมัติในเบราว์เซอร์ของคุณ...", - "mcp.auth.follow_browser_steps": "ทำตามขั้นตอนการอนุมัติในเบราว์เซอร์", - "mcp.auth.reopen_browser_link": "คลิกที่นี่เพื่อเปิดเบราว์เซอร์อีกครั้ง", - "mcp.auth.done": "เสร็จสิ้น", - "mcp.auth.cancel": "ยกเลิก", - "mcp.auth.im_done": "ดำเนินการเสร็จแล้ว", - "mcp.auth.client_registration_required": "ต้องลงทะเบียน client ก่อนดำเนินการ OAuth", - "mcp.auth.server_disabled": "MCP server นี้ถูกปิดใช้งาน เปิดใช้งานแล้วลองอีกครั้ง", - "mcp.auth.oauth_failed": "การยืนยันตัวตน OAuth ล้มเหลว", - "mcp.auth.invalid_refresh_token": "Refresh token ของ OAuth ไม่ถูกต้องหรือหมดอายุ ยืนยันตัวตนอีกครั้งเพื่อดำเนินการต่อ", - "mcp.auth.reauth_action": "ยืนยันตัวตน OAuth อีกครั้ง", - "mcp.auth.reauth_running": "กำลังยืนยันตัวตนอีกครั้ง...", - "mcp.auth.reauth_failed": "ยืนยันตัวตนอีกครั้งไม่สำเร็จ", - "mcp.auth.reauth_cli_hint": "รัน: opencode mcp auth {server}", - "mcp.auth.reauth_remote_hint": "ยืนยันตัวตนอีกครั้งจากเครื่องที่รัน worker นี้", - "mcp.auth.authorization_still_required": "ยังต้องการอนุมัติ ลองอีกครั้งเพื่อเริ่มขั้นตอนใหม่", - "mcp.auth.oauth_not_supported_hint": "อาจหมายความว่า:\n• MCP server ไม่ได้ประกาศความสามารถ OAuth\n• Engine ต้องรีโหลดเพื่อตรวจสอบความสามารถของเซิร์ฟเวอร์\n• ลอง: opencode mcp auth {server} จาก CLI", - "mcp.auth.try_reload_engine": "{message} ลองรีโหลด engine ก่อน", - "mcp.auth.failed_to_start_oauth": "เริ่มขั้นตอน OAuth ไม่สำเร็จ", - "mcp.auth.oauth_completed_reload": "OAuth เสร็จสิ้น รีโหลด engine เพื่อเปิดใช้งาน MCP", - - // ==================== Settings ==================== - "settings.title": "การตั้งค่า", - "settings.connection": "การเชื่อมต่อ", - "settings.engine_source": "แหล่งที่มาของ engine", - "settings.from_path": "จาก PATH", - "settings.from_sidecar": "Sidecar แบบรวม", - "settings.engine_source_description": "PATH ใช้ OpenCode ที่ติดตั้งของคุณ (ค่าเริ่มต้น) Sidecar จะใช้ binary ที่รวมมาเมื่อมี", - "settings.sidecar_unsupported": "Sidecar ใช้งานได้บน Windows", - "settings.sidecar_unavailable_detail": "Sidecar จะรวมมาเมื่อมี", - "settings.model": "โมเดล", - "settings.model_description": "ค่าเริ่มต้น + การควบคุม thinking สำหรับการทำงาน", - "settings.change": "เปลี่ยน", - "settings.engine_path": "PATH", - "settings.engine_sidecar": "Sidecar", - "settings.thinking": "Thinking", - "settings.thinking_description": "แสดงส่วน thinking (โหมดนักพัฒนาเท่านั้น)", - "settings.on": "เปิด", - "settings.off": "ปิด", - "settings.model_variant": "รูปแบบโมเดล", - "settings.edit": "แก้ไข", - "settings.default_model": "โมเดลเริ่มต้น", - "settings.session_model": "โมเดล", - "settings.model_description_default": "เลือกจากผู้ให้บริการที่ตั้งค่าไว้ การเลือกนี้จะถูกใช้สำหรับเซสชันใหม่", - "settings.model_description_session": "เลือกจากผู้ให้บริการที่ตั้งค่าไว้ การเลือกนี้ใช้สำหรับข้อความถัดไปของคุณ", - "settings.search_models": "ค้นหาโมเดล…", - "settings.showing_models": "แสดง {count} จาก {total}", - "settings.model_variant_prompt": "รูปแบบโมเดล (เฉพาะผู้ให้บริการ เช่น high/max/minimal) เว้นว่างเพื่อล้าง", - "settings.model_fallback": "สำรอง", - "settings.model_default": "ค่าเริ่มต้น", - "settings.model_free": "ฟรี", - "settings.model_reasoning": "การใช้เหตุผล", - "settings.done": "เสร็จสิ้น", - "settings.updates": "การอัปเดต", - "settings.updates_description": "อัปเดต OpenWork ให้เป็นเวอร์ชันล่าสุด", - "settings.automatic_checks": "ตรวจสอบอัตโนมัติ", - "settings.automatic_checks_description": "วันละครั้ง (เงียบ)", - "settings.update_checking": "กำลังตรวจสอบ...", - "settings.update_available": "มีอัปเดต: v", - "settings.update_downloading": "กำลังดาวน์โหลด...", - "settings.update_ready": "พร้อมติดตั้ง: v", - "settings.update_error": "ตรวจสอบอัปเดตไม่สำเร็จ", - "settings.update_uptodate": "เป็นเวอร์ชันล่าสุดแล้ว", - "settings.last_checked": "ตรวจสอบล่าสุด", - "settings.published": "เผยแพร่", - "settings.check_update": "ตรวจสอบ", - "settings.install_restart": "ติดตั้งและรีสตาร์ท", - "settings.update_not_supported": "ไม่รองรับการอัปเดตในสภาพแวดล้อมนี้", - "settings.update_desktop_only": "การอัปเดตใช้งานได้เฉพาะในแอปเดสก์ท็อป", - "settings.startup": "การเริ่มต้น", - "settings.mode_label": "โหมด", - "settings.switch_mode": "สลับ", - "settings.reset_startup": "รีเซ็ตโหมดเริ่มต้น", - "settings.reset_startup_description": "ล้างค่าที่บันทึกไว้และแสดงการเลือกโหมดในการเปิดครั้งถัดไป", - "settings.advanced": "ขั้นสูง", - "settings.advanced_description": "รีเซ็ตสถานะ OpenWork เพื่อทดสอบ onboarding ใหม่", - "settings.reset_onboarding": "รีเซ็ต onboarding", - "settings.reset_onboarding_description": "ล้างค่าตั้งค่า OpenWork และรีสตาร์ทแอป", - "settings.reset_app_data": "รีเซ็ตข้อมูลแอป", - "settings.reset_app_data_description": "เข้มข้นกว่า ล้างแคชและข้อมูลแอปของ OpenWork", - "settings.reset": "รีเซ็ต", - "settings.requires_typing": "ต้องพิมพ์", - "settings.will_restart": "และจะรีสตาร์ทแอป", - "settings.reset_onboarding_title": "รีเซ็ต onboarding", - "settings.reset_app_data_title": "รีเซ็ตข้อมูลแอป", - "settings.reset_confirmation_hint": "พิมพ์ RESET เพื่อยืนยัน OpenWork จะรีสตาร์ท", - "settings.reset_onboarding_warning": "ล้างค่าตั้งค่า OpenWork และตัวบ่งชี้ onboarding ของพื้นที่ทำงาน", - "settings.reset_app_data_warning": "ล้างแคชและข้อมูลแอป OpenWork บนอุปกรณ์นี้", - "settings.reset_stop_active_runs": "หยุดงานที่กำลังทำงานก่อนรีเซ็ต", - "settings.reset_confirmation_label": "การยืนยัน", - "settings.reset_confirmation_placeholder": "พิมพ์ RESET", - "settings.reset_cancel": "ยกเลิก", - "settings.reset_confirm_button": "รีเซ็ตและรีสตาร์ท", - "settings.developer": "นักพัฒนา", - "settings.opencode_cache": "แคช OpenCode", - "settings.opencode_cache_description": "ซ่อมแซมข้อมูลแคชที่ใช้เริ่ม engine ทำได้อย่างปลอดภัย", - "settings.repair_cache": "ซ่อมแซมแคช", - "settings.repairing_cache": "กำลังซ่อมแซมแคช", - "settings.cache_repair_requires_desktop": "การซ่อมแซมแคชต้องใช้แอปเดสก์ท็อป", - "settings.pending_permissions": "สิทธิ์ที่รอดำเนินการ", - "settings.recent_events": "เหตุการณ์ล่าสุด", - "settings.notion_connected": "เชื่อมต่อแล้ว", - "settings.reload_required": "ต้องรีโหลด", - "settings.connection_failed": "เชื่อมต่อล้มเหลว", - "settings.notion_not_connected": "ยังไม่ได้เชื่อมต่อ", - "settings.show_thinking": "แสดง thinking", - "settings.update": "อัปเดต", - "settings.about": "เกี่ยวกับ", - "settings.version": "เวอร์ชัน", - "settings.check_for_updates": "ตรวจสอบอัปเดต", - "settings.download_update": "ดาวน์โหลดอัปเดต", - "settings.install_update": "ติดตั้งอัปเดตและรีสตาร์ท", - "settings.enable_developer_mode": "เปิดโหมดนักพัฒนา", - "settings.disable_developer_mode": "ปิดโหมดนักพัฒนา", - "settings.stop_engine": "หยุด engine", - "settings.disconnect": "ตัดการเชื่อมต่อ", - "settings.language": "ภาษา", - "settings.language.description": "เลือกภาษาที่คุณต้องการ", - "settings.connection_title": "การเชื่อมต่อ", - "settings.engine_source_label": "แหล่งที่มาของ engine", - "settings.engine_source_hint": "PATH ใช้ OpenCode ที่ติดตั้งของคุณ (ค่าเริ่มต้น) Sidecar จะใช้ binary ที่รวมมาเมื่อมี", - "settings.sidecar_unavailable": "Sidecar จะรวมมาเมื่อมี", - "settings.model_title": "โมเดล", - "settings.model_hint": "ค่าเริ่มต้น + การควบคุม thinking สำหรับการทำงาน", - "settings.thinking_label": "Thinking", - "settings.thinking_hint": "แสดงส่วน thinking (โหมดนักพัฒนาเท่านั้น)", - "settings.model_variant_label": "รูปแบบโมเดล", - "settings.appearance_title": "ธีม", - "settings.appearance_hint": "ตามระบบหรือบังคับโหมดสว่าง/มืด", - "settings.theme_system": "ตามระบบ", - "settings.theme_light": "สว่าง", - "settings.theme_dark": "มืด", - "settings.theme_system_hint": "โหมดตามระบบจะตามค่าตั้งค่า OS ของคุณโดยอัตโนมัติ", - "settings.updates_title": "การอัปเดต", - "settings.updates_hint": "อัปเดต OpenWork ให้เป็นเวอร์ชันล่าสุด", - "settings.automatic_checks_label": "ตรวจสอบอัตโนมัติ", - "settings.automatic_checks_hint": "วันละครั้ง (เงียบ)", - "settings.last_checked_time": "ตรวจสอบล่าสุด {time}", - "settings.published_date": "เผยแพร่ {date}", - "settings.update_not_supported_hint": "ไม่รองรับการอัปเดตในสภาพแวดล้อมนี้", - "settings.update_desktop_only_hint": "การอัปเดตใช้งานได้เฉพาะในแอปเดสก์ท็อป", - "settings.startup_title": "การเริ่มต้น", - "settings.mode_suffix": "โหมด", - "settings.reset_startup_label": "รีเซ็ตโหมดเริ่มต้น", - "settings.reset_startup_hint": "ล้างค่าที่บันทึกไว้และแสดงการเลือกโหมดในการเปิดครั้งถัดไป", - "settings.advanced_title": "ขั้นสูง", - "settings.advanced_hint": "รีเซ็ตสถานะ OpenWork เพื่อทดสอบ onboarding ใหม่", - "settings.reset_onboarding_label": "รีเซ็ต onboarding", - "settings.reset_onboarding_hint": "ล้างค่าตั้งค่า OpenWork และรีสตาร์ทแอป", - "settings.reset_app_data_label": "รีเซ็ตข้อมูลแอป", - "settings.reset_app_data_hint": "เข้มข้นกว่า ล้างแคชและข้อมูลแอปของ OpenWork", - "settings.reset_requires_hint": "ต้องพิมพ์ RESET และจะรีสตาร์ทแอป", - "settings.developer_title": "นักพัฒนา", - "settings.opencode_cache_label": "แคช OpenCode", - "settings.opencode_cache_hint": "ซ่อมแซมข้อมูลแคชที่ใช้เริ่ม engine ทำได้อย่างปลอดภัย", - "settings.pending_permissions_label": "สิทธิ์ที่รอดำเนินการ", - "settings.recent_events_label": "เหตุการณ์ล่าสุด", - "settings.stop_active_runs_hint": "หยุดงานที่กำลังทำงานเพื่ออัปเดต", - "settings.stop_active_runs_reset_hint": "หยุดงานที่กำลังทำงานเพื่อรีเซ็ต", - "settings.stop_runs_to_update": "หยุดงานที่กำลังทำงานเพื่ออัปเดต", - "settings.stop_runs_to_reset": "หยุดงานที่กำลังทำงานเพื่อรีเซ็ต", - "settings.updates_not_supported": "ไม่รองรับการอัปเดตในสภาพแวดล้อมนี้", - "settings.updates_desktop_only": "การอัปเดตใช้งานได้เฉพาะในแอปเดสก์ท็อป", - - // ==================== Reload ==================== - "reload.toast_title": "มีการอัปเดต", - "reload.toast_description": "รีโหลดพื้นที่ทำงานเพื่อใช้การเปลี่ยนแปลง config", - "reload.toast_warning": "หยุดงานที่กำลังทำงานทั้งหมด", - "reload.toast_warning_active": "การรีโหลดจะหยุด {count} งานที่กำลังทำงาน", - "reload.toast_reload": "รีโหลด", - "reload.toast_reload_stopped": "รีโหลดและหยุดงาน", - "reload.toast_reloading": "กำลังรีโหลด...", - "reload.toast_dismiss": "ภายหลัง", - "reload.toast_blocked_host": "การรีโหลดใช้ได้เฉพาะ local workers", - "reload.toast_blocked_connect": "เชื่อมต่อพื้นที่ทำงานนี้เพื่อรีโหลด", - "reload.toast_blocked_runs": "รอให้งานที่กำลังทำงานเสร็จสิ้นก่อนรีโหลด", - - // ==================== Onboarding ==================== - "onboarding.starting_host": "กำลังเริ่ม OpenWork server...", - "onboarding.searching_host": "กำลังเชื่อมต่อ OpenWork server...", - "onboarding.getting_ready": "กำลังเตรียมทุกอย่าง", - "onboarding.verifying": "กำลังตรวจสอบ secure handshake", - "onboarding.create_first_workspace": "สร้างพื้นที่ทำงานแรกของคุณ", - "onboarding.create_workspace": "สร้างพื้นที่ทำงาน", - "onboarding.workspace_description": "เลือกโฟลเดอร์และ preset เพื่อตั้งค่าพื้นที่ทำงาน", - "onboarding.start": "เริ่ม OpenWork", - "onboarding.back": "กลับ", - "onboarding.advanced_settings": "การตั้งค่าขั้นสูง", - "onboarding.opencode_engine": "OpenCode engine", - "onboarding.refresh": "รีเฟรช", - "onboarding.checking_cli": "กำลังตรวจสอบ OpenCode CLI...", - "onboarding.cli_not_found": "ไม่พบ OpenCode CLI", - "onboarding.cli_needs_update": "OpenCode CLI ต้องอัปเดตสำหรับ serve", - "onboarding.opencode": "OpenCode", - "onboarding.cli_ready": "OpenCode CLI พร้อมใช้งาน", - "onboarding.cli_version": "OpenCode {version}", - "onboarding.windows_install_instruction": "ติดตั้ง OpenCode สำหรับ Windows แล้วรีสตาร์ท OpenWork ตรวจสอบว่า opencode.exe อยู่ใน PATH", - "onboarding.install_instruction": "ติดตั้ง OpenCode เพื่อเปิดใช้งาน local server (ไม่ต้องใช้ terminal)", - "onboarding.install": "ติดตั้ง OpenCode", - "onboarding.recheck": "ตรวจสอบใหม่", - "onboarding.ready_message": "OpenCode พร้อมเริ่ม local server", - "onboarding.resolved_path": "เส้นทางที่ resolve", - "onboarding.version": "เวอร์ชัน", - "onboarding.search_notes": "บันทึกการค้นหา", - "onboarding.serve_help": "ผลลัพธ์ serve --help", - "onboarding.workspace_folder_label": "พื้นที่ทำงานคือโฟลเดอร์ที่มี skills, plugins และ commands เป็นของตนเอง", - "onboarding.theme_label": "ธีม", - "onboarding.theme_current": "ปัจจุบัน: {mode}", - "onboarding.theme_system": "ตามระบบ", - "onboarding.theme_light": "สว่าง", - "onboarding.theme_dark": "มืด", - "onboarding.access_label": "การเข้าถึง", - "onboarding.folders_allowed": "อนุญาต {count} โฟลเดอร์", - "onboarding.manage_access_hint": "คุณสามารถจัดการการเข้าถึงในการตั้งค่าขั้นสูง", - "onboarding.open_settings_hint": "ต้องการตัวเลือก engine หรือการเข้าถึง? เปิดการตั้งค่า", - "onboarding.open_settings": "เปิดการตั้งค่า", - "onboarding.add_folder_path": "เพิ่มเส้นทางโฟลเดอร์", - "onboarding.pick": "เลือก", - "onboarding.add": "เพิ่ม", - "onboarding.remove": "ลบ", - "onboarding.cli_label": "OpenCode CLI", - "onboarding.cli_checking": "กำลังตรวจสอบการติดตั้ง...", - "onboarding.cli_not_found_hint": "ไม่พบ ติดตั้งเพื่อรัน local server", - "onboarding.cli_version_installed": "ติดตั้งแล้ว", - "onboarding.cli_recheck": "ตรวจสอบใหม่", - "onboarding.cli_install_commands": "ติดตั้ง OpenCode ด้วยคำสั่งด้านล่าง แล้วรีสตาร์ท OpenWork", - "onboarding.show_search_notes": "แสดงบันทึกการค้นหา", - "onboarding.last_checked": "ตรวจสอบล่าสุด {time}", - "onboarding.server_url_placeholder": "http://localhost:8088", - "onboarding.directory_placeholder": "my-project", - "onboarding.connect_host": "เชื่อมต่อเซิร์ฟเวอร์", - "onboarding.connect_description": "จับคู่กับ OpenCode server ที่มีอยู่ (LAN หรือ tunnel)", - "onboarding.server_url": "URL ของเซิร์ฟเวอร์", - "onboarding.directory": "โฟลเดอร์ (ไม่บังคับ)", - "onboarding.directory_hint": "ใช้ถ้าเซิร์ฟเวอร์รันหลาย workers", - "onboarding.connect": "เชื่อมต่อ", - "onboarding.remote_workspace_title": "เชื่อมต่อ OpenWork server", - "onboarding.remote_workspace_description": "เชื่อมต่อ OpenWork server เพื่อเข้าถึงพื้นที่ทำงานจากที่ใดก็ได้", - "onboarding.remote_workspace_action": "เชื่อมต่อ", - "onboarding.remote_workspace_card_title": "เชื่อมต่อพื้นที่ทำงานระยะไกล", - "onboarding.remote_workspace_card_description": "เชื่อมต่อ OpenWork server เพื่อเข้าถึงพื้นที่ทำงานที่แชร์", - "onboarding.advanced_openwork_host": "OpenWork server", - "onboarding.advanced_openwork_hint": "ใช้ server URL และ access token สำหรับการเข้าถึงที่แชร์", - "onboarding.advanced_opencode_direct": "ขั้นสูง: OpenCode direct", - "onboarding.advanced_opencode_hint": "เชื่อมต่อตรงกับ OpenCode engine เมื่อไม่มีเซิร์ฟเวอร์", - "onboarding.welcome_title": "วันนี้คุณต้องการรัน OpenWork อย่างไร?", - "onboarding.run_local": "รันภายในเครื่อง", - "onboarding.run_local_description": "OpenWork รัน OpenCode ภายในเครื่องและเก็บงานของคุณเป็นส่วนตัว", - "onboarding.engine_running": "Engine กำลังทำงานอยู่แล้ว", - "onboarding.attach_description": "เชื่อมต่อกับเซสชันที่มีอยู่บนอุปกรณ์นี้", - "onboarding.attach": "เชื่อมต่อ", - "onboarding.remember_choice": "จดจำตัวเลือกสำหรับครั้งถัดไป", - "onboarding.client_mode": "เชื่อมต่อเป็น Client (Remote Pairing)", - "onboarding.default_workspace_path": "~/OpenWork/Worker", - "onboarding.authorize_folder": "อนุญาตโฟลเดอร์", - "onboarding.choose_workspace_folder": "เลือกโฟลเดอร์พื้นที่ทำงาน", - - // ==================== Common ==================== - "common.alpha": "Alpha", - "common.change": "เปลี่ยน", - "common.refresh": "รีเฟรช", - "common.new": "ใหม่", - "common.install": "ติดตั้ง", - "common.delete": "ลบ", - "common.edit": "แก้ไข", - "common.save": "บันทึก", - "common.cancel": "ยกเลิก", - "common.close": "ปิด", - "common.open": "เปิด", - "common.show": "แสดง", - "common.hide": "ซ่อน", - "common.path": "เส้นทาง", - "common.choose": "เลือก", - "common.retry": "ลองใหม่", - "common.untitled": "ไม่มีชื่อ", - "common.default_parens": "(ค่าเริ่มต้น)", - "common.on": "เปิด", - "common.off": "ปิด", - - // ==================== Status ==================== - "status.connected": "เชื่อมต่อแล้ว", - "status.disconnected": "ตัดการเชื่อมต่อ", - "status.idle": "ว่าง", - "status.busy": "กำลังทำงาน", - "status.running": "กำลังทำงาน", - "status.live": "ขณะนี้", - "status.connecting": "กำลังเชื่อมต่อ", - "status.creating_workspace": "กำลังสร้างพื้นที่ทำงาน", - "status.deleting_command": "กำลังลบคำสั่ง", - "status.saving_workspace_command": "กำลังบันทึกคำสั่งพื้นที่ทำงาน", - "status.saving_command": "กำลังบันทึกคำสั่ง", - "status.loading_session": "กำลังโหลดเซสชัน", - "status.creating_task": "กำลังสร้างงานใหม่", - "status.starting_engine": "กำลังเริ่ม engine", - "status.reloading_engine": "กำลังรีโหลด engine", - "status.restarting_engine": "กำลังรีสตาร์ท engine", - "status.installing_opencode": "กำลังติดตั้ง OpenCode", - "status.disconnecting": "กำลังตัดการเชื่อมต่อ", - - // ==================== Workspace Switching ==================== - "workspace.switching_title": "กำลังเปิด {name}", - "workspace.switching_title_unknown": "กำลังเปิดพื้นที่ทำงาน", - "workspace.switching_subtitle": "เรากำลังโหลดงานล่าสุดของคุณกลับมา", - "workspace.switching_status_preparing": "กำลังเตรียมข้อมูล", - "workspace.switching_status_connecting": "กำลังตรวจสอบการเชื่อมต่อ", - "workspace.switching_status_loading": "กำลังโหลดงานล่าสุด", - "workspace.switching_status_almost": "ใกล้เสร็จแล้ว", - - "app.connection_lost": "การเชื่อมต่อเซิร์ฟเวอร์ขาดหาย กรุณารีโหลด", - "app.unknown_error": "ข้อผิดพลาดที่ไม่ทราบสาเหตุ", - "app.error.tauri_required": "การดำเนินการนี้ต้องใช้ Tauri app runtime", - "app.error.choose_folder": "เลือกโฟลเดอร์เพื่อดำเนินการต่อ", - "app.error.pick_workspace_folder": "เลือกโฟลเดอร์พื้นที่ทำงานก่อน", - "app.error.remote_base_url_required": "เพิ่ม URL ของเซิร์ฟเวอร์เพื่อดำเนินการต่อ", - "app.error.host_requires_local": "เลือกพื้นที่ทำงานภายในเครื่องเพื่อเริ่ม engine", - "app.error.sidecar_unsupported_windows": "Sidecar OpenCode ถูกรวมบน Windows เมื่อมี กลับไปใช้ PATH", - "app.error.install_failed": "ติดตั้ง OpenCode ไม่สำเร็จ ดู logs ด้านบน", - "app.error.command_name_template_required": "ต้องใส่ชื่อคำสั่งและคำแนะนำ", - "app.error.workspace_commands_desktop": "คำสั่งต้องใช้แอปเดสก์ท็อป", - "app.error.command_scope_unknown": "ไม่สามารถจัดการคำสั่งนี้ในโหมดนี้", - - // ==================== App top-level ==================== - "app.shared_setup": "ตั้งค่าที่แชร์", - "app.skill_added": "เพิ่ม skill แล้ว", - "app.worker_fallback": "Worker", - "app.local_worker_detail": "Worker ภายในเครื่อง", - "app.remote_worker_detail": "Worker ระยะไกล", - "app.import_shared_bundle": "นำเข้า bundle ที่แชร์", - "app.import_bundle_desc": "เลือกวิธีนำเข้า bundle นี้", - "app.local_disabled_reason": "สร้างพื้นที่ทำงานภายในเครื่องในแอปเดสก์ท็อป พื้นที่ทำงานระยะไกลและที่แชร์ยังใช้งานได้ที่นี่", - "app.reload_stop_tasks": "รีโหลดและหยุดงาน", - "app.reload_now": "รีโหลดตอนนี้", - "app.reload_later": "ภายหลัง", - "app.error_request_failed": "คำขอล้มเหลว", - "app.error_command_not_resolved": "ไม่สามารถ resolve คำสั่ง", - "app.error_auth_failed": "การยืนยันตัวตนล้มเหลว", - "app.error_rate_limit": "เกินขีดจำกัดอัตราการใช้งาน", - "app.error_compact_no_session": "เลือกเซสชันที่มีข้อความก่อนรัน /compact", - "app.error_not_connected": "ไม่ได้เชื่อมต่อกับเซิร์ฟเวอร์", - "app.error_compact_no_session_id": "เลือกเซสชันก่อนบีบอัด", - "app.error_compact_empty": "ยังไม่มีสิ่งที่จะบีบอัด", - "app.error_session_name_required": "ต้องใส่ชื่อเซสชัน", - "app.error_audit_load": "โหลดบันทึกการตรวจสอบไม่สำเร็จ", - "app.error_restart_local_worker": "รีสตาร์ท local worker ด้วยการตั้งค่าการแชร์ที่อัปเดตไม่สำเร็จ", - "app.error_remote_access": "อัปเดตการเข้าถึงระยะไกลไม่สำเร็จ", - "app.error_deep_link_unrecognized": "ลิงก์นั้นไม่ใช่ deep link หรือ share URL ที่ OpenWork รู้จัก", - "app.deep_link_auth_queued": "จัดคิว deep link สำหรับ Cloud auth ใน OpenWork แล้ว", - "app.deep_link_remote_queued": "จัดคิวลิงก์ remote worker แล้ว OpenWork จะเข้าสู่ขั้นตอนเชื่อมต่อ", - "app.error_desktop_signin": "การเข้าสู่ระบบเดสก์ท็อปเสร็จสิ้น แต่ OpenWork Cloud ไม่ส่งคืนโทเค็นเซสชัน", - "app.error_cloud_signin": "เข้าสู่ระบบ OpenWork Cloud ไม่สำเร็จ", - "app.error_pick_local_folder": "เลือกโฟลเดอร์ local worker ก่อนรีสตาร์ท local server", - "app.error_connect_first": "เชื่อมต่อ worker นี้ก่อนใช้การเปลี่ยนแปลง runtime", - "app.error_runtime_changes": "ใช้การเปลี่ยนแปลง runtime ไม่สำเร็จ", - "app.reset_config_ok": "รีเซ็ตค่าเริ่มต้น app config แล้ว รีสตาร์ท OpenWork หากมีการตั้งค่าเก่าเหลืออยู่", - "app.error_reset_config": "รีเซ็ตค่าเริ่มต้น app config ไม่สำเร็จ", - "app.model_behavior_title": "พฤติกรรมโมเดล", - "app.model_behavior_desc": "เลือกโมเดลก่อนเพื่อดูการควบคุมพฤติกรรมเฉพาะผู้ให้บริการ", - "app.error_update_opencode_json": "อัปเดต opencode.json ไม่สำเร็จ", - "app.error_auto_compact_scope": "การบีบอัดบริบทอัตโนมัติสามารถเปลี่ยนได้เฉพาะสำหรับพื้นที่ทำงานภายในเครื่องหรือ OpenWork server ที่เขียนได้", - "app.skills_hint_disconnected": "OpenWork server ไม่พร้อมใช้งาน เพิ่ม URL/token ของเซิร์ฟเวอร์ใน Advanced เพื่อจัดการ skills", - "app.skills_hint_limited": "OpenWork server ต้องใช้ host token เพื่อติดตั้ง/อัปเดต skills เพิ่มใน Advanced แล้วเชื่อมต่อใหม่", - "app.skills_hint_readonly": "OpenWork server เป็นแบบอ่านอย่างเดียวสำหรับ skills เพิ่ม host token ใน Advanced เพื่อเปิดการติดตั้ง", - "app.plugins_hint_disconnected": "OpenWork server ไม่พร้อมใช้งาน Plugins เป็นแบบอ่านอย่างเดียว", - "app.plugins_hint_limited": "OpenWork server ต้องใช้ token เพื่อแก้ไข plugins", - "app.plugins_hint_readonly": "OpenWork server เป็นแบบอ่านอย่างเดียวสำหรับ plugins", - "app.compact_command_desc": "สรุปเซสชันนี้เพื่อลดขนาดบริบท", - "app.error_connection_failed_url": "เชื่อมต่อไม่สำเร็จ ตรวจสอบ URL และ token", - "app.error_connection_failed": "เชื่อมต่อไม่สำเร็จ", - - // ==================== Status bar labels ==================== - "status.openwork_ready": "OpenWork พร้อม", - "status.limited_mode": "โหมดจำกัด", - "status.disconnected_label": "ตัดการเชื่อมต่อ", - "status.ready_for_tasks": "พร้อมรับงานใหม่", - "status.developer_mode": "โหมดนักพัฒนา", - "status.providers_connected": "เชื่อมต่อ {count} ผู้ให้บริการ", - "status.mcp_connected": "เชื่อมต่อ {count} MCP", - "status.limited_hint": "เชื่อมต่อใหม่เพื่อคืนค่าฟีเจอร์ OpenWork ทั้งหมด", - "status.limited_mcp_hint": "เชื่อมต่อ {count} MCP · เชื่อมต่อใหม่เพื่อฟีเจอร์ทั้งหมด", - "status.disconnected_hint": "เปิดการตั้งค่าเพื่อเชื่อมต่อใหม่", - "status.back": "กลับไปหน้าจอก่อนหน้า", - "status.feedback": "ข้อเสนอแนะ", - "status.send_feedback": "ส่งข้อเสนอแนะ", - "status.settings": "การตั้งค่า", - - // ==================== Message List ==================== - "message.waiting_subagent": "กำลังรอ transcript ของ subagent", - "message.tool_request_label": "คำขอ", - "message.tool_result_label": "ผลลัพธ์", - - // ==================== Message List (additional) ==================== - "message_list.copy_message": "คัดลอกข้อความ", - - // ==================== Composer ==================== - "composer.no_matches": "ไม่พบรายการที่ตรงกัน", - "composer.loading_agents": "กำลังโหลด agents...", - "composer.run_task": "รันงาน", - "composer.stop": "หยุด", - "composer.agent_label": "Agent", - "composer.default_agent": "Agent เริ่มต้น", - "composer.loading_commands": "กำลังโหลดคำสั่ง...", - "composer.no_commands": "ไม่พบคำสั่ง", - "composer.configure": "ตั้งค่า", - "composer.tools_label": "คำสั่ง สกิล และ MCP", - "composer.mcps_label": "MCP", - "composer.skill_source": "Skill", - "composer.attach_files": "แนบไฟล์", - "composer.image_kind": "รูปภาพ", - "composer.file_kind": "ไฟล์", - "composer.expand_pasted": "คลิกเพื่อขยายข้อความที่วาง", - "composer.failed_read_attachment": "อ่านไฟล์แนบไม่สำเร็จ", - "composer.attachments_unavailable": "ไฟล์แนบไม่พร้อมใช้งาน", - "composer.file_exceeds_limit": "{name} เกินขีดจำกัด 8MB", - "composer.file_too_large_encoding": "{name} ใหญ่เกินไปหลังเข้ารหัส ลองใช้รูปภาพที่เล็กกว่า", - "composer.uploaded_single_file": "อัปโหลด {name} ไปยังโฟลเดอร์ที่แชร์และแทรกลิงก์แล้ว", - "composer.uploaded_multiple_files": "อัปโหลด {count} ไฟล์ไปยังโฟลเดอร์ที่แชร์และแทรกลิงก์แล้ว", - "composer.upload_failed_local_links": "อัปโหลดไปยังโฟลเดอร์ที่แชร์ไม่สำเร็จ แทรกลิงก์ภายในเครื่องแทน", - "composer.unsupported_attachment_type": "ประเภทไฟล์แนบไม่รองรับ", - "composer.inserted_links_unsupported": "แทรกลิงก์สำหรับไฟล์ที่ไม่รองรับ", - "composer.remote_worker_paste_warning": "นี่คือ remote worker Sandbox ก็เป็น remote เช่นกัน หากต้องการแชร์ไฟล์ ให้อัปโหลดไปยังโฟลเดอร์ที่แชร์ในแถบด้านข้าง", - "composer.upload_to_shared_folder": "อัปโหลดไปยังโฟลเดอร์ที่แชร์", - "composer.placeholder": "อธิบายงานของคุณ...", - "composer.behavior_label": "พฤติกรรม", - - // ==================== Context Panel ==================== - "context_panel.context": "บริบท", - "context_panel.working_files": "ไฟล์ที่กำลังทำงาน", - "context_panel.plugins": "Plugins", - "context_panel.no_plugins": "ไม่ได้โหลด Plugins", - "context_panel.mcp": "MCP", - "context_panel.no_mcp": "ไม่ได้โหลด MCP servers", - "context_panel.skills": "Skills", - "context_panel.no_skills": "ไม่ได้โหลด Skills", - "context_panel.authorized_folders": "โฟลเดอร์ที่อนุญาต", - "context_panel.none_yet": "ยังไม่มี", - "context_panel.mcp_disabled": "ปิดใช้งาน", - "context_panel.mcp_disconnected": "ตัดการเชื่อมต่อ", - "context_panel.mcp_connected": "เชื่อมต่อแล้ว", - "context_panel.mcp_needs_auth": "ต้องยืนยันตัวตน", - "context_panel.mcp_register_client": "ลงทะเบียน client", - "context_panel.mcp_failed": "ล้มเหลว", - "context_panel.open_file": "เปิด {path}", - - // ==================== Inbox Panel ==================== - "inbox_panel.shared_folder": "โฟลเดอร์ที่แชร์", - "inbox_panel.refresh_tooltip": "รีเฟรชโฟลเดอร์ที่แชร์", - "inbox_panel.uploading": "กำลังอัปโหลด...", - "inbox_panel.upload_prompt": "ลากไฟล์มาวางหรือคลิกเพื่ออัปโหลด", - "inbox_panel.helper_text": "แชร์ไฟล์กับ worker นี้จากแอป", - "inbox_panel.connect_to_see": "เชื่อมต่อเพื่อดูไฟล์ที่แชร์", - "inbox_panel.no_files": "ยังไม่มีไฟล์ที่แชร์", - "inbox_panel.showing_first": "แสดง {count} รายการแรก", - "inbox_panel.upload_needs_worker": "เชื่อมต่อ worker เพื่ออัปโหลดไฟล์ไปยังโฟลเดอร์ที่แชร์", - "inbox_panel.uploading_label": "กำลังอัปโหลด {label}...", - "inbox_panel.upload_success": "อัปโหลดไปยังโฟลเดอร์ที่แชร์แล้ว", - "inbox_panel.upload_failed": "อัปโหลดไปยังโฟลเดอร์ที่แชร์ไม่สำเร็จ", - "inbox_panel.copy_failed": "คัดลอกไม่สำเร็จ เบราว์เซอร์อาจบล็อกการเข้าถึงคลิปบอร์ด", - "inbox_panel.connect_to_download": "เชื่อมต่อ worker เพื่อดาวน์โหลดไฟล์ที่แชร์", - "inbox_panel.missing_file_id": "ไม่พบ ID ของไฟล์ที่แชร์", - "inbox_panel.download": "ดาวน์โหลด", - "inbox_panel.load_failed": "โหลดโฟลเดอร์ที่แชร์ไม่สำเร็จ", - "inbox_panel.drop_to_upload": "ลากไฟล์มาวางที่นี่เพื่ออัปโหลด", - "inbox_panel.connect_to_upload": "เชื่อมต่อ worker เพื่ออัปโหลด", - - // ==================== Session Sidebar ==================== - "sidebar.no_workspaces": "ยังไม่มีพื้นที่ทำงานในเซสชันนี้ เพิ่มเพื่อเริ่มต้น", - "sidebar.needs_attention": "ต้องให้ความสนใจ", - "sidebar.active": "ใช้งานอยู่", - "sidebar.switch": "สลับ", - "sidebar.expand": "ขยาย", - "sidebar.collapse": "ยุบ", - "sidebar.drag_reorder": "ลากเพื่อเรียงลำดับใหม่", - "sidebar.edit_connection": "แก้ไขการเชื่อมต่อ", - "sidebar.test_connection": "ทดสอบการเชื่อมต่อ", - "sidebar.stop_sandbox": "หยุด sandbox", - "sidebar.remove_workspace": "ลบพื้นที่ทำงาน", - "sidebar.show_fewer": "แสดงน้อยลง", - "sidebar.show_more": "แสดงเพิ่ม {count} รายการ", - "sidebar.add_workspace": "เพิ่มพื้นที่ทำงานใหม่", - "sidebar.new_worker": "Worker ใหม่", - "sidebar.connect_remote": "เชื่อมต่อระยะไกล", - "sidebar.import_config": "นำเข้า config", - "sidebar.progress": "ความคืบหน้า", - "sidebar.delete_session": "ลบเซสชัน", - "sidebar.no_sessions_yet": "ยังไม่มีเซสชัน", - - // ==================== Workspace Session List ==================== - "workspace_list.connecting": "กำลังเชื่อมต่อ...", - "workspace_list.workspace_fallback": "พื้นที่ทำงาน", - "workspace_list.reveal_explorer": "เปิดใน Explorer", - "workspace_list.reveal_finder": "เปิดใน Finder", - "workspace_list.show_more": "แสดงเพิ่ม {count} รายการ", - "workspace_list.show_more_fallback": "แสดงเพิ่มเติม", - "workspace_list.workspace_options": "ตัวเลือกพื้นที่ทำงาน", - "workspace_list.session_actions": "การดำเนินการเซสชัน", - "workspace_list.hide_child_sessions": "ซ่อนเซสชันย่อย", - "workspace_list.show_child_sessions": "แสดงเซสชันย่อย", - "workspace_list.edit_name": "แก้ไขชื่อ", - "workspace_list.share": "แชร์...", - "workspace_list.recover": "กู้คืน", - "workspace_list.test_connection": "ทดสอบการเชื่อมต่อ", - "workspace_list.edit_connection": "แก้ไขการเชื่อมต่อ", - "workspace_list.remove_workspace": "ลบพื้นที่ทำงาน", - "workspace_list.rename_session": "เปลี่ยนชื่อเซสชัน", - "workspace_list.delete_session": "ลบเซสชัน", - "workspace_list.add_workspace": "เพิ่มพื้นที่ทำงาน", - "workspace_list.new_workspace": "พื้นที่ทำงานใหม่", - "workspace_list.connect_remote": "เชื่อมต่อพื้นที่ทำงานระยะไกล", - "workspace_list.import_config": "นำเข้า config", - "workspace_list.desktop_only_hint": "สร้างพื้นที่ทำงานภายในเครื่องในแอปเดสก์ท็อป", - - // ==================== Workspace badges ==================== - "workspace.sandbox_badge": "Sandbox", - "workspace.remote_badge": "ระยะไกล", - "workspace.local_badge": "ภายในเครื่อง", - - // ==================== Workspace Right Sidebar ==================== - "workspace_sidebar.configuration": "การตั้งค่า", - "workspace_sidebar.close_sidebar": "ปิดแถบด้านข้าง", - "workspace_sidebar.collapse_sidebar": "ยุบแถบด้านข้าง", - "workspace_sidebar.expand_sidebar": "ขยายแถบด้านข้าง", - "workspace_sidebar.automations": "ระบบออโตเมชั่น", - "workspace_sidebar.extensions": "ส่วนขยาย", - "workspace_sidebar.messaging": "ข้อความ", - - // ==================== Common extras ==================== - "common.unknown": "ไม่ทราบ", - - // ==================== Den settings panel (cont.) ==================== - "den.cloud_section_title": "OpenWork Cloud", - "den.cloud_section_desc": "เข้าสู่ระบบ เลือกองค์กร และเปิด Cloud workers หรือเทมเพลตทีม", - "den.cloud_sleep_hint": "เข้าสู่ระบบ OpenWork Cloud เพื่อให้งานยังทำงานแม้คอมพิวเตอร์เข้าสู่โหมดสลีป", - "den.cloud_control_plane_url_label": "URL ของ Cloud control plane", - "den.cloud_control_plane_url_hint": "โหมดนักพัฒนาเท่านั้น ใช้เพื่อเชื่อมต่อ Cloud control plane ภายในเครื่องหรือที่โฮสต์เอง การเปลี่ยนจะออกจากระบบเพื่อให้แอปโหลดข้อมูลจาก control plane ใหม่", - "den.cloud_control_plane_reset": "รีเซ็ต", - "den.cloud_control_plane_save": "บันทึก URL", - "den.cloud_control_plane_open": "เปิดในเบราว์เซอร์", - "den.signin_title": "เข้าสู่ระบบ OpenWork Cloud", - "den.signin_button": "เข้าสู่ระบบ", - "den.create_account": "สร้างบัญชี", - "den.hide_signin_code": "ซ่อนรหัสเข้าสู่ระบบ", - "den.paste_signin_code": "วางรหัสเข้าสู่ระบบ", - "den.signin_link_label": "ลิงก์เข้าสู่ระบบหรือรหัสครั้งเดียว", - "den.signin_link_placeholder": "openwork://den-auth?... หรือรหัสที่วาง", - "den.signin_link_hint": "หากเบราว์เซอร์ไม่กลับมาที่ OpenWork โดยอัตโนมัติ ให้วางลิงก์เข้าสู่ระบบหรือรหัสครั้งเดียวจาก OpenWork Cloud ที่นี่", - "den.finishing": "กำลังเสร็จสิ้น...", - "den.finish_signin": "เข้าสู่ระบบให้เสร็จ", - "den.signin_code_note": "รับลิงก์ openwork://den-auth หรือรหัสครั้งเดียว", - "den.auto_reconnect_hint": "เข้าสู่ระบบในเบราว์เซอร์ให้เสร็จ แล้ว OpenWork จะเชื่อมต่อใหม่โดยอัตโนมัติ", - "den.cloud_account_title": "บัญชี Cloud", - "den.cloud_account_hint": "จัดการบัญชีและองค์กรที่เชื่อมต่อ", - "den.signing_out": "กำลังออกจากระบบ...", - "den.sign_out": "ออกจากระบบ", - "den.active_org_title": "องค์กรที่ใช้งาน", - "den.active_org_hint": "Cloud workers และเทมเพลตทีมจะอยู่ภายใต้องค์กรที่เลือก", - "den.no_org_selected": "ยังไม่ได้เลือกองค์กร", - "den.needs_attention": "ต้องให้ความสนใจ", - "den.checking_session": "กำลังตรวจสอบเซสชัน", - "den.signed_out": "ออกจากระบบแล้ว", - "den.cloud_workers_title": "Cloud workers", - "den.cloud_workers_hint": "เปิด workers ตรงใน OpenWork ด้วยขั้นตอนเชื่อมต่อระยะไกลเดียวกับที่แอปใช้ที่อื่น", - "den.refresh": "รีเฟรช", - "den.no_cloud_workers": "ยังไม่มี cloud workers สำหรับองค์กรนี้ สร้างใน Cloud แล้วรีเฟรชแท็บนี้", - "den.worker_mine_badge": "ของฉัน", - "den.worker_secondary_cloud": "Cloud worker", - "den.worker_not_ready_title": "Worker นี้ยังไม่พร้อมเปิด", - "den.open": "เปิด", - "den.opening": "กำลังเปิด...", - "den.import_all": "Import all", - "den.import_provider": "Import", - "den.importing": "Importing...", - "den.removing": "Removing...", - "den.sync": "Sync", - "den.syncing": "Syncing...", - "den.uninstall": "Uninstall", - "den.imported_badge": "Imported", - "den.out_of_sync_badge": "Out of sync", - "den.removed_from_cloud_badge": "Removed from cloud", - "den.credentials_ready_badge": "Credential ready", - "den.skill_hubs_title": "Skill hubs", - "den.skill_hubs_hint": "Import every skill from a shared cloud hub into this workspace in one step.", - "den.choose_org_for_skill_hubs": "Choose an org to view cloud skill hubs.", - "den.no_skill_hubs": "No cloud skill hubs are available for this org yet.", - "den.skill_hub_skills_badge": "{count} skills", - "den.skill_hub_detail": "Import {count} shared skills into .opencode/skills.", - "den.skill_hub_imported_detail": "Imported {count} skills into this workspace.", - "den.skill_hub_sync_detail": "Cloud now has {liveCount} skills; this workspace imported {importedCount}. Sync to update the installed set.", - "den.skill_hub_removed_detail": "This hub was removed from cloud. Uninstall the {importedCount} imported skills from this workspace.", - "den.cloud_providers_title": "Cloud providers", - "den.cloud_providers_hint": "Import managed LLM providers into opencode.jsonc and use the org credential in this workspace.", - "den.choose_org_for_providers": "Choose an org to view cloud providers.", - "den.no_cloud_providers": "No cloud providers are available for this org yet.", - "den.cloud_provider_detail": "{count} models · {source} provider", - "den.cloud_provider_sync_detail": "Cloud provider changed. Sync the {count} model {source} config into opencode.jsonc.", - "den.cloud_provider_removed_detail": "This imported provider is no longer in cloud. Uninstall the local {providerId} config.", - "den.team_templates_title": "เทมเพลตทีม", - "den.team_templates_hint": "เปิดเทมเพลตพื้นที่ทำงานที่ใช้ซ้ำได้ซึ่งแชร์กับองค์กรนี้", - "den.team_template_badge": "เทมเพลตทีม", - "den.no_team_templates": "ยังไม่มีเทมเพลตทีม ใช้ แชร์ \u2192 เทมเพลต \u2192 แชร์กับทีม", - "den.choose_org_for_templates": "เลือกองค์กรเพื่อดูเทมเพลตทีม", - "den.error_base_url": "ใส่ URL ของ Cloud control plane ที่ถูกต้อง (http:// หรือ https://)", - "den.error_choose_org": "เลือกองค์กรก่อนเปิด worker", - "den.error_worker_not_ready": "Worker ยังไม่พร้อมเปิด ลองอีกครั้งหลังการจัดเตรียมเสร็จ", - "den.error_load_orgs": "โหลดองค์กรไม่สำเร็จ", - "den.error_load_workers": "โหลด workers ไม่สำเร็จ", - "den.error_load_templates": "โหลดเทมเพลตทีมไม่สำเร็จ", - "den.error_no_session": "ไม่พบเซสชัน Cloud ที่ใช้งาน", - "den.error_paste_valid_code": "วางลิงก์เข้าสู่ระบบ OpenWork หรือรหัสครั้งเดียวที่ถูกต้อง", - "den.error_signin_failed": "เข้าสู่ระบบ OpenWork Cloud ไม่สำเร็จ", - "den.error_no_token": "การเข้าสู่ระบบเดสก์ท็อปเสร็จสิ้น แต่ OpenWork Cloud ไม่ส่งคืนโทเค็นเซสชัน", - "den.status_browser_signin": "เข้าสู่ระบบในเบราว์เซอร์ให้เสร็จเพื่อเชื่อมต่อ OpenWork", - "den.status_browser_signup": "สร้างบัญชีในเบราว์เซอร์ให้เสร็จเพื่อเชื่อมต่อ OpenWork", - "den.status_cloud_signin_done": "เชื่อมต่อ OpenWork Cloud แล้ว", - "den.status_base_url_updated": "อัปเดต URL ของ Cloud control plane แล้ว เข้าสู่ระบบอีกครั้งเพื่อดำเนินการต่อ", - "den.status_signed_out": "ออกจากระบบและล้างเซสชัน OpenWork Cloud บนอุปกรณ์นี้แล้ว", - "den.status_signed_in_as": "เข้าสู่ระบบเป็น {email}", - "den.status_cloud_signed_in_as": "เชื่อมต่อ OpenWork Cloud เป็น {email}", - "den.status_loaded_orgs": "โหลด {count} องค์กรแล้ว", - "den.status_loaded_workers": "โหลด {count} workers สำหรับ {name} แล้ว", - "den.status_no_workers": "ไม่พบ workers สำหรับ {name}", - "den.status_loaded_templates": "โหลด {count} เทมเพลตสำหรับ {name} แล้ว", - "den.status_no_templates": "ไม่พบเทมเพลตทีมสำหรับ {name}", - "den.status_opened_worker": "เปิด {name} ใน OpenWork แล้ว", - "den.status_opened_template": "เปิด {name} จาก {org} แล้ว", - "den.status_opened_template_fallback": "เปิด {name} จากเทมเพลตทีมแล้ว", - "den.signing_in": "กำลังดำเนินการเข้าสู่ระบบ OpenWork Cloud ให้เสร็จสิ้น...", - "den.org_switched": "สลับไปยัง {name} แล้ว", - "den.org_owner_suffix": "(เจ้าของ)", - "den.org_member_suffix": "(สมาชิก)", - "den.worker_provider_label": "{provider} worker", - "den.error_open_worker": "เปิด {name} ใน OpenWork ไม่สำเร็จ", - "den.error_open_worker_fallback": "เปิด {name} ไม่สำเร็จ", - "den.error_open_template": "เปิด {name} ไม่สำเร็จ", - - // ==================== Create workspace modal ==================== - // Utility labels - "dashboard.recently_updated": "อัปเดตล่าสุด", - "dashboard.unknown_creator": "ไม่ทราบผู้สร้าง", - "dashboard.cloud_worker": "Cloud worker", - "dashboard.access_token": "Access token", - // Screen titles / subtitles - "dashboard.create_local_workspace_title": "พื้นที่ทำงานภายในเครื่อง", - "dashboard.create_local_workspace_subtitle": "สร้างพื้นที่ทำงานบนอุปกรณ์นี้และเลือกเริ่มจากเทมเพลตทีม", - "dashboard.create_remote_custom_title": "เชื่อมต่อ remote กำหนดเอง", - "dashboard.create_remote_custom_subtitle": "แนบกับ OpenWork worker ที่โฮสต์เอง", - "dashboard.create_shared_title": "พื้นที่ทำงานที่แชร์", - "dashboard.create_shared_subtitle_signed_in": "เรียกดู cloud workers ที่แชร์กับองค์กรของคุณและเชื่อมต่อในขั้นตอนเดียว", - "dashboard.create_shared_subtitle_signed_out": "เข้าสู่ระบบ OpenWork Cloud เพื่อเข้าถึง workers ที่แชร์กับองค์กรของคุณ", - // Chooser cards - "dashboard.chooser_local_desc": "สร้างพื้นที่ทำงานบนอุปกรณ์นี้และเลือกเริ่มจากเทมเพลตทีม", - "dashboard.chooser_remote_desc": "แนบกับ OpenWork worker ที่โฮสต์เองด้วย URL และ access token", - "dashboard.chooser_shared_desc": "เรียกดู cloud workers ที่แชร์กับองค์กรของคุณและเชื่อมต่อในขั้นตอนเดียว", - // Local body - "dashboard.workspace_folder_title": "โฟลเดอร์พื้นที่ทำงาน", - "dashboard.workspace_folder_hint": "เลือกว่าพื้นที่ทำงานนี้ควรอยู่ที่ไหนบนอุปกรณ์", - "dashboard.no_folder_selected": "ยังไม่ได้เลือกโฟลเดอร์", - "dashboard.team_templates_title": "เทมเพลตทีม", "dashboard.team_templates_hint": "เลือกจุดเริ่มต้น หรือเว้นว่างเพื่อสร้างพื้นที่ทำงานว่าง", - "dashboard.team_templates_syncing": "กำลังซิงค์", "dashboard.team_templates_none": "ยังไม่พบเทมเพลตพื้นที่ทำงานที่แชร์สำหรับองค์กรนี้", + "dashboard.team_templates_syncing": "กำลังซิงค์", + "dashboard.team_templates_title": "เทมเพลตทีม", "dashboard.template_selected_badge": "เลือกแล้ว", - // Remote body - "dashboard.remote_server_details_title": "รายละเอียดเซิร์ฟเวอร์ระยะไกล", - "dashboard.remote_server_details_hint": "แนบกับ OpenWork worker ที่โฮสต์เอง", - "dashboard.worker_url_label": "URL ของ Worker", - "dashboard.worker_url_hint": "วาง URL ของ OpenWork worker ที่ต้องการเชื่อมต่อ", - "dashboard.access_token_optional_hint": "เพิ่ม token เฉพาะเมื่อ worker ต้องการ", - "dashboard.display_name_label": "ชื่อที่แสดง", - "dashboard.display_name_optional": "(ไม่บังคับ)", - // Cloud sign-in screen - "dashboard.cloud_signin_title": "เข้าสู่ระบบ OpenWork Cloud", - "dashboard.cloud_signin_hint": "เข้าถึง remote workers ที่แชร์กับองค์กรของคุณ", - "dashboard.cloud_signin_button": "ดำเนินการต่อกับ Cloud", - "dashboard.cloud_signin_next": "คุณจะเลือกทีมและเชื่อมต่อกับพื้นที่ทำงานที่มีอยู่ในขั้นตอนถัดไป", - // Worker status badges + "dashboard.unknown_creator": "ไม่ทราบผู้สร้าง", + "dashboard.worker_status_attention": "ต้องตรวจสอบ", "dashboard.worker_status_ready": "พร้อม", "dashboard.worker_status_starting": "กำลังเริ่ม", - "dashboard.worker_status_attention": "ต้องตรวจสอบ", "dashboard.worker_status_stopped": "หยุดแล้ว", "dashboard.worker_status_unknown": "ไม่ทราบ", - // Errors - "dashboard.error_choose_org": "เลือกองค์กรก่อนเปิดพื้นที่ทำงาน", - "dashboard.error_load_orgs": "โหลดองค์กรไม่สำเร็จ", - "dashboard.error_load_shared_workspaces": "โหลดพื้นที่ทำงานที่แชร์ไม่สำเร็จ", - "dashboard.error_workspace_not_ready": "พื้นที่ทำงานยังไม่พร้อมเชื่อมต่อ ลองอีกครั้งในอีกสักครู่", - "dashboard.error_connect_worker": "เชื่อมต่อ {name} ไม่สำเร็จ", - "dashboard.error_create_template": "สร้าง {name} ไม่สำเร็จ", - "dashboard.desktop_badge": "เดสก์ท็อป", - "dashboard.import_config": "นำเข้า config", - "dashboard.importing": "กำลังนำเข้า\u2026", - // Shared signed-in body - "dashboard.search_shared_workspaces": "ค้นหาพื้นที่ทำงานที่แชร์", - "dashboard.shared_workspaces_loading": "กำลังโหลดพื้นที่ทำงานที่แชร์\u2026", - "dashboard.shared_workspaces_no_match": "ไม่พบพื้นที่ทำงานที่แชร์ที่ตรงกัน", - "dashboard.shared_workspaces_none": "ยังไม่มีพื้นที่ทำงานที่แชร์", - "dashboard.workspace_connecting": "กำลังเชื่อมต่อ", + "dashboard.worker_url_hint": "วาง URL ของ OpenWork worker ที่ต้องการเชื่อมต่อ", + "dashboard.worker_url_label": "URL ของ Worker", "dashboard.workspace_connect": "เชื่อมต่อ", "dashboard.workspace_connect_unavailable": "การเชื่อมต่อพื้นที่ทำงานที่แชร์ไม่พร้อมใช้งานที่นี่", + "dashboard.workspace_connecting": "กำลังเชื่อมต่อ", + "dashboard.workspace_folder_hint": "เลือกว่าพื้นที่ทำงานนี้ควรอยู่ที่ไหนบนอุปกรณ์", + "dashboard.workspace_folder_title": "โฟลเดอร์พื้นที่ทำงาน", "dashboard.workspace_not_ready_title": "พื้นที่ทำงานนี้ยังไม่พร้อมเชื่อมต่อ", - "dashboard.shared_workspaces_refreshing": "กำลังรีเฟรชพื้นที่ทำงาน\u2026", - "dashboard.open_cloud_dashboard": "เปิดแดชบอร์ด Cloud", - // Sandbox progress - "dashboard.sandbox_setup": "ตั้งค่า Sandbox", - "dashboard.sandbox_hide_logs": "ซ่อน logs", - "dashboard.sandbox_show_logs": "แสดง logs", - "dashboard.sandbox_live_logs": "Logs แบบสด", - "dashboard.docker_debug_details": "รายละเอียด Docker debug", - // Buttons / footer - "dashboard.creating": "กำลังสร้าง...", - "dashboard.connect_remote_button": "เชื่อมต่อระยะไกล", - "dashboard.connecting": "กำลังเชื่อมต่อ...", - // Modal aria-labels - "dashboard.modal_back": "กลับ", - "dashboard.modal_close": "ปิดหน้าต่างเพิ่มพื้นที่ทำงาน", - - // ==================== Den settings panel ==================== - "den_settings.title": "Cloud", - "den_settings.sign_in": "เข้าสู่ระบบ", - "den_settings.sign_out": "ออกจากระบบ", - "den_settings.sign_in_hint": "เข้าสู่ระบบ OpenWork Cloud เพื่อเข้าถึงพื้นที่ทำงานที่แชร์และฟีเจอร์ทีม", - "den_settings.signed_in_as": "เข้าสู่ระบบเป็น", - "den_settings.manage_account": "จัดการบัญชี", - "den_settings.workers_title": "พื้นที่ทำงานที่แชร์", - "den_settings.workers_hint": "พื้นที่ทำงาน Cloud ที่แชร์กับองค์กรของคุณ", - "den_settings.no_workers": "ไม่พบพื้นที่ทำงานที่แชร์", - "den_settings.open_workspace": "เปิดพื้นที่ทำงาน", - "den_settings.refresh": "รีเฟรช", - - // ==================== Share workspace modal ==================== - "share.title": "แชร์พื้นที่ทำงาน", - "share.workspace_fallback": "พื้นที่ทำงาน", - "share.field_password": "รหัสผ่าน", - "share.field_worker_url": "URL ของ Worker", - "share.hide_password": "ซ่อนรหัสผ่าน", - "share.reveal_password": "แสดงรหัสผ่าน", - "share.copy_hint": "คัดลอก", - "share.copy_link_hint": "คัดลอกลิงก์", - "share.close_hint": "ปิด", - "share.back_hint": "กลับไปตัวเลือกการแชร์", - "share.publishing": "กำลังเผยแพร่...", - "share.included_in_template": "รวมอยู่ในเทมเพลตนี้", - "share.template_item_settings": "การตั้งค่าพื้นที่ทำงาน", - "share.template_item_settings_desc": "โปรไฟล์พื้นที่ทำงานที่แชร์และพฤติกรรมเริ่มต้น", - "share.template_item_skills": "Skills ที่รวมไว้", - "share.template_item_skills_desc": "Skills กำหนดเองที่บันทึกในพื้นที่ทำงานนี้", - "share.template_item_config": "คำสั่งและ config", - "share.template_item_config_desc": "คำสั่งที่ใช้ซ้ำได้พร้อม config ของ OpenWork/OpenCode", - "share.view_template": "แชร์เทมเพลต", - "share.view_template_public": "เทมเพลตสาธารณะ", - "share.view_template_team": "แชร์กับทีม", - "share.view_access": "เข้าถึงพื้นที่ทำงานระยะไกล", - "share.option_template_title": "แชร์เทมเพลต", - "share.option_template_desc": "รวมการตั้งค่านี้เพื่อให้คนอื่นเริ่มจากสภาพแวดล้อมเดียวกัน", - "share.option_access_title": "เข้าถึงพื้นที่ทำงานระยะไกล", - "share.option_access_desc": "แสดงรายละเอียดการเชื่อมต่อสำหรับเข้าถึงพื้นที่ทำงานนี้จากเครื่องอื่น", - "share.template_intro": "แชร์การตั้งค่าที่ใช้ซ้ำได้โดยไม่ต้องให้สิทธิ์เข้าถึงพื้นที่ทำงานที่กำลังทำงาน", - "share.option_team_title": "แชร์กับทีม", - "share.option_team_desc": "บันทึกเทมเพลตพื้นที่ทำงานนี้ไปยังองค์กร OpenWork Cloud ที่ใช้งาน", - "share.option_public_title": "เทมเพลตสาธารณะ", - "share.option_public_desc": "สร้างลิงก์แชร์ที่ทุกคนสามารถใช้เริ่มจากเทมเพลตนี้ได้", - "share.public_intro": "แชร์พื้นที่ทำงานนี้เป็นลิงก์เทมเพลตสาธารณะ", - "share.workspace_template_title": "เทมเพลตพื้นที่ทำงาน", - "share.workspace_template_desc": "แชร์การตั้งค่าหลักและค่าเริ่มต้นของพื้นที่ทำงาน", - "share.create_template_link": "สร้างลิงก์เทมเพลต", - "share.regenerate_link": "สร้างลิงก์ใหม่", - "share.team_intro": "บันทึกเทมเพลตนี้ไปยังองค์กร OpenWork Cloud ที่ใช้งานเพื่อให้เพื่อนร่วมทีมเปิดได้ภายหลังจากการตั้งค่า Cloud", - "share.active_cloud_org": "องค์กร Cloud ที่ใช้งาน", - "share.template_name_label": "ชื่อเทมเพลต", - "share.sign_in_to_share": "เข้าสู่ระบบเพื่อแชร์กับทีม", - "share.saving": "กำลังบันทึก...", - "share.save_to_team": "บันทึกไปยังทีม", - "share.cloud_signin_note": "OpenWork Cloud จะเปิดในเบราว์เซอร์และกลับมาที่นี่หลังเข้าสู่ระบบ", - "share.warning_basic": "แชร์กับคนที่เชื่อถือได้เท่านั้น ข้อมูลรับรองนี้ให้สิทธิ์เข้าถึงพื้นที่ทำงานแบบสด", - "share.warning_full": "ข้อมูลรับรองนี้ให้สิทธิ์เข้าถึงพื้นที่ทำงานแบบสด การแชร์พื้นที่ทำงานระยะไกลอาจอนุญาตให้ทุกคนที่เข้าถึงเครือข่ายควบคุม worker ของคุณ", - "share.remote_access_title": "การเข้าถึงระยะไกล", - "share.remote_access_desc": "ปิดเป็นค่าเริ่มต้น เปิดเฉพาะเมื่อต้องการให้ worker นี้เข้าถึงได้จากเครื่องอื่น", - "share.remote_access_enabled": "การเข้าถึงระยะไกลเปิดอยู่", - "share.remote_access_disabled": "การเข้าถึงระยะไกลปิดอยู่", - "share.remote_save_busy": "กำลังบันทึก...", - "share.remote_save": "บันทึก", - "share.credentials_disabled_hint": "เปิดการเข้าถึงระยะไกลแล้วคลิกบันทึกเพื่อรีสตาร์ท worker และแสดงรายละเอียดการเชื่อมต่อสำหรับพื้นที่ทำงานนี้", - "share.connection_details_label": "รายละเอียดการเชื่อมต่อ", - "share.connect_messaging_title": "เชื่อมต่อระบบข้อความ", - "share.connect_messaging_desc": "ใช้พื้นที่ทำงานนี้จาก Slack, Telegram และอื่น ๆ", - "share.setup": "ตั้งค่า", - "share.optional_collaborator": "การเข้าถึงผู้ร่วมงาน (ไม่บังคับ)", - "share.collaborator_hint": "การเข้าถึงปกติโดยไม่ต้องอนุมัติสิทธิ์", - "share.chooser_subtitle": "เลือกวิธีแชร์พื้นที่ทำงานนี้", - "share.subtitle_template_public": "สร้างลิงก์เทมเพลตพื้นที่ทำงานสาธารณะที่ทุกคนสามารถนำเข้าได้", - "share.subtitle_template_team": "บันทึกเทมเพลตพื้นที่ทำงานไปยังองค์กร OpenWork Cloud ที่ใช้งาน", - "share.subtitle_access": "แสดงรายละเอียดการเชื่อมต่อสำหรับเข้าถึงพื้นที่ทำงานนี้จากเครื่องอื่น", - - // ==================== Dashboard page (session/share strings) ==================== - "scheduled.title": "ระบบออโตเมชั่น", - "extensions.title": "ส่วนขยาย", - "settings.tab_automations": "ระบบออโตเมชั่น", - "settings.tab_skills": "Skills", - "settings.tab_extensions": "ส่วนขยาย", - "settings.tab_messaging": "ข้อความ", - "settings.tab_advanced": "ขั้นสูง", - "settings.tab_appearance": "ธีม", - "settings.tab_updates": "การอัปเดต", - "settings.tab_recovery": "การกู้คืน", - "settings.tab_cloud": "Cloud", - "settings.tab_debug": "ดีบัก", - "settings.tab_general": "การตั้งค่า", - "session.provider_auth_in_progress": "การยืนยันตัวตนผู้ให้บริการกำลังดำเนินอยู่", - "session.share_worker_url": "URL ของ Worker", - "session.share_desktop_required": "ต้องใช้แอปเดสก์ท็อป", - "session.share_starting_server": "กำลังเริ่มเซิร์ฟเวอร์...", - "session.share_url_worker_hint": "ใช้บนโทรศัพท์หรือแล็ปท็อปที่เชื่อมต่อกับ worker นี้", - "session.share_url_resolving_hint": "URL ของ Worker กำลัง resolve; แสดง host URL เป็นตัวสำรอง", - "session.share_password": "รหัสผ่าน", - "session.share_password_owner_hint": "ใช้เมื่อ remote client ต้องตอบคำขออนุญาต", - "session.share_collaborator_token": "โทเค็นผู้ร่วมงาน", - - // ==================== Workspace (additions) ==================== - "workspace.needs_attention": "ต้องให้ความสนใจ", - "workspace.active": "ใช้งานอยู่", - "workspace.switch": "สลับ", - "workspace.no_tasks": "ยังไม่มีงาน", - "workspace.new_task_inline": "+ งานใหม่", - "workspace.loading_tasks": "กำลังโหลดงาน...", - "workspace.selected": "เลือกแล้ว", - - // ==================== Common (additions) ==================== - "common.copy": "คัดลอก", - "common.copied": "คัดลอกแล้ว", - "common.reset": "รีเซ็ต", - "common.add": "เพิ่ม", - "common.done": "เสร็จสิ้น", - - // ==================== Session view ==================== - "session.permission_message": "OpenCode กำลังขออนุญาตเพื่อดำเนินการต่อ", - "session.doom_loop_title": "ตรวจพบ Doom Loop", - "session.doom_loop_message": "OpenCode ตรวจพบการเรียกเครื่องมือซ้ำด้วยข้อมูลเดิมและถามว่าควรดำเนินการต่อหลังจากล้มเหลวซ้ำ", - "session.doom_loop_label": "Doom Loop", - "session.doom_loop_tool_label": "เครื่องมือ", - "session.doom_loop_repeated_call_label": "การเรียกซ้ำ", - "session.doom_loop_repeated_tool_call": "การเรียกเครื่องมือซ้ำ", - "session.doom_loop_note": "ปฏิเสธเพื่อหยุดลูป หรืออนุญาตหากต้องการให้ agent ลองต่อ", - "session.default_agent": "Agent เริ่มต้น", - "session.workspace_label": "พื้นที่ทำงาน", - "session.no_matches": "ไม่พบรายการที่ตรงกัน", - "session.status_delegating": "กำลังมอบหมาย", - "session.status_planning": "กำลังวางแผน", - "session.status_gathering_context": "กำลังรวบรวมบริบท", - "session.status_searching_codebase": "กำลังค้นหาโค้ด", - "session.status_searching_web": "กำลังค้นหาเว็บ", - "session.status_writing_file": "กำลังเขียนไฟล์", - "session.status_running_shell": "กำลังรัน shell", - "session.status_working": "กำลังทำงาน", - "session.status_thinking": "กำลังคิด", - "session.phase_sending": "กำลังส่ง", - "session.phase_retrying": "กำลังลองใหม่", - "session.phase_responding": "กำลังตอบกลับ", - "session.phase_run_failed": "การทำงานล้มเหลว", - "session.compacting_auto": "OpenCode กำลังบีบอัดเซสชันนี้โดยอัตโนมัติ", - "session.compacting_manual": "OpenCode กำลังบีบอัดเซสชันนี้", - "session.compaction_started": "OpenCode เริ่มบีบอัดบริบทเซสชัน", - "session.compaction_finished": "OpenCode บีบอัดบริบทเซสชันเสร็จแล้ว", - "session.no_session_selected": "ยังไม่ได้เลือกเซสชัน", - "session.stopping_run": "กำลังหยุดการทำงาน...", - "session.stopped": "หยุดแล้ว", - "session.failed_to_stop": "หยุดไม่สำเร็จ", - "session.nothing_to_retry": "ยังไม่มีสิ่งที่จะลองใหม่", - "session.trying_again": "กำลังลองใหม่...", - "session.nothing_to_undo": "ยังไม่มีสิ่งที่จะเลิกทำ", - "session.reverted_last_message": "ย้อนกลับข้อความผู้ใช้ล่าสุดแล้ว", - "session.failed_to_undo": "เลิกทำไม่สำเร็จ", - "session.nothing_to_redo": "ไม่มีสิ่งที่จะทำซ้ำ", - "session.restored_message": "กู้คืนข้อความที่ย้อนกลับแล้ว", - "session.failed_to_redo": "ทำซ้ำไม่สำเร็จ", - "session.nothing_to_compact": "ยังไม่มีสิ่งที่จะบีบอัด", - "session.compacting": "กำลังบีบอัดบริบทเซสชัน...", - "session.compacted": "บีบอัดเซสชันแล้ว", - "session.failed_to_compact": "บีบอัดเซสชันไม่สำเร็จ", - "session.deleted": "ลบเซสชันแล้ว", - "session.failed_to_delete": "ลบเซสชันไม่สำเร็จ", - "session.failed_to_load_agents": "โหลด agents ไม่สำเร็จ", - "session.failed_to_create_session": "สร้างเซสชันไม่สำเร็จ", - "session.failed_to_load_providers": "โหลดผู้ให้บริการไม่สำเร็จ", - "session.cmd_new_session_title": "สร้างเซสชันใหม่", - "session.cmd_new_session_detail": "เริ่มงานใหม่ในพื้นที่ทำงานปัจจุบัน", - "session.cmd_new_session_meta": "สร้าง", - "session.cmd_rename_title": "เปลี่ยนชื่อเซสชันปัจจุบัน", - "session.cmd_rename_detail_fallback": "ตั้งชื่อเซสชันที่เลือกให้ชัดเจนขึ้น", - "session.cmd_rename_meta": "เปลี่ยนชื่อ", - "session.cmd_compact_title": "บีบอัดบทสนทนา", + "dashboard.workspaces": "พื้นที่ทำงาน", + "den.active_org_hint": "Cloud workers และเทมเพลตทีมจะอยู่ภายใต้องค์กรที่เลือก", + "den.active_org_title": "องค์กรที่ใช้งาน", + "den.auto_reconnect_hint": "เข้าสู่ระบบในเบราว์เซอร์ให้เสร็จ แล้ว OpenWork จะเชื่อมต่อใหม่โดยอัตโนมัติ", + "den.checking_session": "กำลังตรวจสอบเซสชัน", + "den.choose_org_for_providers": "เลือกองค์กรเพื่อดู provider บน Cloud", + "den.choose_org_for_skill_hubs": "เลือกองค์กรเพื่อดู Skill Hub บน Cloud", + "den.choose_org_for_templates": "เลือกองค์กรเพื่อดูเทมเพลตทีม", + "den.cloud_account_hint": "จัดการบัญชีและองค์กรที่เชื่อมต่อ", + "den.cloud_account_title": "บัญชี Cloud", + "den.cloud_control_plane_open": "เปิดในเบราว์เซอร์", + "den.cloud_control_plane_reset": "รีเซ็ต", + "den.cloud_control_plane_save": "บันทึก URL", + "den.cloud_control_plane_url_hint": "โหมดนักพัฒนาเท่านั้น ใช้เพื่อเชื่อมต่อ Cloud control plane ภายในเครื่องหรือที่โฮสต์เอง การเปลี่ยนจะออกจากระบบเพื่อให้แอปโหลดข้อมูลจาก control plane ใหม่", + "den.cloud_control_plane_url_label": "URL ของ Cloud control plane", + "den.cloud_provider_detail": "{count} โมเดล · {source} provider", + "den.cloud_provider_removed_detail": "Provider ที่นำเข้านี้ไม่อยู่บน Cloud แล้ว ถอนการติดตั้งการกำหนดค่า {providerId} ในเครื่อง", + "den.cloud_provider_sync_detail": "Provider บน Cloud เปลี่ยนแปลงแล้ว ซิงค์การกำหนดค่า {source} กับ {count} โมเดลเข้า opencode.jsonc", + "den.cloud_providers_hint": "นำเข้า LLM provider ที่จัดการแล้วเข้า opencode.jsonc และใช้ข้อมูลรับรองขององค์กรในพื้นที่ทำงานนี้", + "den.cloud_providers_title": "Provider บน Cloud", + "den.cloud_section_desc": "เข้าสู่ระบบ เลือกองค์กร และเปิด Cloud workers หรือเทมเพลตทีม", + "den.cloud_section_title": "OpenWork Cloud", + "den.cloud_sleep_hint": "เข้าสู่ระบบ OpenWork Cloud เพื่อให้งานยังทำงานแม้คอมพิวเตอร์เข้าสู่โหมดสลีป", + "den.cloud_workers_hint": "เปิด workers ตรงใน OpenWork ด้วยขั้นตอนเชื่อมต่อระยะไกลเดียวกับที่แอปใช้ที่อื่น", + "den.cloud_workers_title": "Cloud workers", + "den.create_account": "สร้างบัญชี", + "den.credentials_ready_badge": "ข้อมูลรับรองพร้อม", + "den.error_base_url": "ใส่ URL ของ Cloud control plane ที่ถูกต้อง (http:// หรือ https://)", + "den.error_choose_org": "เลือกองค์กรก่อนเปิด worker", + "den.error_load_orgs": "โหลดองค์กรไม่สำเร็จ", + "den.error_load_templates": "โหลดเทมเพลตทีมไม่สำเร็จ", + "den.error_load_workers": "โหลด workers ไม่สำเร็จ", + "den.error_no_session": "ไม่พบเซสชัน Cloud ที่ใช้งาน", + "den.error_no_token": "การเข้าสู่ระบบเดสก์ท็อปเสร็จสิ้น แต่ OpenWork Cloud ไม่ส่งคืนโทเค็นเซสชัน", + "den.error_open_template": "เปิด {name} ไม่สำเร็จ", + "den.error_open_worker": "เปิด {name} ใน OpenWork ไม่สำเร็จ", + "den.error_open_worker_fallback": "เปิด {name} ไม่สำเร็จ", + "den.error_paste_valid_code": "วางลิงก์เข้าสู่ระบบ OpenWork หรือรหัสครั้งเดียวที่ถูกต้อง", + "den.error_signin_failed": "เข้าสู่ระบบ OpenWork Cloud ไม่สำเร็จ", + "den.error_worker_not_ready": "Worker ยังไม่พร้อมเปิด ลองอีกครั้งหลังการจัดเตรียมเสร็จ", + "den.finish_signin": "เข้าสู่ระบบให้เสร็จ", + "den.finishing": "กำลังเสร็จสิ้น...", + "den.hide_signin_code": "ซ่อนรหัสเข้าสู่ระบบ", + "den.import_all": "นำเข้าทั้งหมด", + "den.import_provider": "นำเข้า", + "den.import_provider_failed": "ไม่สามารถนำเข้า {name} ได้", + "den.imported_badge": "นำเข้าแล้ว", + "den.imported_provider": "นำเข้า {name} แล้ว", + "den.importing": "กำลังนำเข้า…", + "den.needs_attention": "ต้องให้ความสนใจ", + "den.no_cloud_providers": "ยังไม่มี provider บน Cloud สำหรับองค์กรนี้", + "den.no_cloud_workers": "ยังไม่มี cloud workers สำหรับองค์กรนี้ สร้างใน Cloud แล้วรีเฟรชแท็บนี้", + "den.no_org_selected": "ยังไม่ได้เลือกองค์กร", + "den.no_skill_hubs": "ยังไม่มี Skill Hub บน Cloud สำหรับองค์กรนี้", + "den.no_team_templates": "ยังไม่มีเทมเพลตทีม ใช้ แชร์ → เทมเพลต → แชร์กับทีม", + "den.open": "เปิด", + "den.opening": "กำลังเปิด...", + "den.org_member_suffix": "(สมาชิก)", + "den.org_owner_suffix": "(เจ้าของ)", + "den.org_switched": "สลับไปยัง {name} แล้ว", + "den.out_of_sync_badge": "ไม่ตรงกัน", + "den.paste_signin_code": "วางรหัสเข้าสู่ระบบ", + "den.refresh": "รีเฟรช", + "den.reload_workspace": "โหลดพื้นที่ทำงานใหม่เพื่อใช้การเปลี่ยนแปลงการตั้งค่า", + "den.remove_provider_failed": "ไม่สามารถลบ {name} ได้", + "den.removed_from_cloud_badge": "ลบจาก Cloud แล้ว", + "den.removed_provider": "ลบ {name} แล้ว", + "den.removing": "กำลังลบ…", + "den.sign_out": "ออกจากระบบ", + "den.signed_out": "ออกจากระบบแล้ว", + "den.signin_button": "เข้าสู่ระบบ", + "den.signin_code_note": "รับลิงก์ openwork://den-auth หรือรหัสครั้งเดียว", + "den.signin_link_hint": "หากเบราว์เซอร์ไม่กลับมาที่ OpenWork โดยอัตโนมัติ ให้วางลิงก์เข้าสู่ระบบหรือรหัสครั้งเดียวจาก OpenWork Cloud ที่นี่", + "den.signin_link_label": "ลิงก์เข้าสู่ระบบหรือรหัสครั้งเดียว", + "den.signin_link_placeholder": "openwork://den-auth?... หรือรหัสที่วาง", + "den.signin_title": "เข้าสู่ระบบ OpenWork Cloud", + "den.signing_in": "กำลังดำเนินการเข้าสู่ระบบ OpenWork Cloud ให้เสร็จสิ้น...", + "den.signing_out": "กำลังออกจากระบบ...", + "den.skill_hub_detail": "นำเข้า {count} skill ที่แชร์เข้า .opencode/skills", + "den.skill_hub_imported_detail": "นำเข้า {count} skill เข้าพื้นที่ทำงานนี้แล้ว", + "den.skill_hub_removed_detail": "Hub นี้ถูกลบจาก Cloud แล้ว ถอนการติดตั้ง {importedCount} skill ที่นำเข้าจากพื้นที่ทำงานนี้", + "den.skill_hub_skills_badge": "{count} skills", + "den.skill_hub_sync_detail": "Cloud มี {liveCount} skill; พื้นที่ทำงานนี้นำเข้า {importedCount} รายการ ซิงค์เพื่ออัปเดต", + "den.skill_hubs_hint": "นำเข้า skill ทั้งหมดจาก Cloud Hub ที่แชร์เข้าพื้นที่ทำงานนี้ในขั้นตอนเดียว", + "den.skill_hubs_title": "Skill Hub", + "den.status_base_url_updated": "อัปเดต URL ของ Cloud control plane แล้ว เข้าสู่ระบบอีกครั้งเพื่อดำเนินการต่อ", + "den.status_browser_signin": "เข้าสู่ระบบในเบราว์เซอร์ให้เสร็จเพื่อเชื่อมต่อ OpenWork", + "den.status_browser_signup": "สร้างบัญชีในเบราว์เซอร์ให้เสร็จเพื่อเชื่อมต่อ OpenWork", + "den.status_cloud_signed_in_as": "เชื่อมต่อ OpenWork Cloud เป็น {email}", + "den.status_cloud_signin_done": "เชื่อมต่อ OpenWork Cloud แล้ว", + "den.status_loaded_orgs": "โหลด {count} องค์กรแล้ว", + "den.status_loaded_templates": "โหลด {count} เทมเพลตสำหรับ {name} แล้ว", + "den.status_loaded_workers": "โหลด {count} workers สำหรับ {name} แล้ว", + "den.status_no_templates": "ไม่พบเทมเพลตทีมสำหรับ {name}", + "den.status_no_workers": "ไม่พบ workers สำหรับ {name}", + "den.status_opened_template": "เปิด {name} จาก {org} แล้ว", + "den.status_opened_template_fallback": "เปิด {name} จากเทมเพลตทีมแล้ว", + "den.status_opened_worker": "เปิด {name} ใน OpenWork แล้ว", + "den.status_signed_in_as": "เข้าสู่ระบบเป็น {email}", + "den.status_signed_out": "ออกจากระบบและล้างเซสชัน OpenWork Cloud บนอุปกรณ์นี้แล้ว", + "den.sync": "ซิงค์", + "den.sync_provider_failed": "ไม่สามารถซิงค์ {name} ได้", + "den.synced_provider": "ซิงค์ {name} แล้ว", + "den.syncing": "กำลังซิงค์…", + "den.team_template_badge": "เทมเพลตทีม", + "den.team_templates_hint": "เปิดเทมเพลตพื้นที่ทำงานที่ใช้ซ้ำได้ซึ่งแชร์กับองค์กรนี้", + "den.team_templates_title": "เทมเพลตทีม", + "den.uninstall": "ถอนการติดตั้ง", + "den.worker_mine_badge": "ของฉัน", + "den.worker_not_ready_title": "Worker นี้ยังไม่พร้อมเปิด", + "den.worker_provider_label": "{provider} worker", + "den.worker_secondary_cloud": "Cloud worker", + "extensions.app_count_one": "{count} แอปเชื่อมต่อแล้ว", + "extensions.app_count_many": "{count} แอปเชื่อมต่อแล้ว", + "extensions.apps_mcp_header": "แอป (MCP)", + "extensions.filter_all": "ทั้งหมด", + "extensions.filter_apps": "แอป", + "extensions.filter_plugins": "Plugins", + "extensions.plugin_count_one": "{count} ปลั๊กอิน", + "extensions.plugin_count_many": "{count} ปลั๊กอิน", + "extensions.plugins_opencode_header": "Plugins (OpenCode)", + "extensions.subtitle": "แอป (MCP) และ OpenCode plugins อยู่ในที่เดียว", + "extensions.title": "ส่วนขยาย", + "identities.agent_behavior_desc": "ไฟล์เดียวต่อพื้นที่ทำงาน เพิ่มบรรทัดแรก @agent เพื่อ route ผ่าน OpenCode agent ที่ระบุ", + "identities.agent_behavior_title": "พฤติกรรม messaging agent", + "identities.agent_created": "สร้างไฟล์ messaging agent เริ่มต้นแล้ว", + "identities.agent_file_changed": "ไฟล์ถูกเปลี่ยนจากระยะไกล รีโหลดและบันทึกใหม่", + "identities.agent_loading": "กำลังโหลดไฟล์ agent…", + "identities.agent_none": "ไม่มี", + "identities.agent_not_found": "ยังไม่พบไฟล์ agent ในพื้นที่ทำงานนี้", + "identities.agent_placeholder": "เพิ่มคำแนะนำพฤติกรรม messaging สำหรับ opencodeRouter ที่นี่...", + "identities.agent_saved": "บันทึกพฤติกรรม messaging แล้ว", + "identities.agent_scope_status": "ขอบเขต: พื้นที่ทำงาน · สถานะ: {status} · agent ที่เลือก: {agent}", + "identities.agent_status_loaded": "โหลดแล้ว", + "identities.agent_status_missing": "ไม่พบ", + "identities.agent_worker_scope_unavailable": "ขอบเขต worker ไม่พร้อมใช้งาน", + "identities.all_channels": "ทุกช่องทาง", + "identities.app_token_label": "App token", + "identities.auto_bind_label": "ผูก peer กับไดเรกทอรีอัตโนมัติเมื่อส่งตรง", + "identities.available_channels": "ช่องทางที่ใช้ได้", + "identities.bot_token_label": "Bot token", + "identities.bot_token_placeholder": "วาง Telegram bot token จาก @BotFather", + "identities.botfather_step1_open": "1. เปิด @BotFather ใน Telegram", + "identities.botfather_step1_run": "แล้วรัน /newbot", + "identities.botfather_step3_choose": "3. เลือกชื่อและ username สำหรับบอท", + "identities.botfather_step3_or_private": "สำหรับ inbox เปิด หรือ", + "identities.botfather_step3_private": "ส่วนตัว", + "identities.botfather_step3_public": "สาธารณะ", + "identities.botfather_step3_to_require": "เพื่อกำหนด", + "identities.channel_label": "ช่องทาง", + "identities.channels_connected": "เชื่อมต่อแล้ว", + "identities.channels_label": "ช่องทาง", + "identities.configured_suffix": "ตั้งค่าแล้ว", + "identities.connect_server_desc": "Identities ใช้งานได้เมื่อเชื่อมต่อกับ OpenWork host", + "identities.connect_server_title": "เชื่อมต่อ OpenWork server", + "identities.connect_slack": "เชื่อมต่อ Slack", + "identities.connected_badge": "เชื่อมต่อแล้ว", + "identities.connecting": "กำลังเชื่อมต่อ...", + "identities.copy_bot_token_hint": "คัดลอก bot token แล้ววางด้านล่าง", + "identities.copy_code": "คัดลอกรหัส", + "identities.create_default_file": "สร้างไฟล์เริ่มต้น", + "identities.create_private_bot": "สร้างบอทส่วนตัว", + "identities.create_public_bot": "สร้างบอทสาธารณะ", + "identities.days_ago": "{days} วันที่แล้ว", + "identities.default_routing": "การ route เริ่มต้น", + "identities.directory_label": "ไดเรกทอรี (ไม่บังคับ)", + "identities.disable_messaging": "ปิด messaging", + "identities.disable_messaging_message": "การดำเนินการนี้จะปิด messaging สำหรับพื้นที่ทำงานนี้ การตั้งค่า Telegram และ Slack จะถูกซ่อนจนกว่าจะเปิด messaging อีกครั้ง และคุณจะต้องรีสตาร์ท worker เพื่อหยุด messaging sidecar อย่างสมบูรณ์", + "identities.disable_messaging_title": "ปิด messaging สำหรับ worker นี้?", + "identities.disabled_label": "ปิดใช้งาน", + "identities.disabling": "กำลังปิดใช้งาน...", + "identities.disconnect": "ตัดการเชื่อมต่อ", + "identities.dispatched_messages": "ส่ง {sent}/{attempted} ข้อความแล้ว", + "identities.enable_messaging": "เปิด messaging", + "identities.enable_messaging_risk": "Messaging อาจเปิดเผย worker นี้ต่อคำสั่งระยะไกล หากบอทเป็นสาธารณะหรือถูกบุกรุก อาจเข้าถึงไฟล์ ข้อมูลรับรอง และ API key ที่ worker นี้ใช้ได้", + "identities.enable_messaging_title": "เปิด messaging สำหรับ worker นี้?", + "identities.enabled_label": "เปิดใช้งาน", + "identities.enabling": "กำลังเปิดใช้งาน...", + "identities.health_offline": "ออฟไลน์", + "identities.health_running": "กำลังทำงาน", + "identities.health_unavailable": "ไม่พร้อมใช้งาน", + "identities.health_unavailable_status": "สถานะ OpenCodeRouter ไม่พร้อมใช้งาน ({status})", + "identities.health_unknown": "ไม่ทราบ", + "identities.hours_ago": "{hours} ชม. ที่แล้ว", + "identities.identities_label": "Identities", + "identities.just_now": "เมื่อสักครู่", + "identities.last_activity": "กิจกรรมล่าสุด", + "identities.later": "ภายหลัง", + "identities.message_label": "ข้อความ", + "identities.message_routing_desc": "ควบคุมว่าบทสนทนาไหนจะส่งไปโฟลเดอร์ไหน ข้อความจะถูก route ไปยังโฟลเดอร์เริ่มต้นของ worker เว้นแต่คุณจะตั้งกฎที่นี่", + "identities.message_routing_title": "การ route ข้อความ", + "identities.messages_today": "ข้อความวันนี้", + "identities.messaging_disabled_hint": "เปิด messaging เฉพาะเมื่อคุณเข้าใจความเสี่ยงและวางแผนรักษาความปลอดภัย (เช่น Telegram pairing แบบส่วนตัว)", + "identities.messaging_disabled_restart": "ปิด messaging แล้ว รีสตาร์ท worker เพื่อหยุด messaging sidecar", + "identities.messaging_disabled_risk": "บอท messaging สามารถดำเนินการต่อ local worker ของคุณได้ หากเปิดเผยต่อสาธารณะ อาจอนุญาตให้เข้าถึงไฟล์ ข้อมูลรับรอง และ API key ที่ worker นี้ใช้ได้", + "identities.messaging_disabled_title": "Messaging ปิดอยู่เป็นค่าเริ่มต้น", + "identities.messaging_enabled_restart": "เปิด messaging แล้ว รีสตาร์ท worker เพื่อเริ่ม messaging sidecar และปลดล็อกการตั้งค่า Telegram และ Slack", + "identities.messaging_sidecar_not_running": "Messaging เปิดอยู่ในพื้นที่ทำงานนี้ แต่ messaging sidecar ยังไม่ทำงาน รีสตาร์ท worker แล้วกลับมาที่การตั้งค่า Messaging เพื่อเชื่อมต่อ Telegram หรือ Slack", + "identities.minutes_ago": "{minutes} นาทีที่แล้ว", + "identities.not_set": "ไม่ได้ตั้งค่า", + "identities.open_bot_link": "เปิด @{username} ใน Telegram", + "identities.pairing_code_copied": "คัดลอกรหัสจับคู่แล้ว", + "identities.pairing_code_copy_failed": "คัดลอกรหัสจับคู่ไม่ได้ คัดลอกด้วยตนเอง", + "identities.pairing_code_instruction_prefix": "ส่ง", + "identities.peer_id_label": "Peer ID (ไม่บังคับ)", + "identities.peer_id_placeholder_slack": "เช่น slack:U12345678", + "identities.peer_id_placeholder_telegram": "เช่น telegram:123456789", + "identities.private_label": "ส่วนตัว", + "identities.private_pairing_code": "รหัสจับคู่ส่วนตัว", + "identities.public_bot_confirm": "ใช่ ฉันเข้าใจความเสี่ยง", + "identities.public_bot_warning_message": "บอทของคุณจะเข้าถึงได้สาธารณะ ทุกคนที่เข้าถึงบอทจะสามารถเข้าถึง local worker ของคุณได้เต็มที่ รวมถึงไฟล์และ API key ที่คุณให้ไว้ หากสร้างบอทส่วนตัว คุณสามารถจำกัดผู้เข้าถึงด้วยการกำหนดให้ใช้ pairing token คุณแน่ใจหรือไม่ว่าต้องการทำบอทสาธารณะ?", + "identities.public_bot_warning_title": "ทำบอทนี้เป็นสาธารณะ?", + "identities.public_label": "สาธารณะ", + "identities.quick_setup": "ตั้งค่าด่วน", + "identities.reconnect_failed": "เชื่อมต่อใหม่ไม่สำเร็จ ตรวจสอบ URL/token ของ OpenWork แล้วลองอีกครั้ง", + "identities.reconnected": "เชื่อมต่อใหม่แล้ว", + "identities.reconnected_refreshing": "เชื่อมต่อใหม่แล้ว กำลังรีเฟรชสถานะ worker...", + "identities.reload": "รีโหลด", + "identities.repair_reconnect": "ซ่อมแซมและเชื่อมต่อใหม่", + "identities.restart_failed": "รีสตาร์ทล้มเหลว กรุณารีสตาร์ท worker จาก Settings แล้วลองอีกครั้ง", + "identities.restart_to_disable_messaging": "ปิด messaging สำหรับพื้นที่ทำงานนี้แล้ว รีสตาร์ท worker ตอนนี้เพื่อหยุด messaging sidecar", + "identities.restart_to_enable_messaging": "เปิด messaging สำหรับพื้นที่ทำงานนี้แล้ว รีสตาร์ท worker ตอนนี้เพื่อเริ่ม messaging sidecar และปลดล็อกการตั้งค่า Telegram และ Slack", + "identities.restart_worker": "รีสตาร์ท worker", + "identities.restart_worker_title": "รีสตาร์ท worker ตอนนี้?", + "identities.restarting": "กำลังรีสตาร์ท...", + "identities.routing_override_prefix": "ข้อความทั้งหมด route ไปที่", + "identities.routing_override_suffix": "(override ทำงานอยู่)", + "identities.running_label": "กำลังทำงาน", + "identities.save_behavior": "บันทึกพฤติกรรม", + "identities.saving": "กำลังบันทึก...", + "identities.send_test_button": "ส่งข้อความทดสอบ", + "identities.send_test_desc": "ตรวจสอบการเชื่อมต่อขาออก ใช้ peer ID สำหรับส่งตรง หรือเว้น peer ID ว่างเพื่อกระจายตาม bindings ในไดเรกทอรี", + "identities.send_test_title": "ส่งข้อความทดสอบ", + "identities.sending": "กำลังส่ง...", + "identities.slack_desc": "Worker ของคุณจะปรากฏเป็นบอทใน Slack channels สมาชิกทีมสามารถส่งข้อความโดยตรงหรือ mention ในเธรด", + "identities.slack_intro": "เชื่อมต่อ Slack workspace เพื่อให้สมาชิกทีมโต้ตอบกับ worker นี้ใน channels และ DM", + "identities.slack_unavailable": "Slack identities ไม่พร้อมใช้งาน", + "identities.status_active": "ใช้งานอยู่", + "identities.status_label": "สถานะ", + "identities.status_stopped": "หยุดแล้ว", + "identities.stopped_label": "หยุดแล้ว", + "identities.subtitle": "ให้ผู้คนเข้าถึง worker ของคุณผ่านแอปข้อความ เชื่อมต่อช่องทางแล้ว worker จะอ่านและตอบข้อความโดยอัตโนมัติ", + "identities.tab_general": "ทั่วไป", + "identities.telegram_bot_access_desc": "บอทสาธารณะ: แชท Telegram แรกจะเชื่อมต่ออัตโนมัติ บอทส่วนตัว: ต้องใช้รหัสจับคู่ก่อนข้อความจะรันเครื่องมือ", + "identities.telegram_delete_failed": "ลบไม่สำเร็จ", + "identities.telegram_deleted": "ลบแล้ว", + "identities.telegram_deleted_pending": "ลบแล้ว (รอใช้งาน)", + "identities.telegram_desc": "เชื่อมต่อ Telegram bot ในโหมดสาธารณะ (inbox เปิด) หรือโหมดส่วนตัว (ต้องใช้รหัสจับคู่)", + "identities.telegram_private_saved_pair": "บันทึกบอทส่วนตัวแล้ว จับคู่ด้วย /pair {code}", + "identities.telegram_save_failed": "บันทึกไม่สำเร็จ", + "identities.telegram_saved": "บันทึกแล้ว", + "identities.telegram_saved_pending": "บันทึกแล้ว (รอใช้งาน)", + "identities.telegram_saved_username": "บันทึกแล้ว (@{username})", + "identities.telegram_unavailable": "Telegram identities ไม่พร้อมใช้งาน", + "identities.title": "ช่องทาง messaging", + "identities.unsaved_changes": "มีการเปลี่ยนแปลงที่ยังไม่ได้บันทึก", + "identities.worker_offline": "Worker ออฟไลน์", + "identities.worker_online": "Worker ออนไลน์", + "identities.worker_restarted": "รีสตาร์ท worker แล้ว", + "identities.worker_restarted_refreshing": "รีสตาร์ท worker แล้ว กำลังรีเฟรชสถานะ messaging...", + "identities.worker_scope_unavailable": "ขอบเขต worker ไม่พร้อมใช้งาน", + "identities.worker_scope_unavailable_detail": "ขอบเขต worker ไม่พร้อมใช้งาน เชื่อมต่อใหม่ด้วย worker URL หรือสลับไปยัง worker ที่รู้จัก", + "identities.worker_unavailable": "Worker ไม่พร้อมใช้งาน", + "identities.workspace_id_required": "ต้องใช้ Workspace ID เพื่อจัดการ identities เชื่อมต่อใหม่ด้วย workspace URL หรือเลือกพื้นที่ทำงานที่ map ไว้บน host นี้", + "identities.workspace_scope_prefix": "ขอบเขตพื้นที่ทำงาน:", + "inbox_panel.connect_to_download": "เชื่อมต่อ worker เพื่อดาวน์โหลดไฟล์ที่แชร์", + "inbox_panel.connect_to_see": "เชื่อมต่อเพื่อดูไฟล์ที่แชร์", + "inbox_panel.connect_to_upload": "เชื่อมต่อ worker เพื่ออัปโหลด", + "inbox_panel.copy_failed": "คัดลอกไม่สำเร็จ เบราว์เซอร์อาจบล็อกการเข้าถึงคลิปบอร์ด", + "inbox_panel.download": "ดาวน์โหลด", + "inbox_panel.drop_to_upload": "ลากไฟล์มาวางที่นี่เพื่ออัปโหลด", + "inbox_panel.helper_text": "แชร์ไฟล์กับ worker นี้จากแอป", + "inbox_panel.load_failed": "โหลดโฟลเดอร์ที่แชร์ไม่สำเร็จ", + "inbox_panel.missing_file_id": "ไม่พบ ID ของไฟล์ที่แชร์", + "inbox_panel.no_files": "ยังไม่มีไฟล์ที่แชร์", + "inbox_panel.refresh_tooltip": "รีเฟรชโฟลเดอร์ที่แชร์", + "inbox_panel.shared_folder": "โฟลเดอร์ที่แชร์", + "inbox_panel.showing_first": "แสดง {count} รายการแรก", + "inbox_panel.upload_failed": "อัปโหลดไปยังโฟลเดอร์ที่แชร์ไม่สำเร็จ", + "inbox_panel.upload_needs_worker": "เชื่อมต่อ worker เพื่ออัปโหลดไฟล์ไปยังโฟลเดอร์ที่แชร์", + "inbox_panel.upload_prompt": "ลากไฟล์มาวางหรือคลิกเพื่ออัปโหลด", + "inbox_panel.upload_success": "อัปโหลดไปยังโฟลเดอร์ที่แชร์แล้ว", + "inbox_panel.uploading": "กำลังอัปโหลด...", + "inbox_panel.uploading_label": "กำลังอัปโหลด {label}...", + "mcp.activate_button": "เปิดใช้งาน", + "mcp.add_modal_subtitle": "เชื่อมต่อ MCP server กำหนดเองด้วย URL หรือคำสั่งภายในเครื่อง", + "mcp.add_modal_title": "เพิ่มแอปกำหนดเอง", + "mcp.add_server_button": "เพิ่มแอป", + "mcp.advanced": "ขั้นสูง", + "mcp.advanced_settings": "การตั้งค่าขั้นสูง", + "mcp.advanced_settings_hint": "แก้ไขไฟล์ config และจัดการการเชื่อมต่อด้วยตนเอง", + "mcp.app_connected": "แอปที่เชื่อมต่อ", + "mcp.apps_connected": "แอปที่เชื่อมต่อ", + "mcp.apps_subtitle": "เชื่อมต่อเครื่องมือที่คุณชื่นชอบเพื่อให้ OpenWork ใช้งานแทนคุณ", + "mcp.apps_title": "แอป", + "mcp.auth.already_connected": "เชื่อมต่อแล้ว", + "mcp.auth.already_connected_description": "{server} ได้ยืนยันตัวตนแล้วและพร้อมใช้งาน", + "mcp.auth.applying_changes_body": "เรากำลังรีสตาร์ท worker เพื่อให้ MCP ใหม่พร้อมยืนยันตัวตน", + "mcp.auth.applying_changes_title": "กำลังใช้การเปลี่ยนแปลงก่อนเข้าสู่ระบบ", + "mcp.auth.authorization_link": "ลิงก์อนุมัติ", + "mcp.auth.authorization_still_required": "ยังต้องการอนุมัติ ลองอีกครั้งเพื่อเริ่มขั้นตอนใหม่", + "mcp.auth.callback_invalid": "วาง callback URL หรือพารามิเตอร์ code เพื่อเสร็จสิ้น OAuth", + "mcp.auth.callback_label": "Callback URL หรือรหัส", + "mcp.auth.callback_placeholder": "http://127.0.0.1:19876/mcp/oauth/callback?code=...", + "mcp.auth.cancel": "ยกเลิก", + "mcp.auth.client_registration_required": "ต้องลงทะเบียน client ก่อนดำเนินการ OAuth", + "mcp.auth.complete_connection": "เชื่อมต่อให้เสร็จ", + "mcp.auth.configured_previously": "MCP อาจถูกตั้งค่าไว้แบบทั่วไปหรือในเซสชันก่อนหน้า คุณสามารถปิดหน้าต่างนี้และเริ่มใช้เครื่องมือ MCP ได้ทันที", + "mcp.auth.connect_server": "เชื่อมต่อ {server}", + "mcp.auth.copied": "คัดลอกแล้ว", + "mcp.auth.copy_link": "คัดลอกลิงก์", + "mcp.auth.done": "เสร็จสิ้น", + "mcp.auth.failed_to_start_oauth": "เริ่มขั้นตอน OAuth ไม่สำเร็จ", + "mcp.auth.follow_browser_steps": "ทำตามขั้นตอนการอนุมัติในเบราว์เซอร์", + "mcp.auth.force_stop": "บังคับหยุด", + "mcp.auth.force_stopping": "กำลังหยุด...", + "mcp.auth.im_done": "ดำเนินการเสร็จแล้ว", + "mcp.auth.invalid_refresh_token": "Refresh token ของ OAuth ไม่ถูกต้องหรือหมดอายุ ยืนยันตัวตนอีกครั้งเพื่อดำเนินการต่อ", + "mcp.auth.manual_finish_hint": "วาง callback URL (localhost:19876) หรือรหัสเพื่อเชื่อมต่อให้เสร็จ", + "mcp.auth.manual_finish_title": "เซิร์ฟเวอร์ระยะไกล?", + "mcp.auth.oauth_completed_reload": "OAuth เสร็จสิ้น รีโหลด engine เพื่อเปิดใช้งาน MCP", + "mcp.auth.oauth_failed": "การยืนยันตัวตน OAuth ล้มเหลว", + "mcp.auth.oauth_not_supported_hint": "อาจหมายความว่า:\n• MCP server ไม่ได้ประกาศความสามารถ OAuth\n• Engine ต้องรีโหลดเพื่อตรวจสอบความสามารถของเซิร์ฟเวอร์\n• ลอง: opencode mcp auth {server} จาก CLI", + "mcp.auth.open_browser_signin": "เราจะเปิดเบราว์เซอร์เพื่อเข้าสู่ระบบ", + "mcp.auth.port_forward_hint": "เคล็ดลับ: forward callback port ถ้าจำเป็น: ssh -L 19876:127.0.0.1:19876 user@host", + "mcp.auth.reauth_action": "ยืนยันตัวตน OAuth อีกครั้ง", + "mcp.auth.reauth_cli_hint": "รัน: opencode mcp auth {server}", + "mcp.auth.reauth_failed": "ยืนยันตัวตนอีกครั้งไม่สำเร็จ", + "mcp.auth.reauth_remote_hint": "ยืนยันตัวตนอีกครั้งจากเครื่องที่รัน worker นี้", + "mcp.auth.reauth_running": "กำลังยืนยันตัวตนอีกครั้ง...", + "mcp.auth.reload_blocked": "การรีโหลดหยุดชั่วคราวขณะเซสชันกำลังทำงาน หยุดการทำงานเพื่อตั้งค่าให้เสร็จ", + "mcp.auth.reload_engine_retry": "ใช้การเปลี่ยนแปลงและลองอีกครั้ง", + "mcp.auth.reload_failed": "รีโหลด worker ก่อนเข้าสู่ระบบไม่สำเร็จ", + "mcp.auth.reload_notice": "เพื่อให้มีผล OpenWork ต้องรีเฟรชบริการ worker ซึ่งอาจหยุดเซสชันที่กำลังทำงาน", + "mcp.auth.reload_remote_confirm": "เพื่อให้มีผล OpenWork ต้องรีเฟรชบริการ worker ซึ่งอาจหยุดเซสชันที่กำลังทำงาน ดำเนินการต่อ?", + "mcp.auth.reopen_browser_link": "คลิกที่นี่เพื่อเปิดเบราว์เซอร์อีกครั้ง", + "mcp.auth.request_timed_out": "คำขอหมดเวลา", + "mcp.auth.retry": "ลองอีกครั้ง", + "mcp.auth.retry_now": "ลองอีกครั้งทันที", + "mcp.auth.server_disabled": "MCP server นี้ถูกปิดใช้งาน เปิดใช้งานแล้วลองอีกครั้ง", + "mcp.auth.step1_description": "เราจะเปิดขั้นตอนเข้าสู่ระบบของ {server} โดยอัตโนมัติ", + "mcp.auth.step1_title": "กำลังเปิดเบราว์เซอร์", + "mcp.auth.step2_description": "เข้าสู่ระบบและอนุมัติการเข้าถึงเมื่อมีการแจ้ง", + "mcp.auth.step2_title": "อนุมัติ OpenWork", + "mcp.auth.step3_description": "เราจะเชื่อมต่อให้เสร็จทันทีที่การอนุมัติเสร็จสิ้น", + "mcp.auth.step3_title": "กลับมาที่นี่เมื่อเสร็จแล้ว", + "mcp.auth.try_reload_engine": "{message} ลองรีโหลด engine ก่อน", + "mcp.auth.waiting_authorization": "กำลังรอการอนุมัติในเบราว์เซอร์ของคุณ...", + "mcp.auth.waiting_for_conversation_body": "เราจะนำคุณไปยืนยันตัวตนโดยเร็วที่สุด", + "mcp.auth.waiting_for_conversation_title": "กำลังรอให้บทสนทนาเสร็จสิ้น", + "mcp.auth.waiting_for_session": "กำลังรอให้ {session} ทำงานเสร็จ", + "mcp.available_apps": "แอปที่ใช้ได้", + "mcp.cap_signin": "เข้าสู่ระบบบัญชี", + "mcp.cap_tools": "เครื่องมือ AI", + "mcp.config_file": "ไฟล์ config", + "mcp.config_load_failed": "ไม่สามารถโหลดไฟล์ config", + "mcp.config_not_loaded": "ยังไม่ได้โหลด", + "mcp.config_source": "จากไฟล์ config", + "mcp.configured": "ตั้งค่าแล้ว", + "mcp.connect": "เชื่อมต่อ", + "mcp.connect_failed": "เชื่อมต่อไม่สำเร็จ ลองอีกครั้ง", + "mcp.connect_server_first": "เชื่อมต่อเซิร์ฟเวอร์ก่อน", + "mcp.connected": "เชื่อมต่อแล้ว", + "mcp.connected_badge": "เชื่อมต่อแล้ว", + "mcp.connecting": "กำลังเชื่อมต่อ...", + "mcp.connection_failed": "มีปัญหาการเชื่อมต่อ — ลองอีกครั้ง", + "mcp.connection_type": "การเชื่อมต่อ", + "mcp.control_chrome_browser_hint": "ใน Chrome 144 หรือใหม่กว่า ทำสิ่งนี้ก่อน:", + "mcp.control_chrome_browser_step_one": "เปิด chrome://inspect/#remote-debugging", + "mcp.control_chrome_browser_step_two": "เปิดใช้งาน remote debugging", + "mcp.control_chrome_browser_step_three": "อนุญาตการเชื่อมต่อ debugging ขาเข้าเมื่อ Chrome ถาม", + "mcp.control_chrome_browser_title": "1. เปิดการเข้าถึง Chrome", + "mcp.control_chrome_connect": "เพิ่ม Control Chrome", + "mcp.control_chrome_docs": "คู่มือ MCP อย่างเป็นทางการ", + "mcp.control_chrome_edit": "แก้ไขการตั้งค่า", + "mcp.control_chrome_profile_hint": "Control Chrome ปกติจะเปิดโปรไฟล์ Chrome แยก เปิดตัวเลือกนี้หากต้องการให้ OpenWork ใช้หน้าต่าง Chrome ที่เปิดอยู่", + "mcp.control_chrome_profile_title": "2. เลือก Chrome ที่จะใช้", + "mcp.control_chrome_save": "บันทึกการตั้งค่า", + "mcp.control_chrome_setup_subtitle": "เปิดการเข้าถึง Chrome แล้วเลือกว่า OpenWork ควรใช้โปรไฟล์ใหม่หรือแนบกับ Chrome ที่คุณใช้อยู่", + "mcp.control_chrome_setup_title": "ตั้งค่า Control Chrome", + "mcp.control_chrome_toggle_hint": "เมื่อเปิดใช้งาน OpenWork จะเพิ่ม --autoConnect เพื่อให้ MCP แนบกับ Chrome ที่คุณเริ่มไว้แล้ว", + "mcp.control_chrome_toggle_label": "ใช้โปรไฟล์ Chrome ที่มีอยู่", + "mcp.control_chrome_toggle_off": "OpenWork จะเปิดโปรไฟล์ Chrome แยกสำหรับ automation", + "mcp.control_chrome_toggle_on": "OpenWork จะใช้แท็บ, คุกกี้ และข้อมูลเข้าสู่ระบบปัจจุบันของคุณ", + "mcp.custom_app_cta_hint": "เชื่อมต่อ MCP server, เครื่องมือภายใน หรือแอปที่โฮสต์ของคุณเอง", + "mcp.desktop_required": "แอปต้องใช้แอปเดสก์ท็อป", + "mcp.docs_link": "เรียนรู้เพิ่มเติม", + "mcp.file_not_found": "ยังไม่ได้สร้างไฟล์ config", + "mcp.finish_setup": "เกือบเสร็จแล้ว", + "mcp.finish_setup_hint": "แตะ เปิดใช้งาน เพื่อเชื่อมต่อแอปให้เสร็จ", + "mcp.friendly_status_issue": "มีปัญหา", + "mcp.friendly_status_needs_signin": "ต้องเข้าสู่ระบบ", + "mcp.friendly_status_offline": "ออฟไลน์", + "mcp.friendly_status_paused": "หยุดชั่วคราว", + "mcp.friendly_status_ready": "พร้อม", + "mcp.last_synced": "ซิงค์แล้ว", + "mcp.login_action": "เข้าสู่ระบบ", + "mcp.login_hint": "เชื่อมต่อบัญชีของคุณเพื่อตั้งค่าแอปนี้ให้เสร็จ", + "mcp.login_unavailable": "แอปนี้ไม่รองรับการเข้าสู่ระบบจาก OpenWork", + "mcp.logout_action": "ออกจากระบบ", + "mcp.logout_failed": "ออกจากระบบไม่สำเร็จ", + "mcp.logout_hint": "ลบข้อมูล OAuth ที่เก็บไว้ คุณจะต้องเข้าสู่ระบบอีกครั้ง", + "mcp.logout_label": "OAuth", + "mcp.logout_modal_message": "การดำเนินการนี้จะลบข้อมูล OAuth ที่เก็บไว้สำหรับ {server} คุณจะต้องเข้าสู่ระบบอีกครั้งเพื่อใช้แอปนี้", + "mcp.logout_modal_title": "ออกจากระบบแอปนี้?", + "mcp.logout_success": "ออกจากระบบ {server} แล้ว", + "mcp.logout_working": "กำลังออกจากระบบ...", + "mcp.name_required": "ใส่ชื่อเซิร์ฟเวอร์", + "mcp.no_apps_hint": "เชื่อมต่อแอปด้านบนเพื่อเริ่มต้น", + "mcp.no_apps_yet": "ยังไม่มีแอปที่เชื่อมต่อ", + "mcp.oauth": "เข้าสู่ระบบ", + "mcp.oauth_optional_hint": "ใช้ OAuth ในเบราว์เซอร์เพื่อเชื่อมต่อบัญชีของคุณ", + "mcp.oauth_optional_label": "แอปนี้ต้องเข้าสู่ระบบ", + "mcp.one_click_connect": "เชื่อมต่อด้วยคลิกเดียว", + "mcp.open_file": "เปิดไฟล์", + "mcp.opening_label": "กำลังเปิด...", + "mcp.pick_workspace_error": "เลือกโฟลเดอร์พื้นที่ทำงานก่อน", + "mcp.pick_workspace_first": "เลือกโฟลเดอร์พื้นที่ทำงานก่อน", + "mcp.quick_connect_chrome_desc": "ควบคุมแท็บ Chrome ด้วย browser automation", + "mcp.quick_connect_chrome_title": "ควบคุม Chrome", + "mcp.quick_connect_context7_desc": "ค้นหาเอกสารผลิตภัณฑ์ด้วยบริบทที่สมบูรณ์ยิ่งขึ้น", + "mcp.quick_connect_context7_title": "Context7", + "mcp.quick_connect_linear_desc": "วางแผน sprint และจัดการ ticket ได้เร็วขึ้น", + "mcp.quick_connect_linear_title": "Linear", + "mcp.quick_connect_notion_desc": "ซิงค์หน้า ฐานข้อมูล และเอกสารโปรเจกต์", + "mcp.quick_connect_notion_title": "Notion", + "mcp.quick_connect_sentry_desc": "ติดตามรีลีสและแก้ไขข้อผิดพลาดใน production", + "mcp.quick_connect_sentry_title": "Sentry", + "mcp.quick_connect_stripe_desc": "ตรวจสอบการชำระเงิน ใบแจ้งหนี้ และการสมัครสมาชิก", + "mcp.quick_connect_stripe_title": "Stripe", + "mcp.reload_banner_blocked_hint": "หยุดงานที่กำลังทำงานเพื่อเปิดใช้งาน", + "mcp.reload_banner_description": "แตะ เปิดใช้งาน เพื่อเชื่อมต่อแอปให้เสร็จ", + "mcp.reload_banner_description_blocked": "มีงานกำลังทำงานอยู่ หยุดก่อน แล้วเปิดใช้งาน", + "mcp.remote_workspace_url_hint": "Remote workers เชื่อมต่อได้เร็วที่สุดกับ MCP server แบบ URL", + "mcp.remove_app": "ลบ", + "mcp.remove_failed": "ลบแอปไม่สำเร็จ", + "mcp.remove_modal_message": "คุณแน่ใจหรือไม่ว่าต้องการลบ {server}? คุณสามารถเพิ่มกลับได้ในภายหลัง", + "mcp.remove_modal_title": "ลบแอป", + "mcp.reveal_config_failed": "ไม่สามารถเปิดไฟล์ config", + "mcp.reveal_in_finder": "เปิดในตัวจัดการไฟล์", + "mcp.scope_global": "ทุกพื้นที่ทำงาน", + "mcp.scope_project": "พื้นที่ทำงานนี้", + "mcp.server_command": "คำสั่ง", + "mcp.server_command_hint": "คำสั่ง shell สำหรับเริ่มเซิร์ฟเวอร์", + "mcp.server_command_placeholder": "npx -y @modelcontextprotocol/server-sequential-thinking", + "mcp.server_name": "ชื่อแอป", + "mcp.server_name_placeholder": "github-copilot", + "mcp.server_type": "ประเภท", + "mcp.server_url": "URL ของเซิร์ฟเวอร์", + "mcp.server_url_placeholder": "https://api.githubcopilot.com/mcp/", + "mcp.sign_in_section_label": "การเข้าสู่ระบบ", + "mcp.tap_to_connect": "แตะเพื่อเชื่อมต่อ", + "mcp.technical_details": "รายละเอียดทางเทคนิค", + "mcp.type_cloud": "Cloud (เข้าสู่ระบบด้วยบัญชีของคุณ)", + "mcp.type_local": "ภายในเครื่อง (ทำงานบนอุปกรณ์นี้)", + "mcp.type_local_cmd": "ภายในเครื่อง (คำสั่ง)", + "mcp.type_remote": "ระยะไกล (URL)", + "mcp.url_or_command_required": "ใส่ URL สำหรับระยะไกล หรือคำสั่งสำหรับเซิร์ฟเวอร์ภายในเครื่อง", + "mcp.your_apps": "แอปของคุณ", + "message.tool_request_label": "คำขอ", + "message.tool_result_label": "ผลลัพธ์", + "message.waiting_subagent": "กำลังรอ transcript ของ subagent", + "message_list.copy_message": "คัดลอกข้อความ", + "message_list.open_session": "เปิดเซสชัน", + "message_list.step_updates_progress": "อัปเดตความคืบหน้า", + "message_list.subagent_loading_transcript": "กำลังโหลด transcript", + "message_list.subagent_message_count": "{count} ข้อความ", + "message_list.subagent_running": "กำลังทำงาน", + "message_list.subagent_session_fallback": "เซสชัน Subagent", + "message_list.subagent_type_task": "งาน {agentType}", + "message_list.subagent_waiting_transcript": "กำลังรอ transcript", + "message_list.tool_checked_url": "ตรวจสอบ {url}", + "message_list.tool_checked_web_fallback": "ตรวจสอบหน้าเว็บ", + "message_list.tool_delegate_agent": "มอบหมาย {agent}", + "message_list.tool_delegate_task_fallback": "มอบหมายงาน", + "message_list.tool_load_skill_fallback": "โหลด skill", + "message_list.tool_load_skill_named": "โหลด skill {name}", + "message_list.tool_read_todo": "อ่านรายการสิ่งที่ต้องทำ", + "message_list.tool_reviewed_file": "ตรวจสอบ {file}", + "message_list.tool_reviewed_file_fallback": "ตรวจสอบไฟล์", + "message_list.tool_reviewed_files_fallback": "ตรวจสอบไฟล์", + "message_list.tool_reviewed_path": "ตรวจสอบ {path}", + "message_list.tool_run_command": "รัน {command}", + "message_list.tool_run_command_fallback": "รันคำสั่ง", + "message_list.tool_searched_code_fallback": "ค้นหาโค้ด", + "message_list.tool_searched_pattern": "ค้นหา {pattern}", + "message_list.tool_update_file": "อัปเดต {file}", + "message_list.tool_update_file_fallback": "อัปเดตไฟล์", + "message_list.tool_update_todo": "อัปเดตรายการสิ่งที่ต้องทำ", + "message_list.tool_updated_file": "อัปเดต {file}", + "message_list.tool_updated_file_fallback": "อัปเดตไฟล์", + "model_behavior.desc_builtin": "โมเดลนี้กำหนดเส้นทางการใช้เหตุผลเองและไม่แสดงโปรไฟล์ที่นี่", + "model_behavior.desc_generic": "ใช้โปรไฟล์ {label}", + "model_behavior.desc_high": "ใช้เวลามากขึ้นในการใช้เหตุผลก่อนตอบ", + "model_behavior.desc_high_anthropic": "ใช้งบประมาณ extended thinking มาตรฐาน", + "model_behavior.desc_low": "ใช้การใช้เหตุผลเบาก่อนตอบ", + "model_behavior.desc_low_google": "ใช้งบประมาณการใช้เหตุผลเบาขึ้นเพื่อตอบสนองเร็วขึ้น", + "model_behavior.desc_max": "ใช้โปรไฟล์การใช้เหตุผลที่ลึกที่สุดของ provider", + "model_behavior.desc_max_anthropic": "ใช้งบประมาณ extended thinking สูงสุดที่มี", + "model_behavior.desc_medium": "สมดุลระหว่างความเร็วและความลึกของการใช้เหตุผล", + "model_behavior.desc_minimal": "ใช้การใช้เหตุผลเพียงเล็กน้อย", + "model_behavior.desc_none": "ให้ความสำคัญกับความเร็วด้วยเส้นทางการใช้เหตุผลเบาที่สุด", + "model_behavior.desc_standard": "โมเดลนี้ไม่มีการควบคุมการใช้เหตุผลเพิ่มเติม", + "model_behavior.label_balanced": "สมดุล", + "model_behavior.label_builtin": "ในตัว", + "model_behavior.label_deep": "ลึก", + "model_behavior.label_extended": "ขยาย", + "model_behavior.label_fast": "เร็ว", + "model_behavior.label_light": "เบา", + "model_behavior.label_maximum": "สูงสุด", + "model_behavior.label_quick": "รวดเร็ว", + "model_behavior.label_standard": "มาตรฐาน", + "model_behavior.title_builtin_reasoning": "การใช้เหตุผลในตัว", + "model_behavior.title_extended_thinking": "Extended thinking", + "model_behavior.title_reasoning_budget": "งบประมาณการใช้เหตุผล", + "model_behavior.title_reasoning_effort": "ระดับการใช้เหตุผล", + "model_behavior.title_standard_generation": "การสร้างแบบมาตรฐาน", + "model_picker.chat_model_desc": "เลือกโมเดลสำหรับแชทนี้ หากโมเดลรองรับ reasoning profiles ให้ตั้งค่าบนการ์ดของโมเดล", + "model_picker.chat_model_title": "โมเดลแชท", + "model_picker.connect_provider_hint": "เชื่อมต่อผู้ให้บริการนี้เพื่อเรียกดูและบันทึกโมเดล", + "model_picker.default_model_desc": "เลือกโมเดลเริ่มต้นสำหรับแชทใหม่ แล้วปรับ reasoning profiles บนการ์ดก่อนกด เสร็จสิ้น", + "model_picker.default_model_title": "โมเดลเริ่มต้น", + "model_picker.model_count": "{count} โมเดล", + "model_picker.model_count_one": "1 โมเดล", + "model_picker.more_providers": "ผู้ให้บริการเพิ่มเติม", + "model_picker.no_results": "ไม่พบโมเดลที่ตรงกับการค้นหา", + "model_picker.other_connected_models": "โมเดลที่เชื่อมต่ออื่นๆ", + "model_picker.recommended": "แนะนำ", + "onboarding.access_label": "การเข้าถึง", + "onboarding.add": "เพิ่ม", + "onboarding.add_folder_path": "เพิ่มเส้นทางโฟลเดอร์", + "onboarding.advanced_settings": "การตั้งค่าขั้นสูง", + "onboarding.attach": "เชื่อมต่อ", + "onboarding.attach_description": "เชื่อมต่อกับเซสชันที่มีอยู่บนอุปกรณ์นี้", + "onboarding.authorize_folder": "อนุญาตโฟลเดอร์", + "onboarding.back": "กลับ", + "onboarding.checking_cli": "กำลังตรวจสอบ OpenCode CLI...", + "onboarding.choose_workspace_folder": "เลือกโฟลเดอร์พื้นที่ทำงาน", + "onboarding.cli_checking": "กำลังตรวจสอบการติดตั้ง...", + "onboarding.cli_install_commands": "ติดตั้ง OpenCode ด้วยคำสั่งด้านล่าง แล้วรีสตาร์ท OpenWork", + "onboarding.cli_label": "OpenCode CLI", + "onboarding.cli_needs_update": "OpenCode CLI ต้องอัปเดตสำหรับ serve", + "onboarding.cli_not_found": "ไม่พบ OpenCode CLI", + "onboarding.cli_not_found_hint": "ไม่พบ ติดตั้งเพื่อรัน local server", + "onboarding.cli_ready": "OpenCode CLI พร้อมใช้งาน", + "onboarding.cli_recheck": "ตรวจสอบใหม่", + "onboarding.cli_version": "OpenCode {version}", + "onboarding.cli_version_installed": "ติดตั้งแล้ว", + "onboarding.create_first_workspace": "สร้างพื้นที่ทำงานแรกของคุณ", + "onboarding.create_workspace": "สร้างพื้นที่ทำงาน", + "onboarding.engine_running": "Engine กำลังทำงานอยู่แล้ว", + "onboarding.folders_allowed": "อนุญาต {count} โฟลเดอร์", + "onboarding.getting_ready": "กำลังเตรียมทุกอย่าง", + "onboarding.install": "ติดตั้ง OpenCode", + "onboarding.install_instruction": "ติดตั้ง OpenCode เพื่อเปิดใช้งาน local server (ไม่ต้องใช้ terminal)", + "onboarding.last_checked": "ตรวจสอบล่าสุด {time}", + "onboarding.manage_access_hint": "คุณสามารถจัดการการเข้าถึงในการตั้งค่าขั้นสูง", + "onboarding.open_settings": "เปิดการตั้งค่า", + "onboarding.open_settings_hint": "ต้องการตัวเลือก engine หรือการเข้าถึง? เปิดการตั้งค่า", + "onboarding.pick": "เลือก", + "onboarding.ready_message": "OpenCode พร้อมเริ่ม local server", + "onboarding.remember_choice": "จดจำตัวเลือกสำหรับครั้งถัดไป", + "onboarding.remote_workspace_action": "เชื่อมต่อ", + "onboarding.remote_workspace_card_description": "เชื่อมต่อ OpenWork server เพื่อเข้าถึงพื้นที่ทำงานที่แชร์", + "onboarding.remote_workspace_card_title": "เชื่อมต่อพื้นที่ทำงานระยะไกล", + "onboarding.remote_workspace_description": "เชื่อมต่อ OpenWork server เพื่อเข้าถึงพื้นที่ทำงานจากที่ใดก็ได้", + "onboarding.remote_workspace_title": "เชื่อมต่อ OpenWork server", + "onboarding.remove": "ลบ", + "onboarding.resolved_path": "เส้นทางที่ resolve", + "onboarding.run_local": "รันภายในเครื่อง", + "onboarding.run_local_description": "OpenWork รัน OpenCode ภายในเครื่องและเก็บงานของคุณเป็นส่วนตัว", + "onboarding.search_notes": "บันทึกการค้นหา", + "onboarding.searching_host": "กำลังเชื่อมต่อ OpenWork server...", + "onboarding.serve_help": "ผลลัพธ์ serve --help", + "onboarding.show_search_notes": "แสดงบันทึกการค้นหา", + "onboarding.start": "เริ่ม OpenWork", + "onboarding.starting_host": "กำลังเริ่ม OpenWork server...", + "onboarding.theme_current": "ปัจจุบัน: {mode}", + "onboarding.theme_dark": "มืด", + "onboarding.theme_label": "ธีม", + "onboarding.theme_light": "สว่าง", + "onboarding.theme_system": "ตามระบบ", + "onboarding.verifying": "กำลังตรวจสอบ secure handshake", + "onboarding.version": "เวอร์ชัน", + "onboarding.welcome_title": "วันนี้คุณต้องการรัน OpenWork อย่างไร?", + "onboarding.windows_install_instruction": "ติดตั้ง OpenCode สำหรับ Windows แล้วรีสตาร์ท OpenWork ตรวจสอบว่า opencode.exe อยู่ใน PATH", + "onboarding.workspace_folder_label": "พื้นที่ทำงานคือโฟลเดอร์ที่มี skills, plugins และ commands เป็นของตนเอง", + "plugins.add": "เพิ่ม", + "plugins.add_hint": "เพิ่มชื่อแพ็กเกจ npm เช่น opencode-wakatime", + "plugins.add_label": "เพิ่ม plugin", + "plugins.added": "เพิ่มแล้ว", + "plugins.config": "การตั้งค่า", + "plugins.config_label": "การตั้งค่า", + "plugins.desc": "จัดการ `opencode.json` สำหรับโปรเจกต์หรือ OpenCode plugins ทั่วไป", + "plugins.empty": "ยังไม่มี plugins ที่ตั้งค่า", + "plugins.enabled": "เปิดใช้งาน", + "plugins.hide_setup": "ซ่อนการตั้งค่า", + "plugins.not_loaded": "ยังไม่ได้โหลด", + "plugins.not_loaded_yet": "ยังไม่ได้โหลด", + "plugins.remove": "ลบ", + "plugins.scheduler_desc": "รันงานตามกำหนดด้วย OpenCode scheduler plugin", + "plugins.scope_global": "ทั่วไป", + "plugins.scope_project": "โปรเจกต์", + "plugins.setup": "ตั้งค่า", + "plugins.suggested": "Plugins ที่แนะนำ", + "plugins.suggested_heading": "Plugins ที่แนะนำ", + "plugins.title": "OpenCode plugins", + "providers.api_key_label": "API key", + "providers.api_key_required": "ต้องใส่ API key", + "providers.auth_failed": "การยืนยันตัวตนล้มเหลว", + "providers.connect_failed": "เชื่อมต่อผู้ให้บริการไม่สำเร็จ", + "providers.disabled_in_config_suffix": "และปิดใช้งานใน OpenCode config แล้ว", + "providers.disconnect_failed": "ตัดการเชื่อมต่อผู้ให้บริการไม่สำเร็จ", + "providers.disconnected_prefix": "ตัดการเชื่อมต่อแล้ว", + "providers.load_failed": "โหลดผู้ให้บริการไม่สำเร็จ", + "providers.no_oauth_prefix": "ไม่มีขั้นตอน OAuth สำหรับ", + "providers.no_providers_available": "ไม่มีผู้ให้บริการที่ใช้ได้", + "providers.not_connected": "ไม่ได้เชื่อมต่อกับเซิร์ฟเวอร์", + "providers.not_oauth_flow_prefix": "วิธีการยืนยันตัวตนที่เลือกไม่ใช่ OAuth flow สำหรับ", + "providers.oauth_failed": "ดำเนินการ OAuth ไม่สำเร็จ", + "providers.oauth_method_required": "ต้องใช้วิธี OAuth", + "providers.provider_error": "ข้อผิดพลาดของผู้ให้บริการ ({provider})", + "providers.provider_id_required": "ต้องใส่ Provider ID", + "providers.rate_limit_exceeded": "เกินขีดจำกัดอัตราการใช้งาน", + "providers.removal_unsupported": "Client นี้ไม่รองรับการลบการยืนยันตัวตนของผู้ให้บริการ", + "providers.request_failed": "คำขอล้มเหลว", + "providers.save_api_key_failed": "บันทึก API key ไม่สำเร็จ", + "providers.still_connected_suffix": " แต่ worker ยังรายงานว่าเชื่อมต่ออยู่ ล้าง API key หรือข้อมูล OAuth ที่เหลือแล้วรีสตาร์ท worker เพื่อตัดการเชื่อมต่อทั้งหมด", + "providers.unknown_provider": "ผู้ให้บริการที่ไม่รู้จัก", + "providers.use_api_key_suffix": "ใช้ API key แทน", + "question_modal.custom_answer_label": "หรือพิมพ์คำตอบเอง", + "question_modal.custom_answer_placeholder": "พิมพ์คำตอบที่นี่...", + "question_modal.question_counter": "คำถามที่ {current} จาก {total}", + "scheduled.at_time": "เวลา {time}", + "scheduled.badge_end_of_day": "สิ้นวัน", + "scheduled.badge_every_few_hours": "ทุก 2-3 ชั่วโมง", + "scheduled.badge_friday_wrapup": "สรุปวันศุกร์", + "scheduled.badge_weekday_evening": "ค่ำวันทำงาน", + "scheduled.badge_weekday_morning": "เช้าวันทำงาน", + "scheduled.badge_weekend_review": "ทบทวนสุดสัปดาห์", + "scheduled.create_button": "สร้าง", + "scheduled.create_desc": "ระบบออโตเมชั่นทำงานตามกำหนดโดยรันพรอมต์ในเธรดใหม่ เราจะเตรียมพรอมต์ให้คุณส่ง", + "scheduled.create_title": "สร้างออโตเมชั่น", + "scheduled.created_prefix": "สร้างเมื่อ", + "scheduled.custom_schedule": "กำหนดเวลาเอง", + "scheduled.daily_mode": "รายวัน", + "scheduled.day_fri": "ศ.", + "scheduled.day_mon": "จ.", + "scheduled.day_sat": "ส.", + "scheduled.day_sun": "อา.", + "scheduled.day_thu": "พฤ.", + "scheduled.day_tue": "อ.", + "scheduled.day_wed": "พ.", + "scheduled.days_at": "{days} เวลา {time}", + "scheduled.default_automation_name": "สแกนบั๊กรายวัน", + "scheduled.delete_confirm_desc": "การดำเนินการนี้จะลบกำหนดเวลาและลบ job จาก {source}", + "scheduled.delete_confirm_title": "ลบออโตเมชั่น?", + "scheduled.delete_error_fallback": "ลบ job ไม่สำเร็จ", + "scheduled.delete_label": "ลบ", + "scheduled.deleting": "กำลังลบ", + "scheduled.desktop_required": "งานตามกำหนดเวลาต้องใช้แอปเดสก์ท็อป", + "scheduled.empty_hint": "ยังไม่มีออโตเมชั่น เลือกเทมเพลตหรือสร้างพรอมต์ออโตเมชั่นของคุณเอง", + "scheduled.every_day_at": "ทุกวัน เวลา {time}", + "scheduled.every_hour": "ทุกชั่วโมง", + "scheduled.every_n_hours": "ทุก {interval} ชั่วโมง", + "scheduled.every_prefix": "ทุก", + "scheduled.explore_more": "สำรวจเพิ่มเติม", + "scheduled.failed_status": "ล้มเหลว", + "scheduled.filter_all": "ทั้งหมด", + "scheduled.filter_scheduled": "ตามกำหนดเวลา", + "scheduled.filter_templates": "เทมเพลต", + "scheduled.hours_suffix": "ชั่วโมง", + "scheduled.install_scheduler": "ติดตั้ง scheduler", + "scheduled.install_scheduler_hint": "ระบบออโตเมชั่นทำงานผ่าน opencode-scheduler plugin เพิ่มลงในพื้นที่ทำงานนี้เพื่อเปิดใช้งาน", + "scheduled.install_scheduler_title": "ติดตั้ง scheduler เพื่อปลดล็อกออโตเมชั่น", + "scheduled.installing": "กำลังติดตั้ง...", + "scheduled.interval_mode": "ช่วงเวลา", + "scheduled.last_run_prefix": "รันล่าสุด", + "scheduled.last_updated_prefix": "อัปเดตล่าสุด", + "scheduled.name_label": "ชื่อ", + "scheduled.never": "ไม่เคย", + "scheduled.new_automation": "ออโตเมชั่นใหม่", + "scheduled.no_automations_match": "ไม่พบออโตเมชั่นที่ตรงกับการค้นหา", + "scheduled.no_templates_match": "ไม่พบเทมเพลตที่ตรงกับการค้นหา", + "scheduled.not_run_yet": "ยังไม่ได้รัน", + "scheduled.not_synced_yet": "ยังไม่ได้ซิงค์", + "scheduled.page_description": "กำหนดเวลางานที่เกิดซ้ำสำหรับ worker นี้ ตรวจสอบงานที่ลงทะเบียนไว้ และเริ่มจากเทมเพลตที่ใช้ซ้ำได้", + "scheduled.prepare_error_fallback": "เตรียมออโตเมชั่นในแชทไม่สำเร็จ", + "scheduled.prepared_automation_in_chat": "เตรียมออโตเมชั่นในแชทแล้ว", + "scheduled.prepared_job_in_chat": "เตรียม {name} ในแชทแล้ว", + "scheduled.quick_start_templates": "เทมเพลตเริ่มต้นด่วน", + "scheduled.quick_start_templates_desc": "เริ่มจาก workflow ที่ผ่านการทดสอบมาแล้ว แล้วปรับพรอมต์ก่อนเตรียมในแชท", + "scheduled.refreshing": "กำลังรีเฟรช", + "scheduled.reload_activate_hint": "OpenCode โหลด plugins ตอนเริ่มต้น รีโหลด OpenWork เพื่อเปิดใช้งาน opencode-scheduler", + "scheduled.reload_activate_title": "รีโหลด OpenWork เพื่อเปิดใช้งานออโตเมชั่น", + "scheduled.reload_openwork": "รีโหลด OpenWork", + "scheduled.reloading": "กำลังรีโหลด...", + "scheduled.removed_job": "ลบ {name} แล้ว", + "scheduled.run_label": "รัน", + "scheduled.running_status": "กำลังทำงาน", + "scheduled.schedule_label": "กำหนดเวลา", + "scheduled.scheduler_install_requested": "ขอติดตั้ง scheduler แล้ว", + "scheduled.search_placeholder": "ค้นหาออโตเมชั่นหรือเทมเพลต", + "scheduled.source_local": "จาก scheduler ภายในเครื่อง", + "scheduled.source_remote": "จาก OpenWork server", + "scheduled.subtitle_local": "ออโตเมชั่นที่ทำงานตามกำหนดเวลาจากอุปกรณ์นี้", + "scheduled.subtitle_remote": "ออโตเมชั่นที่ทำงานตามกำหนดเวลาจาก OpenWork server ที่เชื่อมต่อ", + "scheduled.success_status": "สำเร็จ", + "scheduled.task_summary_no_prompt": "ไม่พบพรอมต์หรือคำสั่ง", + "scheduled.task_summary_prompt": "พรอมต์", + "scheduled.template_badge": "เทมเพลต", + "scheduled.template_count": "{count} เทมเพลต", + "scheduled.title": "ระบบออโตเมชั่น", + "scheduled.tpl_daily_planning_desc": "สร้างแผนที่มุ่งเน้นจากงานและปฏิทินของคุณ", + "scheduled.tpl_daily_planning_name": "สรุปการวางแผนรายวัน", + "scheduled.tpl_habit_checkin_desc": "ตรวจสอบความรับผิดชอบอย่างรวดเร็วตลอดวัน", + "scheduled.tpl_habit_checkin_name": "เช็คอินนิสัย", + "scheduled.tpl_inbox_zero_desc": "สรุปข้อความที่ยังไม่ได้อ่านและร่างคำตอบสั้นๆ", + "scheduled.tpl_inbox_zero_name": "ตัวช่วย inbox zero", + "scheduled.tpl_learning_digest_desc": "เปลี่ยนลิงก์และบันทึกที่บันทึกไว้เป็นสรุปรายสัปดาห์", + "scheduled.tpl_learning_digest_name": "สรุปการเรียนรู้", + "scheduled.tpl_meeting_prep_desc": "สร้างจุดเตรียมตัวสำหรับการประชุมวันพรุ่งนี้", + "scheduled.tpl_meeting_prep_name": "โน้ตเตรียมการประชุม", + "scheduled.tpl_weekly_wins_desc": "สร้างสรุปวันศุกร์ของสิ่งที่สำเร็จ อุปสรรค และขั้นตอนถัดไป", + "scheduled.tpl_weekly_wins_name": "สรุปความสำเร็จรายสัปดาห์", + "scheduled.view_scheduler_docs": "ดูเอกสาร scheduler", + "scheduled.weekdays_at": "วันทำงาน เวลา {time}", + "scheduled.weekends_at": "สุดสัปดาห์ เวลา {time}", + "scheduled.worker_root_hint": "Worker root อ้างอิงจากพื้นที่ทำงานที่เลือก", + "scheduled.your_automations": "ออโตเมชั่นของคุณ", + "session.allow_for_session": "อนุญาตตลอดเซสชัน", + "session.allow_once": "ครั้งเดียว", + "session.api_key_saved": "บันทึก API key แล้ว", + "session.attachments_add_token": "เพิ่มโทเค็นเซิร์ฟเวอร์เพื่อแนบไฟล์", + "session.attachments_connect_server": "เชื่อมต่อ OpenWork server เพื่อแนบไฟล์", + "session.back": "กลับ", + "session.close_quick_actions": "ปิดการดำเนินการด่วน", + "session.close_search": "ปิดการค้นหา", "session.cmd_compact_detail": "ส่งคำสั่งบีบอัดไปยัง OpenCode สำหรับเซสชันนี้", "session.cmd_compact_detail_empty": "ยังไม่มีข้อความผู้ใช้ที่จะบีบอัด", "session.cmd_compact_meta": "บีบอัด", - "session.cmd_sessions_title": "ค้นหาเซสชัน", - "session.cmd_sessions_meta": "ข้าม", - "session.cmd_model_title": "เปลี่ยนโมเดล", - "session.cmd_model_meta": "เปิด", + "session.cmd_compact_title": "บีบอัดบทสนทนา", + "session.cmd_current_workspace": "พื้นที่ทำงานปัจจุบัน", + "session.cmd_model_detail": "{model} · {variant}", "session.cmd_model_fallback": "โมเดล", - "session.cmd_provider_title": "เชื่อมต่อผู้ให้บริการ", + "session.cmd_model_meta": "เปิด", + "session.cmd_model_title": "เปลี่ยนโมเดล", + "session.cmd_new_session_detail": "เริ่มงานใหม่ในพื้นที่ทำงานปัจจุบัน", + "session.cmd_new_session_meta": "สร้าง", + "session.cmd_new_session_title": "สร้างเซสชันใหม่", "session.cmd_provider_detail": "เปิดขั้นตอนเชื่อมต่อผู้ให้บริการ", "session.cmd_provider_meta": "เปิด", - "session.cmd_current_workspace": "พื้นที่ทำงานปัจจุบัน", + "session.cmd_provider_title": "เชื่อมต่อผู้ให้บริการ", + "session.cmd_rename_detail_fallback": "ตั้งชื่อเซสชันที่เลือกให้ชัดเจนขึ้น", + "session.cmd_rename_meta": "เปลี่ยนชื่อ", + "session.cmd_rename_title": "เปลี่ยนชื่อเซสชันปัจจุบัน", + "session.cmd_sessions_detail": "{count} เซสชันที่ใช้ได้ข้ามพื้นที่ทำงาน", + "session.cmd_sessions_meta": "ข้าม", + "session.cmd_sessions_title": "ค้นหาเซสชัน", "session.cmd_switch": "สลับ", - "session.palette_title_sessions": "ค้นหาเซสชัน", - "session.palette_title_actions": "การดำเนินการด่วน", - "session.palette_placeholder_sessions": "ค้นหาตามชื่อเซสชันหรือพื้นที่ทำงาน", - "session.palette_placeholder_actions": "ค้นหาการดำเนินการ", - "session.search_placeholder": "ค้นหาในแชทนี้", - "session.search_prev": "ก่อนหน้า", - "session.search_next": "ถัดไป", - "session.undo_label": "ย้อนกลับ", - "session.redo_label": "ทำซ้ำ", - "session.loading_title": "กำลังโหลดเซสชัน", - "session.loading_detail": "กำลังดึงข้อความล่าสุดสำหรับงานนี้", - "session.workspace_setup_label": "ตั้งค่าพื้นที่ทำงาน", - "session.workspace_setup_title": "ตั้งค่าพื้นที่ทำงานแรกของคุณ", - "session.workspace_setup_desc": "เริ่มด้วยพื้นที่ทำงาน OpenWork แบบมีคำแนะนำ หรือเลือกโฟลเดอร์ที่มีอยู่ที่ต้องการทำงาน", - "session.create_workspace_title": "สร้างพื้นที่ทำงาน", + "session.compacted": "บีบอัดเซสชันแล้ว", + "session.compacting": "กำลังบีบอัดบริบทเซสชัน...", + "session.compacting_auto": "OpenCode กำลังบีบอัดเซสชันนี้โดยอัตโนมัติ", + "session.compacting_manual": "OpenCode กำลังบีบอัดเซสชันนี้", + "session.compaction_finished": "OpenCode บีบอัดบริบทเซสชันเสร็จแล้ว", + "session.compaction_started": "OpenCode เริ่มบีบอัดบริบทเซสชัน", + "session.conflict_sync_toast": "เกิดความขัดแย้งในการซิงค์ {path} บันทึกการเปลี่ยนแปลงในเครื่องไปที่ {conflictPath}", + "session.connect_failed": "เชื่อมต่อไม่สำเร็จ", + "session.connect_to_sync": "เชื่อมต่อ OpenWork server เพื่อซิงค์ไฟล์ระยะไกล", + "session.create_or_connect_workspace": "สร้างหรือเชื่อมต่อพื้นที่ทำงาน", "session.create_workspace_desc": "เปิดตัวสร้างพื้นที่ทำงานและเลือกวิธีเริ่มต้น", - "session.pick_folder_title": "เลือกโฟลเดอร์ที่ต้องการทำงาน", - "session.pick_folder_desc": "เลือกโฟลเดอร์โปรเจกต์หรือบันทึกที่มีอยู่ แล้ว OpenWork จะใช้เป็นพื้นที่ทำงาน", - "session.loading_earlier": "กำลังโหลดข้อความก่อนหน้า...", - "session.load_earlier": "โหลดข้อความก่อนหน้า", - "session.jump_to_start": "ข้ามไปต้นข้อความ", - "session.jump_to_latest": "ข้ามไปล่าสุด", - "session.flyout_new_task": "งานใหม่", - "session.flyout_file_modified": "ไฟล์ถูกแก้ไข", - "session.attachments_add_token": "เพิ่มโทเค็นเซิร์ฟเวอร์เพื่อแนบไฟล์", - "session.attachments_connect_server": "เชื่อมต่อ OpenWork server เพื่อแนบไฟล์", - "session.unable_to_reveal": "ไม่สามารถเปิดพื้นที่ทำงาน", - "session.workspace_path_unavailable": "เส้นทางพื้นที่ทำงานไม่พร้อมใช้งาน", - "session.reveal_desktop_only": "การเปิดในตัวจัดการไฟล์ใช้งานได้เฉพาะในแอปเดสก์ท็อป", - "session.file_open_remote_unavailable": "การเปิดไฟล์ไม่พร้อมใช้งานสำหรับพื้นที่ทำงานระยะไกล", + "session.create_workspace_title": "สร้างพื้นที่ทำงาน", + "session.default_agent": "Agent เริ่มต้น", + "session.default_title": "เซสชันใหม่", + "session.delete": "ลบ", + "session.delete_named_session_message": "การดำเนินการนี้จะลบ \"{title}\" และข้อความทั้งหมดอย่างถาวร", + "session.delete_session_generic": "การดำเนินการนี้จะลบเซสชันที่เลือกและข้อความทั้งหมดอย่างถาวร", + "session.delete_session_title": "ลบเซสชัน?", + "session.deleted": "ลบเซสชันแล้ว", + "session.deleting": "กำลังลบ...", + "session.deny": "ปฏิเสธ", + "session.details": "รายละเอียด", + "session.details_label": "รายละเอียด", + "session.doom_loop_label": "Doom Loop", + "session.doom_loop_message": "OpenCode ตรวจพบการเรียกเครื่องมือซ้ำด้วยข้อมูลเดิมและถามว่าควรดำเนินการต่อหลังจากล้มเหลวซ้ำ", + "session.doom_loop_note": "ปฏิเสธเพื่อหยุดลูป หรืออนุญาตหากต้องการให้ agent ลองต่อ", + "session.doom_loop_repeated_call_label": "การเรียกซ้ำ", + "session.doom_loop_repeated_tool_call": "การเรียกเครื่องมือซ้ำ", + "session.doom_loop_title": "ตรวจพบ Doom Loop", + "session.doom_loop_tool_label": "เครื่องมือ", + "session.downloading": "กำลังดาวน์โหลด", + "session.downloading_percent": "กำลังดาวน์โหลด {percent}%", + "session.downloading_update_title": "กำลังดาวน์โหลดอัปเดต {version}", + "session.export_already_running": "การส่งออกกำลังทำงานอยู่", + "session.export_desktop_only": "การส่งออกใช้งานได้เฉพาะในแอปเดสก์ท็อป", + "session.export_desktop_only_local": "การส่งออกใช้งานได้สำหรับ local workers ในแอปเดสก์ท็อป", + "session.export_local_only": "การส่งออกรองรับเฉพาะ local workers", + "session.failed_to_compact": "บีบอัดเซสชันไม่สำเร็จ", + "session.failed_to_create_session": "สร้างเซสชันไม่สำเร็จ", + "session.failed_to_delete": "ลบเซสชันไม่สำเร็จ", + "session.failed_to_load_agents": "โหลด agents ไม่สำเร็จ", + "session.failed_to_load_providers": "โหลดผู้ให้บริการไม่สำเร็จ", + "session.failed_to_redo": "ทำซ้ำไม่สำเร็จ", + "session.failed_to_save_api_key": "บันทึก API key ไม่สำเร็จ", + "session.failed_to_stop": "หยุดไม่สำเร็จ", + "session.failed_to_undo": "เลิกทำไม่สำเร็จ", "session.file_open_desktop_only": "การเปิดไฟล์ใช้งานได้เฉพาะในแอปเดสก์ท็อป", + "session.file_open_failed": "เปิดไฟล์ไม่สำเร็จ", + "session.file_open_remote_unavailable": "การเปิดไฟล์ไม่พร้อมใช้งานสำหรับพื้นที่ทำงานระยะไกล", + "session.flyout_file_modified": "ไฟล์ถูกแก้ไข", + "session.flyout_new_task": "งานใหม่", + "session.install_update": "ติดตั้งอัปเดต", + "session.jump_to_latest": "ข้ามไปล่าสุด", + "session.jump_to_start": "ข้ามไปต้นข้อความ", + "session.load_earlier": "โหลดข้อความก่อนหน้า", + "session.loading_detail": "กำลังดึงข้อความล่าสุดสำหรับงานนี้", + "session.loading_earlier": "กำลังโหลดข้อความก่อนหน้า...", + "session.loading_session": "กำลังโหลดเซสชัน", + "session.loading_title": "กำลังโหลดเซสชัน", + "session.menu_label": "เมนู", + "session.model": "โมเดล", + "session.model_fallback": "โมเดล", + "session.new_task": "งานใหม่", + "session.next_match": "ผลลัพธ์ถัดไป", + "session.no_matches": "ไม่พบรายการที่ตรงกัน", + "session.no_matches_command": "ไม่พบรายการที่ตรงกัน", + "session.no_session_selected": "ยังไม่ได้เลือกเซสชัน", + "session.nothing_to_compact": "ยังไม่มีสิ่งที่จะบีบอัด", + "session.nothing_to_redo": "ไม่มีสิ่งที่จะทำซ้ำ", + "session.nothing_to_retry": "ยังไม่มีสิ่งที่จะลองใหม่", + "session.nothing_to_undo": "ยังไม่มีสิ่งที่จะเลิกทำ", + "session.oauth_failed": "OAuth ล้มเหลว", + "session.obsidian_worker_relative_only": "เปิดได้เฉพาะไฟล์ที่สัมพันธ์กับ worker ใน Obsidian", + "session.open": "เปิด", + "session.palette_hint_navigate": "ใช้ปุ่มลูกศรเพื่อนำทาง", + "session.palette_hint_run": "Enter เพื่อรัน · Esc เพื่อปิด", + "session.palette_placeholder_actions": "ค้นหาการดำเนินการ", + "session.palette_placeholder_sessions": "ค้นหาตามชื่อเซสชันหรือพื้นที่ทำงาน", + "session.palette_title_actions": "การดำเนินการด่วน", + "session.palette_title_sessions": "ค้นหาเซสชัน", + "session.permission_label": "การอนุญาต", + "session.permission_message": "OpenCode กำลังขออนุญาตเพื่อดำเนินการต่อ", + "session.permission_required": "ต้องการอนุญาต", + "session.phase_responding": "กำลังตอบกลับ", + "session.phase_retrying": "กำลังลองใหม่", + "session.phase_run_failed": "การทำงานล้มเหลว", + "session.phase_sending": "กำลังส่ง", + "session.pick_folder_desc": "เลือกโฟลเดอร์โปรเจกต์หรือบันทึกที่มีอยู่ แล้ว OpenWork จะใช้เป็นพื้นที่ทำงาน", + "session.pick_folder_title": "เลือกโฟลเดอร์ที่ต้องการทำงาน", "session.pick_workspace_to_open": "เลือกพื้นที่ทำงานเพื่อเปิดไฟล์", - "session.unable_to_open_file": "ไม่สามารถเปิดไฟล์", - "session.share_collaborator_label": "โทเค็นผู้ร่วมงาน", - "session.share_desktop_app_required": "ต้องใช้แอปเดสก์ท็อป", - "session.share_worker_url_phones_hint": "ใช้บนโทรศัพท์หรือแล็ปท็อปที่เชื่อมต่อกับ worker นี้", - "session.share_worker_url_resolving_hint": "URL ของ Worker กำลัง resolve; แสดง host URL เป็นตัวสำรอง", - "session.share_owner_permission_hint": "ใช้เมื่อ remote client ต้องตอบคำขออนุญาต", + "session.prev_match": "ผลลัพธ์ก่อนหน้า", + "session.provider_auth_in_progress": "การยืนยันตัวตนผู้ให้บริการกำลังดำเนินอยู่", + "session.provider_connected": "เชื่อมต่อผู้ให้บริการแล้ว", + "session.quick_actions_label": "การดำเนินการด่วน", + "session.quick_actions_title": "การดำเนินการด่วน (Ctrl/Cmd+K)", + "session.redo_aria_label": "ทำซ้ำข้อความที่ย้อนกลับ", + "session.redo_label": "ทำซ้ำ", + "session.redo_title": "ทำซ้ำข้อความที่ย้อนกลับ", + "session.remote_sync_failed": "ซิงค์ไฟล์ระยะไกลไม่สำเร็จ", + "session.rename_description": "อัปเดตชื่อสำหรับเซสชันนี้", + "session.rename_label": "ชื่อเซสชัน", + "session.rename_placeholder": "ใส่ชื่อใหม่", + "session.rename_title": "เปลี่ยนชื่อเซสชัน", + "session.resize_workspace_column": "ปรับขนาดคอลัมน์พื้นที่ทำงาน", + "session.restart_update_title": "รีสตาร์ทเพื่อใช้อัปเดต {version}", + "session.restored_message": "กู้คืนข้อความที่ย้อนกลับแล้ว", + "session.reveal": "เปิดในตัวจัดการไฟล์", + "session.reveal_desktop_only": "การเปิดในตัวจัดการไฟล์ใช้งานได้เฉพาะในแอปเดสก์ท็อป", + "session.revert_label": "ย้อนกลับ", + "session.reverted_last_message": "ย้อนกลับข้อความผู้ใช้ล่าสุดแล้ว", + "session.run": "รัน", + "session.scope_label": "ขอบเขต", + "session.search_conversation_label": "ค้นหาในบทสนทนา", + "session.search_conversation_title": "ค้นหาในบทสนทนา (Ctrl/Cmd+F)", + "session.search_next": "ถัดไป", + "session.search_placeholder": "ค้นหาในแชทนี้", + "session.search_position": "{current} จาก {total}", + "session.search_prev": "ก่อนหน้า", + "session.share_active_cloud_org": "องค์กร Cloud ที่ใช้งาน", + "session.share_choose_org": "เลือกองค์กรใน Settings -> Cloud ก่อนแชร์กับทีม", "session.share_collaborator_hint": "การเข้าถึงระยะไกลปกติเมื่อไม่ต้องการสิทธิ์ของเจ้าของ", "session.share_collaborator_host_hint": "การเข้าถึงระยะไกลปกติสำหรับ host นี้โดยไม่ต้องใช้สิทธิ์ของเจ้าของ", - "session.share_set_token_hint": "ตั้งโทเค็นในการตั้งค่าพื้นที่ทำงาน", + "session.share_collaborator_label": "โทเค็นผู้ร่วมงาน", + "session.share_collaborator_token": "โทเค็นผู้ร่วมงาน", "session.share_connected_with_hint": "พื้นที่ทำงานนี้เชื่อมต่ออยู่ด้วยรหัสผ่านนี้", - "session.share_opencode_base_url": "URL ฐาน OpenCode", - "session.share_note_direct_runtime": "Engine runtime ถูกตั้งเป็น Direct การสลับ local workers อาจรีสตาร์ท host และตัดการเชื่อมต่อ clients โทเค็นอาจเปลี่ยนหลังรีสตาร์ท", - "session.share_select_workspace": "เลือกพื้นที่ทำงานก่อน", - "session.share_openwork_workers_only": "ลิงก์บริการแชร์ใช้ได้สำหรับ OpenWork workers", + "session.share_desktop_app_required": "ต้องใช้แอปเดสก์ท็อป", + "session.share_desktop_required": "ต้องใช้แอปเดสก์ท็อป", + "session.share_host_url_and_token_required": "ต้องใช้ URL ของ OpenWork host และโทเค็น", "session.share_local_host_not_ready": "OpenWork host ภายในเครื่องยังไม่พร้อม", "session.share_missing_host_url": "ไม่พบ URL ของ OpenWork host", "session.share_missing_token": "ไม่พบโทเค็น OpenWork", - "session.share_active_cloud_org": "องค์กร Cloud ที่ใช้งาน", - "session.share_choose_org": "เลือกองค์กรใน Settings -> Cloud ก่อนแชร์กับทีม", + "session.share_no_skills": "ไม่พบ skills ในพื้นที่ทำงานนี้", + "session.share_note_direct_runtime": "Engine runtime ถูกตั้งเป็น Direct การสลับ local workers อาจรีสตาร์ท host และตัดการเชื่อมต่อ clients โทเค็นอาจเปลี่ยนหลังรีสตาร์ท", + "session.share_opencode_base_url": "URL ฐาน OpenCode", + "session.share_openwork_workers_only": "ลิงก์บริการแชร์ใช้ได้สำหรับ OpenWork workers", + "session.share_owner_permission_hint": "ใช้เมื่อ remote client ต้องตอบคำขออนุญาต", + "session.share_password": "รหัสผ่าน", + "session.share_password_owner_hint": "ใช้เมื่อ remote client ต้องตอบคำขออนุญาต", + "session.share_publish_skills_failed": "เผยแพร่ชุด skills ไม่สำเร็จ", + "session.share_publish_workspace_failed": "เผยแพร่โปรไฟล์พื้นที่ทำงานไม่สำเร็จ", "session.share_resolve_local_workspace_failed": "ไม่สามารถระบุพื้นที่ทำงานนี้บน OpenWork host ภายในเครื่อง", - "session.share_host_url_and_token_required": "ต้องใช้ URL ของ OpenWork host และโทเค็น", "session.share_resolve_remote_workspace_failed": "ไม่สามารถระบุพื้นที่ทำงานนี้บน OpenWork host", - "session.share_workspace_template_desc": "เทมเพลตพื้นที่ทำงาน OpenWork แบบเต็มพร้อม config, commands, skills และไฟล์ .opencode เพิ่มเติม", - "session.share_publish_workspace_failed": "เผยแพร่โปรไฟล์พื้นที่ทำงานไม่สำเร็จ", - "session.share_sign_in_required": "เข้าสู่ระบบ OpenWork Cloud ใน Settings เพื่อแชร์กับทีม", - "session.share_team_fallback_name": "เทมเพลตทีมของคุณ", - "session.share_saved_to_org": "บันทึก {name} ไปยัง {org} แล้ว", "session.share_save_team_template_failed": "บันทึกเทมเพลตทีมไม่สำเร็จ", + "session.share_saved_to_org": "บันทึก {name} ไปยัง {org} แล้ว", + "session.share_select_workspace": "เลือกพื้นที่ทำงานก่อน", + "session.share_set_token_hint": "ตั้งโทเค็นในการตั้งค่าพื้นที่ทำงาน", + "session.share_sign_in_required": "เข้าสู่ระบบ OpenWork Cloud ใน Settings เพื่อแชร์กับทีม", "session.share_skills_set_desc": "ชุด skills ครบถ้วนจากพื้นที่ทำงาน OpenWork", - "session.share_no_skills": "ไม่พบ skills ในพื้นที่ทำงานนี้", - "session.share_publish_skills_failed": "เผยแพร่ชุด skills ไม่สำเร็จ", - "session.export_desktop_only_local": "การส่งออกใช้งานได้สำหรับ local workers ในแอปเดสก์ท็อป", - "session.export_local_only": "การส่งออกรองรับเฉพาะ local workers", - "session.export_desktop_only": "การส่งออกใช้งานได้เฉพาะในแอปเดสก์ท็อป", - "session.export_already_running": "การส่งออกกำลังทำงานอยู่", - "session.update_ready": "อัปเดตพร้อมแล้ว", - "session.install_update": "ติดตั้งอัปเดต", - "session.downloading": "กำลังดาวน์โหลด", - "session.update_available": "มีอัปเดต", - "session.connect_failed": "เชื่อมต่อไม่สำเร็จ", - "session.upload_connect_server": "เชื่อมต่อ OpenWork server เพื่ออัปโหลดไฟล์ไปยังโฟลเดอร์ที่แชร์", - "session.uploaded_to_shared_folder": "อัปโหลดไปยังโฟลเดอร์ที่แชร์แล้ว", - "session.create_or_connect_workspace": "สร้างหรือเชื่อมต่อพื้นที่ทำงาน", - "session.allow_once": "ครั้งเดียว", - "session.connect_to_sync": "เชื่อมต่อ OpenWork server เพื่อซิงค์ไฟล์ระยะไกล", - "session.obsidian_worker_relative_only": "เปิดได้เฉพาะไฟล์ที่สัมพันธ์กับ worker ใน Obsidian", - "session.resize_workspace_column": "ปรับขนาดคอลัมน์พื้นที่ทำงาน", - "dashboard.close_settings": "ปิดการตั้งค่า", - "dashboard.nav_ids": "IDs", - "session.downloading_percent": "กำลังดาวน์โหลด {percent}%", - "session.update_ready_stop_runs_title": "อัปเดตพร้อม {version} หยุดงานที่กำลังทำงานเพื่อรีสตาร์ท", - "session.restart_update_title": "รีสตาร์ทเพื่อใช้อัปเดต {version}", - "session.downloading_update_title": "กำลังดาวน์โหลดอัปเดต {version}", - "session.update_available_title": "มีอัปเดต {version}", - "session.file_open_failed": "เปิดไฟล์ไม่สำเร็จ", - "session.remote_sync_failed": "ซิงค์ไฟล์ระยะไกลไม่สำเร็จ", + "session.share_starting_server": "กำลังเริ่มเซิร์ฟเวอร์...", + "session.share_team_fallback_name": "เทมเพลตทีมของคุณ", + "session.share_url_resolving_hint": "URL ของ Worker กำลัง resolve; แสดง host URL เป็นตัวสำรอง", + "session.share_url_worker_hint": "ใช้บนโทรศัพท์หรือแล็ปท็อปที่เชื่อมต่อกับ worker นี้", + "session.share_worker_url": "URL ของ Worker", + "session.share_worker_url_phones_hint": "ใช้บนโทรศัพท์หรือแล็ปท็อปที่เชื่อมต่อกับ worker นี้", + "session.share_worker_url_resolving_hint": "URL ของ Worker กำลัง resolve; แสดง host URL เป็นตัวสำรอง", + "session.share_workspace_template_desc": "เทมเพลตพื้นที่ทำงาน OpenWork แบบเต็มพร้อม config, commands, skills และไฟล์ .opencode เพิ่มเติม", "session.shared_folder_upload_failed": "อัปโหลดไปยังโฟลเดอร์ที่แชร์ไม่สำเร็จ", - "session.status_compacting": "กำลังบีบอัดบริบท", + "session.show_earlier": "แสดง {count} ข้อความก่อนหน้า", "session.status_active": "เซสชันกำลังทำงาน", - "session.status_ready_session": "เซสชันพร้อม", + "session.status_compacting": "กำลังบีบอัดบริบท", + "session.status_delegating": "กำลังมอบหมาย", + "session.status_gathering_context": "กำลังรวบรวมบริบท", + "session.status_planning": "กำลังวางแผน", "session.status_ready": "พร้อม", - "session.delete_session_title": "ลบเซสชัน?", - "session.delete_named_session_message": "การดำเนินการนี้จะลบ \"{title}\" และข้อความทั้งหมดอย่างถาวร", - "session.delete_session_generic": "การดำเนินการนี้จะลบเซสชันที่เลือกและข้อความทั้งหมดอย่างถาวร", - "session.deleting": "กำลังลบ...", - "session.delete": "ลบ", - "session.loading_session": "กำลังโหลดเซสชัน", - "session.workspace_fallback": "พื้นที่ทำงาน", - "session.model_fallback": "โมเดล", - "session.close_quick_actions": "ปิดการดำเนินการด่วน", - "session.prev_match": "ผลลัพธ์ก่อนหน้า", - "session.next_match": "ผลลัพธ์ถัดไป", - "session.close_search": "ปิดการค้นหา", - "session.unable_to_open_obsidian": "ไม่สามารถเปิดไฟล์ใน Obsidian", - "session.search_position": "{current} จาก {total}", - "session.conflict_sync_toast": "เกิดความขัดแย้งในการซิงค์ {path} บันทึกการเปลี่ยนแปลงในเครื่องไปที่ {conflictPath}", + "session.status_ready_session": "เซสชันพร้อม", + "session.status_running_shell": "กำลังรัน shell", + "session.status_searching_codebase": "กำลังค้นหาโค้ด", + "session.status_searching_web": "กำลังค้นหาเว็บ", + "session.status_thinking": "กำลังคิด", + "session.status_working": "กำลังทำงาน", + "session.status_writing_file": "กำลังเขียนไฟล์", + "session.stopped": "หยุดแล้ว", + "session.stopping_run": "กำลังหยุดการทำงาน...", "session.todo_progress": "{completed} จาก {total} งานเสร็จแล้ว", - "session.uploading_to_shared_folder": "กำลังอัปโหลด {label} ไปยังโฟลเดอร์ที่แชร์...", + "session.trying_again": "กำลังลองใหม่...", + "session.unable_to_open_file": "ไม่สามารถเปิดไฟล์", + "session.unable_to_open_obsidian": "ไม่สามารถเปิดไฟล์ใน Obsidian", + "session.unable_to_reveal": "ไม่สามารถเปิดพื้นที่ทำงาน", + "session.undo_label": "ย้อนกลับ", + "session.undo_title": "เลิกทำข้อความล่าสุด", + "session.update_available": "มีอัปเดต", + "session.update_available_title": "มีอัปเดต {version}", + "session.update_ready": "อัปเดตพร้อมแล้ว", + "session.update_ready_stop_runs_title": "อัปเดตพร้อม {version} หยุดงานที่กำลังทำงานเพื่อรีสตาร์ท", + "session.upload_connect_server": "เชื่อมต่อ OpenWork server เพื่ออัปโหลดไฟล์ไปยังโฟลเดอร์ที่แชร์", + "session.uploaded_to_shared_folder": "อัปโหลดไปยังโฟลเดอร์ที่แชร์แล้ว", "session.uploaded_with_summary": "อัปโหลดไปยังโฟลเดอร์ที่แชร์: {summary}", - "session.cmd_sessions_detail": "{count} เซสชันที่ใช้ได้ข้ามพื้นที่ทำงาน", - "session.cmd_model_detail": "{model} · {variant}", - "session.show_earlier": "แสดง {count} ข้อความก่อนหน้า", - "session.back": "กลับ", - "session.no_matches_command": "ไม่พบรายการที่ตรงกัน", - "session.palette_hint_navigate": "ใช้ปุ่มลูกศรเพื่อนำทาง", - "session.palette_hint_run": "Enter เพื่อรัน · Esc เพื่อปิด", - - // ==================== Message List (tool headlines & subagent) ==================== - "message_list.tool_run_command": "รัน {command}", - "message_list.tool_run_command_fallback": "รันคำสั่ง", - "message_list.tool_reviewed_file": "ตรวจสอบ {file}", - "message_list.tool_reviewed_file_fallback": "ตรวจสอบไฟล์", - "message_list.tool_updated_file": "อัปเดต {file}", - "message_list.tool_updated_file_fallback": "อัปเดตไฟล์", - "message_list.tool_update_file": "อัปเดต {file}", - "message_list.tool_update_file_fallback": "อัปเดตไฟล์", - "message_list.tool_searched_pattern": "ค้นหา {pattern}", - "message_list.tool_searched_code_fallback": "ค้นหาโค้ด", - "message_list.tool_reviewed_path": "ตรวจสอบ {path}", - "message_list.tool_reviewed_files_fallback": "ตรวจสอบไฟล์", - "message_list.tool_delegate_agent": "มอบหมาย {agent}", - "message_list.tool_delegate_task_fallback": "มอบหมายงาน", - "message_list.tool_update_todo": "อัปเดตรายการสิ่งที่ต้องทำ", - "message_list.tool_read_todo": "อ่านรายการสิ่งที่ต้องทำ", - "message_list.tool_checked_url": "ตรวจสอบ {url}", - "message_list.tool_checked_web_fallback": "ตรวจสอบหน้าเว็บ", - "message_list.tool_load_skill_named": "โหลด skill {name}", - "message_list.tool_load_skill_fallback": "โหลด skill", - "message_list.subagent_type_task": "งาน {agentType}", - "message_list.subagent_session_fallback": "เซสชัน Subagent", - "message_list.subagent_loading_transcript": "กำลังโหลด transcript", - "message_list.subagent_running": "กำลังทำงาน", - "message_list.subagent_message_count": "{count} ข้อความ", - "message_list.subagent_waiting_transcript": "กำลังรอ transcript", - "message_list.open_session": "เปิดเซสชัน", - "message_list.step_updates_progress": "อัปเดตความคืบหน้า", - - // ==================== Inbox Panel (additional) ==================== - "inbox_panel.copied_path": "คัดลอกแล้ว: {path}", - "inbox_panel.download_failed": "ดาวน์โหลดไม่สำเร็จ", - + "session.uploading_to_shared_folder": "กำลังอัปโหลด {label} ไปยังโฟลเดอร์ที่แชร์...", + "session.workspace_fallback": "พื้นที่ทำงาน", + "session.workspace_label": "พื้นที่ทำงาน", + "session.workspace_path_unavailable": "เส้นทางพื้นที่ทำงานไม่พร้อมใช้งาน", + "session.workspace_setup_desc": "เริ่มด้วยพื้นที่ทำงาน OpenWork แบบมีคำแนะนำ หรือเลือกโฟลเดอร์ที่มีอยู่ที่ต้องการทำงาน", + "session.workspace_setup_label": "ตั้งค่าพื้นที่ทำงาน", + "session.workspace_setup_title": "ตั้งค่าพื้นที่ทำงานแรกของคุณ", + "settings.action_download": "ดาวน์โหลด", + "settings.action_install": "ติดตั้ง", + "settings.actor_host": "host", + "settings.actor_remote": "ระยะไกล", + "settings.actor_unknown": "ไม่ทราบ", + "settings.advanced": "ขั้นสูง", + "settings.advanced_title": "ขั้นสูง", + "settings.api_keys_info": "API key ถูกเก็บไว้ในเครื่องโดย OpenCode ผู้ให้บริการที่ใช้ environment ต้องเปลี่ยนในสภาพแวดล้อม worker แล้วรีโหลด", + "settings.appearance_hint": "ตามระบบหรือบังคับโหมดสว่าง/มืด", + "settings.appearance_title": "ธีม", + "settings.audit_error": "ข้อผิดพลาด", + "settings.audit_loading": "กำลังโหลด", + "settings.audit_log_title": "บันทึกการตรวจสอบ", + "settings.audit_ready": "พร้อม", + "settings.auto_compact": "บีบอัดบริบทอัตโนมัติ", + "settings.auto_compact_desc": "ควบคุม compaction.auto ของ OpenCode สำหรับพื้นที่ทำงานนี้ รีโหลด engine หลังเปลี่ยน", + "settings.auto_update_desc": "ดาวน์โหลดอัปเดตอัตโนมัติ (จะถามก่อนติดตั้ง)", + "settings.auto_update_title": "อัปเดตอัตโนมัติ", + "settings.available_count": "{count} พร้อมใช้งาน", + "settings.background_checks_desc": "OpenWork ตรวจสอบเสมอตอนเปิดแอป ตรวจสอบเพิ่มอีกวันละครั้ง", + "settings.background_checks_title": "ตรวจสอบในพื้นหลัง", + "settings.base_url_unavailable": "URL ฐานไม่พร้อมใช้งาน", + "settings.binary_unavailable": "Binary ไม่พร้อมใช้งาน", + "settings.cache_nothing_to_repair": "ไม่พบแคช OpenCode ไม่มีอะไรต้องซ่อมแซม", + "settings.cache_repair_requires_desktop": "การซ่อมแซมแคชต้องใช้แอปเดสก์ท็อป", + "settings.cache_repaired": "ซ่อมแซมแคช OpenCode แล้ว รีสตาร์ท engine หากกำลังทำงาน", + "settings.cap_browser_tools": "เครื่องมือเบราว์เซอร์: {value}", + "settings.cap_commands": "คำสั่ง: {value}", + "settings.cap_config": "Config: {value}", + "settings.cap_file_tools": "เครื่องมือไฟล์: {value}", + "settings.cap_inbox_off": "inbox ปิด", + "settings.cap_inbox_on": "inbox เปิด", + "settings.cap_mcp": "MCP: {value}", + "settings.cap_outbox_off": "outbox ปิด", + "settings.cap_outbox_on": "outbox เปิด", + "settings.cap_plugins": "Plugins: {value}", + "settings.cap_proxy": "Proxy (OpenCodeRouter): {value}", + "settings.cap_read": "อ่าน", + "settings.cap_sandbox": "Sandbox: {value}", + "settings.cap_skills": "Skills: {value}", + "settings.cap_write": "เขียน", + "settings.capabilities_title": "ความสามารถของ OpenWork server", + "settings.capabilities_unavailable": "ความสามารถไม่พร้อมใช้งาน เชื่อมต่อด้วย client token", + "settings.change": "เปลี่ยน", + "settings.check_update": "ตรวจสอบ", + "settings.checking_for_updates": "กำลังตรวจสอบอัปเดต", + "settings.choose": "เลือก", + "settings.clear": "ล้าง", + "settings.clipboard_unavailable": "คลิปบอร์ดไม่พร้อมใช้งานในสภาพแวดล้อมนี้", + "settings.configure": "ตั้งค่า", + "settings.connect_opencode_hint": "เชื่อมต่อ OpenCode เพื่อโหลดผู้ให้บริการ", + "settings.connect_provider": "เชื่อมต่อผู้ให้บริการ", + "settings.connected_count": "{count} เชื่อมต่อแล้ว", + "settings.connection": "การเชื่อมต่อ", + "settings.connection_failed": "เชื่อมต่อล้มเหลว", + "settings.connection_title": "การเชื่อมต่อ", + "settings.copied_debug_report": "คัดลอก JSON รายงานรันไทม์แล้ว", + "settings.copy_failed": "คัดลอกรายงานรันไทม์ไม่สำเร็จ", + "settings.copy_json": "คัดลอก JSON", + "settings.custom_binary_hint": "ใช้เพื่อชี้ OpenWork ไปที่ OpenCode build ภายในเครื่อง", + "settings.custom_binary_label": "OpenCode binary กำหนดเอง", + "settings.data_dir_unavailable": "ไดเรกทอรีข้อมูลไม่พร้อมใช้งาน", + "settings.debug_commit": "Commit: {sha}", + "settings.debug_desktop_app": "แอปเดสก์ท็อป: {version}", + "settings.debug_opencode_router_version": "OpenCodeRouter: {version}", + "settings.debug_opencode_version": "OpenCode: {version}", + "settings.debug_openwork_server_version": "OpenWork server: {version}", + "settings.debug_orchestrator_version": "Orchestrator: {version}", + "settings.debug_section_title": "นักพัฒนา", + "settings.deeplink_failed": "เปิด deep link ไม่สำเร็จ", + "settings.deeplink_hint": "รับ openwork://, openwork-dev:// หรือ URL https://share.openworklabs.com/b/... ที่รองรับ", + "settings.default_model": "โมเดลเริ่มต้น", + "settings.delete_containers": "กำลังลบ containers...", + "settings.delete_local_config": "กำลังลบสถานะภายในเครื่อง...", + "settings.desktop_only_hint": "ใช้ได้ในแอปเดสก์ท็อป", + "settings.dev_mode_badge": "โหมดนักพัฒนา", + "settings.developer": "นักพัฒนา", + "settings.developer_mode_desc": "เปิดเครื่องมือดีบัก การวินิจฉัย และแท็บนักพัฒนา", + "settings.developer_mode_title": "โหมดนักพัฒนา", + "settings.developer_panel_disabled": "ปิดแผงนักพัฒนาแล้ว", + "settings.developer_panel_enabled": "เปิดแผงนักพัฒนาแล้ว", + "settings.devlog_cleared": "ล้าง log นักพัฒนาแล้ว", + "settings.devlog_clipboard_unavailable": "คลิปบอร์ดไม่พร้อมใช้งานในสภาพแวดล้อมนี้", + "settings.devlog_copied": "คัดลอก log นักพัฒนาแล้ว", + "settings.devlog_copy_failed": "ไม่สามารถคัดลอก log นักพัฒนาได้", + "settings.devlog_export_failed": "ไม่สามารถส่งออก log นักพัฒนาได้", + "settings.devlog_export_unavailable": "การส่งออกไม่พร้อมใช้งานในสภาพแวดล้อมนี้", + "settings.devlog_exported": "ส่งออก log นักพัฒนาแล้ว", + "settings.devtools_desc": "สถานะ sidecar, ความสามารถ และบันทึกการตรวจสอบ", + "settings.devtools_title": "เครื่องมือนักพัฒนา", + "settings.diag_approval": "การอนุมัติ: {mode} ({ms}ms)", + "settings.diag_config_path": "เส้นทาง config: {path}", + "settings.diag_daemon_url": "Daemon: {url}", + "settings.diag_default": "ค่าเริ่มต้น", + "settings.diag_health_port": "Health port: {port}", + "settings.diag_healthy_ms": "Healthy: {ms}ms", + "settings.diag_host_token_source": "แหล่ง host token: {source}", + "settings.diag_last_attempt": "ครั้งล่าสุด: {time}", + "settings.diag_load_sessions_ms": "โหลดเซสชัน: {ms}ms", + "settings.diag_opencode_binary": "OpenCode binary: {binary}", + "settings.diag_opencode_url": "OpenCode: {url}", + "settings.diag_pending_permissions_ms": "สิทธิ์ที่รอ: {ms}ms", + "settings.diag_pid": "PID: {pid}", + "settings.diag_providers_ms": "ผู้ให้บริการ: {ms}ms", + "settings.diag_read_only": "อ่านอย่างเดียว: {value}", + "settings.diag_reason": "เหตุผล: {reason}", + "settings.diag_runtime_workspace": "Runtime workspace: {id}", + "settings.diag_selected_workspace": "พื้นที่ทำงานที่เลือก: {id}", + "settings.diag_sidecar": "Sidecar: {info}", + "settings.diag_started": "เริ่ม: {time}", + "settings.diag_token_source": "แหล่ง token: {source}", + "settings.diag_total_ms": "ทั้งหมด: {ms}ms", + "settings.diag_version": "เวอร์ชัน: {version}", + "settings.diag_workspaces": "พื้นที่ทำงาน: {count}", + "settings.diagnostics_unavailable": "ข้อมูลวินิจฉัยไม่พร้อมใช้งาน", + "settings.disable_developer_mode": "ปิดโหมดนักพัฒนา", + "settings.disabled": "ปิดใช้งาน", + "settings.disconnect": "ตัดการเชื่อมต่อ", + "settings.disconnect_confirm_suffix": "ตัดการเชื่อมต่อ {resolved}? การดำเนินการนี้จะลบ API key หรือข้อมูล OAuth ที่เก็บไว้สำหรับผู้ให้บริการนี้", + "settings.disconnect_server": "ตัดการเชื่อมต่อเซิร์ฟเวอร์", + "settings.disconnected_prefix": "ตัดการเชื่อมต่อ {resolved} แล้ว", + "settings.disconnecting": "กำลังตัดการเชื่อมต่อ...", + "settings.docker_containers_desc": "บังคับลบ Docker containers ที่ OpenWork เปิดใช้", + "settings.docker_containers_title": "Docker containers ของ OpenWork", + "settings.docker_requires_desktop": "การล้าง Docker ต้องใช้แอปเดสก์ท็อป", + "settings.done": "เสร็จสิ้น", + "settings.downloading_bytes": "กำลังดาวน์โหลด {downloaded}", + "settings.downloading_progress": "กำลังดาวน์โหลด {downloaded} / {total} ({percent}%)", + "settings.enable_developer_mode": "เปิดโหมดนักพัฒนา", + "settings.enable_exa": "เปิด Exa web search", + "settings.enable_exa_desc": "ใช้งานเมื่อ OpenWork Orchestrator เปิด OpenCode", + "settings.enabled": "เปิดใช้งาน", + "settings.engine_bundled": "แบบรวม (แนะนำ)", + "settings.engine_bundled_hint": "Engine แบบรวมเป็นตัวเลือกที่เสถียรที่สุด ใช้ System", + "settings.engine_custom_binary": "Binary กำหนดเอง", + "settings.engine_desc": "เลือกวิธีรัน OpenCode ภายในเครื่อง", + "settings.engine_runtime_label": "Engine runtime", + "settings.engine_source": "แหล่งที่มาของ engine", + "settings.engine_source_debug": "แหล่ง engine", + "settings.engine_system_path": "ติดตั้งในระบบ (PATH)", + "settings.engine_title": "Engine", + "settings.exa_restart_hint": "รีสตาร์ท OpenCode หรือ orchestrator หลังเปลี่ยนการตั้งค่านี้", + "settings.export": "ส่งออก", + "settings.export_failed": "ส่งออกรายงานรันไทม์ไม่สำเร็จ", + "settings.export_unavailable": "การส่งออกไม่พร้อมใช้งานในสภาพแวดล้อมนี้", + "settings.exported_debug_report": "ส่งออก JSON รายงานรันไทม์แล้ว", + "settings.failed": "ล้มเหลว", + "settings.failed_open_providers": "เปิดผู้ให้บริการไม่สำเร็จ", + "settings.feedback_badge": "เราอ่านทุกข้อความ", + "settings.feedback_desc": "บอกสิ่งที่ชอบและสิ่งที่ยังไม่ดีพอ ความคิดเห็นส่งตรงถึงทีมและช่วยให้เรารู้ว่าจะพัฒนาอะไรต่อไป", + "settings.feedback_title": "ช่วยพัฒนา OpenWork", + "settings.group_global": "ทั่วไป", + "settings.group_workspace": "พื้นที่ทำงาน", + "settings.hide_titlebar": "ซ่อนแถบชื่อหน้าต่าง", + "settings.hide_titlebar_desc": "ซ่อนแถบชื่อหน้าต่าง เหมาะสำหรับ tiling window", + "settings.join_discord": "เข้าร่วม Discord", + "settings.language": "ภาษา", + "settings.language.description": "เลือกภาษาที่คุณต้องการ", + "settings.last_error": "ข้อผิดพลาดล่าสุด", + "settings.last_stderr": "Stderr ล่าสุด", + "settings.last_stdout": "Stdout ล่าสุด", + "settings.loading_providers": "กำลังโหลดผู้ให้บริการ...", + "settings.logs_on_host": "Logs อยู่บน host", + "settings.managed_by_env": "จัดการโดยตัวแปรสภาพแวดล้อม", + "settings.messaging_bridge_service": "บริการ messaging bridge", + "settings.messaging_section_desc": "จัดการ Telegram/Slack identities และ bindings ในแท็บ Identities", + "settings.messaging_section_title": "ข้อความ", + "settings.model": "โมเดล", + "settings.model_behavior": "พฤติกรรมโมเดล", + "settings.model_behavior_desc": "เปิดตัวเลือกโมเดลเริ่มต้นเพื่อเลือก reasoning profiles เมื่อมีให้ใช้", + "settings.model_default": "ค่าเริ่มต้น", + "settings.model_description": "ค่าเริ่มต้น + การควบคุม thinking สำหรับการทำงาน", + "settings.model_description_default": "เลือกจากผู้ให้บริการที่ตั้งค่าไว้ การเลือกนี้จะถูกใช้สำหรับเซสชันใหม่", + "settings.model_description_session": "เลือกจากผู้ให้บริการที่ตั้งค่าไว้ การเลือกนี้ใช้สำหรับข้อความถัดไปของคุณ", + "settings.model_fallback": "สำรอง", + "settings.model_reasoning": "การใช้เหตุผล", + "settings.model_section_desc": "เลือกโมเดลแชทเริ่มต้นและตรวจสอบวิธีการใช้เหตุผล", + "settings.model_title": "โมเดล", + "settings.no_access": "ไม่มีสิทธิ์เข้าถึง", + "settings.no_active_workspace": "ไม่มีพื้นที่ทำงานภายในเครื่องที่ใช้งาน", + "settings.no_audit_entries": "ยังไม่มีรายการตรวจสอบ", + "settings.no_binary_selected": "ยังไม่ได้เลือก binary", + "settings.no_custom_path_set": "ยังไม่ได้ตั้งเส้นทางกำหนดเอง", + "settings.no_project_directory": "ไม่มีไดเรกทอรีโปรเจกต์", + "settings.no_stderr": "ยังไม่มี stderr", + "settings.no_stdout": "ยังไม่มี stdout", + "settings.no_worker_directory": "ไม่มีไดเรกทอรีโปรเจกต์", + "settings.no_worker_path": "ไม่มีเส้นทาง worker", + "settings.nuke_confirm_dev": "การดำเนินการนี้ไม่สามารถเลิกทำได้ จะลบข้อมูล OpenWork ทั้งหมดสำหรับ dev build นี้และ OpenCode dev config, auth, cache, data และ state ทั้งหมด แล้วปิด OpenWork ดำเนินการต่อ?", + "settings.nuke_confirm_prod": "การดำเนินการนี้ไม่สามารถเลิกทำได้ จะลบข้อมูล OpenWork ทั้งหมดสำหรับ dev build นี้และ OpenCode dev config, auth, cache, data และ state ทั้งหมด แล้วปิด OpenWork ดำเนินการต่อ?", + "settings.nuke_failed": "ลบสถานะ OpenWork และ OpenCode ไม่สำเร็จ", + "settings.nuke_hint": "ใช้เฉพาะเมื่อต้องการรีเซ็ตแอปเดสก์ท็อปและสถานะ OpenCode runtime ทั้งหมด", + "settings.nuke_success": "ลบสถานะ OpenWork และ OpenCode แล้ว OpenWork กำลังปิด...", + "settings.off": "ปิด", + "settings.offline": "ออฟไลน์", + "settings.on": "เปิด", + "settings.open_deeplink_action": "กำลังเปิด...", + "settings.open_deeplink_button": "ซ่อน", + "settings.open_deeplink_desc": "วาง deeplink หรือ URL แชร์ของ OpenWork เพื่อเปิด", + "settings.open_deeplink_title": "เปิด Deeplink", + "settings.opencode_cache": "แคช OpenCode", + "settings.opencode_cache_description": "ซ่อมแซมข้อมูลแคชที่ใช้เริ่ม engine ทำได้อย่างปลอดภัย", + "settings.opencode_engine_desc": "รันไทม์ภายในเครื่องสำหรับ agents, tools และผู้ให้บริการโมเดล", + "settings.opencode_engine_label": "OpenCode engine", + "settings.opencode_engine_sidecar_desc": "Sidecar สำหรับรันภายในเครื่อง", + "settings.opencode_router_sidecar": "OpenCodeRouter sidecar", + "settings.opencode_runtime_desc": "ตัวเลือกรันไทม์สำหรับ engine ภายในเครื่องและ orchestrator bridge", + "settings.opencode_sdk_desc": "ข้อมูลวินิจฉัยการเชื่อมต่อ UI", + "settings.opencode_sdk_title": "OpenCode engine", + "settings.opencode_section_label": "OpenCode", + "settings.opencode_url_unavailable": "URL ฐานไม่พร้อมใช้งาน", + "settings.opening": "เปิด deeplink", + "settings.openwork_config_sidecar_desc": "Sidecar สำหรับ config และ approvals", + "settings.openwork_diagnostics_title": "ข้อมูลวินิจฉัย OpenWork server", + "settings.openwork_server_desc": "แผงควบคุมเซสชันสำหรับซิงค์แอป, workers และระยะไกล", + "settings.openwork_server_label": "OpenWork server", + "settings.orchestrator_daemon_layer_desc": "เลเยอร์จัดการพื้นที่ทำงาน", + "settings.orchestrator_daemon_title": "Orchestrator daemon", + "settings.pending_permissions": "สิทธิ์ที่รอดำเนินการ", + "settings.production_mode_badge": "โหมด Production", + "settings.provider_default_desc": "ใช้พฤติกรรม reasoning ค่าเริ่มต้นของโมเดล", + "settings.provider_default_label": "ค่าเริ่มต้นของผู้ให้บริการ", + "settings.provider_source_config": "Config", + "settings.provider_source_custom": "กำหนดเอง", + "settings.provider_source_env": "Environment", + "settings.providers_desc": "เชื่อมต่อบริการสำหรับโมเดลและเครื่องมือ", + "settings.providers_title": "ผู้ให้บริการ", + "settings.quit_hint": "OpenWork จะปิดทันทีหลังล้างข้อมูลเพื่อให้การเปิดครั้งถัดไปเริ่มจากสถานะว่างสำหรับโหมดนี้", + "settings.recent_events": "เหตุการณ์ล่าสุด", + "settings.reconnect_failed": "เชื่อมต่อใหม่ไม่สำเร็จ ตรวจสอบ URL/token ของเซิร์ฟเวอร์แล้วลองอีกครั้ง", + "settings.reconnect_server": "กำลังเชื่อมต่อใหม่...", + "settings.reconnect_server_failed": "เชื่อมต่อ OpenWork server ใหม่ไม่สำเร็จ", + "settings.reconnected": "เชื่อมต่อ OpenWork server ใหม่แล้ว", + "settings.reconnecting": "กำลังเชื่อมต่อใหม่...", + "settings.removing_containers": "กำลังลบ containers...", + "settings.removing_local_state": "กำลังลบสถานะภายในเครื่อง...", + "settings.repair_cache": "ซ่อมแซมแคช", + "settings.repairing_cache": "กำลังซ่อมแซมแคช", + "settings.report_issue": "รายงานปัญหา", + "settings.reset": "รีเซ็ต", + "settings.reset_app_data": "รีเซ็ตข้อมูลแอป", + "settings.reset_app_data_description": "รุนแรงกว่า ล้างแคชและข้อมูลแอปของ OpenWork", + "settings.reset_app_data_title": "รีเซ็ตข้อมูลแอป", + "settings.reset_app_data_warning": "ล้างแคชและข้อมูลแอป OpenWork บนอุปกรณ์นี้", + "settings.reset_button": "รีเซ็ต", + "settings.reset_cancel": "ยกเลิก", + "settings.reset_config_defaults": "กำลังรีเซ็ต...", + "settings.reset_config_failed": "รีเซ็ต app config ไม่สำเร็จ", + "settings.reset_confirm_button": "รีเซ็ตและรีสตาร์ท", + "settings.reset_confirmation_hint": "พิมพ์ RESET เพื่อยืนยัน OpenWork จะรีสตาร์ท", + "settings.reset_confirmation_label": "การยืนยัน", + "settings.reset_confirmation_placeholder": "พิมพ์ RESET", + "settings.reset_onboarding": "รีเซ็ต onboarding", + "settings.reset_onboarding_description": "ล้างค่าตั้งค่า OpenWork และรีสตาร์ทแอป", + "settings.reset_onboarding_title": "รีเซ็ต onboarding", + "settings.reset_onboarding_warning": "ล้างค่าตั้งค่า OpenWork และตัวบ่งชี้ onboarding ของพื้นที่ทำงาน", + "settings.reset_openwork_desc_dev": "เมื่อเปิดโหมดนักพัฒนา จะล้างเฉพาะ OpenCode dev state ภายใน openwork-dev-data", + "settings.reset_openwork_desc_prod": "เมื่อเปิดโหมดนักพัฒนา จะล้างเฉพาะ OpenCode dev state ภายใน openwork-dev-data", + "settings.reset_openwork_title": "รีเซ็ตสถานะ OpenWork + OpenCode", + "settings.reset_recovery_desc": "ล้างข้อมูลหรือรีสตาร์ทขั้นตอนตั้งค่า", + "settings.reset_recovery_title": "รีเซ็ตและกู้คืน", + "settings.reset_requires_confirm": "ต้องพิมพ์ RESET และจะรีสตาร์ทแอป", + "settings.reset_startup": "รีเซ็ตโหมดเริ่มต้น", + "settings.reset_startup_pref": "รีเซ็ตค่าเริ่มต้นการเปิดใช้งาน", + "settings.reset_stop_active_runs": "หยุดงานที่กำลังทำงานก่อนรีเซ็ต", + "settings.resetting": "กำลังรีเซ็ต...", + "settings.restart_blocked_message": "OpenWork ต้องรีสตาร์ทเพื่อเสร็จสิ้นการอัปเดตนี้ เพื่อไม่ให้รบกวนงานปัจจุบัน การติดตั้งจะหยุดชั่วคราวจนกว่างานที่กำลังทำงานจะเสร็จหรือคุณหยุดงาน", + "settings.restart_failed": "รีสตาร์ทล้มเหลว ตรวจสอบ logs และลองอีกครั้ง", + "settings.restart_local_server": "กำลังรีสตาร์ท...", + "settings.restart_opencode": "กำลังรีสตาร์ท...", + "settings.restart_opencode_router": "กำลังรีสตาร์ท...", + "settings.restart_openwork_server": "กำลังรีสตาร์ท...", + "settings.restart_orchestrator": "กำลังรีสตาร์ท...", + "settings.restart_server_failed": "รีสตาร์ท local server ไม่สำเร็จ", + "settings.restarted": "รีสตาร์ท local server แล้ว", + "settings.restarting": "กำลังรีสตาร์ท...", + "settings.reveal_config": "เปิดไฟล์ config", + "settings.reveal_config_failed": "เปิดไฟล์ config พื้นที่ทำงานไม่สำเร็จ", + "settings.reveal_config_requires_desktop": "การเปิดไฟล์ config ต้องใช้แอปเดสก์ท็อป", + "settings.revealed_workspace_config": "เปิดไฟล์ config พื้นที่ทำงานแล้ว", + "settings.run_sandbox_probe": "กำลังรัน probe...", + "settings.running_probe": "กำลังรัน probe...", + "settings.runtime_applies_hint": "มีผลครั้งถัดไปที่ engine เริ่มหรือรีโหลด", + "settings.runtime_debug_desc": "สแนปช็อตข้อมูลวินิจฉัยที่อ่านได้พร้อมส่งออกด้วยคลิกเดียว", + "settings.runtime_debug_title": "รายงานดีบักรันไทม์", + "settings.runtime_desc": "สถานะ engine ภายในเครื่องและ OpenWork server", + "settings.runtime_direct": "Direct (OpenCode)", + "settings.runtime_orchestrator": "OpenWork Orchestrator", + "settings.runtime_title": "รันไทม์", + "settings.sandbox_error": "ข้อผิดพลาด", + "settings.sandbox_export_hint": "ใช้ส่งออกในรายงานดีบักรันไทม์ด้านบนเพื่อ", + "settings.sandbox_probe_desc": "รันการตรวจสอบ Docker sandbox แบบชั่วคราวและ", + "settings.sandbox_probe_errors": "Sandbox probe เสร็จสิ้นพร้อมข้อผิดพลาด", + "settings.sandbox_probe_failed": "Sandbox probe ล้มเหลว", + "settings.sandbox_probe_success": "Sandbox probe สำเร็จ ส่งออกรายงานดีบักสำหรับ support", + "settings.sandbox_probe_title": "Sandbox probe", + "settings.sandbox_ready": "พร้อม", + "settings.sandbox_requires_desktop": "Sandbox probe ต้องใช้แอปเดสก์ท็อป", + "settings.sandbox_result": "ผลลัพธ์: {status}", + "settings.sandbox_run_id": "Run ID: {id}", + "settings.sandbox_stop_runs_hint": "หยุดงานที่กำลังทำงานก่อน probe", + "settings.search_models": "ค้นหาโมเดล…", + "settings.select_binary": "เลือก OpenCode binary", + "settings.select_workspace_first": "เลือกพื้นที่ทำงานภายในเครื่องก่อนเปิดไฟล์ config", + "settings.send_feedback": "ส่งความคิดเห็น", + "settings.service_restarts_desc": "รีสตาร์ทบริการ host เฉพาะโดยไม่ต้องออกจาก", + "settings.service_restarts_title": "รีสตาร์ทบริการ", + "settings.session_model": "โมเดล", + "settings.show_model_reasoning": "แสดงการใช้เหตุผลของโมเดล", + "settings.show_model_reasoning_desc": "ขยาย reasoning traces ใน UI เมื่อโมเดลรองรับ", + "settings.showing_models": "แสดง {count} จาก {total}", + "settings.sidecar_config_unavailable": "Config ของ sidecar ไม่พร้อมใช้งาน", + "settings.startup": "การเริ่มต้น", + "settings.startup_local": "เริ่ม local server", + "settings.startup_not_set": "เชื่อมต่อ server", + "settings.startup_remote_warning": "ค่าเริ่มต้นการเปิดใช้งานเป็นระยะไกล การตั้งค่า engine", + "settings.startup_reset_hint": "ล้างค่าที่บันทึกไว้และแสดงหน้าจอเชื่อมต่อ", + "settings.startup_server": "เชื่อมต่อ server", + "settings.startup_title": "การเริ่มต้น", + "settings.stop_local_server": "หยุด local server", + "settings.stop_runs_before_cleanup": "หยุดงานที่กำลังทำงานก่อนล้างข้อมูล", + "settings.stop_runs_before_reset_config": "หยุดงานที่กำลังทำงานก่อนรีเซ็ต config", + "settings.stop_runs_to_reset": "หยุดงานที่กำลังทำงานเพื่อรีเซ็ต", + "settings.switch": "สลับ", + "settings.tab_advanced": "ขั้นสูง", + "settings.tab_appearance": "ธีม", + "settings.tab_automations": "ระบบออโตเมชั่น", + "settings.tab_cloud": "Cloud", + "settings.tab_debug": "ดีบัก", + "settings.tab_description_advanced": "ตรวจสอบสถานะรันไทม์ การเชื่อมต่อ และตัวควบคุมสำหรับนักพัฒนา", + "settings.tab_description_appearance": "ปรับรูปลักษณ์ OpenWork ทั้งเดสก์ท็อป ธีมระบบ และ app chrome", + "settings.tab_description_automations": "สร้างและจัดการออโตเมชั่นตามกำหนดเวลาจากการตั้งค่าพื้นที่ทำงาน", + "settings.tab_description_debug": "ตรวจสอบข้อมูลวินิจฉัยรันไทม์ logs และเครื่องมือดีบักระดับต่ำ", + "settings.tab_description_den": "จัดการการเชื่อมต่อ OpenWork Cloud, workers ที่โฮสต์ และการเข้าถึงพื้นที่ทำงาน", + "settings.tab_description_extensions": "จัดการแอป MCP และ OpenCode plugins สำหรับพื้นที่ทำงานนี้", + "settings.tab_description_general": "เชื่อมต่อผู้ให้บริการ เลือกโมเดลเริ่มต้น อนุญาตโฟลเดอร์ และควบคุมพื้นที่ทำงาน OpenWork ที่เลือกพร้อมการเชื่อมต่อรันไทม์", + "settings.tab_description_messaging": "ตั้งค่า router identities และพฤติกรรม inbox จากการตั้งค่าพื้นที่ทำงาน", + "settings.tab_description_model": "ปรับโมเดลเริ่มต้น พฤติกรรมรันไทม์ และการตั้งค่าผลลัพธ์ของ assistant", + "settings.tab_description_recovery": "ซ่อมแซมสถานะ migration รีเซ็ตค่าเริ่มต้นพื้นที่ทำงาน และกู้คืนการตั้งค่าภายในเครื่อง", + "settings.tab_description_skills": "เรียกดู แก้ไข และติดตั้ง skills โดยไม่ต้องออกจากการตั้งค่า", + "settings.tab_description_updates": "อัปเดตแอปให้เป็นปัจจุบันด้วยการตรวจสอบในพื้นหลังและตัวควบคุมการติดตั้ง", + "settings.tab_extensions": "ส่วนขยาย", + "settings.tab_general": "การตั้งค่า", + "settings.tab_messaging": "ข้อความ", + "settings.tab_model": "โมเดล", + "settings.tab_recovery": "การกู้คืน", + "settings.tab_skills": "Skills", + "settings.tab_updates": "การอัปเดต", + "settings.theme_dark": "มืด", + "settings.theme_light": "สว่าง", + "settings.theme_system": "ตามระบบ", + "settings.theme_system_hint": "โหมดตามระบบจะตามค่าตั้งค่า OS ของคุณโดยอัตโนมัติ", + "settings.toolbar_ready_to_install": "พร้อมติดตั้ง", + "settings.update": "อัปเดต", + "settings.update_available": "มีอัปเดต: v", + "settings.update_available_version": "มีอัปเดต: v{version}", + "settings.update_check_button": "ตรวจสอบ", + "settings.update_check_failed": "ตรวจสอบอัปเดตไม่สำเร็จ", + "settings.update_checking": "กำลังตรวจสอบ...", + "settings.update_download_button": "ดาวน์โหลด", + "settings.update_downloading": "กำลังดาวน์โหลด...", + "settings.update_error": "ตรวจสอบอัปเดตไม่สำเร็จ", + "settings.update_install_button": "ติดตั้งและรีสตาร์ท", + "settings.update_last_checked": "ตรวจสอบล่าสุด {time}", + "settings.update_published": "เผยแพร่ {date}", + "settings.update_ready": "พร้อมติดตั้ง: v", + "settings.update_ready_version": "พร้อมติดตั้ง: v{version}", + "settings.update_uptodate": "เป็นเวอร์ชันล่าสุดแล้ว", + "settings.updates": "การอัปเดต", + "settings.updates_desc": "อัปเดต OpenWork ให้เป็นเวอร์ชันล่าสุด", + "settings.updates_desktop_only": "การอัปเดตใช้งานได้เฉพาะในแอปเดสก์ท็อป", + "settings.updates_not_supported": "ไม่รองรับการอัปเดตในสภาพแวดล้อมนี้", + "settings.updates_title": "การอัปเดต", + "settings.version": "เวอร์ชัน", + "settings.versions_desc": "ข้อมูล build ของ Sidecar + เดสก์ท็อป", + "settings.versions_title": "เวอร์ชัน", + "settings.window_appearance_desc": "ปรับแต่งรูปลักษณ์หน้าต่าง", + "settings.worker_id_label": "Worker {id}", + "settings.worker_unresolved": "Worker {runtimeWorkspaceId}", + "settings.workspace_config_desc": ".opencode/openwork.json", + "settings.workspace_config_title": "การตั้งค่าพื้นที่ทำงาน", + "settings.workspace_debug_events_label": "เหตุการณ์ดีบักพื้นที่ทำงาน", + "settings.workspace_fallback_name": "พื้นที่ทำงาน", + "share.active_cloud_org": "องค์กร Cloud ที่ใช้งาน", + "share.back_hint": "กลับไปตัวเลือกการแชร์", + "share.chooser_subtitle": "เลือกวิธีแชร์พื้นที่ทำงานนี้", + "share.close_hint": "ปิด", + "share.cloud_signin_note": "OpenWork Cloud จะเปิดในเบราว์เซอร์และกลับมาที่นี่หลังเข้าสู่ระบบ", + "share.collaborator_hint": "การเข้าถึงปกติโดยไม่ต้องอนุมัติสิทธิ์", + "share.connect_messaging_desc": "ใช้พื้นที่ทำงานนี้จาก Slack, Telegram และอื่น ๆ", + "share.connect_messaging_title": "เชื่อมต่อระบบข้อความ", + "share.connection_details_label": "รายละเอียดการเชื่อมต่อ", + "share.copy_hint": "คัดลอก", + "share.copy_link_hint": "คัดลอกลิงก์", + "share.create_template_link": "สร้างลิงก์เทมเพลต", + "share.credentials_disabled_hint": "เปิดการเข้าถึงระยะไกลแล้วคลิกบันทึกเพื่อรีสตาร์ท worker และแสดงรายละเอียดการเชื่อมต่อสำหรับพื้นที่ทำงานนี้", + "share.field_password": "รหัสผ่าน", + "share.field_worker_url": "URL ของ Worker", + "share.hide_password": "ซ่อนรหัสผ่าน", + "share.included_in_template": "รวมอยู่ในเทมเพลตนี้", + "share.option_access_desc": "แสดงรายละเอียดการเชื่อมต่อสำหรับเข้าถึงพื้นที่ทำงานนี้จากเครื่องอื่น", + "share.option_access_title": "เข้าถึงพื้นที่ทำงานระยะไกล", + "share.option_public_desc": "สร้างลิงก์แชร์ที่ทุกคนสามารถใช้เริ่มจากเทมเพลตนี้ได้", + "share.option_public_title": "เทมเพลตสาธารณะ", + "share.option_team_desc": "บันทึกเทมเพลตพื้นที่ทำงานนี้ไปยังองค์กร OpenWork Cloud ที่ใช้งาน", + "share.option_team_title": "แชร์กับทีม", + "share.option_template_desc": "รวมการตั้งค่านี้เพื่อให้คนอื่นเริ่มจากสภาพแวดล้อมเดียวกัน", + "share.option_template_title": "แชร์เทมเพลต", + "share.optional_collaborator": "การเข้าถึงผู้ร่วมงาน (ไม่บังคับ)", + "share.public_intro": "แชร์พื้นที่ทำงานนี้เป็นลิงก์เทมเพลตสาธารณะ", + "share.publishing": "กำลังเผยแพร่...", + "share.regenerate_link": "สร้างลิงก์ใหม่", + "share.remote_access_desc": "ปิดเป็นค่าเริ่มต้น เปิดเฉพาะเมื่อต้องการให้ worker นี้เข้าถึงได้จากเครื่องอื่น", + "share.remote_access_disabled": "การเข้าถึงระยะไกลปิดอยู่", + "share.remote_access_enabled": "การเข้าถึงระยะไกลเปิดอยู่", + "share.remote_access_title": "การเข้าถึงระยะไกล", + "share.remote_save": "บันทึก", + "share.remote_save_busy": "กำลังบันทึก...", + "share.reveal_password": "แสดงรหัสผ่าน", + "share.save_to_team": "บันทึกไปยังทีม", + "share.saving": "กำลังบันทึก...", + "share.setup": "ตั้งค่า", + "share.sign_in_to_share": "เข้าสู่ระบบเพื่อแชร์กับทีม", + "share.subtitle_access": "แสดงรายละเอียดการเชื่อมต่อสำหรับเข้าถึงพื้นที่ทำงานนี้จากเครื่องอื่น", + "share.subtitle_template_public": "สร้างลิงก์เทมเพลตพื้นที่ทำงานสาธารณะที่ทุกคนสามารถนำเข้าได้", + "share.subtitle_template_team": "บันทึกเทมเพลตพื้นที่ทำงานไปยังองค์กร OpenWork Cloud ที่ใช้งาน", + "share.team_intro": "บันทึกเทมเพลตนี้ไปยังองค์กร OpenWork Cloud ที่ใช้งานเพื่อให้เพื่อนร่วมทีมเปิดได้ภายหลังจากการตั้งค่า Cloud", + "share.template_intro": "แชร์การตั้งค่าที่ใช้ซ้ำได้โดยไม่ต้องให้สิทธิ์เข้าถึงพื้นที่ทำงานที่กำลังทำงาน", + "share.template_item_config": "คำสั่งและ config", + "share.template_item_config_desc": "คำสั่งที่ใช้ซ้ำได้พร้อม config ของ OpenWork/OpenCode", + "share.template_item_settings": "การตั้งค่าพื้นที่ทำงาน", + "share.template_item_settings_desc": "โปรไฟล์พื้นที่ทำงานที่แชร์และพฤติกรรมเริ่มต้น", + "share.template_item_skills": "Skills ที่รวมไว้", + "share.template_item_skills_desc": "Skills กำหนดเองที่บันทึกในพื้นที่ทำงานนี้", + "share.template_name_label": "ชื่อเทมเพลต", + "share.title": "แชร์พื้นที่ทำงาน", + "share.view_access": "เข้าถึงพื้นที่ทำงานระยะไกล", + "share.view_template": "แชร์เทมเพลต", + "share.view_template_public": "เทมเพลตสาธารณะ", + "share.view_template_team": "แชร์กับทีม", + "share.warning_basic": "แชร์กับคนที่เชื่อถือได้เท่านั้น ข้อมูลรับรองนี้ให้สิทธิ์เข้าถึงพื้นที่ทำงานแบบสด", + "share.warning_full": "ข้อมูลรับรองนี้ให้สิทธิ์เข้าถึงพื้นที่ทำงานแบบสด การแชร์พื้นที่ทำงานระยะไกลอาจอนุญาตให้ทุกคนที่เข้าถึงเครือข่ายควบคุม worker ของคุณ", + "share.workspace_fallback": "พื้นที่ทำงาน", + "share.workspace_template_desc": "แชร์การตั้งค่าหลักและค่าเริ่มต้นของพื้นที่ทำงาน", + "share.workspace_template_title": "เทมเพลตพื้นที่ทำงาน", + "share_skill_destination.add_to_workspace": "เพิ่มไปยังพื้นที่ทำงาน", + "share_skill_destination.adding": "กำลังเพิ่ม...", + "share_skill_destination.confirm_busy": "กำลังเพิ่ม skill...", + "share_skill_destination.confirm_button": "เพิ่ม skill ไปยังพื้นที่ทำงาน", + "share_skill_destination.connect_remote": "เชื่อมต่อพื้นที่ทำงานระยะไกล", + "share_skill_destination.connect_remote_desc": "แนบ OpenWork host จากนั้นเลือกจากรายการเพื่อนำเข้า skill นี้", + "share_skill_destination.connect_remote_hint": "เชื่อมต่อ OpenWork host แล้วเลือกจากรายการเพื่อนำเข้า skill นี้", + "share_skill_destination.create_worker": "สร้างพื้นที่ทำงานใหม่", + "share_skill_destination.create_worker_desc": "เปิดขั้นตอนสร้างพื้นที่ทำงาน แล้วเพิ่ม skill หลังจากพื้นที่ทำงานใหม่พร้อมใช้งาน", + "share_skill_destination.create_worker_hint": "เปิดขั้นตอนสร้างพื้นที่ทำงาน แล้วเพิ่ม skill หลังจากพื้นที่ทำงานใหม่พร้อม", + "share_skill_destination.current_badge": "ปัจจุบัน", + "share_skill_destination.existing_workers": "พื้นที่ทำงานที่มีอยู่", + "share_skill_destination.fallback_skill_name": "Skill ที่แชร์", + "share_skill_destination.footer_idle": "เลือกพื้นที่ทำงานเพื่อดำเนินการต่อ", + "share_skill_destination.footer_selected": "พื้นที่ทำงานที่เลือก:", + "share_skill_destination.local_badge": "ภายในเครื่อง", + "share_skill_destination.more_options": "ตัวเลือกเพิ่มเติม", + "share_skill_destination.new_destination": "ปลายทางใหม่", + "share_skill_destination.no_workers": "ยังไม่มีพื้นที่ทำงานพร้อมใช้งาน สร้างใหม่หรือเชื่อมต่อพื้นที่ทำงานระยะไกลเพื่อติดตั้ง skill นี้", + "share_skill_destination.remote_badge": "ระยะไกล", + "share_skill_destination.sandbox_badge": "Sandbox", + "share_skill_destination.selected_badge": "เลือกแล้ว", + "share_skill_destination.selected_hint": "เลือกแล้ว ตรวจสอบปลายทางด้านล่าง แล้วยืนยัน", + "share_skill_destination.skill_label": "Skill ที่แชร์", + "share_skill_destination.subtitle": "เลือกพื้นที่ทำงานที่มีอยู่หรือสร้างใหม่ก่อนนำเข้า skill ที่แชร์", + "share_skill_destination.title": "Skill นี้ควรไปที่ไหน?", + "share_skill_destination.trigger_label": "ทริกเกอร์", + "sidebar.active": "ใช้งานอยู่", + "sidebar.add_workspace": "เพิ่มพื้นที่ทำงานใหม่", + "sidebar.collapse": "ยุบ", + "sidebar.connect_remote": "เชื่อมต่อระยะไกล", + "sidebar.delete_session": "ลบเซสชัน", + "sidebar.drag_reorder": "ลากเพื่อเรียงลำดับใหม่", + "sidebar.edit_connection": "แก้ไขการเชื่อมต่อ", + "sidebar.expand": "ขยาย", + "sidebar.import_config": "นำเข้า config", + "sidebar.needs_attention": "ต้องให้ความสนใจ", + "sidebar.new_worker": "Worker ใหม่", + "sidebar.no_workspaces": "ยังไม่มีพื้นที่ทำงานในเซสชันนี้ เพิ่มเพื่อเริ่มต้น", + "sidebar.progress": "ความคืบหน้า", + "sidebar.show_fewer": "แสดงน้อยลง", + "sidebar.show_more": "แสดงเพิ่ม {count} รายการ", + "sidebar.stop_sandbox": "หยุด sandbox", + "sidebar.switch": "สลับ", + "sidebar.test_connection": "ทดสอบการเชื่อมต่อ", + "skills.add_custom_repo": "เพิ่ม GitHub repo กำหนดเอง", + "skills.add_git_repo": "เพิ่ม git repo", + "skills.add_openwork_hub": "เพิ่ม OpenWork Hub", + "skills.available_from_hub": "พร้อมใช้งานจาก Hub", + "skills.catalog_search_placeholder": "ค้นหา skills ที่ติดตั้ง, ทีม และ hub", + "skills.cloud_add_skill": "เพิ่ม skill", + "skills.cloud_choose_org_detail": "ใช้แผง Cloud เพื่อเลือกองค์กรที่ใช้งาน แล้วรีเฟรชรายการนี้", + "skills.cloud_choose_org_hint": "เลือกองค์กรใน Settings → Cloud เพื่อโหลด skills ของทีม", + "skills.cloud_footer_label": "ทีม", + "skills.cloud_hub_label": "Hub: {name}", + "skills.cloud_install_need_server": "เชื่อมต่อ OpenWork server ที่มีสิทธิ์เขียน skills เพื่อติดตั้ง skills ของทีมบน worker นี้", + "skills.cloud_installed": "ติดตั้ง {name} บน worker นี้แล้ว", + "skills.cloud_installing": "กำลังติดตั้ง {title}…", + "skills.cloud_installing_short": "กำลังติดตั้ง", + "skills.cloud_no_search_matches": "ไม่พบ skills ที่ตรงกับการค้นหา", + "skills.cloud_org_empty": "ยังไม่มี skills ขององค์กร", + "skills.cloud_org_fallback": "OpenWork Cloud", + "skills.cloud_org_load_failed": "โหลด skills ขององค์กรไม่สำเร็จ", + "skills.cloud_refresh": "รีเฟรช skills ของทีม", + "skills.cloud_section_subtitle": "Skills ที่แชร์กับคุณผ่าน OpenWork Cloud — รวมถึง skill hub ของทีมที่คุณเข้าถึงได้", + "skills.cloud_section_title": "จากองค์กรของคุณ", + "skills.cloud_shared_org": "องค์กร", + "skills.cloud_shared_public": "สาธารณะ", + "skills.cloud_sign_in": "เข้าสู่ระบบ Cloud", + "skills.cloud_sign_in_hint": "เข้าสู่ระบบ OpenWork Cloud เพื่อเรียกดู skills ของทีมและองค์กร", + "skills.copy_link_failed": "คัดลอกลิงก์ไม่สำเร็จ", + "skills.create_in_chat": "สร้าง skill ในแชท", + "skills.desktop_required": "การจัดการ Skills ต้องใช้แอปเดสก์ท็อป", + "skills.enter_plugin_name": "ใส่ชื่อแพ็กเกจ plugin", + "skills.failed_load_active": "โหลด plugins ที่ใช้งานไม่สำเร็จ", + "skills.failed_load_opencode": "โหลด opencode.json ไม่สำเร็จ", + "skills.failed_parse_opencode": "แปลง opencode.json ไม่สำเร็จ", + "skills.failed_to_load": "โหลด skills ไม่สำเร็จ", + "skills.failed_update_opencode": "อัปเดต opencode.json ไม่สำเร็จ", + "skills.filter_all": "ทั้งหมด", + "skills.filter_cloud": "ทีม", + "skills.filter_hub": "Hub", + "skills.filter_installed": "ติดตั้งแล้ว", + "skills.from_repo": "จาก {owner}/{repo}", + "skills.github_repo_hint": "ป้อน repo GitHub ในรูปแบบ owner/repo", + "skills.host_mode_only": "เฉพาะพื้นที่ทำงานภายในเครื่อง", + "skills.host_only_error": "การจัดการ Skills ต้องใช้พื้นที่ทำงานภายในเครื่องหรือ OpenWork server ที่เชื่อมต่อ", + "skills.hub_desc": "เรียกดู skills ที่แชร์จาก GitHub-backed hubs และเพิ่มลงใน worker นี้", + "skills.hub_label": "Hub", + "skills.import": "นำเข้า", + "skills.import_failed": "นำเข้าไม่สำเร็จ ({status})", + "skills.import_local": "นำเข้า skill ภายในเครื่อง", + "skills.import_local_hint": "คัดลอกโฟลเดอร์ skill ที่มีอยู่ไปยังพื้นที่ทำงานนี้", + "skills.import_local_skill": "นำเข้า skill ภายในเครื่อง", + "skills.imported": "นำเข้าแล้ว", + "skills.install": "ติดตั้ง", + "skills.install_failed": "ติดตั้ง skill ไม่สำเร็จ", + "skills.install_name_title": "ติดตั้ง {name}", + "skills.install_skill_creator": "ติดตั้ง skill creator", + "skills.install_skill_creator_hint": "Skill นี้ช่วยให้คุณสร้าง skills อื่นจากภายในแชท", + "skills.installed": "Skills ที่ติดตั้ง", + "skills.installed_desc": "Skills ที่ติดตั้งอยู่บน worker นี้ สามารถแก้ไขหรือแชร์ได้", + "skills.installed_label": "ติดตั้งแล้ว", + "skills.installed_status": "ติดตั้งแล้ว", + "skills.installing": "เพิ่ม skill", + "skills.installing_prefix": "กำลังติดตั้ง {name}…", + "skills.installing_skill_creator": "กำลังติดตั้ง skill creator...", + "skills.link_copied": "คัดลอกลิงก์แล้ว", + "skills.loading": "กำลังโหลด…", + "skills.no_description": "ยังไม่มีคำอธิบาย", + "skills.no_hub_repo_label": "ยังไม่ได้เลือก hub repo", + "skills.no_hub_repo_selected": "ไม่มี hub skills ที่ใช้ได้", + "skills.no_hub_skills": "ยังไม่ได้เลือก hub repo เพิ่ม GitHub repo เพื่อเรียกดู skills", + "skills.no_opencode_found": "ยังไม่พบ opencode.json เพิ่ม plugin เพื่อสร้าง", + "skills.no_opencode_workspace": "ยังไม่มี opencode.json ในพื้นที่ทำงานนี้", + "skills.no_skills": "ไม่พบ skills ใน `.opencode/skills`, `.claude/skills` หรือ `~/.agents/skills`", + "skills.no_skills_found": "ยังไม่พบ skills", + "skills.owner_label": "เจ้าของ", + "skills.owner_repo_required": "ต้องใส่เจ้าของและ repo", + "skills.pick_project_first": "เลือกโฟลเดอร์โปรเจกต์ก่อน", + "skills.pick_project_for_active": "เลือกโฟลเดอร์โปรเจกต์เพื่อโหลด plugins ที่ใช้งาน", + "skills.pick_project_for_plugins": "เลือกโฟลเดอร์โปรเจกต์เพื่อจัดการ plugins ของโปรเจกต์", + "skills.pick_workspace_first": "เลือกโฟลเดอร์พื้นที่ทำงานก่อน", + "skills.plugin_already_listed": "Plugin มีอยู่ใน opencode.json แล้ว", + "skills.plugin_management_host_only": "การจัดการ plugins ต้องใช้แอปเดสก์ท็อป", + "skills.plugins_host_only": "Plugins ใช้งานได้เฉพาะในแอปเดสก์ท็อป", + "skills.ref_label": "Ref (branch/tag/commit)", + "skills.refresh": "รีเฟรช", + "skills.refresh_hub": "รีเฟรช hub", + "skills.refresh_hub_title": "รีเฟรชแค็ตตาล็อก hub", + "skills.remove_saved_repo": "ลบ repo ที่บันทึก", + "skills.repo_label": "Repo", + "skills.reveal_failed": "เปิดโฟลเดอร์ skills ไม่สำเร็จ", + "skills.reveal_folder": "เปิดโฟลเดอร์ skills", + "skills.reveal_folder_hint": "เปิดโฟลเดอร์ skills ในตัวจัดการไฟล์", + "skills.save_and_load": "บันทึกและโหลด", + "skills.save_failed": "บันทึก skill ไม่สำเร็จ", + "skills.select_skill_folder": "เลือกโฟลเดอร์ skill", + "skills.share_back": "กลับ", + "skills.share_chooser_subtitle": "บันทึกไปยังองค์กร OpenWork Cloud หรือเผยแพร่ลิงก์ติดตั้งสาธารณะ", + "skills.share_close": "ปิด", + "skills.share_copy_link": "คัดลอก", + "skills.share_done": "เสร็จสิ้น", + "skills.share_option_public_desc": "สร้างลิงก์ที่ทุกคนสามารถใช้ติดตั้ง skill นี้ได้", + "skills.share_option_public_title": "ลิงก์สาธารณะ", + "skills.share_option_team_desc": "เพิ่ม skill นี้ไปยังองค์กร OpenWork Cloud ที่ใช้งาน", + "skills.share_option_team_title": "แชร์กับทีม", + "skills.share_public_create": "สร้างลิงก์", + "skills.share_public_creating": "กำลังเผยแพร่…", + "skills.share_public_intro": "เผยแพร่ลิงก์สาธารณะ ทุกคนที่มี URL สามารถติดตั้ง skill นี้ได้", + "skills.share_public_regenerate": "สร้างลิงก์ใหม่", + "skills.share_publisher_label": "ผู้เผยแพร่", + "skills.share_subtitle_public": "ทุกคนที่มีลิงก์สามารถติดตั้ง skill นี้ได้", + "skills.share_subtitle_team": "จัดเก็บในองค์กรสำหรับเพื่อนร่วมทีม", + "skills.share_team_choose_org": "เลือกองค์กรใน Settings → Cloud ก่อนแชร์กับทีม", + "skills.share_team_hub_label": "เพิ่มไปยัง skill hub (ไม่บังคับ)", + "skills.share_team_hub_none": "เฉพาะองค์กร — ไม่อยู่ใน hub", + "skills.share_team_hubs_loading": "กำลังโหลด hubs…", + "skills.share_team_intro": "บันทึก skill นี้ไปยังองค์กรที่ใช้งานเพื่อให้เพื่อนร่วมทีมติดตั้งจาก Cloud ได้", + "skills.share_team_org_fallback": "องค์กร Cloud ที่ใช้งาน", + "skills.share_team_save": "บันทึกไปยังทีม", + "skills.share_team_saving": "กำลังบันทึก…", + "skills.share_team_sign_in": "เข้าสู่ระบบเพื่อแชร์กับทีม", + "skills.share_team_sign_in_hint": "OpenWork Cloud จะเปิดในเบราว์เซอร์ กลับมาที่นี่หลังเข้าสู่ระบบ", + "skills.share_team_success": "บันทึกไปยัง {org} แล้ว เพื่อนร่วมทีมสามารถติดตั้งจาก skills ขององค์กร", + "skills.share_title": "แชร์ skill", + "skills.shown_count": "แสดง {count} รายการ", + "skills.skill_creator_already_installed": "ติดตั้ง skill creator แล้ว", + "skills.skill_creator_installed": "ติดตั้ง skill creator แล้ว", + "skills.skill_load_failed": "โหลด skill ไม่สำเร็จ", + "skills.source_label": "แหล่ง", + "skills.subtitle": "จัดการ Skills สำหรับพื้นที่ทำงานนี้", + "skills.title": "Skills", + "skills.trigger_label": "ทริกเกอร์: {trigger}", + "skills.uninstall": "ถอนการติดตั้ง", + "skills.uninstall_failed": "ถอนการติดตั้ง skill ไม่สำเร็จ", + "skills.uninstall_title": "ถอนการติดตั้ง skill?", + "skills.uninstall_warning": "การดำเนินการนี้จะลบ skill `{name}` ออกจากพื้นที่ทำงานอย่างถาวร", + "skills.uninstalled": "ลบ skill แล้ว", + "skills.unknown_error": "ข้อผิดพลาดที่ไม่ทราบสาเหตุ", + "skills.worker_profile_desc": "Skills คือความสามารถหลักของ worker นี้ ค้นพบจาก Hub จัดการที่ติดตั้ง และสร้างใหม่ในแชทได้โดยตรง", + "status.back": "กลับไปหน้าจอก่อนหน้า", + "status.connected": "เชื่อมต่อแล้ว", + "status.connecting": "กำลังเชื่อมต่อ", + "status.creating_task": "กำลังสร้างงานใหม่", + "status.creating_workspace": "กำลังสร้างพื้นที่ทำงาน", + "status.developer_mode": "โหมดนักพัฒนา", + "status.disconnected": "ตัดการเชื่อมต่อ", + "status.disconnected_hint": "เปิดการตั้งค่าเพื่อเชื่อมต่อใหม่", + "status.disconnected_label": "ตัดการเชื่อมต่อ", + "status.disconnecting": "กำลังตัดการเชื่อมต่อ", + "status.feedback": "ข้อเสนอแนะ", + "status.idle": "ว่าง", + "status.installing_opencode": "กำลังติดตั้ง OpenCode", + "status.limited_hint": "เชื่อมต่อใหม่เพื่อคืนค่าฟีเจอร์ OpenWork ทั้งหมด", + "status.limited_mcp_hint": "เชื่อมต่อ {count} MCP · เชื่อมต่อใหม่เพื่อฟีเจอร์ทั้งหมด", + "status.limited_mode": "โหมดจำกัด", + "status.live": "ขณะนี้", + "status.loading_session": "กำลังโหลดเซสชัน", + "status.mcp_connected": "เชื่อมต่อ {count} MCP", + "status.openwork_ready": "OpenWork พร้อม", + "status.providers_connected": "เชื่อมต่อ {count} ผู้ให้บริการ", + "status.ready_for_tasks": "พร้อมรับงานใหม่", + "status.reloading_engine": "กำลังรีโหลด engine", + "status.restarting_engine": "กำลังรีสตาร์ท engine", + "status.running": "กำลังทำงาน", + "status.send_feedback": "ส่งข้อเสนอแนะ", + "status.settings": "การตั้งค่า", + "status.starting_engine": "กำลังเริ่ม engine", + "system.cache_repair_requires_desktop": "การซ่อมแคชต้องใช้แอปเดสก์ท็อป", + "system.docker_cleanup_requires_desktop": "การล้าง Docker ต้องใช้แอปเดสก์ท็อป", + "system.reload_body_agents": "OpenCode โหลด agent ตอนเริ่มต้น โหลด engine ใหม่เพื่อให้ agent ที่อัปเดตพร้อมใช้งาน", + "system.reload_body_commands": "OpenCode โหลดคำสั่งตอนเริ่มต้น โหลด engine ใหม่เพื่อให้คำสั่งที่อัปเดตพร้อมใช้งาน", + "system.reload_body_config": "OpenCode อ่าน opencode.json ตอนเริ่มต้น โหลด engine ใหม่เพื่อใช้การเปลี่ยนแปลงการตั้งค่า", + "system.reload_body_default": "OpenWork ตรวจพบการเปลี่ยนแปลงที่ต้องโหลด OpenCode ใหม่", + "system.reload_body_mcp": "OpenCode โหลด MCP server ตอนเริ่มต้น โหลด engine ใหม่เพื่อเปิดใช้งานการเชื่อมต่อใหม่", + "system.reload_body_mixed": "OpenWork ตรวจพบการเปลี่ยนแปลงการตั้งค่า OpenCode โหลด engine ใหม่เพื่อใช้งาน", + "system.reload_body_plugins": "OpenCode โหลดปลั๊กอิน npm ตอนเริ่มต้น โหลด engine ใหม่เพื่อใช้การเปลี่ยนแปลง opencode.json", + "system.reload_body_skills": "OpenCode อาจแคชการค้นหา skill โหลด engine ใหม่เพื่อให้ skill ที่ติดตั้งใหม่พร้อมใช้งาน", + "system.reload_failed": "ไม่สามารถโหลด engine ใหม่ได้", + "system.reload_required": "ต้องโหลดใหม่", + "system.reload_unavailable": "ไม่สามารถโหลดใหม่สำหรับ worker นี้", + "system.stop_active_runs_before_reset": "หยุดการทำงานที่กำลังดำเนินอยู่ก่อนรีเซ็ต", + "system.stop_runs_before_update": "หยุดการทำงานที่กำลังดำเนินอยู่ก่อนติดตั้งอัปเดต", + "system.updates_not_supported": "ไม่รองรับการอัปเดตในสภาพแวดล้อมนี้", + "time.hours_ago": "{count} ชั่วโมงที่แล้ว", + "time.just_now": "เมื่อสักครู่", + "time.minutes_ago": "{count} นาทีที่แล้ว", + "time.seconds_ago": "{count} วินาทีที่แล้ว", + "workspace.loading_tasks": "กำลังโหลดงาน...", + "workspace.local_badge": "ภายในเครื่อง", + "workspace.new_task_inline": "+ งานใหม่", + "workspace.no_tasks": "ยังไม่มีงาน", + "workspace.remote_badge": "ระยะไกล", + "workspace.rename_description": "อัปเดตชื่อที่แสดงในแถบด้านข้าง", + "workspace.rename_label": "ชื่อพื้นที่ทำงาน", + "workspace.rename_placeholder": "พื้นที่ทำงานทีมออกแบบ", + "workspace.rename_title": "แก้ไขชื่อพื้นที่ทำงาน", + "workspace.sandbox_badge": "Sandbox", + "workspace.selected": "เลือกแล้ว", + "workspace.switch": "สลับ", + "workspace.switching_status_connecting": "กำลังตรวจสอบการเชื่อมต่อ", + "workspace.switching_status_loading": "กำลังโหลดงานล่าสุด", + "workspace.switching_status_preparing": "กำลังเตรียมข้อมูล", + "workspace.switching_subtitle": "เรากำลังโหลดงานล่าสุดของคุณกลับมา", + "workspace.switching_title": "กำลังเปิด {name}", + "workspace.switching_title_unknown": "กำลังเปิดพื้นที่ทำงาน", + "workspace_list.add_workspace": "เพิ่มพื้นที่ทำงาน", + "workspace_list.connect_remote": "เชื่อมต่อพื้นที่ทำงานระยะไกล", + "workspace_list.connecting": "กำลังเชื่อมต่อ...", + "workspace_list.delete_session": "ลบเซสชัน", + "workspace_list.desktop_only_hint": "สร้างพื้นที่ทำงานภายในเครื่องในแอปเดสก์ท็อป", + "workspace_list.edit_connection": "แก้ไขการเชื่อมต่อ", + "workspace_list.edit_name": "แก้ไขชื่อ", + "workspace_list.hide_child_sessions": "ซ่อนเซสชันย่อย", + "workspace_list.import_config": "นำเข้า config", + "workspace_list.new_workspace": "พื้นที่ทำงานใหม่", + "workspace_list.recover": "กู้คืน", + "workspace_list.remove_workspace": "ลบพื้นที่ทำงาน", + "workspace_list.rename_session": "เปลี่ยนชื่อเซสชัน", + "workspace_list.reveal_explorer": "เปิดใน Explorer", + "workspace_list.reveal_finder": "เปิดใน Finder", + "workspace_list.session_actions": "การดำเนินการเซสชัน", + "workspace_list.share": "แชร์...", + "workspace_list.show_child_sessions": "แสดงเซสชันย่อย", + "workspace_list.show_more": "แสดงเพิ่ม {count} รายการ", + "workspace_list.show_more_fallback": "แสดงเพิ่มเติม", + "workspace_list.test_connection": "ทดสอบการเชื่อมต่อ", + "workspace_list.workspace_fallback": "พื้นที่ทำงาน", + "workspace_list.workspace_options": "ตัวเลือกพื้นที่ทำงาน", + "workspace_sidebar.automations": "ระบบออโตเมชั่น", + "workspace_sidebar.close_sidebar": "ปิดแถบด้านข้าง", + "workspace_sidebar.collapse_sidebar": "ยุบแถบด้านข้าง", + "workspace_sidebar.configuration": "การตั้งค่า", + "workspace_sidebar.expand_sidebar": "ขยายแถบด้านข้าง", + "workspace_sidebar.extensions": "ส่วนขยาย", + "workspace_sidebar.messaging": "ข้อความ", } as const; diff --git a/apps/app/src/i18n/locales/vi.ts b/apps/app/src/i18n/locales/vi.ts index 7b17e0d1f..afc5f8f16 100644 --- a/apps/app/src/i18n/locales/vi.ts +++ b/apps/app/src/i18n/locales/vi.ts @@ -4,858 +4,16 @@ */ export default { - // ==================== Dashboard ==================== - "dashboard.title": "Trang chủ", - "dashboard.sessions": "Phiên làm việc", - "dashboard.commands": "Commands", - "dashboard.skills": "Skills", - "dashboard.plugins": "Plugins", - "dashboard.mcps": "Ứng dụng", - "dashboard.settings": "Cài đặt", - "dashboard.home": "Trang chủ", - "dashboard.runs": "Lượt chạy", - "dashboard.find_workspace": "Tìm workspace...", - "dashboard.workspaces": "Workspaces", - "dashboard.no_workspaces": "Không có workspace phù hợp.", - "dashboard.new_workspace": "Tạo Workspace mới...", - "dashboard.new_remote_workspace": "Thêm Workspace từ xa...", - "dashboard.forget_workspace": "Xóa workspace", - "dashboard.remote": "Từ xa", - "dashboard.connection": "Kết nối", - "dashboard.local_engine": "Engine nội bộ", - "dashboard.client_mode": "Chế độ Client", - "dashboard.connected": "Đã kết nối", - "dashboard.not_connected": "Chưa kết nối", - "dashboard.stop_disconnect": "Dừng & Ngắt kết nối", - "dashboard.disconnect": "Ngắt kết nối", - "dashboard.new_task": "Tạo task", - "dashboard.new": "Tạo mới", - "dashboard.busy": "Đang bận", - "dashboard.hero_title": "Hôm nay bạn muốn làm gì?", - "dashboard.hero_description": "Mô tả mục tiêu. OpenWork sẽ thực hiện và lưu lại nhật ký.", - "dashboard.quick_start_commands": "Commands khởi đầu nhanh", - "dashboard.view_all": "Xem tất cả", - "dashboard.no_commands": "Chưa có command nào. Các command khởi đầu sẽ hiển thị ở đây.", - "dashboard.run_command": "Chạy command đã lưu", - "dashboard.recent_sessions": "Phiên gần đây", - "dashboard.this_workspace": "workspace này", - "dashboard.no_sessions": "Chưa có phiên nào.", - "dashboard.idle": "Rảnh", - "dashboard.running": "Đang chạy", - "dashboard.completed": "Hoàn thành", - "dashboard.failed": "Thất bại", - "dashboard.repairing_cache": "Đang sửa bộ nhớ đệm", - "dashboard.repair_cache": "Sửa bộ nhớ đệm", - "dashboard.retry": "Thử lại", - "dashboard.alpha": "Bản thử nghiệm", - "dashboard.create_workspace_title": "Tạo Workspace", - "dashboard.create_workspace_subtitle": "Khởi tạo workspace mới dựa trên thư mục.", - "dashboard.create_workspace_confirm": "Tạo Workspace", - "dashboard.create_sandbox_confirm": "Tạo dạng sandbox", - "dashboard.sandbox_get_ready_title": "Sandbox cần Docker", - "dashboard.sandbox_get_ready_action": "Chuẩn bị môi trường", - "dashboard.sandbox_get_ready_desc": "Chạy workspace này trong container Docker cách ly, an toàn và dễ tái tạo hơn.", - "dashboard.sandbox_checking_docker": "Đang kiểm tra Docker...", - "dashboard.create_remote_workspace_title": "Thêm Workspace từ xa", - "dashboard.create_remote_workspace_subtitle": "Lưu máy chủ OpenWork làm workspace.", - "dashboard.create_remote_workspace_confirm": "Thêm Workspace", - "dashboard.edit_remote_workspace_title": "Chỉnh sửa kết nối từ xa", - "dashboard.edit_remote_workspace_subtitle": "Cập nhật thông tin máy chủ OpenWork cho workspace này.", - "dashboard.edit_remote_workspace_confirm": "Lưu kết nối", - "dashboard.remote_workspace_title": "Workspace từ xa", - "dashboard.remote_workspace_hint": "Lưu máy chủ OpenWork để kết nối lại bất kỳ lúc nào.", - "dashboard.remote_base_url_label": "URL máy chủ OpenWork", - "dashboard.remote_base_url_placeholder": "http://127.0.0.1:", - "dashboard.remote_base_url_required": "Vui lòng nhập URL máy chủ để tiếp tục.", - "dashboard.openwork_host_label": "URL máy chủ OpenWork", - "dashboard.openwork_host_placeholder": "https://your-server.openwork.app", - "dashboard.openwork_host_hint": "Sử dụng URL được cung cấp bởi máy chủ OpenWork.", - "dashboard.openwork_host_token_label": "Token cộng tác hoặc chủ sở hữu", - "dashboard.openwork_host_token_placeholder": "Dán token của bạn", - "dashboard.openwork_host_token_hint": "Tùy chọn. Dùng token cộng tác cho truy cập thông thường hoặc token chủ sở hữu khi client này phải trả lời lời nhắc quyền.", - "dashboard.remote_mode_openwork_alpha": "Máy chủ OpenWork", - "dashboard.remote_mode_direct": "Kết nối trực tiếp (cũ)", - "dashboard.remote_connection_openwork": "OpenWork", - "dashboard.remote_connection_direct": "Trực tiếp", - "dashboard.remote_directory_label": "Thư mục workspace (tùy chọn)", - "dashboard.remote_directory_placeholder": "/home/team/project", - "dashboard.remote_directory_hint": "Để trống để dùng thư mục mặc định của máy chủ.", - "dashboard.remote_display_name_label": "Tên hiển thị (tùy chọn)", - "dashboard.remote_display_name_placeholder": "Workspace nhóm thiết kế", - "dashboard.select_folder": "Chọn thư mục", - "dashboard.choose_folder": "Chọn thư mục", - "dashboard.choose_folder_next": "Chia sẻ tệp với workspace của bạn.", - "dashboard.change": "Thay đổi", - "dashboard.opening": "Đang mở...", - "dashboard.choose_preset": "Chọn mẫu", - "dashboard.choose_folder_continue": "Chọn thư mục để tiếp tục.", - "dashboard.starter_workspace": "Workspace khởi đầu", - "dashboard.starter_workspace_desc": "Đã cấu hình sẵn để hướng dẫn bạn sử dụng plugins, commands và skills.", - "dashboard.empty_workspace": "Workspace trống", - "dashboard.empty_workspace_desc": "Bắt đầu từ thư mục trống, thêm những gì bạn cần.", - "dashboard.blueprints_workspace": "Blueprints", - "dashboard.blueprints_workspace_desc": "Bắt đầu với workspace sẵn sàng cho automation, skills tái sử dụng và luồng công việc chung.", - - // ==================== Workspace ==================== - "workspace.rename_title": "Đổi tên workspace", - "workspace.rename_description": "Cập nhật tên hiển thị trên thanh bên.", - "workspace.rename_label": "Tên workspace", - "workspace.rename_placeholder": "Workspace nhóm thiết kế", - - // ==================== Session ==================== - "session.no_selected": "Chưa chọn phiên nào", - "session.back_to_dashboard": "Về trang chủ", - "session.new_task": "Tạo task mới", - "session.recents": "Gần đây", - "session.recents_notice": "Các task này chạy trên máy của bạn và không đồng bộ qua các thiết bị.", - "session.ready_to_work_title": "Sẵn sàng làm việc", - "session.ready_to_work_description": "Mô tả task. Tôi sẽ hiển thị tiến trình và xin quyền khi cần.", - "session.document_label": "Tài liệu", - "session.standard_label": "Tiêu chuẩn", - "session.no_artifacts_fallback": "Chưa có artifact nào.", - "session.active_plugins_label": "Plugins đang hoạt động", - "session.active_plugins_count": "{count}", - "session.no_plugins_loaded": "Chưa tải plugin nào.", - "session.selected_folders_label": "Thư mục đã chọn", - "session.selected_folders_count": "{count}", - "session.working_files_label": "Tệp đang làm việc", - "session.none_yet_label": "Chưa có.", - "session.permission_required_title": "Cần cấp quyền", - "session.permission_required_description": "OpenCode đang yêu cầu quyền để tiếp tục.", - "session.permission_label_uppercase": "Quyền", - "session.scope_label_uppercase": "Phạm vi", - "session.details_label": "Chi tiết", - "session.steps_notice_text": "Các bước sẽ hiển thị khi task được triển khai.", - "session.ready_to_work": "Sẵn sàng làm việc", - "session.ready_description": "Mô tả task. Tôi sẽ hiển thị tiến trình và xin quyền khi cần.", - "session.hide_steps": "Ẩn các bước", - "session.view_steps": "Xem các bước", - "session.open": "Mở", - "session.reveal": "Hiện trong trình quản lý tệp", - "session.opened_toast": "Đã mở trong ứng dụng mặc định.", - "session.revealed_toast": "Đã hiện trong trình quản lý tệp.", - "session.artifact_path_missing": "Thiếu đường dẫn artifact.", - "session.desktop_only": "Chức năng mở chỉ khả dụng trong ứng dụng desktop.", - "session.open_failed": "Không thể mở artifact.", - "session.model": "Model", - "session.ready": "Sẵn sàng", - "session.connect_provider": "Kết nối provider để tùy chỉnh.", - "session.running": "Đang chạy", - "session.progress": "Tiến trình", - "session.steps_notice": "Các bước sẽ hiển thị khi task được triển khai.", - "session.artifacts": "Artifacts", - "session.no_artifacts": "Chưa có artifact nào.", - "session.context": "Ngữ cảnh", - "session.active_plugins": "Plugins đang hoạt động", - "session.no_plugins": "Chưa tải plugin nào.", - "session.selected_folders": "Thư mục đã chọn", - "session.working_files": "Tệp đang làm việc", - "session.none_yet": "Chưa có.", - "session.document": "Tài liệu", - "session.standard": "Tiêu chuẩn", - "session.try_notion_prompt": "Thử ngay: thiết lập CRM trong Notion", - "session.insert_prompt": "Chèn prompt", - "session.placeholder": "Hỏi OpenWork...", - "session.run": "Chạy", - "session.permission_required": "Cần cấp quyền", - "session.permission_description": "OpenCode đang yêu cầu quyền để tiếp tục.", - "session.permission_label": "Quyền", - "session.scope_label": "Phạm vi", - "session.details": "Chi tiết", - "session.deny": "Từ chối", - "session.once": "Một lần", - "session.allow_for_session": "Cho phép trong phiên này", - - "session.tasks_local_hint": "Các task này chạy trên máy của bạn và không đồng bộ qua các thiết bị.", - "session.recents_label": "Gần đây", - "session.model_standard": "Tiêu chuẩn", - "session.run_button_title": "Chạy", - "session.rename_title": "Đổi tên phiên", - "session.rename_description": "Cập nhật tên cho phiên này.", - "session.rename_label": "Tên phiên", - "session.rename_placeholder": "Nhập tên mới", - - // ==================== Commands ==================== - "commands.new": "Tạo mới", - "commands.empty_state": "Lưu prompt hoặc command để chạy lại chỉ với một chạm.", - "commands.workspace": "Workspace này", - "commands.global": "Tất cả workspaces", - "commands.other": "Commands khác", - "commands.run": "Chạy", - "commands.modal_title": "Lưu luồng tái sử dụng", - "commands.modal_description": "Lưu prompt hoặc command để dùng lại nhanh.", - "commands.name_label": "Tên command", - "commands.name_placeholder": "ví dụ: daily-standup", - "commands.name_hint": "Sẽ hiển thị dạng /daily-standup trong OpenCode.", - "commands.description_label": "Mô tả (tùy chọn)", - "commands.description_placeholder": "Command này làm gì?", - "commands.template_label": "Hướng dẫn", - "commands.template_placeholder": "Viết hướng dẫn bạn muốn tái sử dụng…", - "commands.template_hint": "Dùng $ARGUMENTS để nhận thông tin bổ sung.", - "commands.details_required": "Chi tiết", - "commands.default_description": "Chạy command đã lưu", - "commands.command_label": "Command", - "commands.details_label": "Chi tiết", - "commands.details_placeholder": "Thêm chi tiết (tùy chọn)", - "commands.details_hint": "Các chi tiết này sẽ được truyền vào command.", - "commands.run_modal_title": "Chạy command", - "commands.run_modal_description": "Thêm chi tiết trước khi chạy.", - "commands.run_modal_run": "Chạy command", - "commands.name_will_be": "Sẽ được tạo với tên", - "commands.override_title": "Thay thế command hiện có?", - "commands.override_description": "Đã tồn tại command cùng tên.", - "commands.override_warning": "Thao tác này sẽ thay thế command \"{name}\" hiện có. Không thể hoàn tác.", - "commands.override_confirm": "Thay thế", - "commands.override_cancel": "Giữ nguyên", - - // ==================== Skills ==================== - "skills.title": "Skills", - "skills.subtitle": "Quản lý skills cho workspace này.", - "skills.refresh": "Làm mới", - "skills.add_title": "Thêm skills", - "skills.add_description": "Cài đặt command khởi đầu, nhập skill, hoặc mở thư mục.", - "skills.install_from_openpackage": "Cài từ OpenPackage", - "skills.host_mode_only": "Chỉ workspace nội bộ", - "skills.install": "Cài đặt", - "skills.installed_label": "Đã cài", - "skills.install_hint": "Cài đặt gói OpenPackage vào workspace hiện tại. Skills sẽ nằm trong `.opencode/skills`.", - "skills.import_local": "Nhập skill từ máy", - "skills.import_local_hint": "Sao chép thư mục skill có sẵn vào workspace này.", - "skills.import": "Nhập", - "skills.curated_packages": "Gói được tuyển chọn", - "skills.view": "Xem", - "skills.search_placeholder": "Tìm kiếm gói hoặc danh sách (ví dụ: claude, registry, community)", - "skills.no_matches": "Không có kết quả phù hợp. Thử tìm kiếm khác.", - "skills.install_package": "Cài đặt", - "skills.registry_notice": "Đăng tải lên OpenPackage registry hiện yêu cầu xác thực. Chức năng tìm kiếm registry và đồng bộ danh sách tuyển chọn đang được lên kế hoạch.", - "skills.installed": "Skills đã cài", - "skills.no_skills": "Không phát hiện skills trong `.opencode/skills`, `.claude/skills`, hoặc `~/.agents/skills`.", - "skills.desktop_required": "Quản lý skills yêu cầu ứng dụng desktop.", - "skills.host_only_error": "Quản lý skills yêu cầu workspace nội bộ hoặc máy chủ OpenWork đã kết nối.", - "skills.install_skill_creator": "Cài skill creator", - "skills.install_skill_creator_hint": "Skill này cho phép bạn tạo skills khác ngay trong cuộc hội thoại.", - "skills.installing_skill_creator": "Đang cài skill creator...", - "skills.skill_creator_installed": "Đã cài skill creator.", - "skills.skill_creator_already_installed": "Skill creator đã được cài rồi.", - "skills.install_failed": "Cài đặt skill thất bại.", - "skills.reveal_folder": "Mở thư mục skills", - "skills.reveal_folder_hint": "Mở thư mục skills trong Finder.", - "skills.reveal_button": "Hiện trong Finder", - "skills.reveal_failed": "Không thể mở thư mục skills.", - "skills.uninstall": "Gỡ cài đặt", - "skills.uninstall_title": "Gỡ skill này?", - "skills.uninstall_warning": "Thao tác này sẽ xóa vĩnh viễn skill `{name}` khỏi workspace của bạn.", - "skills.uninstall_failed": "Gỡ skill thất bại.", - "skills.uninstalled": "Đã gỡ skill.", - "skills.share_title": "Chia sẻ skill", - "skills.share_chooser_subtitle": "Lưu vào tổ chức OpenWork Cloud hoặc tạo liên kết cài đặt công khai.", - "skills.share_subtitle_public": "Ai có liên kết cũng có thể cài skill này.", - "skills.share_subtitle_team": "Lưu trong tổ chức để đồng đội dùng.", - "skills.share_option_team_title": "Chia sẻ với nhóm", - "skills.share_option_team_desc": "Thêm skill này vào tổ chức OpenWork Cloud đang chọn.", - "skills.share_option_public_title": "Liên kết công khai", - "skills.share_option_public_desc": "Tạo liên kết để mọi người cài skill này.", - "skills.share_public_intro": "Tạo liên kết công khai. Ai có URL đều có thể cài skill.", - "skills.share_publisher_label": "Nhà phát hành", - "skills.share_public_create": "Tạo liên kết", - "skills.share_public_regenerate": "Tạo lại liên kết", - "skills.share_public_creating": "Đang xuất bản…", - "skills.share_copy_link": "Sao chép", - "skills.share_team_intro": "Lưu vào tổ chức đang chọn để đồng đội cài từ Cloud.", - "skills.share_team_org_fallback": "Tổ chức Cloud hiện tại", - "skills.share_team_hub_label": "Thêm vào skill hub (tùy chọn)", - "skills.share_team_hub_none": "Chỉ tổ chức — không gắn hub", - "skills.share_team_hubs_loading": "Đang tải hub…", - "skills.share_team_sign_in": "Đăng nhập để chia sẻ với nhóm", - "skills.share_team_sign_in_hint": "OpenWork Cloud mở trong trình duyệt. Đăng nhập rồi quay lại đây.", - "skills.share_team_save": "Lưu cho nhóm", - "skills.share_team_saving": "Đang lưu…", - "skills.share_team_success": "Đã lưu vào {org}. Đồng đội có thể cài từ skill của tổ chức.", - "skills.share_team_choose_org": "Chọn tổ chức trong Cài đặt → Cloud trước khi chia sẻ.", - "skills.share_back": "Quay lại", - "skills.share_close": "Đóng", - "skills.share_done": "Xong", - "skills.source_placeholder": "github:anthropics/claude-code", - "skills.notion_crm_title": "Skills làm giàu dữ liệu Notion CRM", - "skills.notion_crm_description": "Thêm luồng công việc làm giàu cho liên hệ, pipeline và theo dõi.", - "skills.notion_crm_card_description": "Làm giàu dữ liệu Notion CRM với skills có sẵn.", - "skills.connect_host_to_load": "Kết nối máy chủ OpenWork để tải skills.", - "skills.pick_workspace_first": "Vui lòng chọn thư mục workspace trước.", - "skills.no_skills_found": "Chưa tìm thấy skills nào.", - "skills.installed_description": "Skills khả dụng trong workspace này.", - "skills.failed_to_load": "Tải skills thất bại", - "skills.plugin_management_host_only": "Quản lý plugins yêu cầu ứng dụng desktop.", - "skills.plugins_host_only": "Plugins chỉ khả dụng trong ứng dụng desktop.", - "skills.pick_project_for_plugins": "Chọn thư mục dự án để quản lý plugins.", - "skills.pick_project_for_active": "Chọn thư mục dự án để tải plugins đang hoạt động.", - "skills.no_opencode_found": "Chưa tìm thấy opencode.json. Thêm plugin để tạo một file.", - "skills.no_opencode_workspace": "Chưa có opencode.json trong workspace này.", - "skills.failed_parse_opencode": "Phân tích opencode.json thất bại", - "skills.failed_load_opencode": "Tải opencode.json thất bại", - "skills.failed_load_active": "Tải plugins đang hoạt động thất bại.", - "skills.enter_plugin_name": "Nhập tên gói plugin.", - "skills.plugin_already_listed": "Plugin đã có trong opencode.json.", - "skills.failed_update_opencode": "Cập nhật opencode.json thất bại", - "skills.opackage_install_host_only": "Cài đặt OpenPackage yêu cầu ứng dụng desktop.", - "skills.pick_project_first": "Vui lòng chọn thư mục dự án trước.", - "skills.enter_opackage_source": "Nhập nguồn OpenPackage (ví dụ: github:anthropics/claude-code).", - "skills.installing_opackage": "Đang cài đặt OpenPackage...", - "skills.install_complete": "Đã cài đặt.", - "skills.curated_list_notice": "Đây là danh sách tuyển chọn, chưa phải OpenPackage. Sao chép đường dẫn hoặc theo dõi PRD để biết kế hoạch tích hợp tìm kiếm registry.", - "skills.import_host_only": "Nhập skill yêu cầu ứng dụng desktop.", - "skills.select_skill_folder": "Chọn thư mục skill", - "skills.import_failed": "Nhập thất bại ({status})", - "skills.imported": "Đã nhập.", - "skills.unknown_error": "Lỗi không xác định", - - // ==================== Plugins ==================== - "plugins.title": "OpenCode Plugins", - "plugins.description": "Quản lý `opencode.json` cho dự án hoặc plugins OpenCode toàn cục.", - "plugins.config_label": "Cấu hình", - "plugins.config_not_loaded": "Chưa tải", - "plugins.suggested_label": "Plugins gợi ý", - "plugins.no_plugins_yet": "Chưa cấu hình plugin nào.", - "plugins.enabled_label": "Đã bật", - "plugins.open_label": "Mở", - "plugins.path_label": "Đường dẫn", - "plugins.scope_project": "Dự án", - "plugins.scope_global": "Toàn cục", - "plugins.refresh": "Làm mới", - "plugins.config": "Cấu hình", - "plugins.not_loaded": "Chưa tải", - "plugins.suggested": "Plugins gợi ý", - "plugins.hide_setup": "Ẩn thiết lập", - "plugins.setup": "Thiết lập", - "plugins.added": "Đã thêm", - "plugins.add": "Thêm", - "plugins.enabled": "Đã bật", - "plugins.no_plugins": "Chưa cấu hình plugin nào.", - "plugins.add_label": "Thêm plugin", - "plugins.placeholder": "opencode-wakatime", - "plugins.add_hint": "Thêm tên gói npm, ví dụ: opencode-wakatime", - - // ==================== Apps (MCP) ==================== - "mcp.apps_title": "Ứng dụng", - "mcp.apps_subtitle": "Kết nối các công cụ yêu thích để OpenWork có thể sử dụng thay bạn.", - "mcp.app_connected": "ứng dụng đã kết nối", - "mcp.apps_connected": "ứng dụng đã kết nối", - "mcp.title": "Ứng dụng", - "mcp.description": "Kết nối công cụ của bạn chỉ với một cú nhấp.", - "mcp.alpha_banner_title": "Ứng dụng đang trong giai đoạn truy cập sớm, chúng tôi đang hoàn thiện trải nghiệm.", - "mcp.alpha_banner_help": "Nếu bạn muốn đóng góp, hãy mở PR kèm video ngắn minh họa luồng đăng nhập hoạt động từ đầu đến cuối.", - "mcp.mcps_title": "Ứng dụng", - "mcp.connect_mcp_hint": "Kết nối ứng dụng để mở rộng khả năng của OpenWork.", - "mcp.finish_setup": "Sắp xong rồi", - "mcp.finish_setup_hint": "Nhấn Kích hoạt để hoàn tất kết nối ứng dụng.", - "mcp.activate_button": "Kích hoạt", - "mcp.reload_banner_title": "Sắp xong rồi", - "mcp.reload_banner_description": "Nhấn Kích hoạt để hoàn tất kết nối ứng dụng.", - "mcp.reload_banner_description_blocked": "Một task đang chạy. Dừng trước rồi kích hoạt.", - "mcp.reload_banner_blocked_hint": "Dừng task đang chạy để kích hoạt.", - "mcp.available_apps": "Ứng dụng khả dụng", - "mcp.one_click_connect": "Kết nối một chạm", - "mcp.tap_to_connect": "Nhấn để kết nối", - "mcp.connected_badge": "Đã kết nối", - "mcp.your_apps": "Ứng dụng của bạn", - "mcp.last_synced": "Đã đồng bộ", - "mcp.no_apps_yet": "Chưa kết nối ứng dụng nào", - "mcp.no_apps_hint": "Kết nối một ứng dụng ở trên để bắt đầu.", - "mcp.quick_connect_title": "Ứng dụng khả dụng", - "mcp.oauth_only_label": "Một chạm", - "mcp.connected_status": "Đã kết nối", - "mcp.no_env_vars": "Không cần thiết lập thêm.", - "mcp.connected_title": "Ứng dụng của bạn", - "mcp.from_opencode_json": "Từ cấu hình", - "mcp.no_servers_yet": "Chưa kết nối ứng dụng nào.", - "mcp.edit_config_title": "Chỉnh sửa tệp cấu hình", - "mcp.edit_config_description": "Ứng dụng được lưu trong tệp cấu hình workspace.", - "mcp.docs_link": "Tìm hiểu thêm", - "mcp.scope_project": "Workspace này", - "mcp.scope_global": "Tất cả workspaces", - "mcp.config_label": "Cấu hình", - "mcp.config_file": "Tệp cấu hình", - "mcp.config_not_loaded": "Chưa tải", - "mcp.open_file_label": "Mở tệp", - "mcp.reveal_in_finder": "Hiện trong Finder", - "mcp.opening_label": "Đang mở...", - "mcp.file_not_found": "Chưa tạo tệp cấu hình", - "mcp.config_load_failed": "Không thể tải tệp cấu hình", - "mcp.open_file": "Mở tệp", - "mcp.pick_workspace_error": "Vui lòng chọn thư mục workspace trước.", - "mcp.reveal_config_failed": "Không thể mở tệp cấu hình", - "mcp.alpha_warning": "Ứng dụng đang trong giai đoạn truy cập sớm, chúng tôi đang hoàn thiện trải nghiệm.", - "mcp.github_issue": "Xem issue #9510 trên GitHub", - "mcp.contribution_guide": "Nếu bạn muốn đóng góp, hãy mở PR kèm video ngắn minh họa luồng đăng nhập hoạt động từ đầu đến cuối.", - "mcp.advanced_settings": "Cài đặt nâng cao", - "mcp.advanced_settings_hint": "Chỉnh sửa tệp cấu hình và quản lý kết nối thủ công.", - "mcp.hide_advanced": "Ẩn cài đặt nâng cao", - "mcp.show_advanced": "Hiện cài đặt nâng cao", - "mcp.mcps_label": "Ứng dụng", - "mcp.mcps_description": "Kết nối ứng dụng để mở rộng khả năng của OpenWork.", - "mcp.configured": "đã cấu hình", - "mcp.updated": "Đã đồng bộ", - "mcp.reload_required": "Cần kích hoạt", - "mcp.reload_description": "Kích hoạt để bắt đầu sử dụng kết nối mới.", - "mcp.reload_engine": "Kích hoạt", - "mcp.quick_connect": "Ứng dụng khả dụng", - "mcp.oauth_only": "Một chạm", - "mcp.connecting": "Đang kết nối...", - "mcp.connect": "Kết nối", - "mcp.connected": "Đã kết nối", - "mcp.connected_label": "Đã kết nối", - "mcp.no_env_required": "Không cần thiết lập thêm.", - "mcp.config_source": "Từ cấu hình", - "mcp.no_servers": "Chưa kết nối ứng dụng nào.", - "mcp.advanced": "Nâng cao", - "mcp.advanced_description": "Cho kết nối tùy chỉnh.", - "mcp.hide": "Ẩn", - "mcp.show": "Hiện", - "mcp.server_name": "Tên ứng dụng", - "mcp.server_name_placeholder": "github-copilot", - "mcp.server_url": "URL máy chủ", - "mcp.server_url_placeholder": "https://api.githubcopilot.com/mcp/", - "mcp.oauth": "Đăng nhập", - "mcp.api_key": "API key", - "mcp.enabled": "Đã bật", - "mcp.disabled": "Đã tắt", - "mcp.add_mcp": "Thêm ứng dụng", - "mcp.verify_connection": "Kiểm tra kết nối", - "mcp.cli_guidance": "Lệnh terminal (nâng cao)", - "mcp.config_locations": "Cấu hình có thể nằm trong opencode.json, opencode.jsonc, hoặc .opencode/opencode.json.", - "mcp.app_details": "Chi tiết ứng dụng", - "mcp.details_title": "Chi tiết ứng dụng", - "mcp.select_app_hint": "Chọn ứng dụng để xem chi tiết.", - "mcp.select_server_hint": "Chọn ứng dụng để xem chi tiết.", - "mcp.connection_type": "Kết nối", - "mcp.type_cloud": "Đám mây (đăng nhập bằng tài khoản)", - "mcp.type_local": "Nội bộ (chạy trên thiết bị này)", - "mcp.capabilities_label": "Tính năng", - "mcp.cap_tools": "Công cụ AI", - "mcp.cap_signin": "Đăng nhập tài khoản", - "mcp.tools_enabled_label": "Công cụ AI", - "mcp.oauth_ready_label": "Đăng nhập tài khoản", - "mcp.usage_hint_text": "Nhắc tên ứng dụng trong prompt để sử dụng công cụ của nó.", - "mcp.issue_label": "Sự cố", - "mcp.technical_details": "Chi tiết kỹ thuật", - "mcp.next_steps_label": "Cần làm gì", - "mcp.reload_step": "Kích hoạt sau khi kết nối ứng dụng mới.", - "mcp.auth_step": "Đăng nhập khi được yêu cầu.", - "mcp.connection_failed": "Lỗi kết nối — thử lại", - "mcp.needs_auth": "Cần đăng nhập", - "mcp.register_client": "Cần thiết lập", - "mcp.status_disabled": "Tạm dừng", - "mcp.disconnected": "Ngoại tuyến", - "mcp.failed": "Sự cố", - "mcp.friendly_status_ready": "Sẵn sàng", - "mcp.friendly_status_needs_signin": "Cần đăng nhập", - "mcp.friendly_status_paused": "Tạm dừng", - "mcp.friendly_status_offline": "Ngoại tuyến", - "mcp.friendly_status_issue": "Sự cố", - "mcp.host_mode_only": "Ứng dụng yêu cầu app desktop.", - "mcp.pick_workspace_first": "Vui lòng chọn thư mục workspace trước.", - "mcp.desktop_required": "Ứng dụng yêu cầu app desktop.", - "mcp.connect_server_first": "Vui lòng kết nối máy chủ trước.", - "mcp.reload_required_after_add": "Kích hoạt để bắt đầu sử dụng ứng dụng mới.", - "mcp.connect_failed": "Không thể kết nối. Vui lòng thử lại.", - "mcp.enter_name_and_url": "Nhập tên ứng dụng và URL.", - "mcp.enter_url_first": "Vui lòng nhập URL trước.", - "mcp.use_debug_command": "Chạy opencode mcp debug để khắc phục sự cố.", - "mcp.add_failed": "Không thể thêm ứng dụng.", - "mcp.remove_app": "Xóa", - "mcp.remove_failed": "Không thể xóa ứng dụng.", - "mcp.remove_modal_title": "Xóa ứng dụng", - "mcp.remove_modal_message": "Bạn có chắc muốn xóa {server}? Bạn luôn có thể thêm lại sau.", - - // Add MCP Modal - "mcp.add_modal_title": "Thêm ứng dụng tùy chỉnh", - "mcp.add_modal_subtitle": "Kết nối MCP server tùy chỉnh bằng URL hoặc lệnh nội bộ.", - "mcp.custom_app_cta_hint": "Kết nối MCP server, công cụ nội bộ hoặc ứng dụng được lưu trữ của riêng bạn.", - "mcp.server_type": "Loại", - "mcp.type_remote": "Từ xa (URL)", - "mcp.type_local_cmd": "Nội bộ (lệnh)", - "mcp.server_command": "Lệnh", - "mcp.server_command_placeholder": "npx -y @modelcontextprotocol/server-sequential-thinking", - "mcp.server_command_hint": "Lệnh shell để khởi động server.", - "mcp.sign_in_section_label": "Đăng nhập", - "mcp.oauth_optional_label": "Ứng dụng này yêu cầu đăng nhập", - "mcp.oauth_optional_hint": "Dùng OAuth trong trình duyệt để kết nối tài khoản của bạn.", - "mcp.remote_workspace_url_hint": "Workspace từ xa kết nối nhanh nhất với MCP server dạng URL.", - "mcp.add_server_button": "Thêm ứng dụng", - "mcp.name_required": "Vui lòng nhập tên server.", - "mcp.url_or_command_required": "Nhập URL cho server từ xa hoặc lệnh cho server nội bộ.", - - "mcp.logout_label": "OAuth", - "mcp.logout_action": "Đăng xuất", - "mcp.logout_working": "Đang đăng xuất...", - "mcp.logout_hint": "Xóa thông tin đăng nhập OAuth đã lưu. Bạn sẽ cần đăng nhập lại.", - "mcp.login_action": "Đăng nhập", - "mcp.login_hint": "Kết nối tài khoản để hoàn tất thiết lập ứng dụng.", - "mcp.login_unavailable": "Ứng dụng này không hỗ trợ đăng nhập từ OpenWork.", - "mcp.logout_modal_title": "Đăng xuất khỏi ứng dụng?", - "mcp.logout_modal_message": "Thao tác này sẽ xóa thông tin OAuth đã lưu của {server}. Bạn sẽ cần đăng nhập lại để sử dụng.", - "mcp.logout_success": "Đã đăng xuất khỏi {server}.", - "mcp.logout_failed": "Đăng xuất thất bại.", - - // MCP Auth Modal - "mcp.auth.open_browser_signin": "Chúng tôi sẽ mở trình duyệt để hoàn tất đăng nhập.", - "mcp.auth.connect_server": "Kết nối {server}", - "mcp.auth.already_connected": "Đã kết nối", - "mcp.auth.already_connected_description": "{server} đã được xác thực và sẵn sàng sử dụng.", - "mcp.auth.configured_previously": "MCP có thể đã được cấu hình toàn cục hoặc trong phiên trước. Bạn có thể đóng hộp thoại này và bắt đầu sử dụng ngay.", - "mcp.auth.reload_engine_retry": "Áp dụng thay đổi và thử lại", - "mcp.auth.retry_now": "Thử lại ngay", - "mcp.auth.retry": "Thử lại", - "mcp.auth.reload_failed": "Tải lại worker trước khi đăng nhập thất bại.", - "mcp.auth.applying_changes_title": "Đang áp dụng thay đổi trước khi đăng nhập", - "mcp.auth.applying_changes_body": "Chúng tôi đang khởi động lại worker để MCP mới sẵn sàng xác thực.", - "mcp.auth.waiting_for_conversation_title": "Đang đợi cuộc hội thoại hoàn tất", - "mcp.auth.waiting_for_conversation_body": "Chúng tôi sẽ chuyển hướng bạn để xác thực ngay khi có thể.", - "mcp.auth.waiting_for_session": "Đang đợi {session} hoàn tất", - "mcp.auth.force_stop": "Buộc dừng", - "mcp.auth.force_stopping": "Đang dừng...", - "mcp.auth.reload_before_oauth": "Tải lại engine để hoàn tất thiết lập MCP trước khi bắt đầu OAuth.", - "mcp.auth.reload_notice": "Để thay đổi có hiệu lực, OpenWork cần làm mới dịch vụ worker. Điều này có thể gián đoạn phiên đang chạy.", - "mcp.auth.reload_blocked": "Đang tạm dừng tải lại vì có phiên đang chạy. Dừng phiên để hoàn tất thiết lập.", - "mcp.auth.reload_remote_confirm": "Để thay đổi có hiệu lực, OpenWork cần làm mới dịch vụ worker. Điều này có thể dừng phiên đang chạy. Tiếp tục?", - "mcp.auth.reload_needed": "Hoàn tất thiết lập bằng cách tải lại engine, sau đó thử kết nối lại.", - "mcp.auth.manual_finish_title": "Server từ xa?", - "mcp.auth.manual_finish_hint": "Dán URL callback (localhost:19876) hoặc chỉ mã code để hoàn tất kết nối.", - "mcp.auth.callback_label": "URL callback hoặc mã code", - "mcp.auth.callback_placeholder": "http://127.0.0.1:19876/mcp/oauth/callback?code=...", - "mcp.auth.complete_connection": "Hoàn tất kết nối", - "mcp.auth.callback_invalid": "Dán URL callback hoặc tham số code để hoàn tất OAuth.", - "mcp.auth.port_forward_hint": "Mẹo: chuyển tiếp cổng callback nếu cần: ssh -L 19876:127.0.0.1:19876 user@host", - "mcp.auth.step1_title": "Đang mở trình duyệt", - "mcp.auth.step1_description": "Chúng tôi sẽ tự động mở trang đăng nhập của {server}.", - "mcp.auth.step2_title": "Cấp quyền cho OpenWork", - "mcp.auth.step2_description": "Đăng nhập và chấp thuận quyền truy cập khi được yêu cầu.", - "mcp.auth.step3_title": "Quay lại đây khi hoàn tất", - "mcp.auth.step3_description": "Chúng tôi sẽ hoàn tất kết nối ngay khi xác thực xong.", - "mcp.auth.waiting_authorization": "Đang đợi bạn hoàn tất xác thực trong trình duyệt...", - "mcp.auth.follow_browser_steps": "Làm theo các bước xác thực trong trình duyệt.", - "mcp.auth.reopen_browser_link": "Nhấn vào đây để mở lại trình duyệt", - "mcp.auth.done": "Xong", - "mcp.auth.cancel": "Hủy", - "mcp.auth.im_done": "Tôi đã xong", - "mcp.auth.client_registration_required": "Cần đăng ký client trước khi tiếp tục OAuth.", - "mcp.auth.server_disabled": "MCP server này đã bị tắt. Bật lại và thử lần nữa.", - "mcp.auth.oauth_failed": "Xác thực OAuth thất bại.", - "mcp.auth.invalid_refresh_token": "Refresh token OAuth không hợp lệ hoặc đã hết hạn. Vui lòng xác thực lại.", - "mcp.auth.reauth_action": "Xác thực lại OAuth", - "mcp.auth.reauth_running": "Đang xác thực lại...", - "mcp.auth.reauth_failed": "Xác thực lại thất bại.", - "mcp.auth.reauth_cli_hint": "Chạy: opencode mcp auth {server}", - "mcp.auth.reauth_remote_hint": "Xác thực lại từ máy đang chạy worker này.", - "mcp.auth.authorization_still_required": "Vẫn cần xác thực. Thử lại để khởi động lại luồng.", - "mcp.auth.oauth_not_supported_hint": "Điều này có thể do:\n• MCP server không hỗ trợ OAuth\n• Engine cần tải lại để phát hiện tính năng server\n• Thử: opencode mcp auth {server} từ CLI", - "mcp.auth.try_reload_engine": "{message}. Thử tải lại engine trước.", - "mcp.auth.failed_to_start_oauth": "Không thể khởi động luồng OAuth", - "mcp.auth.oauth_completed_reload": "OAuth hoàn tất. Tải lại engine để kích hoạt MCP.", - - // ==================== Settings ==================== - "settings.title": "Cài đặt", - "settings.connection": "Kết nối", - "settings.engine_source": "Nguồn engine", - "settings.from_path": "Từ PATH", - "settings.from_sidecar": "Sidecar đi kèm", - "settings.engine_source_description": "PATH sử dụng OpenCode bạn đã cài (mặc định). Sidecar sẽ dùng file nhị phân đi kèm khi có.", - "settings.sidecar_unsupported": "Sidecar khả dụng trên Windows", - "settings.sidecar_unavailable_detail": "Sidecar được đi kèm khi có.", - "settings.model": "Model", - "settings.model_description": "Mặc định + điều khiển suy luận cho các lượt chạy.", - "settings.change": "Thay đổi", - "settings.engine_path": "PATH", - "settings.engine_sidecar": "Sidecar", - "settings.thinking": "Suy luận", - "settings.thinking_description": "Hiển thị phần suy luận (chỉ chế độ Nhà phát triển).", - "settings.on": "Bật", - "settings.off": "Tắt", - "settings.model_variant": "Biến thể model", - "settings.edit": "Sửa", - "settings.default_model": "Model mặc định", - "settings.session_model": "Model", - "settings.model_description_default": "Chọn từ các provider đã cấu hình. Lựa chọn này áp dụng cho phiên mới.", - "settings.model_description_session": "Chọn từ các provider đã cấu hình. Lựa chọn này áp dụng cho tin nhắn tiếp theo.", - "settings.search_models": "Tìm model…", - "settings.showing_models": "Hiển thị {count} / {total}", - "settings.model_variant_prompt": "Biến thể model (theo provider, ví dụ: high/max/minimal). Để trống để xóa.", - "settings.model_fallback": "Dự phòng", - "settings.model_default": "Mặc định", - "settings.model_free": "Miễn phí", - "settings.model_reasoning": "Suy luận", - "settings.done": "Xong", - "settings.updates": "Cập nhật", - "settings.updates_description": "Giữ OpenWork luôn cập nhật.", - "settings.automatic_checks": "Kiểm tra tự động", - "settings.automatic_checks_description": "Một lần mỗi ngày (im lặng)", - "settings.update_checking": "Đang kiểm tra...", - "settings.update_available": "Có bản cập nhật: v", - "settings.update_downloading": "Đang tải xuống...", - "settings.update_ready": "Sẵn sàng cài đặt: v", - "settings.update_error": "Kiểm tra cập nhật thất bại", - "settings.update_uptodate": "Đã cập nhật mới nhất", - "settings.last_checked": "Kiểm tra lần cuối", - "settings.published": "Phát hành", - "settings.check_update": "Kiểm tra", - "settings.install_restart": "Cài đặt & Khởi động lại", - "settings.update_not_supported": "Cập nhật không được hỗ trợ trong môi trường này.", - "settings.update_desktop_only": "Cập nhật chỉ khả dụng trong ứng dụng desktop.", - "settings.startup": "Khởi động", - "settings.mode_label": "chế độ", - "settings.switch_mode": "Chuyển đổi", - "settings.reset_startup": "Đặt lại chế độ khởi động mặc định", - "settings.reset_startup_description": "Xóa tùy chọn đã lưu và hiện lựa chọn chế độ khi khởi động lần sau.", - "settings.advanced": "Nâng cao", - "settings.advanced_description": "Đặt lại trạng thái cục bộ OpenWork để kiểm tra lại quy trình bắt đầu.", - "settings.reset_onboarding": "Đặt lại bắt đầu", - "settings.reset_onboarding_description": "Xóa tùy chọn OpenWork và khởi động lại ứng dụng.", - "settings.reset_app_data": "Đặt lại dữ liệu ứng dụng", - "settings.reset_app_data_description": "Triệt để hơn. Xóa bộ nhớ đệm + dữ liệu ứng dụng OpenWork.", - "settings.reset": "Đặt lại", - "settings.requires_typing": "Yêu cầu nhập xác nhận", - "settings.will_restart": "và sẽ khởi động lại ứng dụng.", - "settings.reset_onboarding_title": "Đặt lại bắt đầu", - "settings.reset_app_data_title": "Đặt lại dữ liệu ứng dụng", - "settings.reset_confirmation_hint": "Nhập RESET để xác nhận. OpenWork sẽ khởi động lại.", - "settings.reset_onboarding_warning": "Xóa tùy chọn cục bộ và đánh dấu bắt đầu của OpenWork.", - "settings.reset_app_data_warning": "Xóa bộ nhớ đệm và dữ liệu ứng dụng OpenWork trên thiết bị này.", - "settings.reset_stop_active_runs": "Dừng các task đang chạy trước khi đặt lại.", - "settings.reset_confirmation_label": "Xác nhận", - "settings.reset_confirmation_placeholder": "Nhập RESET", - "settings.reset_cancel": "Hủy", - "settings.reset_confirm_button": "Đặt lại & Khởi động lại", - "settings.developer": "Nhà phát triển", - "settings.opencode_cache": "Bộ nhớ đệm OpenCode", - "settings.opencode_cache_description": "Sửa dữ liệu đệm dùng để khởi động engine. An toàn để chạy.", - "settings.repair_cache": "Sửa bộ nhớ đệm", - "settings.repairing_cache": "Đang sửa bộ nhớ đệm", - "settings.cache_repair_requires_desktop": "Sửa bộ nhớ đệm yêu cầu ứng dụng desktop", - "settings.pending_permissions": "Quyền đang chờ", - "settings.recent_events": "Sự kiện gần đây", - "settings.notion_connected": "Đã kết nối", - "settings.reload_required": "Cần tải lại", - "settings.connection_failed": "Kết nối thất bại", - "settings.notion_not_connected": "Chưa kết nối", - "settings.show_thinking": "Hiển thị suy luận", - "settings.update": "Cập nhật", - "settings.about": "Giới thiệu", - "settings.version": "Phiên bản", - "settings.check_for_updates": "Kiểm tra cập nhật", - "settings.download_update": "Tải bản cập nhật", - "settings.install_update": "Cài đặt và khởi động lại", - "settings.enable_developer_mode": "Bật chế độ Nhà phát triển", - "settings.disable_developer_mode": "Tắt chế độ Nhà phát triển", - "settings.stop_engine": "Dừng engine", - "settings.disconnect": "Ngắt kết nối", - "settings.language": "Ngôn ngữ", - "settings.language.description": "Chọn ngôn ngữ ưa thích", - "settings.connection_title": "Kết nối", - "settings.engine_source_label": "Nguồn engine", - "settings.engine_source_hint": "PATH sử dụng OpenCode bạn đã cài (mặc định). Sidecar sẽ dùng file nhị phân đi kèm khi có.", - "settings.sidecar_unavailable": "Sidecar được đi kèm khi có.", - "settings.model_title": "Model", - "settings.model_hint": "Mặc định + điều khiển suy luận cho các lượt chạy.", - "settings.thinking_label": "Suy luận", - "settings.thinking_hint": "Hiển thị phần suy luận (chỉ chế độ Nhà phát triển).", - "settings.model_variant_label": "Biến thể model", - "settings.appearance_title": "Giao diện", - "settings.appearance_hint": "Theo hệ thống hoặc buộc chế độ sáng/tối.", - "settings.theme_system": "Hệ thống", - "settings.theme_light": "Sáng", - "settings.theme_dark": "Tối", - "settings.theme_system_hint": "Chế độ hệ thống tự động theo tùy chọn hệ điều hành.", - "settings.updates_title": "Cập nhật", - "settings.updates_hint": "Giữ OpenWork luôn cập nhật.", - "settings.automatic_checks_label": "Kiểm tra tự động", - "settings.automatic_checks_hint": "Một lần mỗi ngày (im lặng)", - "settings.last_checked_time": "Kiểm tra lần cuối {time}", - "settings.published_date": "Phát hành {date}", - "settings.update_not_supported_hint": "Cập nhật không được hỗ trợ trong môi trường này.", - "settings.update_desktop_only_hint": "Cập nhật chỉ khả dụng trong ứng dụng desktop.", - "settings.startup_title": "Khởi động", - "settings.mode_suffix": "chế độ", - "settings.reset_startup_label": "Đặt lại chế độ khởi động mặc định", - "settings.reset_startup_hint": "Xóa tùy chọn đã lưu và hiện lựa chọn chế độ khi khởi động lần sau.", - "settings.advanced_title": "Nâng cao", - "settings.advanced_hint": "Đặt lại trạng thái cục bộ OpenWork để kiểm tra lại quy trình bắt đầu.", - "settings.reset_onboarding_label": "Đặt lại bắt đầu", - "settings.reset_onboarding_hint": "Xóa tùy chọn OpenWork và khởi động lại ứng dụng.", - "settings.reset_app_data_label": "Đặt lại dữ liệu ứng dụng", - "settings.reset_app_data_hint": "Triệt để hơn. Xóa bộ nhớ đệm + dữ liệu ứng dụng OpenWork.", - "settings.reset_requires_hint": "Yêu cầu nhập RESET và sẽ khởi động lại ứng dụng.", - "settings.developer_title": "Nhà phát triển", - "settings.opencode_cache_label": "Bộ nhớ đệm OpenCode", - "settings.opencode_cache_hint": "Sửa dữ liệu đệm dùng để khởi động engine. An toàn để chạy.", - "settings.pending_permissions_label": "Quyền đang chờ", - "settings.recent_events_label": "Sự kiện gần đây", - "settings.stop_active_runs_hint": "Dừng task đang chạy để cập nhật", - "settings.stop_active_runs_reset_hint": "Dừng task đang chạy để đặt lại", - "settings.stop_runs_to_update": "Dừng task đang chạy để cập nhật", - "settings.stop_runs_to_reset": "Dừng task đang chạy để đặt lại", - "settings.updates_not_supported": "Cập nhật không được hỗ trợ trong môi trường này.", - "settings.updates_desktop_only": "Cập nhật chỉ khả dụng trong ứng dụng desktop.", - - // ==================== Reload ==================== - "reload.toast_title": "Có cập nhật", - "reload.toast_description": "Tải lại workspace để áp dụng thay đổi cấu hình.", - "reload.toast_warning": "Dừng tất cả task đang chạy.", - "reload.toast_warning_active": "Tải lại sẽ dừng {count} task đang chạy.", - "reload.toast_reload": "Tải lại", - "reload.toast_reload_stopped": "Tải lại & Dừng task", - "reload.toast_reloading": "Đang tải lại...", - "reload.toast_dismiss": "Để sau", - "reload.toast_blocked_host": "Tải lại chỉ khả dụng cho worker nội bộ.", - "reload.toast_blocked_connect": "Kết nối workspace này để tải lại.", - "reload.toast_blocked_runs": "Đang đợi task hoàn tất trước khi tải lại.", - - // ==================== Onboarding ==================== - "onboarding.starting_host": "Đang khởi động máy chủ OpenWork...", - "onboarding.searching_host": "Đang kết nối máy chủ OpenWork...", - "onboarding.getting_ready": "Đang chuẩn bị mọi thứ", - "onboarding.verifying": "Xác minh kết nối bảo mật", - "onboarding.create_first_workspace": "Tạo workspace đầu tiên", - "onboarding.create_workspace": "Tạo workspace", - "onboarding.workspace_description": "Chọn thư mục và mẫu để thiết lập workspace.", - "onboarding.start": "Khởi động OpenWork", - "onboarding.back": "Quay lại", - "onboarding.advanced_settings": "Cài đặt nâng cao", - "onboarding.opencode_engine": "OpenCode engine", - "onboarding.refresh": "Làm mới", - "onboarding.checking_cli": "Đang kiểm tra OpenCode CLI...", - "onboarding.cli_not_found": "Không tìm thấy OpenCode CLI.", - "onboarding.cli_needs_update": "OpenCode CLI cần cập nhật để hỗ trợ serve.", - "onboarding.opencode": "OpenCode", - "onboarding.cli_ready": "OpenCode CLI sẵn sàng.", - "onboarding.cli_version": "OpenCode {version}", - "onboarding.windows_install_instruction": "Cài đặt OpenCode cho Windows, sau đó khởi động lại OpenWork. Đảm bảo opencode.exe có trong PATH.", - "onboarding.install_instruction": "Cài đặt OpenCode để bật máy chủ nội bộ (không cần terminal).", - "onboarding.install": "Cài đặt OpenCode", - "onboarding.recheck": "Kiểm tra lại", - "onboarding.ready_message": "OpenCode sẵn sàng khởi động máy chủ nội bộ.", - "onboarding.resolved_path": "Đường dẫn đã xác định", - "onboarding.version": "Phiên bản", - "onboarding.search_notes": "Ghi chú tìm kiếm", - "onboarding.serve_help": "Kết quả serve --help", - "onboarding.workspace_folder_label": "Workspace là một thư mục chứa skills, plugins và commands riêng.", - "onboarding.theme_label": "Giao diện", - "onboarding.theme_current": "Hiện tại: {mode}", - "onboarding.theme_system": "Hệ thống", - "onboarding.theme_light": "Sáng", - "onboarding.theme_dark": "Tối", - "onboarding.access_label": "Quyền truy cập", - "onboarding.folders_allowed": "{count} thư mục{plural} được phép", - "onboarding.manage_access_hint": "Bạn có thể quản lý quyền truy cập trong cài đặt nâng cao.", - "onboarding.open_settings_hint": "Cần tùy chọn engine hoặc truy cập? Mở Cài đặt.", - "onboarding.open_settings": "Mở Cài đặt", - "onboarding.add_folder_path": "Thêm đường dẫn thư mục", - "onboarding.pick": "Chọn", - "onboarding.add": "Thêm", - "onboarding.remove": "Xóa", - "onboarding.cli_label": "OpenCode CLI", - "onboarding.cli_checking": "Đang kiểm tra cài đặt...", - "onboarding.cli_not_found_hint": "Không tìm thấy. Cài đặt để chạy máy chủ nội bộ.", - "onboarding.cli_version_installed": "Đã cài đặt", - "onboarding.cli_recheck": "Kiểm tra lại", - "onboarding.cli_install_commands": "Cài đặt OpenCode bằng một trong các lệnh bên dưới, sau đó khởi động lại OpenWork.", - "onboarding.show_search_notes": "Hiện ghi chú tìm kiếm", - "onboarding.last_checked": "Kiểm tra lần cuối {time}", - "onboarding.server_url_placeholder": "http://localhost:8088", - "onboarding.directory_placeholder": "my-project", - "onboarding.connect_host": "Kết nối máy chủ", - "onboarding.connect_description": "Ghép nối với máy chủ OpenCode hiện có (LAN hoặc tunnel).", - "onboarding.server_url": "URL máy chủ", - "onboarding.directory": "Thư mục (tùy chọn)", - "onboarding.directory_hint": "Dùng khi máy chủ chạy nhiều worker.", - "onboarding.connect": "Kết nối", - "onboarding.remote_workspace_title": "Kết nối máy chủ OpenWork", - "onboarding.remote_workspace_description": "Kết nối máy chủ OpenWork để truy cập workspace từ mọi nơi.", - "onboarding.remote_workspace_action": "Kết nối", - "onboarding.remote_workspace_card_title": "Kết nối workspace từ xa", - "onboarding.remote_workspace_card_description": "Kết nối máy chủ OpenWork để truy cập workspace dùng chung.", - "onboarding.advanced_openwork_host": "Máy chủ OpenWork", - "onboarding.advanced_openwork_hint": "Dùng URL máy chủ và token truy cập để chia sẻ.", - "onboarding.advanced_opencode_direct": "Nâng cao: OpenCode trực tiếp", - "onboarding.advanced_opencode_hint": "Kết nối thẳng tới OpenCode engine khi không có máy chủ.", - "onboarding.welcome_title": "Hôm nay bạn muốn chạy OpenWork như thế nào?", - "onboarding.run_local": "Chạy nội bộ", - "onboarding.run_local_description": "OpenWork chạy OpenCode trên máy bạn và giữ công việc riêng tư.", - "onboarding.engine_running": "Engine đang chạy", - "onboarding.attach_description": "Gắn vào phiên hiện có trên thiết bị này.", - "onboarding.attach": "Gắn vào", - "onboarding.remember_choice": "Ghi nhớ lựa chọn cho lần sau", - "onboarding.client_mode": "Kết nối dạng Client (ghép từ xa)", - "onboarding.default_workspace_path": "~/OpenWork/Worker", - "onboarding.authorize_folder": "Cấp quyền thư mục", - "onboarding.choose_workspace_folder": "Chọn thư mục workspace", - - // ==================== Common ==================== - "common.alpha": "Bản thử nghiệm", - "common.change": "Thay đổi", - "common.refresh": "Làm mới", - "common.new": "Tạo mới", - "common.install": "Cài đặt", - "common.delete": "Xóa", - "common.edit": "Sửa", - "common.save": "Lưu", - "common.cancel": "Hủy", - "common.close": "Đóng", - "common.open": "Mở", - "common.show": "Hiện", - "common.hide": "Ẩn", - "common.path": "Đường dẫn", - "common.choose": "Chọn", - "common.retry": "Thử lại", - "common.untitled": "Chưa đặt tên", - "common.default_parens": "(mặc định)", - "common.on": "Bật", - "common.off": "Tắt", - - // ==================== Status ==================== - "status.connected": "Đã kết nối", - "status.disconnected": "Đã ngắt kết nối", - "status.idle": "Rảnh", - "status.busy": "Đang bận", - "status.running": "Đang chạy", - "status.live": "Trực tiếp", - "status.connecting": "Đang kết nối", - "status.creating_workspace": "Đang tạo workspace", - "status.deleting_command": "Đang xóa command", - "status.saving_workspace_command": "Đang lưu command của workspace", - "status.saving_command": "Đang lưu command", - "status.loading_session": "Đang tải phiên", - "status.creating_task": "Đang tạo task mới", - "status.starting_engine": "Đang khởi động engine", - "status.reloading_engine": "Đang tải lại engine", - "status.restarting_engine": "Đang khởi động lại engine", - "status.installing_opencode": "Đang cài đặt OpenCode", - "status.disconnecting": "Đang ngắt kết nối", - - // ==================== Workspace Switching ==================== - "workspace.switching_title": "Đang mở {name}", - "workspace.switching_title_unknown": "Đang mở workspace", - "workspace.switching_subtitle": "Chúng tôi sẽ đưa bạn về công việc gần đây.", - "workspace.switching_status_preparing": "Đang chuẩn bị", - "workspace.switching_status_connecting": "Đang kiểm tra kết nối", - "workspace.switching_status_loading": "Đang tải task gần đây", - "workspace.switching_status_almost": "Sắp xong", - + "app.compact_command_desc": "Tóm tắt phiên này để giảm kích thước ngữ cảnh.", "app.connection_lost": "Mất kết nối máy chủ. Vui lòng tải lại.", - "app.unknown_error": "Lỗi không xác định", - "app.error.tauri_required": "Thao tác này yêu cầu môi trường Tauri.", + "app.deep_link_auth_queued": "Đã xếp hàng liên kết xác thực Cloud cho OpenWork.", + "app.deep_link_remote_queued": "Đã xếp hàng liên kết worker từ xa. OpenWork sẽ chuyển sang luồng kết nối.", "app.error.choose_folder": "Chọn thư mục để tiếp tục.", - "app.error.pick_workspace_folder": "Vui lòng chọn thư mục workspace trước.", - "app.error.remote_base_url_required": "Vui lòng nhập URL máy chủ để tiếp tục.", "app.error.host_requires_local": "Chọn workspace nội bộ để khởi động engine.", - "app.error.sidecar_unsupported_windows": "Sidecar OpenCode trên Windows sẽ được đi kèm khi có. Tạm dùng PATH.", "app.error.install_failed": "Cài đặt OpenCode thất bại. Xem nhật ký ở trên.", - "app.error.command_name_template_required": "Tên command và hướng dẫn là bắt buộc.", - "app.error.workspace_commands_desktop": "Commands yêu cầu ứng dụng desktop.", - "app.error.command_scope_unknown": "Không thể quản lý command này trong chế độ hiện tại.", - - // ==================== App (missing) ==================== - "app.compact_command_desc": "Tóm tắt phiên này để giảm kích thước ngữ cảnh.", - "app.deep_link_auth_queued": "Đã xếp hàng liên kết xác thực Cloud cho OpenWork.", - "app.deep_link_remote_queued": "Đã xếp hàng liên kết worker từ xa. OpenWork sẽ chuyển sang luồng kết nối.", + "app.error.pick_workspace_folder": "Vui lòng chọn thư mục workspace trước.", + "app.error.remote_base_url_required": "Vui lòng nhập URL máy chủ để tiếp tục.", + "app.error.tauri_required": "Thao tác này yêu cầu môi trường Tauri.", "app.error_audit_load": "Tải nhật ký kiểm toán thất bại.", "app.error_auth_failed": "Xác thực thất bại", "app.error_auto_compact_scope": "Tự động thu gọn ngữ cảnh chỉ có thể thay đổi cho workspace nội bộ hoặc workspace OpenWork có quyền ghi.", @@ -898,21 +56,74 @@ export default { "app.skills_hint_disconnected": "Máy chủ OpenWork không khả dụng. Thêm URL/token máy chủ trong Nâng cao để quản lý skills.", "app.skills_hint_limited": "Máy chủ OpenWork cần token chủ sở hữu để cài đặt/cập nhật skills. Thêm trong Nâng cao và kết nối lại.", "app.skills_hint_readonly": "Máy chủ OpenWork chỉ đọc cho skills. Thêm token chủ sở hữu trong Nâng cao để bật cài đặt.", + "app.unknown_error": "Lỗi không xác định", "app.worker_fallback": "Worker", - - // ==================== Common (missing) ==================== + "automations.desktop_required": "Tác vụ lên lịch yêu cầu ứng dụng desktop.", + "automations.failed_to_load": "Tải tác vụ lên lịch thất bại.", + "automations.prompt_empty": "Prompt tự động hóa trống.", + "automations.prompt_required": "Prompt là bắt buộc.", + "automations.schedule_required": "Lịch trình là bắt buộc.", + "automations.server_needs_token": "Máy chủ OpenWork cần token để tải tác vụ lên lịch.", + "automations.server_not_ready": "Máy chủ OpenWork chưa sẵn sàng.", + "automations.server_unavailable": "Máy chủ OpenWork không khả dụng. Kết nối để đồng bộ tác vụ lên lịch.", + "blueprint.automation_body": "Bắt đầu từ luồng tái sử dụng hoặc nhập task bên dưới.", + "blueprint.automation_title": "Bạn muốn tự động hóa gì?", + "blueprint.csv_session_assistant": "Tôi có thể giúp bạn tạo, dọn dẹp, ghép nối và tóm tắt tệp CSV. Bạn muốn tự động hóa loại công việc CSV nào?", + "blueprint.csv_session_title": "Ý tưởng làm việc với CSV", + "blueprint.csv_session_user": "Tôi muốn ghép dữ liệu xuất từ nhiều công cụ thành một tệp CSV gọn gàng.", + "blueprint.empty_body": "Chọn điểm bắt đầu hoặc nhập bên dưới.", + "blueprint.empty_title": "Bạn muốn làm gì?", + "blueprint.minimal_body": "Đặt câu hỏi về workspace này hoặc dùng prompt khởi đầu.", + "blueprint.minimal_title": "Bắt đầu với một task", + "blueprint.starter_blueprint_desc": "Thiết kế luồng công việc tái sử dụng gồm skills, commands và bước chuyển giao.", + "blueprint.starter_blueprint_prompt": "Giúp tôi thiết kế một automation blueprint tái sử dụng cho workspace này. Hỏi tôi cần chuẩn hóa gì, rồi đề xuất luồng công việc.", + "blueprint.starter_blueprint_title": "Lập kế hoạch automation blueprint", + "blueprint.starter_chrome_desc": "Bắt đầu cuộc trò chuyện tự động hóa trình duyệt ngay.", + "blueprint.starter_chrome_prompt": "Giúp tôi kết nối Chrome và tự động hóa một tác vụ lặp lại.", + "blueprint.starter_chrome_title": "Tự động hóa Chrome", + "blueprint.starter_command_desc": "Biến luồng công việc lặp lại thành slash command cho workspace này.", + "blueprint.starter_command_prompt": "Giúp tôi tạo một /command tái sử dụng cho workspace này. Hỏi tôi muốn tự động hóa luồng nào, rồi soạn command.", + "blueprint.starter_command_title": "Tạo command tái sử dụng", + "blueprint.starter_connect_openai_desc": "Thêm provider OpenAI để các model ChatGPT sẵn sàng trong phiên mới.", + "blueprint.starter_connect_openai_title": "Kết nối ChatGPT", + "blueprint.starter_csv_desc": "Dọn dẹp hoặc tạo dữ liệu bảng tính.", + "blueprint.starter_csv_prompt": "Giúp tôi tạo hoặc chỉnh sửa tệp CSV trên máy tính này.", + "blueprint.starter_csv_title": "Làm việc với CSV", + "blueprint.starter_explore_desc": "Tóm tắt các tệp và gợi ý task đầu tiên nên làm.", + "blueprint.starter_explore_prompt": "Tóm tắt workspace này, chỉ ra các tệp quan trọng nhất và gợi ý task đầu tiên nên làm.", + "blueprint.starter_explore_title": "Khám phá workspace này", + "blueprint.welcome_message": "Xin chào, chào mừng bạn đến với OpenWork!\n\nMọi người dùng chúng tôi để tạo tệp .csv trên máy tính, kết nối Chrome và tự động hóa tác vụ lặp lại, cùng đồng bộ liên hệ với Notion.\n\nNhưng giới hạn duy nhất là trí tưởng tượng của bạn.\n\nBạn muốn làm gì?", + "blueprint.welcome_title": "Chào mừng đến với OpenWork", "common.add": "Thêm", - "common.copied": "Đã sao chép", - "common.copy": "Sao chép", + "common.cancel": "Hủy", + "common.choose": "Chọn", + "common.close": "Đóng", + "common.default_parens": "(mặc định)", "common.done": "Xong", + "common.edit": "Sửa", + "common.hide": "Ẩn", + "common.install": "Cài đặt", + "common.navigate": "điều hướng", + "common.next": "Tiếp", + "common.off": "Tắt", + "common.on": "Bật", + "common.path": "Đường dẫn", + "common.question": "Câu hỏi", + "common.refresh": "Làm mới", + "common.remove": "Xóa", "common.reset": "Đặt lại", + "common.retry": "Thử lại", + "common.save": "Lưu", + "common.select": "chọn", + "common.show": "Hiện", + "common.something_went_wrong": "Đã xảy ra lỗi", + "common.submit": "Gửi", "common.unknown": "Không rõ", - - // ==================== Composer ==================== "composer.agent_label": "Agent", "composer.attach_files": "Đính kèm tệp", "composer.attachments_unavailable": "Đính kèm không khả dụng.", "composer.behavior_label": "Hành vi", + "composer.configure": "Cấu hình", "composer.default_agent": "Agent mặc định", "composer.expand_pasted": "Nhấn để mở rộng văn bản đã dán", "composer.failed_read_attachment": "Đọc tệp đính kèm thất bại", @@ -923,25 +134,100 @@ export default { "composer.inserted_links_unsupported": "Đã chèn liên kết cho các tệp không được hỗ trợ.", "composer.loading_agents": "Đang tải agents...", "composer.loading_commands": "Đang tải commands...", - "composer.no_commands": "Không tìm thấy command.", - "composer.configure": "Cấu hình", - "composer.tools_label": "Lệnh, kỹ năng và MCP", "composer.mcps_label": "MCP", + "composer.no_commands": "Không tìm thấy command.", "composer.no_matches": "Không tìm thấy kết quả.", "composer.placeholder": "Mô tả task của bạn...", "composer.remote_worker_paste_warning": "Đây là worker từ xa. Sandbox cũng ở xa. Để chia sẻ tệp, tải lên Thư mục chia sẻ trong thanh bên.", "composer.run_task": "Chạy task", "composer.skill_source": "Skill", "composer.stop": "Dừng", + "composer.tools_label": "Commands, skills và MCP", "composer.unsupported_attachment_type": "Loại tệp đính kèm không được hỗ trợ.", "composer.upload_failed_local_links": "Không thể tải lên thư mục chia sẻ. Đã chèn liên kết cục bộ thay thế.", "composer.upload_to_shared_folder": "Tải lên thư mục chia sẻ", "composer.uploaded_multiple_files": "Đã tải {count} tệp lên thư mục chia sẻ và chèn liên kết.", "composer.uploaded_single_file": "Đã tải {name} lên thư mục chia sẻ và chèn liên kết.", - - // ==================== Context Panel ==================== + "config.auto_reload_desc": "Tự động tải lại sau khi agents/skills/commands/cấu hình thay đổi (chỉ khi rảnh).", + "config.auto_reload_title": "Tự động tải lại (nội bộ)", + "config.auto_reload_unavailable": "Khả dụng cho workspace nội bộ trong ứng dụng desktop.", + "config.collaborator_token_disabled_hint": "Đã lưu sẵn cho chia sẻ từ xa, nhưng truy cập từ xa hiện đang tắt.", + "config.collaborator_token_label": "Token cộng tác", + "config.collaborator_token_remote_hint": "Truy cập từ xa thông thường cho điện thoại hoặc laptop kết nối máy chủ này.", + "config.connection_failed": "Kết nối thất bại.", + "config.connection_failed_check": "Kết nối thất bại. Kiểm tra URL máy chủ và token.", + "config.connection_status_updated": "Đã cập nhật trạng thái kết nối.", + "config.connection_successful": "Kết nối thành công.", + "config.copied": "Đã sao chép", + "config.copy": "Sao chép", + "config.desktop_only_hint": "Một số tính năng cấu hình (chia sẻ máy chủ nội bộ + cầu nối nhắn tin) yêu cầu ứng dụng desktop.", + "config.diagnostics_desc": "Sao chép trạng thái runtime đã được lọc để gỡ lỗi.", + "config.diagnostics_title": "Gói chẩn đoán", + "config.enable_auto_reload_first": "Bật tự động tải lại trước", + "config.engine_reload_desc": "Khởi động lại máy chủ OpenCode cho workspace này.", + "config.engine_reload_title": "Tải lại engine", + "config.host_admin_token_hint": "Token nội bộ chỉ dành cho máy chủ, dùng cho CLI phê duyệt và API quản trị. Không sử dụng trong luồng kết nối ứng dụng từ xa.", + "config.host_admin_token_label": "Token quản trị máy chủ", + "config.host_local_only": "Chỉ nội bộ", + "config.host_offline": "Ngoại tuyến", + "config.host_remote_enabled": "Đã bật truy cập từ xa", + "config.local_ip_hint": "Dùng IP nội bộ trên cùng mạng Wi-Fi để kết nối nhanh nhất.", + "config.mdns_hint": "Tên .local dễ nhớ hơn nhưng có thể không hoạt động trên mọi mạng.", + "config.messaging_identities_desc": "Quản lý danh tính Telegram/Slack và định tuyến trong tab Danh tính.", + "config.messaging_identities_title": "Danh tính nhắn tin", + "config.not_set": "Chưa đặt", + "config.owner_token_disabled_hint": "Chỉ cần thiết sau khi bạn bật truy cập từ xa cho worker này.", + "config.owner_token_label": "Token chủ sở hữu", + "config.owner_token_remote_hint": "Dùng khi client từ xa cần trả lời yêu cầu quyền hoặc thực hiện thao tác chủ sở hữu.", + "config.reload_active_tasks_warning": "Tải lại sẽ dừng các task đang chạy.", + "config.reload_availability_hint": "Tải lại chỉ khả dụng cho worker nội bộ hoặc máy chủ OpenWork đã kết nối.", + "config.reload_connect_hint": "Kết nối worker này để tải lại.", + "config.reload_engine": "Tải lại engine", + "config.reload_now_desc": "Áp dụng cập nhật cấu hình và kết nối lại phiên của bạn.", + "config.reload_now_title": "Tải lại ngay", + "config.reloading": "Đang tải lại...", + "config.remote_access_off_hint": "Truy cập từ xa đang tắt. Dùng Chia sẻ workspace để bật trước khi kết nối từ máy khác.", + "config.resolved_worker_url": "URL worker đã xác định:", + "config.resume_sessions_desc": "Nếu tải lại được xếp hàng khi task đang chạy, gửi tin nhắn tiếp tục sau đó.", + "config.resume_sessions_title": "Tiếp tục phiên sau khi tự động tải lại", + "config.server_needed_hint": "Cần kết nối máy chủ OpenWork để đồng bộ skills, plugins và commands.", + "config.server_section_desc": "Kết nối máy chủ OpenWork. Dùng URL cùng token cộng tác hoặc chủ sở hữu từ quản trị viên.", + "config.server_section_title": "Máy chủ OpenWork", + "config.server_sharing_desc": "Chia sẻ thông tin này với thiết bị tin cậy. Giữ máy chủ trên cùng mạng để thiết lập nhanh nhất.", + "config.server_sharing_menu_hint": "Để chia sẻ theo workspace, dùng Chia sẻ... trong menu workspace.", + "config.server_sharing_title": "Chia sẻ máy chủ OpenWork", + "config.server_url_hint": "Dùng URL được cung cấp bởi máy chủ OpenWork. Worker desktop nội bộ dùng cổng cố định trong khoảng 48000-51000.", + "config.server_url_input_label": "URL máy chủ OpenWork", + "config.server_url_label": "URL máy chủ OpenWork", + "config.starting_server": "Đang khởi động máy chủ…", + "config.status_connected": "Đã kết nối", + "config.status_limited": "Giới hạn", + "config.status_not_connected": "Chưa kết nối", + "config.test_connection": "Kiểm tra kết nối", + "config.testing": "Đang kiểm tra...", + "config.testing_connection": "Đang kiểm tra kết nối...", + "config.token_hint": "Tùy chọn. Dùng token cộng tác cho truy cập thông thường hoặc token chủ sở hữu khi client này phải trả lời yêu cầu quyền.", + "config.token_label": "Token cộng tác hoặc chủ sở hữu", + "config.token_placeholder": "Dán token của bạn", + "config.unavailable": "Không khả dụng", + "config.worker_id": "ID Worker:", + "config.workspace_config_desc": "Các cài đặt này ảnh hưởng đến workspace đã chọn. Thao tác runtime áp dụng cho workspace đang kết nối.", + "config.workspace_config_title": "Cấu hình workspace", + "config.workspace_id_prefix": "Workspace:", + "context_panel.add_button": "Thêm", + "context_panel.add_folder_hint": "Thêm thư mục để workspace có thể đọc và chỉnh sửa tệp ngoài thư mục gốc.", + "context_panel.adding_button": "Đang thêm...", + "context_panel.always_available": "Luôn khả dụng", "context_panel.authorized_folders": "Thư mục được phép", + "context_panel.authorized_folders_desc": "Cấp quyền cho workspace này đọc và chỉnh sửa tệp trong thư mục bên ngoài thư mục gốc.", + "context_panel.authorized_folders_no_access": "Kết nối workspace máy chủ OpenWork có quyền ghi để chỉnh sửa thư mục được phép.", + "context_panel.browse_button": "Duyệt", + "context_panel.config_access_unavailable": "Quyền truy cập cấu hình máy chủ OpenWork không khả dụng cho workspace này.", + "context_panel.config_read_only": "Máy chủ OpenWork kết nối chỉ đọc cho cấu hình workspace.", "context_panel.context": "Ngữ cảnh", + "context_panel.folder_already_authorized": "Thư mục đã được cấp quyền.", + "context_panel.folders_updated": "Đã cập nhật thư mục được phép.", + "context_panel.input_placeholder": "Nhập đường dẫn thư mục để cấp quyền...", "context_panel.mcp": "MCP", "context_panel.mcp_connected": "Đã kết nối", "context_panel.mcp_disabled": "Đã tắt", @@ -949,41 +235,69 @@ export default { "context_panel.mcp_failed": "Thất bại", "context_panel.mcp_needs_auth": "Cần xác thực", "context_panel.mcp_register_client": "Đăng ký client", + "context_panel.no_external_folders": "Chưa cấp quyền thư mục bên ngoài", "context_panel.no_mcp": "Chưa tải MCP server nào.", "context_panel.no_plugins": "Chưa tải plugin nào.", + "context_panel.no_server_workspace": "Chưa chọn workspace máy chủ đang hoạt động.", "context_panel.no_skills": "Chưa tải skill nào.", "context_panel.none_yet": "Chưa có.", - "context_panel.open_file": "Mở {path}", "context_panel.plugins": "Plugins", + "context_panel.preserving_entries": "Giữ nguyên {count} mục quyền không phải thư mục.", + "context_panel.preserving_entry": "Giữ nguyên 1 mục quyền không phải thư mục.", + "context_panel.remove_folder": "Xóa {name}", + "context_panel.saving_folders": "Đang lưu thư mục được phép...", + "context_panel.server_disconnected": "Máy chủ OpenWork đã ngắt kết nối.", "context_panel.skills": "Skills", "context_panel.working_files": "Tệp đang làm việc", - - // ==================== Dashboard (missing) ==================== + "context_panel.workspace_root_available": "Thư mục gốc workspace đã khả dụng.", + "context_panel.workspace_root_badge": "Thư mục gốc workspace", + "context_panel.writable_workspace_required": "Cần workspace máy chủ OpenWork có quyền ghi để cập nhật thư mục được phép.", "dashboard.access_token": "Token truy cập", "dashboard.access_token_optional_hint": "Chỉ thêm token nếu worker yêu cầu.", + "dashboard.blueprints_workspace": "Blueprints", + "dashboard.blueprints_workspace_desc": "Bắt đầu với workspace sẵn sàng cho automation, skills tái sử dụng và luồng công việc chung.", + "dashboard.change": "Thay đổi", + "dashboard.choose_folder": "Chọn thư mục", + "dashboard.choose_folder_continue": "Chọn thư mục để tiếp tục.", + "dashboard.choose_folder_next": "Chia sẻ tệp với workspace của bạn.", + "dashboard.choose_preset": "Chọn mẫu", "dashboard.chooser_local_desc": "Tạo workspace trên thiết bị này và tùy chọn bắt đầu từ mẫu nhóm.", "dashboard.chooser_remote_desc": "Kết nối worker OpenWork tự lưu trữ bằng URL và token truy cập.", - "dashboard.chooser_shared_desc": "Duyệt worker đám mây được chia sẻ với tổ chức và kết nối chỉ một bước.", + "dashboard.chooser_shared_desc": "Duyệt worker Cloud được chia sẻ với tổ chức và kết nối chỉ một bước.", "dashboard.close_settings": "Đóng cài đặt", "dashboard.cloud_signin_button": "Tiếp tục với Cloud", "dashboard.cloud_signin_hint": "Truy cập worker từ xa được chia sẻ với tổ chức của bạn.", "dashboard.cloud_signin_next": "Bạn sẽ chọn nhóm và kết nối workspace hiện có ở bước tiếp theo.", "dashboard.cloud_signin_title": "Đăng nhập OpenWork Cloud", - "dashboard.cloud_worker": "Worker đám mây", + "dashboard.cloud_worker": "Worker Cloud", + "dashboard.commands": "Commands", "dashboard.connect_remote_button": "Kết nối từ xa", + "dashboard.connected": "Đã kết nối", "dashboard.connecting": "Đang kết nối...", "dashboard.create_local_workspace_subtitle": "Tạo workspace trên thiết bị này và tùy chọn bắt đầu từ mẫu nhóm.", "dashboard.create_local_workspace_title": "Workspace nội bộ", "dashboard.create_remote_custom_subtitle": "Kết nối worker OpenWork tự lưu trữ.", "dashboard.create_remote_custom_title": "Kết nối từ xa tùy chỉnh", - "dashboard.create_shared_subtitle_signed_in": "Duyệt worker đám mây được chia sẻ với tổ chức và kết nối chỉ một bước.", + "dashboard.create_remote_workspace_confirm": "Thêm Workspace", + "dashboard.create_remote_workspace_subtitle": "Lưu máy chủ OpenWork làm workspace.", + "dashboard.create_remote_workspace_title": "Thêm Workspace từ xa", + "dashboard.create_sandbox_confirm": "Tạo dạng sandbox", + "dashboard.create_shared_subtitle_signed_in": "Duyệt worker Cloud được chia sẻ với tổ chức và kết nối chỉ một bước.", "dashboard.create_shared_subtitle_signed_out": "Đăng nhập OpenWork Cloud để truy cập worker được chia sẻ với tổ chức của bạn.", "dashboard.create_shared_title": "Workspace chia sẻ", + "dashboard.create_workspace_confirm": "Tạo Workspace", + "dashboard.create_workspace_subtitle": "Khởi tạo workspace mới dựa trên thư mục.", + "dashboard.create_workspace_title": "Tạo Workspace", "dashboard.creating": "Đang tạo...", "dashboard.desktop_badge": "Desktop", "dashboard.display_name_label": "Tên hiển thị", "dashboard.display_name_optional": "(tùy chọn)", "dashboard.docker_debug_details": "Chi tiết gỡ lỗi Docker", + "dashboard.edit_remote_workspace_confirm": "Lưu kết nối", + "dashboard.edit_remote_workspace_subtitle": "Cập nhật thông tin máy chủ OpenWork cho workspace này.", + "dashboard.edit_remote_workspace_title": "Chỉnh sửa kết nối từ xa", + "dashboard.empty_workspace": "Workspace trống", + "dashboard.empty_workspace_desc": "Bắt đầu từ thư mục trống, thêm những gì bạn cần.", "dashboard.error_choose_org": "Chọn tổ chức trước khi mở workspace.", "dashboard.error_connect_worker": "Kết nối {name} thất bại.", "dashboard.error_create_template": "Tạo {name} thất bại.", @@ -991,24 +305,53 @@ export default { "dashboard.error_load_shared_workspaces": "Tải workspace chia sẻ thất bại.", "dashboard.error_workspace_not_ready": "Workspace chưa sẵn sàng kết nối. Thử lại sau giây lát.", "dashboard.import_config": "Nhập cấu hình", - "dashboard.importing": "Đang nhập\u2026", + "dashboard.importing": "Đang nhập…", "dashboard.modal_back": "Quay lại", "dashboard.modal_close": "Đóng hộp thoại thêm workspace", "dashboard.nav_ids": "IDs", "dashboard.no_folder_selected": "Chưa chọn thư mục.", - "dashboard.open_cloud_dashboard": "Mở bảng điều khiển đám mây", + "dashboard.open_cloud_dashboard": "Mở bảng điều khiển Cloud", + "dashboard.opening": "Đang mở...", + "dashboard.openwork_host_hint": "Sử dụng URL được cung cấp bởi máy chủ OpenWork.", + "dashboard.openwork_host_label": "URL máy chủ OpenWork", + "dashboard.openwork_host_placeholder": "https://your-server.openwork.app", + "dashboard.openwork_host_token_hint": "Tùy chọn. Dùng token cộng tác cho truy cập thông thường hoặc token chủ sở hữu khi client này phải trả lời lời nhắc quyền.", + "dashboard.openwork_host_token_label": "Token cộng tác hoặc chủ sở hữu", + "dashboard.openwork_host_token_placeholder": "Dán token của bạn", "dashboard.recently_updated": "Cập nhật gần đây", + "dashboard.remote": "Từ xa", + "dashboard.remote_base_url_required": "Vui lòng nhập URL máy chủ để tiếp tục.", + "dashboard.remote_connection_direct": "Trực tiếp", + "dashboard.remote_connection_openwork": "OpenWork", + "dashboard.remote_directory_hint": "Để trống để dùng thư mục mặc định của máy chủ.", + "dashboard.remote_directory_label": "Thư mục workspace (tùy chọn)", + "dashboard.remote_directory_placeholder": "/home/team/project", + "dashboard.remote_display_name_label": "Tên hiển thị (tùy chọn)", + "dashboard.remote_display_name_placeholder": "Workspace nhóm thiết kế", "dashboard.remote_server_details_hint": "Kết nối worker OpenWork tự lưu trữ.", "dashboard.remote_server_details_title": "Chi tiết máy chủ từ xa", + "dashboard.remote_workspace_hint": "Lưu máy chủ OpenWork để kết nối lại bất kỳ lúc nào.", + "dashboard.remote_workspace_title": "Workspace từ xa", + "dashboard.repair_cache": "Sửa bộ nhớ đệm", + "dashboard.repairing_cache": "Đang sửa bộ nhớ đệm", + "dashboard.sandbox_checking_docker": "Đang kiểm tra Docker...", + "dashboard.sandbox_get_ready_action": "Chuẩn bị môi trường", + "dashboard.sandbox_get_ready_desc": "Chạy workspace này trong container Docker cách ly, an toàn và dễ tái tạo hơn.", + "dashboard.sandbox_get_ready_title": "Sandbox cần Docker", "dashboard.sandbox_hide_logs": "Ẩn nhật ký", "dashboard.sandbox_live_logs": "Nhật ký trực tiếp", "dashboard.sandbox_setup": "Thiết lập sandbox", "dashboard.sandbox_show_logs": "Hiện nhật ký", "dashboard.search_shared_workspaces": "Tìm workspace chia sẻ", - "dashboard.shared_workspaces_loading": "Đang tải workspace chia sẻ\u2026", + "dashboard.select_folder": "Chọn thư mục", + "dashboard.settings": "Cài đặt", + "dashboard.shared_workspaces_loading": "Đang tải workspace chia sẻ…", "dashboard.shared_workspaces_no_match": "Không có workspace chia sẻ phù hợp.", "dashboard.shared_workspaces_none": "Chưa có workspace chia sẻ nào.", - "dashboard.shared_workspaces_refreshing": "Đang làm mới workspace\u2026", + "dashboard.shared_workspaces_refreshing": "Đang làm mới workspace…", + "dashboard.skills": "Skills", + "dashboard.starter_workspace": "Workspace khởi đầu", + "dashboard.starter_workspace_desc": "Đã cấu hình sẵn để hướng dẫn bạn sử dụng plugins, commands và skills.", "dashboard.team_templates_hint": "Chọn điểm bắt đầu, hoặc để trống để tạo workspace trống.", "dashboard.team_templates_none": "Chưa tìm thấy mẫu nhóm cho tổ chức này.", "dashboard.team_templates_syncing": "Đang đồng bộ", @@ -1028,12 +371,13 @@ export default { "dashboard.workspace_folder_hint": "Chọn nơi workspace sẽ được lưu trên thiết bị của bạn.", "dashboard.workspace_folder_title": "Thư mục workspace", "dashboard.workspace_not_ready_title": "Workspace này chưa sẵn sàng kết nối.", - - // ==================== Den ==================== - "den.active_org_hint": "Worker đám mây và mẫu nhóm thuộc phạm vi tổ chức đã chọn.", + "dashboard.workspaces": "Workspaces", + "den.active_org_hint": "Worker Cloud và mẫu nhóm thuộc phạm vi tổ chức đã chọn.", "den.active_org_title": "Tổ chức đang hoạt động", "den.auto_reconnect_hint": "Hoàn tất xác thực trong trình duyệt và OpenWork sẽ tự động kết nối lại ở đây.", "den.checking_session": "Đang kiểm tra phiên", + "den.choose_org_for_providers": "Chọn tổ chức để xem provider Cloud.", + "den.choose_org_for_skill_hubs": "Chọn tổ chức để xem skill hub Cloud.", "den.choose_org_for_templates": "Chọn tổ chức để xem mẫu nhóm.", "den.cloud_account_hint": "Quản lý tài khoản và tổ chức đã kết nối.", "den.cloud_account_title": "Tài khoản Cloud", @@ -1042,12 +386,18 @@ export default { "den.cloud_control_plane_save": "Lưu URL", "den.cloud_control_plane_url_hint": "Chỉ chế độ nhà phát triển. Dùng để trỏ đến Cloud control plane nội bộ hoặc tự lưu trữ. Thay đổi sẽ đăng xuất để ứng dụng kết nối lại với control plane mới.", "den.cloud_control_plane_url_label": "URL Cloud control plane", + "den.cloud_provider_detail": "{count} model · provider {source}", + "den.cloud_provider_removed_detail": "Provider đã nhập không còn trên Cloud. Gỡ cài đặt cấu hình {providerId} cục bộ.", + "den.cloud_provider_sync_detail": "Provider Cloud đã thay đổi. Đồng bộ cấu hình {source} với {count} model vào opencode.jsonc.", + "den.cloud_providers_hint": "Nhập provider LLM được quản lý vào opencode.jsonc và sử dụng thông tin xác thực của tổ chức trong workspace này.", + "den.cloud_providers_title": "Provider Cloud", "den.cloud_section_desc": "Đăng nhập, chọn tổ chức và mở worker Cloud hoặc mẫu nhóm.", "den.cloud_section_title": "OpenWork Cloud", "den.cloud_sleep_hint": "Đăng nhập OpenWork Cloud để giữ task hoạt động khi máy ngủ.", "den.cloud_workers_hint": "Mở worker trực tiếp vào OpenWork bằng luồng kết nối từ xa có sẵn.", - "den.cloud_workers_title": "Worker đám mây", + "den.cloud_workers_title": "Worker Cloud", "den.create_account": "Tạo tài khoản", + "den.credentials_ready_badge": "Thông tin xác thực sẵn sàng", "den.error_base_url": "Nhập URL Cloud control plane hợp lệ dạng http:// hoặc https://.", "den.error_choose_org": "Chọn tổ chức trước khi mở worker.", "den.error_load_orgs": "Tải tổ chức thất bại.", @@ -1064,44 +414,31 @@ export default { "den.finish_signin": "Hoàn tất đăng nhập", "den.finishing": "Đang hoàn tất...", "den.hide_signin_code": "Ẩn mã đăng nhập", + "den.import_all": "Nhập tất cả", + "den.import_provider": "Nhập", + "den.import_provider_failed": "Không thể nhập {name}.", + "den.imported_badge": "Đã nhập", + "den.imported_provider": "Đã nhập {name}.", + "den.importing": "Đang nhập…", "den.needs_attention": "Cần chú ý", - "den.no_cloud_workers": "Chưa có worker đám mây cho tổ chức này. Tạo worker trong Cloud, rồi làm mới tab này.", + "den.no_cloud_providers": "Chưa có provider Cloud nào cho tổ chức này.", + "den.no_cloud_workers": "Chưa có worker Cloud cho tổ chức này. Tạo worker trong Cloud, rồi làm mới tab này.", "den.no_org_selected": "Chưa chọn tổ chức", - "den.no_team_templates": "Chưa có mẫu nhóm. Dùng Chia sẻ \u2192 Mẫu \u2192 Chia sẻ với nhóm.", + "den.no_skill_hubs": "Chưa có skill hub Cloud nào cho tổ chức này.", + "den.no_team_templates": "Chưa có mẫu nhóm. Dùng Chia sẻ → Mẫu → Chia sẻ với nhóm.", "den.open": "Mở", "den.opening": "Đang mở...", - "den.import_all": "Import all", - "den.import_provider": "Import", - "den.importing": "Importing...", - "den.removing": "Removing...", - "den.sync": "Sync", - "den.syncing": "Syncing...", - "den.uninstall": "Uninstall", - "den.imported_badge": "Imported", - "den.out_of_sync_badge": "Out of sync", - "den.removed_from_cloud_badge": "Removed from cloud", - "den.credentials_ready_badge": "Credential ready", - "den.skill_hubs_title": "Skill hubs", - "den.skill_hubs_hint": "Import every skill from a shared cloud hub into this workspace in one step.", - "den.choose_org_for_skill_hubs": "Choose an org to view cloud skill hubs.", - "den.no_skill_hubs": "No cloud skill hubs are available for this org yet.", - "den.skill_hub_skills_badge": "{count} skills", - "den.skill_hub_detail": "Import {count} shared skills into .opencode/skills.", - "den.skill_hub_imported_detail": "Imported {count} skills into this workspace.", - "den.skill_hub_sync_detail": "Cloud now has {liveCount} skills; this workspace imported {importedCount}. Sync to update the installed set.", - "den.skill_hub_removed_detail": "This hub was removed from cloud. Uninstall the {importedCount} imported skills from this workspace.", - "den.cloud_providers_title": "Cloud providers", - "den.cloud_providers_hint": "Import managed LLM providers into opencode.jsonc and use the org credential in this workspace.", - "den.choose_org_for_providers": "Choose an org to view cloud providers.", - "den.no_cloud_providers": "No cloud providers are available for this org yet.", - "den.cloud_provider_detail": "{count} models · {source} provider", - "den.cloud_provider_sync_detail": "Cloud provider changed. Sync the {count} model {source} config into opencode.jsonc.", - "den.cloud_provider_removed_detail": "This imported provider is no longer in cloud. Uninstall the local {providerId} config.", "den.org_member_suffix": "(Thành viên)", "den.org_owner_suffix": "(Chủ sở hữu)", "den.org_switched": "Đã chuyển sang {name}.", + "den.out_of_sync_badge": "Chưa đồng bộ", "den.paste_signin_code": "Dán mã đăng nhập", "den.refresh": "Làm mới", + "den.reload_workspace": "Tải lại workspace để áp dụng thay đổi cấu hình.", + "den.remove_provider_failed": "Không thể xóa {name}.", + "den.removed_from_cloud_badge": "Đã xóa khỏi Cloud", + "den.removed_provider": "Đã xóa {name}.", + "den.removing": "Đang xóa…", "den.sign_out": "Đăng xuất", "den.signed_out": "Đã đăng xuất", "den.signin_button": "Đăng nhập", @@ -1112,6 +449,13 @@ export default { "den.signin_title": "Đăng nhập OpenWork Cloud", "den.signing_in": "Đang hoàn tất đăng nhập OpenWork Cloud...", "den.signing_out": "Đang đăng xuất...", + "den.skill_hub_detail": "Nhập {count} skill được chia sẻ vào .opencode/skills.", + "den.skill_hub_imported_detail": "Đã nhập {count} skill vào workspace này.", + "den.skill_hub_removed_detail": "Hub này đã bị xóa khỏi Cloud. Gỡ cài đặt {importedCount} skill đã nhập khỏi workspace này.", + "den.skill_hub_skills_badge": "{count} skills", + "den.skill_hub_sync_detail": "Cloud hiện có {liveCount} skill; workspace này đã nhập {importedCount}. Đồng bộ để cập nhật.", + "den.skill_hubs_hint": "Nhập tất cả skill từ hub Cloud được chia sẻ vào workspace này chỉ với một bước.", + "den.skill_hubs_title": "Skill hub", "den.status_base_url_updated": "Đã cập nhật URL Cloud control plane. Đăng nhập lại để tiếp tục.", "den.status_browser_signin": "Hoàn tất đăng nhập trong trình duyệt để kết nối OpenWork.", "den.status_browser_signup": "Hoàn tất tạo tài khoản trong trình duyệt để kết nối OpenWork.", @@ -1127,38 +471,176 @@ export default { "den.status_opened_worker": "Đã mở {name} trong OpenWork.", "den.status_signed_in_as": "Đã đăng nhập với {email}.", "den.status_signed_out": "Đã đăng xuất và xóa phiên OpenWork Cloud trên thiết bị này.", + "den.sync": "Đồng bộ", + "den.sync_provider_failed": "Không thể đồng bộ {name}.", + "den.synced_provider": "Đã đồng bộ {name}.", + "den.syncing": "Đang đồng bộ…", "den.team_template_badge": "Mẫu nhóm", "den.team_templates_hint": "Mở mẫu workspace tái sử dụng được chia sẻ với tổ chức này.", "den.team_templates_title": "Mẫu nhóm", + "den.uninstall": "Gỡ cài đặt", "den.worker_mine_badge": "Của tôi", "den.worker_not_ready_title": "Worker này chưa sẵn sàng.", "den.worker_provider_label": "Worker {provider}", - "den.worker_secondary_cloud": "Worker đám mây", - - // ==================== Den Settings ==================== - "den_settings.manage_account": "Quản lý tài khoản", - "den_settings.no_workers": "Không tìm thấy workspace chia sẻ.", - "den_settings.open_workspace": "Mở workspace", - "den_settings.refresh": "Làm mới", - "den_settings.sign_in": "Đăng nhập", - "den_settings.sign_in_hint": "Đăng nhập OpenWork Cloud để truy cập workspace chia sẻ và tính năng nhóm.", - "den_settings.sign_out": "Đăng xuất", - "den_settings.signed_in_as": "Đã đăng nhập với", - "den_settings.title": "Cloud", - "den_settings.workers_hint": "Workspace đám mây được chia sẻ với tổ chức của bạn.", - "den_settings.workers_title": "Workspace chia sẻ", - - // ==================== Extensions ==================== + "den.worker_secondary_cloud": "Worker Cloud", + "extensions.app_count_one": "{count} ứng dụng đã kết nối", + "extensions.app_count_many": "{count} ứng dụng đã kết nối", + "extensions.apps_mcp_header": "Ứng dụng (MCP)", + "extensions.filter_all": "Tất cả", + "extensions.filter_apps": "Ứng dụng", + "extensions.filter_plugins": "Plugins", + "extensions.plugin_count_one": "{count} plugin", + "extensions.plugin_count_many": "{count} plugins", + "extensions.plugins_opencode_header": "Plugins (OpenCode)", + "extensions.subtitle": "Ứng dụng (MCP) và OpenCode plugins gộp chung một nơi.", "extensions.title": "Tiện ích mở rộng", - - // ==================== Inbox Panel ==================== + "identities.agent_behavior_desc": "Một tệp mỗi workspace. Thêm dòng đầu tùy chọn @agent để định tuyến qua agent OpenCode cụ thể.", + "identities.agent_behavior_title": "Hành vi agent nhắn tin", + "identities.agent_created": "Đã tạo tệp agent nhắn tin mặc định.", + "identities.agent_file_changed": "Tệp đã thay đổi từ xa. Tải lại và lưu lần nữa.", + "identities.agent_loading": "Đang tải tệp agent…", + "identities.agent_none": "không có", + "identities.agent_not_found": "Chưa tìm thấy tệp agent trong workspace này.", + "identities.agent_placeholder": "Thêm hướng dẫn hành vi nhắn tin cho opencodeRouter ở đây...", + "identities.agent_saved": "Đã lưu hành vi nhắn tin.", + "identities.agent_scope_status": "Phạm vi hoạt động: workspace · trạng thái: {status} · agent đã chọn: {agent}", + "identities.agent_status_loaded": "đã tải", + "identities.agent_status_missing": "thiếu", + "identities.agent_worker_scope_unavailable": "Phạm vi worker không khả dụng.", + "identities.all_channels": "Tất cả kênh", + "identities.app_token_label": "Token ứng dụng", + "identities.auto_bind_label": "Tự động liên kết peer với thư mục khi gửi trực tiếp", + "identities.available_channels": "Kênh khả dụng", + "identities.bot_token_label": "Token bot", + "identities.bot_token_placeholder": "Dán token bot Telegram từ @BotFather", + "identities.botfather_step1_open": "1. Mở @BotFather trong Telegram", + "identities.botfather_step1_run": "và chạy /newbot", + "identities.botfather_step3_choose": "3. Chọn tên và username cho bot", + "identities.botfather_step3_or_private": "cho hộp thư mở hoặc", + "identities.botfather_step3_private": "Riêng tư", + "identities.botfather_step3_public": "Công khai", + "identities.botfather_step3_to_require": "để yêu cầu", + "identities.channel_label": "Kênh", + "identities.channels_connected": "đã kết nối", + "identities.channels_label": "Kênh", + "identities.configured_suffix": "đã cấu hình", + "identities.connect_server_desc": "Danh tính khả dụng khi bạn đã kết nối máy chủ OpenWork.", + "identities.connect_server_title": "Kết nối máy chủ OpenWork", + "identities.connect_slack": "Kết nối Slack", + "identities.connected_badge": "Đã kết nối", + "identities.connecting": "Đang kết nối...", + "identities.copy_bot_token_hint": "Sao chép token bot và dán vào bên dưới.", + "identities.copy_code": "Sao chép mã", + "identities.create_default_file": "Tạo tệp mặc định", + "identities.create_private_bot": "Tạo bot riêng tư", + "identities.create_public_bot": "Tạo bot công khai", + "identities.days_ago": "{days} ngày trước", + "identities.default_routing": "Định tuyến mặc định", + "identities.directory_label": "Thư mục (tùy chọn)", + "identities.disable_messaging": "Tắt nhắn tin", + "identities.disable_messaging_message": "Thao tác này sẽ tắt nhắn tin cho workspace này. Thiết lập Telegram và Slack sẽ bị ẩn cho đến khi bật lại, và bạn cần khởi động lại worker để dừng hoàn toàn sidecar nhắn tin.", + "identities.disable_messaging_title": "Tắt nhắn tin cho worker này?", + "identities.disabled_label": "Đã tắt", + "identities.disabling": "Đang tắt...", + "identities.disconnect": "Ngắt kết nối", + "identities.dispatched_messages": "Đã gửi {sent}/{attempted} tin nhắn.", + "identities.enable_messaging": "Bật nhắn tin", + "identities.enable_messaging_risk": "Nhắn tin có thể phơi bày worker này cho lệnh từ xa. Nếu bot công khai hoặc bị xâm phạm, nó có thể truy cập tệp, thông tin đăng nhập và API key của worker.", + "identities.enable_messaging_title": "Bật nhắn tin cho worker này?", + "identities.enabled_label": "Đã bật", + "identities.enabling": "Đang bật...", + "identities.health_offline": "Ngoại tuyến", + "identities.health_running": "Đang chạy", + "identities.health_unavailable": "Không khả dụng", + "identities.health_unavailable_status": "Trạng thái OpenCodeRouter không khả dụng ({status})", + "identities.health_unknown": "Không rõ", + "identities.hours_ago": "{hours} giờ trước", + "identities.identities_label": "Danh tính", + "identities.just_now": "Vừa xong", + "identities.last_activity": "Hoạt động cuối", + "identities.later": "Để sau", + "identities.message_label": "Tin nhắn", + "identities.message_routing_desc": "Kiểm soát cuộc hội thoại nào đến thư mục workspace nào. Tin nhắn được định tuyến đến thư mục mặc định của worker trừ khi bạn thiết lập quy tắc ở đây.", + "identities.message_routing_title": "Định tuyến tin nhắn", + "identities.messages_today": "Tin nhắn hôm nay", + "identities.messaging_disabled_hint": "Chỉ bật nhắn tin nếu bạn hiểu rủi ro và dự định bảo mật truy cập (ví dụ: ghép nối Telegram riêng tư).", + "identities.messaging_disabled_restart": "Nhắn tin đã tắt. Khởi động lại worker để dừng sidecar nhắn tin.", + "identities.messaging_disabled_risk": "Bot nhắn tin có thể thực hiện hành động trên worker nội bộ. Nếu bị phơi bày công khai, chúng có thể truy cập tệp, thông tin đăng nhập và API key của worker.", + "identities.messaging_disabled_title": "Nhắn tin tắt theo mặc định", + "identities.messaging_enabled_restart": "Nhắn tin đã bật. Khởi động lại worker để áp dụng trước khi cấu hình kênh.", + "identities.messaging_sidecar_not_running": "Nhắn tin đã bật trong workspace này, nhưng sidecar nhắn tin chưa chạy. Khởi động lại worker, rồi quay lại cài đặt Nhắn tin để kết nối Telegram hoặc Slack.", + "identities.minutes_ago": "{minutes} phút trước", + "identities.not_set": "Chưa đặt", + "identities.open_bot_link": "Mở @{username} trong Telegram", + "identities.pairing_code_copied": "Đã sao chép mã ghép nối.", + "identities.pairing_code_copy_failed": "Không thể sao chép mã ghép nối. Vui lòng sao chép thủ công.", + "identities.pairing_code_instruction_prefix": "Gửi", + "identities.peer_id_label": "Peer ID (tùy chọn)", + "identities.peer_id_placeholder_slack": "ví dụ: slack:U12345678", + "identities.peer_id_placeholder_telegram": "ví dụ: telegram:123456789", + "identities.private_label": "Riêng tư", + "identities.private_pairing_code": "Mã ghép nối riêng tư", + "identities.public_bot_confirm": "Tôi hiểu rủi ro", + "identities.public_bot_warning_message": "Bot của bạn sẽ được truy cập công khai và bất kỳ ai có quyền truy cập bot đều có thể toàn quyền truy cập worker nội bộ bao gồm tệp và API key. Nếu tạo bot riêng tư, bạn có thể giới hạn quyền truy cập bằng mã ghép nối. Bạn có chắc muốn đặt bot công khai không?", + "identities.public_bot_warning_title": "Đặt bot này công khai?", + "identities.public_label": "Công khai", + "identities.quick_setup": "Thiết lập nhanh", + "identities.reconnect_failed": "Kết nối lại thất bại. Kiểm tra URL/token OpenWork và thử lại.", + "identities.reconnected": "Đã kết nối lại.", + "identities.reconnected_refreshing": "Đã kết nối lại. Đang làm mới trạng thái worker...", + "identities.reload": "Tải lại", + "identities.repair_reconnect": "Sửa lỗi & kết nối lại", + "identities.restart_failed": "Khởi động lại thất bại. Vui lòng khởi động lại worker từ Cài đặt và thử lại.", + "identities.restart_to_disable_messaging": "Nhắn tin đã tắt cho workspace này. Khởi động lại worker ngay để dừng sidecar nhắn tin.", + "identities.restart_to_enable_messaging": "Nhắn tin đã bật cho workspace này. Khởi động lại worker ngay để khởi chạy sidecar nhắn tin và mở khóa thiết lập Telegram và Slack.", + "identities.restart_worker": "Khởi động lại worker", + "identities.restart_worker_title": "Khởi động lại worker ngay?", + "identities.restarting": "Đang khởi động lại...", + "identities.routing_override_prefix": "Tất cả tin nhắn định tuyến đến", + "identities.routing_override_suffix": "(đang ghi đè)", + "identities.running_label": "Đang chạy", + "identities.save_behavior": "Lưu hành vi", + "identities.saving": "Đang lưu...", + "identities.send_test_button": "Gửi tin nhắn thử", + "identities.send_test_desc": "Kiểm tra đường truyền đi. Dùng peer ID để gửi trực tiếp, hoặc để trống peer ID để phân phối theo liên kết trong thư mục.", + "identities.send_test_title": "Gửi tin nhắn thử", + "identities.sending": "Đang gửi...", + "identities.slack_desc": "Worker của bạn xuất hiện như bot trong các kênh Slack. Thành viên nhóm có thể nhắn trực tiếp hoặc đề cập trong luồng.", + "identities.slack_intro": "Kết nối workspace Slack để thành viên nhóm tương tác với worker này trong kênh và tin nhắn trực tiếp.", + "identities.slack_unavailable": "Danh tính Slack không khả dụng.", + "identities.status_active": "Đang hoạt động", + "identities.status_label": "Trạng thái", + "identities.status_stopped": "Đã dừng", + "identities.stopped_label": "Đã dừng", + "identities.subtitle": "Để mọi người liên lạc worker qua ứng dụng nhắn tin. Kết nối kênh và worker sẽ tự động đọc và phản hồi tin nhắn.", + "identities.tab_general": "Chung", + "identities.telegram_bot_access_desc": "Bot công khai: chat Telegram đầu tiên tự động liên kết. Bot riêng tư: yêu cầu mã ghép nối trước khi tin nhắn chạy công cụ.", + "identities.telegram_delete_failed": "Xóa thất bại.", + "identities.telegram_deleted": "Đã xóa.", + "identities.telegram_deleted_pending": "Đã xóa (chờ áp dụng).", + "identities.telegram_desc": "Kết nối bot Telegram ở chế độ công khai (hộp thư mở) hoặc riêng tư (cần mã ghép nối).", + "identities.telegram_private_saved_pair": "Đã lưu bot riêng tư. Ghép nối qua /pair {code}", + "identities.telegram_save_failed": "Lưu thất bại.", + "identities.telegram_saved": "Đã lưu.", + "identities.telegram_saved_pending": "Đã lưu (chờ áp dụng).", + "identities.telegram_saved_username": "Đã lưu (@{username})", + "identities.telegram_unavailable": "Danh tính Telegram không khả dụng.", + "identities.title": "Kênh nhắn tin", + "identities.unsaved_changes": "Thay đổi chưa lưu", + "identities.worker_offline": "Worker ngoại tuyến", + "identities.worker_online": "Worker trực tuyến", + "identities.worker_restarted": "Đã khởi động lại worker.", + "identities.worker_restarted_refreshing": "Đã khởi động lại worker. Đang làm mới trạng thái nhắn tin...", + "identities.worker_scope_unavailable": "Phạm vi worker không khả dụng.", + "identities.worker_scope_unavailable_detail": "Phạm vi worker không khả dụng. Kết nối lại bằng URL worker hoặc chuyển sang worker đã biết.", + "identities.worker_unavailable": "Worker không khả dụng", + "identities.workspace_id_required": "Cần ID workspace để quản lý danh tính. Kết nối lại bằng URL workspace hoặc chọn workspace đã ánh xạ trên máy chủ này.", + "identities.workspace_scope_prefix": "Phạm vi workspace:", "inbox_panel.connect_to_download": "Kết nối worker để tải về tệp chia sẻ.", "inbox_panel.connect_to_see": "Kết nối để xem tệp chia sẻ.", "inbox_panel.connect_to_upload": "Kết nối worker để tải lên", - "inbox_panel.copied_path": "Đã sao chép: {path}", "inbox_panel.copy_failed": "Sao chép thất bại. Trình duyệt có thể chặn truy cập clipboard.", "inbox_panel.download": "Tải về", - "inbox_panel.download_failed": "Tải về thất bại", "inbox_panel.drop_to_upload": "Thả tệp vào đây để tải lên", "inbox_panel.helper_text": "Chia sẻ tệp với worker này từ ứng dụng.", "inbox_panel.load_failed": "Tải thư mục chia sẻ thất bại", @@ -1173,12 +655,93 @@ export default { "inbox_panel.upload_success": "Đã tải lên thư mục chia sẻ.", "inbox_panel.uploading": "Đang tải lên...", "inbox_panel.uploading_label": "Đang tải lên {label}...", - - // ==================== MCP (missing) ==================== + "mcp.activate_button": "Kích hoạt", + "mcp.add_modal_subtitle": "Kết nối MCP server tùy chỉnh bằng URL hoặc lệnh nội bộ.", + "mcp.add_modal_title": "Thêm ứng dụng tùy chỉnh", + "mcp.add_server_button": "Thêm ứng dụng", + "mcp.advanced": "Nâng cao", + "mcp.advanced_settings": "Cài đặt nâng cao", + "mcp.advanced_settings_hint": "Chỉnh sửa tệp cấu hình và quản lý kết nối thủ công.", + "mcp.app_connected": "ứng dụng đã kết nối", + "mcp.apps_connected": "ứng dụng đã kết nối", + "mcp.apps_subtitle": "Kết nối các công cụ yêu thích để OpenWork có thể sử dụng thay bạn.", + "mcp.apps_title": "Ứng dụng", + "mcp.auth.already_connected": "Đã kết nối", + "mcp.auth.already_connected_description": "{server} đã được xác thực và sẵn sàng sử dụng.", + "mcp.auth.applying_changes_body": "Chúng tôi đang khởi động lại worker để MCP mới sẵn sàng xác thực.", + "mcp.auth.applying_changes_title": "Đang áp dụng thay đổi trước khi đăng nhập", + "mcp.auth.authorization_link": "Liên kết cấp quyền", + "mcp.auth.authorization_still_required": "Vẫn cần xác thực. Thử lại để khởi động lại luồng.", + "mcp.auth.callback_invalid": "Dán URL callback hoặc tham số code để hoàn tất OAuth.", + "mcp.auth.callback_label": "URL callback hoặc mã code", + "mcp.auth.callback_placeholder": "http://127.0.0.1:19876/mcp/oauth/callback?code=...", + "mcp.auth.cancel": "Hủy", + "mcp.auth.client_registration_required": "Cần đăng ký client trước khi tiếp tục OAuth.", + "mcp.auth.complete_connection": "Hoàn tất kết nối", + "mcp.auth.configured_previously": "MCP có thể đã được cấu hình toàn cục hoặc trong phiên trước. Bạn có thể đóng hộp thoại này và bắt đầu sử dụng ngay.", + "mcp.auth.connect_server": "Kết nối {server}", + "mcp.auth.copied": "Đã sao chép", + "mcp.auth.copy_link": "Sao chép liên kết", + "mcp.auth.done": "Xong", + "mcp.auth.failed_to_start_oauth": "Không thể khởi động luồng OAuth", + "mcp.auth.follow_browser_steps": "Làm theo các bước xác thực trong trình duyệt.", + "mcp.auth.force_stop": "Buộc dừng", + "mcp.auth.force_stopping": "Đang dừng...", + "mcp.auth.im_done": "Tôi đã xong", + "mcp.auth.invalid_refresh_token": "Refresh token OAuth không hợp lệ hoặc đã hết hạn. Vui lòng xác thực lại.", + "mcp.auth.manual_finish_hint": "Dán URL callback (localhost:19876) hoặc chỉ mã code để hoàn tất kết nối.", + "mcp.auth.manual_finish_title": "Server từ xa?", + "mcp.auth.oauth_completed_reload": "OAuth hoàn tất. Tải lại engine để kích hoạt MCP.", + "mcp.auth.oauth_failed": "Xác thực OAuth thất bại.", + "mcp.auth.oauth_not_supported_hint": "Điều này có thể do:\n• MCP server không hỗ trợ OAuth\n• Engine cần tải lại để phát hiện tính năng server\n• Thử: opencode mcp auth {server} từ CLI", + "mcp.auth.open_browser_signin": "Chúng tôi sẽ mở trình duyệt để hoàn tất đăng nhập.", + "mcp.auth.port_forward_hint": "Mẹo: chuyển tiếp cổng callback nếu cần: ssh -L 19876:127.0.0.1:19876 user@host", + "mcp.auth.reauth_action": "Xác thực lại OAuth", + "mcp.auth.reauth_cli_hint": "Chạy: opencode mcp auth {server}", + "mcp.auth.reauth_failed": "Xác thực lại thất bại.", + "mcp.auth.reauth_remote_hint": "Xác thực lại từ máy đang chạy worker này.", + "mcp.auth.reauth_running": "Đang xác thực lại...", + "mcp.auth.reload_blocked": "Đang tạm dừng tải lại vì có phiên đang chạy. Dừng phiên để hoàn tất thiết lập.", + "mcp.auth.reload_engine_retry": "Áp dụng thay đổi và thử lại", + "mcp.auth.reload_failed": "Tải lại worker trước khi đăng nhập thất bại.", + "mcp.auth.reload_notice": "Để thay đổi có hiệu lực, OpenWork cần làm mới dịch vụ worker. Điều này có thể gián đoạn phiên đang chạy.", + "mcp.auth.reload_remote_confirm": "Để thay đổi có hiệu lực, OpenWork cần làm mới dịch vụ worker. Điều này có thể dừng phiên đang chạy. Tiếp tục?", + "mcp.auth.reopen_browser_link": "Nhấn vào đây để mở lại trình duyệt", + "mcp.auth.request_timed_out": "Yêu cầu hết thời gian.", + "mcp.auth.retry": "Thử lại", + "mcp.auth.retry_now": "Thử lại ngay", + "mcp.auth.server_disabled": "MCP server này đã bị tắt. Bật lại và thử lần nữa.", + "mcp.auth.step1_description": "Chúng tôi sẽ tự động mở trang đăng nhập của {server}.", + "mcp.auth.step1_title": "Đang mở trình duyệt", + "mcp.auth.step2_description": "Đăng nhập và chấp thuận quyền truy cập khi được yêu cầu.", + "mcp.auth.step2_title": "Cấp quyền cho OpenWork", + "mcp.auth.step3_description": "Chúng tôi sẽ hoàn tất kết nối ngay khi xác thực xong.", + "mcp.auth.step3_title": "Quay lại đây khi hoàn tất", + "mcp.auth.try_reload_engine": "{message}. Thử tải lại engine trước.", + "mcp.auth.waiting_authorization": "Đang đợi bạn hoàn tất xác thực trong trình duyệt...", + "mcp.auth.waiting_for_conversation_body": "Chúng tôi sẽ chuyển hướng bạn để xác thực ngay khi có thể.", + "mcp.auth.waiting_for_conversation_title": "Đang đợi cuộc hội thoại hoàn tất", + "mcp.auth.waiting_for_session": "Đang đợi {session} hoàn tất", + "mcp.available_apps": "Ứng dụng khả dụng", + "mcp.cap_signin": "Đăng nhập tài khoản", + "mcp.cap_tools": "Công cụ AI", + "mcp.config_file": "Tệp cấu hình", + "mcp.config_load_failed": "Không thể tải tệp cấu hình", + "mcp.config_not_loaded": "Chưa tải", + "mcp.config_source": "Từ cấu hình", + "mcp.configured": "đã cấu hình", + "mcp.connect": "Kết nối", + "mcp.connect_failed": "Không thể kết nối. Vui lòng thử lại.", + "mcp.connect_server_first": "Vui lòng kết nối máy chủ trước.", + "mcp.connected": "Đã kết nối", + "mcp.connected_badge": "Đã kết nối", + "mcp.connecting": "Đang kết nối...", + "mcp.connection_failed": "Lỗi kết nối — thử lại", + "mcp.connection_type": "Kết nối", "mcp.control_chrome_browser_hint": "Trong Chrome 144 trở lên, làm điều này trước:", "mcp.control_chrome_browser_step_one": "Mở chrome://inspect/#remote-debugging.", - "mcp.control_chrome_browser_step_three": "Cho phép kết nối gỡ lỗi khi Chrome yêu cầu.", "mcp.control_chrome_browser_step_two": "Bật gỡ lỗi từ xa.", + "mcp.control_chrome_browser_step_three": "Cho phép kết nối gỡ lỗi khi Chrome yêu cầu.", "mcp.control_chrome_browser_title": "1. Bật quyền truy cập Chrome", "mcp.control_chrome_connect": "Thêm Control Chrome", "mcp.control_chrome_docs": "Hướng dẫn MCP chính thức", @@ -1192,13 +755,84 @@ export default { "mcp.control_chrome_toggle_label": "Dùng profile Chrome hiện tại", "mcp.control_chrome_toggle_off": "OpenWork sẽ mở profile Chrome riêng cho tự động hóa.", "mcp.control_chrome_toggle_on": "OpenWork sẽ dùng lại tab, cookie và đăng nhập hiện tại của bạn.", - - // ==================== Message ==================== + "mcp.custom_app_cta_hint": "Kết nối MCP server, công cụ nội bộ hoặc ứng dụng được lưu trữ của riêng bạn.", + "mcp.desktop_required": "Ứng dụng yêu cầu app desktop.", + "mcp.docs_link": "Tìm hiểu thêm", + "mcp.file_not_found": "Chưa tạo tệp cấu hình", + "mcp.finish_setup": "Sắp xong rồi", + "mcp.finish_setup_hint": "Nhấn Kích hoạt để hoàn tất kết nối ứng dụng.", + "mcp.friendly_status_issue": "Sự cố", + "mcp.friendly_status_needs_signin": "Cần đăng nhập", + "mcp.friendly_status_offline": "Ngoại tuyến", + "mcp.friendly_status_paused": "Tạm dừng", + "mcp.friendly_status_ready": "Sẵn sàng", + "mcp.last_synced": "Đã đồng bộ", + "mcp.login_action": "Đăng nhập", + "mcp.login_hint": "Kết nối tài khoản để hoàn tất thiết lập ứng dụng.", + "mcp.login_unavailable": "Ứng dụng này không hỗ trợ đăng nhập từ OpenWork.", + "mcp.logout_action": "Đăng xuất", + "mcp.logout_failed": "Đăng xuất thất bại.", + "mcp.logout_hint": "Xóa thông tin đăng nhập OAuth đã lưu. Bạn sẽ cần đăng nhập lại.", + "mcp.logout_label": "OAuth", + "mcp.logout_modal_message": "Thao tác này sẽ xóa thông tin OAuth đã lưu của {server}. Bạn sẽ cần đăng nhập lại để sử dụng.", + "mcp.logout_modal_title": "Đăng xuất khỏi ứng dụng?", + "mcp.logout_success": "Đã đăng xuất khỏi {server}.", + "mcp.logout_working": "Đang đăng xuất...", + "mcp.name_required": "Vui lòng nhập tên server.", + "mcp.no_apps_hint": "Kết nối một ứng dụng ở trên để bắt đầu.", + "mcp.no_apps_yet": "Chưa kết nối ứng dụng nào", + "mcp.oauth": "Đăng nhập", + "mcp.oauth_optional_hint": "Dùng OAuth trong trình duyệt để kết nối tài khoản của bạn.", + "mcp.oauth_optional_label": "Ứng dụng này yêu cầu đăng nhập", + "mcp.one_click_connect": "Kết nối một chạm", + "mcp.open_file": "Mở tệp", + "mcp.opening_label": "Đang mở...", + "mcp.pick_workspace_error": "Vui lòng chọn thư mục workspace trước.", + "mcp.pick_workspace_first": "Vui lòng chọn thư mục workspace trước.", + "mcp.quick_connect_chrome_desc": "Điều khiển tab Chrome với browser automation.", + "mcp.quick_connect_chrome_title": "Điều khiển Chrome", + "mcp.quick_connect_context7_desc": "Tìm kiếm tài liệu sản phẩm với ngữ cảnh phong phú hơn.", + "mcp.quick_connect_context7_title": "Context7", + "mcp.quick_connect_linear_desc": "Lập kế hoạch sprint và xử lý ticket nhanh hơn.", + "mcp.quick_connect_linear_title": "Linear", + "mcp.quick_connect_notion_desc": "Đồng bộ trang, cơ sở dữ liệu và tài liệu dự án.", + "mcp.quick_connect_notion_title": "Notion", + "mcp.quick_connect_sentry_desc": "Theo dõi bản phát hành và xử lý lỗi production.", + "mcp.quick_connect_sentry_title": "Sentry", + "mcp.quick_connect_stripe_desc": "Kiểm tra thanh toán, hóa đơn và đăng ký.", + "mcp.quick_connect_stripe_title": "Stripe", + "mcp.reload_banner_blocked_hint": "Dừng task đang chạy để kích hoạt.", + "mcp.reload_banner_description": "Nhấn Kích hoạt để hoàn tất kết nối ứng dụng.", + "mcp.reload_banner_description_blocked": "Một task đang chạy. Dừng trước rồi kích hoạt.", + "mcp.remote_workspace_url_hint": "Workspace từ xa kết nối nhanh nhất với MCP server dạng URL.", + "mcp.remove_app": "Xóa", + "mcp.remove_failed": "Không thể xóa ứng dụng.", + "mcp.remove_modal_message": "Bạn có chắc muốn xóa {server}? Bạn luôn có thể thêm lại sau.", + "mcp.remove_modal_title": "Xóa ứng dụng", + "mcp.reveal_config_failed": "Không thể mở tệp cấu hình", + "mcp.reveal_in_finder": "Hiện trong Finder", + "mcp.scope_global": "Tất cả workspaces", + "mcp.scope_project": "Workspace này", + "mcp.server_command": "Lệnh", + "mcp.server_command_hint": "Lệnh shell để khởi động server.", + "mcp.server_command_placeholder": "npx -y @modelcontextprotocol/server-sequential-thinking", + "mcp.server_name": "Tên ứng dụng", + "mcp.server_name_placeholder": "github-copilot", + "mcp.server_type": "Loại", + "mcp.server_url": "URL máy chủ", + "mcp.server_url_placeholder": "https://api.githubcopilot.com/mcp/", + "mcp.sign_in_section_label": "Đăng nhập", + "mcp.tap_to_connect": "Nhấn để kết nối", + "mcp.technical_details": "Chi tiết kỹ thuật", + "mcp.type_cloud": "Cloud (đăng nhập bằng tài khoản)", + "mcp.type_local": "Nội bộ (chạy trên thiết bị này)", + "mcp.type_local_cmd": "Nội bộ (lệnh)", + "mcp.type_remote": "Từ xa (URL)", + "mcp.url_or_command_required": "Nhập URL cho server từ xa hoặc lệnh cho server nội bộ.", + "mcp.your_apps": "Ứng dụng của bạn", "message.tool_request_label": "Yêu cầu", "message.tool_result_label": "Kết quả", "message.waiting_subagent": "Đang đợi bản ghi từ subagent.", - - // ==================== Message List ==================== "message_list.copy_message": "Sao chép tin nhắn", "message_list.open_session": "Mở phiên", "message_list.step_updates_progress": "Cập nhật tiến trình", @@ -1228,11 +862,246 @@ export default { "message_list.tool_update_todo": "Cập nhật danh sách việc cần làm", "message_list.tool_updated_file": "Đã cập nhật {file}", "message_list.tool_updated_file_fallback": "Đã cập nhật tệp", - - // ==================== Scheduled ==================== + "model_behavior.desc_builtin": "Model này tự quyết định đường suy luận và không hiển thị cấu hình tại đây.", + "model_behavior.desc_generic": "Sử dụng cấu hình {label}.", + "model_behavior.desc_high": "Dành nhiều thời gian hơn để suy luận trước khi trả lời.", + "model_behavior.desc_high_anthropic": "Sử dụng ngân sách extended thinking tiêu chuẩn.", + "model_behavior.desc_low": "Thực hiện suy luận nhẹ trước khi trả lời.", + "model_behavior.desc_low_google": "Dùng ngân sách suy luận nhẹ hơn để phản hồi nhanh.", + "model_behavior.desc_max": "Sử dụng cấu hình suy luận sâu nhất của provider.", + "model_behavior.desc_max_anthropic": "Sử dụng ngân sách extended thinking lớn nhất.", + "model_behavior.desc_medium": "Cân bằng tốc độ và độ sâu suy luận.", + "model_behavior.desc_minimal": "Sử dụng lượng suy luận rất nhỏ.", + "model_behavior.desc_none": "Ưu tiên tốc độ với đường suy luận nhẹ nhất.", + "model_behavior.desc_standard": "Model này không cung cấp điều khiển suy luận bổ sung.", + "model_behavior.label_balanced": "Cân bằng", + "model_behavior.label_builtin": "Tích hợp", + "model_behavior.label_deep": "Sâu", + "model_behavior.label_extended": "Mở rộng", + "model_behavior.label_fast": "Nhanh", + "model_behavior.label_light": "Nhẹ", + "model_behavior.label_maximum": "Tối đa", + "model_behavior.label_quick": "Nhanh gọn", + "model_behavior.label_standard": "Tiêu chuẩn", + "model_behavior.title_builtin_reasoning": "Suy luận tích hợp", + "model_behavior.title_extended_thinking": "Extended thinking", + "model_behavior.title_reasoning_budget": "Reasoning budget", + "model_behavior.title_reasoning_effort": "Reasoning effort", + "model_behavior.title_standard_generation": "Tạo văn bản tiêu chuẩn", + "model_picker.chat_model_desc": "Chọn model cho cuộc trò chuyện này. Nếu model hỗ trợ hồ sơ suy luận, cấu hình trên thẻ của nó.", + "model_picker.chat_model_title": "Model cuộc trò chuyện", + "model_picker.connect_provider_hint": "Kết nối provider này để duyệt và lưu model", + "model_picker.default_model_desc": "Chọn model mặc định cho cuộc trò chuyện mới, rồi tinh chỉnh hồ sơ suy luận trên thẻ trước khi nhấn Xong.", + "model_picker.default_model_title": "Model mặc định", + "model_picker.model_count": "{count} model", + "model_picker.model_count_one": "1 model", + "model_picker.more_providers": "Thêm provider", + "model_picker.no_results": "Không có model phù hợp với tìm kiếm.", + "model_picker.other_connected_models": "Model đã kết nối khác", + "model_picker.recommended": "Đề xuất", + "onboarding.access_label": "Quyền truy cập", + "onboarding.add": "Thêm", + "onboarding.add_folder_path": "Thêm đường dẫn thư mục", + "onboarding.advanced_settings": "Cài đặt nâng cao", + "onboarding.attach": "Gắn vào", + "onboarding.attach_description": "Gắn vào phiên hiện có trên thiết bị này.", + "onboarding.authorize_folder": "Cấp quyền thư mục", + "onboarding.back": "Quay lại", + "onboarding.checking_cli": "Đang kiểm tra OpenCode CLI...", + "onboarding.choose_workspace_folder": "Chọn thư mục workspace", + "onboarding.cli_checking": "Đang kiểm tra cài đặt...", + "onboarding.cli_install_commands": "Cài đặt OpenCode bằng một trong các lệnh bên dưới, sau đó khởi động lại OpenWork.", + "onboarding.cli_label": "OpenCode CLI", + "onboarding.cli_needs_update": "OpenCode CLI cần cập nhật để hỗ trợ serve.", + "onboarding.cli_not_found": "Không tìm thấy OpenCode CLI.", + "onboarding.cli_not_found_hint": "Không tìm thấy. Cài đặt để chạy máy chủ nội bộ.", + "onboarding.cli_ready": "OpenCode CLI sẵn sàng.", + "onboarding.cli_recheck": "Kiểm tra lại", + "onboarding.cli_version": "OpenCode {version}", + "onboarding.cli_version_installed": "Đã cài đặt", + "onboarding.create_first_workspace": "Tạo workspace đầu tiên", + "onboarding.create_workspace": "Tạo workspace", + "onboarding.engine_running": "Engine đang chạy", + "onboarding.folders_allowed": "{count} thư mục{plural} được phép", + "onboarding.getting_ready": "Đang chuẩn bị mọi thứ", + "onboarding.install": "Cài đặt OpenCode", + "onboarding.install_instruction": "Cài đặt OpenCode để bật máy chủ nội bộ (không cần terminal).", + "onboarding.last_checked": "Kiểm tra lần cuối {time}", + "onboarding.manage_access_hint": "Bạn có thể quản lý quyền truy cập trong cài đặt nâng cao.", + "onboarding.open_settings": "Mở Cài đặt", + "onboarding.open_settings_hint": "Cần tùy chọn engine hoặc truy cập? Mở Cài đặt.", + "onboarding.pick": "Chọn", + "onboarding.ready_message": "OpenCode sẵn sàng khởi động máy chủ nội bộ.", + "onboarding.remember_choice": "Ghi nhớ lựa chọn cho lần sau", + "onboarding.remote_workspace_action": "Kết nối", + "onboarding.remote_workspace_card_description": "Kết nối máy chủ OpenWork để truy cập workspace dùng chung.", + "onboarding.remote_workspace_card_title": "Kết nối workspace từ xa", + "onboarding.remote_workspace_description": "Kết nối máy chủ OpenWork để truy cập workspace từ mọi nơi.", + "onboarding.remote_workspace_title": "Kết nối máy chủ OpenWork", + "onboarding.remove": "Xóa", + "onboarding.resolved_path": "Đường dẫn đã xác định", + "onboarding.run_local": "Chạy nội bộ", + "onboarding.run_local_description": "OpenWork chạy OpenCode trên máy bạn và giữ công việc riêng tư.", + "onboarding.search_notes": "Ghi chú tìm kiếm", + "onboarding.searching_host": "Đang kết nối máy chủ OpenWork...", + "onboarding.serve_help": "Kết quả serve --help", + "onboarding.show_search_notes": "Hiện ghi chú tìm kiếm", + "onboarding.start": "Khởi động OpenWork", + "onboarding.starting_host": "Đang khởi động máy chủ OpenWork...", + "onboarding.theme_current": "Hiện tại: {mode}", + "onboarding.theme_dark": "Tối", + "onboarding.theme_label": "Giao diện", + "onboarding.theme_light": "Sáng", + "onboarding.theme_system": "Hệ thống", + "onboarding.verifying": "Xác minh kết nối bảo mật", + "onboarding.version": "Phiên bản", + "onboarding.welcome_title": "Hôm nay bạn muốn chạy OpenWork như thế nào?", + "onboarding.windows_install_instruction": "Cài đặt OpenCode cho Windows, sau đó khởi động lại OpenWork. Đảm bảo opencode.exe có trong PATH.", + "onboarding.workspace_folder_label": "Workspace là một thư mục chứa skills, plugins và commands riêng.", + "plugins.add": "Thêm", + "plugins.add_hint": "Thêm tên gói npm, ví dụ: opencode-wakatime", + "plugins.add_label": "Thêm plugin", + "plugins.added": "Đã thêm", + "plugins.config": "Cấu hình", + "plugins.config_label": "Cấu hình", + "plugins.desc": "Quản lý `opencode.json` cho dự án hoặc plugins OpenCode toàn cục.", + "plugins.empty": "Chưa cấu hình plugin nào.", + "plugins.enabled": "Đã bật", + "plugins.hide_setup": "Ẩn thiết lập", + "plugins.not_loaded": "Chưa tải", + "plugins.not_loaded_yet": "Chưa tải", + "plugins.remove": "Xóa", + "plugins.scheduler_desc": "Chạy các tác vụ lên lịch bằng plugin lịch trình OpenCode.", + "plugins.scope_global": "Toàn cục", + "plugins.scope_project": "Dự án", + "plugins.setup": "Thiết lập", + "plugins.suggested": "Plugins gợi ý", + "plugins.suggested_heading": "Plugins gợi ý", + "plugins.title": "OpenCode Plugins", + "providers.api_key_label": "API key", + "providers.api_key_required": "API key là bắt buộc", + "providers.auth_failed": "Xác thực thất bại", + "providers.connect_failed": "Kết nối provider thất bại", + "providers.disabled_in_config_suffix": "và đã tắt trong cấu hình OpenCode.", + "providers.disconnect_failed": "Ngắt kết nối provider thất bại", + "providers.disconnected_prefix": "Đã ngắt kết nối", + "providers.load_failed": "Tải providers thất bại", + "providers.no_oauth_prefix": "Không có luồng OAuth cho", + "providers.no_providers_available": "Không có provider khả dụng", + "providers.not_connected": "Chưa kết nối máy chủ", + "providers.not_oauth_flow_prefix": "Phương thức xác thực đã chọn không phải luồng OAuth cho", + "providers.oauth_failed": "Hoàn tất OAuth thất bại", + "providers.oauth_method_required": "Phương thức OAuth là bắt buộc", + "providers.provider_error": "Lỗi provider ({provider})", + "providers.provider_id_required": "ID provider là bắt buộc", + "providers.rate_limit_exceeded": "Vượt quá giới hạn tốc độ", + "providers.removal_unsupported": "Client này không hỗ trợ xóa xác thực provider.", + "providers.request_failed": "Yêu cầu thất bại", + "providers.save_api_key_failed": "Lưu API key thất bại", + "providers.still_connected_suffix": ", nhưng worker vẫn báo đã kết nối. Xóa API key hoặc thông tin OAuth còn lại và khởi động lại worker để ngắt hoàn toàn.", + "providers.unknown_provider": "Provider không xác định", + "providers.use_api_key_suffix": "Dùng API key thay thế.", + "question_modal.custom_answer_label": "Hoặc nhập câu trả lời tùy chỉnh", + "question_modal.custom_answer_placeholder": "Nhập câu trả lời của bạn...", + "question_modal.question_counter": "Câu hỏi {current} / {total}", + "scheduled.at_time": "Lúc {time}", + "scheduled.badge_end_of_day": "Cuối ngày", + "scheduled.badge_every_few_hours": "Mỗi vài giờ", + "scheduled.badge_friday_wrapup": "Tổng kết thứ Sáu", + "scheduled.badge_weekday_evening": "Tối ngày thường", + "scheduled.badge_weekday_morning": "Sáng ngày thường", + "scheduled.badge_weekend_review": "Đánh giá cuối tuần", + "scheduled.create_button": "Tạo", + "scheduled.create_desc": "Tự động hóa được lên lịch bằng cách chạy prompt trong luồng mới. Chúng tôi sẽ điền sẵn prompt cho bạn gửi.", + "scheduled.create_title": "Tạo tự động hóa", + "scheduled.created_prefix": "Đã tạo", + "scheduled.custom_schedule": "Lịch tùy chỉnh", + "scheduled.daily_mode": "Hàng ngày", + "scheduled.day_fri": "T6", + "scheduled.day_mon": "T2", + "scheduled.day_sat": "T7", + "scheduled.day_sun": "CN", + "scheduled.day_thu": "T5", + "scheduled.day_tue": "T3", + "scheduled.day_wed": "T4", + "scheduled.days_at": "{days} lúc {time}", + "scheduled.default_automation_name": "Quét lỗi hàng ngày", + "scheduled.delete_confirm_desc": "Thao tác này sẽ xóa lịch trình và định nghĩa công việc khỏi {source}.", + "scheduled.delete_confirm_title": "Xóa tự động hóa?", + "scheduled.delete_error_fallback": "Xóa công việc thất bại.", + "scheduled.delete_label": "Xóa", + "scheduled.deleting": "Đang xóa", + "scheduled.desktop_required": "Tác vụ lên lịch yêu cầu ứng dụng desktop.", + "scheduled.empty_hint": "Chưa có tự động hóa. Chọn mẫu hoặc tạo prompt tự động hóa của riêng bạn.", + "scheduled.every_day_at": "Mỗi ngày lúc {time}", + "scheduled.every_hour": "Mỗi giờ", + "scheduled.every_n_hours": "Mỗi {interval} giờ", + "scheduled.every_prefix": "Mỗi", + "scheduled.explore_more": "Khám phá thêm", + "scheduled.failed_status": "Thất bại", + "scheduled.filter_all": "Tất cả", + "scheduled.filter_scheduled": "Đã lên lịch", + "scheduled.filter_templates": "Mẫu", + "scheduled.hours_suffix": "giờ", + "scheduled.install_scheduler": "Cài scheduler", + "scheduled.install_scheduler_hint": "Tự động hóa chạy qua plugin opencode-scheduler. Thêm vào workspace này để bật lên lịch.", + "scheduled.install_scheduler_title": "Cài scheduler để mở khóa tự động hóa", + "scheduled.installing": "Đang cài đặt...", + "scheduled.interval_mode": "Khoảng thời gian", + "scheduled.last_run_prefix": "Chạy lần cuối", + "scheduled.last_updated_prefix": "Cập nhật lần cuối", + "scheduled.name_label": "Tên", + "scheduled.never": "Chưa bao giờ", + "scheduled.new_automation": "Tự động hóa mới", + "scheduled.no_automations_match": "Không có tự động hóa phù hợp với tìm kiếm.", + "scheduled.no_templates_match": "Không có mẫu phù hợp với tìm kiếm.", + "scheduled.not_run_yet": "Chưa chạy lần nào", + "scheduled.not_synced_yet": "Chưa đồng bộ", + "scheduled.page_description": "Lên lịch tác vụ định kỳ cho worker này, theo dõi những gì đã đăng ký và bắt đầu từ mẫu tái sử dụng.", + "scheduled.prepare_error_fallback": "Chuẩn bị tự động hóa trong chat thất bại.", + "scheduled.prepared_automation_in_chat": "Đã chuẩn bị tự động hóa trong chat.", + "scheduled.prepared_job_in_chat": "Đã chuẩn bị {name} trong chat.", + "scheduled.quick_start_templates": "Mẫu khởi đầu nhanh", + "scheduled.quick_start_templates_desc": "Bắt đầu từ luồng định kỳ đã được chứng minh, rồi tùy chỉnh prompt trước khi chuẩn bị trong chat.", + "scheduled.refreshing": "Đang làm mới", + "scheduled.reload_activate_hint": "OpenCode tải plugin khi khởi động. Tải lại OpenWork để kích hoạt opencode-scheduler.", + "scheduled.reload_activate_title": "Tải lại OpenWork để kích hoạt tự động hóa", + "scheduled.reload_openwork": "Tải lại OpenWork", + "scheduled.reloading": "Đang tải lại...", + "scheduled.removed_job": "Đã xóa {name}.", + "scheduled.run_label": "Chạy", + "scheduled.running_status": "Đang chạy", + "scheduled.schedule_label": "Lịch trình", + "scheduled.scheduler_install_requested": "Đã yêu cầu cài scheduler.", + "scheduled.search_placeholder": "Tìm tự động hóa hoặc mẫu", + "scheduled.source_local": "Từ scheduler nội bộ", + "scheduled.source_remote": "Từ máy chủ OpenWork", + "scheduled.subtitle_local": "Tự động hóa chạy theo lịch trình từ thiết bị này.", + "scheduled.subtitle_remote": "Tự động hóa chạy theo lịch trình từ máy chủ OpenWork đã kết nối.", + "scheduled.success_status": "Thành công", + "scheduled.task_summary_no_prompt": "Không tìm thấy prompt hoặc command.", + "scheduled.task_summary_prompt": "Prompt", + "scheduled.template_badge": "Mẫu", + "scheduled.template_count": "{count} mẫu", "scheduled.title": "Tự động hóa", - - // ==================== Session (missing) ==================== + "scheduled.tpl_daily_planning_desc": "Lập kế hoạch tập trung từ task và lịch của bạn.", + "scheduled.tpl_daily_planning_name": "Bản tóm tắt kế hoạch hàng ngày", + "scheduled.tpl_habit_checkin_desc": "Kiểm tra trách nhiệm nhanh trong ngày.", + "scheduled.tpl_habit_checkin_name": "Kiểm tra thói quen", + "scheduled.tpl_inbox_zero_desc": "Tóm tắt tin chưa đọc và soạn phản hồi ngắn.", + "scheduled.tpl_inbox_zero_name": "Trợ giúp dọn hộp thư", + "scheduled.tpl_learning_digest_desc": "Biến liên kết và ghi chú đã lưu thành bản tóm tắt hàng tuần.", + "scheduled.tpl_learning_digest_name": "Tóm tắt học tập", + "scheduled.tpl_meeting_prep_desc": "Tạo ghi chú chuẩn bị cho cuộc họp ngày mai.", + "scheduled.tpl_meeting_prep_name": "Ghi chú chuẩn bị họp", + "scheduled.tpl_weekly_wins_desc": "Tạo bản tổng kết thứ Sáu về thành tựu, trở ngại và bước tiếp theo.", + "scheduled.tpl_weekly_wins_name": "Tổng kết thành tựu tuần", + "scheduled.view_scheduler_docs": "Xem tài liệu scheduler", + "scheduled.weekdays_at": "Ngày thường lúc {time}", + "scheduled.weekends_at": "Cuối tuần lúc {time}", + "scheduled.worker_root_hint": "Thư mục gốc worker được suy ra từ workspace đã chọn.", + "scheduled.your_automations": "Tự động hóa của bạn", + "session.allow_for_session": "Cho phép trong phiên này", "session.allow_once": "Một lần", "session.api_key_saved": "Đã lưu API key", "session.attachments_add_token": "Thêm token máy chủ để đính kèm tệp.", @@ -1275,12 +1144,16 @@ export default { "session.create_workspace_desc": "Mở trình tạo workspace và chọn cách bắt đầu.", "session.create_workspace_title": "Tạo workspace", "session.default_agent": "Agent mặc định", + "session.default_title": "Phiên mới", "session.delete": "Xóa", "session.delete_named_session_message": "Thao tác này sẽ xóa vĩnh viễn \"{title}\" và các tin nhắn.", "session.delete_session_generic": "Thao tác này sẽ xóa vĩnh viễn phiên đã chọn và các tin nhắn.", "session.delete_session_title": "Xóa phiên?", "session.deleted": "Đã xóa phiên", "session.deleting": "Đang xóa...", + "session.deny": "Từ chối", + "session.details": "Chi tiết", + "session.details_label": "Chi tiết", "session.doom_loop_label": "Vòng lặp lỗi", "session.doom_loop_message": "OpenCode phát hiện lệnh gọi công cụ lặp lại với cùng đầu vào và hỏi xem có nên tiếp tục sau các lần thất bại lặp lại.", "session.doom_loop_note": "Từ chối để dừng vòng lặp, hoặc cho phép nếu bạn muốn agent tiếp tục thử.", @@ -1318,7 +1191,9 @@ export default { "session.loading_session": "Đang tải phiên", "session.loading_title": "Đang tải phiên", "session.menu_label": "Menu", + "session.model": "Model", "session.model_fallback": "Model", + "session.new_task": "Tạo task mới", "session.next_match": "Kết quả tiếp theo", "session.no_matches": "Không có kết quả", "session.no_matches_command": "Không có kết quả.", @@ -1329,13 +1204,16 @@ export default { "session.nothing_to_undo": "Chưa có gì để hoàn tác.", "session.oauth_failed": "OAuth thất bại", "session.obsidian_worker_relative_only": "Chỉ có thể mở tệp thuộc worker trong Obsidian.", + "session.open": "Mở", "session.palette_hint_navigate": "Phím mũi tên để di chuyển", "session.palette_hint_run": "Enter để chạy · Esc để đóng", "session.palette_placeholder_actions": "Tìm thao tác", "session.palette_placeholder_sessions": "Tìm theo tiêu đề phiên hoặc workspace", "session.palette_title_actions": "Thao tác nhanh", "session.palette_title_sessions": "Tìm kiếm phiên", + "session.permission_label": "Quyền", "session.permission_message": "OpenCode đang yêu cầu quyền để tiếp tục.", + "session.permission_required": "Cần cấp quyền", "session.phase_responding": "Đang phản hồi", "session.phase_retrying": "Đang thử lại", "session.phase_run_failed": "Chạy thất bại", @@ -1352,12 +1230,19 @@ export default { "session.redo_label": "Làm lại", "session.redo_title": "Làm lại tin nhắn đã hoàn tác", "session.remote_sync_failed": "Đồng bộ tệp từ xa thất bại", + "session.rename_description": "Cập nhật tên cho phiên này.", + "session.rename_label": "Tên phiên", + "session.rename_placeholder": "Nhập tên mới", + "session.rename_title": "Đổi tên phiên", "session.resize_workspace_column": "Thay đổi kích thước cột workspace", "session.restart_update_title": "Khởi động lại để áp dụng bản cập nhật {version}", "session.restored_message": "Đã khôi phục tin nhắn đã hoàn tác.", + "session.reveal": "Hiện trong trình quản lý tệp", "session.reveal_desktop_only": "Hiển thị trong trình quản lý tệp khả dụng trong ứng dụng desktop.", "session.revert_label": "Hoàn tác", "session.reverted_last_message": "Đã hoàn tác tin nhắn cuối.", + "session.run": "Chạy", + "session.scope_label": "Phạm vi", "session.search_conversation_label": "Tìm kiếm cuộc hội thoại", "session.search_conversation_title": "Tìm kiếm cuộc hội thoại (Ctrl/Cmd+F)", "session.search_next": "Tiếp", @@ -1440,21 +1325,389 @@ export default { "session.workspace_setup_desc": "Bắt đầu với workspace OpenWork có hướng dẫn, hoặc chọn thư mục hiện có.", "session.workspace_setup_label": "Thiết lập workspace", "session.workspace_setup_title": "Thiết lập workspace đầu tiên", - - // ==================== Settings (missing) ==================== + "settings.action_download": "Tải xuống", + "settings.action_install": "Cài đặt", + "settings.actor_host": "máy chủ", + "settings.actor_remote": "từ xa", + "settings.actor_unknown": "không rõ", + "settings.advanced": "Nâng cao", + "settings.advanced_title": "Nâng cao", + "settings.api_keys_info": "API key được lưu cục bộ bởi OpenCode. Provider dựa trên biến môi trường phải thay đổi trong môi trường worker rồi tải lại.", + "settings.appearance_hint": "Theo hệ thống hoặc buộc chế độ sáng/tối.", + "settings.appearance_title": "Giao diện", + "settings.audit_error": "Lỗi", + "settings.audit_loading": "Đang tải", + "settings.audit_log_title": "Nhật ký kiểm toán", + "settings.audit_ready": "Sẵn sàng", + "settings.auto_compact": "Thu gọn ngữ cảnh tự động", + "settings.auto_compact_desc": "Kiểm soát thu gọn ngữ cảnh tự động của OpenCode cho workspace này. Tải lại engine sau khi thay đổi.", + "settings.auto_update_desc": "Tự động tải bản cập nhật (hỏi trước khi", + "settings.auto_update_title": "Tự động cập nhật", + "settings.available_count": "{count} khả dụng", + "settings.background_checks_desc": "OpenWork luôn kiểm tra khi khởi động. Cũng kiểm tra một lần", + "settings.background_checks_title": "Kiểm tra nền", + "settings.base_url_unavailable": "URL cơ sở không khả dụng", + "settings.binary_unavailable": "File nhị phân không khả dụng", + "settings.cache_nothing_to_repair": "Không tìm thấy bộ nhớ đệm OpenCode. Không cần sửa.", + "settings.cache_repair_requires_desktop": "Sửa bộ nhớ đệm yêu cầu ứng dụng desktop", + "settings.cache_repaired": "Đã sửa bộ nhớ đệm OpenCode. Khởi động lại engine nếu đang chạy.", + "settings.cap_browser_tools": "Công cụ trình duyệt: {value}", + "settings.cap_commands": "Commands: {value}", + "settings.cap_config": "Cấu hình: {value}", + "settings.cap_file_tools": "Công cụ tệp: {value}", + "settings.cap_inbox_off": "hộp đến tắt", + "settings.cap_inbox_on": "hộp đến bật", + "settings.cap_mcp": "MCP: {value}", + "settings.cap_outbox_off": "hộp đi tắt", + "settings.cap_outbox_on": "hộp đi bật", + "settings.cap_plugins": "Plugins: {value}", + "settings.cap_proxy": "Proxy (OpenCodeRouter): {value}", + "settings.cap_read": "đọc", + "settings.cap_sandbox": "Sandbox: {value}", + "settings.cap_skills": "Skills: {value}", + "settings.cap_write": "ghi", + "settings.capabilities_title": "Khả năng máy chủ OpenWork", + "settings.capabilities_unavailable": "Khả năng không khả dụng. Kết nối bằng token client.", + "settings.change": "Thay đổi", + "settings.check_update": "Kiểm tra", + "settings.checking_for_updates": "Đang kiểm tra cập nhật", + "settings.choose": "Chọn", + "settings.clear": "Xóa", + "settings.clipboard_unavailable": "Clipboard không khả dụng trong môi trường này.", + "settings.configure": "Cấu hình", + "settings.connect_opencode_hint": "Kết nối OpenCode để tải provider.", + "settings.connect_provider": "Kết nối provider", + "settings.connected_count": "{count} đã kết nối", + "settings.connection": "Kết nối", + "settings.connection_failed": "Kết nối thất bại", + "settings.connection_title": "Kết nối", + "settings.copied_debug_report": "Đã sao chép báo cáo runtime JSON.", + "settings.copy_failed": "Sao chép báo cáo runtime thất bại.", + "settings.copy_json": "Sao chép JSON", + "settings.custom_binary_hint": "Dùng để trỏ OpenWork đến bản build OpenCode nội bộ", + "settings.custom_binary_label": "File nhị phân OpenCode tùy chỉnh", + "settings.data_dir_unavailable": "Thư mục dữ liệu không khả dụng", + "settings.debug_commit": "Commit: {sha}", + "settings.debug_desktop_app": "Ứng dụng desktop: {version}", + "settings.debug_opencode_router_version": "OpenCodeRouter: {version}", + "settings.debug_opencode_version": "OpenCode: {version}", + "settings.debug_openwork_server_version": "Máy chủ OpenWork: {version}", + "settings.debug_orchestrator_version": "Orchestrator: {version}", + "settings.debug_section_title": "Nhà phát triển", + "settings.deeplink_failed": "Mở deep link thất bại.", + "settings.deeplink_hint": "Chấp nhận openwork://, openwork-dev://, hoặc URL https://share.openworklabs.com/b/... hỗ trợ.", + "settings.default_model": "Model mặc định", + "settings.delete_containers": "Đang xóa container...", + "settings.delete_local_config": "Đang xóa trạng thái cục bộ...", + "settings.desktop_only_hint": "Khả dụng trong ứng dụng desktop.", + "settings.dev_mode_badge": "Chế độ phát triển", + "settings.developer": "Nhà phát triển", + "settings.developer_mode_desc": "Bật công cụ gỡ lỗi, chẩn đoán và tab Nhà phát triển.", + "settings.developer_mode_title": "Chế độ nhà phát triển", + "settings.developer_panel_disabled": "Đã tắt bảng nhà phát triển.", + "settings.developer_panel_enabled": "Đã bật bảng nhà phát triển.", + "settings.devlog_cleared": "Đã xóa log nhà phát triển.", + "settings.devlog_clipboard_unavailable": "Clipboard không khả dụng trong môi trường này.", + "settings.devlog_copied": "Đã sao chép log nhà phát triển.", + "settings.devlog_copy_failed": "Không thể sao chép log nhà phát triển.", + "settings.devlog_export_failed": "Không thể xuất log nhà phát triển.", + "settings.devlog_export_unavailable": "Xuất không khả dụng trong môi trường này.", + "settings.devlog_exported": "Đã xuất log nhà phát triển.", + "settings.devtools_desc": "Trạng thái sidecar, khả năng và nhật ký kiểm toán.", + "settings.devtools_title": "Devtools", + "settings.diag_approval": "Phê duyệt: {mode} ({ms}ms)", + "settings.diag_config_path": "Đường dẫn cấu hình: {path}", + "settings.diag_daemon_url": "Daemon: {url}", + "settings.diag_default": "mặc định", + "settings.diag_health_port": "Cổng health: {port}", + "settings.diag_healthy_ms": "Healthy: {ms}ms", + "settings.diag_host_token_source": "Nguồn token máy chủ: {source}", + "settings.diag_last_attempt": "Lần thử cuối: {time}", + "settings.diag_load_sessions_ms": "Tải phiên: {ms}ms", + "settings.diag_opencode_binary": "File nhị phân OpenCode: {binary}", + "settings.diag_opencode_url": "OpenCode: {url}", + "settings.diag_pending_permissions_ms": "Quyền đang chờ: {ms}ms", + "settings.diag_pid": "PID: {pid}", + "settings.diag_providers_ms": "Providers: {ms}ms", + "settings.diag_read_only": "Chỉ đọc: {value}", + "settings.diag_reason": "Lý do: {reason}", + "settings.diag_runtime_workspace": "Workspace runtime: {id}", + "settings.diag_selected_workspace": "Workspace đã chọn: {id}", + "settings.diag_sidecar": "Sidecar: {info}", + "settings.diag_started": "Bắt đầu: {time}", + "settings.diag_token_source": "Nguồn token: {source}", + "settings.diag_total_ms": "Tổng: {ms}ms", + "settings.diag_version": "Phiên bản: {version}", + "settings.diag_workspaces": "Workspaces: {count}", + "settings.diagnostics_unavailable": "Chẩn đoán không khả dụng.", + "settings.disable_developer_mode": "Tắt chế độ Nhà phát triển", + "settings.disabled": "Đã tắt", + "settings.disconnect": "Ngắt kết nối", + "settings.disconnect_confirm_suffix": "Ngắt kết nối {resolved}? Thao tác này sẽ xóa API key hoặc thông tin OAuth đã lưu cho provider này.", + "settings.disconnect_server": "Ngắt kết nối máy chủ", + "settings.disconnected_prefix": "Đã ngắt kết nối {resolved}.", + "settings.disconnecting": "Đang ngắt kết nối...", + "settings.docker_containers_desc": "Buộc xóa container Docker do OpenWork tạo", + "settings.docker_containers_title": "Container Docker của OpenWork", + "settings.docker_requires_desktop": "Dọn dẹp Docker yêu cầu ứng dụng desktop", + "settings.done": "Xong", + "settings.downloading_bytes": "Đang tải {downloaded}", + "settings.downloading_progress": "Đang tải {downloaded} / {total} ({percent}%)", + "settings.enable_developer_mode": "Bật chế độ Nhà phát triển", + "settings.enable_exa": "Bật tìm kiếm web Exa", + "settings.enable_exa_desc": "Áp dụng khi OpenWork Orchestrator khởi chạy OpenCode.", + "settings.enabled": "Đã bật", + "settings.engine_bundled": "Đi kèm (khuyến nghị)", + "settings.engine_bundled_hint": "Engine đi kèm là tùy chọn đáng tin nhất. Dùng Hệ thống", + "settings.engine_custom_binary": "File nhị phân tùy chỉnh", + "settings.engine_desc": "Chọn cách OpenCode chạy nội bộ.", + "settings.engine_runtime_label": "Runtime engine", + "settings.engine_source": "Nguồn engine", + "settings.engine_source_debug": "Nguồn engine", + "settings.engine_system_path": "Cài đặt hệ thống (PATH)", + "settings.engine_title": "Engine", + "settings.exa_restart_hint": "Khởi động lại OpenCode hoặc orchestrator sau khi thay đổi cài đặt này.", + "settings.export": "Xuất", + "settings.export_failed": "Xuất báo cáo runtime thất bại.", + "settings.export_unavailable": "Xuất không khả dụng trong môi trường này.", + "settings.exported_debug_report": "Đã xuất báo cáo runtime JSON.", + "settings.failed": "Thất bại", + "settings.failed_open_providers": "Mở providers thất bại", + "settings.feedback_badge": "Chúng tôi đọc từng tin nhắn", + "settings.feedback_desc": "Cho chúng tôi biết điều gì tuyệt vời và điều gì chưa ổn. Phản hồi sẽ được gửi thẳng đến nhóm và giúp chúng tôi ưu tiên những gì phát triển tiếp theo.", + "settings.feedback_title": "Góp phần định hình OpenWork", + "settings.group_global": "Toàn cục", + "settings.group_workspace": "Workspace", + "settings.hide_titlebar": "Ẩn thanh tiêu đề", + "settings.hide_titlebar_desc": "Ẩn thanh tiêu đề cửa sổ. Hữu ích cho trình quản lý cửa sổ xếp gạch", + "settings.join_discord": "Tham gia Discord", + "settings.language": "Ngôn ngữ", + "settings.language.description": "Chọn ngôn ngữ ưa thích", + "settings.last_error": "Lỗi cuối", + "settings.last_stderr": "Stderr cuối", + "settings.last_stdout": "Stdout cuối", + "settings.loading_providers": "Đang tải provider...", + "settings.logs_on_host": "Nhật ký khả dụng trên máy chủ.", + "settings.managed_by_env": "Quản lý bởi biến môi trường", + "settings.messaging_bridge_service": "Dịch vụ cầu nối nhắn tin.", + "settings.messaging_section_desc": "Quản lý danh tính Telegram/Slack và liên kết trong tab Danh tính.", + "settings.messaging_section_title": "Nhắn tin", + "settings.model": "Model", + "settings.model_behavior": "Hành vi model", + "settings.model_behavior_desc": "Mở bộ chọn model mặc định để chọn hồ sơ suy luận khi có sẵn.", + "settings.model_default": "Mặc định", + "settings.model_description": "Mặc định + điều khiển suy luận cho các lượt chạy.", + "settings.model_description_default": "Chọn từ các provider đã cấu hình. Lựa chọn này áp dụng cho phiên mới.", + "settings.model_description_session": "Chọn từ các provider đã cấu hình. Lựa chọn này áp dụng cho tin nhắn tiếp theo.", + "settings.model_fallback": "Dự phòng", + "settings.model_reasoning": "Suy luận", + "settings.model_section_desc": "Chọn model trò chuyện mặc định và xem xét cách nó suy luận.", + "settings.model_title": "Model", + "settings.no_access": "không có quyền", + "settings.no_active_workspace": "Không có workspace nội bộ đang hoạt động.", + "settings.no_audit_entries": "Chưa có mục kiểm toán.", + "settings.no_binary_selected": "Chưa chọn file nhị phân.", + "settings.no_custom_path_set": "Chưa đặt đường dẫn tùy chỉnh", + "settings.no_project_directory": "Không có thư mục dự án", + "settings.no_stderr": "Chưa ghi nhận stderr.", + "settings.no_stdout": "Chưa ghi nhận stdout.", + "settings.no_worker_directory": "Không có thư mục dự án", + "settings.no_worker_path": "Không có đường dẫn worker", + "settings.nuke_confirm_dev": "Thao tác không thể hoàn tác. Sẽ xóa tất cả dữ liệu OpenWork cho bản dev này cùng cấu hình, xác thực, bộ nhớ đệm, dữ liệu và trạng thái OpenCode dev, rồi thoát OpenWork. Tiếp tục?", + "settings.nuke_confirm_prod": "Thao tác không thể hoàn tác. Sẽ xóa tất cả dữ liệu OpenWork cho bản dev này cùng cấu hình, xác thực, bộ nhớ đệm, dữ liệu và trạng thái OpenCode dev, rồi thoát OpenWork. Tiếp tục?", + "settings.nuke_failed": "Xóa trạng thái OpenWork và OpenCode thất bại.", + "settings.nuke_hint": "Chỉ dùng khi bạn muốn đặt lại hoàn toàn ứng dụng desktop và trạng thái runtime OpenCode.", + "settings.nuke_success": "Đã xóa trạng thái OpenWork và OpenCode. OpenWork đang đóng...", + "settings.off": "Tắt", + "settings.offline": "Ngoại tuyến", + "settings.on": "Bật", + "settings.open_deeplink_action": "Đang mở...", + "settings.open_deeplink_button": "Ẩn", + "settings.open_deeplink_desc": "Dán deeplink hoặc URL chia sẻ OpenWork để mở.", + "settings.open_deeplink_title": "Mở Deeplink", + "settings.opencode_cache": "Bộ nhớ đệm OpenCode", + "settings.opencode_cache_description": "Sửa dữ liệu đệm dùng để khởi động engine. An toàn để chạy.", + "settings.opencode_engine_desc": "Runtime nội bộ cho agents, tools và provider mô hình.", + "settings.opencode_engine_label": "Engine OpenCode", + "settings.opencode_engine_sidecar_desc": "Sidecar thực thi nội bộ.", + "settings.opencode_router_sidecar": "Sidecar OpenCodeRouter", + "settings.opencode_runtime_desc": "Tùy chọn runtime cho engine nội bộ và cầu nối orchestrator.", + "settings.opencode_sdk_desc": "Chẩn đoán kết nối giao diện.", + "settings.opencode_sdk_title": "Engine OpenCode", + "settings.opencode_section_label": "OpenCode", + "settings.opencode_url_unavailable": "URL cơ sở không khả dụng", + "settings.opening": "Mở deeplink", + "settings.openwork_config_sidecar_desc": "Sidecar cấu hình và phê duyệt.", + "settings.openwork_diagnostics_title": "Chẩn đoán máy chủ OpenWork", + "settings.openwork_server_desc": "Trung tâm điều phối phiên cho đồng bộ ứng dụng, workers và kết nối từ xa.", + "settings.openwork_server_label": "Máy chủ OpenWork", + "settings.orchestrator_daemon_layer_desc": "Lớp điều phối workspace.", + "settings.orchestrator_daemon_title": "Daemon Orchestrator", + "settings.pending_permissions": "Quyền đang chờ", + "settings.production_mode_badge": "Production", + "settings.provider_default_desc": "Sử dụng hành vi suy luận mặc định tích hợp sẵn của model.", + "settings.provider_default_label": "Mặc định của provider", + "settings.provider_source_config": "Cấu hình", + "settings.provider_source_custom": "Tùy chỉnh", + "settings.provider_source_env": "Biến môi trường", + "settings.providers_desc": "Kết nối dịch vụ cho models và công cụ.", + "settings.providers_title": "Providers", + "settings.quit_hint": "OpenWork thoát ngay sau khi dọn dẹp để lần khởi động tiếp theo bắt đầu từ trạng thái cục bộ trống cho chế độ này.", + "settings.recent_events": "Sự kiện gần đây", + "settings.reconnect_failed": "Kết nối lại thất bại. Kiểm tra URL/token máy chủ và thử lại.", + "settings.reconnect_server": "Đang kết nối lại...", + "settings.reconnect_server_failed": "Kết nối lại máy chủ OpenWork thất bại.", + "settings.reconnected": "Đã kết nối lại máy chủ OpenWork.", + "settings.reconnecting": "Đang kết nối lại...", + "settings.removing_containers": "Đang xóa container...", + "settings.removing_local_state": "Đang xóa trạng thái cục bộ...", + "settings.repair_cache": "Sửa bộ nhớ đệm", + "settings.repairing_cache": "Đang sửa bộ nhớ đệm", + "settings.report_issue": "Báo cáo sự cố", + "settings.reset": "Đặt lại", + "settings.reset_app_data": "Đặt lại dữ liệu ứng dụng", + "settings.reset_app_data_description": "Triệt để hơn. Xóa bộ nhớ đệm + dữ liệu ứng dụng OpenWork.", + "settings.reset_app_data_title": "Đặt lại dữ liệu ứng dụng", + "settings.reset_app_data_warning": "Xóa bộ nhớ đệm và dữ liệu ứng dụng OpenWork trên thiết bị này.", + "settings.reset_button": "Đặt lại", + "settings.reset_cancel": "Hủy", + "settings.reset_config_defaults": "Đang đặt lại...", + "settings.reset_config_failed": "Đặt lại cấu hình ứng dụng thất bại.", + "settings.reset_confirm_button": "Đặt lại & Khởi động lại", + "settings.reset_confirmation_hint": "Nhập RESET để xác nhận. OpenWork sẽ khởi động lại.", + "settings.reset_confirmation_label": "Xác nhận", + "settings.reset_confirmation_placeholder": "Nhập RESET", + "settings.reset_onboarding": "Đặt lại thiết lập ban đầu", + "settings.reset_onboarding_description": "Xóa tùy chọn OpenWork và khởi động lại ứng dụng.", + "settings.reset_onboarding_title": "Đặt lại thiết lập ban đầu", + "settings.reset_onboarding_warning": "Xóa tùy chọn cục bộ và đánh dấu thiết lập ban đầu của OpenWork.", + "settings.reset_openwork_desc_dev": "Với chế độ dev, chỉ xóa trạng thái OpenCode dev riêng biệt trong openwork-dev-data.", + "settings.reset_openwork_desc_prod": "Với chế độ dev, chỉ xóa trạng thái OpenCode dev riêng biệt trong openwork-dev-data.", + "settings.reset_openwork_title": "Đặt lại trạng thái OpenWork + OpenCode", + "settings.reset_recovery_desc": "Xóa dữ liệu hoặc khởi động lại luồng thiết lập.", + "settings.reset_recovery_title": "Đặt lại & Khôi phục", + "settings.reset_requires_confirm": "Yêu cầu nhập RESET và sẽ khởi động lại ứng dụng.", + "settings.reset_startup": "Đặt lại chế độ khởi động mặc định", + "settings.reset_startup_pref": "Đặt lại tùy chọn khởi động", + "settings.reset_stop_active_runs": "Dừng các task đang chạy trước khi đặt lại.", + "settings.resetting": "Đang đặt lại...", + "settings.restart_blocked_message": "OpenWork cần khởi động lại để hoàn tất cập nhật. Để tránh gián đoạn công việc hiện tại, cài đặt bị tạm dừng cho đến khi task đang chạy hoàn tất hoặc bạn dừng chúng.", + "settings.restart_failed": "Khởi động lại thất bại. Kiểm tra nhật ký và thử lại.", + "settings.restart_local_server": "Đang khởi động lại...", + "settings.restart_opencode": "Đang khởi động lại...", + "settings.restart_opencode_router": "Đang khởi động lại...", + "settings.restart_openwork_server": "Đang khởi động lại...", + "settings.restart_orchestrator": "Đang khởi động lại...", + "settings.restart_server_failed": "Khởi động lại máy chủ nội bộ thất bại.", + "settings.restarted": "Đã khởi động lại máy chủ nội bộ.", + "settings.restarting": "Đang khởi động lại...", + "settings.reveal_config": "Hiện cấu hình", + "settings.reveal_config_failed": "Hiện cấu hình workspace thất bại.", + "settings.reveal_config_requires_desktop": "Hiện cấu hình yêu cầu ứng dụng desktop", + "settings.revealed_workspace_config": "Đã hiện cấu hình workspace.", + "settings.run_sandbox_probe": "Đang chạy kiểm tra...", + "settings.running_probe": "Đang chạy kiểm tra...", + "settings.runtime_applies_hint": "Áp dụng lần tiếp theo engine khởi động hoặc tải lại.", + "settings.runtime_debug_desc": "Bản chụp chẩn đoán dễ đọc với xuất một cú nhấp.", + "settings.runtime_debug_title": "Báo cáo gỡ lỗi runtime", + "settings.runtime_desc": "Trạng thái engine nội bộ và máy chủ OpenWork.", + "settings.runtime_direct": "Trực tiếp (OpenCode)", + "settings.runtime_orchestrator": "OpenWork Orchestrator", + "settings.runtime_title": "Runtime", + "settings.sandbox_error": "Lỗi", + "settings.sandbox_export_hint": "Dùng Xuất trong Báo cáo gỡ lỗi runtime ở trên để", + "settings.sandbox_probe_desc": "Chạy kiểm tra khởi động sandbox Docker tạm thời và", + "settings.sandbox_probe_errors": "Kiểm tra sandbox hoàn tất có lỗi.", + "settings.sandbox_probe_failed": "Kiểm tra sandbox thất bại.", + "settings.sandbox_probe_success": "Kiểm tra sandbox thành công. Xuất báo cáo gỡ lỗi để hỗ trợ.", + "settings.sandbox_probe_title": "Kiểm tra sandbox", + "settings.sandbox_ready": "Sẵn sàng", + "settings.sandbox_requires_desktop": "Kiểm tra sandbox yêu cầu ứng dụng desktop", + "settings.sandbox_result": "Kết quả: {status}", + "settings.sandbox_run_id": "ID chạy: {id}", + "settings.sandbox_stop_runs_hint": "Dừng task đang chạy trước khi kiểm tra", + "settings.search_models": "Tìm model…", + "settings.select_binary": "Chọn file nhị phân OpenCode", + "settings.select_workspace_first": "Chọn workspace nội bộ trước khi hiện cấu hình.", + "settings.send_feedback": "Gửi phản hồi", + "settings.service_restarts_desc": "Khởi động lại dịch vụ máy chủ cụ thể mà không cần rời", + "settings.service_restarts_title": "Khởi động lại dịch vụ", + "settings.session_model": "Model", + "settings.show_model_reasoning": "Hiển thị suy luận model", + "settings.show_model_reasoning_desc": "Mở rộng dấu vết suy luận trong giao diện khi model cung cấp.", + "settings.showing_models": "Hiển thị {count} / {total}", + "settings.sidecar_config_unavailable": "Cấu hình sidecar không khả dụng", + "settings.startup": "Khởi động", + "settings.startup_local": "Khởi động máy chủ nội bộ", + "settings.startup_not_set": "Kết nối máy chủ", + "settings.startup_remote_warning": "Tùy chọn khởi động hiện là từ xa. Cài đặt engine", + "settings.startup_reset_hint": "Xóa tùy chọn đã lưu và hiện lựa chọn kết nối", + "settings.startup_server": "Kết nối máy chủ", + "settings.startup_title": "Khởi động", + "settings.stop_local_server": "Dừng máy chủ nội bộ", + "settings.stop_runs_before_cleanup": "Dừng task đang chạy trước khi dọn dẹp", + "settings.stop_runs_before_reset_config": "Dừng task đang chạy trước khi đặt lại cấu hình", + "settings.stop_runs_to_reset": "Dừng task đang chạy để đặt lại", + "settings.switch": "Chuyển", "settings.tab_advanced": "Nâng cao", "settings.tab_appearance": "Giao diện", "settings.tab_automations": "Tự động hóa", "settings.tab_cloud": "Cloud", "settings.tab_debug": "Gỡ lỗi", + "settings.tab_description_advanced": "Kiểm tra trạng thái runtime, kết nối và điều khiển dành cho nhà phát triển.", + "settings.tab_description_appearance": "Điều chỉnh giao diện OpenWork trên desktop, giao diện hệ thống và chrome ứng dụng.", + "settings.tab_description_automations": "Tạo và quản lý tự động hóa lên lịch từ cài đặt workspace.", + "settings.tab_description_debug": "Xem chẩn đoán runtime, nhật ký và tiện ích gỡ lỗi cấp thấp.", + "settings.tab_description_den": "Quản lý kết nối OpenWork Cloud, worker được lưu trữ và quyền truy cập workspace.", + "settings.tab_description_extensions": "Quản lý ứng dụng MCP và plugins OpenCode cho workspace này.", + "settings.tab_description_general": "Kết nối provider, chọn model mặc định, cấp quyền thư mục và kiểm soát workspace OpenWork cùng kết nối runtime.", + "settings.tab_description_messaging": "Cấu hình danh tính router và hành vi hộp đến từ cài đặt workspace.", + "settings.tab_description_model": "Tinh chỉnh model mặc định, hành vi runtime và cài đặt đầu ra trợ lý.", + "settings.tab_description_recovery": "Sửa trạng thái di chuyển, đặt lại mặc định workspace và khôi phục cài đặt cục bộ.", + "settings.tab_description_skills": "Duyệt, chỉnh sửa và cài đặt skills mà không cần rời cài đặt.", + "settings.tab_description_updates": "Giữ ứng dụng luôn cập nhật với kiểm tra nền im lặng và điều khiển cài đặt.", "settings.tab_extensions": "Tiện ích mở rộng", "settings.tab_general": "Cài đặt", "settings.tab_messaging": "Nhắn tin", + "settings.tab_model": "Model", "settings.tab_recovery": "Khôi phục", "settings.tab_skills": "Skills", "settings.tab_updates": "Cập nhật", - - // ==================== Share ==================== + "settings.theme_dark": "Tối", + "settings.theme_light": "Sáng", + "settings.theme_system": "Hệ thống", + "settings.theme_system_hint": "Chế độ hệ thống tự động theo tùy chọn hệ điều hành.", + "settings.toolbar_ready_to_install": "Sẵn sàng cài đặt", + "settings.update": "Cập nhật", + "settings.update_available": "Có bản cập nhật: v", + "settings.update_available_version": "Có bản cập nhật: v{version}", + "settings.update_check_button": "Kiểm tra", + "settings.update_check_failed": "Kiểm tra cập nhật thất bại", + "settings.update_checking": "Đang kiểm tra...", + "settings.update_download_button": "Tải xuống", + "settings.update_downloading": "Đang tải xuống...", + "settings.update_error": "Kiểm tra cập nhật thất bại", + "settings.update_install_button": "Cài đặt & Khởi động lại", + "settings.update_last_checked": "Kiểm tra lần cuối {time}", + "settings.update_published": "Phát hành {date}", + "settings.update_ready": "Sẵn sàng cài đặt: v", + "settings.update_ready_version": "Sẵn sàng cài đặt: v{version}", + "settings.update_uptodate": "Đã cập nhật mới nhất", + "settings.updates": "Cập nhật", + "settings.updates_desc": "Giữ OpenWork luôn cập nhật.", + "settings.updates_desktop_only": "Cập nhật chỉ khả dụng trong ứng dụng desktop.", + "settings.updates_not_supported": "Cập nhật không được hỗ trợ trong môi trường này.", + "settings.updates_title": "Cập nhật", + "settings.version": "Phiên bản", + "settings.versions_desc": "Thông tin build sidecar + desktop.", + "settings.versions_title": "Phiên bản", + "settings.window_appearance_desc": "Tùy chỉnh giao diện cửa sổ.", + "settings.worker_id_label": "Worker {id}", + "settings.worker_unresolved": "Worker {runtimeWorkspaceId}", + "settings.workspace_config_desc": ".opencode/openwork.json", + "settings.workspace_config_title": "Cấu hình workspace", + "settings.workspace_debug_events_label": "Sự kiện gỡ lỗi workspace", + "settings.workspace_fallback_name": "Workspace", "share.active_cloud_org": "Tổ chức Cloud đang hoạt động", "share.back_hint": "Quay lại tùy chọn chia sẻ", "share.chooser_subtitle": "Chọn cách bạn muốn chia sẻ workspace này.", @@ -1517,33 +1770,33 @@ export default { "share.workspace_fallback": "Workspace", "share.workspace_template_desc": "Chia sẻ thiết lập cốt lõi và cài đặt mặc định của workspace.", "share.workspace_template_title": "Mẫu workspace", - - // ==================== Share Skill Destination ==================== + "share_skill_destination.add_to_workspace": "Thêm vào workspace", + "share_skill_destination.adding": "Đang thêm...", "share_skill_destination.confirm_busy": "Đang thêm skill...", "share_skill_destination.confirm_button": "Thêm skill vào workspace", "share_skill_destination.connect_remote": "Kết nối workspace từ xa", "share_skill_destination.connect_remote_desc": "Gắn máy chủ OpenWork, rồi chọn từ danh sách để nhập skill này.", + "share_skill_destination.connect_remote_hint": "Kết nối workspace từ xa để nhập skill này.", "share_skill_destination.create_worker": "Tạo workspace mới", "share_skill_destination.create_worker_desc": "Mở luồng thiết lập workspace, rồi thêm skill này sau khi workspace mới sẵn sàng.", + "share_skill_destination.create_worker_hint": "Tạo workspace mới để cài skill này.", "share_skill_destination.current_badge": "Hiện tại", "share_skill_destination.existing_workers": "Workspace hiện có", "share_skill_destination.fallback_skill_name": "Skill chia sẻ", "share_skill_destination.footer_idle": "Chọn workspace để tiếp tục.", "share_skill_destination.footer_selected": "Workspace đã chọn:", "share_skill_destination.local_badge": "Nội bộ", + "share_skill_destination.more_options": "Thêm tùy chọn", "share_skill_destination.new_destination": "Đích mới", "share_skill_destination.no_workers": "Chưa có workspace sẵn sàng. Tạo workspace hoặc kết nối workspace từ xa để cài skill này.", "share_skill_destination.remote_badge": "Từ xa", "share_skill_destination.sandbox_badge": "Sandbox", "share_skill_destination.selected_badge": "Đã chọn", "share_skill_destination.selected_hint": "Đã chọn. Xem lại đích bên dưới, rồi xác nhận.", - "share_skill_destination.selection_ready": "Sẵn sàng thêm", "share_skill_destination.skill_label": "Skill chia sẻ", "share_skill_destination.subtitle": "Chọn workspace hiện có hoặc tạo mới trước khi nhập skill chia sẻ này.", "share_skill_destination.title": "Skill này nên đặt ở đâu?", "share_skill_destination.trigger_label": "Kích hoạt", - - // ==================== Sidebar ==================== "sidebar.active": "Đang hoạt động", "sidebar.add_workspace": "Thêm workspace mới", "sidebar.collapse": "Thu gọn", @@ -1555,74 +1808,215 @@ export default { "sidebar.import_config": "Nhập cấu hình", "sidebar.needs_attention": "Cần chú ý", "sidebar.new_worker": "Worker mới", - "sidebar.no_sessions_yet": "Chưa có phiên nào", "sidebar.no_workspaces": "Chưa có workspace trong phiên này. Thêm một workspace để bắt đầu.", "sidebar.progress": "Tiến trình", - "sidebar.remove_workspace": "Xóa workspace", "sidebar.show_fewer": "Hiện ít hơn", "sidebar.show_more": "Hiện thêm {count}", "sidebar.stop_sandbox": "Dừng sandbox", "sidebar.switch": "Chuyển", "sidebar.test_connection": "Kiểm tra kết nối", - - // ==================== Skills (missing) ==================== + "skills.add_custom_repo": "Thêm repo GitHub tùy chỉnh", + "skills.add_git_repo": "Thêm repo git", + "skills.add_openwork_hub": "Thêm OpenWork Hub", + "skills.available_from_hub": "Có sẵn từ Hub", "skills.catalog_search_placeholder": "Tìm skills đã cài, nhóm và hub", "skills.cloud_add_skill": "Thêm skill", - "skills.cloud_badge": "Cloud", "skills.cloud_choose_org_detail": "Dùng bảng Cloud để chọn tổ chức, rồi làm mới danh sách này.", "skills.cloud_choose_org_hint": "Chọn tổ chức trong Cài đặt → Cloud để tải skills nhóm.", "skills.cloud_footer_label": "Nhóm", "skills.cloud_hub_label": "Hub: {name}", "skills.cloud_install_need_server": "Kết nối máy chủ OpenWork có quyền ghi skills để cài skills nhóm lên worker này.", "skills.cloud_installed": "Đã cài {name} lên worker này.", - "skills.cloud_installing": "Đang cài {title}\u2026", + "skills.cloud_installing": "Đang cài {title}…", "skills.cloud_installing_short": "Đang cài", "skills.cloud_no_search_matches": "Không có skill phù hợp.", "skills.cloud_org_empty": "Chưa có skills tổ chức.", "skills.cloud_org_fallback": "OpenWork Cloud", "skills.cloud_org_load_failed": "Tải skills tổ chức thất bại.", "skills.cloud_refresh": "Làm mới skills nhóm", - "skills.cloud_section_subtitle": - "Skills được chia sẻ với bạn qua OpenWork Cloud — bao gồm skill hub nhóm mà bạn có quyền truy cập.", + "skills.cloud_section_subtitle": "Skills được chia sẻ với bạn qua OpenWork Cloud — bao gồm skill hub nhóm mà bạn có quyền truy cập.", "skills.cloud_section_title": "Từ tổ chức của bạn", "skills.cloud_shared_org": "Tổ chức", "skills.cloud_shared_public": "Công khai", "skills.cloud_sign_in": "Đăng nhập Cloud", "skills.cloud_sign_in_hint": "Đăng nhập OpenWork Cloud để duyệt skills nhóm và tổ chức.", + "skills.copy_link_failed": "Sao chép liên kết thất bại", + "skills.create_in_chat": "Tạo skill trong chat", + "skills.desktop_required": "Quản lý skills yêu cầu ứng dụng desktop.", + "skills.enter_plugin_name": "Nhập tên gói plugin.", + "skills.failed_load_active": "Tải plugins đang hoạt động thất bại.", + "skills.failed_load_opencode": "Tải opencode.json thất bại", + "skills.failed_parse_opencode": "Phân tích opencode.json thất bại", + "skills.failed_to_load": "Tải skills thất bại", + "skills.failed_update_opencode": "Cập nhật opencode.json thất bại", "skills.filter_all": "Tất cả", "skills.filter_cloud": "Nhóm", "skills.filter_hub": "Hub", "skills.filter_installed": "Đã cài", - - // ==================== Status (missing) ==================== + "skills.from_repo": "Từ {owner}/{repo}", + "skills.github_repo_hint": "Nhập repo GitHub theo định dạng owner/repo.", + "skills.host_mode_only": "Chỉ workspace nội bộ", + "skills.host_only_error": "Quản lý skills yêu cầu workspace nội bộ hoặc máy chủ OpenWork đã kết nối.", + "skills.hub_desc": "Duyệt skills chia sẻ từ hub dựa trên GitHub và thêm vào worker này.", + "skills.hub_label": "Hub", + "skills.import": "Nhập", + "skills.import_failed": "Nhập thất bại ({status})", + "skills.import_local": "Nhập skill từ máy", + "skills.import_local_hint": "Sao chép thư mục skill có sẵn vào workspace này.", + "skills.import_local_skill": "Nhập skill từ máy", + "skills.imported": "Đã nhập.", + "skills.install": "Cài đặt", + "skills.install_failed": "Cài đặt skill thất bại.", + "skills.install_name_title": "Cài đặt {name}", + "skills.install_skill_creator": "Cài skill creator", + "skills.install_skill_creator_hint": "Skill này cho phép bạn tạo skills khác ngay trong cuộc hội thoại.", + "skills.installed": "Skills đã cài", + "skills.installed_desc": "Skills đã cài nằm trên worker này và có thể chỉnh sửa hoặc chia sẻ.", + "skills.installed_label": "Đã cài", + "skills.installed_status": "Đã cài", + "skills.installing": "Thêm skill", + "skills.installing_prefix": "Đang cài {name}…", + "skills.installing_skill_creator": "Đang cài skill creator...", + "skills.link_copied": "Đã sao chép liên kết", + "skills.loading": "Đang tải…", + "skills.no_description": "Chưa có mô tả.", + "skills.no_hub_repo_label": "Chưa chọn repo hub", + "skills.no_hub_repo_selected": "Không có skills hub khả dụng.", + "skills.no_hub_skills": "Chưa chọn repo hub. Thêm repo GitHub để duyệt skills.", + "skills.no_opencode_found": "Chưa tìm thấy opencode.json. Thêm plugin để tạo một file.", + "skills.no_opencode_workspace": "Chưa có opencode.json trong workspace này.", + "skills.no_skills": "Không phát hiện skills trong `.opencode/skills`, `.claude/skills`, hoặc `~/.agents/skills`.", + "skills.no_skills_found": "Chưa tìm thấy skills nào.", + "skills.owner_label": "Chủ sở hữu", + "skills.owner_repo_required": "Chủ sở hữu và repo là bắt buộc.", + "skills.pick_project_first": "Vui lòng chọn thư mục dự án trước.", + "skills.pick_project_for_active": "Chọn thư mục dự án để tải plugins đang hoạt động.", + "skills.pick_project_for_plugins": "Chọn thư mục dự án để quản lý plugins.", + "skills.pick_workspace_first": "Vui lòng chọn thư mục workspace trước.", + "skills.plugin_already_listed": "Plugin đã có trong opencode.json.", + "skills.plugin_management_host_only": "Quản lý plugins yêu cầu ứng dụng desktop.", + "skills.plugins_host_only": "Plugins chỉ khả dụng trong ứng dụng desktop.", + "skills.ref_label": "Ref (branch/tag/commit)", + "skills.refresh": "Làm mới", + "skills.refresh_hub": "Làm mới hub", + "skills.refresh_hub_title": "Làm mới danh mục hub", + "skills.remove_saved_repo": "Xóa repo đã lưu", + "skills.repo_label": "Repo", + "skills.reveal_failed": "Không thể mở thư mục skills.", + "skills.reveal_folder": "Mở thư mục skills", + "skills.reveal_folder_hint": "Mở thư mục skills trong Finder.", + "skills.save_and_load": "Lưu và tải", + "skills.save_failed": "Lưu skill thất bại.", + "skills.select_skill_folder": "Chọn thư mục skill", + "skills.share_back": "Quay lại", + "skills.share_chooser_subtitle": "Lưu vào tổ chức OpenWork Cloud hoặc tạo liên kết cài đặt công khai.", + "skills.share_close": "Đóng", + "skills.share_copy_link": "Sao chép", + "skills.share_done": "Xong", + "skills.share_option_public_desc": "Tạo liên kết để mọi người cài skill này.", + "skills.share_option_public_title": "Liên kết công khai", + "skills.share_option_team_desc": "Thêm skill này vào tổ chức OpenWork Cloud đang chọn.", + "skills.share_option_team_title": "Chia sẻ với nhóm", + "skills.share_public_create": "Tạo liên kết", + "skills.share_public_creating": "Đang xuất bản…", + "skills.share_public_intro": "Tạo liên kết công khai. Ai có URL đều có thể cài skill.", + "skills.share_public_regenerate": "Tạo lại liên kết", + "skills.share_publisher_label": "Nhà phát hành", + "skills.share_subtitle_public": "Ai có liên kết cũng có thể cài skill này.", + "skills.share_subtitle_team": "Lưu trong tổ chức để đồng đội dùng.", + "skills.share_team_choose_org": "Chọn tổ chức trong Cài đặt → Cloud trước khi chia sẻ.", + "skills.share_team_hub_label": "Thêm vào skill hub (tùy chọn)", + "skills.share_team_hub_none": "Chỉ tổ chức — không gắn hub", + "skills.share_team_hubs_loading": "Đang tải hub…", + "skills.share_team_intro": "Lưu vào tổ chức đang chọn để đồng đội cài từ Cloud.", + "skills.share_team_org_fallback": "Tổ chức Cloud hiện tại", + "skills.share_team_save": "Lưu cho nhóm", + "skills.share_team_saving": "Đang lưu…", + "skills.share_team_sign_in": "Đăng nhập để chia sẻ với nhóm", + "skills.share_team_sign_in_hint": "OpenWork Cloud mở trong trình duyệt. Đăng nhập rồi quay lại đây.", + "skills.share_team_success": "Đã lưu vào {org}. Đồng đội có thể cài từ skill của tổ chức.", + "skills.share_title": "Chia sẻ skill", + "skills.shown_count": "{count} hiển thị", + "skills.skill_creator_already_installed": "Skill creator đã được cài rồi.", + "skills.skill_creator_installed": "Đã cài skill creator.", + "skills.skill_load_failed": "Tải skill thất bại.", + "skills.source_label": "Nguồn", + "skills.subtitle": "Quản lý skills cho workspace này.", + "skills.title": "Skills", + "skills.trigger_label": "Kích hoạt: {trigger}", + "skills.uninstall": "Gỡ cài đặt", + "skills.uninstall_failed": "Gỡ skill thất bại.", + "skills.uninstall_title": "Gỡ skill này?", + "skills.uninstall_warning": "Thao tác này sẽ xóa vĩnh viễn skill `{name}` khỏi workspace của bạn.", + "skills.uninstalled": "Đã gỡ skill.", + "skills.unknown_error": "Lỗi không xác định", + "skills.worker_profile_desc": "Skills là khả năng cốt lõi của worker này. Khám phá từ Hub, quản lý những gì đã cài và tạo mới trực tiếp trong chat.", "status.back": "Quay lại màn hình trước", + "status.connected": "Đã kết nối", + "status.connecting": "Đang kết nối", + "status.creating_task": "Đang tạo task mới", + "status.creating_workspace": "Đang tạo workspace", "status.developer_mode": "Chế độ nhà phát triển", + "status.disconnected": "Đã ngắt kết nối", "status.disconnected_hint": "Mở cài đặt để kết nối lại", "status.disconnected_label": "Đã ngắt kết nối", + "status.disconnecting": "Đang ngắt kết nối", "status.feedback": "Phản hồi", + "status.idle": "Rảnh", + "status.installing_opencode": "Đang cài đặt OpenCode", "status.limited_hint": "Kết nối lại để khôi phục đầy đủ tính năng OpenWork", "status.limited_mcp_hint": "{count} MCP đã kết nối · kết nối lại để có đầy đủ tính năng", "status.limited_mode": "Chế độ giới hạn", + "status.live": "Trực tiếp", + "status.loading_session": "Đang tải phiên", "status.mcp_connected": "{count} MCP đã kết nối", "status.openwork_ready": "OpenWork sẵn sàng", "status.providers_connected": "{count} provider{plural} đã kết nối", "status.ready_for_tasks": "Sẵn sàng cho task mới", + "status.reloading_engine": "Đang tải lại engine", + "status.restarting_engine": "Đang khởi động lại engine", + "status.running": "Đang chạy", "status.send_feedback": "Gửi phản hồi", "status.settings": "Cài đặt", - - // ==================== Workspace (missing) ==================== - "workspace.active": "Đang hoạt động", + "status.starting_engine": "Đang khởi động engine", + "system.cache_repair_requires_desktop": "Sửa cache cần ứng dụng desktop.", + "system.docker_cleanup_requires_desktop": "Dọn dẹp Docker cần ứng dụng desktop.", + "system.reload_body_agents": "OpenCode tải agent khi khởi động. Tải lại engine để agent cập nhật có sẵn.", + "system.reload_body_commands": "OpenCode tải command khi khởi động. Tải lại engine để command cập nhật có sẵn.", + "system.reload_body_config": "OpenCode đọc opencode.json khi khởi động. Tải lại engine để áp dụng thay đổi cấu hình.", + "system.reload_body_default": "OpenWork phát hiện thay đổi cần tải lại OpenCode.", + "system.reload_body_mcp": "OpenCode tải MCP server khi khởi động. Tải lại engine để kích hoạt kết nối mới.", + "system.reload_body_mixed": "OpenWork phát hiện thay đổi cấu hình OpenCode. Tải lại engine để áp dụng.", + "system.reload_body_plugins": "OpenCode tải plugin npm khi khởi động. Tải lại engine để áp dụng thay đổi opencode.json.", + "system.reload_body_skills": "OpenCode có thể cache trạng thái skill. Tải lại engine để skill mới có sẵn.", + "system.reload_failed": "Không thể tải lại engine.", + "system.reload_required": "Cần tải lại", + "system.reload_unavailable": "Không thể tải lại cho worker này.", + "system.stop_active_runs_before_reset": "Dừng các lượt chạy đang hoạt động trước khi đặt lại.", + "system.stop_runs_before_update": "Dừng các lượt chạy đang hoạt động trước khi cài đặt bản cập nhật.", + "system.updates_not_supported": "Cập nhật không được hỗ trợ trong môi trường này.", + "time.hours_ago": "{count} giờ trước", + "time.just_now": "vừa xong", + "time.minutes_ago": "{count} phút trước", + "time.seconds_ago": "{count} giây trước", "workspace.loading_tasks": "Đang tải task...", "workspace.local_badge": "Nội bộ", - "workspace.needs_attention": "Cần chú ý", "workspace.new_task_inline": "+ Task mới", "workspace.no_tasks": "Chưa có task.", "workspace.remote_badge": "Từ xa", + "workspace.rename_description": "Cập nhật tên hiển thị trên thanh bên.", + "workspace.rename_label": "Tên workspace", + "workspace.rename_placeholder": "Workspace nhóm thiết kế", + "workspace.rename_title": "Đổi tên workspace", "workspace.sandbox_badge": "Sandbox", "workspace.selected": "Đã chọn", "workspace.switch": "Chuyển", - - // ==================== Workspace List ==================== + "workspace.switching_status_connecting": "Đang kiểm tra kết nối", + "workspace.switching_status_loading": "Đang tải task gần đây", + "workspace.switching_status_preparing": "Đang chuẩn bị", + "workspace.switching_subtitle": "Chúng tôi sẽ đưa bạn về công việc gần đây.", + "workspace.switching_title": "Đang mở {name}", + "workspace.switching_title_unknown": "Đang mở workspace", "workspace_list.add_workspace": "Thêm workspace", "workspace_list.connect_remote": "Kết nối workspace từ xa", "workspace_list.connecting": "Đang kết nối...", @@ -1646,8 +2040,6 @@ export default { "workspace_list.test_connection": "Kiểm tra kết nối", "workspace_list.workspace_fallback": "Workspace", "workspace_list.workspace_options": "Tùy chọn workspace", - - // ==================== Workspace Sidebar ==================== "workspace_sidebar.automations": "Tự động hóa", "workspace_sidebar.close_sidebar": "Đóng thanh bên", "workspace_sidebar.collapse_sidebar": "Thu gọn thanh bên", diff --git a/apps/app/src/i18n/locales/zh.ts b/apps/app/src/i18n/locales/zh.ts index 3f2c6f167..6fe294788 100644 --- a/apps/app/src/i18n/locales/zh.ts +++ b/apps/app/src/i18n/locales/zh.ts @@ -7,812 +7,16 @@ */ export default { - // ==================== Dashboard ==================== - "dashboard.title": "主页", - "dashboard.sessions": "会话", - "dashboard.commands": "命令", - "dashboard.skills": "Skills(技能)", - "dashboard.plugins": "插件", - "dashboard.mcps": "应用", - "dashboard.settings": "设置", - "dashboard.home": "主页", - "dashboard.runs": "运行", - "dashboard.find_workspace": "查找工作区...", - "dashboard.workspaces": "工作区", - "dashboard.no_workspaces": "没有匹配的工作区。", - "dashboard.new_workspace": "新建工作区...", - "dashboard.new_remote_workspace": "添加远程工作区...", - "dashboard.forget_workspace": "忘记工作区", - "dashboard.remote": "远程", - "dashboard.connection": "连接", - "dashboard.local_engine": "本地引擎", - "dashboard.client_mode": "客户端模式", - "dashboard.connected": "已连接", - "dashboard.not_connected": "未连接", - "dashboard.stop_disconnect": "停止并断开", - "dashboard.disconnect": "断开连接", - "dashboard.new_task": "新建任务", - "dashboard.new": "新建", - "dashboard.busy": "忙碌", - "dashboard.hero_title": "今天想做些什么?", - "dashboard.hero_description": "描述一个目标。OpenWork将运行它并保留审计记录。", - "dashboard.quick_start_commands": "快速开始命令", - "dashboard.view_all": "查看全部", - "dashboard.no_commands": "还没有命令。初始命令将显示在这里。", - "dashboard.run_command": "运行保存的命令", - "dashboard.recent_sessions": "最近的会话", - "dashboard.this_workspace": "此工作区", - "dashboard.no_sessions": "还没有会话。", - "dashboard.idle": "空闲", - "dashboard.running": "运行中", - "dashboard.completed": "已完成", - "dashboard.failed": "失败", - "dashboard.repairing_cache": "正在修复缓存", - "dashboard.repair_cache": "修复缓存", - "dashboard.retry": "重试", - "dashboard.alpha": "测试版", - "dashboard.create_workspace_title": "创建工作区", - "dashboard.create_workspace_subtitle": "初始化新的基于文件夹的工作区。", - "dashboard.create_workspace_confirm": "创建工作区", - "dashboard.create_sandbox_confirm": "创建为沙箱", - "dashboard.sandbox_get_ready_title": "沙箱需要Docker", - "dashboard.sandbox_get_ready_action": "准备沙箱环境", - "dashboard.sandbox_get_ready_desc": "在隔离的Docker容器中运行此工作区,更安全、更可复现。", - "dashboard.sandbox_checking_docker": "正在检查Docker...", - "dashboard.create_remote_workspace_title": "添加远程工作区", - "dashboard.create_remote_workspace_subtitle": "保存OpenWork服务器为工作区。", - "dashboard.create_remote_workspace_confirm": "添加工作区", - "dashboard.edit_remote_workspace_title": "编辑远程连接", - "dashboard.edit_remote_workspace_subtitle": "更新此工作区的OpenWork服务器信息。", - "dashboard.edit_remote_workspace_confirm": "保存连接", - "dashboard.remote_workspace_title": "远程工作区", - "dashboard.remote_workspace_hint": "记录OpenWork服务器,随时重新连接。", - "dashboard.remote_base_url_label": "OpenWork服务器地址", - "dashboard.remote_base_url_placeholder": "http://127.0.0.1:", - "dashboard.remote_base_url_required": "请先填写服务器地址。", - "dashboard.openwork_host_label": "OpenWork服务器地址", - "dashboard.openwork_host_placeholder": "https://your-server.openwork.app", - "dashboard.openwork_host_hint": "使用OpenWork服务器提供的地址。", - "dashboard.openwork_host_token_label": "协作者或所有者令牌", - "dashboard.openwork_host_token_placeholder": "粘贴你的令牌", - "dashboard.openwork_host_token_hint": "可选。日常访问可粘贴协作者令牌;如果这个客户端需要处理权限提示,请粘贴所有者令牌。", - "dashboard.remote_mode_openwork_alpha": "OpenWork服务器", - "dashboard.remote_mode_direct": "直连(旧版)", - "dashboard.remote_connection_openwork": "OpenWork", - "dashboard.remote_connection_direct": "直连", - "dashboard.remote_directory_label": "工作区目录(可选)", - "dashboard.remote_directory_placeholder": "/home/team/project", - "dashboard.remote_directory_hint": "留空则使用服务器默认目录。", - "dashboard.remote_display_name_label": "显示名称(可选)", - "dashboard.remote_display_name_placeholder": "设计团队工作区", - "dashboard.select_folder": "选择文件夹", - "dashboard.choose_folder": "选择文件夹", - "dashboard.choose_folder_next": "与你的工作区共享文件。", - "dashboard.change": "更改", - "dashboard.opening": "正在打开...", - "dashboard.choose_preset": "选择预设", - "dashboard.choose_folder_continue": "选择文件夹以继续。", - "dashboard.starter_workspace": "启动工作区", - "dashboard.starter_workspace_desc": "预配置以展示如何使用插件、命令和skills。", - "dashboard.empty_workspace": "空白工作区", - "dashboard.empty_workspace_desc": "从空白文件夹开始,添加你需要的内容。", - "dashboard.blueprints_workspace": "蓝图工作区", - "dashboard.blueprints_workspace_desc": "从适合复用skills、命令和共享流程的自动化工作区开始。", - - // ==================== Workspace ==================== - "workspace.rename_title": "编辑工作区名称", - "workspace.rename_description": "更新侧边栏中显示的名称。", - "workspace.rename_label": "工作区名称", - "workspace.rename_placeholder": "设计团队工作区", - - // ==================== Session ==================== - "session.no_selected": "未选择会话", - "session.back_to_dashboard": "返回主页", - "session.new_task": "新建任务", - "session.recents": "最近", - "session.recents_notice": "这些任务在本地运行,不会跨设备同步。", - "session.ready_to_work_title": "准备就绪", - "session.ready_to_work_description": "描述一个任务。我会显示进度并在需要时请求权限。", - "session.document_label": "文档", - "session.standard_label": "标准", - "session.no_artifacts_fallback": "还没有工件。", - "session.active_plugins_label": "活动插件", - "session.active_plugins_count": "{count}", - "session.no_plugins_loaded": "未加载插件。", - "session.selected_folders_label": "选中的文件夹", - "session.selected_folders_count": "{count}", - "session.working_files_label": "工作文件", - "session.none_yet_label": "还没有。", - "session.permission_required_title": "需要权限", - "session.permission_required_description": "OpenCode正在请求权限以继续。", - "session.permission_label_uppercase": "权限", - "session.scope_label_uppercase": "范围", - "session.details_label": "详情", - "session.steps_notice_text": "步骤将随着任务的展开而显示。", - "session.ready_to_work": "准备就绪", - "session.ready_description": "描述一个任务。我会显示进度并在需要时请求权限。", - "session.hide_steps": "隐藏步骤", - "session.view_steps": "查看步骤", - "session.open": "打开", - "session.reveal": "在文件管理器中显示", - "session.opened_toast": "已在默认应用中打开。", - "session.revealed_toast": "已在文件管理器中显示。", - "session.artifact_path_missing": "工件路径缺失。", - "session.desktop_only": "打开功能仅在桌面应用中可用。", - "session.open_failed": "无法打开工件。", - "session.model": "模型", - "session.ready": "就绪", - "session.connect_provider": "连接提供商以进行自定义。", - "session.running": "运行中", - "session.progress": "进度", - "session.steps_notice": "步骤将随着任务的展开而显示。", - "session.artifacts": "工件", - "session.no_artifacts": "还没有工件。", - "session.context": "上下文", - "session.active_plugins": "活动插件", - "session.no_plugins": "未加载插件。", - "session.selected_folders": "选中的文件夹", - "session.working_files": "工作文件", - "session.none_yet": "还没有。", - "session.document": "文档", - "session.standard": "标准", - "session.try_notion_prompt": "立即尝试:在Notion中设置我的CRM", - "session.insert_prompt": "插入提示", - "session.placeholder": "向OpenWork提问...", - "session.run": "运行", - "session.permission_required": "需要权限", - "session.permission_description": "OpenCode正在请求权限以继续。", - "session.permission_label": "权限", - "session.scope_label": "范围", - "session.details": "详情", - "session.deny": "拒绝", - "session.once": "一次", - "session.allow_for_session": "在会话期间允许", - - "session.tasks_local_hint": "这些任务在本地运行,不会跨设备同步。", - "session.recents_label": "最近", - "session.model_standard": "标准", - "session.run_button_title": "运行", - "session.rename_title": "重命名会话", - "session.rename_description": "更新此会话名称。", - "session.rename_label": "会话名称", - "session.rename_placeholder": "输入新的名称", - - // ==================== Commands ==================== - "commands.new": "新建", - "commands.empty_state": "保存提示词或命令,一键重复运行。", - "commands.workspace": "此工作区", - "commands.global": "所有工作区", - "commands.other": "其他命令", - "commands.run": "运行", - "commands.modal_title": "保存可复用流程", - "commands.modal_description": "保存提示词或命令,便于快速复用。", - "commands.name_label": "命令名称", - "commands.name_placeholder": "例如:daily-standup", - "commands.name_hint": "将在OpenCode中显示为/daily-standup。", - "commands.description_label": "描述(可选)", - "commands.description_placeholder": "这个命令做什么?", - "commands.template_label": "指令", - "commands.template_placeholder": "编写你想复用的指令…", - "commands.template_hint": "使用$ARGUMENTS来接收详情参数。", - "commands.details_required": "详情", - "commands.default_description": "运行保存的命令", - "commands.command_label": "命令", - "commands.details_label": "详情", - "commands.details_placeholder": "添加可选详情", - "commands.details_hint": "这些详情将传给命令。", - "commands.run_modal_title": "运行命令", - "commands.run_modal_description": "运行前可添加详情。", - "commands.run_modal_run": "运行命令", - "commands.name_will_be": "将创建为", - "commands.override_title": "替换现有命令?", - "commands.override_description": "已存在同名命令。", - "commands.override_warning": "这将替换现有的 \"{name}\" 命令。此操作无法撤销。", - "commands.override_confirm": "替换", - "commands.override_cancel": "保留现有", - - // ==================== Skills ==================== - "skills.title": "Skills(技能)", - "skills.subtitle": "管理此工作区的skills。", - "skills.refresh": "刷新", - "skills.add_title": "添加skills", - "skills.add_description": "安装起始命令、导入skill,或打开文件夹。", - "skills.install_from_openpackage": "从OpenPackage安装", - "skills.host_mode_only": "仅本地工作区", - "skills.install": "安装", - "skills.installed_label": "已安装", - "skills.install_hint": "将OpenPackage包安装到当前工作区。Skills应放在`.opencode/skills`中。", - "skills.import_local": "导入本地skill", - "skills.import_local_hint": "将现有skill文件夹复制到此工作区。", - "skills.import": "导入", - "skills.curated_packages": "精选包", - "skills.view": "查看", - "skills.search_placeholder": "搜索包或列表(例如:claude、registry、community)", - "skills.no_matches": "没有匹配的精选包。尝试不同的搜索。", - "skills.install_package": "安装", - "skills.registry_notice": "发布到OpenPackage注册表目前需要身份验证。计划添加注册表搜索和精选列表同步。", - "skills.installed": "已安装的skills", - "skills.no_skills": "在`.opencode/skills`、`.claude/skills`或`~/.agents/skills`中未检测到skills。", - "skills.desktop_required": "Skills管理需要桌面应用。", - "skills.host_only_error": "Skills管理需要本地工作区或已连接的OpenWork服务器。", - "skills.install_skill_creator": "安装skill creator", - "skills.install_skill_creator_hint": "此skill可让你在聊天中创建其他skills。", - "skills.installing_skill_creator": "正在安装skill creator...", - "skills.skill_creator_installed": "Skill creator已安装。", - "skills.skill_creator_already_installed": "Skill creator已经安装过了。", - "skills.install_failed": "Skills安装失败。", - "skills.reveal_folder": "打开skills文件夹", - "skills.reveal_folder_hint": "在Finder中打开skills目录。", - "skills.reveal_button": "在Finder中显示", - "skills.reveal_failed": "打开skills文件夹失败。", - "skills.uninstall": "卸载", - "skills.uninstall_title": "卸载skill?", - "skills.uninstall_warning": "这将永久从工作区删除`{name}` skill。", - "skills.uninstall_failed": "卸载skill失败。", - "skills.uninstalled": "Skill已删除。", - "skills.share_title": "分享skill", - "skills.share_chooser_subtitle": "保存到OpenWork Cloud组织,或发布公开安装链接。", - "skills.share_subtitle_public": "拥有链接的任何人都可以安装此skill。", - "skills.share_subtitle_team": "保存在组织中供队友使用。", - "skills.share_option_team_title": "与团队分享", - "skills.share_option_team_desc": "将此skill添加到当前OpenWork Cloud组织。", - "skills.share_option_public_title": "公开链接", - "skills.share_option_public_desc": "创建任何人都可以使用的安装链接。", - "skills.share_public_intro": "发布公开链接。拥有URL的任何人都可以安装此skill。", - "skills.share_publisher_label": "发布方", - "skills.share_public_create": "创建链接", - "skills.share_public_regenerate": "重新生成链接", - "skills.share_public_creating": "发布中…", - "skills.share_copy_link": "复制", - "skills.share_team_intro": "保存到当前组织,队友可从Cloud安装。", - "skills.share_team_org_fallback": "当前Cloud组织", - "skills.share_team_hub_label": "添加到skill中心(可选)", - "skills.share_team_hub_none": "仅组织 — 不加入中心", - "skills.share_team_hubs_loading": "正在加载中心…", - "skills.share_team_sign_in": "登录后与团队分享", - "skills.share_team_sign_in_hint": "浏览器将打开OpenWork Cloud。登录后返回此处。", - "skills.share_team_save": "保存到团队", - "skills.share_team_saving": "保存中…", - "skills.share_team_success": "已保存到{org}。队友可从组织skill安装。", - "skills.share_team_choose_org": "请先在设置 → Cloud中选择组织。", - "skills.share_back": "返回", - "skills.share_close": "关闭", - "skills.share_done": "完成", - "skills.source_placeholder": "github:anthropics/claude-code", - "skills.notion_crm_title": "Notion CRM增强skills", - "skills.notion_crm_description": "为联系人、管道和跟进添加增强工作流。", - "skills.notion_crm_card_description": "使用现成的skills丰富Notion CRM数据。", - "skills.connect_host_to_load": "连接OpenWork服务器以加载skills。", - "skills.pick_workspace_first": "先选择一个工作区文件夹。", - "skills.no_skills_found": "还没有找到skills。", - "skills.installed_description": "此工作区可用的skills。", - "skills.failed_to_load": "加载skills失败", - "skills.plugin_management_host_only": "插件管理需要桌面应用。", - "skills.plugins_host_only": "插件仅在桌面应用中可用。", - "skills.pick_project_for_plugins": "选择项目文件夹以管理项目插件。", - "skills.pick_project_for_active": "选择项目文件夹以加载活动插件。", - "skills.no_opencode_found": "尚未找到opencode.json。添加插件以创建一个。", - "skills.no_opencode_workspace": "此工作区中还没有opencode.json。", - "skills.failed_parse_opencode": "解析opencode.json失败", - "skills.failed_load_opencode": "加载opencode.json失败", - "skills.failed_load_active": "加载活动插件失败。", - "skills.enter_plugin_name": "输入插件包名称。", - "skills.plugin_already_listed": "插件已在opencode.json中列出。", - "skills.failed_update_opencode": "更新opencode.json失败", - "skills.opackage_install_host_only": "OpenPackage安装需要桌面应用。", - "skills.pick_project_first": "先选择一个项目文件夹。", - "skills.enter_opackage_source": "输入OpenPackage源(例如:github:anthropics/claude-code)。", - "skills.installing_opackage": "正在安装OpenPackage...", - "skills.install_complete": "已安装。", - "skills.curated_list_notice": "这是一个精选列表,还不是OpenPackage。复制链接或关注PRD以了解计划的注册表搜索集成。", - "skills.import_host_only": "Skill导入需要桌面应用。", - "skills.select_skill_folder": "选择skill文件夹", - "skills.import_failed": "导入失败({status})", - "skills.imported": "已导入。", - "skills.unknown_error": "未知错误", - - // ==================== Plugins ==================== - "plugins.title": "OpenCode插件", - "plugins.description": "为你的项目或全局OpenCode插件管理`opencode.json`。", - "plugins.config_label": "配置", - "plugins.config_not_loaded": "尚未加载", - "plugins.suggested_label": "建议的插件", - "plugins.no_plugins_yet": "尚未配置插件。", - "plugins.enabled_label": "已启用", - "plugins.open_label": "打开", - "plugins.path_label": "路径", - "plugins.scope_project": "项目", - "plugins.scope_global": "全局", - "plugins.refresh": "刷新", - "plugins.config": "配置", - "plugins.not_loaded": "尚未加载", - "plugins.suggested": "建议的插件", - "plugins.hide_setup": "隐藏设置", - "plugins.setup": "设置", - "plugins.added": "已添加", - "plugins.add": "添加", - "plugins.enabled": "已启用", - "plugins.no_plugins": "尚未配置插件。", - "plugins.add_label": "添加插件", - "plugins.placeholder": "opencode-wakatime", - "plugins.add_hint": "添加npm包名称,例如opencode-wakatime", - - // ==================== MCP (Model Context Protocol) ==================== - "mcp.title": "应用", - "mcp.description": "一键连接你的工具。", - "mcp.alpha_banner_title": "应用功能处于抢先体验阶段,我们正在优化体验。", - "mcp.alpha_banner_help": "如果你想帮忙,请提交PR并附上一个短视频,展示登录流程从端到端的工作。", - "mcp.mcps_title": "应用", - "mcp.connect_mcp_hint": "连接应用以扩展OpenWork的功能。", - "mcp.reload_banner_title": "即将完成", - "mcp.reload_banner_description": "点击激活以完成应用连接。", - "mcp.quick_connect_title": "可用应用", - "mcp.oauth_only_label": "一键连接", - "mcp.connected_status": "已连接", - "mcp.no_env_vars": "无需额外设置。", - "mcp.connected_title": "你的应用", - "mcp.from_opencode_json": "来自配置", - "mcp.no_servers_yet": "暂无已连接的应用。", - "mcp.edit_config_title": "编辑配置文件", - "mcp.edit_config_description": "应用存储在工作区配置文件中。", - "mcp.docs_link": "了解更多", - "mcp.scope_project": "此工作区", - "mcp.scope_global": "所有工作区", - "mcp.config_label": "配置", - "mcp.config_not_loaded": "尚未加载", - "mcp.open_file_label": "打开文件", - "mcp.reveal_in_finder": "在Finder中显示", - "mcp.opening_label": "正在打开", - "mcp.file_not_found": "配置文件尚未创建", - "mcp.config_load_failed": "无法加载配置文件", - "mcp.open_file": "打开文件", - "mcp.pick_workspace_error": "请先选择工作区文件夹。", - "mcp.reveal_config_failed": "无法打开配置文件", - "mcp.alpha_warning": "应用功能处于抢先体验阶段,我们正在优化体验。", - "mcp.github_issue": "在GitHub上查看issue #9510", - "mcp.contribution_guide": "如果你想帮忙,请提交PR并附上一个短视频,展示登录流程从端到端的工作。", - "mcp.hide_advanced": "隐藏高级设置", - "mcp.show_advanced": "显示高级设置", - "mcp.mcps_label": "应用", - "mcp.mcps_description": "连接应用以扩展OpenWork的功能。", - "mcp.configured": "已配置", - "mcp.updated": "已同步", - "mcp.reload_required": "需要激活", - "mcp.reload_description": "激活以开始使用新连接。", - "mcp.reload_engine": "激活", - "mcp.quick_connect": "可用应用", - "mcp.oauth_only": "一键连接", - "mcp.connecting": "连接中", - "mcp.connect": "连接", - "mcp.connected": "已连接", - "mcp.connected_label": "已连接", - "mcp.no_env_required": "无需额外设置。", - "mcp.config_source": "来自配置", - "mcp.no_servers": "暂无已连接的应用。", - "mcp.advanced": "高级", - "mcp.advanced_description": "自定义连接。", - "mcp.hide": "隐藏", - "mcp.show": "显示", - "mcp.server_name": "应用名称", - "mcp.server_name_placeholder": "github-copilot", - "mcp.server_url": "服务器URL", - "mcp.server_url_placeholder": "https://api.githubcopilot.com/mcp/", - "mcp.oauth": "登录", - "mcp.api_key": "API密钥", - "mcp.enabled": "已启用", - "mcp.disabled": "已禁用", - "mcp.add_mcp": "添加应用", - "mcp.remove_app": "移除", - "mcp.remove_failed": "无法移除应用。", - "mcp.remove_modal_title": "移除应用", - "mcp.remove_modal_message": "确定要移除{server}吗?你可以随时重新添加。", - "mcp.add_modal_title": "添加自定义应用", - "mcp.add_modal_subtitle": "通过URL或本地命令连接自定义MCP服务器。", - "mcp.custom_app_cta_hint": "连接你的MCP服务器、内部工具或托管应用。", - "mcp.server_type": "类型", - "mcp.type_remote": "远程 (URL)", - "mcp.type_local_cmd": "本地 (命令)", - "mcp.server_command": "命令", - "mcp.server_command_placeholder": "npx -y @modelcontextprotocol/server-sequential-thinking", - "mcp.server_command_hint": "启动服务器的shell命令。", - "mcp.sign_in_section_label": "登录", - "mcp.oauth_optional_label": "此应用需要登录", - "mcp.oauth_optional_hint": "在浏览器中通过OAuth连接你的账户。", - "mcp.remote_workspace_url_hint": "远程工作区建议优先使用URL类型的MCP服务器。", - "mcp.add_server_button": "添加应用", - "mcp.name_required": "请输入服务器名称。", - "mcp.url_or_command_required": "远程服务器需要URL,本地服务器需要命令。", - "mcp.verify_connection": "测试连接", - "mcp.cli_guidance": "终端命令(高级)", - "mcp.config_locations": "配置可以位于opencode.json、opencode.jsonc或.opencode/opencode.json。", - "mcp.details_title": "应用详情", - "mcp.select_server_hint": "选择一个应用以查看详情。", - "mcp.capabilities_label": "功能", - "mcp.tools_enabled_label": "AI工具", - "mcp.oauth_ready_label": "账户登录", - "mcp.usage_hint_text": "在提示中提及应用名称即可使用其工具。", - "mcp.next_steps_label": "后续步骤", - "mcp.reload_step": "连接新应用后激活。", - "mcp.auth_step": "在提示时登录。", - "mcp.connection_failed": "连接异常 — 请重试", - "mcp.needs_auth": "需要登录", - "mcp.register_client": "需要设置", - "mcp.status_disabled": "已暂停", - "mcp.disconnected": "离线", - "mcp.failed": "异常", - "mcp.host_mode_only": "应用需要桌面应用。", - "mcp.pick_workspace_first": "请先选择工作区文件夹。", - "mcp.desktop_required": "应用需要桌面应用。", - "mcp.connect_server_first": "请先连接服务器。", - "mcp.reload_required_after_add": "激活以开始使用新应用。", - "mcp.connect_failed": "连接失败,请重试。", - "mcp.enter_name_and_url": "输入应用名称和URL。", - "mcp.enter_url_first": "先输入服务器URL。", - "mcp.use_debug_command": "运行opencode mcp debug 排查问题。", - "mcp.add_failed": "添加应用失败。", - - "mcp.logout_label": "OAuth", - "mcp.logout_action": "退出登录", - "mcp.logout_working": "正在退出...", - "mcp.logout_hint": "将删除已保存的OAuth凭据。之后需要重新登录。", - "mcp.login_action": "登录", - "mcp.login_hint": "连接你的账户以完成此应用的设置。", - "mcp.login_unavailable": "此应用不支持从OpenWork发起登录。", - "mcp.logout_modal_title": "退出登录?", - "mcp.logout_modal_message": "这将删除{server}的OAuth凭据。之后需要重新登录才能使用该应用。", - "mcp.logout_success": "{server}已退出登录。", - "mcp.logout_failed": "退出登录失败。", - - // MCP Auth Modal - "mcp.auth.open_browser_signin": "我们将打开你的浏览器完成登录。", - "mcp.auth.connect_server": "连接{server}", - "mcp.auth.already_connected": "已连接", - "mcp.auth.already_connected_description": "{server}已通过身份验证,可以正常使用。", - "mcp.auth.configured_previously": "该MCP可能在全局或之前的会话中已配置。你可以关闭此弹窗,立即开始使用MCP工具。", - "mcp.auth.reload_engine_retry": "应用更改并重试", - "mcp.auth.reload_notice": "要使更改生效,OpenWork需要刷新worker服务。这可能会中断正在运行的会话。", - "mcp.auth.reload_blocked": "会话运行中,暂时无法刷新。请先停止运行后再完成设置。", - "mcp.auth.reload_remote_confirm": "要使更改生效,OpenWork需要刷新worker服务。这可能会停止你正在运行的会话。是否继续?", - "mcp.auth.retry_now": "立即重试", - "mcp.auth.retry": "重试", - "mcp.auth.reload_failed": "登录前重启worker失败。", - "mcp.auth.applying_changes_title": "正在登录前应用更改", - "mcp.auth.applying_changes_body": "我们正在重启worker,以便新MCP可以开始认证。", - "mcp.auth.waiting_for_conversation_title": "正在等待对话完成", - "mcp.auth.waiting_for_conversation_body": "一旦可以开始认证,我们会立即为你跳转。", - "mcp.auth.waiting_for_session": "正在等待{session}完成工作", - "mcp.auth.force_stop": "强制停止", - "mcp.auth.force_stopping": "正在停止...", - "mcp.auth.step1_title": "正在打开你的浏览器", - "mcp.auth.step1_description": "我们将自动启动{server}的登录流程。", - "mcp.auth.step2_title": "授权OpenWork", - "mcp.auth.step2_description": "登录并在提示时批准访问权限。", - "mcp.auth.step3_title": "完成后返回此处", - "mcp.auth.step3_description": "授权完成后我们将立即完成连接。", - "mcp.auth.waiting_authorization": "正在等待你在浏览器中完成授权...", - "mcp.auth.follow_browser_steps": "请在浏览器中完成授权步骤。", - "mcp.auth.reopen_browser_link": "点击这里重新打开浏览器", - "mcp.auth.done": "完成", - "mcp.auth.cancel": "取消", - "mcp.auth.im_done": "我已完成", - "mcp.auth.client_registration_required": "在继续OAuth之前需要先注册客户端。", - "mcp.auth.server_disabled": "此MCP服务器已禁用。请启用它后重试。", - "mcp.auth.oauth_failed": "OAuth身份验证失败。", - "mcp.auth.invalid_refresh_token": "OAuth刷新令牌无效或已过期。请重新授权。", - "mcp.auth.reauth_action": "重新授权OAuth", - "mcp.auth.reauth_running": "正在重新授权...", - "mcp.auth.reauth_failed": "重新授权失败。", - "mcp.auth.reauth_cli_hint": "运行:opencode mcp auth {server}", - "mcp.auth.reauth_remote_hint": "请在运行该工作区的设备上重新授权。", - "mcp.auth.authorization_still_required": "仍需要授权。请重试以重新启动流程。", - "mcp.auth.oauth_not_supported_hint": "这可能意味着:\n• MCP服务器未声明OAuth功能\n• 引擎需要重新加载以发现服务器功能\n• 尝试:从CLI运行opencode mcp auth {server}", - "mcp.auth.try_reload_engine": "{message}。请尝试先重新加载引擎。", - "mcp.auth.failed_to_start_oauth": "启动OAuth流程失败", - "mcp.auth.oauth_completed_reload": "OAuth已完成。重新加载引擎以激活MCP。", - - // ==================== Settings ==================== - "settings.title": "设置", - "settings.connection": "连接", - "settings.engine_source": "引擎来源", - "settings.from_path": "从PATH", - "settings.from_sidecar": "内置sidecar", - "settings.engine_source_description": "PATH使用你安装的OpenCode(默认)。Sidecar将在可用时使用内置的二进制文件。", - "settings.sidecar_unsupported": "Sidecar已支持Windows", - "settings.sidecar_unavailable_detail": "Sidecar可用时会随应用内置。", - "settings.model": "模型", - "settings.model_description": "默认值 + 运行的思考控制。", - "settings.change": "更改", - "settings.engine_path": "PATH", - "settings.engine_sidecar": "Sidecar", - "settings.thinking": "思考", - "settings.thinking_description": "显示思考部分(仅开发者模式)。", - "settings.on": "开启", - "settings.off": "关闭", - "settings.model_variant": "模型变体", - "settings.edit": "编辑", - "settings.default_model": "默认模型", - "settings.session_model": "模型", - "settings.model_description_default": "从你配置的提供商中选择。此选择将用于新会话。", - "settings.model_description_session": "从你配置的提供商中选择。此选择适用于你的下一条消息。", - "settings.search_models": "搜索模型…", - "settings.showing_models": "显示{count} / {total}", - "settings.model_variant_prompt": "模型变体(提供商特定,例如high/max/minimal)。留空则清除。", - "settings.model_fallback": "备用", - "settings.model_default": "默认", - "settings.model_free": "免费", - "settings.model_reasoning": "推理", - "settings.done": "完成", - "settings.updates": "更新", - "settings.updates_description": "保持OpenWork为最新版本。", - "settings.automatic_checks": "自动检查", - "settings.automatic_checks_description": "每天一次(安静)", - "settings.update_checking": "检查中...", - "settings.update_available": "可用更新:v", - "settings.update_downloading": "下载中...", - "settings.update_ready": "准备安装:v", - "settings.update_error": "更新检查失败", - "settings.update_uptodate": "已是最新", - "settings.last_checked": "上次检查", - "settings.published": "发布时间", - "settings.check_update": "检查", - "settings.install_restart": "安装并重启", - "settings.update_not_supported": "此环境不支持更新。", - "settings.update_desktop_only": "更新仅在桌面应用中可用。", - "settings.startup": "启动", - "settings.mode_label": "模式", - "settings.switch_mode": "切换", - "settings.reset_startup": "重置默认启动模式", - "settings.reset_startup_description": "这将清除你保存的偏好设置,并在下次启动时显示模式选择。", - "settings.advanced": "高级", - "settings.advanced_description": "重置OpenWork本地状态以重新测试入门流程。", - "settings.reset_onboarding": "重置入门", - "settings.reset_onboarding_description": "清除OpenCode偏好设置并重启应用。", - "settings.reset_app_data": "重置应用数据", - "settings.reset_app_data_description": "更激进的方式。清除OpenCode缓存 + 应用数据。", - "settings.reset": "重置", - "settings.requires_typing": "需要输入", - "settings.will_restart": "并将重启应用。", - "settings.reset_onboarding_title": "重置入门", - "settings.reset_app_data_title": "重置应用数据", - "settings.reset_confirmation_hint": "输入 RESET 以确认。OpenWork将重启。", - "settings.reset_onboarding_warning": "清除OpenWork本地偏好设置和工作区入门标记。", - "settings.reset_app_data_warning": "清除此设备上的OpenWork缓存和应用数据。", - "settings.reset_stop_active_runs": "重置前停止活动运行。", - "settings.reset_confirmation_label": "确认", - "settings.reset_confirmation_placeholder": "输入RESET", - "settings.reset_cancel": "取消", - "settings.reset_confirm_button": "重置并重启", - "settings.developer": "开发者", - "settings.opencode_cache": "OpenCode缓存", - "settings.opencode_cache_description": "修复用于启动引擎的缓存数据。安全运行。", - "settings.repair_cache": "修复缓存", - "settings.repairing_cache": "正在修复缓存", - "settings.cache_repair_requires_desktop": "缓存修复需要桌面应用", - "settings.pending_permissions": "待处理的权限", - "settings.recent_events": "最近的事件", - "settings.notion_connected": "已连接", - "settings.reload_required": "需要重新加载", - "settings.connection_failed": "连接失败", - "settings.notion_not_connected": "未连接", - "settings.show_thinking": "显示思考过程", - "settings.update": "更新", - "settings.about": "关于", - "settings.version": "版本", - "settings.check_for_updates": "检查更新", - "settings.download_update": "下载更新", - "settings.install_update": "安装更新并重启", - "settings.enable_developer_mode": "启用开发者模式", - "settings.disable_developer_mode": "禁用开发者模式", - "settings.stop_engine": "停止引擎", - "settings.disconnect": "断开连接", - "settings.language": "语言", - "settings.language.description": "选择你的首选语言", - "settings.connection_title": "连接", - "settings.engine_source_label": "引擎来源", - "settings.engine_source_hint": "PATH使用你安装的OpenCode(默认)。Sidecar将在可用时使用内置的二进制文件。", - "settings.sidecar_unavailable": "Sidecar可用时会随应用内置。", - "settings.model_title": "模型", - "settings.model_hint": "默认值 + 运行的思考控制。", - "settings.thinking_label": "思考", - "settings.thinking_hint": "显示思考部分(仅开发者模式)。", - "settings.model_variant_label": "模型变体", - "settings.appearance_title": "外观", - "settings.appearance_hint": "匹配系统或强制浅色/深色模式。", - "settings.theme_system": "系统", - "settings.theme_light": "浅色", - "settings.theme_dark": "深色", - "settings.theme_system_hint": "系统模式自动跟随你的操作系统偏好。", - "settings.updates_title": "更新", - "settings.updates_hint": "保持OpenWork为最新版本。", - "settings.automatic_checks_label": "自动检查", - "settings.automatic_checks_hint": "每天一次(安静)", - "settings.last_checked_time": "上次检查{time}", - "settings.published_date": "发布时间{date}", - "settings.update_not_supported_hint": "此环境不支持更新。", - "settings.update_desktop_only_hint": "更新仅在桌面应用中可用。", - "settings.startup_title": "启动", - "settings.mode_suffix": "模式", - "settings.reset_startup_label": "重置默认启动模式", - "settings.reset_startup_hint": "这将清除你保存的偏好设置,并在下次启动时显示模式选择。", - "settings.advanced_title": "高级", - "settings.advanced_hint": "重置OpenWork本地状态以重新测试入门流程。", - "settings.reset_onboarding_label": "重置入门", - "settings.reset_onboarding_hint": "清除OpenCode偏好设置并重启应用。", - "settings.reset_app_data_label": "重置应用数据", - "settings.reset_app_data_hint": "更激进的方式。清除OpenCode缓存 + 应用数据。", - "settings.reset_requires_hint": "需要输入RESET并将重启应用。", - "settings.developer_title": "开发者", - "settings.opencode_cache_label": "OpenCode缓存", - "settings.opencode_cache_hint": "修复用于启动引擎的缓存数据。安全运行。", - "settings.pending_permissions_label": "待处理的权限", - "settings.recent_events_label": "最近的事件", - "settings.stop_active_runs_hint": "停止活动运行以更新", - "settings.stop_active_runs_reset_hint": "停止活动运行以重置", - "settings.stop_runs_to_update": "停止活动运行以更新", - "settings.stop_runs_to_reset": "停止活动运行以重置", - "settings.updates_not_supported": "此环境不支持更新。", - "settings.updates_desktop_only": "更新仅在桌面应用中可用。", - - // ==================== Reload ==================== - "reload.toast_title": "有可用更新", - "reload.toast_description": "重新加载工作区以应用配置更改。", - "reload.toast_warning": "将停止所有活动任务。", - "reload.toast_warning_active": "重新加载将停止{count}个活动任务。", - "reload.toast_reload": "重新加载", - "reload.toast_reloading": "正在重新加载...", - "reload.toast_dismiss": "稍后", - "reload.toast_blocked_host": "仅本地工作区可重新加载。", - "reload.toast_blocked_connect": "连接到此工作区后才能重新加载。", - "reload.toast_blocked_runs": "等待活动任务完成后再重新加载。", - - // ==================== Onboarding ==================== - "onboarding.starting_host": "正在启动OpenWork服务器...", - "onboarding.searching_host": "正在连接OpenWork服务器...", - "onboarding.getting_ready": "准备就绪", - "onboarding.verifying": "验证安全握手", - "onboarding.create_first_workspace": "创建你的第一个工作区", - "onboarding.create_workspace": "创建工作区", - "onboarding.workspace_description": "选择文件夹和预设以设置你的工作区。", - "onboarding.start": "启动OpenWork", - "onboarding.back": "返回", - "onboarding.advanced_settings": "高级设置", - "onboarding.opencode_engine": "OpenCode引擎", - "onboarding.refresh": "刷新", - "onboarding.checking_cli": "正在检查OpenCode CLI...", - "onboarding.cli_not_found": "未找到OpenCode CLI。", - "onboarding.cli_needs_update": "OpenCode CLI需要更新以支持serve。", - "onboarding.opencode": "OpenCode", - "onboarding.cli_ready": "OpenCode CLI就绪。", - "onboarding.cli_version": "OpenCode {version}", - "onboarding.windows_install_instruction": "安装Windows版OpenCode,然后重启OpenWork。确保opencode.exe在PATH中。", - "onboarding.install_instruction": "安装OpenCode以启用本地服务器(无需终端)。", - "onboarding.install": "安装OpenCode", - "onboarding.recheck": "重新检查", - "onboarding.ready_message": "OpenCode已准备好启动本地服务器。", - "onboarding.resolved_path": "解析路径", - "onboarding.version": "版本", - "onboarding.search_notes": "搜索说明", - "onboarding.serve_help": "serve --help输出", - "onboarding.workspace_folder_label": "工作区是一个包含自己的skills、插件和命令的文件夹。", - "onboarding.theme_label": "主题", - "onboarding.theme_current": "当前:{mode}", - "onboarding.theme_system": "系统", - "onboarding.theme_light": "浅色", - "onboarding.theme_dark": "深色", - "onboarding.access_label": "访问权限", - "onboarding.folders_allowed": "{count}个文件夹{plural}已授权", - "onboarding.manage_access_hint": "你可以在高级设置中管理访问权限。", - "onboarding.open_settings_hint": "需要引擎或访问选项?打开设置。", - "onboarding.open_settings": "打开设置", - "onboarding.add_folder_path": "添加文件夹路径", - "onboarding.pick": "选择", - "onboarding.add": "添加", - "onboarding.remove": "移除", - "onboarding.cli_label": "OpenCode CLI", - "onboarding.cli_checking": "正在检查安装...", - "onboarding.cli_not_found_hint": "未找到。请安装以运行本地服务器。", - "onboarding.cli_version_installed": "已安装", - "onboarding.cli_recheck": "重新检查", - "onboarding.cli_install_commands": "使用以下命令之一安装OpenCode,然后重启OpenWork。", - "onboarding.show_search_notes": "显示搜索说明", - "onboarding.last_checked": "上次检查时间{time}", - "onboarding.server_url_placeholder": "http://localhost:8088", - "onboarding.directory_placeholder": "my-project", - "onboarding.connect_host": "连接服务器", - "onboarding.connect_description": "与现有的OpenCode服务器配对(局域网或隧道)。", - "onboarding.server_url": "服务器URL", - "onboarding.directory": "目录(可选)", - "onboarding.directory_hint": "服务器运行多个工作区时可指定。", - "onboarding.connect": "连接", - "onboarding.remote_workspace_title": "连接OpenWork服务器", - "onboarding.remote_workspace_description": "连接OpenWork服务器以随时访问工作区。", - "onboarding.remote_workspace_action": "连接", - "onboarding.remote_workspace_card_title": "连接远程工作区", - "onboarding.remote_workspace_card_description": "连接OpenWork服务器以访问共享工作区。", - "onboarding.advanced_openwork_host": "OpenWork服务器", - "onboarding.advanced_openwork_hint": "使用服务器地址和访问令牌进行共享访问。", - "onboarding.advanced_opencode_direct": "高级:OpenCode直连", - "onboarding.advanced_opencode_hint": "当没有服务器时,直接连接OpenCode引擎。", - "onboarding.welcome_title": "今天想如何运行OpenWork?", - "onboarding.run_local": "本地运行", - "onboarding.run_local_description": "OpenWork在本地运行OpenCode并保持你的工作私密。", - "onboarding.engine_running": "引擎已在运行", - "onboarding.attach_description": "附加到此设备上的现有会话。", - "onboarding.attach": "附加", - "onboarding.remember_choice": "记住我的选择", - "onboarding.client_mode": "作为客户端连接(远程配对)", - "onboarding.default_workspace_path": "~/OpenWork/Workspace", - "onboarding.authorize_folder": "授权文件夹", - "onboarding.choose_workspace_folder": "选择工作区文件夹", - - // ==================== Common ==================== - "common.alpha": "测试版", - "common.change": "更改", - "common.refresh": "刷新", - "common.new": "新建", - "common.install": "安装", - "common.delete": "删除", - "common.edit": "编辑", - "common.save": "保存", - "common.cancel": "取消", - "common.close": "关闭", - "common.open": "打开", - "common.show": "显示", - "common.hide": "隐藏", - "common.path": "路径", - "common.choose": "选择", - "common.retry": "重试", - "common.untitled": "未命名", - "common.default_parens": "(默认)", - "common.on": "开启", - "common.off": "关闭", - - // ==================== Status ==================== - "status.connected": "已连接", - "status.disconnected": "已断开", - "status.idle": "空闲", - "status.busy": "忙碌", - "status.running": "运行中", - "status.live": "实时", - "status.connecting": "正在连接", - "status.creating_workspace": "正在创建工作区", - "status.deleting_command": "正在删除命令", - "status.saving_workspace_command": "正在保存工作区命令", - "status.saving_command": "正在保存命令", - "status.loading_session": "正在加载会话", - "status.creating_task": "正在创建新任务", - "status.starting_engine": "正在启动引擎", - "status.reloading_engine": "正在重新加载引擎", - "status.restarting_engine": "正在重启引擎", - "status.installing_opencode": "正在安装OpenCode", - "status.disconnecting": "正在断开连接", - - // ==================== Workspace Switching ==================== - "workspace.switching_title": "正在打开{name}", - "workspace.switching_title_unknown": "正在打开工作区", - "workspace.switching_subtitle": "马上带你回到最近的工作。", - "workspace.switching_status_preparing": "正在准备", - "workspace.switching_status_connecting": "正在检查连接", - "workspace.switching_status_loading": "正在加载最近任务", - "workspace.switching_status_almost": "快好了", - + "app.compact_command_desc": "压缩此会话以减少上下文大小。", "app.connection_lost": "服务器连接已断开。请重新加载。", - "app.unknown_error": "未知错误", - "app.error.tauri_required": "此操作需要Tauri应用运行时。", + "app.deep_link_auth_queued": "已排队处理Cloud认证深层链接。", + "app.deep_link_remote_queued": "已排队处理远程工作区链接。OpenWork将进入连接流程。", "app.error.choose_folder": "选择一个文件夹以继续。", - "app.error.pick_workspace_folder": "请先选择一个工作区文件夹。", - "app.error.remote_base_url_required": "请先填写服务器地址。", "app.error.host_requires_local": "请先选择本地工作区以启动引擎。", - "app.error.sidecar_unsupported_windows": "Windows上的Sidecar OpenCode可用时会内置。将回退到PATH。", "app.error.install_failed": "OpenCode安装失败。请查看上方日志。", - "app.error.command_name_template_required": "命令名称和指令为必填项。", - "app.error.workspace_commands_desktop": "命令需要桌面应用。", - "app.error.command_scope_unknown": "此命令无法在当前模式下管理。", - - // ==================== App top-level ==================== - "app.compact_command_desc": "压缩此会话以减少上下文大小。", - "app.deep_link_auth_queued": "已排队处理Cloud认证深层链接。", - "app.deep_link_remote_queued": "已排队处理远程工作区链接。OpenWork将进入连接流程。", + "app.error.pick_workspace_folder": "请先选择一个工作区文件夹。", + "app.error.remote_base_url_required": "请先填写服务器地址。", + "app.error.tauri_required": "此操作需要Tauri应用运行时。", "app.error_audit_load": "加载审计日志失败。", "app.error_auth_failed": "认证失败", "app.error_auto_compact_scope": "自动上下文压缩仅适用于本地工作区或可写的OpenWork服务器工作区。", @@ -855,21 +59,74 @@ export default { "app.skills_hint_disconnected": "OpenWork服务器不可用。请在高级设置中添加服务器URL/令牌以管理skills。", "app.skills_hint_limited": "OpenWork服务器需要主机令牌才能安装/更新skills。请在高级设置中添加并重新连接。", "app.skills_hint_readonly": "OpenWork服务器对skills为只读模式。请在高级设置中添加主机令牌以启用安装。", + "app.unknown_error": "未知错误", "app.worker_fallback": "工作区", - - // ==================== Common extras ==================== + "automations.desktop_required": "定时任务需要桌面应用。", + "automations.failed_to_load": "加载定时任务失败。", + "automations.prompt_empty": "自动化提示词为空。", + "automations.prompt_required": "提示词为必填项。", + "automations.schedule_required": "计划为必填项。", + "automations.server_needs_token": "OpenWork服务器需要令牌才能加载定时任务。", + "automations.server_not_ready": "OpenWork服务器尚未就绪。", + "automations.server_unavailable": "OpenWork服务器不可用。请连接以同步定时任务。", + "blueprint.automation_body": "从可复用的工作流开始,或在下方输入你的任务。", + "blueprint.automation_title": "你想自动化什么?", + "blueprint.csv_session_assistant": "我可以帮你生成、清洗、合并和汇总CSV文件。你想自动化哪种CSV工作?", + "blueprint.csv_session_title": "CSV工作流创意", + "blueprint.csv_session_user": "我想把多个工具的导出合并成一个整洁的CSV。", + "blueprint.empty_body": "选择一个起点,或直接在下方输入。", + "blueprint.empty_title": "你想做什么?", + "blueprint.minimal_body": "询问关于此工作区的问题,或使用启动提示词。", + "blueprint.minimal_title": "从一个任务开始", + "blueprint.starter_blueprint_desc": "设计一个包含skills、命令和交接步骤的可复用工作流。", + "blueprint.starter_blueprint_prompt": "帮我为此工作区设计一个可复用的自动化蓝图。先问我想标准化什么,然后提出工作流方案。", + "blueprint.starter_blueprint_title": "规划自动化蓝图", + "blueprint.starter_chrome_desc": "立即开始浏览器自动化对话。", + "blueprint.starter_chrome_prompt": "帮我连接Chrome并自动化一个重复性任务。", + "blueprint.starter_chrome_title": "Chrome自动化", + "blueprint.starter_command_desc": "将重复的工作流转化为此工作区的斜杠命令。", + "blueprint.starter_command_prompt": "帮我为此工作区创建一个可复用的/command。先问我想自动化什么工作流,然后起草命令。", + "blueprint.starter_command_title": "创建可复用命令", + "blueprint.starter_connect_openai_desc": "添加OpenAI提供商,让ChatGPT模型在新会话中即可使用。", + "blueprint.starter_connect_openai_title": "连接ChatGPT", + "blueprint.starter_csv_desc": "清洗或生成电子表格数据。", + "blueprint.starter_csv_prompt": "帮我在这台电脑上创建或编辑CSV文件。", + "blueprint.starter_csv_title": "处理CSV", + "blueprint.starter_explore_desc": "汇总文件并建议最适合先处理的任务。", + "blueprint.starter_explore_prompt": "汇总此工作区,指出最重要的文件,并建议最适合先处理的任务。", + "blueprint.starter_explore_title": "探索此工作区", + "blueprint.welcome_message": "你好,欢迎使用OpenWork!\n\n大家用OpenWork在电脑上编写CSV文件、连接Chrome自动化重复任务,以及将联系人同步到Notion。\n\n但唯一的限制是你的想象力。\n\n你想做什么?", + "blueprint.welcome_title": "欢迎使用OpenWork", "common.add": "添加", - "common.copied": "已复制", - "common.copy": "复制", + "common.cancel": "取消", + "common.choose": "选择", + "common.close": "关闭", + "common.default_parens": "(默认)", "common.done": "完成", + "common.edit": "编辑", + "common.hide": "隐藏", + "common.install": "安装", + "common.navigate": "导航", + "common.next": "下一步", + "common.off": "关闭", + "common.on": "开启", + "common.path": "路径", + "common.question": "问题", + "common.refresh": "刷新", + "common.remove": "移除", "common.reset": "重置", + "common.retry": "重试", + "common.save": "保存", + "common.select": "选择", + "common.show": "显示", + "common.something_went_wrong": "出了点问题", + "common.submit": "提交", "common.unknown": "未知", - - // ==================== Composer ==================== "composer.agent_label": "智能体", "composer.attach_files": "附加文件", "composer.attachments_unavailable": "附件功能不可用。", "composer.behavior_label": "行为", + "composer.configure": "配置", "composer.default_agent": "默认智能体", "composer.expand_pasted": "点击展开粘贴的文本", "composer.failed_read_attachment": "读取附件失败", @@ -880,25 +137,100 @@ export default { "composer.inserted_links_unsupported": "已为不支持的文件插入链接。", "composer.loading_agents": "正在加载智能体…", "composer.loading_commands": "正在加载命令…", - "composer.no_commands": "未找到命令。", - "composer.configure": "配置", - "composer.tools_label": "命令、技能和 MCP", "composer.mcps_label": "MCP", + "composer.no_commands": "未找到命令。", "composer.no_matches": "未找到匹配项。", "composer.placeholder": "描述你的任务…", "composer.remote_worker_paste_warning": "这是远程工作区。沙箱也是远程的。要共享文件,请上传到侧边栏的共享文件夹。", "composer.run_task": "运行任务", "composer.skill_source": "Skill", "composer.stop": "停止", + "composer.tools_label": "命令、技能和MCP", "composer.unsupported_attachment_type": "不支持的附件类型。", "composer.upload_failed_local_links": "无法上传到共享文件夹。已插入本地链接。", "composer.upload_to_shared_folder": "上传到共享文件夹", "composer.uploaded_multiple_files": "已上传{count}个文件到共享文件夹并插入链接。", "composer.uploaded_single_file": "已上传{name}到共享文件夹并插入链接。", - - // ==================== Context Panel ==================== + "config.auto_reload_desc": "智能体/skills/命令/配置变更后自动重新加载(仅在空闲时)。", + "config.auto_reload_title": "自动重新加载(本地)", + "config.auto_reload_unavailable": "仅在桌面应用的本地工作区中可用。", + "config.collaborator_token_disabled_hint": "已预存用于远程共享,但远程访问当前已禁用。", + "config.collaborator_token_label": "协作者令牌", + "config.collaborator_token_remote_hint": "手机或笔记本连接此服务器时的日常远程访问。", + "config.connection_failed": "连接失败。", + "config.connection_failed_check": "连接失败。请检查主机URL和令牌。", + "config.connection_status_updated": "连接状态已更新。", + "config.connection_successful": "连接成功。", + "config.copied": "已复制", + "config.copy": "复制", + "config.desktop_only_hint": "部分配置功能(本地服务器共享 + 消息桥接)需要桌面应用。", + "config.diagnostics_desc": "复制脱敏的运行时状态用于调试。", + "config.diagnostics_title": "诊断包", + "config.enable_auto_reload_first": "请先启用自动重新加载", + "config.engine_reload_desc": "重启此工作区的OpenCode服务器。", + "config.engine_reload_title": "引擎重新加载", + "config.host_admin_token_hint": "仅限主机内部使用的令牌,用于审批CLI和管理API。请勿在远程应用连接流程中使用。", + "config.host_admin_token_label": "主机管理员令牌", + "config.host_local_only": "仅限本地", + "config.host_offline": "离线", + "config.host_remote_enabled": "已启用远程", + "config.local_ip_hint": "在同一Wi-Fi下使用本地IP可获得最快连接。", + "config.mdns_hint": ".local名称更易记忆,但可能无法在所有网络上解析。", + "config.messaging_identities_desc": "在身份标签页中管理Telegram/Slack身份和路由。", + "config.messaging_identities_title": "消息身份", + "config.not_set": "未设置", + "config.owner_token_disabled_hint": "仅在启用此工作区的远程访问后才有效。", + "config.owner_token_label": "所有者令牌", + "config.owner_token_remote_hint": "远程客户端需要回答权限提示或执行所有者操作时使用。", + "config.reload_active_tasks_warning": "重新加载将停止活动任务。", + "config.reload_availability_hint": "仅本地工作区或已连接的OpenWork服务器支持重新加载。", + "config.reload_connect_hint": "连接此工作区后才能重新加载。", + "config.reload_engine": "重新加载引擎", + "config.reload_now_desc": "应用配置更新并重新连接会话。", + "config.reload_now_title": "立即重新加载", + "config.reloading": "正在重新加载…", + "config.remote_access_off_hint": "远程访问已关闭。请先通过分享工作区启用远程访问,然后再从其他设备连接。", + "config.resolved_worker_url": "解析后的工作区URL:", + "config.resume_sessions_desc": "如果在任务运行期间排队了重新加载,则在之后发送恢复消息。", + "config.resume_sessions_title": "自动重新加载后恢复会话", + "config.server_needed_hint": "需要连接OpenWork服务器以同步skills、插件和命令。", + "config.server_section_desc": "连接OpenWork服务器。使用URL加服务器管理员提供的协作者或所有者令牌。", + "config.server_section_title": "OpenWork服务器", + "config.server_sharing_desc": "将这些详情分享给受信任的设备。保持服务器在同一网络以获得最快设置。", + "config.server_sharing_menu_hint": "如需每个工作区的分享链接,请使用工作区菜单中的分享…", + "config.server_sharing_title": "OpenWork服务器共享", + "config.server_url_hint": "使用OpenWork服务器提供的URL。本地桌面工作区使用48000-51000范围内的持久高端口。", + "config.server_url_input_label": "OpenWork服务器URL", + "config.server_url_label": "OpenWork服务器URL", + "config.starting_server": "正在启动服务器…", + "config.status_connected": "已连接", + "config.status_limited": "受限", + "config.status_not_connected": "未连接", + "config.test_connection": "测试连接", + "config.testing": "正在测试…", + "config.testing_connection": "正在测试连接…", + "config.token_hint": "可选。粘贴协作者令牌用于日常访问,或在此客户端需要回答权限提示时粘贴所有者令牌。", + "config.token_label": "协作者或所有者令牌", + "config.token_placeholder": "粘贴你的令牌", + "config.unavailable": "不可用", + "config.worker_id": "工作区ID:", + "config.workspace_config_desc": "这些设置影响所选工作区。仅运行时操作适用于当前连接的工作区。", + "config.workspace_config_title": "工作区配置", + "config.workspace_id_prefix": "工作区:", + "context_panel.add_button": "添加", + "context_panel.add_folder_hint": "添加文件夹以允许此工作区读写其根目录以外的文件。", + "context_panel.adding_button": "添加中…", + "context_panel.always_available": "始终可用", "context_panel.authorized_folders": "已授权文件夹", + "context_panel.authorized_folders_desc": "授予此工作区访问权限,以读取和编辑根目录之外的文件夹。", + "context_panel.authorized_folders_no_access": "连接可写的OpenWork服务器工作区以编辑已授权文件夹。", + "context_panel.browse_button": "浏览", + "context_panel.config_access_unavailable": "此工作区无法访问OpenWork服务器配置。", + "context_panel.config_read_only": "OpenWork服务器对工作区配置为只读连接。", "context_panel.context": "上下文", + "context_panel.folder_already_authorized": "文件夹已授权。", + "context_panel.folders_updated": "已授权文件夹已更新。", + "context_panel.input_placeholder": "输入要授权的文件夹路径…", "context_panel.mcp": "MCP", "context_panel.mcp_connected": "已连接", "context_panel.mcp_disabled": "已禁用", @@ -906,18 +238,32 @@ export default { "context_panel.mcp_failed": "失败", "context_panel.mcp_needs_auth": "需要认证", "context_panel.mcp_register_client": "注册客户端", + "context_panel.no_external_folders": "暂无已授权的外部文件夹", "context_panel.no_mcp": "未加载MCP服务器。", "context_panel.no_plugins": "未加载插件。", + "context_panel.no_server_workspace": "未选择活动的服务器工作区。", "context_panel.no_skills": "未加载skills。", "context_panel.none_yet": "暂无。", - "context_panel.open_file": "打开{path}", "context_panel.plugins": "插件", + "context_panel.preserving_entries": "保留{count}条非文件夹权限条目。", + "context_panel.preserving_entry": "保留1条非文件夹权限条目。", + "context_panel.remove_folder": "移除{name}", + "context_panel.saving_folders": "正在保存已授权文件夹…", + "context_panel.server_disconnected": "OpenWork服务器已断开连接。", "context_panel.skills": "Skills(技能)", "context_panel.working_files": "工作文件", - - // ==================== Dashboard extras ==================== + "context_panel.workspace_root_available": "工作区根目录已可用。", + "context_panel.workspace_root_badge": "工作区根目录", + "context_panel.writable_workspace_required": "需要可写的OpenWork服务器工作区才能更新已授权文件夹。", "dashboard.access_token": "访问令牌", "dashboard.access_token_optional_hint": "仅在工作区需要时添加令牌。", + "dashboard.blueprints_workspace": "蓝图工作区", + "dashboard.blueprints_workspace_desc": "从适合复用skills、命令和共享流程的自动化工作区开始。", + "dashboard.change": "更改", + "dashboard.choose_folder": "选择文件夹", + "dashboard.choose_folder_continue": "选择文件夹以继续。", + "dashboard.choose_folder_next": "与你的工作区共享文件。", + "dashboard.choose_preset": "选择预设", "dashboard.chooser_local_desc": "在此设备上创建工作区,可选择从团队模板开始。", "dashboard.chooser_remote_desc": "使用URL和访问令牌连接自托管的OpenWork工作区。", "dashboard.chooser_shared_desc": "浏览组织共享的云端工作区,一步连接。", @@ -927,20 +273,34 @@ export default { "dashboard.cloud_signin_next": "接下来你将选择团队并连接到已有的工作区。", "dashboard.cloud_signin_title": "登录OpenWork Cloud", "dashboard.cloud_worker": "云端工作区", + "dashboard.commands": "命令", "dashboard.connect_remote_button": "连接远程", + "dashboard.connected": "已连接", "dashboard.connecting": "正在连接…", "dashboard.create_local_workspace_subtitle": "在此设备上创建工作区,可选择从团队模板开始。", "dashboard.create_local_workspace_title": "本地工作区", "dashboard.create_remote_custom_subtitle": "连接自托管的OpenWork工作区。", "dashboard.create_remote_custom_title": "连接自定义远程", + "dashboard.create_remote_workspace_confirm": "添加工作区", + "dashboard.create_remote_workspace_subtitle": "保存OpenWork服务器为工作区。", + "dashboard.create_remote_workspace_title": "添加远程工作区", + "dashboard.create_sandbox_confirm": "创建为沙箱", "dashboard.create_shared_subtitle_signed_in": "浏览组织共享的云端工作区,一步连接。", "dashboard.create_shared_subtitle_signed_out": "登录OpenWork Cloud以访问组织共享的工作区。", "dashboard.create_shared_title": "共享工作区", + "dashboard.create_workspace_confirm": "创建工作区", + "dashboard.create_workspace_subtitle": "初始化新的基于文件夹的工作区。", + "dashboard.create_workspace_title": "创建工作区", "dashboard.creating": "正在创建…", "dashboard.desktop_badge": "桌面版", "dashboard.display_name_label": "显示名称", "dashboard.display_name_optional": "(可选)", "dashboard.docker_debug_details": "Docker调试详情", + "dashboard.edit_remote_workspace_confirm": "保存连接", + "dashboard.edit_remote_workspace_subtitle": "更新此工作区的OpenWork服务器信息。", + "dashboard.edit_remote_workspace_title": "编辑远程连接", + "dashboard.empty_workspace": "空白工作区", + "dashboard.empty_workspace_desc": "从空白文件夹开始,添加你需要的内容。", "dashboard.error_choose_org": "请先选择组织再打开工作区。", "dashboard.error_connect_worker": "连接{name}失败。", "dashboard.error_create_template": "创建{name}失败。", @@ -954,18 +314,47 @@ export default { "dashboard.nav_ids": "IDs", "dashboard.no_folder_selected": "尚未选择文件夹。", "dashboard.open_cloud_dashboard": "打开云端控制台", + "dashboard.opening": "正在打开...", + "dashboard.openwork_host_hint": "使用OpenWork服务器提供的地址。", + "dashboard.openwork_host_label": "OpenWork服务器地址", + "dashboard.openwork_host_placeholder": "https://your-server.openwork.app", + "dashboard.openwork_host_token_hint": "可选。日常访问可粘贴协作者令牌;如果这个客户端需要处理权限提示,请粘贴所有者令牌。", + "dashboard.openwork_host_token_label": "协作者或所有者令牌", + "dashboard.openwork_host_token_placeholder": "粘贴你的令牌", "dashboard.recently_updated": "最近更新", + "dashboard.remote": "远程", + "dashboard.remote_base_url_required": "请先填写服务器地址。", + "dashboard.remote_connection_direct": "直连", + "dashboard.remote_connection_openwork": "OpenWork", + "dashboard.remote_directory_hint": "留空则使用服务器默认目录。", + "dashboard.remote_directory_label": "工作区目录(可选)", + "dashboard.remote_directory_placeholder": "/home/team/project", + "dashboard.remote_display_name_label": "显示名称(可选)", + "dashboard.remote_display_name_placeholder": "设计团队工作区", "dashboard.remote_server_details_hint": "连接自托管的OpenWork工作区。", "dashboard.remote_server_details_title": "远程服务器详情", + "dashboard.remote_workspace_hint": "记录OpenWork服务器,随时重新连接。", + "dashboard.remote_workspace_title": "远程工作区", + "dashboard.repair_cache": "修复缓存", + "dashboard.repairing_cache": "正在修复缓存", + "dashboard.sandbox_checking_docker": "正在检查Docker...", + "dashboard.sandbox_get_ready_action": "准备沙箱环境", + "dashboard.sandbox_get_ready_desc": "在隔离的Docker容器中运行此工作区,更安全、更可复现。", + "dashboard.sandbox_get_ready_title": "沙箱需要Docker", "dashboard.sandbox_hide_logs": "隐藏日志", "dashboard.sandbox_live_logs": "实时日志", "dashboard.sandbox_setup": "沙箱配置", "dashboard.sandbox_show_logs": "显示日志", "dashboard.search_shared_workspaces": "搜索共享工作区", + "dashboard.select_folder": "选择文件夹", + "dashboard.settings": "设置", "dashboard.shared_workspaces_loading": "正在加载共享工作区…", "dashboard.shared_workspaces_no_match": "没有匹配的共享工作区。", "dashboard.shared_workspaces_none": "暂无可用的共享工作区。", "dashboard.shared_workspaces_refreshing": "正在刷新工作区…", + "dashboard.skills": "Skills(技能)", + "dashboard.starter_workspace": "启动工作区", + "dashboard.starter_workspace_desc": "预配置以展示如何使用插件、命令和skills。", "dashboard.team_templates_hint": "选择一个起点,或留空创建空白工作区。", "dashboard.team_templates_none": "此组织暂无共享工作区模板。", "dashboard.team_templates_syncing": "同步中", @@ -985,12 +374,13 @@ export default { "dashboard.workspace_folder_hint": "选择此工作区在设备上的位置。", "dashboard.workspace_folder_title": "工作区文件夹", "dashboard.workspace_not_ready_title": "此工作区尚未准备就绪。", - - // ==================== Den ==================== + "dashboard.workspaces": "工作区", "den.active_org_hint": "云端工作区和团队模板限于所选组织。", "den.active_org_title": "当前组织", "den.auto_reconnect_hint": "在浏览器中完成认证后,OpenWork将自动重新连接。", "den.checking_session": "正在检查会话", + "den.choose_org_for_providers": "选择一个组织以查看云端提供商。", + "den.choose_org_for_skill_hubs": "选择一个组织以查看云端Skill Hub。", "den.choose_org_for_templates": "选择组织以查看团队模板。", "den.cloud_account_hint": "管理已连接的账户和组织。", "den.cloud_account_title": "Cloud账户", @@ -999,12 +389,18 @@ export default { "den.cloud_control_plane_save": "保存URL", "den.cloud_control_plane_url_hint": "仅限开发者模式。用于连接本地或自托管的Cloud控制平面。更改后将退出登录以重新连接新的控制平面。", "den.cloud_control_plane_url_label": "Cloud控制平面URL", + "den.cloud_provider_detail": "{count}个模型 · {source}提供商", + "den.cloud_provider_removed_detail": "此导入的提供商不再存在于云端。请卸载本地的{providerId}配置。", + "den.cloud_provider_sync_detail": "云端提供商已变更。将{count}个模型的{source}配置同步到opencode.jsonc。", + "den.cloud_providers_hint": "将托管LLM提供商导入opencode.jsonc,并在此工作区中使用组织凭据。", + "den.cloud_providers_title": "云端提供商", "den.cloud_section_desc": "登录、选择组织,打开Cloud工作区或团队模板。", "den.cloud_section_title": "OpenWork Cloud", "den.cloud_sleep_hint": "登录OpenWork Cloud,即使电脑进入睡眠状态也能保持任务运行。", "den.cloud_workers_hint": "使用应用内的远程连接流程直接在OpenWork中打开工作区。", "den.cloud_workers_title": "云端工作区", "den.create_account": "创建账户", + "den.credentials_ready_badge": "凭据就绪", "den.error_base_url": "请输入有效的http:// 或https:// Cloud控制平面URL。", "den.error_choose_org": "请先选择组织再打开工作区。", "den.error_load_orgs": "加载组织失败。", @@ -1021,44 +417,31 @@ export default { "den.finish_signin": "完成登录", "den.finishing": "正在完成…", "den.hide_signin_code": "隐藏登录码", + "den.import_all": "全部导入", + "den.import_provider": "导入", + "den.import_provider_failed": "导入{name}失败。", + "den.imported_badge": "已导入", + "den.imported_provider": "已导入{name}。", + "den.importing": "导入中…", "den.needs_attention": "需要关注", + "den.no_cloud_providers": "此组织暂无可用的云端提供商。", "den.no_cloud_workers": "此组织暂无可见的云端工作区。请在Cloud中创建后刷新此标签页。", "den.no_org_selected": "未选择组织", + "den.no_skill_hubs": "此组织暂无可用的云端Skill Hub。", "den.no_team_templates": "暂无团队模板。请使用 分享 → 模板 → 与团队分享。", "den.open": "打开", "den.opening": "正在打开…", - "den.import_all": "Import all", - "den.import_provider": "Import", - "den.importing": "Importing...", - "den.removing": "Removing...", - "den.sync": "Sync", - "den.syncing": "Syncing...", - "den.uninstall": "Uninstall", - "den.imported_badge": "Imported", - "den.out_of_sync_badge": "Out of sync", - "den.removed_from_cloud_badge": "Removed from cloud", - "den.credentials_ready_badge": "Credential ready", - "den.skill_hubs_title": "Skill hubs", - "den.skill_hubs_hint": "Import every skill from a shared cloud hub into this workspace in one step.", - "den.choose_org_for_skill_hubs": "Choose an org to view cloud skill hubs.", - "den.no_skill_hubs": "No cloud skill hubs are available for this org yet.", - "den.skill_hub_skills_badge": "{count} skills", - "den.skill_hub_detail": "Import {count} shared skills into .opencode/skills.", - "den.skill_hub_imported_detail": "Imported {count} skills into this workspace.", - "den.skill_hub_sync_detail": "Cloud now has {liveCount} skills; this workspace imported {importedCount}. Sync to update the installed set.", - "den.skill_hub_removed_detail": "This hub was removed from cloud. Uninstall the {importedCount} imported skills from this workspace.", - "den.cloud_providers_title": "Cloud providers", - "den.cloud_providers_hint": "Import managed LLM providers into opencode.jsonc and use the org credential in this workspace.", - "den.choose_org_for_providers": "Choose an org to view cloud providers.", - "den.no_cloud_providers": "No cloud providers are available for this org yet.", - "den.cloud_provider_detail": "{count} models · {source} provider", - "den.cloud_provider_sync_detail": "Cloud provider changed. Sync the {count} model {source} config into opencode.jsonc.", - "den.cloud_provider_removed_detail": "This imported provider is no longer in cloud. Uninstall the local {providerId} config.", "den.org_member_suffix": "(成员)", "den.org_owner_suffix": "(所有者)", "den.org_switched": "已切换到{name}。", + "den.out_of_sync_badge": "不同步", "den.paste_signin_code": "粘贴登录码", "den.refresh": "刷新", + "den.reload_workspace": "重新加载工作区以应用配置变更。", + "den.remove_provider_failed": "移除{name}失败。", + "den.removed_from_cloud_badge": "已从云端移除", + "den.removed_provider": "已移除{name}。", + "den.removing": "移除中…", "den.sign_out": "退出登录", "den.signed_out": "已退出", "den.signin_button": "登录", @@ -1069,6 +452,13 @@ export default { "den.signin_title": "登录OpenWork Cloud", "den.signing_in": "正在完成OpenWork Cloud登录…", "den.signing_out": "正在退出…", + "den.skill_hub_detail": "将{count}个共享Skill导入到.opencode/skills。", + "den.skill_hub_imported_detail": "已将{count}个Skill导入此工作区。", + "den.skill_hub_removed_detail": "此Hub已从云端移除。请卸载此工作区中已导入的{importedCount}个Skill。", + "den.skill_hub_skills_badge": "{count}个Skill", + "den.skill_hub_sync_detail": "云端现有{liveCount}个Skill;此工作区已导入{importedCount}个。同步以更新已安装集。", + "den.skill_hubs_hint": "一键将共享云端Hub中的所有Skill导入到此工作区。", + "den.skill_hubs_title": "Skill Hub", "den.status_base_url_updated": "已更新Cloud控制平面URL。请重新登录以继续。", "den.status_browser_signin": "请在浏览器中完成登录以连接OpenWork。", "den.status_browser_signup": "请在浏览器中完成账户创建以连接OpenWork。", @@ -1084,38 +474,176 @@ export default { "den.status_opened_worker": "已在OpenWork中打开{name}。", "den.status_signed_in_as": "已登录为{email}。", "den.status_signed_out": "已退出登录并清除此设备上的OpenWork Cloud会话。", + "den.sync": "同步", + "den.sync_provider_failed": "同步{name}失败。", + "den.synced_provider": "已同步{name}。", + "den.syncing": "同步中…", "den.team_template_badge": "团队模板", "den.team_templates_hint": "打开与此组织共享的可复用工作区模板。", "den.team_templates_title": "团队模板", + "den.uninstall": "卸载", "den.worker_mine_badge": "我的", "den.worker_not_ready_title": "此工作区尚未准备就绪。", "den.worker_provider_label": "{provider}工作区", "den.worker_secondary_cloud": "云端工作区", - - // ==================== Den settings panel ==================== - "den_settings.manage_account": "管理账户", - "den_settings.no_workers": "未找到共享工作区。", - "den_settings.open_workspace": "打开工作区", - "den_settings.refresh": "刷新", - "den_settings.sign_in": "登录", - "den_settings.sign_in_hint": "登录OpenWork Cloud以访问共享工作区和团队功能。", - "den_settings.sign_out": "退出登录", - "den_settings.signed_in_as": "已登录为", - "den_settings.title": "Cloud", - "den_settings.workers_hint": "组织共享的云端工作区。", - "den_settings.workers_title": "共享工作区", - - // ==================== Extensions ==================== + "extensions.app_count_one": "{count}个应用已连接", + "extensions.app_count_many": "{count}个应用已连接", + "extensions.apps_mcp_header": "应用(MCP)", + "extensions.filter_all": "全部", + "extensions.filter_apps": "应用", + "extensions.filter_plugins": "插件", + "extensions.plugin_count_one": "{count}个插件", + "extensions.plugin_count_many": "{count}个插件", + "extensions.plugins_opencode_header": "插件(OpenCode)", + "extensions.subtitle": "应用(MCP)和OpenCode插件集中管理。", "extensions.title": "扩展", - - // ==================== Inbox Panel ==================== + "identities.agent_behavior_desc": "每个工作区一个文件。可在首行添加@agent 以通过特定OpenCode智能体路由。", + "identities.agent_behavior_title": "消息智能体行为", + "identities.agent_created": "已创建默认消息智能体文件。", + "identities.agent_file_changed": "文件已被远程修改。请重新加载后再保存。", + "identities.agent_loading": "正在加载智能体文件…", + "identities.agent_none": "无", + "identities.agent_not_found": "此工作区中尚未找到智能体文件。", + "identities.agent_placeholder": "在此添加opencodeRouter的消息行为指令…", + "identities.agent_saved": "已保存消息行为。", + "identities.agent_scope_status": "活动范围:工作区 · 状态:{status} · 已选智能体:{agent}", + "identities.agent_status_loaded": "已加载", + "identities.agent_status_missing": "缺失", + "identities.agent_worker_scope_unavailable": "工作区范围不可用。", + "identities.all_channels": "所有频道", + "identities.app_token_label": "应用令牌", + "identities.auto_bind_label": "直接发送时自动绑定对等方到目录", + "identities.available_channels": "可用频道", + "identities.bot_token_label": "机器人令牌", + "identities.bot_token_placeholder": "粘贴来自@BotFather的Telegram机器人令牌", + "identities.botfather_step1_open": "1. 在Telegram中打开@BotFather", + "identities.botfather_step1_run": "并运行/newbot", + "identities.botfather_step3_choose": "3. 为你的机器人选择名称和用户名", + "identities.botfather_step3_or_private": "用于开放收件箱,或", + "identities.botfather_step3_private": "私有", + "identities.botfather_step3_public": "公开", + "identities.botfather_step3_to_require": "以要求", + "identities.channel_label": "频道", + "identities.channels_connected": "已连接", + "identities.channels_label": "频道", + "identities.configured_suffix": "已配置", + "identities.connect_server_desc": "身份功能在连接OpenWork服务器后可用。", + "identities.connect_server_title": "连接OpenWork服务器", + "identities.connect_slack": "连接Slack", + "identities.connected_badge": "已连接", + "identities.connecting": "正在连接…", + "identities.copy_bot_token_hint": "复制机器人令牌并粘贴到下方。", + "identities.copy_code": "复制代码", + "identities.create_default_file": "创建默认文件", + "identities.create_private_bot": "创建私有机器人", + "identities.create_public_bot": "创建公开机器人", + "identities.days_ago": "{days}天前", + "identities.default_routing": "默认路由", + "identities.directory_label": "目录(可选)", + "identities.disable_messaging": "禁用消息", + "identities.disable_messaging_message": "这将关闭此工作区的消息功能。Telegram和Slack设置将隐藏,直到重新启用消息功能。你需要重启工作区以完全停止消息sidecar。", + "identities.disable_messaging_title": "禁用此工作区的消息功能?", + "identities.disabled_label": "已禁用", + "identities.disabling": "正在禁用…", + "identities.disconnect": "断开连接", + "identities.dispatched_messages": "已分发{sent}/{attempted}条消息。", + "identities.enable_messaging": "启用消息", + "identities.enable_messaging_risk": "消息功能可能将此工作区暴露给远程命令。如果机器人是公开的或被入侵,它可以访问此工作区可用的文件、凭据和API密钥。", + "identities.enable_messaging_title": "启用此工作区的消息功能?", + "identities.enabled_label": "已启用", + "identities.enabling": "正在启用…", + "identities.health_offline": "离线", + "identities.health_running": "运行中", + "identities.health_unavailable": "不可用", + "identities.health_unavailable_status": "OpenCodeRouter健康状态不可用({status})", + "identities.health_unknown": "未知", + "identities.hours_ago": "{hours}小时前", + "identities.identities_label": "身份", + "identities.just_now": "刚刚", + "identities.last_activity": "最近活动", + "identities.later": "稍后", + "identities.message_label": "消息", + "identities.message_routing_desc": "控制哪些对话路由到哪个工作区文件夹。除非你在此设置规则,否则消息将路由到工作区的默认文件夹。", + "identities.message_routing_title": "消息路由", + "identities.messages_today": "今日消息", + "identities.messaging_disabled_hint": "仅在你了解风险并计划保护访问安全(例如使用Telegram私有配对)时才启用消息功能。", + "identities.messaging_disabled_restart": "消息已禁用。请重启此工作区以停止消息sidecar。", + "identities.messaging_disabled_risk": "消息机器人可以对你的本地工作区执行操作。如果公开暴露,它们可能允许访问此工作区可用的文件、凭据和API密钥。", + "identities.messaging_disabled_title": "消息功能默认禁用", + "identities.messaging_enabled_restart": "消息已启用。请立即重启此工作区以启动消息sidecar,并解锁Telegram和Slack设置。", + "identities.messaging_sidecar_not_running": "此工作区已启用消息功能,但消息sidecar尚未运行。请重启此工作区,然后返回消息设置连接Telegram或Slack。", + "identities.minutes_ago": "{minutes}分钟前", + "identities.not_set": "未设置", + "identities.open_bot_link": "在Telegram中打开@{username}", + "identities.pairing_code_copied": "配对码已复制。", + "identities.pairing_code_copy_failed": "无法复制配对码。请手动复制。", + "identities.pairing_code_instruction_prefix": "发送", + "identities.peer_id_label": "对等方ID(可选)", + "identities.peer_id_placeholder_slack": "例如 slack:U12345678", + "identities.peer_id_placeholder_telegram": "例如 telegram:123456789", + "identities.private_label": "私有", + "identities.private_pairing_code": "私有配对码", + "identities.public_bot_confirm": "是的,我了解风险", + "identities.public_bot_warning_message": "你的机器人将对公众开放,任何获得你机器人访问权限的人都可以完全访问你的本地工作区,包括你提供的所有文件和API密钥。如果创建私有机器人,你可以通过要求配对令牌来限制谁可以访问。确定要将机器人设为公开吗?", + "identities.public_bot_warning_title": "将此机器人设为公开?", + "identities.public_label": "公开", + "identities.quick_setup": "快速设置", + "identities.reconnect_failed": "重新连接失败。请检查OpenWork URL/令牌后重试。", + "identities.reconnected": "已重新连接。", + "identities.reconnected_refreshing": "已重新连接。正在刷新工作区状态…", + "identities.reload": "重新加载", + "identities.repair_reconnect": "修复并重新连接", + "identities.restart_failed": "重启失败。请在设置中重启工作区后重试。", + "identities.restart_to_disable_messaging": "此工作区的消息功能已禁用。请立即重启工作区以停止消息sidecar。", + "identities.restart_to_enable_messaging": "此工作区的消息功能已启用。请立即重启工作区以启动消息sidecar,并解锁Telegram和Slack设置。", + "identities.restart_worker": "重启工作区", + "identities.restart_worker_title": "立即重启工作区?", + "identities.restarting": "正在重启…", + "identities.routing_override_prefix": "所有消息路由到", + "identities.routing_override_suffix": "(覆盖已激活)", + "identities.running_label": "运行中", + "identities.save_behavior": "保存行为", + "identities.saving": "正在保存…", + "identities.send_test_button": "发送测试消息", + "identities.send_test_desc": "验证出站链路。使用对等方ID进行直接发送,或留空对等方ID以按目录中的绑定进行扇出。", + "identities.send_test_title": "发送测试消息", + "identities.sending": "正在发送…", + "identities.slack_desc": "你的工作区在Slack频道中显示为机器人。团队成员可以直接发消息或在对话中@提及它。", + "identities.slack_intro": "连接Slack工作区,让团队成员可以在频道和私信中与此工作区交互。", + "identities.slack_unavailable": "Slack身份不可用。", + "identities.status_active": "活动", + "identities.status_label": "状态", + "identities.status_stopped": "已停止", + "identities.stopped_label": "已停止", + "identities.subtitle": "让人们通过消息应用联系你的工作区。连接频道后,你的工作区将自动读取和回复消息。", + "identities.tab_general": "通用", + "identities.telegram_bot_access_desc": "公开机器人:首次Telegram聊天自动关联。私有机器人:需要配对码后才能运行工具。", + "identities.telegram_delete_failed": "删除失败。", + "identities.telegram_deleted": "已删除。", + "identities.telegram_deleted_pending": "已删除(等待应用)。", + "identities.telegram_desc": "连接Telegram机器人,可选公开模式(开放收件箱)或私有模式(需要配对码)。", + "identities.telegram_private_saved_pair": "私有机器人已保存。通过/pair {code}配对", + "identities.telegram_save_failed": "保存失败。", + "identities.telegram_saved": "已保存。", + "identities.telegram_saved_pending": "已保存(等待应用)。", + "identities.telegram_saved_username": "已保存(@{username})", + "identities.telegram_unavailable": "Telegram身份不可用。", + "identities.title": "消息频道", + "identities.unsaved_changes": "未保存的更改", + "identities.worker_offline": "工作区离线", + "identities.worker_online": "工作区在线", + "identities.worker_restarted": "工作区已重启。", + "identities.worker_restarted_refreshing": "工作区已重启。正在刷新消息状态…", + "identities.worker_scope_unavailable": "工作区范围不可用。", + "identities.worker_scope_unavailable_detail": "工作区范围不可用。请使用工作区URL重新连接或切换到已知的工作区。", + "identities.worker_unavailable": "工作区不可用", + "identities.workspace_id_required": "管理身份需要工作区ID。请使用工作区URL重新连接或选择此主机上映射的工作区。", + "identities.workspace_scope_prefix": "工作区范围:", "inbox_panel.connect_to_download": "连接工作区以下载共享文件。", "inbox_panel.connect_to_see": "连接以查看共享文件。", "inbox_panel.connect_to_upload": "连接工作区以上传", - "inbox_panel.copied_path": "已复制:{path}", "inbox_panel.copy_failed": "复制失败。浏览器可能阻止了剪贴板访问。", "inbox_panel.download": "下载", - "inbox_panel.download_failed": "下载失败", "inbox_panel.drop_to_upload": "拖放文件到此处上传", "inbox_panel.helper_text": "通过应用与此工作区共享文件。", "inbox_panel.load_failed": "加载共享文件夹失败", @@ -1130,41 +658,99 @@ export default { "inbox_panel.upload_success": "已上传到共享文件夹。", "inbox_panel.uploading": "正在上传…", "inbox_panel.uploading_label": "正在上传{label}…", - - // ==================== MCP extras ==================== "mcp.activate_button": "激活", + "mcp.add_modal_subtitle": "通过URL或本地命令连接自定义MCP服务器。", + "mcp.add_modal_title": "添加自定义应用", + "mcp.add_server_button": "添加应用", + "mcp.advanced": "高级", "mcp.advanced_settings": "高级设置", "mcp.advanced_settings_hint": "编辑配置文件和手动管理连接。", "mcp.app_connected": "个应用已连接", - "mcp.app_details": "应用详情", "mcp.apps_connected": "个应用已连接", "mcp.apps_subtitle": "连接常用工具,让OpenWork代你使用。", "mcp.apps_title": "应用", + "mcp.auth.already_connected": "已连接", + "mcp.auth.already_connected_description": "{server}已通过身份验证,可以正常使用。", + "mcp.auth.applying_changes_body": "我们正在重启worker,以便新MCP可以开始认证。", + "mcp.auth.applying_changes_title": "正在登录前应用更改", + "mcp.auth.authorization_link": "授权链接", + "mcp.auth.authorization_still_required": "仍需要授权。请重试以重新启动流程。", "mcp.auth.callback_invalid": "请粘贴回调URL或code参数以完成OAuth。", "mcp.auth.callback_label": "回调URL或授权码", "mcp.auth.callback_placeholder": "http://127.0.0.1:19876/mcp/oauth/callback?code=...", + "mcp.auth.cancel": "取消", + "mcp.auth.client_registration_required": "在继续OAuth之前需要先注册客户端。", "mcp.auth.complete_connection": "完成连接", + "mcp.auth.configured_previously": "该MCP可能在全局或之前的会话中已配置。你可以关闭此弹窗,立即开始使用MCP工具。", + "mcp.auth.connect_server": "连接{server}", + "mcp.auth.copied": "已复制", + "mcp.auth.copy_link": "复制链接", + "mcp.auth.done": "完成", + "mcp.auth.failed_to_start_oauth": "启动OAuth流程失败", + "mcp.auth.follow_browser_steps": "请在浏览器中完成授权步骤。", + "mcp.auth.force_stop": "强制停止", + "mcp.auth.force_stopping": "正在停止...", + "mcp.auth.im_done": "我已完成", + "mcp.auth.invalid_refresh_token": "OAuth刷新令牌无效或已过期。请重新授权。", "mcp.auth.manual_finish_hint": "粘贴回调URL(localhost:19876)或授权码以完成连接。", "mcp.auth.manual_finish_title": "远程服务器?", + "mcp.auth.oauth_completed_reload": "OAuth已完成。重新加载引擎以激活MCP。", + "mcp.auth.oauth_failed": "OAuth身份验证失败。", + "mcp.auth.oauth_not_supported_hint": "这可能意味着:\n• MCP服务器未声明OAuth功能\n• 引擎需要重新加载以发现服务器功能\n• 尝试:从CLI运行opencode mcp auth {server}", + "mcp.auth.open_browser_signin": "我们将打开你的浏览器完成登录。", "mcp.auth.port_forward_hint": "提示:如需转发回调端口:ssh -L 19876:127.0.0.1:19876 user@host", - "mcp.auth.reload_before_oauth": "请先重新加载引擎以完成此MCP的设置,再启动OAuth。", - "mcp.auth.reload_needed": "请先重新加载引擎完成配置,然后再尝试连接。", + "mcp.auth.reauth_action": "重新授权OAuth", + "mcp.auth.reauth_cli_hint": "运行:opencode mcp auth {server}", + "mcp.auth.reauth_failed": "重新授权失败。", + "mcp.auth.reauth_remote_hint": "请在运行该工作区的设备上重新授权。", + "mcp.auth.reauth_running": "正在重新授权...", + "mcp.auth.reload_blocked": "会话运行中,暂时无法刷新。请先停止运行后再完成设置。", + "mcp.auth.reload_engine_retry": "应用更改并重试", + "mcp.auth.reload_failed": "登录前重启worker失败。", + "mcp.auth.reload_notice": "要使更改生效,OpenWork需要刷新worker服务。这可能会中断正在运行的会话。", + "mcp.auth.reload_remote_confirm": "要使更改生效,OpenWork需要刷新worker服务。这可能会停止你正在运行的会话。是否继续?", + "mcp.auth.reopen_browser_link": "点击这里重新打开浏览器", + "mcp.auth.request_timed_out": "请求超时。", + "mcp.auth.retry": "重试", + "mcp.auth.retry_now": "立即重试", + "mcp.auth.server_disabled": "此MCP服务器已禁用。请启用它后重试。", + "mcp.auth.step1_description": "我们将自动启动{server}的登录流程。", + "mcp.auth.step1_title": "正在打开你的浏览器", + "mcp.auth.step2_description": "登录并在提示时批准访问权限。", + "mcp.auth.step2_title": "授权OpenWork", + "mcp.auth.step3_description": "授权完成后我们将立即完成连接。", + "mcp.auth.step3_title": "完成后返回此处", + "mcp.auth.try_reload_engine": "{message}。请尝试先重新加载引擎。", + "mcp.auth.waiting_authorization": "正在等待你在浏览器中完成授权...", + "mcp.auth.waiting_for_conversation_body": "一旦可以开始认证,我们会立即为你跳转。", + "mcp.auth.waiting_for_conversation_title": "正在等待对话完成", + "mcp.auth.waiting_for_session": "正在等待{session}完成工作", "mcp.available_apps": "可用应用", "mcp.cap_signin": "账户登录", "mcp.cap_tools": "AI工具", "mcp.config_file": "配置文件", + "mcp.config_load_failed": "无法加载配置文件", + "mcp.config_not_loaded": "尚未加载", + "mcp.config_source": "来自配置", + "mcp.configured": "已配置", + "mcp.connect": "连接", + "mcp.connect_failed": "连接失败,请重试。", + "mcp.connect_server_first": "请先连接服务器。", + "mcp.connected": "已连接", "mcp.connected_badge": "已连接", + "mcp.connecting": "连接中", + "mcp.connection_failed": "连接异常 — 请重试", "mcp.connection_type": "连接方式", "mcp.control_chrome_browser_hint": "在Chrome 144或更高版本中,请先执行以下步骤:", "mcp.control_chrome_browser_step_one": "打开chrome://inspect/#remote-debugging。", - "mcp.control_chrome_browser_step_three": "在Chrome提示时允许传入调试连接。", "mcp.control_chrome_browser_step_two": "启用远程调试。", - "mcp.control_chrome_browser_title": "1.开启Chrome访问", + "mcp.control_chrome_browser_step_three": "在Chrome提示时允许传入调试连接。", + "mcp.control_chrome_browser_title": "1. 开启Chrome访问", "mcp.control_chrome_connect": "添加Control Chrome", "mcp.control_chrome_docs": "官方MCP指南", "mcp.control_chrome_edit": "编辑设置", "mcp.control_chrome_profile_hint": "Control Chrome通常会打开独立的Chrome配置文件。如果你想让OpenWork复用已打开的Chrome窗口,请开启此选项。", - "mcp.control_chrome_profile_title": "2.选择使用哪个Chrome", + "mcp.control_chrome_profile_title": "2. 选择使用哪个Chrome", "mcp.control_chrome_save": "保存设置", "mcp.control_chrome_setup_subtitle": "先开启Chrome访问,然后选择OpenWork是使用独立配置文件还是复用已打开的Chrome。", "mcp.control_chrome_setup_title": "设置Control Chrome", @@ -1172,6 +758,10 @@ export default { "mcp.control_chrome_toggle_label": "使用我现有的Chrome配置文件", "mcp.control_chrome_toggle_off": "OpenWork将启动独立的Chrome配置文件用于自动化。", "mcp.control_chrome_toggle_on": "OpenWork将复用你当前的标签页、Cookie和登录状态。", + "mcp.custom_app_cta_hint": "连接你的MCP服务器、内部工具或托管应用。", + "mcp.desktop_required": "应用需要桌面应用。", + "mcp.docs_link": "了解更多", + "mcp.file_not_found": "配置文件尚未创建", "mcp.finish_setup": "即将完成", "mcp.finish_setup_hint": "点击激活以完成应用连接。", "mcp.friendly_status_issue": "异常", @@ -1179,26 +769,73 @@ export default { "mcp.friendly_status_offline": "离线", "mcp.friendly_status_paused": "已暂停", "mcp.friendly_status_ready": "就绪", - "mcp.issue_label": "异常", "mcp.last_synced": "已同步", + "mcp.login_action": "登录", + "mcp.login_hint": "连接你的账户以完成此应用的设置。", + "mcp.login_unavailable": "此应用不支持从OpenWork发起登录。", + "mcp.logout_action": "退出登录", + "mcp.logout_failed": "退出登录失败。", + "mcp.logout_hint": "将删除已保存的OAuth凭据。之后需要重新登录。", + "mcp.logout_label": "OAuth", + "mcp.logout_modal_message": "这将删除{server}的OAuth凭据。之后需要重新登录才能使用该应用。", + "mcp.logout_modal_title": "退出登录?", + "mcp.logout_success": "{server}已退出登录。", + "mcp.logout_working": "正在退出...", + "mcp.name_required": "请输入服务器名称。", "mcp.no_apps_hint": "连接上方的应用开始使用。", "mcp.no_apps_yet": "暂无已连接的应用", + "mcp.oauth": "登录", + "mcp.oauth_optional_hint": "在浏览器中通过OAuth连接你的账户。", + "mcp.oauth_optional_label": "此应用需要登录", "mcp.one_click_connect": "一键连接", + "mcp.open_file": "打开文件", + "mcp.opening_label": "正在打开", + "mcp.pick_workspace_error": "请先选择工作区文件夹。", + "mcp.pick_workspace_first": "请先选择工作区文件夹。", + "mcp.quick_connect_chrome_desc": "通过浏览器自动化操控Chrome标签页。", + "mcp.quick_connect_chrome_title": "控制Chrome", + "mcp.quick_connect_context7_desc": "以更丰富的上下文搜索产品文档。", + "mcp.quick_connect_context7_title": "Context7", + "mcp.quick_connect_linear_desc": "规划冲刺,更快交付工单。", + "mcp.quick_connect_linear_title": "Linear", + "mcp.quick_connect_notion_desc": "同步页面、数据库和项目文档。", + "mcp.quick_connect_notion_title": "Notion", + "mcp.quick_connect_sentry_desc": "追踪发布并解决生产错误。", + "mcp.quick_connect_sentry_title": "Sentry", + "mcp.quick_connect_stripe_desc": "查看支付、发票和订阅。", + "mcp.quick_connect_stripe_title": "Stripe", "mcp.reload_banner_blocked_hint": "停止正在运行的任务以激活。", + "mcp.reload_banner_description": "点击激活以完成应用连接。", "mcp.reload_banner_description_blocked": "任务正在运行。请先停止任务再激活。", - "mcp.select_app_hint": "选择一个应用以查看详情。", + "mcp.remote_workspace_url_hint": "远程工作区建议优先使用URL类型的MCP服务器。", + "mcp.remove_app": "移除", + "mcp.remove_failed": "无法移除应用。", + "mcp.remove_modal_message": "确定要移除{server}吗?你可以随时重新添加。", + "mcp.remove_modal_title": "移除应用", + "mcp.reveal_config_failed": "无法打开配置文件", + "mcp.reveal_in_finder": "在文件管理器中显示", + "mcp.scope_global": "所有工作区", + "mcp.scope_project": "此工作区", + "mcp.server_command": "命令", + "mcp.server_command_hint": "启动服务器的shell命令。", + "mcp.server_command_placeholder": "npx -y @modelcontextprotocol/server-sequential-thinking", + "mcp.server_name": "应用名称", + "mcp.server_name_placeholder": "github-copilot", + "mcp.server_type": "类型", + "mcp.server_url": "服务器URL", + "mcp.server_url_placeholder": "https://api.githubcopilot.com/mcp/", + "mcp.sign_in_section_label": "登录", "mcp.tap_to_connect": "点击连接", "mcp.technical_details": "技术详情", "mcp.type_cloud": "Cloud(使用账户登录)", "mcp.type_local": "本地(在此设备运行)", + "mcp.type_local_cmd": "本地(命令)", + "mcp.type_remote": "远程(URL)", + "mcp.url_or_command_required": "远程服务器需要URL,本地服务器需要命令。", "mcp.your_apps": "你的应用", - - // ==================== Message ==================== "message.tool_request_label": "请求", "message.tool_result_label": "结果", "message.waiting_subagent": "正在等待子智能体的转录到达。", - - // ==================== Message List ==================== "message_list.copy_message": "复制消息", "message_list.open_session": "打开会话", "message_list.step_updates_progress": "更新进度", @@ -1228,14 +865,246 @@ export default { "message_list.tool_update_todo": "更新待办列表", "message_list.tool_updated_file": "已更新{file}", "message_list.tool_updated_file_fallback": "已更新文件", - - // ==================== Reload extras ==================== - "reload.toast_reload_stopped": "重新加载并停止任务", - - // ==================== Scheduled ==================== + "model_behavior.desc_builtin": "此模型自行决定推理路径,不在此处提供配置。", + "model_behavior.desc_generic": "使用{label}配置。", + "model_behavior.desc_high": "回答前花更多时间推理。", + "model_behavior.desc_high_anthropic": "使用标准扩展思考预算。", + "model_behavior.desc_low": "回答前使用较轻的推理过程。", + "model_behavior.desc_low_google": "使用较轻的推理预算以更快响应。", + "model_behavior.desc_max": "使用提供商最深层的推理配置。", + "model_behavior.desc_max_anthropic": "使用最大的扩展思考预算。", + "model_behavior.desc_medium": "平衡速度和推理深度。", + "model_behavior.desc_minimal": "使用极少量的推理。", + "model_behavior.desc_none": "以最轻量的推理路径优先保证速度。", + "model_behavior.desc_standard": "此模型不提供额外的推理控制。", + "model_behavior.label_balanced": "均衡", + "model_behavior.label_builtin": "内置", + "model_behavior.label_deep": "深度", + "model_behavior.label_extended": "扩展", + "model_behavior.label_fast": "快速", + "model_behavior.label_light": "轻量", + "model_behavior.label_maximum": "最大", + "model_behavior.label_quick": "迅速", + "model_behavior.label_standard": "标准", + "model_behavior.title_builtin_reasoning": "内置推理", + "model_behavior.title_extended_thinking": "扩展思考", + "model_behavior.title_reasoning_budget": "推理预算", + "model_behavior.title_reasoning_effort": "推理力度", + "model_behavior.title_standard_generation": "标准生成", + "model_picker.chat_model_desc": "选择此对话的模型。如果模型支持推理配置,可在其卡片上进行设置。", + "model_picker.chat_model_title": "对话模型", + "model_picker.connect_provider_hint": "连接此提供商以浏览和保存模型", + "model_picker.default_model_desc": "选择新对话的默认模型,然后在其卡片上微调推理配置后点击完成。", + "model_picker.default_model_title": "默认模型", + "model_picker.model_count": "{count}个模型", + "model_picker.model_count_one": "1个模型", + "model_picker.more_providers": "更多提供商", + "model_picker.no_results": "没有匹配的模型。", + "model_picker.other_connected_models": "其他已连接的模型", + "model_picker.recommended": "推荐", + "onboarding.access_label": "访问权限", + "onboarding.add": "添加", + "onboarding.add_folder_path": "添加文件夹路径", + "onboarding.advanced_settings": "高级设置", + "onboarding.attach": "附加", + "onboarding.attach_description": "附加到此设备上的现有会话。", + "onboarding.authorize_folder": "授权文件夹", + "onboarding.back": "返回", + "onboarding.checking_cli": "正在检查OpenCode CLI...", + "onboarding.choose_workspace_folder": "选择工作区文件夹", + "onboarding.cli_checking": "正在检查安装...", + "onboarding.cli_install_commands": "使用以下命令之一安装OpenCode,然后重启OpenWork。", + "onboarding.cli_label": "OpenCode CLI", + "onboarding.cli_needs_update": "OpenCode CLI需要更新以支持serve。", + "onboarding.cli_not_found": "未找到OpenCode CLI。", + "onboarding.cli_not_found_hint": "未找到。请安装以运行本地服务器。", + "onboarding.cli_ready": "OpenCode CLI就绪。", + "onboarding.cli_recheck": "重新检查", + "onboarding.cli_version": "OpenCode {version}", + "onboarding.cli_version_installed": "已安装", + "onboarding.create_first_workspace": "创建你的第一个工作区", + "onboarding.create_workspace": "创建工作区", + "onboarding.engine_running": "引擎已在运行", + "onboarding.folders_allowed": "已授权{count}个文件夹", + "onboarding.getting_ready": "正在准备中", + "onboarding.install": "安装OpenCode", + "onboarding.install_instruction": "安装OpenCode以启用本地服务器(无需终端)。", + "onboarding.last_checked": "上次检查时间{time}", + "onboarding.manage_access_hint": "你可以在高级设置中管理访问权限。", + "onboarding.open_settings": "打开设置", + "onboarding.open_settings_hint": "需要引擎或访问选项?打开设置。", + "onboarding.pick": "选择", + "onboarding.ready_message": "OpenCode已准备好启动本地服务器。", + "onboarding.remember_choice": "记住我的选择,下次直接启动", + "onboarding.remote_workspace_action": "连接", + "onboarding.remote_workspace_card_description": "连接OpenWork服务器以访问共享工作区。", + "onboarding.remote_workspace_card_title": "连接远程工作区", + "onboarding.remote_workspace_description": "连接OpenWork服务器以随时访问工作区。", + "onboarding.remote_workspace_title": "连接OpenWork服务器", + "onboarding.remove": "移除", + "onboarding.resolved_path": "解析路径", + "onboarding.run_local": "本地运行", + "onboarding.run_local_description": "OpenWork在本地运行OpenCode并保持你的工作私密。", + "onboarding.search_notes": "搜索说明", + "onboarding.searching_host": "正在连接OpenWork服务器...", + "onboarding.serve_help": "serve --help输出", + "onboarding.show_search_notes": "显示搜索说明", + "onboarding.start": "启动OpenWork", + "onboarding.starting_host": "正在启动OpenWork服务器...", + "onboarding.theme_current": "当前:{mode}", + "onboarding.theme_dark": "深色", + "onboarding.theme_label": "主题", + "onboarding.theme_light": "浅色", + "onboarding.theme_system": "系统", + "onboarding.verifying": "验证安全握手", + "onboarding.version": "版本", + "onboarding.welcome_title": "今天想如何运行OpenWork?", + "onboarding.windows_install_instruction": "安装Windows版OpenCode,然后重启OpenWork。确保opencode.exe在PATH中。", + "onboarding.workspace_folder_label": "工作区是一个包含自己的skills、插件和命令的文件夹。", + "plugins.add": "添加", + "plugins.add_hint": "添加npm包名称,例如opencode-wakatime", + "plugins.add_label": "添加插件", + "plugins.added": "已添加", + "plugins.config": "配置", + "plugins.config_label": "配置", + "plugins.desc": "管理项目或全局OpenCode插件的`opencode.json`。", + "plugins.empty": "尚未配置插件。", + "plugins.enabled": "已启用", + "plugins.hide_setup": "隐藏设置", + "plugins.not_loaded": "尚未加载", + "plugins.not_loaded_yet": "尚未加载", + "plugins.remove": "移除", + "plugins.scheduler_desc": "使用OpenCode调度器插件运行定时任务。", + "plugins.scope_global": "全局", + "plugins.scope_project": "项目", + "plugins.setup": "设置", + "plugins.suggested": "建议的插件", + "plugins.suggested_heading": "建议的插件", + "plugins.title": "OpenCode插件", + "providers.api_key_label": "API密钥", + "providers.api_key_required": "API密钥为必填项", + "providers.auth_failed": "认证失败", + "providers.connect_failed": "连接提供商失败", + "providers.disabled_in_config_suffix": "并已在OpenCode配置中禁用。", + "providers.disconnect_failed": "断开提供商失败", + "providers.disconnected_prefix": "已断开", + "providers.load_failed": "加载提供商失败", + "providers.no_oauth_prefix": "没有可用的OAuth流程:", + "providers.no_providers_available": "没有可用的提供商", + "providers.not_connected": "未连接到服务器", + "providers.not_oauth_flow_prefix": "所选认证方式不是OAuth流程:", + "providers.oauth_failed": "完成OAuth失败", + "providers.oauth_method_required": "OAuth方式为必填项", + "providers.provider_error": "提供商错误({provider})", + "providers.provider_id_required": "提供商ID为必填项", + "providers.rate_limit_exceeded": "请求频率超限", + "providers.removal_unsupported": "此客户端不支持移除提供商认证。", + "providers.request_failed": "请求失败", + "providers.save_api_key_failed": "保存API密钥失败", + "providers.still_connected_suffix": ",但工作区仍报告为已连接。请清除残留的API密钥或OAuth凭据,然后重启工作区以完全断开。", + "providers.unknown_provider": "未知提供商", + "providers.use_api_key_suffix": "请改用API密钥。", + "question_modal.custom_answer_label": "或输入自定义回答", + "question_modal.custom_answer_placeholder": "在此输入你的回答…", + "question_modal.question_counter": "问题{current} / {total}", + "scheduled.at_time": "{time}", + "scheduled.badge_end_of_day": "每日收尾", + "scheduled.badge_every_few_hours": "每隔几小时", + "scheduled.badge_friday_wrapup": "周五总结", + "scheduled.badge_weekday_evening": "工作日晚间", + "scheduled.badge_weekday_morning": "工作日早晨", + "scheduled.badge_weekend_review": "周末回顾", + "scheduled.create_button": "创建", + "scheduled.create_desc": "自动化通过在新对话中运行提示词来调度。我们会为你预填一条提示词。", + "scheduled.create_title": "创建自动化", + "scheduled.created_prefix": "已创建", + "scheduled.custom_schedule": "自定义计划", + "scheduled.daily_mode": "每天", + "scheduled.day_fri": "周五", + "scheduled.day_mon": "周一", + "scheduled.day_sat": "周六", + "scheduled.day_sun": "周日", + "scheduled.day_thu": "周四", + "scheduled.day_tue": "周二", + "scheduled.day_wed": "周三", + "scheduled.days_at": "{days} {time}", + "scheduled.default_automation_name": "每日Bug扫描", + "scheduled.delete_confirm_desc": "这将移除计划并从{source}中删除任务定义。", + "scheduled.delete_confirm_title": "删除自动化?", + "scheduled.delete_error_fallback": "删除任务失败。", + "scheduled.delete_label": "删除", + "scheduled.deleting": "正在删除", + "scheduled.desktop_required": "定时任务需要桌面应用。", + "scheduled.empty_hint": "暂无自动化。选择一个模板或创建自定义自动化提示词。", + "scheduled.every_day_at": "每天{time}", + "scheduled.every_hour": "每小时", + "scheduled.every_n_hours": "每{interval}小时", + "scheduled.every_prefix": "每", + "scheduled.explore_more": "探索更多", + "scheduled.failed_status": "失败", + "scheduled.filter_all": "全部", + "scheduled.filter_scheduled": "已计划", + "scheduled.filter_templates": "模板", + "scheduled.hours_suffix": "小时", + "scheduled.install_scheduler": "安装调度器", + "scheduled.install_scheduler_hint": "自动化通过opencode-scheduler插件运行。请将其添加到此工作区以启用调度功能。", + "scheduled.install_scheduler_title": "安装调度器以解锁自动化", + "scheduled.installing": "正在安装…", + "scheduled.interval_mode": "间隔", + "scheduled.last_run_prefix": "上次运行", + "scheduled.last_updated_prefix": "上次更新", + "scheduled.name_label": "名称", + "scheduled.never": "从未", + "scheduled.new_automation": "新建自动化", + "scheduled.no_automations_match": "没有匹配的自动化。", + "scheduled.no_templates_match": "没有匹配的模板。", + "scheduled.not_run_yet": "尚未运行", + "scheduled.not_synced_yet": "尚未同步", + "scheduled.page_description": "为此工作区调度周期性任务,监控已注册的任务,并从可复用模板开始。", + "scheduled.prepare_error_fallback": "在聊天中准备自动化失败。", + "scheduled.prepared_automation_in_chat": "已在聊天中准备好自动化。", + "scheduled.prepared_job_in_chat": "已在聊天中准备好{name}。", + "scheduled.quick_start_templates": "快速开始模板", + "scheduled.quick_start_templates_desc": "从经过验证的周期性工作流开始,然后在聊天中准备前调整提示词。", + "scheduled.refreshing": "正在刷新", + "scheduled.reload_activate_hint": "OpenCode在启动时加载插件。请重新加载OpenWork以激活opencode-scheduler。", + "scheduled.reload_activate_title": "重新加载OpenWork以激活自动化", + "scheduled.reload_openwork": "重新加载OpenWork", + "scheduled.reloading": "正在重新加载…", + "scheduled.removed_job": "已移除{name}。", + "scheduled.run_label": "运行", + "scheduled.running_status": "运行中", + "scheduled.schedule_label": "计划", + "scheduled.scheduler_install_requested": "已请求安装调度器。", + "scheduled.search_placeholder": "搜索自动化或模板", + "scheduled.source_local": "来自本地调度器", + "scheduled.source_remote": "来自OpenWork服务器", + "scheduled.subtitle_local": "从此设备按计划运行的自动化。", + "scheduled.subtitle_remote": "从已连接的OpenWork服务器按计划运行的自动化。", + "scheduled.success_status": "成功", + "scheduled.task_summary_no_prompt": "未找到提示词或命令。", + "scheduled.task_summary_prompt": "提示词", + "scheduled.template_badge": "模板", + "scheduled.template_count": "{count}个模板", "scheduled.title": "自动化", - - // ==================== Session extras ==================== + "scheduled.tpl_daily_planning_desc": "根据你的任务和日程制定专注计划。", + "scheduled.tpl_daily_planning_name": "每日规划简报", + "scheduled.tpl_habit_checkin_desc": "每天进行快速自律检查。", + "scheduled.tpl_habit_checkin_name": "习惯打卡", + "scheduled.tpl_inbox_zero_desc": "汇总未读消息并起草简短回复。", + "scheduled.tpl_inbox_zero_name": "收件箱清零助手", + "scheduled.tpl_learning_digest_desc": "将保存的链接和笔记整理为每周摘要。", + "scheduled.tpl_learning_digest_name": "学习摘要", + "scheduled.tpl_meeting_prep_desc": "为明天的会议生成准备要点。", + "scheduled.tpl_meeting_prep_name": "会议准备笔记", + "scheduled.tpl_weekly_wins_desc": "创建周五的成果、阻碍和下一步总结。", + "scheduled.tpl_weekly_wins_name": "每周成果回顾", + "scheduled.view_scheduler_docs": "查看调度器文档", + "scheduled.weekdays_at": "工作日{time}", + "scheduled.weekends_at": "周末{time}", + "scheduled.worker_root_hint": "工作区根目录根据所选工作区推断。", + "scheduled.your_automations": "你的自动化", + "session.allow_for_session": "在会话期间允许", "session.allow_once": "一次", "session.api_key_saved": "API密钥已保存", "session.attachments_add_token": "添加服务器令牌以附加文件。", @@ -1278,12 +1147,16 @@ export default { "session.create_workspace_desc": "打开工作区创建器,选择如何开始。", "session.create_workspace_title": "创建工作区", "session.default_agent": "默认智能体", + "session.default_title": "新建会话", "session.delete": "删除", "session.delete_named_session_message": "这将永久删除「{title}」及其消息。", "session.delete_session_generic": "这将永久删除所选会话及其消息。", "session.delete_session_title": "删除会话?", "session.deleted": "会话已删除", "session.deleting": "正在删除…", + "session.deny": "拒绝", + "session.details": "详情", + "session.details_label": "详情", "session.doom_loop_label": "死循环", "session.doom_loop_message": "OpenCode检测到使用相同输入的重复工具调用,正在询问是否在多次失败后继续。", "session.doom_loop_note": "拒绝以停止循环,或允许以让智能体继续尝试。", @@ -1321,7 +1194,9 @@ export default { "session.loading_session": "正在加载会话", "session.loading_title": "正在加载会话", "session.menu_label": "菜单", + "session.model": "模型", "session.model_fallback": "模型", + "session.new_task": "新建任务", "session.next_match": "下一个匹配", "session.no_matches": "无匹配", "session.no_matches_command": "无匹配。", @@ -1332,13 +1207,16 @@ export default { "session.nothing_to_undo": "暂无可撤销的内容。", "session.oauth_failed": "OAuth失败", "session.obsidian_worker_relative_only": "仅可在Obsidian中打开工作区相对路径的文件。", + "session.open": "打开", "session.palette_hint_navigate": "方向键导航", "session.palette_hint_run": "回车执行 · Esc关闭", "session.palette_placeholder_actions": "搜索操作", "session.palette_placeholder_sessions": "按会话标题或工作区搜索", "session.palette_title_actions": "快捷操作", "session.palette_title_sessions": "搜索会话", + "session.permission_label": "权限", "session.permission_message": "OpenCode正在请求权限以继续。", + "session.permission_required": "需要权限", "session.phase_responding": "回复中", "session.phase_retrying": "重试中", "session.phase_run_failed": "运行失败", @@ -1355,12 +1233,19 @@ export default { "session.redo_label": "重做", "session.redo_title": "重做上一条撤销的消息", "session.remote_sync_failed": "远程文件同步失败", + "session.rename_description": "更新此会话名称。", + "session.rename_label": "会话名称", + "session.rename_placeholder": "输入新的名称", + "session.rename_title": "重命名会话", "session.resize_workspace_column": "调整工作区列宽", "session.restart_update_title": "重启以应用更新{version}", "session.restored_message": "已恢复撤销的消息。", + "session.reveal": "在文件管理器中显示", "session.reveal_desktop_only": "在桌面应用中可使用显示功能。", "session.revert_label": "撤销", "session.reverted_last_message": "已撤销上一条用户消息。", + "session.run": "运行", + "session.scope_label": "范围", "session.search_conversation_label": "搜索对话", "session.search_conversation_title": "搜索对话(Ctrl/Cmd+F)", "session.search_next": "下一个", @@ -1443,21 +1328,389 @@ export default { "session.workspace_setup_desc": "从引导式OpenWork工作区开始,或选择现有文件夹。", "session.workspace_setup_label": "工作区设置", "session.workspace_setup_title": "设置你的第一个工作区", - - // ==================== Settings tabs ==================== + "settings.action_download": "下载", + "settings.action_install": "安装", + "settings.actor_host": "主机", + "settings.actor_remote": "远程", + "settings.actor_unknown": "未知", + "settings.advanced": "高级", + "settings.advanced_title": "高级", + "settings.api_keys_info": "API密钥由OpenCode存储在本地。环境变量提供商需在工作区环境中修改后重新加载。", + "settings.appearance_hint": "匹配系统或强制浅色/深色模式。", + "settings.appearance_title": "外观", + "settings.audit_error": "错误", + "settings.audit_loading": "加载中", + "settings.audit_log_title": "审计日志", + "settings.audit_ready": "就绪", + "settings.auto_compact": "自动上下文压缩", + "settings.auto_compact_desc": "控制此工作区的OpenCode compaction.auto。更改后请重载引擎。", + "settings.auto_update_desc": "自动下载更新(安装前会提示)", + "settings.auto_update_title": "自动更新", + "settings.available_count": "{count}个可用", + "settings.background_checks_desc": "OpenWork启动时始终检查。同时每天检查一次。", + "settings.background_checks_title": "后台检查", + "settings.base_url_unavailable": "基础URL不可用", + "settings.binary_unavailable": "二进制文件不可用", + "settings.cache_nothing_to_repair": "未找到OpenCode缓存。无需修复。", + "settings.cache_repair_requires_desktop": "缓存修复需要桌面应用", + "settings.cache_repaired": "OpenCode缓存已修复。如果引擎正在运行,请重启。", + "settings.cap_browser_tools": "浏览器工具:{value}", + "settings.cap_commands": "命令:{value}", + "settings.cap_config": "配置:{value}", + "settings.cap_file_tools": "文件工具:{value}", + "settings.cap_inbox_off": "收件箱关闭", + "settings.cap_inbox_on": "收件箱开启", + "settings.cap_mcp": "MCP:{value}", + "settings.cap_outbox_off": "发件箱关闭", + "settings.cap_outbox_on": "发件箱开启", + "settings.cap_plugins": "插件:{value}", + "settings.cap_proxy": "代理(OpenCodeRouter):{value}", + "settings.cap_read": "读取", + "settings.cap_sandbox": "沙箱:{value}", + "settings.cap_skills": "Skills:{value}", + "settings.cap_write": "写入", + "settings.capabilities_title": "OpenWork服务器功能", + "settings.capabilities_unavailable": "功能不可用。请使用客户端令牌连接。", + "settings.change": "更改", + "settings.check_update": "检查", + "settings.checking_for_updates": "正在检查更新", + "settings.choose": "选择", + "settings.clear": "清除", + "settings.clipboard_unavailable": "此环境中剪贴板不可用。", + "settings.configure": "配置", + "settings.connect_opencode_hint": "连接OpenCode以加载提供商。", + "settings.connect_provider": "连接提供商", + "settings.connected_count": "{count}个已连接", + "settings.connection": "连接", + "settings.connection_failed": "连接失败", + "settings.connection_title": "连接", + "settings.copied_debug_report": "已复制运行时报告JSON。", + "settings.copy_failed": "复制运行时报告失败。", + "settings.copy_json": "复制JSON", + "settings.custom_binary_hint": "用于将OpenWork指向本地的OpenCode构建", + "settings.custom_binary_label": "自定义OpenCode二进制文件", + "settings.data_dir_unavailable": "数据目录不可用", + "settings.debug_commit": "提交:{sha}", + "settings.debug_desktop_app": "桌面应用:{version}", + "settings.debug_opencode_router_version": "OpenCodeRouter:{version}", + "settings.debug_opencode_version": "OpenCode:{version}", + "settings.debug_openwork_server_version": "OpenWork服务器:{version}", + "settings.debug_orchestrator_version": "编排器:{version}", + "settings.debug_section_title": "开发者", + "settings.deeplink_failed": "打开深层链接失败。", + "settings.deeplink_hint": "接受openwork://、openwork-dev://或原始支持的https://share.openworklabs.com/b/... URL。", + "settings.default_model": "默认模型", + "settings.delete_containers": "正在移除容器…", + "settings.delete_local_config": "正在移除本地状态…", + "settings.desktop_only_hint": "在桌面应用中可用。", + "settings.dev_mode_badge": "开发模式", + "settings.developer": "开发者", + "settings.developer_mode_desc": "启用调试工具、诊断信息和开发者标签页。", + "settings.developer_mode_title": "开发者模式", + "settings.developer_panel_disabled": "开发者面板已禁用。", + "settings.developer_panel_enabled": "开发者面板已启用。", + "settings.devlog_cleared": "已清除开发者日志输出。", + "settings.devlog_clipboard_unavailable": "此环境中剪贴板不可用。", + "settings.devlog_copied": "已复制开发者日志输出。", + "settings.devlog_copy_failed": "复制开发者日志输出失败。", + "settings.devlog_export_failed": "导出开发者日志输出失败。", + "settings.devlog_export_unavailable": "此环境中导出不可用。", + "settings.devlog_exported": "已导出开发者日志输出。", + "settings.devtools_desc": "Sidecar健康状态、功能和审计追踪。", + "settings.devtools_title": "开发者工具", + "settings.diag_approval": "审批:{mode}({ms}ms)", + "settings.diag_config_path": "配置路径:{path}", + "settings.diag_daemon_url": "守护进程:{url}", + "settings.diag_default": "默认", + "settings.diag_health_port": "健康端口:{port}", + "settings.diag_healthy_ms": "健康检查:{ms}ms", + "settings.diag_host_token_source": "主机令牌来源:{source}", + "settings.diag_last_attempt": "最后尝试:{time}", + "settings.diag_load_sessions_ms": "加载会话:{ms}ms", + "settings.diag_opencode_binary": "OpenCode二进制文件:{binary}", + "settings.diag_opencode_url": "OpenCode:{url}", + "settings.diag_pending_permissions_ms": "待处理权限:{ms}ms", + "settings.diag_pid": "PID:{pid}", + "settings.diag_providers_ms": "提供商:{ms}ms", + "settings.diag_read_only": "只读:{value}", + "settings.diag_reason": "原因:{reason}", + "settings.diag_runtime_workspace": "运行时工作区:{id}", + "settings.diag_selected_workspace": "已选工作区:{id}", + "settings.diag_sidecar": "Sidecar:{info}", + "settings.diag_started": "已启动:{time}", + "settings.diag_token_source": "令牌来源:{source}", + "settings.diag_total_ms": "总计:{ms}ms", + "settings.diag_version": "版本:{version}", + "settings.diag_workspaces": "工作区:{count}", + "settings.diagnostics_unavailable": "诊断不可用。", + "settings.disable_developer_mode": "禁用开发者模式", + "settings.disabled": "已禁用", + "settings.disconnect": "断开连接", + "settings.disconnect_confirm_suffix": "断开{resolved}?这将移除此提供商的已存储API密钥或OAuth凭据。", + "settings.disconnect_server": "断开服务器", + "settings.disconnected_prefix": "已断开{resolved}。", + "settings.disconnecting": "正在断开…", + "settings.docker_containers_desc": "强制移除OpenWork启动的Docker容器", + "settings.docker_containers_title": "OpenWork Docker容器", + "settings.docker_requires_desktop": "Docker清理需要桌面应用", + "settings.done": "完成", + "settings.downloading_bytes": "正在下载{downloaded}", + "settings.downloading_progress": "正在下载{downloaded} / {total}({percent}%)", + "settings.enable_developer_mode": "启用开发者模式", + "settings.enable_exa": "启用Exa网页搜索", + "settings.enable_exa_desc": "在OpenWork编排器启动OpenCode时生效。", + "settings.enabled": "已启用", + "settings.engine_bundled": "内置(推荐)", + "settings.engine_bundled_hint": "内置引擎是最可靠的选项。使用系统", + "settings.engine_custom_binary": "自定义二进制文件", + "settings.engine_desc": "选择OpenCode在本地运行的方式。", + "settings.engine_runtime_label": "引擎运行时", + "settings.engine_source": "引擎来源", + "settings.engine_source_debug": "引擎来源", + "settings.engine_system_path": "系统安装(PATH)", + "settings.engine_title": "引擎", + "settings.exa_restart_hint": "更改此设置后,请重启OpenCode或编排器。", + "settings.export": "导出", + "settings.export_failed": "导出运行时报告失败。", + "settings.export_unavailable": "此环境不支持导出。", + "settings.exported_debug_report": "已导出运行时报告JSON。", + "settings.failed": "失败", + "settings.failed_open_providers": "打开提供商失败", + "settings.feedback_badge": "我们阅读每条反馈", + "settings.feedback_desc": "告诉我们哪里体验流畅、哪里需要改进。反馈直达团队,帮助我们确定下一步优先级。", + "settings.feedback_title": "帮助塑造OpenWork", + "settings.group_global": "全局", + "settings.group_workspace": "工作区", + "settings.hide_titlebar": "隐藏标题栏", + "settings.hide_titlebar_desc": "隐藏窗口标题栏。适用于平铺式窗口管理器。", + "settings.join_discord": "加入Discord", + "settings.language": "语言", + "settings.language.description": "选择你的首选语言", + "settings.last_error": "最后错误", + "settings.last_stderr": "最后stderr", + "settings.last_stdout": "最后stdout", + "settings.loading_providers": "正在加载提供商…", + "settings.logs_on_host": "日志在主机上可用。", + "settings.managed_by_env": "由环境变量管理", + "settings.messaging_bridge_service": "消息桥接服务。", + "settings.messaging_section_desc": "在身份标签页中管理Telegram/Slack身份和绑定。", + "settings.messaging_section_title": "消息", + "settings.model": "模型", + "settings.model_behavior": "模型行为", + "settings.model_behavior_desc": "打开默认模型选择器,选择可用的推理配置。", + "settings.model_default": "默认", + "settings.model_description": "默认模型和运行时的思考控制。", + "settings.model_description_default": "从你配置的提供商中选择。此选择将用于新会话。", + "settings.model_description_session": "从你配置的提供商中选择。此选择适用于你的下一条消息。", + "settings.model_fallback": "备用", + "settings.model_reasoning": "推理", + "settings.model_section_desc": "选择默认对话模型并查看其推理方式。", + "settings.model_title": "模型", + "settings.no_access": "无权限", + "settings.no_active_workspace": "没有活动的本地工作区。", + "settings.no_audit_entries": "暂无审计记录。", + "settings.no_binary_selected": "未选择二进制文件。", + "settings.no_custom_path_set": "未设置自定义路径", + "settings.no_project_directory": "没有项目目录", + "settings.no_stderr": "尚未捕获stderr。", + "settings.no_stdout": "尚未捕获stdout。", + "settings.no_worker_directory": "没有项目目录", + "settings.no_worker_path": "工作区路径不可用", + "settings.nuke_confirm_dev": "此操作不可逆。将删除此开发构建的所有OpenWork数据以及所有隔离的OpenCode开发配置、认证、缓存、数据和状态,然后退出OpenWork。是否继续?", + "settings.nuke_confirm_prod": "此操作不可逆。将删除此开发构建的所有OpenWork数据以及所有隔离的OpenCode开发配置、认证、缓存、数据和状态,然后退出OpenWork。是否继续?", + "settings.nuke_failed": "移除OpenWork和OpenCode状态失败。", + "settings.nuke_hint": "仅在需要完全重置桌面应用及其OpenCode运行时状态时使用。", + "settings.nuke_success": "已移除OpenWork和OpenCode状态。OpenWork正在关闭…", + "settings.off": "关闭", + "settings.offline": "离线", + "settings.on": "开启", + "settings.open_deeplink_action": "正在打开…", + "settings.open_deeplink_button": "隐藏", + "settings.open_deeplink_desc": "粘贴OpenWork深度链接或共享URL以打开。", + "settings.open_deeplink_title": "打开深层链接", + "settings.opencode_cache": "OpenCode缓存", + "settings.opencode_cache_description": "修复用于启动引擎的缓存数据。可放心执行。", + "settings.opencode_engine_desc": "用于智能体、工具和模型提供商的本地运行时。", + "settings.opencode_engine_label": "OpenCode引擎", + "settings.opencode_engine_sidecar_desc": "本地执行sidecar。", + "settings.opencode_router_sidecar": "OpenCodeRouter sidecar", + "settings.opencode_runtime_desc": "本地引擎和编排器桥接的运行时选项。", + "settings.opencode_sdk_desc": "UI连接诊断。", + "settings.opencode_sdk_title": "OpenCode引擎", + "settings.opencode_section_label": "OpenCode", + "settings.opencode_url_unavailable": "基础URL不可用", + "settings.opening": "打开深层链接", + "settings.openwork_config_sidecar_desc": "配置和审批sidecar。", + "settings.openwork_diagnostics_title": "OpenWork服务器诊断", + "settings.openwork_server_desc": "用于应用同步、工作者和远程连接的会话控制平面。", + "settings.openwork_server_label": "OpenWork服务器", + "settings.orchestrator_daemon_layer_desc": "工作区编排层。", + "settings.orchestrator_daemon_title": "编排器守护进程", + "settings.pending_permissions": "待处理的权限", + "settings.production_mode_badge": "生产模式", + "settings.provider_default_desc": "使用模型内置的默认推理行为。", + "settings.provider_default_label": "提供商默认", + "settings.provider_source_config": "配置", + "settings.provider_source_custom": "自定义", + "settings.provider_source_env": "环境变量", + "settings.providers_desc": "连接用于模型和工具的服务。", + "settings.providers_title": "提供商", + "settings.quit_hint": "OpenWork在清理后立即退出,以便下次启动时从此模式的全新本地状态开始。", + "settings.recent_events": "最近的事件", + "settings.reconnect_failed": "重新连接失败。请检查服务器URL/令牌后重试。", + "settings.reconnect_server": "正在重新连接…", + "settings.reconnect_server_failed": "重新连接OpenWork服务器失败。", + "settings.reconnected": "已重新连接OpenWork服务器。", + "settings.reconnecting": "正在重新连接…", + "settings.removing_containers": "正在移除容器…", + "settings.removing_local_state": "正在移除本地状态…", + "settings.repair_cache": "修复缓存", + "settings.repairing_cache": "正在修复缓存", + "settings.report_issue": "报告问题", + "settings.reset": "重置", + "settings.reset_app_data": "重置应用数据", + "settings.reset_app_data_description": "更彻底的方式。清除OpenWork缓存和应用数据。", + "settings.reset_app_data_title": "重置应用数据", + "settings.reset_app_data_warning": "清除此设备上的OpenWork缓存和应用数据。", + "settings.reset_button": "重置", + "settings.reset_cancel": "取消", + "settings.reset_config_defaults": "正在重置…", + "settings.reset_config_failed": "重置应用配置失败。", + "settings.reset_confirm_button": "重置并重启", + "settings.reset_confirmation_hint": "输入 RESET 以确认。OpenWork将重启。", + "settings.reset_confirmation_label": "确认", + "settings.reset_confirmation_placeholder": "输入RESET", + "settings.reset_onboarding": "重置入门", + "settings.reset_onboarding_description": "清除OpenWork偏好设置并重启应用。", + "settings.reset_onboarding_title": "重置入门", + "settings.reset_onboarding_warning": "清除OpenWork本地偏好设置和工作区入门标记。", + "settings.reset_openwork_desc_dev": "在开发模式下,仅清除openwork-dev-data中的隔离OpenCode开发状态。", + "settings.reset_openwork_desc_prod": "在开发模式下,仅清除openwork-dev-data中的隔离OpenCode开发状态。", + "settings.reset_openwork_title": "重置OpenWork + OpenCode状态", + "settings.reset_recovery_desc": "清除数据或重新启动设置流程。", + "settings.reset_recovery_title": "重置和恢复", + "settings.reset_requires_confirm": "需要输入RESET,应用将重启。", + "settings.reset_startup": "重置默认启动模式", + "settings.reset_startup_pref": "重置启动偏好", + "settings.reset_stop_active_runs": "重置前停止活动运行。", + "settings.resetting": "正在重置…", + "settings.restart_blocked_message": "OpenWork需要重启以完成此更新。为避免中断当前工作,安装已暂停,直到你的活动运行完成或你手动停止它们。", + "settings.restart_failed": "重启失败。请检查日志后重试。", + "settings.restart_local_server": "正在重启…", + "settings.restart_opencode": "正在重启…", + "settings.restart_opencode_router": "正在重启…", + "settings.restart_openwork_server": "正在重启…", + "settings.restart_orchestrator": "正在重启…", + "settings.restart_server_failed": "重启本地服务器失败。", + "settings.restarted": "本地服务器已重启。", + "settings.restarting": "正在重启…", + "settings.reveal_config": "显示配置", + "settings.reveal_config_failed": "显示工作区配置失败。", + "settings.reveal_config_requires_desktop": "显示配置需要桌面应用", + "settings.revealed_workspace_config": "已显示工作区配置。", + "settings.run_sandbox_probe": "正在运行探测…", + "settings.running_probe": "正在运行探测…", + "settings.runtime_applies_hint": "将在引擎下次启动或重新加载时生效。", + "settings.runtime_debug_desc": "可读的诊断快照,支持一键导出。", + "settings.runtime_debug_title": "运行时调试报告", + "settings.runtime_desc": "本地引擎和OpenWork服务器的状态。", + "settings.runtime_direct": "直连(OpenCode)", + "settings.runtime_orchestrator": "OpenWork编排器", + "settings.runtime_title": "运行时", + "settings.sandbox_error": "错误", + "settings.sandbox_export_hint": "使用上方运行时调试报告中的导出功能", + "settings.sandbox_probe_desc": "运行临时Docker沙箱启动检查并", + "settings.sandbox_probe_errors": "沙箱探测完成,存在错误。", + "settings.sandbox_probe_failed": "沙箱探测失败。", + "settings.sandbox_probe_success": "沙箱探测成功。导出调试报告以获取支持。", + "settings.sandbox_probe_title": "沙箱探测", + "settings.sandbox_ready": "就绪", + "settings.sandbox_requires_desktop": "沙箱探测需要桌面应用", + "settings.sandbox_result": "结果:{status}", + "settings.sandbox_run_id": "运行ID:{id}", + "settings.sandbox_stop_runs_hint": "探测前请停止活动运行", + "settings.search_models": "搜索模型…", + "settings.select_binary": "选择OpenCode二进制文件", + "settings.select_workspace_first": "请先选择本地工作区再显示配置。", + "settings.send_feedback": "发送反馈", + "settings.service_restarts_desc": "无需离开此页面即可重启特定主机服务", + "settings.service_restarts_title": "服务重启", + "settings.session_model": "模型", + "settings.show_model_reasoning": "显示模型推理", + "settings.show_model_reasoning_desc": "当模型提供推理过程时,在界面中展开推理轨迹。", + "settings.showing_models": "显示{count} / {total}", + "settings.sidecar_config_unavailable": "Sidecar配置不可用", + "settings.startup": "启动", + "settings.startup_local": "启动本地服务器", + "settings.startup_not_set": "连接服务器", + "settings.startup_remote_warning": "启动偏好当前为远程。引擎设置", + "settings.startup_reset_hint": "这将清除你保存的偏好并显示连接", + "settings.startup_server": "连接服务器", + "settings.startup_title": "启动", + "settings.stop_local_server": "停止本地服务器", + "settings.stop_runs_before_cleanup": "清理前请停止活动运行", + "settings.stop_runs_before_reset_config": "重置配置前请停止活动运行", + "settings.stop_runs_to_reset": "停止活动运行以重置", + "settings.switch": "切换", "settings.tab_advanced": "高级", "settings.tab_appearance": "外观", "settings.tab_automations": "自动化", "settings.tab_cloud": "Cloud", "settings.tab_debug": "调试", + "settings.tab_description_advanced": "检查运行时健康状态、连接状态和面向开发者的控制项。", + "settings.tab_description_appearance": "调整OpenWork在桌面、系统主题和应用外观方面的显示效果。", + "settings.tab_description_automations": "从工作区设置中创建和管理定时自动化。", + "settings.tab_description_debug": "查看运行时诊断信息、日志和底层调试工具。", + "settings.tab_description_den": "管理OpenWork Cloud连接、托管工作区和工作区访问。", + "settings.tab_description_extensions": "管理此工作区的MCP应用和OpenCode插件。", + "settings.tab_description_general": "连接提供商、选择默认模型、授权文件夹,以及控制所选OpenWork工作区和运行时连接。", + "settings.tab_description_messaging": "从工作区设置中配置路由身份和收件箱行为。", + "settings.tab_description_model": "调整默认模型、运行时行为和助手输出设置。", + "settings.tab_description_recovery": "修复迁移状态、重置工作区默认值和恢复本地设置。", + "settings.tab_description_skills": "在设置中浏览、编辑和安装skills。", + "settings.tab_description_updates": "通过静默后台检查和安装控制保持应用为最新版本。", "settings.tab_extensions": "扩展", "settings.tab_general": "设置", "settings.tab_messaging": "消息", + "settings.tab_model": "模型", "settings.tab_recovery": "恢复", "settings.tab_skills": "Skills(技能)", "settings.tab_updates": "更新", - - // ==================== Share workspace modal ==================== + "settings.theme_dark": "深色", + "settings.theme_light": "浅色", + "settings.theme_system": "系统", + "settings.theme_system_hint": "系统模式自动跟随你的操作系统偏好。", + "settings.toolbar_ready_to_install": "准备安装", + "settings.update": "更新", + "settings.update_available": "可用更新:v", + "settings.update_available_version": "可用更新:v{version}", + "settings.update_check_button": "检查", + "settings.update_check_failed": "更新检查失败", + "settings.update_checking": "检查中...", + "settings.update_download_button": "下载", + "settings.update_downloading": "下载中...", + "settings.update_error": "更新检查失败", + "settings.update_install_button": "安装并重启", + "settings.update_last_checked": "上次检查{time}", + "settings.update_published": "发布时间{date}", + "settings.update_ready": "准备安装:v", + "settings.update_ready_version": "准备安装:v{version}", + "settings.update_uptodate": "已是最新", + "settings.updates": "更新", + "settings.updates_desc": "保持OpenWork为最新版本。", + "settings.updates_desktop_only": "更新仅在桌面应用中可用。", + "settings.updates_not_supported": "此环境不支持更新。", + "settings.updates_title": "更新", + "settings.version": "版本", + "settings.versions_desc": "Sidecar + 桌面版构建信息。", + "settings.versions_title": "版本", + "settings.window_appearance_desc": "自定义窗口外观。", + "settings.worker_id_label": "工作区{id}", + "settings.worker_unresolved": "工作区{runtimeWorkspaceId}", + "settings.workspace_config_desc": ".opencode/openwork.json", + "settings.workspace_config_title": "工作区配置", + "settings.workspace_debug_events_label": "工作区调试事件", + "settings.workspace_fallback_name": "工作区", "share.active_cloud_org": "当前Cloud组织", "share.back_hint": "返回分享选项", "share.chooser_subtitle": "选择分享此工作区的方式。", @@ -1520,33 +1773,33 @@ export default { "share.workspace_fallback": "工作区", "share.workspace_template_desc": "分享核心配置和工作区默认值。", "share.workspace_template_title": "工作区模板", - - // ==================== Share skill destination ==================== + "share_skill_destination.add_to_workspace": "添加到工作区", + "share_skill_destination.adding": "正在添加…", "share_skill_destination.confirm_busy": "正在添加skill…", "share_skill_destination.confirm_button": "将skill添加到工作区", "share_skill_destination.connect_remote": "连接远程工作区", "share_skill_destination.connect_remote_desc": "连接OpenWork主机,然后从列表中选择以导入此skill。", + "share_skill_destination.connect_remote_hint": "连接远程工作区以导入skill", "share_skill_destination.create_worker": "新建工作区", "share_skill_destination.create_worker_desc": "打开工作区创建流程,新工作区就绪后添加此skill。", + "share_skill_destination.create_worker_hint": "创建新工作区以导入skill", "share_skill_destination.current_badge": "当前", "share_skill_destination.existing_workers": "现有工作区", "share_skill_destination.fallback_skill_name": "共享skill", "share_skill_destination.footer_idle": "选择一个工作区以继续。", "share_skill_destination.footer_selected": "已选择工作区:", "share_skill_destination.local_badge": "本地", + "share_skill_destination.more_options": "更多选项", "share_skill_destination.new_destination": "新建目标", "share_skill_destination.no_workers": "暂无就绪的工作区。请创建或连接远程工作区以安装此skill。", "share_skill_destination.remote_badge": "远程", "share_skill_destination.sandbox_badge": "沙箱", "share_skill_destination.selected_badge": "已选择", "share_skill_destination.selected_hint": "已选择。请确认下方的目标后提交。", - "share_skill_destination.selection_ready": "准备添加", "share_skill_destination.skill_label": "共享skill", "share_skill_destination.subtitle": "选择现有工作区或新建一个,然后导入此共享skill。", "share_skill_destination.title": "这个skill放在哪里?", "share_skill_destination.trigger_label": "触发器", - - // ==================== Sidebar ==================== "sidebar.active": "活动", "sidebar.add_workspace": "添加新工作区", "sidebar.collapse": "收起", @@ -1558,20 +1811,19 @@ export default { "sidebar.import_config": "导入配置", "sidebar.needs_attention": "需要关注", "sidebar.new_worker": "新建工作区", - "sidebar.no_sessions_yet": "暂无会话", "sidebar.no_workspaces": "此会话中暂无工作区。添加一个以开始。", "sidebar.progress": "进度", - "sidebar.remove_workspace": "移除工作区", "sidebar.show_fewer": "收起", "sidebar.show_more": "显示更多{count}个", "sidebar.stop_sandbox": "停止沙箱", "sidebar.switch": "切换", "sidebar.test_connection": "测试连接", - - // ==================== Skills extras ==================== + "skills.add_custom_repo": "添加自定义GitHub仓库", + "skills.add_git_repo": "添加Git仓库", + "skills.add_openwork_hub": "添加OpenWork Hub", + "skills.available_from_hub": "从Hub获取", "skills.catalog_search_placeholder": "搜索已安装、团队和中心skills", "skills.cloud_add_skill": "添加skill", - "skills.cloud_badge": "Cloud", "skills.cloud_choose_org_detail": "在Cloud面板中选择活动组织,然后刷新此列表。", "skills.cloud_choose_org_hint": "在设置 → Cloud中选择组织以加载团队skills。", "skills.cloud_footer_label": "团队", @@ -1585,47 +1837,189 @@ export default { "skills.cloud_org_fallback": "OpenWork Cloud", "skills.cloud_org_load_failed": "加载组织skills失败。", "skills.cloud_refresh": "刷新团队skills", - "skills.cloud_section_subtitle": - "通过OpenWork Cloud与你共享的skills — 包括你可访问的团队skill中心。", + "skills.cloud_section_subtitle": "通过OpenWork Cloud与你共享的skills — 包括你可访问的团队skill中心。", "skills.cloud_section_title": "来自你的组织", "skills.cloud_shared_org": "组织", "skills.cloud_shared_public": "公开", "skills.cloud_sign_in": "登录Cloud", "skills.cloud_sign_in_hint": "登录OpenWork Cloud以浏览团队和组织skills。", + "skills.copy_link_failed": "复制链接失败", + "skills.create_in_chat": "在聊天中创建skill", + "skills.desktop_required": "Skills管理需要桌面应用。", + "skills.enter_plugin_name": "输入插件包名称。", + "skills.failed_load_active": "加载活动插件失败。", + "skills.failed_load_opencode": "加载opencode.json失败", + "skills.failed_parse_opencode": "解析opencode.json失败", + "skills.failed_to_load": "加载skills失败", + "skills.failed_update_opencode": "更新opencode.json失败", "skills.filter_all": "全部", "skills.filter_cloud": "团队", "skills.filter_hub": "Hub", "skills.filter_installed": "已安装", - - // ==================== Status bar ==================== + "skills.from_repo": "来自{owner}/{repo}", + "skills.github_repo_hint": "输入owner/repo格式的GitHub仓库。", + "skills.host_mode_only": "仅本地工作区", + "skills.host_only_error": "Skills管理需要本地工作区或已连接的OpenWork服务器。", + "skills.hub_desc": "浏览来自GitHub支持的Hub的共享skills,并将其添加到此工作区。", + "skills.hub_label": "Hub", + "skills.import": "导入", + "skills.import_failed": "导入失败({status})", + "skills.import_local": "导入本地skill", + "skills.import_local_hint": "将现有skill文件夹复制到此工作区。", + "skills.import_local_skill": "导入本地skill", + "skills.imported": "已导入。", + "skills.install": "安装", + "skills.install_failed": "Skills安装失败。", + "skills.install_name_title": "安装{name}", + "skills.install_skill_creator": "安装skill creator", + "skills.install_skill_creator_hint": "此skill可让你在聊天中创建其他skills。", + "skills.installed": "已安装的skills", + "skills.installed_desc": "已安装的skills存储在此工作区中,可以编辑或分享。", + "skills.installed_label": "已安装", + "skills.installed_status": "已安装", + "skills.installing": "添加skill", + "skills.installing_prefix": "正在安装{name}…", + "skills.installing_skill_creator": "正在安装skill creator...", + "skills.link_copied": "链接已复制", + "skills.loading": "正在加载…", + "skills.no_description": "暂无描述。", + "skills.no_hub_repo_label": "未选择Hub仓库", + "skills.no_hub_repo_selected": "暂无可用的Hub skills。", + "skills.no_hub_skills": "未选择Hub仓库。添加GitHub仓库以浏览skills。", + "skills.no_opencode_found": "尚未找到opencode.json。添加插件以创建一个。", + "skills.no_opencode_workspace": "此工作区中还没有opencode.json。", + "skills.no_skills": "在`.opencode/skills`、`.claude/skills`或`~/.agents/skills`中未检测到skills。", + "skills.no_skills_found": "还没有找到skills。", + "skills.owner_label": "所有者", + "skills.owner_repo_required": "所有者和仓库为必填项。", + "skills.pick_project_first": "先选择一个项目文件夹。", + "skills.pick_project_for_active": "选择项目文件夹以加载活动插件。", + "skills.pick_project_for_plugins": "选择项目文件夹以管理项目插件。", + "skills.pick_workspace_first": "先选择一个工作区文件夹。", + "skills.plugin_already_listed": "插件已在opencode.json中列出。", + "skills.plugin_management_host_only": "插件管理需要桌面应用。", + "skills.plugins_host_only": "插件仅在桌面应用中可用。", + "skills.ref_label": "引用(分支/标签/提交)", + "skills.refresh": "刷新", + "skills.refresh_hub": "刷新Hub", + "skills.refresh_hub_title": "刷新Hub目录", + "skills.remove_saved_repo": "移除已保存的仓库", + "skills.repo_label": "仓库", + "skills.reveal_failed": "打开skills文件夹失败。", + "skills.reveal_folder": "打开skills文件夹", + "skills.reveal_folder_hint": "在文件管理器中打开skills目录。", + "skills.save_and_load": "保存并加载", + "skills.save_failed": "保存skill失败。", + "skills.select_skill_folder": "选择skill文件夹", + "skills.share_back": "返回", + "skills.share_chooser_subtitle": "保存到OpenWork Cloud组织,或发布公开安装链接。", + "skills.share_close": "关闭", + "skills.share_copy_link": "复制", + "skills.share_done": "完成", + "skills.share_option_public_desc": "创建任何人都可以使用的安装链接。", + "skills.share_option_public_title": "公开链接", + "skills.share_option_team_desc": "将此skill添加到当前OpenWork Cloud组织。", + "skills.share_option_team_title": "与团队分享", + "skills.share_public_create": "创建链接", + "skills.share_public_creating": "发布中…", + "skills.share_public_intro": "发布公开链接。拥有URL的任何人都可以安装此skill。", + "skills.share_public_regenerate": "重新生成链接", + "skills.share_publisher_label": "发布方", + "skills.share_subtitle_public": "拥有链接的任何人都可以安装此skill。", + "skills.share_subtitle_team": "保存在组织中供队友使用。", + "skills.share_team_choose_org": "请先在设置 → Cloud中选择组织。", + "skills.share_team_hub_label": "添加到skill中心(可选)", + "skills.share_team_hub_none": "仅组织 — 不加入中心", + "skills.share_team_hubs_loading": "正在加载中心…", + "skills.share_team_intro": "保存到当前组织,队友可从Cloud安装。", + "skills.share_team_org_fallback": "当前Cloud组织", + "skills.share_team_save": "保存到团队", + "skills.share_team_saving": "保存中…", + "skills.share_team_sign_in": "登录后与团队分享", + "skills.share_team_sign_in_hint": "浏览器将打开OpenWork Cloud。登录后返回此处。", + "skills.share_team_success": "已保存到{org}。队友可从组织skill安装。", + "skills.share_title": "分享skill", + "skills.shown_count": "显示{count}个", + "skills.skill_creator_already_installed": "Skill creator已经安装过了。", + "skills.skill_creator_installed": "Skill creator已安装。", + "skills.skill_load_failed": "加载skill失败。", + "skills.source_label": "来源", + "skills.subtitle": "管理此工作区的skills。", + "skills.title": "Skills(技能)", + "skills.trigger_label": "触发器:{trigger}", + "skills.uninstall": "卸载", + "skills.uninstall_failed": "卸载skill失败。", + "skills.uninstall_title": "卸载skill?", + "skills.uninstall_warning": "这将永久从工作区删除`{name}` skill。", + "skills.uninstalled": "Skill已删除。", + "skills.unknown_error": "未知错误", + "skills.worker_profile_desc": "Skills是此工作区的核心能力。从Hub发现、管理已安装的skills,并在聊天中直接创建新的skills。", "status.back": "返回上一页", + "status.connected": "已连接", + "status.connecting": "正在连接", + "status.creating_task": "正在创建新任务", + "status.creating_workspace": "正在创建工作区", "status.developer_mode": "开发者模式", + "status.disconnected": "已断开", "status.disconnected_hint": "打开设置以重新连接", "status.disconnected_label": "已断开", + "status.disconnecting": "正在断开连接", "status.feedback": "反馈", + "status.idle": "空闲", + "status.installing_opencode": "正在安装OpenCode", "status.limited_hint": "重新连接以恢复完整OpenWork功能", "status.limited_mcp_hint": "{count}个MCP已连接 · 重新连接以恢复完整功能", "status.limited_mode": "受限模式", + "status.live": "实时", + "status.loading_session": "正在加载会话", "status.mcp_connected": "{count}个MCP已连接", "status.openwork_ready": "OpenWork就绪", "status.providers_connected": "{count}个提供商已连接", "status.ready_for_tasks": "可接受新任务", + "status.reloading_engine": "正在重新加载引擎", + "status.restarting_engine": "正在重启引擎", + "status.running": "运行中", "status.send_feedback": "发送反馈", "status.settings": "设置", - - // ==================== Workspace extras ==================== - "workspace.active": "活动", + "status.starting_engine": "正在启动引擎", + "system.cache_repair_requires_desktop": "缓存修复需要桌面应用。", + "system.docker_cleanup_requires_desktop": "Docker清理需要桌面应用。", + "system.reload_body_agents": "OpenCode在启动时加载Agent。重新加载引擎以使更新的Agent可用。", + "system.reload_body_commands": "OpenCode在启动时加载命令。重新加载引擎以使更新的命令可用。", + "system.reload_body_config": "OpenCode在启动时读取opencode.json。重新加载引擎以应用配置变更。", + "system.reload_body_default": "OpenWork检测到需要重新加载OpenCode实例的变更。", + "system.reload_body_mcp": "OpenCode在启动时加载MCP服务器。重新加载引擎以激活新连接。", + "system.reload_body_mixed": "OpenWork检测到OpenCode配置变更。重新加载引擎以应用。", + "system.reload_body_plugins": "OpenCode在启动时加载npm插件。重新加载引擎以应用opencode.json变更。", + "system.reload_body_skills": "OpenCode会缓存技能发现/状态。重新加载引擎以使新安装的技能可用。", + "system.reload_failed": "重新加载引擎失败。", + "system.reload_required": "需要重新加载", + "system.reload_unavailable": "此工作区不支持重新加载。", + "system.stop_active_runs_before_reset": "请先停止活跃的运行再重置。", + "system.stop_runs_before_update": "安装更新前请先停止活跃的运行。", + "system.updates_not_supported": "此环境不支持更新。", + "time.hours_ago": "{count}小时前", + "time.just_now": "刚刚", + "time.minutes_ago": "{count}分钟前", + "time.seconds_ago": "{count}秒前", "workspace.loading_tasks": "正在加载任务…", "workspace.local_badge": "本地", - "workspace.needs_attention": "需要关注", "workspace.new_task_inline": "+ 新建任务", "workspace.no_tasks": "暂无任务。", "workspace.remote_badge": "远程", + "workspace.rename_description": "更新侧边栏中显示的名称。", + "workspace.rename_label": "工作区名称", + "workspace.rename_placeholder": "设计团队工作区", + "workspace.rename_title": "编辑工作区名称", "workspace.sandbox_badge": "沙箱", "workspace.selected": "已选择", "workspace.switch": "切换", - - // ==================== Workspace session list ==================== + "workspace.switching_status_connecting": "正在检查连接", + "workspace.switching_status_loading": "正在加载最近任务", + "workspace.switching_status_preparing": "正在准备", + "workspace.switching_subtitle": "马上带你回到最近的工作。", + "workspace.switching_title": "正在打开{name}", + "workspace.switching_title_unknown": "正在打开工作区", "workspace_list.add_workspace": "添加工作区", "workspace_list.connect_remote": "连接远程工作区", "workspace_list.connecting": "正在连接…", @@ -1649,8 +2043,6 @@ export default { "workspace_list.test_connection": "测试连接", "workspace_list.workspace_fallback": "工作区", "workspace_list.workspace_options": "工作区选项", - - // ==================== Workspace right sidebar ==================== "workspace_sidebar.automations": "自动化", "workspace_sidebar.close_sidebar": "关闭侧边栏", "workspace_sidebar.collapse_sidebar": "收起侧边栏", diff --git a/scripts/i18n-audit.mjs b/scripts/i18n-audit.mjs new file mode 100644 index 000000000..2909b2b06 --- /dev/null +++ b/scripts/i18n-audit.mjs @@ -0,0 +1,491 @@ +#!/usr/bin/env node +/** + * i18n-audit.mjs — Find missing translations and improperly used translation keys. + * + * Usage: + * node scripts/i18n-audit.mjs # full audit (default, excludes --hardcoded, --aliases, --prune, --sort) + * node scripts/i18n-audit.mjs --missing # missing keys (in EN but not in locale) + * node scripts/i18n-audit.mjs --orphan # orphan keys (in locale but not in EN) + * node scripts/i18n-audit.mjs --duplicates # duplicate keys in any locale + * node scripts/i18n-audit.mjs --unused # unused keys (in EN but not referenced in repo) + * node scripts/i18n-audit.mjs --dangling # t() calls referencing keys not in en.ts + * node scripts/i18n-audit.mjs --aliases # aliased t() calls (translate/tr instead of t) + * node scripts/i18n-audit.mjs --placeholders # placeholder integrity check + * node scripts/i18n-audit.mjs --hardcoded # hardcoded English strings in source files + * node scripts/i18n-audit.mjs --prune # (destructive) remove unused keys from all locales + * node scripts/i18n-audit.mjs --sort # (destructive) alphabetically sort keys in all locales + */ + +import { readFileSync, readdirSync, existsSync, writeFileSync } from "node:fs"; +import { join, basename, dirname, resolve } from "node:path"; +import { fileURLToPath } from "node:url"; + +const __dirname = dirname(fileURLToPath(import.meta.url)); +const REPO_ROOT = resolve(__dirname, ".."); +const LOCALES_DIR = join(REPO_ROOT, "apps/app/src/i18n/locales"); +const APP_SRC = join(REPO_ROOT, "apps/app/src"); + +const LOCALES = ["ja", "zh", "vi", "pt-BR", "th"]; +const EN_FILE = join(LOCALES_DIR, "en.ts"); + +const mode = process.argv[2] ?? "--all"; +const EXCLUDED_FROM_ALL = new Set(["--hardcoded", "--aliases"]); +const shouldRun = (...modes) => (mode === "--all" && !modes.some((m) => EXCLUDED_FROM_ALL.has(m))) || modes.includes(mode); + +// --------------------------------------------------------------------------- +// Helpers +// --------------------------------------------------------------------------- + +/** Parse a locale .ts file into a JS object via eval. */ +function parseLocale(filePath) { + const content = readFileSync(filePath, "utf-8"); + const match = content.match(/export default \{([\s\S]*?)\} as const;/); + if (!match) throw new Error(`Could not parse ${filePath}`); + return new Function(`return {${match[1]}}`)(); +} + +/** Extract translation keys from a locale .ts file (as a Set). */ +function extractKeys(filePath) { + return new Set(Object.keys(parseLocale(filePath))); +} + +/** Extract key→value map from a locale .ts file. */ +function extractKeyValues(filePath) { + return new Map(Object.entries(parseLocale(filePath))); +} + +/** Find all {placeholders} in a string. */ +function findPlaceholders(str) { + return [...str.matchAll(/\{([a-z_]+)\}/g)].map((m) => m[0]).sort(); +} + +/** Recursively collect all .ts/.tsx files under a directory. */ +function collectSourceFiles(dir, exclude) { + const results = []; + for (const entry of readdirSync(dir, { withFileTypes: true })) { + const full = join(dir, entry.name); + if (entry.isDirectory()) { + if (exclude && exclude(full)) continue; + results.push(...collectSourceFiles(full, exclude)); + } else if (/\.(ts|tsx)$/.test(entry.name)) { + results.push(full); + } + } + return results; +} + +/** Group an array of strings by prefix (before first dot). */ +function groupByPrefix(keys) { + const groups = new Map(); + for (const key of keys) { + const prefix = key.split(".")[0]; + groups.set(prefix, (groups.get(prefix) ?? 0) + 1); + } + return [...groups.entries()].sort((a, b) => b[1] - a[1]); +} + +/** Find duplicate keys in a file (must use regex — JSON.parse dedupes silently). */ +function findDuplicates(filePath) { + const content = readFileSync(filePath, "utf-8"); + const seen = new Map(); + const dupes = []; + for (const match of content.matchAll(/^\s*"([^"]+)"\s*:/gm)) { + const key = match[1]; + if (seen.has(key)) dupes.push(key); + else seen.set(key, true); + } + return dupes; +} + +// --------------------------------------------------------------------------- +// Audit +// --------------------------------------------------------------------------- + +const enKeys = extractKeys(EN_FILE); +const enKeyValues = extractKeyValues(EN_FILE); +let exitCode = 0; + +console.log("╔══════════════════════════════════════════════════╗"); +console.log("║ i18n Audit Report ║"); +console.log("╚══════════════════════════════════════════════════╝"); +console.log(); + +// --- 1. Key counts --- +console.log("=== Key counts ==="); +console.log(` en ${enKeys.size} keys (source of truth)`); +for (const locale of LOCALES) { + const file = join(LOCALES_DIR, `${locale}.ts`); + if (!existsSync(file)) { + console.log(` ${locale.padEnd(8)} MISSING FILE`); + continue; + } + const keys = extractKeys(file); + const pct = Math.round((keys.size / enKeys.size) * 100); + console.log(` ${locale.padEnd(8)} ${keys.size} keys (${pct}%)`); +} +console.log(); + +// --- 2. Missing keys --- +if (shouldRun("--missing")) { + console.log("=== Missing keys (in en.ts but not in locale) ==="); + for (const locale of LOCALES) { + const file = join(LOCALES_DIR, `${locale}.ts`); + if (!existsSync(file)) continue; + const localeKeys = extractKeys(file); + const missing = [...enKeys].filter((k) => !localeKeys.has(k)); + + if (missing.length === 0) { + console.log(` ${locale}: ✓ no missing`); + } else { + console.log(` ${locale}: ✗ ${missing.length} missing`); + exitCode = 1; + if (mode !== "--summary") { + for (const [prefix, count] of groupByPrefix(missing).slice(0, 15)) { + console.log(` ${String(count).padStart(4)} ${prefix}.*`); + } + const totalGroups = new Set(missing.map((k) => k.split(".")[0])).size; + if (totalGroups > 15) console.log(` ... and ${totalGroups - 15} more groups`); + } + } + } + console.log(); +} + +// --- 3. Orphan keys --- +if (shouldRun("--orphan")) { + console.log("=== Orphan keys (in locale but not in en.ts) ==="); + for (const locale of LOCALES) { + const file = join(LOCALES_DIR, `${locale}.ts`); + if (!existsSync(file)) continue; + const localeKeys = extractKeys(file); + const orphans = [...localeKeys].filter((k) => !enKeys.has(k)); + + if (orphans.length === 0) { + console.log(` ${locale}: ✓ no orphans`); + } else { + console.log(` ${locale}: ⚠ ${orphans.length} orphan keys`); + if (mode !== "--summary") { + for (const key of orphans.slice(0, 10)) console.log(` ${key}`); + if (orphans.length > 10) console.log(` ... and ${orphans.length - 10} more`); + } + } + } + console.log(); +} + +// --- 4. Duplicate keys --- +if (shouldRun("--duplicates")) { + console.log("=== Duplicate keys ==="); + for (const locale of ["en", ...LOCALES]) { + const file = join(LOCALES_DIR, `${locale}.ts`); + if (!existsSync(file)) continue; + const dupes = findDuplicates(file); + if (dupes.length === 0) { + console.log(` ${locale}: ✓ no duplicates`); + } else { + console.log(` ${locale}: ✗ ${dupes.length} duplicate keys`); + exitCode = 1; + if (mode !== "--summary") { + for (const key of dupes.slice(0, 5)) console.log(` ${key}`); + } + } + } + console.log(); +} + +// --- 5. Unused keys --- +if (shouldRun("--unused", "--prune")) { + console.log("=== Unused keys (in en.ts but never referenced in repo) ==="); + + // Search the ENTIRE repo (not just apps/app/src) for key references + const repoSourceFiles = collectSourceFiles(REPO_ROOT, (dir) => + ["node_modules", ".git", "target", "dist", ".next", "locales"].some((x) => dir.includes(x)), + ); + const allSource = repoSourceFiles.map((f) => readFileSync(f, "utf-8")).join("\n"); + + const unused = [...enKeys].filter((key) => !allSource.includes(key)); + + if (unused.length === 0) { + console.log(" ✓ all keys referenced in source"); + } else { + console.log(` ⚠ ${unused.length} potentially unused keys`); + if (mode !== "--summary") { + for (const [prefix, count] of groupByPrefix(unused).slice(0, 15)) { + console.log(` ${String(count).padStart(4)} ${prefix}.*`); + } + if (mode === "--unused") { + console.log(); + for (const key of unused) console.log(` ${key}`); + } + } + } + + // --- Prune mode --- + if (mode === "--prune" && unused.length > 0) { + console.log(); + console.log(` Pruning ${unused.length} unused keys from all locale files...`); + const unusedSet = new Set(unused); + const allLocaleFiles = ["en", ...LOCALES].map((l) => join(LOCALES_DIR, `${l}.ts`)); + + for (const file of allLocaleFiles) { + if (!existsSync(file)) continue; + const content = readFileSync(file, "utf-8"); + const lines = content.split("\n"); + const filtered = []; + let skipNextLine = false; + + for (let i = 0; i < lines.length; i++) { + if (skipNextLine) { + skipNextLine = false; + continue; + } + const keyMatch = lines[i].match(/^\s*"([^"]+)"\s*:/); + if (keyMatch && unusedSet.has(keyMatch[1])) { + // Check if value is on the next line (multi-line entry) + if (!lines[i].includes('",') && !lines[i].includes('": "') && i + 1 < lines.length) { + skipNextLine = true; + } + continue; // skip this line + } + filtered.push(lines[i]); + } + + writeFileSync(file, filtered.join("\n")); + const locale = basename(file, ".ts"); + const removed = lines.length - filtered.length; + console.log(` ${locale}: removed ${removed} lines`); + } + } + console.log(); +} + +// --- 6. Dangling t() calls (referencing keys not in en.ts) --- +if (shouldRun("--dangling")) { + console.log("=== Dangling t() calls (keys not in en.ts) ==="); + + const sourceFiles = collectSourceFiles(APP_SRC, (dir) => dir.includes("locales")); + // Match t("key.name"), t("key.name", ...), translate("key.name"), tr("key.name") + const keyRefPattern = /\b(?:t|translate|tr)\(\s*"([a-z][a-z0-9_]*\.[a-z][a-z0-9_.]*?)"/g; + + const dangling = []; + for (const file of sourceFiles) { + const content = readFileSync(file, "utf-8"); + const lines = content.split("\n"); + for (let i = 0; i < lines.length; i++) { + for (const match of lines[i].matchAll(keyRefPattern)) { + const key = match[1]; + if (!enKeys.has(key)) { + dangling.push({ key, file: file.replace(REPO_ROOT + "/", ""), line: i + 1 }); + } + } + } + } + + if (dangling.length === 0) { + console.log(" ✓ all t() keys exist in en.ts"); + } else { + console.log(` ✗ ${dangling.length} dangling references`); + exitCode = 1; + if (mode !== "--summary") { + for (const { key, file, line } of dangling) { + console.log(` ${file}:${line} → "${key}"`); + } + } + } + console.log(); + + // --- 7. Dynamic t() calls (keys built at runtime) --- + console.log("=== Dynamic t() calls (keys built at runtime) ==="); + const dynamicPattern = /\b(?:t|translate|tr)\(\s*(`[^`]*\$\{|[^"'][^,)]*\+)/g; + const dynamicHits = []; + for (const file of sourceFiles) { + const content = readFileSync(file, "utf-8"); + const lines = content.split("\n"); + for (let i = 0; i < lines.length; i++) { + if (dynamicPattern.test(lines[i])) { + dynamicHits.push({ file: file.replace(REPO_ROOT + "/", ""), line: i + 1, text: lines[i].trim() }); + } + dynamicPattern.lastIndex = 0; + } + } + + if (dynamicHits.length === 0) { + console.log(" ✓ no dynamic key construction"); + } else { + console.log(` ✗ ${dynamicHits.length} dynamic key constructions (should be static strings)`); + exitCode = 1; + for (const { file, line, text } of dynamicHits) { + console.log(` ${file}:${line}`); + console.log(` ${text.slice(0, 120)}`); + } + } + console.log(); +} + +// --- 8. Aliased t() calls (should use t() directly, not translate/tr wrappers) --- +if (shouldRun("--aliases")) { + console.log("=== Aliased t() calls (should use t() directly) ==="); + + const aliasSourceFiles = collectSourceFiles(APP_SRC, (dir) => dir.includes("locales")); + const aliasPattern = /\b(?:translate|tr)\s*\(/g; + const aliasDefPattern = /(?:const|function)\s+(?:translate|tr)\s*[=(]/; + const hits = []; + + for (const file of aliasSourceFiles) { + const content = readFileSync(file, "utf-8"); + const lines = content.split("\n"); + for (let i = 0; i < lines.length; i++) { + // Skip alias definitions themselves + if (aliasDefPattern.test(lines[i])) continue; + if (aliasPattern.test(lines[i])) { + hits.push({ file: file.replace(REPO_ROOT + "/", ""), line: i + 1, text: lines[i].trim() }); + } + aliasPattern.lastIndex = 0; + } + } + + if (hits.length === 0) { + console.log(" ✓ all calls use t() directly"); + } else { + console.log(` ⚠ ${hits.length} aliased calls (translate/tr instead of t)`); + for (const { file, line, text } of hits) { + console.log(` ${file}:${line}`); + console.log(` ${text.slice(0, 120)}`); + } + } + console.log(); +} + +// --- 9. Placeholder integrity --- +if (shouldRun("--placeholders")) { + console.log("=== Placeholder integrity ==="); + let problems = 0; + + for (const [key, enValue] of enKeyValues) { + const enPh = findPlaceholders(enValue); + if (enPh.length === 0) continue; + + for (const locale of LOCALES) { + const file = join(LOCALES_DIR, `${locale}.ts`); + if (!existsSync(file)) continue; + const localeKV = extractKeyValues(file); + const localeValue = localeKV.get(key); + if (!localeValue) continue; + + const localePh = findPlaceholders(localeValue); + for (const ph of enPh) { + if (!localePh.includes(ph)) { + console.log(` ✗ ${locale}/${key}: missing placeholder ${ph}`); + problems++; + exitCode = 1; + } + } + } + } + + if (problems === 0) console.log(" ✓ all placeholders preserved"); + else console.log(` ✗ ${problems} placeholder issues`); + console.log(); +} + +// --- 10. Hardcoded English scan --- +if (shouldRun("--hardcoded")) { + console.log("=== Hardcoded English scan ==="); + + const hardcodedFiles = collectSourceFiles(APP_SRC, (dir) => dir.includes("locales")); + + const excludePatterns = [ + /import\b/, /from\s+"/, /class=/, /\btype\s/, /\bconst\s/, /variant=/, + /\bt\(/, /translate\(/, /"connected"/, /"allow"/, /"local"/, /"remote"/, + /"object"/, /"string"/, /"user"/, /"assistant"/, /"Escape"/, /"Arrow/, + /"Enter"/, /"prompt"/, /"session"/, /"automation"/, /"minimal"/, /"starter"/, + /"docker"/, /"opencode"/, /"simple"/, /"Started"/, /"Progress"/, + /^\s*\/\//, /^\s*\/\*/, + ]; + + const englishPattern = />[A-Z][a-z]{2,}[^<]*<|"[A-Z][a-z]{3,}[a-z ]+[.!?]?"/; + + for (const full of hardcodedFiles) { + const name = full.replace(APP_SRC + "/", ""); + const lines = readFileSync(full, "utf-8").split("\n"); + const hits = []; + + for (let i = 0; i < lines.length; i++) { + const line = lines[i]; + if (!englishPattern.test(line)) continue; + if (excludePatterns.some((p) => p.test(line))) continue; + hits.push(` ${i + 1}: ${line.trim()}`); + if (hits.length >= 5) break; + } + + if (hits.length === 0) { + console.log(` ${name}: ✓ clean`); + } else { + console.log(` ${name}: ⚠ possible hardcoded strings:`); + for (const hit of hits) console.log(hit); + } + } + console.log(); +} + +// --- 11. Sort --- +if (mode === "--sort") { + console.log("=== Sorting all locale files alphabetically ==="); + const allLocaleFiles = ["en", ...LOCALES].map((l) => join(LOCALES_DIR, `${l}.ts`)); + + const PLURAL_ORDER = { _zero: 0, _one: 1, _two: 2, _few: 3, _many: 4, _other: 5 }; + + function sortKey(key) { + let normalized = key.replace(/\./g, "\x00"); + for (const [suffix, order] of Object.entries(PLURAL_ORDER)) { + if (normalized.endsWith(suffix)) { + normalized = normalized.slice(0, -suffix.length) + `\x01${order}`; + break; + } + } + return normalized; + } + + for (const file of allLocaleFiles) { + if (!existsSync(file)) continue; + const content = readFileSync(file, "utf-8"); + + // Extract preamble (header comment) and body + const exportMatch = content.match(/^([\s\S]*?)(export default \{)([\s\S]*?)(\} as const;\s*)$/); + if (!exportMatch) { + console.log(` ${basename(file, ".ts")}: ⚠ could not parse, skipped`); + continue; + } + const [, preamble, , body] = exportMatch; + + // Eval the body as a JS object to get all key-value pairs + let obj; + try { + obj = new Function(`return {${body}}`)(); + } catch (e) { + console.log(` ${basename(file, ".ts")}: ⚠ eval failed, skipped (${e.message})`); + continue; + } + + // Sort keys + const sortedKeys = Object.keys(obj).sort((a, b) => { + const ak = sortKey(a); + const bk = sortKey(b); + return ak < bk ? -1 : ak > bk ? 1 : 0; + }); + + // Rebuild — JSON.stringify handles all escaping (\n, quotes, etc.) + const lines = sortedKeys.map((key) => + ` ${JSON.stringify(key)}: ${JSON.stringify(obj[key])},` + ); + writeFileSync(file, `${preamble}export default {\n${lines.join("\n")}\n} as const;\n`); + const locale = basename(file, ".ts"); + console.log(` ${locale}: ${sortedKeys.length} keys sorted`); + } + console.log(); +} + +// --- Done --- +console.log("=== Done ==="); +console.log("Run with --missing, --orphan, --duplicates, --unused, --dangling, --placeholders, --hardcoded, --prune, or --sort for a single check."); +process.exit(exitCode);