From c5de39de0c66dee3030ce229b0734a60c16874df Mon Sep 17 00:00:00 2001 From: glebkaitsme Date: Tue, 14 Jul 2026 21:04:26 +0300 Subject: [PATCH] feat: add Russian locale (ru) - Add ru/common.json and ru/settings.json translations - Update i18n.ts with Russian as default language - Add Russian option to language selector (settings + setup dialog) - Add 'ru' to Zod validation schema in main process - Preserve 'ru' locale in settings normalization Settings: 1311/1362 translated (96%) Common: 1535/2765 translated (55%) --- src/main/ipc/app-ipc-schemas/settings.ts | 2 +- .../src/components/InitialSetupDialog.tsx | 4 +- .../components/settings-section-general.tsx | 3 +- src/renderer/src/i18n.ts | 7 +- src/renderer/src/locales/ru/common.json | 2809 +++++++++++++++++ src/renderer/src/locales/ru/settings.json | 1364 ++++++++ src/shared/app-settings-normalize.ts | 2 +- 7 files changed, 4184 insertions(+), 7 deletions(-) create mode 100644 src/renderer/src/locales/ru/common.json create mode 100644 src/renderer/src/locales/ru/settings.json diff --git a/src/main/ipc/app-ipc-schemas/settings.ts b/src/main/ipc/app-ipc-schemas/settings.ts index 9d49bcc08..105860c2d 100644 --- a/src/main/ipc/app-ipc-schemas/settings.ts +++ b/src/main/ipc/app-ipc-schemas/settings.ts @@ -39,7 +39,7 @@ import { optionalTrimmedString, trimmedString } from './common' -const localeSchema = z.enum(['en', 'zh']) +const localeSchema = z.enum(['en', 'zh', 'ru']) const themeSchema = z.enum(['system', 'light', 'dark']) const uiFontScaleSchema = z.union([ z.number().min(UI_FONT_SCALE_MIN).max(UI_FONT_SCALE_MAX), diff --git a/src/renderer/src/components/InitialSetupDialog.tsx b/src/renderer/src/components/InitialSetupDialog.tsx index ab25fa224..cbf3c1cdd 100644 --- a/src/renderer/src/components/InitialSetupDialog.tsx +++ b/src/renderer/src/components/InitialSetupDialog.tsx @@ -464,7 +464,7 @@ export function InitialSetupDialog(): ReactElement { {t('language')}
- {(['en', 'zh'] as const).map((lang) => { + {(['en', 'zh', 'ru'] as const).map((lang) => { const isActive = form.locale === lang return ( ) })} diff --git a/src/renderer/src/components/settings-section-general.tsx b/src/renderer/src/components/settings-section-general.tsx index d845b8ca2..a3c0d3d64 100644 --- a/src/renderer/src/components/settings-section-general.tsx +++ b/src/renderer/src/components/settings-section-general.tsx @@ -262,10 +262,11 @@ export function GeneralSettingsSection({ ctx }: { ctx: Record }): R } /> diff --git a/src/renderer/src/i18n.ts b/src/renderer/src/i18n.ts index 9d2bb1155..03819e0a9 100644 --- a/src/renderer/src/i18n.ts +++ b/src/renderer/src/i18n.ts @@ -4,13 +4,16 @@ import enCommon from './locales/en/common.json' import zhCommon from './locales/zh/common.json' import enSettings from './locales/en/settings.json' import zhSettings from './locales/zh/settings.json' +import ruCommon from './locales/ru/common.json' +import ruSettings from './locales/ru/settings.json' void i18n.use(initReactI18next).init({ resources: { en: { common: enCommon, settings: enSettings }, - zh: { common: zhCommon, settings: zhSettings } + zh: { common: zhCommon, settings: zhSettings }, + ru: { common: ruCommon, settings: ruSettings } }, - lng: 'en', + lng: 'ru', fallbackLng: 'en', interpolation: { escapeValue: false }, defaultNS: 'common', diff --git a/src/renderer/src/locales/ru/common.json b/src/renderer/src/locales/ru/common.json new file mode 100644 index 000000000..835c4bcae --- /dev/null +++ b/src/renderer/src/locales/ru/common.json @@ -0,0 +1,2809 @@ +{ + "appName": "Kun", + "runtimeStatusRestarting": "Kun перезапускается…", + "runtimeStatusRestartingAttempt": "Kun перезапускается (попытка {{attempt}}/{{max}})…", + "runtimeStatusCrashed": "Kun неожиданно завершился; восстанавливаем…", + "runtimeStatusRolledBack": "Не удалось применить новые настройки; выполнен откат к предыдущей рабочей конфигурации", + "runtimeStatusFailed": "Kun не удаётся запустить; автоматические перезапуски приостановлены", + "runtimeStatusDismiss": "Закрыть", + "windowsMenuAriaLabel": "Меню приложения", + "windowsMenuFile": "Файл", + "windowsMenuEdit": "Правка", + "windowsMenuView": "Вид", + "windowsMenuWindow": "Окно", + "windowsMenuHelp": "Справка", + "windowsMenuNewChat": "Новый чат", + "windowsMenuChooseWorkspace": "Выбрать рабочую директорию…", + "windowsMenuSettings": "Настройки", + "windowsMenuQuit": "Выход", + "windowsMenuUndo": "Отменить", + "windowsMenuRedo": "Повторить", + "windowsMenuCut": "Вырезать", + "windowsMenuCopy": "Копировать", + "windowsMenuPaste": "Вставить", + "windowsMenuSelectAll": "Выделить всё", + "windowsMenuReload": "Перезагрузить", + "windowsMenuZoomIn": "Приблизить", + "windowsMenuZoomOut": "Отдалить", + "windowsMenuResetZoom": "Сбросить масштаб", + "windowsMenuDevTools": "Инструменты разработчика", + "windowsMenuMinimize": "Свернуть", + "windowsMenuToggleMaximize": "Развернуть/восстановить", + "windowsMenuClose": "Закрыть окно", + "windowsMenuAbout": "О программе Kun", + "windowsMenuOpenLogDir": "Открыть папку с логами", + "windowsMenuAboutMessage": "Kun\nВерсия {{version}}", + "windowsMenuUnknownVersion": "неизвестно", + "code": "Код", + "write": "Письмо", + "design": "Дизайн", + "designSidebarEmpty": "Артефактов дизайна пока нет — опишите в ассистенте, что хотите создать.", + "designNewArtifact": "Новый дизайн", + "designNewDocument": "Новый дизайн", + "designDefaultDocTitle": "Мой дизайн", + "designDeleteDocument": "Удалить дизайн", + "designRenameDocument": "Переименовать дизайн", + "designDocEmpty": "В этом дизайне ещё нет экранов. Опишите, что нужно, и агент создаст их на холсте.", + "designAgentDrawingsTitle": "Рисунки агента дизайна", + "designAgentDrawingsExpand": "Развернуть рисунки агента дизайна", + "designAgentDrawingsCollapse": "Свернуть рисунки агента дизайна", + "designNewCanvas": "Новый холст дизайна", + "designDraftsSection": "Черновики дизайна", + "designDraftsEmpty": "Черновиков пока нет. Начните разговор, и холсты появятся здесь.", + "designCanvasDesignSection": "Холст дизайна", + "designCanvasDesignEmpty": "Холстов дизайна пока нет.", + "designCanvasTitle": "Безымянный холст", + "designSettingsWorkspace": "Рабочая директория дизайна", + "designSettingsWorkspaceHint": "Путь сохранения артефактов дизайна. Оставьте пустым для текущей рабочей директории.", + "designSettingsSystem": "Дизайн-система", + "designSettingsType": "Поверхность по умолчанию", + "designSettingsTypeUnset": "Не задано", + "designSettingsTypeBrand": "Бренд-ориентированная", + "designSettingsTypeProduct": "Продукт-ориентированная", + "designTokenRadius": "Corner radius", + "designTokenDensity": "Spacing density", + "designTokenType": "Type style", + "designSettingsGuidelines": "Design guidelines", + "designSettingsGuidelinesHint": "Extra rules injected into both agents and written to DESIGN_SYSTEM.md.", + "designSettingsGuidelinesPlaceholder": "e.g. 8px grid, rounded-2xl, no drop shadows, system font stack", + "designSettingsAgent": "Design agent", + "designSettingsModel": "Default model", + "designSettingsModelHint": "Model for design turns. Leave empty to inherit the runtime default.", + "designSettingsModelPlaceholder": "Inherit runtime default", + "designSettingsEffort": "Reasoning effort", + "designSettingsGenPrompt": "Generation prompt", + "designSettingsGenPromptHint": "Overrides the built-in single-file HTML contract. Leave empty for the default.", + "designSettingsCode": "Design → code", + "designSettingsStackHint": "Target stack", + "designSettingsStackHintHint": "Hint for \"Implement in code\". Leave empty to auto-detect from the project.", + "designSettingsInject": "Code agent honors the design system", + "designSettingsInjectHint": "Reference the published design system when implementing.", + "designSettingsPublish": "Publish DESIGN_SYSTEM.md", + "designSettingsPublishHint": "Write the design system to the workspace when implementing.", + "designSettingsCanvas": "Canvas defaults", + "designSettingsViewport": "Default viewport", + "designSettingsView": "Default view", + "designSettingsBackground": "Canvas background", + "designBackgroundLight": "Light", + "designBackgroundDark": "Dark", + "designSettingsLiveRefresh": "Live refresh", + "designSettingsDeviceFrame": "Device frame", + "designImplement": "Implement in code", + "designImplementPanelTitle": "Implement in code", + "designImplementClose": "Back to design", + "designImplementEmpty": "Implementing this design in code…", + "designImplementDisplay": "Implement design: {{title}}", + "designImplemented": "Implemented in code", + "designDrift": "Design changed — the implementation may be stale", + "designCodeDrift": "The shared design system changed since this was implemented", + "designCodeSyncTitle": "Code bridge", + "designCodeSyncLatest": "Latest canvas change", + "designCodeSyncApply": "Apply latest change to code", + "designCodeSyncApplying": "Applying…", + "designCodeSyncApplied": "{{files}} files written · {{skipped}} skipped", + "designCodeSyncUnavailable": "Workspace file access is unavailable.", + "designCodeSyncNoWorkspace": "No workspace selected.", + "designCodeSyncNoJournal": "No canvas operation to apply.", + "designCodeSyncNoActiveBindings": "No active code binding.", + "designCodeSyncNoRequests": "No code change request.", + "designCodeSyncRequests": "{{count}} requests", + "designCodeSyncBindings": "{{active}}/{{total}} bindings", + "designCodeSyncRunningApps": "{{count}} live app frames", + "designCodeSyncLiveCandidates": "{{count}} binding hints", + "designCodeSyncStale": "{{stale}} stale · {{missing}} missing", + "designCodeSyncPrepareBindings": "Prepare code bindings", + "designCodeSyncPrepareBindingsDetail": "Ask the design agent to create or refresh code bindings", + "designCodeSyncPrepareImplementation": "Prepare implementation", + "designCodeSyncPrepareImplementationDetail": "Ask the design agent to turn bound design changes into code requests", + "designContractTitle": "Design contract", + "designContractPath": "Project DESIGN.md", + "designContractExport": "Export DESIGN.md", + "designContractExporting": "Exporting…", + "designContractExported": "Wrote {{path}}", + "designContractUnavailable": "Workspace file access is unavailable.", + "designContractNoWorkspace": "No workspace selected.", + "designContractNoDocument": "No active design.", + "designContractSummary": "{{screens}} screens · {{objects}} objects · {{bindings}} bindings · {{ops}} ops", + "designContractPrepareHandoff": "Prepare handoff package", + "designContractPrepareHandoffDetail": "Ask the design agent to assemble DESIGN.md and export payloads", + "designInteropTitle": "Interop", + "designInteropPenpotPackage": "Penpot package", + "designInteropExportPenpot": "Export Penpot package", + "designInteropExporting": "Exporting…", + "designInteropExported": "Wrote {{path}}", + "designInteropUnavailable": "Workspace file access is unavailable.", + "designInteropNoWorkspace": "No workspace selected.", + "designInteropPenpotSummary": "{{frames}} frames · {{tokens}} tokens · {{components}} components · {{assets}} assets", + "designInteropResources": "Design resources", + "designInteropResourcesSummary": "{{count}} resources · {{frames}} frames · {{directions}} directions", + "designInteropOpenUiReport": "OpenUI normalize", + "designInteropOpenUiSummary": "{{count}} HTML screens", + "designExploreInDesign": "Explore in design", + "designCanvasEmptyTitle": "Generate a design draft first", + "designCanvasPlaceholder": "Describe the UI at the bottom; Kun will generate an HTML prototype you can preview, iterate, and hand to code.", + "designCanvasEmptyAction": "Describe a design", + "designAgentTitle": "Design assistant", + "designAgentPlaceholder": "Describe the UI or page you want; the agent will design a single-file interactive prototype.", + "designViewPreview": "Preview", + "designViewCode": "Code", + "designViewLive": "Live app", + "designLiveNoServer": "Start a dev server in code mode to preview the running app here.", + "designCanvasLoading": "Loading…", + "designOpenExternal": "Open in browser", + "designToggleBackground": "Toggle background", + "designCopyCode": "Copy HTML", + "designExportHtml": "Export HTML", + "designExportPdf": "Export PDF", + "designExportFailed": "Export failed.", + "designViewportMobile": "Mobile", + "designViewportTablet": "Tablet", + "designViewportDesktop": "Desktop", + "designCanvasReload": "Reload", + "designCanvasUnavailable": "Live preview is only available in the desktop app.", + "designCanvasGenerating": "Designing… the canvas updates when the agent finishes.", + "designAgentBrandColor": "Brand color", + "designContextLabel": "Design context", + "designCanvasContextTitle": "Canvas context", + "designAgentTone": "Tone", + "designAgentSystem": "Design system", + "designAgentComposerPlaceholder": "Describe the screen or page to design…", + "designAgentSend": "Design it", + "designComposerNew": "New design", + "designComposerIterate": "Iterating: {{title}}", + "designProjectGenerate": "Generate", + "designProjectModify": "Modify", + "designProjectPreview": "Preview", + "designProjectMore": "More", + "designProjectDuplicate": "Duplicate screen", + "designProjectFavorite": "Mark as favorite", + "designProjectShare": "Copy path", + "designProjectRename": "Rename", + "designProjectRenamePrompt": "Rename this design", + "designProjectVersion": "Version {{version}}", + "designProjectGenerateContext": "New screen", + "designProjectClearContext": "Clear current screen", + "designProjectCardPlaceholder": "A previewable screen will appear here when generation finishes.", + "designDeleteArtifact": "Delete", + "designImplementHtmlOnly": "Only HTML drafts can be implemented in code.", + "designAgentBusy": "Designing…", + "designGeneratorLaneTitle": "Generator lane", + "designGeneratorLaneSummary": "{{screens}} screens · {{selected}} selected · {{bindings}} code bridge", + "designGeneratorLaneQuickScreen": "Quick screen", + "designGeneratorLaneQuickScreenDetail": "Prompt or image to one rendered screen", + "designGeneratorLaneThreeDirections": "Three directions", + "designGeneratorLaneThreeDirectionsDetail": "Generate alternatives for comparison", + "designGeneratorLaneAnnotateRefine": "Annotate and refine", + "designGeneratorLaneAnnotateRefineDetail": "Mark issues, then repair the screen", + "designGeneratorLaneNormalizeSystem": "Normalize system", + "designGeneratorLaneNormalizeSystemDetail": "Extract graph, tokens, components, and links", + "designGeneratorLaneNeedsScreen": "Create a screen first.", + "designSystemPanelTitle": "Design system", + "designSystemPanelSummary": "{{tokens}} tokens · {{components}} components · {{bindings}} bound uses", + "designSystemPanelCanvasSummary": "{{screens}} screens · {{objects}} objects · {{selected}} selected · {{findings}} lint issues", + "designSystemPanelCreate": "Create system", + "designSystemPanelUpdate": "Update system", + "designSystemPanelCreateDetail": "Extract reusable tokens and components", + "designSystemPanelValidate": "Validate system", + "designSystemPanelValidateDetail": "Lint token usage and accessibility", + "designSystemPanelApplySelection": "Apply to selection", + "designSystemPanelApplySelectionDetail": "Normalize selected objects into the system", + "designSystemPanelNeedsContent": "Create canvas content first.", + "designSystemPanelNeedsSelection": "Select canvas objects first.", + "designSystemPanelNeedsSystem": "Create a design system first.", + "designAgentManagerTitle": "Agent manager", + "designAgentManagerSummary": "{{ready}} ready · {{running}} running · {{blocked}} blocked", + "designAgentManagerPlanner": "Planner", + "designAgentManagerGenerator": "Generator", + "designAgentManagerSystemizer": "Systemizer", + "designAgentManagerCritic": "Critic", + "designAgentManagerCodeBinder": "Code binder", + "designAgentManagerExporter": "Exporter", + "designAgentManagerStatusRunning": "Running", + "designAgentManagerStatusReady": "Ready", + "designAgentManagerStatusIdle": "Idle", + "designAgentManagerStatusBlocked": "Blocked", + "designAgentManagerPlannerRunning": "Planning {{phase}}", + "designAgentManagerPlannerReady": "{{directions}} directions · {{screens}} screens", + "designAgentManagerPlannerIdle": "Ready to plan directions", + "designAgentManagerGeneratorRunning": "{{done}}/{{total}} screens", + "designAgentManagerGeneratorReady": "{{screens}} screens · {{tokens}} tokens · {{components}} components", + "designAgentManagerGeneratorIdle": "No screens yet", + "designAgentManagerSystemizerReady": "{{tokens}} tokens · {{components}} components", + "designAgentManagerSystemizerIdle": "Ready to extract the design system", + "designAgentManagerSystemizerBlocked": "Create a screen first", + "designAgentManagerCriticReady": "{{count}} critique passes recorded", + "designAgentManagerCriticIdle": "Ready to critique", + "designAgentManagerCriticBlocked": "Create a screen first", + "designAgentManagerCodeBinderReady": "{{active}} active · {{stale}} stale · {{missing}} missing", + "designAgentManagerCodeBinderIdle": "No code bindings yet", + "designAgentManagerCodeBinderBlocked": "Create a screen first", + "designAgentManagerExporterReady": "DESIGN.md can include {{screens}} screens and {{objects}} objects", + "designAgentManagerExporterIdle": "Nothing to export yet", + "designAgentManagerExporterBlocked": "No active design", + "designAgentManagerRunRole": "Run this design agent", + "designAgentManagerRoleUnavailable": "This design agent is unavailable", + "designModeSurfaceTitle": "Design mode", + "designModeSurfaceSummary": "{{active}} active · {{ready}} ready · {{setup}} setup", + "designModeSurfaceAgent": "Agent", + "designModeSurfaceCanvas": "Canvas", + "designModeSurfaceTools": "Design tools", + "designModeSurfaceWhiteboard": "Whiteboard", + "designModeSurfaceCodeBridge": "Code bridge", + "designModeSurfaceHandoff": "Handoff", + "designModeSurfaceStatusActive": "Active", + "designModeSurfaceStatusReady": "Ready", + "designModeSurfaceStatusNeedsSetup": "Setup", + "designModeSurfaceStatusBlocked": "Blocked", + "designModeSurfaceMeta": "{{score}}/100 · {{tools}} tools · {{resources}} resources", + "designModeWorkflowNext": "Next: {{step}} · {{tool}}", + "designModeWorkflowNextReason": "{{reason}}", + "designModeWorkflowSeed": "{{seed}}", + "designModeWorkflowComplete": "Workflow complete", + "designModeWorkflowRunNext": "Run recommended next step", + "designModeWorkflowNoNext": "No recommended next step", + "designToolsTitle": "Design tools", + "designToolsSummary": "{{objects}} objects · {{selected}} selected · {{findings}} findings · {{notes}} notes · {{ops}} ops", + "designToolsRun": "Run design tool", + "designToolsLastRun": "{{tool}} · {{status}}", + "designToolsPlan": "Plan next", + "designToolsPlanDetail": "Read the graph and recommend the next tool chain", + "designToolsCritique": "Critique canvas", + "designToolsCritiqueDetail": "Run checks and attach repairable notes", + "designToolsRepair": "Repair findings", + "designToolsRepairDetail": "Apply focused repair operations", + "designToolsValidateSystem": "Validate system", + "designToolsValidateSystemDetail": "Run design-system lint on the current scope", + "designToolsExportPackage": "Preview package", + "designToolsExportPackageDetail": "Build the handoff/resource package", + "designToolsNeedsContent": "Create canvas content first.", + "designToolsNeedsFindings": "No repairable findings yet.", + "designOperationJournalTitle": "Operation journal", + "designOperationJournalSummary": "{{total}} entries · {{applied}} applied · {{partial}} partial", + "designOperationJournalFocus": "Focus affected objects", + "designOperationJournalAffected": "{{count}} affected", + "designOperationJournalNoAffected": "No affected objects", + "designReferencesTitle": "Project memory", + "designReferencesSummary": "{{images}} images · {{screens}} screens · {{notes}} notes · {{selected}} selected", + "designReferencesUse": "Use project memory", + "designReferencesUseDetail": "Seed the design agent with current references", + "designReferencesNeedsContext": "Add a reference image, screen, or note first.", + "designReferencesFocus": "Focus reference", + "designReferencesNotesOnly": "Project memory currently lives in review notes.", + "designReferencesLinks": "{{count}} links", + "designReferenceSourceWorkspace": "Workspace", + "designReferenceSourceRemote": "Remote", + "designReferenceSourceInline": "Inline", + "designReferenceSourceSession": "Session", + "designPrototypeFlowTitle": "Prototype flow", + "designPrototypeFlowSummary": "{{screens}} screens · {{links}} links · {{fallback}} fallback · {{missing}} missing", + "designPrototypeFlowConnect": "Connect prototype flow", + "designPrototypeFlowConnectDetail": "Ask the design agent to repair navigation and links", + "designPrototypeFlowNeedsScreens": "Create at least two screens first.", + "designPrototypeFlowFocus": "Focus flow screens", + "designPrototypeFlowExplicit": "Explicit", + "designPrototypeFlowFallback": "Fallback", + "designPrototypeFlowEmpty": "Add another screen to create a prototype flow.", + "designPrototypeFlowMissing": "{{count}} unresolved prototype link(s)", + "designAgentNotesTitle": "Review notes", + "designAgentNotesSummary": "{{unresolved}} unresolved · {{total}} notes", + "designAgentNotesRepair": "Repair this note", + "designAgentNotesReview": "Review this note", + "designAgentNotesFocus": "Focus note", + "designAgentNotesFocusTarget": "Focus target", + "designAgentNotesResolved": "Resolved", + "designAgentNotesUnresolved": "Open", + "designAgentNoteKindCritique": "Critique", + "designAgentNoteKindDecision": "Decision", + "designAgentNoteKindTodo": "TODO", + "designAgentNoteKindQuestion": "Question", + "designAgentNoteKindRationale": "Rationale", + "designImportDesignMd": "Import DESIGN.md", + "designImportDesignMdUnavailable": "DESIGN.md import is unavailable in this environment.", + "designImportDesignMdFailed": "Could not import .kun-design/HANDOFF.md.", + "designMigrateLegacyConfirm": "Create root DESIGN.md from the legacy design system ({{count}} tokens)? The legacy file will be kept unchanged.", + "designMigrateLegacyFailed": "Could not create root DESIGN.md from the legacy design system.", + "designDirectionsTitle": "Directions", + "designDirectionScreenCount": "{{count}} screens", + "designDirectionAccept": "Accept direction", + "designDirectionArchive": "Archive direction", + "designDirectionAccepted": "Accepted", + "designDirectionArchived": "Archived", + "designArchivedDirectionsTitle": "Archived directions", + "designDirectionRestore": "Restore direction", + "designDirectionCompareTitle": "Compare directions", + "designDirectionCompareScreens": "{{count}} screens", + "designDirectionCompareFlows": "{{count}} links", + "designDirectionCompareImplemented": "{{count}} implemented", + "designDirectionScoreMeta": "{{readiness}} · {{score}}/100 · {{cost}} cost", + "designDirectionReadinessReady": "Ready", + "designDirectionReadinessNeedsReview": "Needs review", + "designDirectionReadinessBlocked": "Blocked", + "designDirectionCostLow": "low", + "designDirectionCostMedium": "medium", + "designDirectionCostHigh": "high", + "designDirectionCompareUnique": "Unique: {{screens}}", + "designDirectionCompareShared": "Shared: {{screens}}", + "designDirectionCompareOpen": "Open visual compare", + "designDirectionCompareClose": "Close compare", + "designDirectionCompareVisualSubtitle": "{{count}} directions side by side", + "designDirectionCompareMatchScreens": "Match screens", + "designDirectionCompareScreenCoverage": "{{covered}}/{{total}} directions", + "designDirectionCompareUnavailable": "Visual compare is unavailable.", + "canvasToolSelect": "Выделение", + "canvasToolRect": "Rectangle", + "canvasToolEllipse": "Эллипс", + "canvasToolText": "Текст", + "canvasToolScreen": "Screen", + "canvasToolFrame": "Frame", + "canvasToolArrow": "Стрелка", + "canvasToolLine": "Линия", + "canvasToolDraw": "Draw", + "canvasToolImage": "Изображение", + "codeCanvasToolImage": "AI image", + "canvasToolUploadImage": "Upload files to canvas", + "codeCanvasToolUploadImage": "Upload image to whiteboard", + "canvasToolUploadFailed": "Image upload failed.", + "canvasExport": "Export whiteboard", + "canvasExportSvg": "Экспорт SVG", + "canvasExportPng": "Экспорт PNG", + "canvasExportUnavailable": "Whiteboard export is unavailable.", + "canvasToolAssistant": "Open design assistant", + "canvasToolHand": "Рука", + "canvasToolCritique": "Critique canvas", + "designAgentActions": "Agent actions", + "designAgentActionWorkflowNext": "Recommended next step", + "designAgentActionWorkflowNextDetail": "Run the current design workflow recommendation", + "designAgentActionExploreDirections": "Explore directions", + "designAgentActionExploreDirectionsDetail": "Generate distinct screen directions", + "designAgentActionExtractSystem": "Extract design system", + "designAgentActionExtractSystemDetail": "Create tokens and reusable components", + "designAgentActionComponentize": "Componentize selection", + "designAgentActionComponentizeDetail": "Turn selected objects into a reusable pattern", + "designAgentActionCritiqueSelection": "Critique selection", + "designAgentActionCritiqueSelectionDetail": "Create repairable review notes", + "designAgentActionPrototypeFlow": "Prototype flow", + "designAgentActionPrototypeFlowDetail": "Connect screens into a clickable journey", + "designAgentActionBindLiveApp": "Bind live app", + "designAgentActionBindLiveAppDetail": "Refresh route and DOM code bindings", + "designAgentActionRepairCodeBridge": "Repair code bridge", + "designAgentActionRepairCodeBridgeDetail": "Reconcile bound design changes with code", + "designAgentActionNeedsSelection": "Select at least one canvas object.", + "designAgentActionNeedsScreens": "Create at least two screens.", + "designAgentActionNeedsLiveApp": "Create or select a live app frame first.", + "designAgentActionNeedsCodeBindings": "Capture active code bindings and make a canvas change first.", + "canvasCritiquePromptWithFindings": "Fix the {{count}} canvas critique finding(s). Keep the current direction, but repair design-system binding, contrast, tap target, spacing, hierarchy, and alignment issues with focused canvas operations.", + "canvasCritiquePromptClean": "Critique the current canvas and improve visual hierarchy, alignment, spacing, contrast, and design-system consistency. Keep the current direction and use focused canvas operations.", + "canvasRotateHandle": "Rotate selection", + "designPrototypePlay": "Play prototype", + "designPrototypePlayUnavailable": "Create at least one screen before playing the prototype", + "designPrototypeBack": "Back", + "designPrototypeClose": "Close prototype", + "designPrototypeViewportMode": "Prototype viewport", + "designPrototypeViewportWebDetail": "{{width}} x {{height}} web prototype", + "designPrototypeViewportAppDetail": "{{width}} x {{height}} phone prototype", + "designPrototypeAllScreens": "All screens", + "designPrototypeNextScreens": "Next screens", + "designPrototypeNoLinks": "No outgoing links from this screen yet.", + "designPrototypeAuthorizeMissing": "Prototype preview is unavailable.", + "designPrototypeMissingTarget": "Missing screen target", + "designPrototypeCreateMissingScreen": "Create with AI", + "designPrototypeCreateMissingPrompt": "Create the missing prototype screen linked from \"{{current}}\" (`{{sourcePath}}`). The clicked href was `{{href}}`; suggested screen name: \"{{suggestedTitle}}\". Use the current Web/App design target, keep the existing visual direction, add a new screen to the canvas, and wire the source screen so this interaction navigates to the new screen.", + "canvasUndo": "Undo", + "canvasRedo": "Redo", + "canvasZoomIn": "Приблизить", + "canvasZoomOut": "Отдалить", + "canvasZoomReset": "Сбросить масштаб", + "canvasZoomFit": "По размеру экрана", + "canvasZoomToSelection": "Zoom to selection", + "canvasZoomTo100": "Zoom to 100%", + "canvasGridToggle": "Toggle grid", + "canvasLayersTitle": "Layers", + "canvasMinimap": "Canvas minimap", + "canvasLayersEmpty": "No layers", + "canvasLayerCollapse": "Collapse layer", + "canvasLayerExpand": "Expand layer", + "canvasLayerHide": "Hide layer", + "canvasLayerShow": "Show layer", + "canvasLayerLock": "Lock layer", + "canvasLayerUnlock": "Unlock layer", + "canvasInspectorArrange": "Arrange", + "canvasAlignLeft": "Выровнять влево", + "canvasAlignHCenter": "Align horizontal centers", + "canvasAlignRight": "Выровнять вправо", + "canvasAlignTop": "Выровнять вверх", + "canvasAlignVCenter": "Align vertical centers", + "canvasAlignBottom": "Выровнять вниз", + "canvasDistributeH": "Distribute horizontally", + "canvasDistributeV": "Distribute vertically", + "canvasSnap": "Snap to objects", + "canvasInspectorTitle": "Properties", + "canvasInspectorPosition": "Position & size", + "canvasInspectorFill": "Fill", + "canvasInspectorStroke": "Stroke", + "canvasInspectorLine": "Line", + "canvasInspectorArrowStart": "Start", + "canvasInspectorArrowEnd": "End", + "canvasInspectorCorner": "Corner radius", + "canvasInspectorOpacity": "Opacity", + "canvasInspectorScreen": "Screen", + "canvasInspectorText": "Text", + "canvasInspectorAddFill": "Add fill", + "canvasInspectorAddStroke": "Add stroke", + "canvasInspectorRemoveFill": "Remove fill", + "canvasInspectorRemoveStroke": "Remove stroke", + "canvasInspectorTextColor": "Color", + "canvasInspectorPin": "Pin inspector", + "canvasInspectorUnpin": "Unpin inspector", + "canvasInspectorEmpty": "Select an object on the canvas to edit position, fill, stroke, and other properties.", + "canvasInspectorAiHolder": "AI image", + "canvasInspectorAiHolderMark": "Mark as AI image slot", + "canvasInspectorAiHolderOn": "AI image slot · on", + "canvasInspectorAiHolderHint": "Keep it selected and ask the assistant to generate — it fills this slot.", + "canvasInspectorAiHolderAuto": "Empty box · auto image slot", + "canvasInspectorAiHolderAutoHint": "Just ask the assistant to generate — it fills this box automatically. No marking needed.", + "designRailTitle": "Design Assistant", + "designRailTargetNew": "New design", + "designRailTargetIterate": "Iterate: ", + "designRailTargetCanvas": "Canvas assistant", + "designRailClear": "Clear conversation", + "designRailEmpty": "Describe the UI you want to design. The assistant will generate it for you.", + "designRailThinking": "Thinking…", + "designRailPlaceholder": "Describe what you want to design…", + "designRailSend": "Send", + "designRailCollapse": "Collapse assistant", + "designRailExpand": "Expand assistant", + "designRailNewConversation": "New conversation", + "designRailSwitchThread": "Switch conversation", + "designRailChildBack": "Back to design main thread", + "designRailChildLoading": "Loading subagent output…", + "designRailChildError": "Failed to load subagent session", + "designRailDrawingFallback": "Design drawing {{number}}", + "designPagesToggle": "Multi-page", + "designPagesToggleHint": "Generate several cohesive pages from one brief", + "designTargetWeb": "Web", + "designTargetApp": "App", + "designTargetHint": "Choose whether the design agent defaults to web pages or mobile app screens", + "designTargetLockedHint": "Design target switching is locked while the design agent is working", + "designTargetContextStatus": "Agent context", + "designTargetContextWeb": "Default {{width}} x {{height}} web frame", + "designTargetContextApp": "Default {{width}} x {{height}} app frame", + "designPagesPlanning": "Planning pages…", + "designPagesGenerating": "Generating {{done}}/{{total}}: {{title}}", + "designPagesStop": "Stop", + "designPagesPlanDisplay": "Plan a multi-page design: {{brief}}", + "designPagesPageDisplay": "Design page {{index}}/{{total}}: {{title}}", + "designPagesFoundation": "Laying the foundation: {{title}}", + "designFoundationStepSpec": "Design brief (design.md)", + "designFoundationStepSystem": "Design system", + "designFoundationStepLogo": "Logo", + "designFoundationSpecDisplay": "Draft the design brief & plan: {{brief}}", + "designFoundationSystemDisplay": "Design the visual system & tokens", + "designFoundationLogoDisplay": "Design the brand logo", + "designFoundationSystemTitle": "Design system", + "designFoundationLogoTitle": "Logo", + "designSystem_none": "No preset", + "designSystem_shadcn": "shadcn/ui", + "designSystem_material": "Material", + "designSystem_ios": "iOS / Apple", + "designSystem_fluent": "Fluent", + "ikunMode": "iKun", + "focusMode": "Focus", + "focusModeToggleLabel": "Toggle focus mode", + "focusModeToggleTitle": "Focus mode: quiet Kun animations", + "switchOn": "On", + "switchOff": "Off", + "newChat": "Новый чат", + "newAgent": "New Agent", + "plugins": "Plugins", + "claw": "Connect phone", + "schedule": "Расписание", + "workflow": "Воркфлоу", + "workflowCreate": "Create Loop", + "workflowSubtitle": "Wire up a node-based flow: run it manually, fire it on a schedule / webhook, or let the code-mode agent call it. Each flow has an \"Enabled\" and an \"AI-callable\" switch below it.", + "workflowSidebarHint": "Open a Create Loop to edit its nodes on the canvas.", + "workflowNew": "New Create Loop", + "workflowEmpty": "No Create Loops yet", + "workflowEmptyHint": "Create one to chain AI tasks, conditions and HTTP calls.", + "workflowUntitled": "Untitled Create Loop", + "workflowDelete": "Delete Create Loop", + "workflowDeleteConfirm": "Delete this Create Loop?", + "workflowEdit": "Edit", + "workflowOpen": "Open", + "workflowRunNow": "Run once", + "workflowStop": "Stop", + "workflowSave": "Save", + "workflowSaved": "Saved", + "workflowBack": "Back", + "workflowName": "Name", + "workflowNamePlaceholder": "Name this Create Loop", + "workflowEnabled": "Enabled", + "workflowCallableByAgent": "Callable by the agent (run_workflow tool)", + "workflowEnableShort": "Enabled", + "workflowEnableHint": "When on, this flow fires on its schedule / webhook / local API.", + "workflowCallableShort": "AI-callable", + "workflowCallableHint": "Let the code-mode agent run it directly via run_workflow.", + "workflowCallableNeedsEnable": "Enable the flow first before the agent can call it.", + "workflowLastRun": "Last run", + "workflowNextRun": "Next run", + "workflowNeverRun": "Never", + "workflowLastResult": "Last result", + "workflowNodeCount": "{{count}} nodes", + "workflowStatus_idle": "Idle", + "workflowStatus_running": "Running", + "workflowStatus_success": "Success", + "workflowStatus_error": "Error", + "workflowPalette": "Nodes", + "workflowCollapsePanel": "Collapse panel", + "workflowExpandPanel": "Expand panel", + "workflowRunFinished": "Run finished", + "workflowViewCanvas": "Canvas", + "workflowViewList": "List", + "workflowGroup_trigger": "Triggers", + "workflowGroup_ai": "AI", + "workflowGroup_flow": "Flow control", + "workflowGroup_data": "Data", + "workflowGroup_action": "Actions", + "workflowGroup_custom": "Custom", + "workflowPresetEmpty": "Save any node as a preset to reuse it here.", + "workflowPresetDelete": "Delete preset", + "workflowPresetSaved": "Saved to Custom", + "workflowSaveAsPreset": "Save as preset", + "workflowSaveAsPresetButton": "Save", + "workflowSaveAsPresetHint": "Adds a reusable item under Custom with this node's current settings.", + "workflowNode_custom": "Custom module", + "workflowNode_template": "Format text", + "workflowNode_json": "JSON", + "workflowNode_output": "Output", + "workflowTemplate": "Template", + "workflowTemplateOutput": "Output as", + "workflowTemplateOutputText": "Text", + "workflowTemplateOutputJson": "JSON (parse the rendered text)", + "workflowTemplateHint": "Renders a text string from the payload — reference the incoming text or json.field values. Fills the gap where Set fields only makes JSON.", + "workflowJsonMode": "Mode", + "workflowJsonParse": "Parse text → JSON", + "workflowJsonStringify": "Stringify JSON → text", + "workflowJsonStrict": "Fail if the text isn't valid JSON", + "workflowJsonHint": "Convert between the incoming text and structured JSON.", + "workflowOutputHint": "Marks the Create Loop's final output — what run_workflow, the local /workflow/run API, and the run viewer return.", + "workflowOutputMode": "Output", + "workflowOutputModeAuto": "Pass through incoming", + "workflowOutputModeText": "Render a text template", + "workflowOutputModeJson": "Extract a JSON path", + "workflowOutputText": "Text template", + "workflowOutputJsonPath": "JSON path", + "workflowLocalApi": "Call via local HTTP", + "workflowLocalApiCopy": "Copy curl", + "workflowLocalApiHint": "Runs an enabled Create Loop synchronously over localhost and returns its output. Set a webhook secret in Settings to require authentication.", + "workflowModuleMissing": "This module was deleted. Pick another module or remove this node.", + "workflowModuleNoFields": "This module has no input fields.", + "workflowModulesManage": "Manage modules", + "workflowModulesTitle": "Custom modules", + "workflowModulesDone": "Done", + "workflowModulesEmpty": "No modules yet.", + "workflowModulesPick": "Select a module, or create one.", + "workflowModuleNew": "New module", + "workflowModuleNewName": "New module", + "workflowModuleName": "Name", + "workflowModuleDescription": "Description", + "workflowModuleDescriptionPlaceholder": "What this module does", + "workflowModuleDelete": "Delete module", + "workflowModuleFields": "Input fields", + "workflowModuleFieldsHint": "Add fields to show a form on the node; read them in the script via $fields / $WORKFLOW_FIELDS.", + "workflowModuleAddField": "Add field", + "workflowModuleRemoveField": "Remove field", + "workflowModuleFieldKey": "key", + "workflowModuleFieldLabel": "Label", + "workflowModuleFieldDefault": "Default value", + "workflowModuleFieldOptions": "Options (comma-separated)", + "workflowModuleFieldType_text": "Text", + "workflowModuleFieldType_textarea": "Text area", + "workflowModuleFieldType_number": "Number", + "workflowModuleFieldType_boolean": "Toggle", + "workflowModuleFieldType_select": "Dropdown", + "workflowModuleCodeHint": "Runs like the Code node. Field values are in $fields (JS) or $WORKFLOW_FIELDS (env), alongside $json / $text.", + "workflowAddNode": "Add node", + "workflowConfig": "Node settings", + "workflowNoSelection": "Select a node to edit it.", + "workflowDeleteNode": "Delete node", + "workflowNodeDisabled": "Disabled", + "workflowEmptyCanvas": "Add a node from the left to get started.", + "workflowNoTrigger": "Add a trigger node before running.", + "workflowNode_manual-trigger": "Manual trigger", + "workflowNode_schedule-trigger": "Schedule trigger", + "workflowNode_webhook-trigger": "Webhook trigger", + "workflowNode_ai-agent": "AI agent task", + "workflowNode_generate-image": "Generate image", + "workflowNode_condition": "Condition", + "workflowNode_switch": "Switch", + "workflowNode_code": "Code", + "workflowNode_merge": "Merge", + "workflowNode_subworkflow": "Run Create Loop", + "workflowNode_loop": "Loop", + "workflowNode_filter": "Filter", + "workflowNode_set-fields": "Set fields", + "workflowNode_sort": "Sort", + "workflowNode_limit": "Limit", + "workflowNode_aggregate": "Aggregate", + "workflowNode_http-request": "HTTP request", + "workflowNode_delay": "Delay", + "workflowNode_parameter-extractor": "Parameter Extractor", + "workflowNode_question-classifier": "Question Classifier", + "workflowNode_human-approval": "Human Approval", + "workflowApprovalHint": "The run pauses here until you Approve/Reject it in the run drawer. Note: the paused state is in-memory — an app restart loses the run.", + "workflowApprovalTitle": "Approval title", + "workflowApprovalTitlePlaceholder": "e.g. Confirm before publishing", + "workflowApprovalInstruction": "Instruction", + "workflowApprovalInstructionPlaceholder": "Shown to the approver; may reference upstream variables.", + "workflowApprovalTimeout": "Timeout (ms)", + "workflowApprovalTimeoutHint": "Auto-decide after this long; 0 waits indefinitely.", + "workflowApprovalOnTimeout": "On timeout", + "workflowApprovalApproved": "Approved", + "workflowApprovalRejected": "Rejected", + "workflowApprovalApprove": "Approve", + "workflowApprovalReject": "Reject", + "workflowExtractSource": "Source text", + "workflowExtractSourceHint": "Expression for the text to extract from; empty uses the upstream text. Supports json.field and $nodes.id.json.path references.", + "workflowExtractInstruction": "Extraction guidance", + "workflowExtractInstructionPlaceholder": "Optional guidance for the model, e.g. amounts as numbers, dates as YYYY-MM-DD.", + "workflowClassifySourceHint": "Expression for the text to classify; empty uses the upstream text.", + "workflowClassifyInstructionPlaceholder": "Optional classification guidance, e.g. judge by user intent.", + "workflowClassifyCategories": "Categories", + "workflowClassifyAddCategory": "Add category", + "workflowClassifyCategoryLabel": "Category label", + "workflowClassifyRemoveCategory": "Remove category", + "workflowNodeName": "Label", + "workflowTriggerWorkspace": "Working directory", + "workflowTriggerWorkspaceHint": "Default folder this Create Loop runs in (used by AI / image / code nodes). Empty uses the app workspace. Use {{json.field}} to pass it in as a run input.", + "workflowModelEmptyHint": "If unset, uses Kun's current default model (the same one chat uses).", + "workflowNodeInputs": "Reference upstream fields", + "workflowNodeInputsHint": "Upstream output is already passed to this node automatically. Only name a field here if you want to reference it precisely inside the prompt.", + "workflowNodeInputAdd": "Add", + "workflowNodeInputKey": "Key", + "workflowNodeInputRemove": "Remove", + "workflowOptional": "optional", + "workflowInputSourceLabel": "Take which value", + "workflowInputSourceText": "Upstream output (plain text)", + "workflowInputSourceJson": "Upstream output (full JSON)", + "workflowInputSourceNodeText": "{{name}} · text", + "workflowInputSourceNodeJson": "{{name}} · output object", + "workflowInputSourceCustom": "Custom expression…", + "workflowInputSourceCustomPlaceholder": "e.g. {{json.field}} or {{$nodes.node.json.path}}", + "workflowInputNameLabel": "Name it", + "workflowInputNamePlaceholder": "e.g. title", + "workflowInputTypeLabel": "Type", + "workflowInputRefPreview": "Reference it in the prompt as:", + "workflowInputSchema": "Input fields", + "workflowInputSchemaHint": "Define typed inputs the caller provides — used by the Run form, the local /workflow/run API, and the agent's run_workflow. Each value lands on the run payload under its key.", + "workflowInputAddField": "Add input", + "workflowInputRemoveField": "Remove input", + "workflowInputKey": "key", + "workflowInputLabel": "Label", + "workflowInputDefault": "Default value", + "workflowInputRequired": "Required", + "workflowInputType_text": "Text", + "workflowInputType_paragraph": "Paragraph", + "workflowInputType_number": "Number", + "workflowInputType_boolean": "Toggle", + "workflowInputType_select": "Dropdown", + "workflowInputType_json": "JSON", + "workflowErrorHandling": "Error handling", + "workflowOnError": "On error", + "workflowOnError_fail": "Stop the whole run", + "workflowOnError_continue": "Skip this node and continue", + "workflowOnError_fallback": "Continue with fallback output", + "workflowRetries": "Retries", + "workflowRetryDelay": "Retry delay (ms)", + "workflowFallbackJson": "Fallback JSON", + "workflowFallbackJsonHint": "JSON used as this node's output after retries are exhausted.", + "workflowEnvVars": "Variables", + "workflowEnvVarsHint": "Shared across this Create Loop; reference from any node with $env.key. Secret-typed values are redacted from run history.", + "workflowEnvEmpty": "No variables yet. Add one to reference it from nodes via $env.key.", + "workflowEnvKey": "Key", + "workflowEnvValue": "Value", + "workflowEnvAdd": "Add variable", + "workflowEnvRemove": "Remove variable", + "workflowEnvType_string": "Text", + "workflowEnvType_number": "Number", + "workflowEnvType_boolean": "Boolean", + "workflowEnvType_secret": "Secret", + "workflowTabConfig": "Config", + "workflowTabRunLog": "Run log", + "workflowRunLog": "Run log", + "workflowRunLogEmpty": "After a run, each node's input and output appears here in execution order.", + "workflowRunLogWaiting": "Running…", + "workflowRunHistory": "Run history", + "workflowRunHistoryEmpty": "No runs yet. Run once to inspect each node's inputs, outputs, and timing here.", + "workflowRunStatus_idle": "Idle", + "workflowRunStatus_running": "Running", + "workflowRunStatus_success": "Success", + "workflowRunStatus_error": "Failed", + "workflowRetriesBadge": "{{n}}× retried", + "workflowResultError": "Error", + "workflowResultMessage": "Message", + "workflowResultInput": "Input", + "workflowResultOutput": "Output", + "workflowResultThread": "Thread", + "workflowImport": "Import", + "workflowExport": "Export", + "workflowImportError_invalid-json": "Import failed: not a valid JSON file.", + "workflowImportError_unsupported": "Import failed: unrecognized Create Loop file format.", + "workflowImportError_empty": "Import failed: the file has no nodes.", + "workflowVarPicker": "Insert variable", + "workflowVarCommon": "Common", + "workflowVarUpstream": "Upstream nodes", + "workflowVarSearch": "Search fields…", + "workflowVarNoMatch": "No matching variables", + "workflowDanglingTitle": "Some references are broken", + "workflowDanglingNode": "node not upstream", + "workflowDanglingField": "no such field", + "workflowTestNode": "Test node", + "workflowTestMock": "Mock upstream input (JSON)", + "workflowTestMockHint": "Used as this node's input payload. The Create Loop is saved first, then just this node runs.", + "workflowTestRun": "Run test", + "workflowRunWithInputs": "Run inputs", + "workflowHooks": "Triggers", + "workflowHooksHint": "Bind a Create Loop to the code-mode agent's hooks for reactive automation (e.g. review-after-edit).", + "workflowHooksEmpty": "No triggers yet. Add one to bind a loop to an agent hook phase.", + "workflowHookEnabled": "Enabled", + "workflowHookAdd": "Add trigger", + "workflowHookRemove": "Remove trigger", + "workflowHookWorkflow": "Loop to run", + "workflowHookPhase": "Hook phase", + "workflowHookMode": "Result handling", + "workflowHookToolNames": "Match tools (comma-separated)", + "workflowHookToolNamesHint": "Fire only when the agent calls these tools; empty matches all. Common: write, edit, bash.", + "workflowHookPhase_PreToolUse": "Before tool use", + "workflowHookPhase_PostToolUse": "After tool use", + "workflowHookPhase_UserPromptSubmit": "On user prompt", + "workflowHookPhase_TurnStart": "Turn start", + "workflowHookPhase_TurnEnd": "Turn end", + "workflowHookPhase_PreCompact": "Before compaction", + "workflowHookMode_observe": "Observe (run only, change nothing)", + "workflowHookMode_block": "Block (deny on failure or DENY)", + "workflowHookMode_rewrite": "Rewrite (fold output back)", + "workflowHookModeHint_observe": "Run the loop but don't change the agent's behavior or result.", + "workflowHookModeHint_block": "Deny this tool call / turn if the loop fails or its output starts with deny/block/reject.", + "workflowHookModeHint_rewrite": "Fold the loop output back: attach workflow_hook to the tool result, inject it as context, or rewrite arguments. The agent sees it next step.", + "workflowHookRecursionNote": "Recursion guard: while a trigger's loop is running, tool calls it causes (incl. its AI nodes) won't re-fire hooks — so it can't loop forever.", + "workflowScheduleKind": "Trigger type", + "workflowScheduleKind_manual": "Manual", + "workflowScheduleKind_interval": "Interval", + "workflowScheduleKind_daily": "Daily", + "workflowScheduleKind_at": "Once", + "workflowScheduleKind_cron": "Cron", + "workflowEveryMinutes": "Every (minutes)", + "workflowTimeOfDay": "Time", + "workflowAtTime": "Run at", + "workflowCron": "Cron expression", + "workflowCronPlaceholder": "e.g. 0 9 * * 1-5", + "workflowPrompt": "Prompt", + "workflowPromptPlaceholder": "Describe what the agent should do. Use {{token}} for the previous step's output.", + "workflowPromptUpstreamHint": "When you don't use {{ }}, upstream output is appended to the end of the prompt. Use {{ }} (e.g. {{text}}) to place it precisely.", + "workflowModelPickProviderFirst": "Select a provider first", + "workflowModelSearch": "Search models…", + "workflowModelUseCustom": "Use \"{{model}}\"", + "workflowModelNone": "No models — type to use a custom one", + "workflowImagePrompt": "Image prompt", + "workflowImagePromptPlaceholder": "Describe the image. Use {{token}} for the previous step's output.", + "workflowImageModel": "Image model", + "workflowImageSize": "Size", + "workflowImageOutputDir": "Save to folder", + "workflowImageOutputDirPlaceholder": "Default: /workflow-images", + "workflowImageHint": "Pick a provider to use its image model, or leave it on default to use Settings. The image is saved to the folder above (default /workflow-images) and its path becomes this node's output.", + "workflowConditionLeft": "Left value", + "workflowConditionLeftPlaceholder": "text, or json.field (empty = previous output)", + "workflowConditionOperator": "Operator", + "workflowConditionValue": "Compare value", + "workflowConditionCaseSensitive": "Case sensitive", + "workflowConditionTrue": "True", + "workflowConditionFalse": "False", + "workflowOp_contains": "contains", + "workflowOp_notContains": "does not contain", + "workflowOp_equals": "equals", + "workflowOp_notEquals": "not equal", + "workflowOp_startsWith": "starts with", + "workflowOp_endsWith": "ends with", + "workflowOp_isEmpty": "is empty", + "workflowOp_isNotEmpty": "is not empty", + "workflowOp_gt": "greater than", + "workflowOp_gte": "greater or equal", + "workflowOp_lt": "less than", + "workflowOp_lte": "less or equal", + "workflowHttpMethod": "Method", + "workflowHttpUrl": "URL", + "workflowHttpHeaders": "Headers", + "workflowHttpAddHeader": "Add header", + "workflowHeaderKey": "Key", + "workflowHeaderValue": "Value", + "workflowHttpBody": "Body", + "workflowHttpParseJson": "Parse response as JSON", + "workflowDelaySeconds": "Delay (seconds)", + "workflowFields": "Fields", + "workflowAddField": "Add field", + "workflowFieldKey": "Key", + "workflowFieldValue": "Value", + "workflowKeepIncoming": "Keep incoming fields", + "workflowArrayHint": "Runs over the array in the previous step's JSON output (a single object counts as one item).", + "workflowFilterHint": "Passes the data through only when the condition holds — otherwise this branch stops here.", + "workflowSortField": "Sort by field", + "workflowSortOrder": "Order", + "workflowSortAsc": "Ascending", + "workflowSortDesc": "Descending", + "workflowSortNumeric": "Compare as numbers", + "workflowLimitCount": "Keep count", + "workflowLimitFrom": "From", + "workflowLimitFirst": "First items", + "workflowLimitLast": "Last items", + "workflowAggregateMode": "Operation", + "workflowAggCount": "Count items", + "workflowAggSum": "Sum field", + "workflowAggCollect": "Collect field values", + "workflowAggJoin": "Join field into text", + "workflowAggregateField": "Field", + "workflowAggregateSeparator": "Separator", + "workflowLastOutput": "Last output", + "workflowRunNode": "Execute node", + "workflowEnableNode": "Enable", + "workflowDisableNode": "Disable", + "workflowSwitchRules": "Rules", + "workflowAddRule": "Add rule", + "workflowSwitchCase": "Output {{index}}", + "workflowSwitchFallback": "Add fallback output", + "workflowCode": "Script", + "workflowCodeLanguage": "Language", + "workflowCodeHintJs": "Runs sandboxed in-process. Receives $json and $text; return a value.", + "workflowCodeHintCmd": "Runs locally. Input arrives on stdin as JSON and via $WORKFLOW_JSON / $WORKFLOW_TEXT; whatever the script prints to stdout becomes the output (parsed as JSON when possible).", + "workflowCodeSyntaxError": "Syntax error", + "workflowCodeSyntaxOk": "Syntax OK", + "workflowMergeMode": "Merge mode", + "workflowMergeArray": "Collect into array", + "workflowMergeObject": "Merge objects", + "workflowSubWorkflowTarget": "Create Loop to run", + "workflowSubWorkflowNone": "Select a Create Loop…", + "workflowLoopBody": "Create Loop to run each iteration (the agent's job)", + "workflowLoopMax": "Max iterations", + "workflowLoopStopWhen": "Stop when the iteration output…", + "workflowLoopMode": "Loop mode", + "workflowLoopMode_condition": "Condition (repeat until a condition holds)", + "workflowLoopMode_foreach": "For each (run once per array item)", + "workflowLoopArraySource": "Array source", + "workflowLoopArraySourceHint": "Expression resolving to an array; empty uses the upstream payload json. Each item is available in the body as $loop.item / $loop.index.", + "workflowLoopExecution": "Execution", + "workflowLoopExecution_sequential": "Sequential (one at a time)", + "workflowLoopExecution_parallel": "Parallel (concurrent)", + "workflowLoopConcurrency": "Concurrency", + "workflowLoopContinueOnError": "On item error, skip it and continue (recorded as error)", + "workflowWebhookMethod": "Method", + "workflowWebhookPath": "Path", + "workflowWebhookUrl": "Local webhook URL", + "workflowRunStarted": "Create Loop started", + "loading": "Загрузка", + "cancel": "Отмена", + "confirm": "Подтвердить", + "processExpandDetail": "Expand details", + "processCollapseDetail": "Collapse details", + "scheduleSubtitle": "Design scheduled tasks, or start them whenever you need.", + "scheduleNewTask": "New task", + "scheduleAwakeNotice": "Scheduled tasks only run while this computer is awake.", + "scheduleKeepAwake": "Keep awake", + "scheduleFilter_all": "All", + "scheduleFilter_enabled": "Enabled", + "scheduleFilter_running": "Running", + "scheduleFilter_done": "Done", + "scheduleEmpty": "No scheduled tasks yet.", + "scheduleFilterEmpty": "No tasks match this filter.", + "scheduleCreateTask": "Create task", + "scheduleEditTask": "Edit task", + "scheduleDeleteTask": "Delete task", + "scheduleDeleteConfirm": "Delete this scheduled task?", + "scheduleRunNow": "Run once", + "scheduleOpenLastThread": "Open last run", + "scheduleUntitled": "Untitled task", + "scheduleAt": "One-time · {{datetime}}", + "scheduleEvery": "Every {{minutes}} min", + "scheduleDailyAt": "Daily at {{time}}", + "scheduleManual": "Manual", + "scheduleNextRun": "Next run", + "scheduleLastRun": "Last run", + "scheduleNotScheduled": "Not scheduled", + "scheduleNeverRun": "Never", + "scheduleLastResult": "Last result", + "scheduleLastError": "Last error", + "scheduleCurrentStatus": "Current status", + "scheduleExpandResult": "Expand", + "scheduleCollapseResult": "Collapse", + "scheduleTaskName": "Name", + "scheduleTaskNamePlaceholder": "Give this task a name", + "scheduleTaskNameRequired": "Task name is required.", + "scheduleTaskNameTooLong": "Task name must be 50 characters or fewer.", + "scheduleTaskSectionContent": "Task content", + "scheduleTaskSectionModel": "Model settings", + "scheduleTaskSectionTiming": "Run plan", + "scheduleTaskSectionEnvironment": "Environment", + "scheduleClawAgentLabel": "IM: {{name}}", + "scheduleClawAgentMissing": "IM: missing", + "scheduleClientMode": "Run client", + "scheduleClientModeCode": "Code", + "scheduleClientModeIm": "IM", + "scheduleClientModeImUnavailable": "Add and enable an IM connection before using IM mode.", + "scheduleImClient": "IM connection", + "scheduleImProviderFeishu": "Feishu", + "scheduleImProviderLark": "Lark", + "scheduleImProviderWeixin": "WeChat", + "scheduleProvider": "Provider", + "scheduleModel": "Model", + "scheduleReasoning": "Reasoning effort", + "scheduleReasoning_auto": "Auto", + "scheduleReasoning_off": "Off", + "scheduleReasoning_low": "Low", + "scheduleReasoning_medium": "Med", + "scheduleReasoning_high": "High", + "scheduleReasoning_max": "Ultra", + "scheduleTaskPrompt": "Instruction", + "scheduleTaskPromptPlaceholder": "Describe what you want the agent to do...", + "scheduleTaskPromptRequired": "Task instruction is required.", + "scheduleTaskPromptTooLong": "Task instruction must be 8000 characters or fewer.", + "scheduleRunAt": "Run time", + "scheduleKind_daily": "Daily", + "scheduleKind_at": "One-time", + "scheduleKind_interval": "Interval", + "scheduleKind_manual": "Manual", + "scheduleDailyTime": "Daily time", + "scheduleTimeHour": "Hour", + "scheduleTimeMinute": "Minute", + "scheduleAtTime": "Run at", + "scheduleEveryMinutes": "Every minutes", + "scheduleManualHint": "Manual tasks only run when you press Run once.", + "scheduleIntervalInvalid": "Interval must be at least 1 minute.", + "scheduleDailyTimeInvalid": "Daily time must use HH:mm.", + "scheduleAtTimeInvalid": "Choose a valid run time.", + "scheduleAtTimePast": "One-time enabled tasks must run in the future.", + "scheduleWorkspace": "Workspace", + "scheduleWorkspacePlaceholder": "Use Schedule default workspace", + "scheduleTaskEnabled": "Enable task", + "scheduleAdvancedSettings": "Schedule settings", + "scheduleDefaultsTitle": "Schedule defaults", + "scheduleGlobalEnabled": "Enable Schedule", + "scheduleDefaultWorkspace": "Default workspace", + "schedulePromptPrefix": "Prompt prefix", + "schedulePromptPrefixPlaceholder": "Prepended to scheduled task prompts", + "scheduleDefaultSkills": "Default Skills", + "scheduleDefaultSkillsPlaceholder": "Comma or newline separated", + "scheduleExtraSkillDirs": "Extra Skill directories", + "scheduleExtraSkillDirsPlaceholder": "One path per line", + "scheduleStatus_idle": "Idle", + "scheduleStatus_running": "Running", + "scheduleStatus_queued": "Queued", + "scheduleTaskPriority": "Priority", + "scheduleTaskIsolation": "Isolation", + "scheduleTaskUseWorktree": "Use isolated worktree", + "scheduleTaskDependencies": "Run after", + "scheduleStatus_success": "Success", + "scheduleStatus_error": "Error", + "clawReload": "Reload", + "clawCoreTitle": "Kun", + "clawSkillAllowlist": "Default Skills", + "clawSkillAllowlistHint": "Comma or newline separated; used as a skill policy hint for Kun tasks", + "clawExtraSkillDirs": "Extra Skill directories", + "clawExtraSkillDirsHint": "Comma or newline separated; local Skill directories phone-connection tasks may reference", + "clawImTitle": "Feishu / Lark Bridge", + "clawDeepseekTitle": "Connect phone", + "clawEnabled": "Phone connection enabled", + "clawDisabled": "Phone connection disabled", + "clawImRunning": "IM webhook running", + "clawImStopped": "IM webhook stopped", + "clawSave": "Save phone connection", + "clawSaved": "Phone connection settings saved", + "clawDeepseekSubtitle": "Phone connections use the local Kun HTTP runtime to create threads and turns; scheduled tasks and IM messages enter the same Kun runtime.", + "clawMasterSwitch": "Enable background automation", + "clawMasterSwitchHint": "Enabling starts scheduled tasks, the Feishu / Lark bridge, and the local IM webhook. Normal GUI chats are unaffected.", + "clawDefaultWorkspace": "Default workspace", + "clawDefaultWorkspaceHint": "From the GUI working directory", + "clawRecentThreadListLimit": "Recent conversations shown", + "clawRecentThreadListLimitDesc": "How many recent Kun conversations /list-threads returns in IM.", + "clawPromptPrefix": "Phone connection prompt", + "clawPromptPrefixHint": "Prepended to IM and scheduled task prompts", + "clawPromptPrefixPlaceholder": "Example: You are my personal automation assistant. Before answering, identify the task source and current context.", + "clawWebhookSubtitle": "The GUI connects directly to bound Feishu / Lark apps and also keeps a local webhook for optional external relays.", + "clawImWebhook": "Enable IM webhook", + "clawImWebhookHint": "Listens on 127.0.0.1. Built-in Feishu / Lark direct connections do not depend on it; external relays do.", + "clawImProvider": "Platform", + "clawWebhookPort": "Port", + "clawWebhookPath": "Path", + "clawWebhookContract": "POST JSON: { \"text\": \"message\", \"sender\": \"user-id\" }; returns { reply, threadId }.", + "clawWebhookSecret": "Webhook secret", + "clawWebhookSecretHint": "Send with Authorization: Bearer or x-kun-secret (legacy x-deepseek-gui-secret also works)", + "clawWebhookEnabled": "Webhook", + "clawWebhookEnabledDesc": "Built-in Feishu / Lark direct connections do not depend on the local webhook. Change this only when you also use an external relay or forwarder.", + "clawResponseTimeout": "Response timeout (seconds)", + "clawRunMode": "Run mode", + "clawWorkspaceOverrideHint": "Optional. Enter a custom working directory", + "clawWorkspaceOverrideDesc": "If left empty, this IM uses the default working directory:", + "clawTasksTitle": "Scheduled tasks", + "clawTasksSubtitle": "Each task creates a separate Kun thread and sends its prompt on schedule.", + "clawTaskAdd": "Add task", + "clawTasksEmpty": "No scheduled tasks yet.", + "clawTaskSelectHint": "Select or add a task.", + "clawScheduleManual": "Manual", + "clawScheduleEvery": "Every {{minutes}} min", + "clawScheduleDaily": "Daily at {{time}}", + "clawScheduleAt": "One-time · {{datetime}}", + "clawTaskEditor": "Task editor", + "clawTaskLastRun": "Last run", + "clawNever": "Never", + "clawRunNow": "Run once", + "clawTaskTitle": "Task name", + "clawTaskEnabled": "Enable task", + "clawScheduleKind": "Schedule type", + "clawScheduleInterval": "Interval", + "clawScheduleDailyShort": "Daily", + "clawScheduleAtShort": "One-time", + "clawEveryMinutes": "Interval minutes", + "clawTimeOfDay": "Daily time", + "clawAtTime": "Run at", + "clawTaskPrompt": "Task prompt", + "clawTaskPromptHint": "This text is sent directly to Kun", + "clawTaskPromptPlaceholder": "Example: Summarize recent git changes in this workspace and list anything I should follow up on.", + "clawNextRun": "Next run", + "clawNotScheduled": "Not scheduled", + "clawLastStatus": "Last status", + "clawLastThread": "Last thread", + "clawTaskStarted": "Task submitted to Kun: {{threadId}}", + "clawSidebarIm": "IM", + "clawSettings": "Phone connection settings", + "clawAddIm": "Add IM", + "clawManageIm": "Manage IM connections", + "clawAddImTitle": "Add IM", + "clawAddImSubtitle": "Phone connection supports one Feishu/Lark connection and one WeChat connection. Set connection defaults first, then the Agent prompt, then finish QR setup.", + "clawAddImEmptyTitle": "No new connection is available", + "clawAddImEmptyDesc": "All currently supported IM connections have already been added. Close this dialog and use the settings button to manage the existing one.", + "clawManageImTitle": "Manage IM connections", + "clawManageImSubtitle": "This dialog only edits IM connections that are already in the sidebar. It does not create new bindings.", + "clawManageImChooseProvider": "Connected", + "clawManageImConnected": "Connected", + "clawManageImConfiguredStatus": "You are editing an existing connection", + "clawManageImSelectTitle": "Choose an IM connection to manage", + "clawManageImSelectDesc": "Pick one connected IM first, then edit its Agent name, persona, model, and workspace.", + "clawManageImEditing": "Editing", + "clawManageImBackToList": "Back to connection list", + "clawManageImEditSelected": "Edit settings", + "clawManageImFooterHint": "Choose a connected IM to open its settings", + "clawManageImEmptyTitle": "No connection has been added yet", + "clawManageImEmptyDesc": "Bind an IM connection from the add dialog first, then come back here to edit its configuration.", + "clawAddImChooseProvider": "Integration", + "clawAddImAlreadyAdded": "Added", + "clawAddImCanAddAnother": "Already added, but you can add another bot", + "clawAddImOfficialQrBinding": "Official QR setup", + "clawAddImPayloadRelayBinding": "Relay payload", + "clawAddImScanRelayBinding": "Scan relay", + "clawAddImCredentialRelayBinding": "Bot credential relay", + "clawAddImWebhookRelayBinding": "Webhook relay", + "clawAddImConfiguredStatus": "This IM connection is already in the sidebar", + "clawAddImReadyForOfficialQrStatus": "Ready to generate an official QR", + "clawAddImReadyForPayloadStatus": "Ready for relay payload", + "clawAddImReadyToScanStatus": "Ready to scan", + "clawAddImReadyForRelayStatus": "Ready for bot relay", + "clawAddImReadyForWebhookStatus": "Ready for webhook", + "clawAddImConnectionMethod": "Connection method", + "clawAddImModeOfficialQr": "Official QR", + "clawAddImModePayload": "Relay payload", + "clawAddImModeQr": "QR scan", + "clawAddImModeBotToken": "Bot credentials", + "clawAddImModeWebhook": "Webhook", + "clawAddImOfficialQrTitle": "Official authorization QR", + "clawAddImScanTitle": "Scan to bind", + "clawAddImPayloadQrTitle": "Payload QR", + "clawAddImPayloadTitle": "Payload", + "clawAddImBindingInfo": "Binding payload", + "clawAddImOfficialQrHint": "This integration uses a real platform authorization QR. After the platform scan succeeds, the desktop bridge returns the credentials or account binding.", + "clawAddImRelayPayloadHint": "This platform does not have a built-in official scan flow here yet. The payload is for a local relay or companion client, not for the IM mobile app scanner.", + "clawAddImScanHint": "Use this for IM relays or companion clients that can scan an install payload. The QR only contains the local webhook endpoint, provider, and Agent name.", + "clawAddImCredentialHint": "This platform does not use local QR binding in the current Claw flow. Get the Bot/App credentials through the platform, run a custom relay with them, then forward messages to the local webhook.", + "clawAddImWebhookHint": "Use this when you already have a custom relay service. The service should post IM messages to the local webhook using the payload fields.", + "clawAddImPayloadHint": "The payload never includes platform credentials. Keep bot tokens, secrets, AES keys, and similar values only in the relay or platform app configuration.", + "clawAddImOfficialBindingHint": "This panel shows official QR authorization status. After binding, this platform gets its own sidebar connection. The local webhook is still available for optional external relays.", + "clawAddImInstallTarget": "Authorization target", + "clawAddImInstallTargetHint": "Feishu (mainland) and Lark (international) share the same integration path. Choose the environment you want to authorize here.", + "clawAddImTargetFeishu": "Feishu", + "clawAddImTargetLark": "Lark", + "clawAddImTargetWeixin": "WeChat", + "clawAddImTargetTelegram": "Telegram", + "connectPhoneTelegramBotTokenLabel": "Bot Token", + "connectPhoneTelegramBotTokenPlaceholder": "123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11", + "connectPhoneTelegramAllowedChatsLabel": "Allowed Private Chat IDs (optional)", + "connectPhoneTelegramAllowedChatsPlaceholder": "e.g. 123456789, 987654321", + "connectPhoneTelegramAllowedChatsHint": "Comma-separated private chat IDs. Leave empty to allow all private messages; group chats are not supported.", + "connectPhoneTelegramConnect": "Connect", + "connectPhoneTelegramConnecting": "Verifying…", + "connectPhoneTelegramTokenRequired": "Please enter a Bot Token.", + "connectPhoneTelegramErrorInvalidFormat": "Invalid bot token format. Expected \":<35+ chars>\".", + "connectPhoneTelegramErrorRejected": "Telegram rejected this token. Make sure it's complete and not revoked.", + "connectPhoneTelegramErrorNetwork": "Cannot reach the Telegram Bot API. Make sure this network or system proxy can access api.telegram.org, then retry.", + "connectPhoneTelegramErrorUnknown": "Verification failed. Please retry later.", + "connectPhoneTelegramErrorPayload": "Invalid request payload. Please check your input and retry.", + "connectPhoneTelegramScanHint": "Enter your Telegram Bot token to start receiving messages.", + "connectPhoneTelegramSetupTitle": "Connect via Telegram Bot", + "connectPhoneTelegramSetupHint": "Telegram uses a Bot Token instead of a QR code. Create a bot with @BotFather, then enter the token in Settings.", + "connectPhoneTelegramStep1": "Open Telegram and find @BotFather", + "connectPhoneTelegramStep2": "Send /newbot to create your bot and get the Bot Token", + "connectPhoneTelegramStep3": "Copy the Bot Token, go to Settings → Connect phone, and paste it", + "connectPhoneTelegramGoSettings": "Open Settings", + "clawTelegramConnectTitle": "Connect Telegram Bot", + "clawTelegramConnectDesc": "Enter the Bot Token from @BotFather to let this computer receive Telegram messages.", + "clawTelegramCredentialTitle": "Telegram Bot Credentials", + "connectPhoneTitle": "Use your phone to connect kun", + "connectPhoneSubtitle": "Access this computer through an IM tool so you can keep working from your phone.", + "connectPhoneGenerateQr": "Generate authorization QR", + "connectPhoneQrLoading": "Generating QR…", + "connectPhoneBinding": "Binding", + "connectPhoneScanHint": "Scan with Feishu/Lark to open the authorization page.", + "connectPhoneScanHintWeixin": "Scan with WeChat to sign in.", + "connectPhoneAutoBindHint": "Confirm authorization on your phone and this will bind automatically.", + "connectPhoneUserCode": "Code {{code}}", + "connectPhoneAlreadyConnected": "A phone connection already exists. Manage the existing connection in settings.", + "connectPhoneProviderAlreadyConnected": "{{provider}} is already connected. Each platform can only be connected once.", + "connectPhoneDisconnect": "Disconnect phone", + "connectPhoneDisconnecting": "Disconnecting", + "connectPhoneDisconnectConfirm": "Disconnect \"{{name}}\" from this computer? You can scan again later.", + "connectPhoneDisabledConnectionHint": "The existing connection is disabled. Manage it in settings to turn it back on.", + "connectPhonePreviewUser": "Check the latest proposal docs in the “Z project” folder on my computer and send me an outline.", + "connectPhonePreviewAssistant": "I read 3 documents and drafted the outline, with emphasis on our smart-park technical advantages. Should I turn it into a full draft?", + "connectPhonePreviewDone": "Done", + "connectPhonePreviewInput": "Send to kun", + "clawAddImRelayOnlyTitle": "No mobile-scan QR here", + "clawAddImRelayOnlyHint": "In LobsterAI these platforms use a dedicated SDK, plugin backend, or manual credentials. This panel only copies the relay payload.", + "clawAddImGenerateOfficialQr": "Generate official QR", + "clawAddImGeneratingOfficialQr": "Generating QR…", + "clawAddImOfficialQrTimeLeft": "Expires in {{seconds}}s", + "clawAddImOfficialQrSuccess": "Scan succeeded", + "clawAddImOfficialQrFailed": "QR flow failed", + "clawAddImOfficialQrUnavailable": "Desktop bridge is unavailable here. Generate this QR inside the Electron app.", + "clawAddImWeixinBridgeMissing": "WeChat login service is unavailable. Restart the app and try again; if it still fails, the app's built-in WeChat login component did not start successfully.", + "clawAddImOfficialQrExpired": "QR code expired. Generate a new one.", + "clawAddImOfficialQrRetry": "Generate again", + "clawAddImOfficialCredentialReady": "The platform binding was obtained and will be saved locally with this connection.", + "clawAddImOfficialCredentialWaiting": "Complete the official QR authorization before binding and adding.", + "clawAddImCredentialFeishuAppId": "appId", + "clawAddImCredentialFeishuAppSecret": "appSecret", + "clawAddImCredentialWeixinAccountId": "accountId", + "clawAddImCredentialDingtalkClientId": "clientId", + "clawAddImCredentialDingtalkClientSecret": "clientSecret", + "clawAddImCredentialQqAppId": "appId", + "clawAddImCredentialQqAppSecret": "appSecret", + "clawAddImCredentialWecomBotId": "botId", + "clawAddImCredentialWecomSecret": "secret", + "clawAddImCredentialNimAppKey": "appKey", + "clawAddImCredentialNimAccount": "account", + "clawAddImCredentialNimToken": "token", + "clawAddImCredentialPopoAppKey": "appKey", + "clawAddImCredentialPopoAppSecret": "appSecret", + "clawAddImCredentialPopoAesKey": "aesKey", + "clawAddImCredentialNeteaseBeeClientId": "clientId", + "clawAddImCredentialNeteaseBeeSecret": "secret", + "clawAddImCredentialTelegramBotToken": "botToken", + "clawAddImCredentialSlackAppToken": "appToken xapp", + "clawAddImCredentialSlackBotToken": "botToken xoxb", + "clawAddImCredentialSlackSigningSecret": "signingSecret", + "clawAddImCredentialDiscordBotToken": "botToken", + "clawAddImCredentialGeneric": "credential", + "clawAddImGuideQr1": "Scan the payload QR with the matching IM relay or companion client.", + "clawAddImGuideQr2": "The relay reads the webhook endpoint, provider, and secret, then converts IM messages into POST requests.", + "clawAddImGuideQr3": "Click “Bind and add” when ready. This IM gets its own Claw session in the sidebar.", + "clawAddImGuideRelay1": "Do not scan this payload with the IM mobile app directly. It is configuration for a local relay or companion client.", + "clawAddImGuideRelay2": "The relay reads endpoint, provider, and secret, then handles the actual IM platform integration.", + "clawAddImGuideRelay3": "Click “Bind and add” after the relay is configured. This IM gets its own Claw session in the sidebar.", + "clawAddImGuideWechat1": "WeChat scanning is generated by Kun's WeChat login service and uses the real WeChat authorization flow.", + "clawAddImGuideWechat2": "After confirmation on the phone, the desktop app waits for authorization and stores the returned WeChat account binding locally.", + "clawAddImGuideWechat3": "After binding, WeChat and Feishu/Lark can coexist in the sidebar; WeChat messages enter the matching phone Agent conversation.", + "clawAddImGuideWecom1": "LobsterAI's WeCom quick setup uses @wecom/wecom-aibot-sdk to open the official auth window and return botId plus secret.", + "clawAddImGuideWecom2": "The current Claw flow expects WeCom relay credentials; keep them in the relay, not in a QR code.", + "clawAddImGuideWecom3": "After configuring botId/secret, have the relay POST WeCom messages to the local endpoint.", + "clawAddImGuideFeishuOfficial1": "Choose Feishu or Lark, generate an official QR, then scan it with the matching client to authorize a PersonalAgent app.", + "clawAddImGuideFeishuOfficial2": "After scanning, polling returns appId/appSecret. They are saved locally and never written into the QR.", + "clawAddImGuideFeishuOfficial3": "After binding, the desktop app uses these credentials to connect to Feishu / Lark directly. If you also run a custom relay, you can still forward messages to the local endpoint.", + "clawAddImGuideDingtalkOfficial1": "Generate an official QR and scan it with DingTalk to complete app registration.", + "clawAddImGuideDingtalkOfficial2": "After scanning, polling returns clientId/clientSecret. They are saved locally and never written into the QR.", + "clawAddImGuideDingtalkOfficial3": "A relay service still needs to use those credentials to receive DingTalk messages and forward them to the local endpoint.", + "clawAddImGuideQq1": "LobsterAI's QQ integration uses QQ Open Platform app credentials rather than mobile QR binding.", + "clawAddImGuideQq2": "Create a QQ bot, copy appId and appSecret, and configure them in a relay service.", + "clawAddImGuideQq3": "Forward QQ messages to the local endpoint, and use an allowlist or pairing code in the relay when possible.", + "clawAddImGuideNim1": "LobsterAI's NIM scan flow first requests https://lbs.netease.im/lbs/getQrCode, then scans with the NetEase IM client.", + "clawAddImGuideNim2": "Polling queryBindAiAccountByQrCode returns appKey/account/token after the scan. This is not a generic QR payload.", + "clawAddImGuideNim3": "The current Claw flow expects NIM relay credentials, then forwards messages to the local endpoint.", + "clawAddImGuidePopo1": "LobsterAI's POPO scan creates a taskToken and turns it into a POPO official H5 URL for the QR value.", + "clawAddImGuidePopo2": "After scanning, POPO open-api polling returns appKey/appSecret/aesKey. Local JSON cannot replace that link.", + "clawAddImGuidePopo3": "The current Claw flow expects POPO relay credentials, then forwards messages to the local endpoint.", + "clawAddImGuideNeteaseBee1": "Netease Bee integration mainly uses platform credentials such as clientId plus secret.", + "clawAddImGuideNeteaseBee2": "No Feishu/DingTalk-style device QR flow was found; configure it through platform credentials.", + "clawAddImGuideNeteaseBee3": "Have the relay forward received messages through the local webhook contract.", + "clawAddImGuideWebhook1": "Copy the payload and add the endpoint, provider, and secret to your external webhook or relay service.", + "clawAddImGuideWebhook2": "When the external service receives an IM message, POST provider, text, and sender to the local endpoint.", + "clawAddImGuideWebhook3": "Click “Bind and add” when ready. Future messages enter this IM’s dedicated Claw session.", + "clawAddImGuideTelegram1": "Create a Telegram bot with BotFather and copy the botToken.", + "clawAddImGuideTelegram2": "Start a Telegram relay service with that botToken, then forward messages to the local endpoint.", + "clawAddImGuideTelegram3": "Enable a pairing code or allowlist in the relay so unknown accounts cannot wake the Agent directly.", + "clawAddImGuideSlack1": "Create a Slack App. Socket Mode needs an appToken, and bot messages need a botToken.", + "clawAddImGuideSlack2": "Enable Socket Mode or Events API so the Slack App can receive messages and forward them to the local endpoint.", + "clawAddImGuideSlack3": "If you use Events API, validate requests with signingSecret. Do not put these secrets in the QR payload.", + "clawAddImGuideDiscord1": "Create an Application/Bot in the Discord Developer Portal and copy the botToken.", + "clawAddImGuideDiscord2": "Invite the bot to the server or DM flow, and enable Message Content Intent when needed.", + "clawAddImGuideDiscord3": "Start a Discord relay service and forward received messages to the local endpoint.", + "clawAddImEndpoint": "Webhook endpoint", + "clawAddImSecretIncluded": "This binding payload includes the webhook secret. Copy it only into a trusted relay.", + "clawAddImSecretEmpty": "No webhook secret is set, so the relay can post directly to the local endpoint.", + "clawAddImCopyBinding": "Copy binding payload", + "clawAddImCopied": "Copied", + "clawAddImCreate": "Bind and add", + "clawAddImCreating": "Adding", + "clawAddImSave": "Save settings", + "clawAddImSaving": "Saving", + "clawAddImClose": "Close", + "clawAddImCancel": "Cancel", + "clawAddImPrevStep": "Previous", + "clawAddImNextStep": "Next", + "clawAddImStepCounter": "Step {{current}} / {{total}}", + "clawAddImLoading": "Loading", + "clawAddImSetupFlow": "Setup flow", + "clawAddImSectionDefaults": "Connection defaults", + "clawAddImSectionDefaultsDesc": "Name, model, and workspace", + "clawAddImSectionPrompt": "Agent prompt", + "clawAddImSectionPromptDesc": "Identity, persona, context, and reply rules", + "clawAddImSectionProfile": "Agent", + "clawAddImSectionProfileDesc": "Name, prompt profile, and runtime defaults", + "clawAddImSectionConnect": "Connection setup", + "clawAddImSectionConnectDesc": "Official QR, connection status, and advanced settings", + "clawAddImSectionRelay": "Webhook / Relay", + "clawAddImSectionRelayDesc": "Local endpoint, secret, and relay payload", + "clawAddImAdvancedTitle": "Advanced settings", + "clawAddImAdvancedDesc": "Webhook, run mode, secret, and relay payload", + "clawAddImSummaryConnection": "Connection", + "clawAddImSummaryCredentials": "Credentials", + "clawAddImSummaryEndpoint": "Local endpoint", + "clawAddImProfileBasics": "Connection defaults", + "clawAddImProfileBasicsDesc": "Controls the sidebar name for this IM and the default model and workspace it uses.", + "clawAddImPersonaTitle": "Agent prompt profile", + "clawAddImPersonaDesc": "These instructions are injected into new requests from this connection.", + "clawAddImAgentName": "Agent name", + "clawAddImAgentNamePlaceholder": "{{provider}} Agent", + "clawAddImAgentDescription": "Short description", + "clawAddImAgentDescriptionPlaceholder": "Example: Answers project questions in the Feishu chat", + "clawAddImTabIdentity": "Identity", + "clawAddImTabPersonality": "Personality", + "clawAddImTabAboutYou": "About you", + "clawAddImTabReplyRules": "Reply rules", + "clawAddImIdentityHelp": "Define who this IM Agent is, including role, scope, capabilities, and boundaries.", + "clawAddImPersonalityHelp": "Define tone, expression style, patience, and whether it should ask follow-up questions.", + "clawAddImAboutHelp": "Add persistent user, team, or preference context this Agent should remember.", + "clawAddImReplyRulesHelp": "Define response format, length, step style, and risk-confirmation rules.", + "clawAddImIdentityPlaceholder": "Example: You are a development assistant in the project chat. Explain code, organize tasks, and flag risks.", + "clawAddImPersonalityPlaceholder": "Example: Be concise, professional, and direct. State assumptions when information is uncertain.", + "clawAddImAboutPlaceholder": "Example: The user coordinates product and engineering, prefers Chinese, short conclusions, and action lists.", + "clawAddImReplyRulesPlaceholder": "Example: Start with the answer, then explain why. List impact when commands or code changes are involved.", + "clawImDisabledSidebar": "This IM is disabled", + "clawNoImTitle": "No IM connection added", + "clawNoImSub": "Add Feishu/Lark or WeChat and each connection will map directly to one Claw conversation.", + "clawChannelEmpty": "No remote message yet. The local conversation will be created after this connection receives its first message.", + "clawChannelOpen": "Open", + "clawClearSession": "Clear current conversation", + "clawDeleteIm": "Delete IM", + "clawDeleteImConfirm": "Delete IM \"{{name}}\" and its local conversation configuration? This cannot be undone.", + "clawSessionCleared": "Claw session cleared.", + "clawModelChanged": "Claw model switched to {{model}}.", + "clawModelChangedWithProvider": "Claw model switched to {{model}} with provider {{provider}}.", + "clawModelCurrent": "Current Claw model: `{{model}}`.", + "clawModelCurrentWithProvider": "Current provider: `{{provider}}`.\nCurrent model: `{{model}}`.", + "clawModelAvailableList": "Available models:", + "clawModelSwitchHint": "Switch model with `/model `.", + "clawModelInvalidNumber": "Invalid model number `{{value}}`. Send `/list-model` to see available numbers.", + "clawModelListEmpty": "No usable text models are available yet. Add models for a provider in Settings first.", + "clawNoActiveIm": "Add or select a Feishu / Lark connection before sending a Claw message.", + "clawNewSessionStarted": "Cleared the current Claw conversation for this Feishu / Lark connection.", + "clawHelpTitle": "Available commands", + "clawHelpCommandHelp": "Show this command help", + "clawHelpCommandNew": "Clear the current conversation for the active Feishu / Lark connection", + "clawHelpCommandClear": "Same as /new", + "clawHelpCommandModelList": "List available text models", + "clawHelpCommandModelSwitch": "Switch to a model listed by /list-model", + "clawTimelineInbound": "From {{source}}", + "clawTimelineSender": "Sender {{sender}}", + "clawTimelineChatType": "{{chatType}} chat", + "clawTimelineMessageType": "{{messageType}} message", + "clawTimelineMentions": "Mentions {{mentions}}", + "sidebarSkill": "Skill", + "sidebarMcp": "MCP", + "pluginTabMcp": "MCP", + "pluginTabSkill": "Skill", + "pluginManage": "Manage", + "pluginCreate": "Create", + "pluginMcpTitle": "Connect external tools to the agent", + "pluginSkillTitle": "Make the agent work your way", + "pluginSearchMcp": "Search MCP", + "pluginSearchSkill": "Search Skill", + "pluginFilterAll": "All", + "pluginFilterRecommended": "Recommended", + "pluginFilterInstalled": "Added", + "pluginBuiltIn": "Built-in", + "pluginRecommended": "Recommended", + "pluginPersonal": "Personal", + "pluginNoResults": "No matching plugins.", + "pluginPersonalEmpty": "No matching added plugins yet.", + "pluginAdd": "Add", + "pluginAdded": "Added", + "pluginAlreadyAdded": "This plugin has already been added.", + "pluginActionFailed": "Action failed", + "pluginMcpAdded": "MCP config updated: {{path}}", + "pluginMcpEnable": "Enable", + "pluginMcpDisable": "Disable", + "pluginMcpEnabled": "MCP server enabled", + "pluginMcpDisabled": "MCP server disabled", + "pluginMcpStatusDisabled": "Disabled", + "pluginSkillAdded": "Skill saved: {{path}}", + "pluginMcpRestartHint": "After saving MCP config, a running local runtime may need a restart before the change fully applies.", + "pluginMcpRuntimeOverlay": "Runtime overlay", + "pluginMcpRuntimeRefresh": "Refresh", + "pluginMcpRuntimeUnavailable": "Runtime diagnostics are unavailable.", + "pluginMcpRuntimeConnected": "Connected", + "pluginMcpRuntimeConfigured": "Configured", + "pluginMcpRuntimeDrifted": "Drift", + "pluginMcpRuntimeError": "Error", + "pluginMcpRuntimeDisabled": "Disabled", + "pluginMcpRuntimeOffline": "Offline", + "pluginMcpRuntimeServers": "{{connected}}/{{configured}} servers", + "pluginMcpRuntimeTools": "{{count}} tools", + "pluginMcpRuntimeSearch": "Search {{status}} · {{mode}} · {{indexed}}/{{advertised}} indexed", + "pluginMcpRuntimeSearchActive": "active", + "pluginMcpRuntimeSearchInactive": "inactive", + "pluginMcpRuntimeDrift": "{{count}} drift signal(s)", + "pluginMcpRuntimeLastError": "Last error: {{message}}", + "pluginMcpSourceConfigured": "Configured", + "pluginMcpSourceConnected": "Connected", + "pluginMcpSourceError": "Error", + "pluginMcpSourceDisabled": "Disabled", + "pluginOpenLocation": "Open location", + "pluginSkillRootWorkspaceAgents": "Workspace | .agents/skills", + "pluginSkillRootWorkspaceClaude": "Workspace | .claude/skills", + "pluginSkillRootWorkspaceCodex": "Workspace | .codex/skills", + "pluginSkillRootWorkspaceKun": "Workspace | .kun/skills", + "pluginSkillRootWorkspaceSkills": "Workspace | skills", + "pluginSkillRootGlobalAgents": "Global | ~/.agents/skills", + "pluginSkillRootGlobalClaude": "Global | ~/.claude/skills", + "pluginSkillRootGlobalCodex": "Global | ~/.codex/skills", + "pluginSkillRootGlobalDeepseek": "Global | ~/.kun/skills", + "pluginSkillRootNeedsWorkspace": "workspace required", + "pluginSkillRootNone": "No skill directory detected", + "pluginSkillRootMissing": "The current Skill directory is unavailable. Choose a workspace or switch to a global directory.", + "pluginSkillRefresh": "Refresh", + "pluginSkillDiscoveredCount": "{{count}} discovered", + "pluginSkillDiscoveredCountWithEnabled": "{{count}} discovered, {{enabled}} enabled", + "pluginSkillScanUnavailable": "Skill scanning is unavailable in this window.", + "pluginSkillScanPartial": "Some skill folders could not be scanned.", + "pluginSkillSourceProject": "Project", + "pluginSkillSourceGlobal": "Global", + "pluginSkillEnable": "Enable", + "pluginSkillDisable": "Disable", + "pluginSkillEnabled": "Skill enabled", + "pluginSkillDisabled": "Skill disabled", + "pluginSkillStatusDisabled": "Disabled", + "pluginGithubImport": "Import GitHub", + "pluginGithubImportPlaceholder": "GitHub repo, tree, or blob URL", + "pluginGithubImportAction": "Import Skills", + "pluginGithubImportHint": "Supports public github.com repository, tree, and markdown file URLs. Directory imports load markdown files directly under that path.", + "pluginGithubImportUrlRequired": "Enter a GitHub URL first.", + "pluginGithubImportSuccess": "Imported {{count}} skill(s) from GitHub.", + "pluginGithubImportResult": "Imported {{count}} skill(s): {{names}}", + "pluginCustomName": "Name, e.g. my-plugin", + "pluginCustomDescription": "Basic description", + "pluginCustomNameRequired": "Enter a name first.", + "pluginCustomFallbackDesc": "Custom plugin", + "pluginCustomCommand": "Command, e.g. npx", + "pluginCustomArgs": "Arguments, one per line", + "pluginCustomMcpConfig": "Or paste a complete MCP JSON config snippet", + "pluginCustomSkillBody": "Skill instructions for the agent", + "pluginCustomSkillFallbackBody": "Describe this Skill's workflow, constraints, and expected output here.", + "pluginAddCustom": "Add custom", + "pluginMcpGuiScheduleTitle": "Kun Schedule", + "pluginMcpGuiScheduleDesc": "Built-in MCP tools for listing, creating, updating, and deleting scheduled tasks.", + "pluginMcpPlaywrightTitle": "Playwright", + "pluginMcpPlaywrightDesc": "Automate real browsers and inspect page state.", + "pluginMcpGithubTitle": "GitHub", + "pluginMcpGithubDesc": "Read repositories, issues, pull requests, and CI context.", + "pluginMcpContext7Title": "Context7", + "pluginMcpContext7Desc": "Fetch current library documentation for coding tasks.", + "pluginMcpSequentialThinkingTitle": "Sequential Thinking", + "pluginMcpSequentialThinkingDesc": "Break complex tasks into traceable reasoning steps.", + "pluginMcpMemoryTitle": "Memory", + "pluginMcpMemoryDesc": "Keep reusable project facts and preferences available across tasks.", + "pluginMcpBraveSearchTitle": "Brave Search", + "pluginMcpBraveSearchDesc": "Search the web through Brave Search. Requires your own API key.", + "pluginMcpVercelTitle": "Vercel", + "pluginMcpVercelDesc": "Manage Vercel projects, deployments, logs, and docs through the official remote MCP server.", + "pluginMcpGoogleWorkspaceTitle": "Google Workspace", + "pluginMcpGoogleWorkspaceDesc": "Connect Gmail, Drive/Docs, Calendar, Chat, and People through Google's official Workspace MCP servers.", + "pluginOAuthBadge": "OAuth", + "pluginOAuthPreviewTitle": "Authorize {{name}}", + "pluginOAuthPreviewDesc": "This connector uses an official remote MCP server. Review what it can access before adding it to Kun.", + "pluginOAuthClose": "Close OAuth preview", + "pluginOAuthPermissionsTitle": "Permission preview", + "pluginOAuthSetupTitle": "Setup flow", + "pluginOAuthVercelPermissionAccount": "Read Vercel account and team context used by the MCP server.", + "pluginOAuthVercelPermissionProjects": "List and inspect projects linked to your Vercel account.", + "pluginOAuthVercelPermissionDeployments": "Read deployment status and deployment metadata.", + "pluginOAuthVercelPermissionLogs": "Read deployment logs when Vercel grants that scope.", + "pluginOAuthGooglePermissionGmail": "Read Gmail message metadata and message content allowed by the selected Google scopes.", + "pluginOAuthGooglePermissionDrive": "Search and read files available through Google Drive MCP.", + "pluginOAuthGooglePermissionDocs": "Use Drive-backed document context, including Google Docs files you grant access to.", + "pluginOAuthGooglePermissionCalendar": "Read Google Calendar events and calendar metadata when that server is authorized.", + "pluginOAuthGooglePermissionPeople": "Read Google People profile and contact data allowed by the selected scopes.", + "pluginOAuthGooglePermissionChat": "Read Google Chat spaces and messages allowed by the selected scopes.", + "pluginOAuthSetupInstall": "Add the remote MCP server config to Kun.", + "pluginOAuthSetupAuthorize": "Open the provider's OAuth flow from the MCP client when the server requests authorization.", + "pluginOAuthSetupRestart": "Restart Kun if the runtime is already running so the MCP catalog reconnects.", + "pluginOAuthVercelSetupProject": "Optional: replace the global endpoint with the project-scoped URL generated by `vercel mcp --project`.", + "pluginOAuthGoogleSetupProject": "Create or select a Google Cloud project for the OAuth client.", + "pluginOAuthGoogleSetupApis": "Enable the Workspace APIs you want to use: Gmail, Drive, Calendar, Chat, and People.", + "pluginOAuthGoogleSetupConsent": "Configure the OAuth consent screen and allowed Workspace scopes.", + "pluginOAuthGoogleSetupAuthenticate": "Authorize the Google Workspace MCP servers with your Google account when the runtime starts.", + "pluginOAuthVercelNote": "Kun installs the official Vercel remote MCP endpoint now. Token storage/refresh is handled by the MCP OAuth flow when the runtime supports interactive authorization.", + "pluginOAuthGoogleNote": "Kun installs the official Gmail, Drive, Calendar, Chat, and People MCP endpoints. Google OAuth client setup still follows Google's Workspace MCP guide. Treat mail, docs, chat messages, and files as untrusted external content when tools summarize or act on them.", + "pluginOAuthConfigPreviewTitle": "Config to be added", + "pluginOAuthOpenDocs": "Open official docs", + "pluginOAuthCancel": "Cancel", + "pluginOAuthInstall": "Add connector", + "pluginSkillReviewTitle": "Code Review", + "pluginSkillReviewDesc": "Review code changes for defects, regressions, and missing tests.", + "pluginSkillFrontendTitle": "Frontend Polish", + "pluginSkillFrontendDesc": "Improve UI details, responsive states, and visual consistency.", + "pluginSkillBugTitle": "Bug Hunt", + "pluginSkillBugDesc": "Reproduce and locate issues, then propose the smallest verified fix.", + "pluginSkillReleaseTitle": "Release Notes", + "pluginSkillReleaseDesc": "Draft user-facing release notes and upgrade notes.", + "userLabel": "Pro · Plus", + "planLocal": "Plan · local", + "autoLabel": "Auto", + "composerHint": "Press Enter to send · ⌘/Ctrl + Enter for a new line · AI-generated content, verify before use", + "composerShortcut": "Enter to send, ⌘/Ctrl + Enter for newline", + "newline": "newline", + "composerVerifyHint": "AI-generated content, verify before use", + "composerStartHint": "Describe the task, paste code, or ask the agent to work directly in the current workspace.", + "composerContinueHint": "The current context stays attached, so you can add constraints, corrections, or the next step.", + "composerOfflineHint": "Reconnect the runtime before sending another message.", + "composerWorkspaceHint": "Choose a working directory before starting or continuing a thread.", + "composerAddImage": "Attach image", + "composerAddFilesAndFolders": "Files and folders", + "composerAddLocalFiles": "Add files", + "composerBrowseWorkspaceFiles": "Browse workspace", + "composerBrowseDesignDocs": "Choose design", + "composerVoiceStart": "Voice input", + "composerVoiceStop": "Stop recording", + "composerVoiceSend": "Stop and send", + "composerVoiceTranscribing": "Transcribing…", + "composerPromptOptimize": "Optimize prompt", + "composerPromptOptimizing": "Optimizing prompt…", + "composerVoiceMicDenied": "Microphone access was denied. Allow it in system settings and try again.", + "composerVoiceTooShort": "Recording was too short. Hold on a bit longer.", + "composerVoiceFailed": "Voice transcription failed: {{message}}", + "composerImageUnavailable": "Image input is unavailable for this runtime.", + "composerAttachmentUnavailable": "Attachment upload is unavailable.", + "composerAttachmentModelUnsupported": "The selected model cannot read images. Switch to a vision model or remove the attachment.", + "composerPdfAttachmentUnavailable": "PDF text extraction is unavailable for this file.", + "composerPdfAttachmentNoText": "This PDF has no extractable text and the built-in OCR could not detect readable text. Try a clearer scan or paste the relevant pages.", + "composerAttachmentUnsupportedType": "Only PNG, JPEG, WebP, and PDF files can be attached here.", + "composerRemoveAttachment": "Remove attachment", + "composerFileMentionMenuTitle": "Files & folders", + "composerFileMentionLoading": "Loading files…", + "composerFileMentionEmpty": "No files or folders found.", + "composerRemoveFileReference": "Remove reference", + "composerFileReadFailed": "Could not read {{path}}: {{message}}", + "composerImageOnlyPrompt": "Please respond to the attached image.", + "composerImageOnlyDisplay": "Attached image", + "composerFileOnlyPrompt": "Please use the referenced workspace file(s) as context.", + "composerFileAndImageOnlyPrompt": "Please use the referenced workspace file(s) and attached image(s) as context.", + "composerFileOnlyDisplay": "Referenced files ({{count}})", + "composerFileAndImageOnlyDisplay": "Referenced files and images ({{count}})", + "messageFileReferences": "Referenced files {{count}}", + "composerWebAvailable": "Web tools are available", + "composerWebUnavailable": "Web tools are disabled or unavailable", + "composerWebAvailableShort": "Web on", + "composerWebUnavailableShort": "Web off", + "composerQueuePlaceholder": "Keep typing; sends wait and go out after the current reply finishes…", + "composerPlanPlaceholder": "Break the goal down, outline steps, and scope changes before execution…", + "composerSlashHint": "Type / for commands", + "workingDirectory": "Рабочая директория", + "emptyHeroTitle": "Start a new conversation", + "emptyHeroSub": "Pick a task, or just type your question", + "emptyHeroSubNoWorkspace": "Pick a local working directory first, then start your first thread.", + "usageHeatmapBadge": "Kun usage", + "usageHeatmapTitle": "Your recent agent rhythm", + "usageHeatmapSub": "Start from the work pattern you have already built. Each day is colored by Kun token usage, with turns, cost, threads, and cache detail available from the cells.", + "usageHeatmapTabOverview": "Overview", + "usageHeatmapTabModels": "Models", + "usageHeatmapRange": { + "all": "All", + "90d": "90d", + "30d": "30d", + "7d": "7d" + }, + "usageHeatmapGridLabel": "Daily Kun usage calendar", + "usageHeatmapLess": "Less", + "usageHeatmapMore": "More", + "usageHeatmapLoading": "Loading recent usage…", + "usageHeatmapEmptyTitle": "No Kun usage yet", + "usageHeatmapEmptySub": "Send your first Kun request and this calendar will start filling in.", + "usageHeatmapErrorTitle": "Usage is temporarily unavailable", + "usageHeatmapErrorSub": "You can still start a new conversation from the prompts below.", + "usageHeatmapHeroTitle": { + "loading": "Preparing your usage calendar", + "empty": "Пусто", + "error": "Ошибка" + }, + "usageHeatmapHeroSub": { + "loading": "Kun is checking recent activity. The starter prompts stay ready while the calendar warms up.", + "empty": "Пусто", + "error": "Ошибка" + }, + "usageHeatmapWarmupBadge": { + "loading": "Checking history", + "empty": "Пусто", + "error": "Ошибка" + }, + "usageHeatmapWarmupTitle": { + "loading": "Looking for recent activity", + "empty": "Пусто", + "error": "Ошибка" + }, + "usageHeatmapWarmupSub": { + "loading": "This usually resolves quickly after Kun answers. You can still pick a prompt below.", + "empty": "Пусто", + "error": "Ошибка" + }, + "usageHeatmapCollapse": "Collapse calendar", + "usageHeatmapExpand": "Expand calendar", + "usageHeatmapCollapsedTitle": "Keep the canvas clear", + "usageHeatmapCollapsedSub": "The usage calendar is folded away for now. Expand it any time to check your recent agent rhythm.", + "usageHeatmapRefresh": "Refresh", + "usageHeatmapSessions": "Sessions", + "usageHeatmapMessages": "Messages", + "usageHeatmapCurrentModel": "Current model", + "usageHeatmapModelTokens": "Model tokens", + "usageHeatmapModelMessages": "Model messages", + "usageHeatmapModelSessions": "Model sessions", + "usageHeatmapInputTokens": "Input tokens", + "usageHeatmapOutputTokens": "Output tokens", + "usageHeatmapModelsEmpty": "No model usage for {{model}} yet.", + "usageHeatmapModelTooltipCachedInput": "Input (cache hit)", + "usageHeatmapModelTooltipUncachedInput": "Input (cache miss)", + "usageHeatmapModelTooltipOutput": "Output", + "usageHeatmapModelTooltipTotalTokens": "{{value}} tokens", + "usageHeatmapModelTokenBreakdown": "{{input}} in · {{output}} out · {{cacheHit}} hit · {{cacheMiss}} miss", + "usageHeatmapModelTooltip": "{{label}} · {{total}} tokens total · {{input}} input · {{output}} output · {{cacheHit}} cache hit · {{cacheMiss}} cache miss", + "usageHeatmapSelectedDate": "Date", + "usageHeatmapTokens": "Tokens", + "usageHeatmapTotalTokens": "Total tokens", + "usageHeatmapCost": "Cost", + "usageHeatmapCacheSavings": "Cache hits saved", + "usageHeatmapContextSavings": "Context saved", + "usageHeatmapSavedTokensValue": "{{tokens}} tokens", + "usageHeatmapTurns": "Turns", + "usageHeatmapThreads": "Threads", + "usageHeatmapCache": "Cache", + "usageHeatmapActiveDays": "Active days", + "usageHeatmapCurrentStreak": "Current streak", + "usageHeatmapLongestStreak": "Longest streak", + "usageHeatmapStreakDays": "{{count}}d", + "usageHeatmapOverviewCaption": "You've used {{tokens}} tokens across {{activeDays}} active days.", + "usageHeatmapModelsCaption": "{{model}} accounts for {{tokens}} tokens in this range.", + "usageHeatmapDaySummary": "{{date}} · {{tokens}} tokens · {{cost}} · {{saved}} cached tokens · {{turns}} turns · {{threads}} threads · {{cache}} cache", + "usageHeatmapWeekdaySun": "S", + "usageHeatmapWeekdayMon": "M", + "usageHeatmapWeekdayTue": "T", + "usageHeatmapWeekdayWed": "W", + "usageHeatmapWeekdayThu": "T", + "usageHeatmapWeekdayFri": "F", + "usageHeatmapWeekdaySat": "S", + "clawEmptyHeroBadge": "Phone agent", + "clawEmptyHeroTitle": "Start a conversation with {{name}}", + "clawEmptyHeroSub": "Start chatting.", + "clawEmptyHeroNeedsInbound": "Send the first message in Feishu / Lark or WeChat to establish the conversation, then continue locally. Otherwise local messages cannot sync back to the matching channel.", + "clawEmptyHeroFallbackName": "this assistant", + "clawEmptyHeroStatusReady": "Connected and ready", + "clawEmptyHeroChannelChip": "Channel", + "clawEmptyHeroModelChip": "Model", + "clawEmptyHeroProfileTitle": "Current connection", + "clawEmptyHeroProfilePlatform": "Platform", + "clawEmptyHeroProfileModel": "Default model", + "clawEmptyHeroProfileVoice": "Assistant style", + "clawEmptyHeroProfileVoiceFallback": "Natural, polite, and focused on conversational help.", + "clawEmptyHeroStarterTitle": "Best ways to begin", + "clawEmptyHeroStarterLine1": "Talk to it the way you would message a helpful assistant. You do not need a big project brief first.", + "clawEmptyHeroStarterLine2": "If you are not sure how to start, ask it to introduce itself, polish a reply, or turn your context into clear next steps.", + "clawPromptIntroTitle": "Introduce yourself first", + "clawPromptIntroSub": "See its role, tone, and what it can help with", + "clawPromptIntroPrompt": "Start with a short self-introduction and tell me what you are best at helping with.", + "clawPromptReplyTitle": "Polish a reply for me", + "clawPromptReplySub": "Rewrite my message to sound natural and clear", + "clawPromptReplyPrompt": "I am about to send you a draft. Please polish it into a natural, polite, and clear reply.", + "clawPromptTodoTitle": "Turn this into next steps", + "clawPromptTodoSub": "Convert scattered context into an action list", + "clawPromptTodoPrompt": "I am going to give you some context. Please turn it into a concise todo list and suggest the next steps.", + "clawPromptClarifyTitle": "Ask me the key questions", + "clawPromptClarifySub": "Clarify the essentials before helping further", + "clawPromptClarifyPrompt": "Before you help me, ask me the three most important clarifying questions first.", + "promptStructureTitle": "Explain this project's structure", + "promptStructureSub": "Get a quick map of folders and key files", + "promptStructurePrompt": "Please explain this project's overall structure, key folders, and how the entry files relate to each other.", + "promptBugTitle": "Help me find and fix a bug", + "promptBugSub": "Analyze the cause and suggest a fix", + "promptBugPrompt": "I have a bug. Please help me locate the root cause and propose a fix.", + "promptPlanTitle": "Generate an implementation plan", + "promptPlanSub": "Turn the request into a step-by-step plan", + "promptPlanPrompt": "Please break the following requirement into an implementation plan, including files to change and steps.", + "promptDesignTitle": "Polish the current UI", + "promptDesignSub": "Suggest design and interaction improvements", + "promptDesignPrompt": "Please review the current UI, point out details to refine, and suggest improvements.", + "settings": "Настройки", + "toggleTheme": "Toggle theme", + "switchToLight": "Switch to light theme", + "switchToDark": "Switch to dark theme", + "selectWorkspace": "Choose working directory", + "changeWorkspace": "Change working directory", + "workspaceReadyState": "Ready", + "workspaceMissingState": "Not set", + "workspaceCardHint": "Threads use this folder as workspace", + "sidebarThreadsLabel": "Threads", + "sidebarThreadsCount": "threads", + "sidebarProjects": "Projects", + "sidebarConversations": "Conversations", + "newConversation": "New conversation", + "conversationsEmptyHint": "New conversations aren't tied to a project; a working directory is created automatically.", + "workspaceInsideConversationDir": "This folder is inside the conversation workspace. Copy it elsewhere before adding it as a project.", + "composerWorkspaceSearch": "Search projects", + "composerWorkspaceAdd": "Add project", + "composerWorkspaceEmpty": "No projects yet", + "composerWorkspaceNoMatch": "No matching projects", + "sidebarCollapse": "Collapse sidebar", + "sidebarExpand": "Expand sidebar", + "workspaceNotSelected": "No local folder selected yet", + "back": "Назад", + "send": "Отправить", + "queueMessage": "Queue message", + "queuedMessagesTitle": "{{count}} queued", + "queuedMessagesHint": "These messages will send automatically after the current reply finishes.", + "queuedMessageRemove": "Remove queued message", + "copyMessage": "Copy message", + "exportAnswer": "Export answer", + "exportAnswerFailed": "Could not export answer: {{message}}", + "copySuccess": "Скопировано", + "copyFailed": "Не удалось скопировать", + "interrupt": "Прервать", + "connecting": "Подключение…", + "runtimeOffline": "Kun is unavailable. Check settings or start `kun serve`.", + "planMode": "Plan", + "agentMode": "Режим агента", + "planModeActiveHint": "Future messages will be sent in plan mode", + "composerModel": "Model", + "composerOtherModels": "Other models", + "composerModelControls": "Model and reasoning settings", + "composerNoProvidersShort": "Set up provider", + "composerNoProviders": "No chat model provider is available yet.", + "composerConfigureProviders": "Open provider settings", + "composerModelSearchPlaceholder": "Filter models", + "composerNoMatchingModels": "No matching models", + "composerModelVision": "Vision", + "composerModelTextOnly": "Text", + "composerReasoning": "Reasoning", + "composerReasoningAuto": "Adaptive", + "composerReasoningOff": "Off", + "composerReasoningLow": "Low", + "composerReasoningMedium": "Med", + "composerReasoningHigh": "High", + "composerReasoningMax": "Ultra", + "composerReasoningFaster": "Faster", + "composerReasoningSmarter": "Smarter", + "slashCommandMenuTitle": "Commands", + "slashCommandApply": "Apply command", + "slashCommandCurrent": "Current", + "slashCommandEmpty": "No matching command. Keep typing to send the raw text instead.", + "slashCommandNewTitle": "New session", + "slashCommandNewDescription": "Create a new session for the current project immediately.", + "slashCommandPlanTitle": "Plan", + "slashCommandPlanDescription": "Add a Plan marker to the composer before sending.", + "slashCommandPlanActiveDescription": "Plan mode is already active.", + "slashCommandResearchTitle": "Deep research", + "slashCommandResearchDescription": "Prepare an iterative research brief with source tracking, cross-checks, and report-ready output.", + "slashCommandResearchPrompt": "Run a deep research task.\n\nTopic:\n{{topic}}\n\nResearch protocol:\n1. Confirm the scope, time range, geography, and output format. Ask only questions that block useful research.\n2. Inventory the available search, browser, MCP, workspace, and paper tools. Prefer sources that need no extra setup. Use an authenticated browser session only when it is already available, and never expose credentials.\n3. Plan the research breadth and depth, run multiple targeted queries, and iterate from evidence gaps or contradictions.\n4. Keep an evidence ledger with the source title, URL or workspace path, publication or access date, and the claim it supports.\n5. Cross-check important claims with independent sources. Mark conflicts, uncertainty, and assumptions clearly.\n6. If ongoing monitoring is requested, propose a scheduled task instead of claiming that monitoring is already active.\n\nDeliver:\n- Executive summary\n- Findings grouped by research question\n- Comparison table where useful\n- Evidence and source table\n- Conflicts, gaps, and recommended follow-up searches\n- A report-ready Markdown outline; create PDF, slides, or media assets only when the required tools are available.", + "slashCommandAgentTitle": "Return to default mode", + "slashCommandAgentDescription": "Turn off plan mode and go back to the default agent flow.", + "slashCommandGoalTitle": "Goal", + "slashCommandGoalDescription": "Set or manage the long-running goal for this thread.", + "slashCommandReviewTitle": "Code review", + "slashCommandReviewDescription": "Review current changes, a branch diff, a commit, or custom instructions.", + "slashCommandCompactTitle": "Compact this thread", + "slashCommandCompactDescription": "Ask the runtime to summarize context for the active thread.", + "slashCommandForkTitle": "Fork this thread", + "slashCommandForkDescription": "Create a branch of the current conversation.", + "slashCommandArchiveTitle": "Archive this thread", + "slashCommandArchiveDescription": "Move the active thread out of the main list.", + "slashCommandRestoreTitle": "Restore this thread", + "slashCommandRestoreDescription": "Move this archived thread back to the active list.", + "slashCommandBtwTitle": "By the way…", + "slashCommandBtwDescription": "Open a branch conversation that inherits this thread's context, without leaving the main chat.", + "slashSkillDescriptionFallback": "Load this Skill for the next message.", + "slashSkillScopeProject": "Project", + "slashSkillScopeGlobal": "Global", + "turnModelBadgeTitle": "Model for this turn: {{model}}", + "sidePanelTitle": "Branch conversations", + "sidePanelOpen": "Open branch conversation", + "sidePanelNew": "New branch conversation", + "sidePanelParentLabel": "From \"{{title}}\"", + "sidePanelParentMissing": "Branch conversation", + "sidePanelHide": "Hide branch panel", + "sidePanelMinimize": "Minimize branch conversation", + "sidePanelCollapse": "Collapse branch panel", + "sidePanelExpand": "Expand branch panel", + "sidePanelMore": "More branch conversation actions", + "sidePanelRailLabel": "Branch conversations", + "sidePanelThreadCount": "{{count}} branch conversations", + "sidePanelRunningCount": "{{running}} of {{total}} running", + "sidePanelIdleCount": "{{total}} idle", + "sidePanelRunningDot": "Streaming", + "sidePanelInheritedAt": "Context from {{time}}", + "sidePanelThinking": "Thinking...", + "sidePanelClose": "Close", + "sidePanelCloseTitle": "Hide this branch conversation and keep its thread hidden.", + "sidePanelPromote": "Promote", + "sidePanelPromoteTitle": "Remove the branch tag and surface this thread in the main list.", + "sidePanelDiscard": "Discard", + "sidePanelDiscardTitle": "Delete the underlying branch thread.", + "sidePanelEmpty": "No branch conversation yet. Use /btw to open one.", + "sidePanelDraftEmpty": "Ask a branch question. A branch conversation is created only after you send.", + "sidePanelComposerPlaceholder": "Ask in branch conversation", + "sideConversationNeedsActiveThread": "Pick a thread before opening a branch conversation.", + "inspector": "Changes", + "rightPanelChanges": "Changes", + "rightPanelBrowser": "Preview", + "rightPanelRuntime": "Runtime", + "rightPanelPlan": "Plan", + "rightPanelFiles": "Files", + "rightPanelTodo": "Todo", + "rightPanelCanvas": "Canvas", + "rightPanelWhiteboard": "Whiteboard", + "canvasPanelNeedsThread": "Open or start a conversation to use the canvas.", + "codeCanvasPanelNeedsThread": "Open or start a conversation to use the whiteboard.", + "canvasOpsApplied": "Canvas ops", + "canvasOpsAppliedCount": "Canvas ops · {{count}}", + "rightPanelTerminal": "Terminal", + "terminalPanelTitle": "Terminal", + "terminalClear": "Clear terminal", + "terminalRestart": "Restart terminal", + "terminalNewTab": "New terminal tab", + "terminalCloseTab": "Close terminal tab", + "terminalTabMenuTitle": "Terminal tab actions", + "terminalRenameTab": "Rename terminal tab", + "terminalCloseOtherTabs": "Close other terminal tabs", + "terminalCloseAllTabs": "Close all terminal tabs", + "terminalTabTitle": "Terminal {{index}}", + "terminalExitMessage": "Process exited — click to restart", + "terminalUnavailable": "Terminal unavailable", + "rightPanelCollapse": "Collapse right sidebar", + "editorPickerTitle": "Choose default editor", + "editorPickerTitleWithEditor": "Default editor: {{editor}}", + "editorPickerMenuTitle": "Open files with", + "agentSwitcherTitle": "Режим работы", + "agentSwitcherTitleWith": "Режим: {{mode}}", + "agentSwitcherMenuTitle": "Переключить режим работы", + "editorLineBadge": "Line", + "noThread": "Select or create a thread", + "placeholder": "Заполнитель", + "clawPlaceholder": "Say something to {{name}}, or describe what you want help with…", + "clawComposerHint": "Chat naturally, or ask it to introduce itself, polish a reply, or suggest the next step.", + "clawPlaceholderNeedsInbound": "Send the first message in Feishu / Lark or WeChat, then come back here to continue…", + "clawComposerHintNeedsInbound": "Start the first request in Feishu / Lark or WeChat first. After the conversation exists, local messages can continue and sync back there.", + "removePlan": "Remove plan mode", + "inspectorTitle": "Changes", + "inspectorEmpty": "No file changes in this thread yet.", + "inspectorSelectHint": "Select a changed file to view its diff.", + "approvalTitle": "Approval required", + "approvalTool": "Tool: {{name}}", + "approvalPending": "Waiting for your decision…", + "approvalAllow": "Allow", + "approvalDeny": "Deny", + "approvalAllowed": "Allowed", + "approvalDenied": "Denied", + "approvalSubmitting": "Submitting decision…", + "approvalFailed": "Request failed", + "userInputTitle": "Input required", + "userInputPending": "Waiting for your answer…", + "userInputSubmitted": "Submitted", + "userInputCancelled": "Cancelled", + "userInputFailed": "Submit failed", + "userInputQuestionProgress": "Question {{current}} / {{total}}", + "userInputOther": "Other", + "userInputOtherDescription": "Type a custom response", + "userInputCustomPlaceholder": "Type your answer…", + "userInputSubmit": "Submit", + "userInputCancel": "Cancel", + "userInputPanelTitle": "Quick question", + "userInputComposerPlaceholder": "Choose above, or type your answer…", + "userInputPanelFreeformHint": "Type your answer below, then press Enter", + "userInputPanelCustomHint": "Or type your own answer below", + "userInputAnswerBelowHint": "Answer below the input box", + "approvalAutoShort": "Auto", + "approvalOnRequestShort": "Ask first", + "approvalUntrustedShort": "Risky only", + "approvalSuggestShort": "Suggest", + "approvalNeverShort": "Never", + "sandboxWorkspaceWriteShort": "Workspace write", + "sandboxReadOnlyShort": "Read only", + "sandboxFullAccessShort": "Full access", + "sandboxExternalShort": "External", + "toolPermissionAlwaysAskShort": "Always ask", + "toolPermissionAlwaysAskDesc": "Every tool call asks first; safest, but interrupts often.", + "toolPermissionReadOnlyShort": "Read only", + "toolPermissionReadOnlyDesc": "Read tools run automatically; writes and commands ask first, and it can only read workspace content.", + "toolPermissionSensitiveAskShort": "Sensitive ask", + "toolPermissionSensitiveAskDesc": "Ordinary reads can run automatically; sensitive operations ask first, so review the risk.", + "toolPermissionWorkspaceWriteShort": "Ask in workspace", + "toolPermissionWorkspaceWriteDesc": "Asks before workspace file changes; outside-workspace writes and host commands stay blocked.", + "toolPermissionTrustedWorkspaceShort": "Trusted workspace", + "toolPermissionTrustedWorkspaceDesc": "Workspace file changes run without prompts; outside-workspace writes and host commands stay blocked.", + "toolPermissionBypassShort": "Full access", + "toolPermissionBypassDesc": "Never asks and has full access; highest risk, use only for trusted tasks.", + "runtimeChecking": "Checking runtime…", + "runtimeStreamRecovering": "Recovering runtime event stream…", + "toolUploadWaitStatus": "Waiting for model after {{count}} tool result(s)…", + "modelRequestRetryStatus": "Model request returned HTTP {{status}}; retrying {{attempt}}/{{max}} in about {{seconds}}s…", + "toolCatalogChangedStatus": "Tool catalog changed; Kun refreshed the active tool list.", + "toolStormSuppressedStatus": "{{tool}} repeated the same call too many times; Kun suppressed the duplicate and asked the model to change approach.", + "compactionSummaryFallbackStatus": "Model compaction summary was unavailable; Kun used the heuristic summary.", + "runtimeReady": "Runtime connected", + "runtimeReadyShort": "Connected", + "runtimeCheckingShort": "Connecting", + "runtimeOfflineShort": "Runtime offline", + "runtimeIdle": "Runtime not checked yet", + "untitledThread": "New Thread", + "retryConnection": "Retry", + "runtimeErrorDetails": "Details", + "runtimeErrorTechnicalDetails": "Technical details", + "runtimeErrorLogPath": "Log path", + "runtimeErrorOpenLogsFailed": "Failed to open logs folder.", + "copyDetails": "Copy details", + "renameThreadHint": "Click to rename thread", + "noSessionSelected": "No thread selected", + "sessionHeaderHint": "Start a thread from the left, or reconnect the runtime to continue working.", + "sessionUsageTitle": "{{turns}} turns in this thread", + "sessionUsageTokens": "{{tokens}} tokens", + "sessionUsageCost": "{{cost}}", + "sessionUsageContextSavings": "saved {{tokens}} tokens", + "sessionUsageContextSavingsTitle": "Saved about {{tokens}} context tokens", + "sessionUsageTurns": "{{turns}} turns", + "sessionUsageCache": "cache {{cache}}", + "sessionUsageCacheTitle": "Cumulative cache {{cache}} · {{cached}} cached / {{miss}} miss · reasons: {{reasons}} · suggestion: {{suggestions}}", + "sessionUsageCacheTitleWithLatest": "Latest turn cache {{latestCache}} · cacheable {{cacheableCache}} · total input {{totalInputCache}} · cumulative {{cache}} · {{cached}} cached / {{miss}} miss · reasons: {{reasons}} · suggestion: {{suggestions}}", + "sessionUsageDetailsTitle": "{{tokens}} tokens · {{cost}} · saved {{saved}} tokens · cumulative cache {{cache}} · {{cached}} cached / {{miss}} miss · {{turns}} turns", + "sessionUsageDetailsTitleWithLatestCache": "{{tokens}} tokens · {{cost}} · saved {{saved}} tokens · latest cache {{latestCache}} · cumulative cache {{cache}} · {{cached}} cached / {{miss}} miss · {{turns}} turns", + "sessionUsageLoading": "Loading usage", + "sessionUsageUnavailable": "No usage yet", + "contextCapacityTitle": "Context window", + "contextCapacityCat_tools": "System tools", + "contextCapacityCat_system": "System prompt", + "contextCapacityCat_skills": "Skills", + "contextCapacityCat_messages": "Messages", + "contextCapacityCat_other": "Other", + "contextCapacityCat_free": "Free space", + "contextCapacityShareNote": "Share of window · sums to 100%", + "contextCapacityNearLimit": "Near limit", + "contextCapacityOverLimit": "Near threshold · will auto-compact", + "contextCapacityThresholdLabel": "Compacts near {{percent}}", + "contextCapacityChipAria": "Context window {{percent}} used", + "contextCapacityBarAria": "Context {{percent}} used", + "contextCapacityEstimatedBreakdown": "Total is measured; the per-category split is estimated.", + "contextCapacityEstimatedAll": "No turn yet — values are estimated and refresh after you send.", + "running": "Выполняется", + "guiUpdateTopbarAvailable": "Update {{version}}", + "guiUpdateTopbarDownloading": "Updating {{percent}}%", + "guiUpdateTopbarInstalling": "Installing…", + "guiUpdateTopbarManual": "Download {{version}}", + "turnCompleteNotificationTitle": "Kun reply complete", + "turnCompleteNotificationBody": "“{{title}}” is ready.", + "busyTimeout": "No response from the runtime after waiting {{minutes}} minutes. Deep-thinking tasks may take longer. If it stays stuck, you can cancel and retry.", + "runtimeActionNeedsConnection": "Connect to the runtime before using AI actions.", + "runtimeFetchFailed": "Не удалось загрузить данные", + "runtimeModelRequestFailed": "Не удалось выполнить запрос к модели", + "runtimeBinaryNotInstalled": "Исполняемый файл сервиса не найден.", + "runtimeMissingApiKey": "API-ключ не настроен. Укажите его в настройках.", + "runtimeAutoStartDisabled": "Автозапуск сервиса отключён.", + "runtimeUnhealthy": "Сервис работает некорректно.", + "runtimeAuthRequired": "Требуется авторизация.", + "runtimePortConflict": "Порт занят. Измените порт в настройках.", + "runtimeRequestFailed": "Запрос к сервису не удался.", + "runtimeSteerUnsupported": "The current runtime does not support adding input while a turn is running.", + "runtimeUserInputUnsupported": "Ввод пользователя не поддерживается в данном режиме.", + "workspaceRequiredToCreateThread": "Choose a working directory before creating a thread.", + "workspacePickerUnavailable": "The directory picker is unavailable here. Add the working directory path in Settings first.", + "workspacePickerNeedsRestart": "The directory picker is not active in the current app process yet. Restart the GUI and try again.", + "preloadBridgeMissing": "Мост предзагрузки отсутствует.", + "comingSoon": "Coming soon", + "composerNeedsThread": "Select or create a thread first…", + "composerStartsThread": "Type and send to automatically create a thread…", + "composerExecutionLabel": "Execution", + "composerApprovalShort": "Approval", + "composerAccessShort": "Access", + "composerPermissionShort": "Tool permission", + "composerAccessCommandsHint": "In Read only mode, write, edit, bash, and similar tools ask first.", + "composerExecutionApplying": "Applying…", + "composerExecutionBypass": "Full access", + "composerChangedFilesTitle": "{{count}} files changed", + "composerChangedFilesMore": "+{{count}} more", + "composerOpenChanges": "Preview", + "composerReviewChanges": "Review", + "composerMenuTitle": "More actions", + "composerMenuPlanMode": "Plan mode", + "composerMenuPursueGoal": "Pursue goal", + "composerMenuWorktreeMode": "Worktree mode", + "composerEnvironmentLocal": "Local environment", + "composerEnvironmentWorktree": "Worktree", + "composerWorktreeBranch": "Worktree branch", + "worktreePoolFull": "Worktree pool is full (3/3 in use). Created a normal conversation instead.", + "worktreeAcquireFailed": "Failed to acquire worktree. Created a normal conversation instead.", + "worktreeBranchRequired": "Choose a Git branch first.", + "composerWorktreeModeHint": "Worktree mode on — new conversations checkout an isolated worktree from the selected branch.", + "gitBranch": "Git branch", + "gitBranchUnavailable": "No Git repo", + "gitDetached": "Detached HEAD", + "gitSearchBranches": "Search branches", + "gitBranches": "Branches", + "gitBranchLoading": "Loading branches…", + "gitDirtyFiles": "Uncommitted: {{count}} files", + "gitNoBranches": "No matching branches.", + "gitCreateBranch": "Create branch…", + "gitCreateNamedBranch": "Create and switch to {{branch}}", + "gitSwitchToNamedBranch": "Switch to {{branch}}", + "gitCheckedOutInWorktree": "Checked out in another worktree", + "gitOpenExistingWorktree": "Open the worktree that has {{branch}}", + "gitOpenBranchWorktree": "Open {{branch}} in a worktree", + "gitNewBranchWorktree": "Create worktree for new branch {{branch}}", + "gitCheckoutNamedBranchWorktree": "Create worktree from {{branch}}", + "sidebarThreadWorktreeBadge": "Worktree", + "sidebarThreadWorktree": "Worktree: {{branch}}", + "runtimeOfflineHeroKicker": "GUI agent core", + "runtimeOfflineHeroTitle": "Kun is waking the local agent", + "runtimeOfflineHeroSub": "The workbench is bringing Kun back into this window. When the local service is ready, sessions and the composer resume here.", + "runtimeErrorHeroTitle": "Cannot connect to the local runtime", + "openSettings": "Open Settings", + "close": "Закрыть", + "clear": "Очистить", + "compactThread": "Compact thread", + "forkThread": "Ответвить", + "forkResponse": "Fork response", + "forkFromAssistantResponse": "Fork a new thread from this response", + "forkingThread": "Forking…", + "rollbackWorkspace": "Rollback commit", + "rollbackWorkspaceFromAssistantResponse": "Rollback this response's Git commit without rolling back the conversation", + "rollingBackWorkspace": "Rolling back…", + "rollbackWorkspaceMissingCheckpoint": "This turn has no file-change checkpoint to roll back.", + "rollbackWorkspaceBusyError": "Cannot roll back the workspace while the agent is running.", + "rollbackWorkspaceConfirm": "Roll back the Git commit for this response?", + "rollbackWorkspaceConfirmDetail": "This will run git reset --hard and git clean -fd in your workspace. Any uncommitted edits, untracked files, and commits added since this checkpoint will be permanently lost. The chat conversation will be kept as-is.", + "rollbackWorkspacePartialConfirm": "This checkpoint is partial — restore anyway?", + "rollbackWorkspacePartialConfirmDetail": "Some untracked files were too large to capture in this checkpoint and are not stored in it: {{files}}. Restoring will delete them. A full rescue checkpoint will be taken first so you can recover them. Continue?", + "sessionForked": "Forked thread", + "sessionForkedFrom": "Forked from {{title}}", + "sessionForkedFromCompact": "from {{title}}", + "goalUserMessage": "Goal: {{objective}}", + "goalNoActiveTitle": "No active goal", + "goalActiveHeading": "Active goal", + "goalComposerPlaceholder": "Type a goal for this thread", + "goalSetCurrentInput": "Set as goal", + "goalActionEdit": "Edit goal", + "goalActionPause": "Pause", + "goalActionResume": "Resume", + "goalActionClear": "Clear", + "goalStatusActive": "active", + "goalStatusPaused": "paused", + "goalStatusBlocked": "blocked", + "goalStatusUsageLimited": "usage-limited", + "goalStatusBudgetLimited": "budget-limited", + "goalStatusComplete": "complete", + "goalStatusShort": { + "active": "Active", + "paused": "Paused", + "blocked": "Blocked", + "usageLimited": "Limited", + "budgetLimited": "Budget", + "complete": "Done" + }, + "goalUpdatedTimeline": "Goal {{status}}: {{objective}}", + "goalClearedTimeline": "Goal cleared", + "todoPanelTitle": "Thread Todo", + "todoClear": "Clear todos", + "todoEmptyTitle": "No todos yet", + "todoEmptyDescription": "Plan checklists and model-written todos for this thread will appear here.", + "todoStatusPending": "Pending", + "todoStatusInProgress": "Active", + "todoStatusCompleted": "Done", + "todoMarkPending": "Mark pending", + "todoMarkCompleted": "Mark complete", + "todoStatus": { + "pending": "В ожидании", + "in_progress": "Active", + "completed": "Done" + }, + "threadActionBusy": "Wait for the current turn to finish before changing this thread.", + "runtimeFeatureUnsupported": "The connected runtime does not support this action yet.", + "runtimeActiveTurn": "Активный шаг ещё не завершён.", + "sidebarOfflineHint": "Connect the runtime first to create and continue threads.", + "sidebarEmptyTitle": "No threads yet", + "sidebarEmptySub": "Start your first task from the action above.", + "sidebarEmptySubOffline": "Connect the runtime first, then create your first thread from above.", + "sidebarWorkspaceEmpty": "No threads yet", + "sidebarWorkspaceNewThread": "New thread", + "sidebarWorkspaceShowMore": "Show more ({{count}} more)", + "sidebarWorkspaceShowLess": "Show less", + "sidebarWorkspaceArchiveThreads": "Archive all threads in this project", + "sidebarWorkspaceArchiveDialogTitle": "Archive threads in {{name}}?", + "sidebarWorkspaceArchiveDialogDescription": "This archives {{count}} active threads in this project.", + "sidebarWorkspaceArchiveDialogDetail": "Conversation history stays available and can be restored from archived threads later.", + "sidebarWorkspaceArchiveConfirmButton": "Archive all", + "sidebarWorkspaceRemove": "Remove workspace", + "sidebarWorkspaceRemoveConfirm": "Remove workspace \"{{path}}\" and all its threads? This cannot be undone.", + "sidebarWorkspaceOpenInSystem": "Open in file explorer", + "sidebarWorkspaceRemoveDialogTitle": "Remove {{name}}?", + "sidebarWorkspaceRemoveDialogDescription": "This removes the project from Kun. Files on disk will not be deleted.", + "sidebarWorkspaceRemoveDialogDetail": "You can add this project again later from the workspace picker.", + "sidebarWorkspaceRemoveConfirmButton": "Remove", + "sidebarSearchThreads": "Search threads and requirements", + "sidebarShowArchivedThreads": "Show archived threads", + "sidebarShowActiveThreads": "Show active threads", + "sidebarSearchEmpty": "No matching threads", + "sidebarArchiveEmpty": "No archived threads", + "sidebarThreadArchive": "Archive thread", + "sidebarThreadArchiveConfirm": "Archive thread \"{{title}}\"?", + "sidebarThreadArchiveDialogTitle": "Archive this thread?", + "sidebarThreadArchiveDialogDescription": "It moves out of the active list and can be restored from archived threads.", + "sidebarThreadArchiveDialogDetail": "The conversation history stays available; it is only hidden from the active project list.", + "sidebarThreadArchiveConfirmButton": "Archive", + "sidebarThreadRestore": "Restore thread", + "sidebarThreadRename": "Rename thread", + "sidebarThreadRenamePrompt": "Enter a new thread name", + "sidebarThreadMove": "Move to Project...", + "sidebarThreadMoveDialogTitle": "Move “{{title}}”?", + "sidebarThreadMoveDialogDescription": "Move this thread's default workspace from {{from}} to {{to}}.", + "sidebarThreadMoveDialogDetail": "Future messages will start in the target workspace. Existing conversation history is not rewritten.", + "sidebarThreadMoveMetadataOnlyDetail": "This is a metadata-only move. Files, checkpoints, Git worktrees, generated artifacts, and existing dynamic context stay in their current locations.", + "sidebarThreadMoveConfirmButton": "Move thread", + "sidebarThreadMovePickerTitle": "Move to Project", + "sidebarThreadMovePickerDescription": "Choose the project workspace this thread should use for future messages.", + "sidebarThreadMoveNoTargets": "No other project workspaces available.", + "sidebarThreadMoveRunningBlocked": "Stop the running turn before moving this thread.", + "sidebarThreadMoveWorktreeBlocked": "Worktree-linked threads cannot be moved between projects.", + "sidebarThreadMoveUnsupported": "This runtime cannot move threads between projects.", + "sidebarThreadMoveFailed": "Failed to move thread.", + "sidebarThreadPin": "Pin thread", + "sidebarThreadUnpin": "Unpin thread", + "sidebarThreadPinned": "Pinned thread", + "sidebarThreadDelete": "Delete thread", + "sidebarThreadDeleteConfirm": "Delete thread \"{{title}}\"? This cannot be undone.", + "sidebarThreadDeleteDialogTitle": "Delete this thread?", + "sidebarThreadDeleteDialogDescription": "This permanently deletes the conversation from Kun.", + "sidebarThreadDeleteDialogDetail": "This action cannot be undone. Archive the thread instead if you may need it later.", + "sidebarThreadDeleteConfirmButton": "Delete", + "sidebarThreadPreviewUpdated": "Updated {{time}}", + "sidebarThreadPreviewEmpty": "No preview text yet.", + "sidebarThreadRunning": "Running", + "sidebarThreadUnread": "New reply", + "sidebarThreadForkBadge": "Fork", + "sidebarThreadForked": "Forked thread", + "sidebarThreadForkedFrom": "Forked from {{title}}", + "threadEmptyTitle": "This thread is ready", + "threadEmptySub": "Ask the agent what to do next, or switch to plan mode before sending your first instruction.", + "inspectorEmptyTitle": "No changes yet", + "inspectorSummaryFiles": "{{count}} file changes", + "inspectorStatusRunning": "running", + "browserTitle": "Preview", + "browserAddressPlaceholder": "Enter URL", + "browserOpen": "Open", + "browserReload": "Reload", + "browserBack": "Back", + "browserForward": "Forward", + "browserNewTab": "New tab", + "browserCloseTab": "Close preview", + "browserReset": "New blank tab", + "browserMore": "More", + "browserOpenExternal": "Open in browser", + "browserAutoFollow": "Follow local URLs from this thread", + "browserAutoFollowShort": "Auto", + "browserInvalidUrl": "Enter a local or private-network HTTP(S) address.", + "browserLoadFailed": "Page failed to load", + "browserEmptyTitle": "No local servers online", + "browserEmptySubtitle": "Offline local servers are hidden", + "browserShowAll": "Show all", + "writeStudio": "Writing desk", + "writeSpaces": "Writing spaces", + "writeAddWorkspace": "Add writing space", + "writeRemoveWorkspace": "Remove from list", + "writeRemoveWorkspaceConfirm": "Remove \"{{name}}\" from writing spaces? Files on disk will not be deleted.", + "writeDefaultSpace": "Default writing space", + "writeWorkspace": "Workspace", + "writeMarkdownFiles": "Text files", + "writeWorkspaceFiles": "Text and images", + "writeLoadingShort": "Loading", + "writeLoadingWorkspace": "Loading workspace", + "writeWorkspaceEmpty": "No files found yet.", + "writeWorkspaceEmptySub": "Create a Markdown draft and the writing tree will start here.", + "writeCreateFile": "New file", + "writeCreateFirstFile": "New Markdown", + "writeCreateFolder": "New folder", + "writeCreateFirstFolder": "New folder", + "writeCreateFileInFolder": "New file in this folder", + "writeCreateFolderInFolder": "New folder in this folder", + "writeRefreshWorkspace": "Refresh workspace", + "writeCreateFilePrompt": "Enter a file name or relative path", + "writeCreateFolderPrompt": "Enter a folder name or relative path", + "writeRenameEntry": "Rename", + "writeRenameEntryPrompt": "Rename this item", + "writeDeleteFile": "Удалить файл", + "writeDeleteFileConfirm": "Delete \"{{name}}\"? This removes the file from disk.", + "writeDeleteFolder": "Delete folder", + "writeDeleteFolderConfirm": "Delete folder \"{{name}}\" and all of its contents? This removes files from disk.", + "writeEntryDialogCancel": "Cancel", + "writeEntryDialogCreate": "Create", + "writeEntryDialogRename": "Rename", + "writeEntryDialogDelete": "Delete", + "writeSaved": "Saved", + "writeSaving": "Saving…", + "writeUnsaved": "Unsaved", + "writeReadOnly": "Read-only", + "writeSaveError": "Save failed", + "writeReadOnlySaveDisabled": "This file is read-only, so saving is disabled", + "writeDiscardUnsavedChangesConfirm": "The current file has unsaved changes. Discard them and continue?", + "planPanelTitle": "Plan", + "planNoActiveFile": "No plan file selected", + "planNoWorkspace": "Choose a working directory first.", + "planEmptyTitle": "No plan file", + "planEmptySub": "Create a plan from the composer or reopen a recent plan for this workspace.", + "planOpenFile": "Open plan file", + "planRefineHint": "Want changes? Keep chatting on the left and the model will update this plan.", + "planBuild": "Build", + "reviewPlanCardHint": "Plan ready — review or edit it on the right.", + "reviewPlanOpen": "Open", + "reviewCardRunning": "Reviewing changes…", + "reviewCardFailed": "Review failed", + "reviewCardNoFindings": "No findings", + "reviewCardFindings": "{{count}} findings", + "reviewUnavailable": "Code review is not available in this runtime.", + "planStatusDrafting": "Drafting", + "planStatusRefining": "Refining", + "planStatusBuilding": "Building", + "planStatusSaving": "Saving", + "planStatusDirty": "Unsaved", + "planStatusSaved": "Saved", + "planStatusError": "Needs attention", + "planCreateFailed": "Could not create the plan file.", + "planAgentStartFailed": "Could not start the agent turn for this plan.", + "planExtractFailed": "Could not find plan Markdown in the agent response.", + "planToolResultMissing": "Kun did not return a matching create_plan result for this plan.", + "planRequestRequired": "Describe a request first, or use `/plan your request` to create a new plan.", + "sddNewRequirement": "New requirement", + "sddDraftTitle": "Requirement draft", + "sddNoActiveDraft": "No requirement draft is open.", + "sddDraftHistoryTitle": "Requirement drafts", + "sddDraftHistoryExpand": "Expand requirement drafts", + "sddDraftHistoryCollapse": "Collapse requirement drafts", + "sddDraftHistoryOpen": "Open requirement draft {{title}}", + "sddDraftHistoryOpenFailed": "Could not open the requirement draft.", + "sddDraftHistoryDelete": "Delete requirement draft", + "sddDraftHistoryDeleteConfirm": "Delete requirement draft \"{{title}}\"? This cannot be undone.", + "sddDraftHistoryDeleteDialogTitle": "Delete {{title}}?", + "sddDraftHistoryDeleteDialogDescription": "This removes the local requirement draft from the sidebar.", + "sddDraftHistoryDeleteDialogDetail": "The associated draft files are deleted from the workspace draft folder.", + "sddDraftHistoryDeleteFailed": "Delete failed: {{message}}", + "sddDraftHistoryShowMore": "Show more ({{count}} more)", + "sddDraftHistoryRemembered": "Recent", + "sddDraftHistoryDisk": "Disk", + "sddNextStep": "Next", + "sddGeneratePlanAction": "Generate implementation plan", + "sddUntitledRequirement": "Untitled requirement", + "sddTemplateBackground": "Background", + "sddTemplateGoal": "Goal", + "sddTemplateAcceptance": "Acceptance criteria", + "sddStatusUpgrading": "Creating plan", + "sddStatusSaving": "Saving", + "sddStatusDirty": "Unsaved", + "sddStatusSaved": "Saved", + "sddStatusError": "Needs attention", + "sddEmptyDraftError": "Add requirement details before creating a plan.", + "sddAssistant": "Requirement AI", + "sddAssistantEmptyTitle": "Clarify the requirement together", + "sddAssistantEmptySub": "Ask AI to research, find missing questions, and shape the boundaries before moving into a plan.", + "sddAssistantClarify": "Clarify", + "sddAssistantClarifySub": "Find missing questions", + "sddAssistantClarifyPrompt": "Read the current requirement draft, identify the key questions that still need clarification, and suggest concrete additions.", + "sddAssistantResearch": "Research", + "sddAssistantResearchSub": "Fill in context and options", + "sddAssistantResearchPrompt": "Based on the current requirement draft, do implementation-oriented research and summarize feasible approaches, risks, and details that need confirmation.", + "writeToggleAssistant": "Toggle AI panel", + "writeFontSizeControl": "Font size", + "writeFontSizeDecrease": "Decrease font size", + "writeFontSizeIncrease": "Increase font size", + "writeModeSource": "Source editor", + "writeModeLive": "Live editor", + "writeModeLiveShort": "Live", + "writeMoreViewModes": "More view modes", + "writeModeEdit": "Editor only", + "writeModeSplit": "Split preview", + "writeModePreview": "Preview only", + "writeCharacterCount": "{{count}} chars", + "writePreviewErrorFallback": "Markdown preview failed, showing source text instead.", + "writeUnsupportedFileType": "Write currently opens only Markdown, TXT, PDF, and common image files.", + "writeImagePreview": "Image preview", + "writeImageOpenExternal": "Open image in the system default app", + "writeImageSaveDisabled": "Image previews cannot be saved", + "writePdfPreview": "PDF reading", + "writePdfSaveDisabled": "PDF reading view cannot be saved", + "writePdfLoading": "Opening PDF…", + "writePdfLoadFailed": "PDF failed to open: {{message}}", + "writePdfZoomIn": "Zoom PDF in", + "writePdfZoomOut": "Zoom PDF out", + "writePdfPrevPage": "Previous page", + "writePdfNextPage": "Next page", + "writePdfPageInput": "PDF page", + "writePdfPageLabel": "Page {{page}}", + "writePdfSearchPlaceholder": "Search PDF", + "writePdfPrevMatch": "Previous match", + "writePdfNextMatch": "Next match", + "writePdfNoTextLayer": "This PDF has no selectable text layer in the viewer. Kun can still run OCR when attaching or retrieving context from the PDF.", + "writeImageRestartRequired": "The image preview channel is not registered yet. Quit and restart Kun, then try again.", + "writeImageZoom": "Image zoom", + "writeImageZoomIn": "Zoom image in", + "writeImageZoomOut": "Zoom image out", + "writeImageFit": "Fit to window", + "writeImageFitShort": "Fit", + "writeImageActualSize": "View at actual size", + "writeLargeFileSafeMode": "This file is large, so Markdown live rendering has been turned off to avoid a blank Write screen.", + "writeLargeFileSafeModeSub": "You can still edit and save normally; the preview pane falls back to plain text.", + "writeLargeFileTruncated": "This file is too large for Write to load fully right now. To avoid overwriting missing content, it has been opened read-only with Markdown rendering turned off.", + "writeRemoveQuote": "Remove quote", + "writePromptContextShort": "Context", + "writePromptContextLabel": "Writing context", + "writePromptReferencesCount": "{{count}} ref", + "writePromptReference": "Text reference", + "writePromptReferenceLines": "lines {{start}}-{{end}}", + "writePromptReferencePage": "page {{page}}", + "writePromptReferencePages": "pages {{start}}-{{end}}", + "writePromptRetrievalCount": "{{count}} retrieved", + "writePromptRetrievalLabel": "Retrieved snippets", + "writePromptRetrievalMatched": "Matched: {{keywords}}", + "writePromptActiveFile": "Current file", + "writePromptWorkspace": "Workspace", + "writeNoFileOpen": "No file open", + "writeChooseFileTitle": "Open a file to start writing", + "writeChooseFileSub": "Choose an existing document from the workspace, or create a new Markdown file.", + "writeEmptyTitle": "Choose a workspace for writing", + "writeEmptySub": "Write mode keeps your files, preview, inline completion, and AI in one place.", + "writeStartTitle": "Start from a calmer writing desk.", + "writeStartSub": "Drafts, references, and the assistant all live in this writing space. Put down one Markdown file, then shape the title, sections, and citations from there.", + "writeStartNewDraft": "New draft", + "writeStartNewDraftSub": "Create a Markdown file now", + "writeStartRefresh": "Refresh tree", + "writeStartRefreshSub": "Scan workspace files again", + "writeStartAskAi": "Ask AI for an outline", + "writeStartAskAiSub": "Shape the structure first", + "writeStartAskAiPrompt": "I want to start a new piece. Ask me 3 key questions first, then draft a Markdown outline I can keep expanding.", + "writeStartChangeWorkspace": "Switch space", + "writeStartWorkspaceLabel": "Current space", + "writeStartWorkspacePath": "Space path", + "writeStartReadyLabel": "Ready", + "writeStartPreviewTitle": "First draft", + "writeStartPreviewSub": "The title, sections, and citations will unfold here.", + "writeUntitledDraft": "Untitled draft", + "writeSaveFile": "Save file", + "writePptGenerate": "Generate a PPT with PPT Master", + "writePptPreparing": "Preparing PPT Master…", + "writePptMarkdownOnly": "Open a complete Markdown file to generate a PPT", + "writePptSaveFailed": "The Markdown file could not be saved, so no PPT was generated.", + "writePptUnavailable": "PPT Master installation is unavailable in this environment.", + "writePptInstallFailed": "PPT Master could not be prepared: {{message}}", + "writePptSourceChanged": "The source file changed, so no PPT was generated.", + "writeExport": "Export", + "writeCopyRichText": "Copy for online docs", + "writeCopyRichTextSuccess": "Copied. Paste it into Feishu, Yuque, Notion, or Google Docs.", + "writeCopyRichTextFailed": "Could not copy rich text: {{message}}", + "writeCopyRichTextUnavailable": "Rich text copy is not available in this build.", + "writeExportHtml": "Export HTML", + "writeExportPdf": "Export PDF", + "writeExportPng": "Export PNG", + "writeExportDoc": "Export DOC", + "writeExportDocx": "Export DOCX", + "writeExporting": "Exporting…", + "writeExportSuccess": "Exported as {{format}}.", + "writeExportFailed": "Could not export {{format}}: {{message}}", + "writeExportUnavailable": "Document export is not available in this build.", + "writeAssistant": "Writing assistant", + "writeAssistantChangeWorkspace": "Change AI working directory", + "writeAssistantModel": "Model", + "writeAssistantNewConversation": "New writing assistant conversation", + "writeAssistantEmptyTitle": "Writing assistant is ready", + "writeAssistantEmptySub": "It stays out of the way. Select text to quote it, or start with one of these writing actions.", + "writeAssistantSummarize": "Summarize document", + "writeAssistantSummarizeSub": "Extract structure, themes, and gaps", + "writeAssistantSummarizePrompt": "Please read the current writing file \"{{file}}\" and summarize its thesis, structure, and missing pieces.", + "writeAssistantOutline": "Draft an outline", + "writeAssistantOutlineSub": "Organize headings and flow", + "writeAssistantOutlinePrompt": "Based on the current writing goal and file \"{{file}}\", draft a clear Markdown outline that I can continue writing from.", + "writeAssistantPolishSelection": "Polish selection", + "writeAssistantPolishSelectionSub": "Selected text will be quoted first", + "writeAssistantPolishSelectionPrompt": "Please use the quoted selection to polish the expression, improve rhythm, and preserve the original meaning.", + "writeAssistantExplainPdfSelection": "Explain PDF selection", + "writeAssistantExplainPdfSelectionSub": "Selected PDF text will be quoted with page context", + "writeAssistantExplainPdfSelectionPrompt": "Please explain the quoted PDF selection, including its core meaning, key terms, and role in the paper.", + "writeRuntimeUnavailable": "The local runtime is temporarily unavailable. You can keep editing files in Write, but AI conversations, thread creation, and other runtime-backed features are paused for now.", + "writeAskAiAboutSelection": "Ask AI about selection", + "writeInlineAgentAskAi": "Ask AI", + "writeInlineAgentPlaceholder": "Tell AI what to do with this selection…", + "writeInlineAgentSend": "Send to writing assistant", + "writeInlineEditOpen": "AI Edit", + "writeInlineEditApply": "Apply edit", + "writeInlineEditApplying": "Editing…", + "writeInlineEditUnavailable": "In-place editing is not available in this build.", + "writeInlineEditNoSelection": "Select text before applying an edit.", + "writeInlineEditMultiSelection": "In-place editing currently supports one continuous selection.", + "writeInlineEditFailed": "Could not edit text: {{message}}", + "writeInlineEditChanged": "The selected text changed. Select it again and retry.", + "writeInlineEditEmpty": "The AI returned an empty rewrite; your text was left unchanged.", + "writeInlineEditApplied": "Text edit applied.", + "writeInlineEditReview": "Changes ready — accept or reject each line.", + "writeInlineEditReviewPending": "Finish reviewing the current changes first.", + "writeDiffReviewing": "Review AI changes", + "writeReviewPending": "Reviewing", + "writeDiffAcceptAll": "Accept all", + "writeDiffRejectAll": "Reject all", + "writeAgentPreset_coordinator_name": "Plot coordinator", + "writeAgentPreset_coordinator_persona": "You are the plot coordinator for a novel. Your job: hold the overall story structure and pacing, track the main and side arcs, judge each chapter's role in the whole, and propose structural and plot-progression adjustments. Answer with the big-picture read first, then a concrete next step; always stay consistent with the established world and character settings.", + "writeAgentPreset_editor_name": "Line editor", + "writeAgentPreset_editor_persona": "You are a novel line editor. Your job: polish the prose without changing the plot or a character's voice — sharpen word choice, improve rhythm and imagery, cut redundancy. Preserve the author's style when suggesting edits, adding a one-line reason when useful; never alter settings or plot direction on your own.", + "writeAgentPreset_foreshadowing_name": "Foreshadowing tracker", + "writeAgentPreset_foreshadowing_persona": "You are a foreshadowing tracker. Your job: follow the setups, suspense, and promises planted in the text, flag threads not yet paid off, suggest when and how to resolve them, and warn about contradictory or forgotten foreshadowing. Answer as a list: the setup, where it appears, status (paid off / pending), and a suggestion.", + "writeAgentPreset_continuity_name": "Continuity checker", + "writeAgentPreset_continuity_persona": "You are a continuity checker for the whole manuscript. Your job: verify the consistency of character settings, timeline, geography, and key objects; surface contradictions, time slips, and setting conflicts. Answer as a list, one issue per row: location, conflict description, severity, and a fix suggestion; only point out problems, do not rewrite the prose.", + "writeAgentSwitcherLabel": "Custom writing agent", + "writeAgentSwitcherNone": "None", + "writeAgentSwitcherManage": "Manage", + "writeAgentSwitcherEmptyHint": "Add a writing agent in Settings", + "writeInfographicGenerate": "Generate infographic", + "writeInfographicAlt": "Infographic", + "writeInfographicDrawing": "Painting your infographic", + "writeInfographicReady": "Infographic ready.", + "writeInfographicStale": "Infographic generation was interrupted — this placeholder can be deleted.", + "writeInfographicFailed": "Could not generate infographic: {{message}}", + "writeInfographicUnavailable": "Infographic generation is not available in this build.", + "writeDesignDraftGenerate": "Generate design mockup", + "writeDesignDraftAlt": "Design mockup", + "writeDesignDraftDrawing": "Painting your design mockup", + "writeDesignDraftReady": "Design mockup ready.", + "writeDesignDraftFailed": "Could not generate design mockup: {{message}}", + "writeDesignDraftPromptLabel": "Design mockup prompt", + "writeDesignDraftPromptDesc": "Custom prompt prefix for Generate design mockup; leave empty for the built-in default. The selected text is appended after it.", + "sddDesignContextTitle": "Design context", + "sddDesignContextEmpty": "Not set (affects design-draft / prototype style)", + "sddDesignTypeLabel": "Design type", + "sddDesignType_brand": "Brand (landing / marketing / portfolio)", + "sddDesignType_product": "Product (app UI / dashboard / tool)", + "sddDesignBrandColorLabel": "Brand color", + "sddDesignBrandColorPlaceholder": "e.g. #3b82d8 or oklch(...); blank = default", + "sddDesignToneLabel": "Tone", + "writePrototypeGenerate": "Generate interactive prototype", + "writePrototypeAlt": "Interactive prototype", + "writePrototypeBuilding": "Building your interactive prototype", + "writePrototypeReady": "Interactive prototype ready.", + "writePrototypeFailed": "Could not generate the prototype: {{message}}", + "writePrototypeUnavailable": "Prototype generation is not available in this build.", + "writePrototypeTimeout": "Prototype generation timed out — check the sidebar conversation for details.", + "sddPrototypeSwitchVisionModel": "The current model cannot read images. Switch to {{model}} and continue?", + "sddPrototypeNoVisionModel": "No model with image input is configured — enable image input for a model in settings.", + "writePrototypePromptLabel": "Interactive prototype prompt", + "writePrototypePromptDesc": "Custom requirements for Generate interactive prototype; leave empty for the built-in default. The sidebar AI follows them when building the prototype.", + "writeHtmlEmbedRun": "Run prototype", + "writeHtmlEmbedReload": "Reload", + "writeHtmlEmbedOpenExternal": "Open in browser", + "writeHtmlEmbedLoadFailed": "The prototype failed to load — try opening it in the browser.", + "writeHtmlEmbedMissing": "The prototype file could not be located — check the link path.", + "sddPendingImageBlocked": "An image or prototype is still generating — wait for it to finish or delete the placeholder before continuing.", + "writeSelectionToolbar": "Selection toolbar", + "writeFormatBold": "Жирный", + "writeFormatItalic": "Курсив", + "writeFormatStrikethrough": "Зачёркнутый", + "writeFormatCode": "Код", + "writeQuickActionPolish": "Polish", + "writeQuickActionPolishPrompt": "Polish this text so it reads more naturally and flows better, keeping the original meaning and language.", + "writeQuickActionReformat": "Reformat", + "writeQuickActionReformatPrompt": "Tidy up the layout and structure of this text: sensible paragraphing, consistent punctuation and spacing, and clean list and heading levels, without changing the meaning.", + "writeQuickActionDistill": "Distill", + "writeQuickActionDistillPrompt": "Distill this text to its essence: cut redundancy, filler, hedging and needless ornament, keeping only what carries real information — preserve the original meaning and language.", + "writeQuickActionBolder": "Bolder", + "writeQuickActionBolderPrompt": "Make this text more confident and forceful: replace bland, hedged or passive phrasing with active, specific, rhythmic statements that take a clear position — without exaggerating the facts, and keeping the original meaning and language.", + "writeQuickActionQuieter": "Quieter", + "writeQuickActionQuieterPrompt": "Make this text more restrained: remove hype, exclamation, marketing tone and over-ornamentation, using plain, accurate, calm phrasing — preserve the original meaning and language.", + "writeQuickActionCritique": "Critique", + "writeQuickActionCritiquePrompt": "Review this content as a senior editor: point out concrete issues in clarity, structure, persuasiveness, tone and redundancy, ranked by importance, with actionable suggestions. Give critique only — do not rewrite it.", + "writeSelectionSkills": "Skills", + "writeSelectionQuote": "Add quote", + "writeBlockTypeLabel": "Block style", + "writeBlockTypeParagraph": "Normal text", + "writeBlockTypeHeading1": "Heading 1", + "writeBlockTypeHeading2": "Heading 2", + "writeBlockTypeHeading3": "Heading 3", + "writeBlockTypeQuote": "Quote", + "writeBlockTypeBullet": "Bulleted list", + "writeBlockTypeOrdered": "Numbered list", + "writeBlockTypeCode": "Code block", + "writeInlineAgentEditHint": "Edit with AI", + "writeQuickActionExplain": "Explain", + "writeQuickActionExplainPrompt": "Explain the quoted selection in clear, simple language, covering the key concepts and any background needed to understand it.", + "writeSelectionPromptPrefix": "Please help continue, revise, or analyze the following selection.", + "writeSelectionLabel": "Selection", + "writeSelectionLines": "lines {{range}}", + "writeSelectionNoLineInfo": "selected text", + "filePreviewTitle": "File preview", + "filePreviewEmpty": "No file selected", + "filePreviewLoading": "Reading file…", + "filePreviewFailed": "Could not read the file.", + "filePreviewUnsupported": "Preview is not supported for this file. Choose a text file.", + "filePreviewOpenEditor": "Open in editor", + "filePreviewCopyPath": "Copy path", + "filePreviewCopyContent": "Copy full file", + "filePreviewClose": "Close file preview", + "filePreviewOpenFiles": "Open files", + "filePreviewCloseTab": "Close {{file}}", + "filePreviewEnterReadingMode": "Expand reading view", + "filePreviewExitReadingMode": "Exit reading view", + "filePreviewRenderMarkdown": "Render Markdown", + "filePreviewShowSource": "Show Markdown source", + "filePreviewRenderSvg": "Render SVG", + "filePreviewShowSvgSource": "Show SVG source", + "filePreviewTruncated": "Truncated", + "fileTreeTitle": "Files", + "fileTreeWorkspaceTab": "Workspace", + "fileTreeDesignTab": "Designs", + "fileTreeRefresh": "Refresh file tree", + "fileTreeLoading": "Loading files…", + "fileTreeEmpty": "This workspace has no files yet.", + "fileTreeAddFileReference": "Add file reference", + "fileTreeAddFolderReference": "Add folder reference", + "fileTreeCopyAbsolutePath": "Copy absolute path", + "fileTreeCopyRelativePath": "Copy relative path", + "fileTreeRevealInFinder": "Reveal in Finder", + "fileTreeRevealInFileManager": "Reveal in file manager", + "designFileTreeTitle": "Designs", + "designFileTreeEmpty": "No designs yet.", + "designFileTreeEmptyDocument": "This design has no contents yet.", + "designFileTreeScreenCount": "{{count}} screen", + "designFileTreeAddDocumentReference": "Add design reference", + "designFileTreeAddArtifactReference": "Add canvas reference", + "imagePreviewTitle": "Image preview", + "imagePreviewOpen": "Open {{name}} preview", + "imagePreviewClose": "Close image preview", + "imagePreviewDownload": "Download image", + "imagePreviewZoomIn": "Zoom in", + "imagePreviewZoomOut": "Zoom out", + "imagePreviewResetZoom": "Reset zoom", + "processFileReferenceHint": "Click to preview, double-click to open in editor", + "devPreviewCardTitle": "Web preview", + "devPreviewCardSubtitle": "Website", + "devPreviewCardOpened": "Preview opened on the right", + "devPreviewCardOpen": "Open preview", + "devPreviewCardDismiss": "Dismiss", + "processing": "Обработка", + "processed": "Processed", + "processStepCount": "{{count}} steps", + "workedFor": "Worked for {{duration}}", + "working": "Running…", + "workingSprint": "Analyzing…", + "workingDive": "Organizing…", + "workingSurf": "Applying…", + "ikunDribbling": "Dribbling…", + "ikunFastBreak": "Fast break…", + "ikunBobaTime": "Boba time…", + "processSteps": "Work process ({{count}} steps)", + "processTextLabel": "Output", + "thinkingLabel": "Thinking", + "threadForkBannerTitle": "Forked conversation", + "threadForkBannerSub": "Continues from {{title}}. Earlier messages are inherited; new turns stay in this branch.", + "threadForkBannerSubUnknown": "Earlier messages are inherited; new turns stay in this branch.", + "threadForkPoint": "Branch starts here", + "threadForkPointFrom": "Branch from {{title}} starts here", + "compactionRunning": "Compacting context", + "compactionManualCompleted": "Compacted context", + "backgroundShellNotice.title": "Background shell completed", + "backgroundShellNotice.kindLabel": "Background callback", + "backgroundShellNotice.sessionId": "Session", + "backgroundShellNotice.command": "Command", + "backgroundShellNotice.exitCode": "Exit code", + "backgroundShellNotice.outputPreview": "Output preview", + "backgroundShellNotice.outputFile": "Full output file", + "backgroundSubagentNotice.title": "Background subagent completed", + "backgroundSubagentNotice.kindLabel": "Background callback", + "backgroundSubagentNotice.childId": "Child", + "backgroundSubagentNotice.status": "Status", + "backgroundSubagentNotice.agent": "Agent", + "backgroundSubagentNotice.summary": "Summary", + "compactionManualCompletedWithTokens": "Compacted context · ~{{tokens}} tokens freed", + "compactionAutoCompleted": "Auto-compacted context", + "compactionAutoCompletedWithTokens": "Auto-compacted context · ~{{tokens}} tokens freed", + "compactionCompletedWithCounts": "Compacted context ({{before}} → {{after}} messages)", + "compactionNothingToCompact": "Nothing to compact yet — the conversation is still short", + "compactionFailed": "Context compaction failed", + "thoughtFor": "Thought for {{duration}}", + "thinkingNow": "Thinking…", + "thoughtStep": "Thought ({{count}} step)", + "thoughtSteps": "Thought ({{count}} steps)", + "timelineShowEarlierTurns": "Show {{count}} earlier turns", + "timelineCollapseEarlierTurns": "Show recent turns only", + "timelineJumpRailLabel": "Jump to a question", + "timelineJumpTurn": "Jump to question {{index}}", + "groupEditedFiles": "Edited {{count}} files", + "groupEditedFile": "Edited 1 file", + "turnChangeFilesOne": "Edited 1 file", + "turnChangeFilesMany": "Edited {{count}} files", + "groupRanCommands": "Ran {{count}} commands", + "groupRanCommand": "Ran 1 command", + "groupRanBackgroundCommands": "Ran {{count}} background commands", + "groupRanBackgroundCommand": "Ran 1 background command", + "groupUsedTools": "Used {{count}} tools", + "groupUsedTool": "Used 1 tool", + "groupApprovals": "{{count}} approvals", + "groupApproval": "1 approval", + "answerLabel": "Answer", + "answerStreaming": "Generating answer…", + "rewindToHere": "Rewind to here", + "rewindEditMessage": "Edit & resend", + "rewindCancel": "Cancel", + "rewindResend": "Resend", + "rewindHint": "Esc to cancel · ⌘/Ctrl + Enter to send", + "rewindFileRollbackNotice": "Resending will roll back file changes", + "rewindBusyError": "Wait for the current turn to finish before rewinding.", + "toolActionFile": "Edited file", + "toolActionCommand": "Ran command", + "toolActionBackgroundCommand": "Ran background command", + "toolActionTool": "Called tool", + "toolKindFile": "File change", + "toolKindCommand": "Command", + "toolKindTool": "Tool", + "toolSources": "Sources", + "toolChildAgent": "Child agent", + "toolActiveSkills": "Skills", + "toolInjectedMemories": "Memories", + "toolInjectedInstructions": "Instructions", + "toolAttachments": "Attachments", + "generatedFilesTitle": "Generated files", + "generatedFilePreviewUnavailable": "Preview unavailable", + "generatedFileDownload": "Download", + "generatedFileSaving": "Saving…", + "generatedFileSaved": "Saved", + "generatedFileSaveFailed": "Save failed", + "toolBuiltinRead": "Read", + "toolBuiltinWrite": "Write", + "toolBuiltinEdit": "Edit", + "toolBuiltinGrep": "Search", + "toolBuiltinFind": "Find", + "toolBuiltinLs": "List", + "toolBuiltinBash": "Bash", + "toolBuiltinBackgroundShell": "Background shell", + "toolActionBackgroundShellList": "List background shells", + "toolActionBackgroundShellRead": "Read background shell", + "toolActionBackgroundShellPoll": "Poll background shell", + "toolActionBackgroundShellWrite": "Write to background shell", + "toolActionBackgroundShellStop": "Stop background shell", + "toolActionBackgroundShellIncludeFinished": "include finished", + "toolBuiltinDelegate": "Delegate task", + "subagentDefaultName": "Subagent", + "subagentStatusQueued": "Queued", + "subagentStatusRunning": "Running", + "subagentStatusDone": "Done", + "subagentStatusFailed": "Failed", + "subagentStatusAwaiting": "Awaiting approval", + "subagentDetachedBadge": "Background", + "subagentSteps": "{{count}} steps", + "subagentQueuedHint": "Queued", + "subagentTokensChip": "{{count}} tokens", + "subagentPolicyReadOnly": "Read-only", + "subagentPolicyFull": "Full access", + "subagentOpenSession": "Open sub-session", + "subagentSessionBannerTitle": "Subagent session", + "subagentSessionBannerSub": "This is a subagent's own session, delegated from “{{title}}”.", + "subagentSessionBannerSubUnknown": "This is a subagent's own session, delegated from the parent conversation.", + "subagentSessionBannerBack": "Back to parent", + "subagentSwarmTitle": "{{count}} subagents", + "subagentSwarmRunning": "{{count}} running", + "subagentSwarmQueued": "{{count}} queued", + "subagentSwarmDone": "{{count}} done", + "sidebarFooterHint": "Connect the local runtime to create threads and chat with the agent.", + "appErrorTitle": "Something went wrong", + "appErrorReload": "Reload", + "writeRichFallbackNotice": "This document contains syntax the rich editor cannot preserve losslessly. Switched to source editing to protect the file.", + "writeModeRich": "Rich text", + "sddAssistantStructure": "Structure requirements", + "sddAssistantStructureSub": "Split into R blocks with acceptance criteria", + "sddAssistantStructurePrompt": "Restructure the current requirement draft into structured requirement blocks and edit requirement.md directly. Format: each requirement uses a level-3 heading \"### R-n: title\" (n increments from 1; do not append any curly-brace status token). Each block contains a short description and an acceptance checklist (lines starting with \"- [ ] \", each criterion concrete and verifiable). Preserve my intent, do not invent requirements; keep unrelated background content outside the blocks.", + "sddFwGroupDiscover": "Clarify direction", + "sddFwGroupStructure": "Shape into a spec", + "sddFwGroupRisk": "Pre-check risks", + "sddFwIdeasTitle": "Brainstorm ideas", + "sddFwIdeasSub": "PM · Design · Eng lenses", + "sddFwIdeasPrompt": "From a Product Manager, Designer, and Engineer perspective, brainstorm options for the current requirement draft — 4-6 ideas per lens — then pick the top 5 overall and, for each, give why it was chosen and the key assumption to validate.", + "sddFwTreeTitle": "Opportunity tree", + "sddFwTreeSub": "Outcome → opportunity → solution", + "sddFwTreePrompt": "Build an Opportunity Solution Tree from the current requirement draft: name one measurable desired outcome, map 3-7 customer opportunities (problems, not features), give 3+ solutions for the key ones, and design a fast experiment (hypothesis, method, metric, success threshold) for the most promising.", + "sddFwTriageTitle": "Triage requests", + "sddFwTriageSub": "Group themes, pick top 3", + "sddFwTriagePrompt": "I have several requests/asks here. Group them into themes, evaluate each by impact, effort, risk, and strategic alignment, and pick the top 3 to do first — with rationale, alternative solutions, the riskiest assumption, and the cheapest way to test it.", + "sddFwWwaTitle": "WWA format", + "sddFwWwaSub": "Why · What · Acceptance", + "sddFwWwaPrompt": "Rewrite the current requirement draft into Why-What-Acceptance requirement blocks and edit requirement.md directly: each block uses a level-3 heading \"### R-n: title\", the body states the Why (why we do it) and What (what we build) in 1-2 sentences, then a \"- [ ] \" list of observable, verifiable acceptance criteria. Preserve my intent; do not invent requirements.", + "sddFwJobsTitle": "Job stories", + "sddFwJobsSub": "Situation · motivation · outcome", + "sddFwJobsPrompt": "Reframe the current requirement draft as job stories (\"When , I want to , so I can \") and edit requirement.md into structured blocks: each \"### R-n: title\" with the job story as the description and a \"- [ ] \" list of outcome-focused acceptance criteria below.", + "sddFwPrdTitle": "Expand to PRD", + "sddFwPrdSub": "Add background, goals, value", + "sddFwPrdPrompt": "Expand the current requirement draft into a more complete spec: first add Background (why now), Objective (with measurable key results), target segments, value proposition, and key assumptions, then break concrete features into structured blocks \"### R-n: title\" + \"- [ ] \" acceptance criteria. Edit requirement.md directly, in plain language.", + "sddFwPolishTitle": "Proofread", + "sddFwPolishSub": "Grammar · logic · flow", + "sddFwPolishPrompt": "Proofread the current requirement draft for grammar, logic, and flow issues. List each issue by location with a specific fix and a one-line reason, then highlight the 3-5 most important. Do not rewrite wholesale; preserve my voice and intent.", + "sddFwAssumeTitle": "Find assumptions", + "sddFwAssumeSub": "Value · usability · viability · feasibility", + "sddFwAssumePrompt": "Stress-test the current requirement as a devil's advocate: across Value, Usability, Viability, and Feasibility — and from PM, Designer, and Engineer perspectives — list each risky assumption, what could go wrong, your confidence, and the cheapest way to test it.", + "sddFwAssumeRankTitle": "Rank assumptions", + "sddFwAssumeRankSub": "Impact × risk matrix", + "sddFwAssumeRankPrompt": "Rank the key assumptions in the current requirement on an Impact × Risk matrix (risk ≈ (1 − confidence) × effort), sorting them into build-now / test-with-an-experiment / drop / defer, and propose one low-cost experiment (with metric and success threshold) for each that needs testing.", + "sddFwPremortemTitle": "Pre-mortem", + "sddFwPremortemSub": "Imagine failure, find risks", + "sddFwPremortemPrompt": "Run a pre-mortem on the current requirement: imagine it shipped and failed, work backward, and sort risks into Tigers (real problems), Paper Tigers (overblown worries), and Elephants (unspoken concerns). Classify the real ones as launch-blocking / fast-follow / track, and give each launch-blocking risk a mitigation, owner, and decision date.", + "sddFwExptTitle": "Design experiments", + "sddFwExptSub": "Cheap assumption tests", + "sddFwExptPrompt": "For the risky assumptions in the current requirement, design low-cost validation experiments (prototype click tests, fake-door tests, technical spikes, guarded A/B, Wizard-of-Oz, etc.). For each, state which assumption it tests, exactly what you'll do, the metric, and the success threshold. Measure real behavior over opinions.", + "sddReqProgressLabel": "Requirement progress", + "sddReqProgressSummary": "{{done}}/{{total}} implemented", + "planCoverageLabel": "Coverage {{covered}}/{{total}}", + "planCoverageUncovered": "Uncovered: {{ids}}", + "planVerify": "Verify", + "planVerifyRunning": "Verifying…", + "sddChangedBanner": "Requirements {{ids}} changed after planning; the plan may be stale", + "sddReplanButton": "Replan affected steps", + "agentsView": { + "configureModel": "configure model", + "delegatable": "Delegatable · usable in chat", + "system": "Система", + "compaction": "Compaction", + "compactionDesc": "Compress long context", + "title": "Заголовок", + "titleDesc": "Generate chat title", + "summary": "Сводка", + "summaryDesc": "Conversation summary", + "ruleBased": "Rule-based", + "deleteConfirm": "Delete this agent?", + "followDefault": "Follow default", + "builtinTag": "built-in", + "edit": "Редактировать", + "delete": "Удалить", + "editAgent": "Edit agent", + "fName": "Name", + "fDesc": "Description", + "fColor": "Color", + "fMode": "Mode", + "modeDelegate": "delegate", + "modePersona": "persona", + "modeBoth": "both", + "fTools": "Tool access", + "toolReadOnly": "read-only", + "toolInherit": "all tools", + "tabBasic": "Basic", + "tabPermissions": "Permissions", + "permScope": "Capability scope", + "permScopeReadOnly": "Read-only", + "permScopeAll": "All", + "permScopeCustom": "Custom", + "permScopeHint": "Pick the capabilities this agent may use — never exceeds the main agent.", + "permScopeReadOnlyNote": "Investigation only: read / grep / find / ls / repo_map. No MCP or skills.", + "permScopeAllNote": "Inherits every capability the main agent has.", + "permSearch": "Search tools / MCP / skills…", + "permSecTools": "Built-in tools", + "permSecMcp": "MCP servers", + "permSecSkills": "Skills", + "permToolsWord": "tools", + "permBlocked": "blocked", + "permSkillsInheritNote": "Inherits all available skills by default; block individually.", + "permNoMcp": "No MCP servers configured.", + "permNoSkills": "No skills discovered.", + "permLoading": "Loading capabilities…", + "fModel": "Model", + "modelHint": "Pick on the list row, or set provider:model here", + "providerId": "provider id", + "fSystemPrompt": "System prompt", + "cancel": "Cancel", + "create": "Создать", + "save": "Сохранить", + "builtin": { + "general": "General-purpose agent: research and multi-step tasks, full tools, can edit files, runs in parallel.", + "explore": "Read-only code explorer: find files, search keywords, answer questions; never edits." + } + }, + "subagents": "Subagents", + "disable": "Выключить", + "enable": "Включить", + "expandSidebar": "Expand sidebar", + "rightPanelSubagents": "Subagents", + "subagentsPanel": { + "configModel": "configure model", + "delegatable": "Delegatable · usable in chat", + "system": "Система", + "global": "Global · shared", + "newSubagent": "New subagent", + "smallModel": { + "name": "Название", + "desc": "Default for Title & Summary" + }, + "role": { + "design-reviewer": { + "name": "Название", + "desc": "design-reviewer · read-only" + }, + "over-engineering-reviewer": { + "name": "Название", + "desc": "over-engineering-reviewer · read-only" + }, + "compaction": { + "name": "Название", + "desc": "Configurable · defaults to main model" + }, + "codeReview": { + "name": "Название", + "desc": "Isolated read-only run · configurable" + }, + "title": { + "name": "Название", + "desc": "LLM · defaults to small model" + }, + "summary": { + "name": "Название", + "desc": "LLM · defaults to small model" + }, + "general": { + "name": "Название", + "desc": "Full tools · multi-step work" + }, + "explore": { + "name": "Название", + "desc": "Read-only · find & search code" + } + }, + "builtin": "Built-in" + }, + "summarizeSession": "Summarize", + "summarizing": "Обобщение", + "summarizeFailed": "Could not summarize this conversation", + "name": "Имя", + "description": "Описание", + "color": "Цвет", + "mode": "Режим", + "systemPrompt": "System prompt", + "toolPolicy": "Tool access" +} \ No newline at end of file diff --git a/src/renderer/src/locales/ru/settings.json b/src/renderer/src/locales/ru/settings.json new file mode 100644 index 000000000..d75d96b7e --- /dev/null +++ b/src/renderer/src/locales/ru/settings.json @@ -0,0 +1,1364 @@ +{ + "title": "Настройки", + "subtitle": "Управление API-доступом, настройками интерфейса, папками и поведением ассистента.", + "back": "Назад", + "general": "Общие", + "providers": "Провайдеры", + "extensions": "Расширения", + "agents": "ИИ-ассистент", + "subagents": "Суб-агенты", + "subagentsSettingsIntro": "Управление политикой выполнения, моделями, уровнем рассуждений, промптами и доступом к возможностям для делегируемых суб-агентов. Настройки синхронизируются с боковой панелью.", + "subagentsRuntimePolicy": "Политика выполнения", + "subagentsRuntimePolicyDesc": "Настройка параллельности делегирования и лимитов запуска за сессию.", + "subagentsMaxParallel": "Максимум параллельных суб-агентов", + "subagentsMaxParallelDesc": "Новые задачи ожидают в очереди, когда одновременно запущено это количество суб-агентов.", + "subagentsMaxChildRuns": "Запусков на сессию", + "subagentsMaxChildRunsDesc": "Ограничение количества задач суб-агентов, которые может создать одна родительская сессия.", + "subagentsDelegatable": "Профили суб-агентов", + "subagentsDelegatableDesc": "Настройка встроенных ролей делегирования или создание собственных профилей для делегирования и первичных агентов.", + "subagentsAutomaticRoles": "Автоматические роли моделей", + "subagentsAutomaticRolesDesc": "Выбор моделей для внутренней работы: сжатие контекста, ревью кода, названия и сводки.", + "archives": "Архив чатов", + "skill": "Навыки", + "mcp": "Внешние инструменты", + "write": "Письмо", + "design": "Дизайн", + "claw": "Подключить телефон", + "keyboardShortcuts": "Горячие клавиши", + "easterEgg": "Мастерская режимов", + "updates": "Версия и обновления", + "debug": "Диагностика", + "terminal": "Терминал", + "sectionTerminal": "Внешний вид терминала", + "terminalColorMode": "Цветовой режим", + "terminalColorModeDesc": "По умолчанию терминал использует встроенный стиль приложения и показывает ANSI-цвета оболочки. Выключите цвета, чтобы сделать терминал монохромным.", + "terminalColorModeNative": "Системные настройки", + "terminalColorModeNone": "Без цвета (монохромный)", + "terminalColorModeCustom": "Свои цвета", + "terminalColorModeNativeHint": "Системные настройки", + "terminalColorModeNativeDesc": "Терминал использует встроенную светлую/тёмную палитру и сохраняет ANSI-цвета из приглашений оболочки, вывода команд и программ.", + "terminalColorModeNoneHint": "Монохромный режим", + "terminalColorModeNoneDesc": "Весь текст терминала отображается одним цветом. Команды не будут выделяться красным — это исключает путаницу с сообщениями об ошибках. Переключитесь на «Свои цвета» для подсветки синтаксиса.", + "terminalColorSurface": "Цвета поверхности", + "terminalColorSurfaceDesc": "Базовые цвета терминала: текст, фон, курсор и выделение.", + "terminalColorForeground": "Текст", + "terminalColorBackground": "Фон", + "terminalColorCursor": "Курсор", + "terminalColorSelection": "Выделение", + "terminalColorAnsi": "Палитра ANSI 16 цветов", + "terminalColorAnsiDesc": "Цвета, используемые программами оболочки для подсветки синтаксиса, ls --color, git status и т. д.", + "terminalColorBlack": "Чёрный", + "terminalColorRed": "Красный", + "terminalColorGreen": "Зелёный", + "terminalColorYellow": "Жёлтый", + "terminalColorBlue": "Синий", + "terminalColorMagenta": "Пурпурный", + "terminalColorCyan": "Голубой", + "terminalColorWhite": "Белый", + "terminalColorBrightBlack": "Ярко-чёрный", + "terminalColorBrightRed": "Ярко-красный", + "terminalColorBrightGreen": "Ярко-зелёный", + "terminalColorBrightYellow": "Ярко-жёлтый", + "terminalColorBrightBlue": "Ярко-синий", + "terminalColorBrightMagenta": "Ярко-пурпурный", + "terminalColorBrightCyan": "Ярко-голубой", + "terminalColorBrightWhite": "Ярко-белый", + "terminalColorReset": "Сбросить настройки", + "terminalColorResetDesc": "Вернуться к системным настройкам.", + "terminalColorResetButton": "Сбросить", + "sectionLlmDebug": "Отладка запросов LLM", + "llmDebugDesc": "Просмотр последних 25 сырых тел запросов к модели (системный промпт, сообщения, инструменты) и их вывода. Хранятся только в памяти и очищаются при перезапуске.", + "llmDebugEmpty": "Записей пока нет. Отправьте сообщение и нажмите «Обновить».", + "llmDebugRequest": "Запрос (тело HTTP-запроса к модели)", + "llmDebugOutput": "Вывод", + "llmDebugReasoning": "Рассуждение", + "llmDebugToolCalls": "Вызовы инструментов", + "llmDebugUsage": "Использование", + "refresh": "Обновить", + "permissions": "Разрешения", + "agentsQuickBase": "Ассистент", + "agentsQuickSkill": "Навыки", + "agentsQuickMcp": "Внешние инструменты", + "agentsQuickPermissions": "Доступ", + "archivesTitle": "Архив чатов", + "archivesOverview": "Архив переписок", + "archivesOverviewDesc": "Просмотр чатов, удалённых из активной боковой панели. Вы можете открыть, восстановить или навсегда удалить их отсюда.", + "archivesSearchPlaceholder": "Поиск в архиве чатов", + "archivesCount": "{{count}} в архиве", + "archivesWorkspaceCount": "{{count}} чатов", + "archivesEmpty": "Архив чатов пуст.", + "archivesSearchEmpty": "Нет чатов, соответствующих запросу.", + "archivesOffline": "Подключите локальный сервис для обновления архива чатов.", + "archivesUntitled": "Чат без названия", + "archivesRestore": "Восстановить", + "archivesDelete": "Удалить из архива", + "archivesDeleteConfirmTitle": "Удалить «{{title}}»?", + "archivesDeleteConfirmDesc": "Этот чат будет удалён навсегда. Это действие нельзя отменить.", + "clawRuntime": "Подключение телефона", + "clawEnabled": "Включить подключение телефона", + "clawEnabledDesc": "При включении мост Feishu/Lark и локальный IM-вебхук могут работать в фоне. Отключение не влияет на обычные чаты в GUI.", + "clawDefaultWorkspace": "Рабочая директория телефона по умолчанию", + "clawDefaultWorkspaceDesc": "Оставьте пустым, чтобы использовать директорию GUI по умолчанию. Отдельные подключения могут изменить её.", + "clawDefaultWorkspacePlaceholder": "Оставьте пустым для наследования: {{path}}", + "clawDefaultWorkspaceReset": "Использовать директорию GUI", + "clawManageAgents": "Подключённые телефонные агенты", + "clawManageAgentsEmpty": "Ещё не подключён ни один телефонный агент. Сначала используйте «Подключить телефон» для связи с Feishu/Lark.", + "clawManageAgentMeta": "{{provider}} · {{model}} · {{workspace}}", + "clawManageAgentEnabled": "Включён", + "clawManageAgentDisabled": "Отключён", + "clawManageAgentName": "Имя агента", + "clawManageAgentNamePlaceholder": "Имя, отображаемое в боковой панели IM", + "clawManageAgentDescription": "Краткое описание", + "clawManageAgentDescriptionPlaceholder": "Пример: Отвечает на вопросы проекта в командном чате", + "clawManageAgentIdentity": "Определение роли", + "clawManageAgentIdentityPlaceholder": "Определите, кто этот агент, его роль, область действия и границы.", + "clawManageAgentPersonality": "Личность", + "clawManageAgentPersonalityPlaceholder": "Определите тон, стиль, терпение и случаи, когда следует задавать уточняющие вопросы.", + "clawManageAgentUserContext": "Контекст пользователя", + "clawManageAgentUserContextPlaceholder": "Долгосрочный контекст пользователя, команды или рабочего процесса, который должен помнить телефонный агент.", + "clawManageAgentReplyRules": "Правила ответов", + "clawManageAgentReplyRulesPlaceholder": "Определите формат ответа, длину, проверку рисков и правила подтверждения.", + "clawTelegramConnectTitle": "Подключить Telegram-бота", + "clawTelegramConnectDesc": "Введите токен бота от @BotFather, чтобы этот компьютер мог получать личные сообщения Telegram.", + "clawTelegramConnectStep1": "Откройте Telegram и найдите @BotFather.", + "clawTelegramConnectStep2": "Отправьте /newbot, следуйте инструкциям, чтобы задать имя и username бота, затем скопируйте токен.", + "clawTelegramConnectStep3": "Вставьте токен бота ниже. Чтобы ограничить доступ, укажите ID конкретных чатов.", + "clawTelegramConnectStep4": "Нажмите «Подключить», затем отправьте боту личное сообщение в Telegram для начала работы.", + "clawTelegramCredentialTitle": "Учётные данные Telegram-бота", + "clawTelegramConnectedHint": "{{bot}} подключён, его учётные данные сохранены локально. Kun создаёт или восстанавливает соответствующий чат при открытии этого IM-канала или при получении первого сообщения от бота. Телефонные чаты отображаются в IM-режиме, а не в списке проектов.", + "clawSkillAllowlist": "Навыки по умолчанию", + "clawSkillAllowlistDesc": "По одному навыку на строку. Телефонные подключения и запланированные задачи сначала используют эти навыки.", + "clawExtraSkillDirs": "Дополнительные папки навыков", + "clawExtraSkillDirsDesc": "Необязательные локальные папки навыков для ИИ-ассистента.", + "clawPromptPrefix": "Префикс промпта", + "clawPromptPrefixDesc": "Добавляется перед телефонными сообщениями и промптами запланированных задач.", + "clawPromptPrefixPlaceholder": "Пример: Ты мой личный ассистент автоматизации. Определи источник перед ответом.", + "codePromptPrefix": "Префикс промпта Code", + "codePromptPrefixDesc": "Эти инструкции вставляются перед каждым разговором в режиме Code. Используйте для глобальных правил, конвенций кодирования и предпочтений.", + "codePromptPrefixPlaceholder": "Пример: Всегда пиши unit-тесты для нового кода. Используй функциональные компоненты. Строгий режим TypeScript.", + "clawRunMode": "Режим выполнения", + "clawRunModeDesc": "Режим обработки телефонных сообщений и запланированных задач по умолчанию.", + "clawFeishuStream": "Потоковый вывод", + "clawFeishuStreamDesc": "Потоковая передача ответа посимвольно в карточке SDK вместо одноразового сообщения после завершения.", + "clawModeAgent": "Действовать напрямую", + "clawModePlan": "План", + "clawModel": "Модель", + "clawModelDesc": "Выберите автоматический маршрут, Pro или Flash.", + "clawWorkspaceOverride": "Переопределение рабочей директории", + "clawWorkspaceOverrideDesc": "Оставьте пустым, чтобы использовать рабочую директорию по умолчанию.", + "clawTasksTitle": "Запланированные задачи", + "clawTasksDesc": "Каждая задача отправляет свой промпт ИИ-ассистенту по заданному расписанию.", + "clawTasksEmpty": "Запланированных задач пока нет.", + "clawTasksCount": "{{count}} запланированных задач", + "clawTaskAdd": "Добавить задачу", + "clawTaskDelete": "Удалить задачу", + "clawScheduleKind": "Тип расписания", + "clawScheduleManual": "Вручную", + "clawScheduleInterval": "Интервал", + "clawScheduleDailyShort": "Ежедневно", + "clawScheduleAtShort": "Однократно", + "clawScheduleEvery": "Каждые {{minutes}} мин", + "clawScheduleDaily": "Ежедневно в {{time}}", + "clawScheduleAt": "Однократно · {{datetime}}", + "clawEveryMinutes": "Интервал в минутах", + "clawTimeOfDay": "Время ежедневно", + "clawAtTime": "Выполнить в", + "clawTaskPromptPlaceholder": "Пример: Обобщи последние изменения в рабочей директории и перечисли дальнейшие шаги.", + "clawWorkspaceInherit": "Использовать рабочую директорию по умолчанию: {{path}}", + "clawLastStatus": "Последний статус", + "clawLastThread": "Последняя беседа", + "sectionGeneral": "Основное", + "sectionWrite": "Режим письма", + "easterEggSection": "Мастерская режимов", + "sectionUpdates": "Версия и обновления", + "language": "Язык", + "languageDesc": "Применяется сразу после выбора.", + "theme": "Тема", + "themeDesc": "Светлая, тёмная или системная.", + "themeSystem": "Системная", + "themeLight": "Светлая", + "themeDark": "Тёмная", + "onboardingPreview": "Руководство по началу работы", + "onboardingPreviewDesc": "Повторно откройте базовую настройку, показанную при первом запуске.", + "onboardingPreviewOpen": "Открыть руководство", + "legacyImportTitle": "Импорт старых диалогов", + "legacyImportDesc": "Перенесите диалоги из предыдущей установки DeepSeek GUI в Kun.", + "legacyImportScanning": "Поиск предыдущих диалогов…", + "legacyImportFound": "Найдено {{count}} диалогов(а), готовых к импорту.", + "legacyImportAllPresent": "Предыдущие диалоги уже импортированы.", + "legacyImportNoneFound": "Предыдущие диалоги на этом компьютере не найдены.", + "legacyImportSourceCount": "{{newCount}} новых / {{total}} всего", + "legacyImportButton": "Импортировать всё", + "legacyImportPick": "Выбрать папку…", + "legacyImportRestarting": "Перезапуск…", + "legacyImportResult": "Импортировано {{imported}} диалогов(а); пропущено {{skipped}} уже существующих.", + "legacyImportResultNone": "Диалоги для импорта не найдены.", + "legacyImportRestartTitle": "Импорт завершён", + "legacyImportRestartDetail": "Импортировано {{count}} диалогов(а). Перезапустить сервис сейчас для загрузки в боковую панель?", + "legacyImportRestartConfirm": "Перезапустить сейчас", + "fontScale": "Размер шрифта", + "fontScaleDesc": "Настройка общего размера текста интерфейса.", + "fontScaleSmall": "Маленький", + "fontScaleMedium": "Средний", + "fontScaleLarge": "Крупный", + "fontScaleCurrent": "Текущий: {{value}}", + "chatContentMaxWidth": "Ширина текста беседы", + "chatContentMaxWidthDesc": "Настройка ширины сообщений и поля ввода.", + "chatContentMaxWidthNarrow": "Узкая", + "chatContentMaxWidthWide": "Широкая", + "chatContentMaxWidthDecrease": "Уменьшить ширину текста", + "chatContentMaxWidthIncrease": "Увеличить ширину текста", + "cursorSpotlight": "Интерактивные эффекты", + "cursorSpotlightDesc": "Показывать мягкую подсветку, следующую за курсором на заголовке и боковой панели.", + "cursorSpotlightColor": "Цвет интерактивного эффекта", + "cursorSpotlightColorDesc": "Используйте ползунок для настройки от глубокого до яркого оттенка. По умолчанию используется мягкий синий цвет Kun.", + "cursorSpotlightColorReset": "По умолчанию", + "cursorSpotlightColorShade": "Оттенок эффекта {{index}}", + "cursorSpotlightColorTone": "Ползунок оттенка эффекта", + "turnCompleteNotification": "Уведомления о завершении ответа", + "turnCompleteNotificationDesc": "Показывать системное уведомление Windows/macOS, когда ИИ-ассистент завершает ответ.", + "desktopBehavior": "Поведение на рабочем столе", + "desktopOpenAtLogin": "Открывать при входе", + "desktopOpenAtLoginDesc": "Автоматически запускать Kun после входа в систему.", + "desktopOpenAtLoginUnsupportedDesc": "Функция доступна в Windows и macOS.", + "desktopStartMinimized": "Запуск свёрнутым", + "desktopStartMinimizedDesc": "Скрывать главное окно при запуске Windows.", + "desktopStartMinimizedDisabledDesc": "Сначала включите «Открывать при входе». Эта опция работает при запуске Windows.", + "desktopCloseToTray": "Сворачивать в трей", + "desktopCloseToTrayDesc": "Скрывать окно в системном трее при закрытии.", + "desktopCloseAction": "Поведение при закрытии окна", + "desktopCloseActionDesc": "Выберите, что происходит при нажатии кнопки закрытия главного окна.", + "desktopCloseAction_ask": "Спрашивать каждый раз", + "desktopCloseAction_tray": "Сворачивать в трей", + "desktopCloseAction_quit": "Завершить приложение", + "shortcutSearchPlaceholder": "Поиск сочетаний клавиш", + "shortcutCommandColumn": "Команда", + "shortcutBindingColumn": "Сочетание клавиш", + "shortcutCaptureHint": "Нажмите новое сочетание клавиш. Esc — отмена.", + "shortcutRecording": "Нажмите клавиши", + "shortcutUnassigned": "Не назначено", + "shortcutReset": "Сбросить сочетание", + "shortcutConflict": "Уже используется «{{command}}».", + "shortcutTogglePlanMode": "Переключить режим плана", + "shortcutTogglePlanModeDesc": "Переключение редактора между режимами агента и плана.", + "shortcutNewChat": "Новый чат", + "shortcutNewChatDesc": "Начать новый чат в текущей рабочей директории.", + "shortcutChooseWorkspace": "Выбрать рабочую директорию", + "shortcutChooseWorkspaceDesc": "Открыть выбор рабочей директории.", + "shortcutToggleTerminal": "Открыть терминал", + "shortcutToggleTerminalDesc": "Открыть или закрыть панель терминала.", + "shortcutSettings": "Настройки", + "shortcutSettingsDesc": "Открыть настройки.", + "shortcutQuit": "Выйти", + "shortcutQuitDesc": "Выйти из приложения.", + "shortcutUndo": "Отменить", + "shortcutUndoDesc": "Отменить последнее действие.", + "shortcutRedo": "Повторить", + "shortcutRedoDesc": "Повторить последнее действие.", + "shortcutCut": "Вырезать", + "shortcutCutDesc": "Вырезать текущее выделение.", + "shortcutCopy": "Копировать", + "shortcutCopyDesc": "Копировать текущее выделение.", + "shortcutPaste": "Вставить", + "shortcutPasteDesc": "Вставить из буфера обмена.", + "shortcutSelectAll": "Выделить всё", + "shortcutSelectAllDesc": "Выделить содержимое в активном виде.", + "shortcutReload": "Перезагрузить", + "shortcutReloadDesc": "Перезагрузить окно приложения.", + "shortcutZoomIn": "Приблизить", + "shortcutZoomInDesc": "Увеличить масштаб окна.", + "shortcutZoomOut": "Отдалить", + "shortcutZoomOutDesc": "Уменьшить масштаб окна.", + "shortcutResetZoom": "Сбросить масштаб", + "shortcutResetZoomDesc": "Сбросить масштаб окна.", + "shortcutDevTools": "Инструменты разработчика", + "shortcutDevToolsDesc": "Открыть инструменты разработчика.", + "shortcutCloseWindow": "Закрыть окно", + "shortcutCloseWindowDesc": "Закрыть главное окно.", + "shortcutMinimize": "Свернуть окно", + "shortcutMinimizeDesc": "Свернуть главное окно.", + "shortcutToggleMaximize": "Развернуть окно", + "shortcutToggleMaximizeDesc": "Развернуть или восстановить главное окно.", + "kunProvider": "Провайдер модели", + "kunProviderDesc": "Настройка одного или нескольких провайдеров, совместимых с OpenAI, для агента. Каждый провайдер может иметь свой API-ключ, URL сервиса и список моделей.", + "kunProviderSelectDesc": "Выберите провайдера из списка на вкладке «Провайдеры».", + "providersDesc": "API-ключи, URL сервисов, текстовые модели и возможности генерации изображений находятся здесь. Ассистент, режим письма и генерация изображений используют эти профили.", + "modelProviderAdd": "Добавить провайдера", + "modelProviderAddMenuCustom": "Свой провайдер…", + "modelProviderRemove": "Удалить провайдера", + "modelProviderNewName": "Свой провайдер {{index}}", + "modelProviderDefault": "Провайдер по умолчанию", + "modelProviderName": "Отображаемое имя", + "modelProviderId": "ID провайдера", + "modelProviderIdLocked": "ID провайдера по умолчанию и предустановленных провайдеров нельзя изменить.", + "modelProviderApiKey": "API-ключ", + "claudeSubTosNote": "Личное использование: использует вашу подписку Claude Pro/Max через официальный Claude Agent SDK (Claude Code встроен — отдельная установка не требуется). Требуется одноразовый вход; это приложение не предоставляет аккаунты Claude или веб-вход.", + "claudeSubStatusChecking": "Проверка локального входа Claude Code…", + "claudeSubStatusLoggedIn": "Обнаружен локальный вход Claude Code — токен ниже можно оставить пустым.", + "claudeSubStatusLoggedOut": "Локальный вход не обнаружен — войдите или вставьте токен подписки.", + "claudeSubStatusToken": "Токен подписки настроен — готово.", + "claudeSubSdkChecking": "Проверка среды выполнения подписки…", + "claudeSubSdkMissing": "Среда выполнения подписки не установлена (~222 МБ, загружается однократно при первом использовании).", + "claudeSubSdkDownload": "Загрузить среду выполнения (~222 МБ)", + "claudeSubSdkDownloading": "Загрузка… (может занять несколько минут)", + "claudeSubSdkReady": "Среда готова", + "claudeSubSdkFailed": "Загрузка не удалась", + "claudeSubReloginButton": "Перелогиниться / обновить токен", + "claudeSubRecheck": "Проверить снова", + "claudeSubLoginButton": "Войти / получить токен подписки", + "claudeSubLoginBusy": "Завершите авторизацию в браузере…", + "claudeSubLoginSuccess": "Выполнен вход — токен подписки заполнен.", + "claudeSubLoginFailedCli": "Не удалось запустить вход: встроенный бинарник Claude не найден (выполните npm install в kun) и `claude` нет в PATH. Можете вставить токен вручную.", + "claudeSubLoginFailedTimeout": "Время авторизации истекло (5 мин). Попробуйте снова.", + "claudeSubLoginFailedGeneric": "Вход не удался", + "claudeSubCommandCopy": "Копировать", + "claudeSubCommandCopied": "Скопировано", + "claudeSubManualLabel": "Токен подписки (необязательно · ручная вставка)", + "claudeSubManualPlaceholder": "Вставьте токен из claude setup-token или оставьте пустым для локального входа.", + "claudeSubTokenSetHint": "Токен установлен — будет использоваться для аутентификации подписки.", + "claudeSubEmptyHint": "Оставьте пустым для использования локальных учётных данных Claude Code.", + "claudeSubProbeNotReady": "Вход в Claude не обнаружен — войдите выше или вставьте токен подписки.", + "claudeSubModelsRefresh": "Загрузить модели из подписки", + "claudeSubModelsFetching": "Загрузка моделей…", + "claudeSubModelsFetched": "Загружено {count} моделей в список.", + "claudeSubModelsEmpty": "Модели не получены (сначала войдите); текущий список сохранён.", + "modelProviderApiKeyPlaceholder": "Введите API-ключ этого провайдера", + "modelProviderBaseUrl": "Базовый URL", + "modelProviderEndpointFormat": "Формат endpoint", + "modelProviderRetrySection": "Повтор при ошибке", + "modelProviderRetryMaxAttempts": "Попыток повтора", + "modelProviderRetryInitialDelayMs": "Начальная задержка повтора (мс)", + "modelProviderRetryStatusCodes": "HTTP-статусы для повтора", + "modelProviderRetryStatusCodesHint": "Укажите коды через запятую, например 429,503.", + "modelEndpointChatCompletions": "/v1/chat/completions (openai)", + "modelEndpointResponses": "/v1/responses (openai)", + "modelEndpointMessages": "/v1/messages (anthropic)", + "modelEndpointCustomEndpoint": "Свой полный endpoint", + "modelEndpointCustomEndpointDesc": "Использует этот URL как конечный endpoint. Распознаются только пути, оканчивающиеся на /chat/completions, /completions, /responses или /messages.", + "modelProviderModels": "Модели", + "modelProviderModelsPlaceholder": "Введите ID модели и нажмите Enter", + "modelProviderModelRemove": "Удалить {{model}}", + "modelProviderModelCount": "{{total}} моделей", + "modelProviderVisionBadge": "Обзор", + "providerModelListDesc": "Добавляйте модели по мере выхода новых или получайте их из API. Текстовые, графические, речевые, музыкальные и видео модели сгруппированы по возможностям.", + "providerModelEmpty": "Моделей пока нет. Нажмите «Добавить модель», чтобы настроить, или используйте «Загрузить из API».", + "providerModelSearchPlaceholder": "Поиск моделей…", + "providerModelSearchEmpty": "Нет моделей, соответствующих «{{query}}».", + "providerModelPageIndicator": "{{page}} / {{total}}", + "providerModelPageCount": "Показано {{shown}} из {{total}}", + "providerModelPagePrev": "Предыдущая", + "providerModelPageNext": "Следующая", + "providerModelAdd": "Добавить модель", + "providerModelAddTitle": "Добавить модель", + "providerModelEditTitle": "Настроить {{model}}", + "providerModelEditAction": "Настроить {{model}}", + "providerModelDeleteAction": "Удалить {{model}}", + "providerModelKindLabel": "Какой это тип модели?", + "providerModelKindChat": "Текстовый чат", + "providerModelKindChatDesc": "Для чата и агентских задач с настраиваемым зрением, вызовом инструментов и рассуждением.", + "providerModelKindImage": "Генерация изображений", + "providerModelKindImageDesc": "Для генерации изображений. После сохранения настройте протокол и endpoint в разделе «Генерация изображений» ниже.", + "providerModelKindSpeech": "Распознавание речи", + "providerModelKindSpeechDesc": "Для транскрибации голосового ввода. После сохранения настройте протокол и endpoint в разделе «Распознавание речи» ниже.", + "providerModelKindTts": "Синтез речи", + "providerModelKindTtsDesc": "Для преобразования текста в речь. После сохранения настройте протокол и endpoint в разделе «Синтез речи» ниже.", + "providerModelKindMusic": "Генерация музыки", + "providerModelKindMusicDesc": "Для создания песен, инструменталов или каверов. После сохранения настройте протокол и endpoint в разделе «Генерация музыки» ниже.", + "providerModelKindVideo": "Генерация видео", + "providerModelKindVideoDesc": "Для генерации видео. После сохранения настройте протокол и endpoint в разделе «Генерация видео» ниже.", + "providerModelIdLabel": "ID модели", + "providerModelIdPlaceholder": "например deepseek-v4-pro", + "providerModelIdHint": "Должен точно соответствовать параметру model в API провайдера — сверьтесь с документацией или используйте «Загрузить из API».", + "providerModelNonTextWarning": "Этот ID совпадает с ключевыми словами изображения/речи, поэтому он не появится в списке чат-моделей.", + "providerModelContextLabel": "Окно контекста (токены)", + "providerModelContextPlaceholder": "например 128k, 1m или 200000", + "providerModelContextParsed": "≈ {{tokens}} токенов", + "providerModelContextHint": "Определяет, когда контекст беседы будет автоматически сжат; скопируйте значение из документации провайдера. Пустое значение возвращается к консервативным 24K.", + "providerModelMaxOutputLabel": "Макс. вывод (токены)", + "providerModelMaxOutputPlaceholder": "например 8k или 32000", + "providerModelMaxOutputParsed": "≈ {{tokens}} токенов", + "providerModelMaxOutputHint": "Ограничивает бюджет вывода одного ответа. Оставьте пустым, чтобы использовать значение по умолчанию среды выполнения Kun.", + "providerModelVisionLabel": "Ввод изображений (зрение)", + "providerModelVisionDesc": "Разрешить отправку изображений этой модели в чате.", + "providerModelToolsLabel": "Вызов инструментов", + "providerModelToolsDesc": "Требуется для агентских задач. Отключайте, только если модель действительно не поддерживает вызов функций.", + "providerModelReasoningLabel": "Рассуждение (глубокое мышление)", + "providerModelReasoningDesc": "Позволяет настроить уровень рассуждений этой модели рядом с композером.", + "providerModelReasoningEfforts": "Доступные уровни", + "providerModelReasoningDefault": "Уровень по умолчанию", + "providerModelReasoningProtocol": "Протокол запроса рассуждений", + "providerModelReasoningProtocolHint": "Как параметры рассуждений отправляются в запросах. Предварительно выбрано из формата endpoint провайдера — обычно менять не нужно.", + "providerModelEndpointFormatLabel": "Формат запроса (endpoint)", + "providerModelEndpointInherit": "Наследовать от провайдера ({{format}})", + "providerModelEndpointFormatHint": "Переопределите формат передачи для этой модели. Используйте, когда один провайдер обслуживает одни модели через chat completions, а другие через Anthropic Messages или OpenAI Responses (например, OpenCode Go). Оставьте «Наследовать», если конкретной модели не нужен другой формат.", + "providerModelReasoningProtocolDeepseek": "Стиль DeepSeek (reasoning_effort)", + "providerModelReasoningProtocolGlm": "Стиль GLM (thinking)", + "providerModelReasoningProtocolMimo": "Стиль Xiaomi MiMo", + "providerModelReasoningProtocolResponses": "Стиль OpenAI Responses", + "providerModelReasoningProtocolAnthropic": "Стиль Anthropic thinking", + "providerModelReasoningProtocolNone": "Не отправлять параметры рассуждений", + "providerModelEffortAuto": "Авто", + "providerModelEffortOff": "Выкл", + "providerModelEffortLow": "Низкий", + "providerModelEffortMedium": "Средний", + "providerModelEffortHigh": "Высокий", + "providerModelEffortMax": "Максимальный", + "providerModelAliasesLabel": "Псевдонимы (необязательно)", + "providerModelAliasesPlaceholder": "Через запятую, например deepseek-chat", + "providerModelAliasesHint": "Альтернативные ID моделей, использующие этот профиль возможностей.", + "providerModelSave": "Сохранить модель", + "providerModelCancel": "Отмена", + "providerModelErrorMissingId": "Введите ID модели.", + "providerModelErrorDuplicateChat": "Эта модель уже в списке.", + "providerModelErrorDuplicateImage": "Этот ID уже используется возможностью генерации изображений — выберите другой ID или удалите его оттуда.", + "providerModelErrorDuplicateSpeech": "Этот ID уже используется возможностью распознавания речи — выберите другой ID или удалите его оттуда.", + "providerModelErrorDuplicateTts": "Этот ID уже используется возможностью синтеза речи — выберите другой ID или удалите его оттуда.", + "providerModelErrorDuplicateMusic": "Этот ID уже используется возможностью генерации музыки — выберите другой ID или удалите его оттуда.", + "providerModelErrorDuplicateVideo": "Этот ID уже используется возможностью генерации видео — выберите другой ID или удалите его оттуда.", + "providerModelErrorContext": "Окно контекста должно быть положительным целым числом; сокращения вида 128k / 1m работают.", + "providerModelErrorMaxOutput": "Максимальный вывод должен быть положительным целым числом; сокращения вида 8k работают.", + "providerModelErrorNoEfforts": "Выберите хотя бы один уровень рассуждений.", + "providerModelDefaultProfileBadge": "Профиль по умолчанию", + "providerModelReasoningBadge": "Рассуждение", + "providerModelNoToolsBadge": "Нет вызова инструментов", + "providerModelContextBadge": "контекст {{size}}", + "providerModelMaxOutputBadge": "вывод {{size}}", + "providerModelBatchSelectVisible": "Выбрать страницу ({{count}})", + "providerModelBatchClearVisible": "Очистить выбор страницы", + "providerModelBatchSelectedCount": "Выбрано: {{count}}", + "providerModelBatchDelete": "Удалить выбранные ({{count}})", + "providerModelBatchToggleRow": "Выбрать {{model}}", + "providerModelImportTitle": "Выберите модели для импорта", + "providerModelImportSubtitle": "Загружено {{total}} моделей из {{provider}}; {{existing}} уже в вашем списке.", + "providerModelImportSearchPlaceholder": "Поиск по названию модели…", + "providerModelImportFilterAll": "Все ({{count}})", + "providerModelImportHideExisting": "Скрыть уже добавленные ({{count}})", + "providerModelImportAlreadyAdded": "Уже добавлено", + "providerModelImportNoneFetched": "Провайдер вернул 0 моделей.", + "providerModelImportNoneMatch": "Нет моделей, соответствующих текущему фильтру.", + "providerModelImportSelectAllVisible": "Выбрать отфильтрованные ({{count}})", + "providerModelImportClearVisible": "Очистить выбор отфильтрованных", + "providerModelImportSelectedCount": "Выбрано: {{count}}", + "providerModelImportCancel": "Отмена", + "providerModelImportConfirm": "Импортировать {{count}}", + "modelProviderInUse": "Используется", + "modelProviderMissingKey": "Нет API-ключа", + "modelProviderDefaultBadge": "По умолчанию", + "modelProviderPresetBadge": "Пресет", + "modelProviderCustomBadge": "Пользовательский", + "modelProviderTokenPlanBadge": "Token Plan", + "modelProviderPlanBadge": "Тариф", + "modelProviderGroupPlans": "Тарифы подписки", + "modelProviderGroupApi": "Оплата по мере использования", + "modelProviderTokenPlanRegion": "Регион тарифа", + "modelProviderDraftBadge": "Не сохранено", + "modelProviderDraftSection": "Добавить провайдера", + "modelProviderDraftConfirm": "Добавить", + "modelProviderDraftDiscard": "Отмена", + "modelProviderDraftHintReady": "Нажмите «Добавить», чтобы сохранить провайдера и переключиться на него.", + "modelProviderDraftHintNoKey": "API-ключа пока нет — «Добавить» сохранит конфигурацию, но не сделает её активной.", + "modelSelectDefaultOption": "По умолчанию ({{model}})", + "modelSelectDefaultSuffix": "{{model}} (по умолчанию)", + "modelSelectCustomOption": "Своя…", + "modelSelectCustomPlaceholder": "Введите ID модели", + "writeInlineCompletionAdvanced": "Дополнительная настройка", + "writeInlineCompletionAdvancedDesc": "Частота срабатывания, порог принятия и длина подсказок. Настройки по умолчанию подходят для большинства случаев.", + "writeSelectionAssistTitle": "Панель выделения", + "writeSelectionAssistAdvanced": "Дополнительно: свои промпты", + "writeSelectionAssistAdvancedDesc": "Измените промпты для генерации инфографики и быстрых действий. Оставьте пустыми для использования встроенных.", + "writeInfographicPromptLabel": "Промпт инфографики", + "writeInfographicPromptDesc": "Префикс промпта, отправляемый модели изображений при генерации инфографики; выделенный текст добавляется после него.", + "writeQuickActionsLabel": "Быстрые действия ИИ", + "writeQuickActionsDesc": "Быстрые действия на панели выделения. «Изменить на месте» заменяет выделение результатом ИИ; «Отправить ассистенту» передаёт выделение на боковую панель.", + "writeQuickActionLabelPlaceholder": "Текст кнопки", + "writeQuickActionPromptPlaceholder": "Промпт (инструкция правки или содержимое чата)", + "writeQuickActionModeLabel": "Поведение", + "writeQuickActionModeEdit": "Изменить на месте", + "writeQuickActionModeChat": "Отправить ассистенту", + "writeQuickActionAdd": "Добавить действие", + "writeQuickActionRemove": "Удалить это действие", + "writeQuickActionsReset": "Сбросить настройки", + "speechToTextAdvanced": "Дополнительные параметры", + "speechToTextAdvancedDesc": "Редко используемые настройки, такие как тайм-аут запроса.", + "speechLanguage_auto": "Автоопределение", + "speechLanguage_zh": "Китайский", + "speechLanguage_en": "Английский", + "speechLanguage_ja": "Японский", + "speechLanguage_ko": "Корейский", + "modelProviderPresetUpdateTag": "Обновить пресет", + "modelProviderUpdatePresetTitle": "Обновить пресет «{{name}}»?", + "modelProviderUpdatePresetDetail": "Этот пресет уже существует. Обновление обновит endpoint и список моделей, сохранив ваш API-ключ и существующие модели.", + "modelProviderUpdatePresetAction": "Обновить", + "modelProviderCancel": "Отмена", + "modelProviderSectionBasics": "Основное", + "modelProviderSectionConnection": "Подключение", + "modelProviderSectionDanger": "Опасная зона", + "modelProviderTestConnection": "Проверить подключение", + "modelProviderTesting": "Проверка подключения…", + "modelProviderTestSuccess": "Подключено · {{latency}}мс · получено {{total}} моделей", + "modelProviderTestFailed": "Ошибка подключения: {{message}}", + "modelProviderPresetMissingKeyForProbe": "Сначала введите API-ключ провайдера. Пресеты не наследуют общий API-ключ.", + "modelProviderFetchModels": "Загрузить из API", + "modelProviderFetchedModels": "Загружено {{total}} новых моделей", + "modelProviderFetchEmpty": "Модели не найдены", + "modelProviderInvalidUrl": "URL должен начинаться с http:// или https://", + "modelProviderDeleteConfirmTitle": "Удалить провайдера «{{name}}»?", + "modelProviderDeleteConfirmDetail": "Это действие нельзя отменить.", + "modelProviderDeleteInUseChat": "Чат использует этого провайдера и переключится на провайдера по умолчанию.", + "modelProviderDeleteInUseImage": "Генерация изображений использует этого провайдера и переключится на кастомный API изображений.", + "modelProviderDeleteInUseSpeech": "Распознавание речи использует этого провайдера и переключится на кастомный API речи.", + "modelProviderDeleteInUseTextToSpeech": "Синтез речи использует этого провайдера и переключится на кастомный API синтеза.", + "modelProviderDeleteInUseMusic": "Генерация музыки использует этого провайдера и переключится на кастомный API музыки.", + "modelProviderDeleteInUseVideo": "Генерация видео использует этого провайдера и переключится на кастомный API видео.", + "modelProviderDeleteInUseWrite": "Автодополнение Writer использует этого провайдера и переключится на провайдера чата.", + "modelProviderDeleteAction": "Удалить", + "modelProviderDangerHint": "Удаление вступает в силу немедленно; функции, использующие этого провайдера, переключатся автоматически.", + "modelProviderImageCapability": "Возможность генерации изображений", + "modelProviderImageCapabilityDesc": "Опционально. Провайдеры с этой возможностью могут быть выбраны генерацией изображений без повторного ввода учётных данных.", + "modelProviderSpeechCapability": "Возможность распознавания речи", + "modelProviderSpeechCapabilityDesc": "Опционально. Провайдеры с этой возможностью могут быть выбраны голосовым вводом без повторного ввода учётных данных.", + "modelProviderTextToSpeechCapability": "Возможность генерации речи", + "modelProviderTextToSpeechCapabilityDesc": "Опционально. Провайдеры с этой возможностью могут быть выбраны для генерации речи без повторного ввода учётных данных.", + "modelProviderMusicCapability": "Возможность генерации музыки", + "modelProviderMusicCapabilityDesc": "Опционально. Провайдеры с этой возможностью могут быть выбраны генерацией музыки без повторного ввода учётных данных.", + "modelProviderVideoCapability": "Возможность генерации видео", + "modelProviderVideoCapabilityDesc": "Опционально. Провайдеры с этой возможностью могут быть выбраны генерацией видео без повторного ввода учётных данных.", + "speechToTextProtocol": "Протокол распознавания речи", + "speechProtocolOpenAi": "OpenAI Transcriptions", + "speechProtocolMimoAsr": "MiMo ASR", + "speechProtocolLocalWhisper": "Локальный Whisper", + "speechToTextBaseUrl": "Базовый URL API распознавания речи", + "speechToTextModels": "Модели распознавания", + "speechToText": "Распознавание речи", + "speechToTextEnabled": "Включить распознавание речи", + "speechToTextEnabledDesc": "Добавляет кнопку голосового ввода в поле сообщения; записи транскрибируются локальным Whisper или выбранным провайдером.", + "speechToTextProvider": "Провайдер распознавания", + "speechToTextProviderDesc": "Выберите локальный Whisper, настроенного провайдера с моделями речи или кастомный API.", + "speechToTextProviderLocalWhisper": "Локальный Whisper", + "speechToTextProviderCustom": "Кастомный API распознавания", + "speechToTextProviderMissingKey": "У {{provider}} пока нет API-ключа. Добавьте его в разделе «Провайдеры».", + "speechToTextProtocolDesc": "Формат запроса для кастомного API. OpenAI Transcriptions вызывает {baseUrl}/audio/transcriptions; MiMo ASR отправляет base64-аудио через chat/completions.", + "speechToTextBaseUrlDesc": "Корневой endpoint распознавания, например https://api.xiaomimimo.com/v1.", + "speechToTextBaseUrlPlaceholder": "https://api.xiaomimimo.com/v1", + "speechToTextApiKey": "API-ключ", + "speechToTextApiKeyDesc": "Ключ для провайдера распознавания. Независим от ключа чата.", + "speechToTextLocalModel": "Локальная модель", + "speechToTextLocalModelDesc": "Загружает квантованную модель из {{source}} по запросу. Лицензия: {{license}}.", + "speechToTextLocalDownloadSource": "Источник загрузки", + "speechToTextLocalDownloadSourceDesc": "Выберите, откуда загружать локальные модели Whisper. Доступность источников проверяется автоматически.", + "speechToTextLocalDownloadSource_huggingface": "Официальный Hugging Face", + "speechToTextLocalDownloadSource_hf-mirror": "Зеркало HF-Mirror", + "speechToTextLocalDownloadSource_hf-sufy": "CDN-зеркало HF", + "speechToTextLocalDownloadSourceChecking": "Проверка доступности источника...", + "speechToTextLocalDownloadSourceAvailable": "{{source}} доступен ({{ms}} мс)", + "speechToTextLocalDownloadSourceUnavailable": "{{source}} недоступен: {{message}}", + "speechToTextLocalDownloadSourceUnknownError": "неизвестная ошибка", + "speechToTextLocalRecommended": "Рекомендуется", + "speechToTextLocalModelFileSize": "Файл: {{size}}", + "speechToTextLocalModelMemory": "Память: около {{memory}}", + "speechToTextLocalModelCpu": "CPU: рекомендуется {{threads}} потоков", + "speechToTextLocalModelQuality": "Качество: {{quality}}", + "speechToTextLocalQuality_basic": "Базовое", + "speechToTextLocalQuality_balanced": "Сбалансированное", + "speechToTextLocalQuality_strong": "Высокое", + "speechToTextLocalModelStateReady": "Загружено", + "speechToTextLocalModelStateDownloading": "Загрузка...", + "speechToTextLocalModelStateMissing": "Не загружено", + "speechToTextLocalModelMissing": "{{model}} не загружена. Примерный размер: {{size}}.", + "speechToTextLocalModelReady": "{{model}} загружена и доступна офлайн. Размер: {{size}}.", + "speechToTextLocalModelDownloading": "Загрузка {{model}}: {{percent}}% ({{size}}, {{speed}}).", + "speechToTextLocalDownloadSpeedPending": "ожидание данных", + "speechToTextLocalModelDownload": "Загрузить модель {{model}}", + "speechToTextLocalModelCancel": "Отменить загрузку", + "speechToTextLocalModelDelete": "Удалить модель", + "speechToTextLocalDownloadFailed": "Не удалось загрузить локальную модель: {{message}}", + "speechToTextLocalCancelFailed": "Не удалось отменить загрузку: {{message}}", + "speechToTextLocalDeleteFailed": "Не удалось удалить модель: {{message}}", + "speechToTextLocalDeleteConfirm": "Удалить модель {{model}}? Для офлайн-использования её нужно будет загрузить снова.", + "speechToTextModel": "Модель распознавания", + "speechToTextModelDesc": "Удалённая модель, используемая для транскрибации речи.", + "speechToTextModelPlaceholder": "mimo-v2.5-asr", + "speechToTextLanguage": "Язык", + "speechToTextLanguageDesc": "Опциональная подсказка языка, например zh или en. Оставьте пустым для автоопределения.", + "speechToTextTimeout": "Тайм-аут (мс)", + "speechToTextTest": "Проверить транскрибацию", + "speechToTextTestDesc": "Отправить встроенный тестовый клип для проверки текущего провайдера, ключа и модели.", + "speechToTextTestAction": "Проверить", + "speechToTextTesting": "Проверка…", + "speechToTextTestSuccess": "Транскрибация работает. Получено: {{text}}", + "speechToTextTestEmptyOk": "Авторизация и endpoint работают (отсутствие транскрипции тестового тона ожидаемо).", + "speechToTextTestFailed": "Проверка не удалась: {{message}}", + "speechToTextTimeoutDesc": "Тайм-аут запроса к API транскрибации.", + "kunApiKey": "API-ключ ассистента", + "kunApiKeyDesc": "Опционально. Оставьте пустым для использования общего API-ключа. Заполняйте, только если чату/коду нужен другой ключ.", + "kunApiKeyPlaceholder": "Оставьте пустым для использования общего", + "kunApiKeyInherited": "Сейчас используется общий API-ключ.", + "kunApiKeyMissing": "Общий API-ключ ещё не настроен.", + "kunApiKeyOverride": "Сейчас используется отдельный API-ключ ассистента.", + "kunBaseUrl": "URL сервиса ассистента", + "kunBaseUrlDesc": "Опционально. Оставьте пустым для использования общего URL. Заполняйте, только если чат/код должны подключаться к другому сервису.", + "kunBaseUrlPlaceholder": "Оставьте пустым для использования общего URL", + "kunBaseUrlOfficial": "официальный endpoint DeepSeek", + "kunBaseUrlInherited": "Сейчас используется общий URL: {{value}}", + "kunBaseUrlOverride": "Сейчас используется отдельный URL ассистента: {{value}}", + "kunAssistantAdvanced": "Расширенные настройки ассистента", + "kunAssistantAdvancedDesc": "Настройки модели, отдельного API ассистента, локального порта и путей к данным для опытных пользователей.", + "kunDiagnostics": "Статус ассистента", + "kunDiagnosticsAdvanced": "Посмотреть детальный статус", + "kunDiagnosticsAdvancedDesc": "Возможности рантайма, подключения инструментов и записи памяти.", + "kunRuntimeCapabilities": "Доступные возможности", + "kunRuntimeCapabilitiesDesc": "Проверить, доступны ли в данный момент веб, навыки, вложения и память.", + "kunRuntimeModel": "Модель", + "kunRuntimePid": "ID процесса", + "kunDiagnosticsRefresh": "Обновить диагностику", + "kunToolDiagnostics": "Статус инструментов", + "kunToolDiagnosticsDesc": "Проверить подключённые источники инструментов, внешние сервисы, навыки, вложения и память.", + "kunDiagnosticsProviders": "Источники инструментов", + "kunDiagnosticsMcpServers": "Внешние сервисы инструментов", + "kunDiagnosticsSkills": "Навыки", + "kunDiagnosticsAttachments": "Вложения", + "kunMemoryRecords": "Сохранённые воспоминания", + "kunMemoryRecordsDesc": "Просмотреть воспоминания, доступные в этой рабочей директории, отключить или удалить ненужные.", + "kunMemoryEmpty": "В этой рабочей директории нет видимых записей памяти.", + "kunMemoryDisabled": "отключено", + "kunMemoryDisable": "Отключить память", + "kunMemoryDelete": "Удалить запись памяти", + "kunBinary": "Путь к программе ассистента", + "kunBinaryDesc": "Обычно оставляйте пустым — приложение использует встроенный сервис. Укажите путь только для локальной разработки или отладки.", + "kunBinaryPlaceholder": "например /usr/local/bin/kun (опционально)", + "kunDataDir": "Папка данных ассистента", + "kunDataDirDesc": "Хранит сессии, кэш и конфигурацию, синхронизированную из приложения в сервис ассистента.", + "kunModel": "Модель по умолчанию", + "kunModelDesc": "ID модели, используемый ассистентом, если запрос не выбирает конкретную модель.", + "kunPromptOptimization": "Оптимизация промпта", + "kunPromptOptimizationDesc": "Когда включено, показывает кнопку оптимизации, которая переписывает черновые инструкции в более чёткий промпт.", + "kunPromptOptimizationConfig": "Настройки оптимизации промпта", + "kunPromptOptimizationConfigDesc": "Выберите модель для перезаписи промптов и, опционально, измените встроенный промпт оптимизации.", + "kunPromptOptimizationProvider": "Провайдер", + "kunPromptOptimizationModel": "Модель", + "kunPromptOptimizationModelDefault": "По умолчанию: {{model}}", + "kunPromptOptimizationTimeout": "Тайм-аут (мс)", + "kunPromptOptimizationPrompt": "Промпт оптимизации (пусто = встроенный по умолчанию)", + "kunTokenEconomy": "Экономия контекста", + "kunTokenEconomyDesc": "Сокращает использование контекста модели путём сжатия безопасных описаний инструментов и результатов без изменения истории чата.", + "kunTokenEconomySavings": "Сэкономлено около {{tokens}} токенов", + "kunTokenEconomySavingsLoading": "Загрузка сэкономленных токенов…", + "kunTokenEconomySavingsEmpty": "Сэкономленные токены начнут накапливаться после следующего запроса.", + "kunInstructions": "Инструкции AGENTS.md", + "kunInstructionsDesc": "Внедрять глобальные и локальные файлы AGENTS.md в каждый шаг.", + "kunInstructionsDiagnostics": "{{count}} источник(ов) внедрено на последнем шаге", + "kunTokenEconomyAdvanced": "Расширенные настройки сокращения контекста", + "kunTokenEconomyAdvancedDesc": "Управляйте тем, что сжимать, защитой длинной истории и локальным токеном доступа.", + "kunTokenEconomyOptions": "Что сжимать", + "kunTokenEconomyOptionsDesc": "Когда сокращение контекста включено, выберите, какой контент запроса сжимать перед отправкой модели.", + "kunCompressToolDescriptions": "Описания инструментов", + "kunCompressToolResults": "Результаты инструментов", + "kunConciseResponses": "Краткие ответы", + "kunHistoryHygiene": "Защита длинной истории", + "kunHistoryHygieneDesc": "Перед каждым запросом к модели ограничивайте длинные результаты и аргументы. Оригинальная история чата сохраняется.", + "kunHistoryMaxResultLines": "Строк результата", + "kunHistoryMaxResultBytes": "Байт результата", + "kunHistoryMaxResultTokens": "Токенов результата", + "kunHistoryMaxArgumentBytes": "Байт аргумента", + "kunHistoryMaxArgumentTokens": "Токенов аргумента", + "kunHistoryMaxArrayItems": "Сохраняемых элементов массива", + "kunInsecure": "Разрешить локальный доступ без токена", + "kunInsecureDesc": "Только для локальной разработки. Другие локальные программы смогут подключаться к сервису ассистента без токена.", + "kunInsecureForcedDesc": "Защита локального доступа отключена, так как токен доступа не установлен. Добавьте токен, чтобы снова управлять этим переключателем.", + "imageGen": "Генерация изображений", + "imageGenEnabled": "Включить генерацию изображений", + "imageGenEnabledDesc": "Включает инструмент generate_image в чатах агента и работает в режиме «Письмо». MiniMax может использовать ключ из провайдеров; кастомные OpenAI-совместимые API изображений также поддерживаются.", + "imageGenProvider": "Провайдер изображений", + "imageGenProviderDesc": "Выберите настроенного провайдера с моделями изображений или используйте кастомный API.", + "imageGenProviderCustom": "Кастомный API изображений", + "imageGenProviderMissingKey": "У {{provider}} пока нет API-ключа. Добавьте его в разделе «Провайдеры».", + "imageGenProtocol": "Протокол изображений", + "imageGenProtocolDesc": "Формат запроса для кастомного API изображений.", + "imageGenProtocolOpenAi": "OpenAI Images", + "imageGenProtocolMiniMax": "MiniMax image_generation", + "imageGenProtocolCodex": "ChatGPT Subscription", + "imageGenBaseUrl": "Базовый URL API", + "imageGenBaseUrlDesc": "Корень OpenAI-совместимого endpoint; инструмент вызывает {baseUrl}/images/generations.", + "imageGenBaseUrlPlaceholder": "https://api.siliconflow.cn/v1", + "imageGenApiKey": "API-ключ", + "imageGenApiKeyDesc": "Ключ для провайдера изображений. Независим от ключа чата.", + "imageGenModel": "Модель изображений", + "imageGenModelDesc": "ID модели, отправляемый провайдеру, например gpt-image-1 или Kwai-Kolors/Kolors.", + "imageGenModelQualityHint": "Для производственных макетов и инфографики предпочитайте GPT Image или Gemini. Отечественные модели изображений всё ещё нестабильны в работе с макетом и текстом.", + "imageGenModelPlaceholder": "gpt-image-1", + "imageGenQuality": "Качество генерации", + "imageGenQualityDesc": "Подсказка качества для поддерживаемых API изображений. Более высокое качество улучшает детализацию, но может увеличить время и стоимость.", + "imageGenQuality_auto": "Авто", + "imageGenQuality_low": "Низкое", + "imageGenQuality_medium": "Среднее", + "imageGenQuality_high": "Высокое", + "imageGenDefaultResolution": "Разрешение по умолчанию", + "imageGenDefaultResolutionDesc": "Используется, когда ассистент не выбрал разрешение явно. Размер 2K может превысить лимит вложений 5 МБ, но файл сохранится в рабочую директорию.", + "imageGenDefaultResolution_auto": "Авто", + "imageGenDefaultResolution_1K": "1K", + "imageGenDefaultResolution_2K": "2K", + "imageGenDefaultSize": "Свои размеры по умолчанию", + "imageGenDefaultSizeDesc": "Расширенная настройка. Можно ввести «ШxВ». Приоритет: явный выбор ассистента > свои размеры > разрешение по умолчанию. Оставьте пустым.", + "imageGenTimeout": "Тайм-аут (мс)", + "imageGenTimeoutDesc": "Тайм-аут запроса к API изображений. Модели изображений могут работать минутами на высоких разрешениях.", + "mediaGeneration": "Генерация медиа", + "mediaGenerationDesc": "Предоставить инструменты генерации изображений, речи, музыки и видео агенту.", + "textToSpeech": "Синтез речи", + "textToSpeechEnabled": "Включить синтез речи", + "textToSpeechEnabledDesc": "Включает инструмент generate_speech в чатах агента для синтеза текста в аудио.", + "textToSpeechProvider": "Провайдер синтеза речи", + "textToSpeechProviderDesc": "Выберите настроенного провайдера с TTS-моделями или используйте кастомный API.", + "textToSpeechProviderCustom": "Кастомный API синтеза речи", + "textToSpeechProviderMissingKey": "У {{provider}} пока нет API-ключа. Добавьте его в разделе «Провайдеры».", + "textToSpeechProtocol": "Протокол синтеза речи", + "textToSpeechProtocolDesc": "Формат запроса для кастомного API синтеза речи.", + "textToSpeechProtocolOpenAi": "OpenAI Speech", + "textToSpeechProtocolMiniMax": "MiniMax t2a_v2", + "textToSpeechProtocolMimo": "Xiaomi MiMo TTS", + "textToSpeechBaseUrl": "Базовый URL API", + "textToSpeechBaseUrlDesc": "Корневой endpoint синтеза речи, например https://api.minimax.io или https://api.xiaomimimo.com/v1.", + "textToSpeechBaseUrlPlaceholder": "https://api.minimax.io", + "textToSpeechApiKey": "API-ключ", + "textToSpeechApiKeyDesc": "Ключ для провайдера синтеза речи. Независим от ключа чата.", + "textToSpeechModel": "Модель синтеза речи", + "textToSpeechModelDesc": "ID модели, отправляемый провайдеру, например speech-2.8-hd или mimo-v2.5-tts.", + "textToSpeechModelPlaceholder": "speech-2.8-hd", + "textToSpeechVoice": "Голос", + "textToSpeechVoiceDesc": "Опционально ID/имя голоса. MiniMax по умолчанию использует male-qn-qingse; Xiaomi может использовать значение голоса провайдера.", + "textToSpeechVoicePlaceholder": "male-qn-qingse", + "textToSpeechFormat": "Формат вывода", + "textToSpeechFormatDesc": "Формат по умолчанию для генерируемых аудиофайлов.", + "textToSpeechTimeout": "Тайм-аут (мс)", + "textToSpeechTimeoutDesc": "Тайм-аут запроса к API синтеза речи.", + "musicGeneration": "Генерация музыки", + "musicGenerationEnabled": "Включить генерацию музыки", + "musicGenerationEnabledDesc": "Включает инструмент generate_music для создания песен, инструменталов или каверов.", + "musicGenerationProvider": "Провайдер музыки", + "musicGenerationProviderDesc": "Выберите настроенного провайдера с музыкальными моделями или используйте кастомный API.", + "musicGenerationProviderCustom": "Кастомный API музыки", + "musicGenerationProviderMissingKey": "У {{provider}} пока нет API-ключа. Добавьте его в разделе «Провайдеры».", + "musicGenerationProtocol": "Протокол генерации музыки", + "musicGenerationProtocolDesc": "Формат запроса для кастомного API музыки.", + "musicGenerationProtocolMiniMax": "MiniMax music_generation", + "musicGenerationBaseUrl": "Базовый URL API", + "musicGenerationBaseUrlDesc": "Корневой endpoint генерации музыки, например https://api.minimax.io.", + "musicGenerationBaseUrlPlaceholder": "https://api.minimax.io", + "musicGenerationApiKey": "API-ключ", + "musicGenerationApiKeyDesc": "Ключ для провайдера музыки. Независим от ключа чата.", + "musicGenerationModel": "Музыкальная модель", + "musicGenerationModelDesc": "ID модели, например music-2.6 или music-cover.", + "musicGenerationModelPlaceholder": "music-2.6", + "musicGenerationFormat": "Формат вывода", + "musicGenerationFormatDesc": "Формат по умолчанию для генерируемых музыкальных файлов.", + "musicGenerationTimeout": "Тайм-аут (мс)", + "musicGenerationTimeoutDesc": "Тайм-аут запроса к API музыки.", + "videoGeneration": "Генерация видео", + "videoGenerationEnabled": "Включить генерацию видео", + "videoGenerationEnabledDesc": "Включает инструмент generate_video с текстом в видео и опциональными изображениями первого/последнего кадра.", + "videoGenerationProvider": "Провайдер видео", + "videoGenerationProviderDesc": "Выберите настроенного провайдера с видеомоделями или используйте кастомный API.", + "videoGenerationProviderCustom": "Кастомный API видео", + "videoGenerationProviderMissingKey": "У {{provider}} пока нет API-ключа. Добавьте его в разделе «Провайдеры».", + "videoGenerationProtocol": "Протокол генерации видео", + "videoGenerationProtocolDesc": "Формат запроса для кастомного API видео.", + "videoGenerationProtocolMiniMax": "MiniMax video_generation", + "videoGenerationBaseUrl": "Базовый URL API", + "videoGenerationBaseUrlDesc": "Корневой endpoint генерации видео, например https://api.minimax.io.", + "videoGenerationBaseUrlPlaceholder": "https://api.minimax.io", + "videoGenerationApiKey": "API-ключ", + "videoGenerationApiKeyDesc": "Ключ для провайдера видео. Независим от ключа чата.", + "videoGenerationModel": "Видеомодель", + "videoGenerationModelDesc": "ID модели, например MiniMax-Hailuo-2.3.", + "videoGenerationModelPlaceholder": "MiniMax-Hailuo-2.3", + "videoGenerationDefaultDuration": "Длительность по умолчанию (с)", + "videoGenerationDefaultDurationDesc": "Используется, если агент не указал длительность.", + "videoGenerationDefaultResolution": "Разрешение по умолчанию", + "videoGenerationDefaultResolutionDesc": "Используется, если агент не указал разрешение.", + "videoGenerationTimeout": "Тайм-аут (мс)", + "videoGenerationTimeoutDesc": "Общее время ожидания одной задачи видео.", + "videoGenerationPollInterval": "Интервал опроса (мс)", + "videoGenerationPollIntervalDesc": "Как часто рантайм проверяет статус асинхронной задачи видео.", + "kunAdvanced": "Расширенные настройки рантайма", + "kunAdvancedDetails": "Хранилище, контекст модели и защита инструментов", + "kunAdvancedDetailsDesc": "Эти опции влияют на внутреннюю работу ассистента. Политика контекста каждой модели задаётся в models.profiles.", + "kunStorageBackend": "Хранилище бесед", + "kunStorageBackendDesc": "Гибридное хранилище использует SQLite для ускорения индексов. Чистый JSONL не использует SQLite и проще для отладки совместимости.", + "kunStorageHybrid": "Гибридное (рекомендуется)", + "kunStorageFile": "Только JSONL", + "kunStorageSqlitePath": "Путь к индексу SQLite", + "kunStorageSqlitePathDesc": "Опционально. Оставьте пустым для автоматического управления под папкой данных ассистента. Используется только с гибридным хранилищем.", + "kunStorageSqlitePathPlaceholder": "Оставьте пустым для автоуправления", + "kunModelContextProfile": "Текущая политика контекста модели", + "kunModelContextProfileDesc": "Окна моделей и пороги сжатия берутся из models.profiles в локальном config.json. DeepSeek V4 по умолчанию имеет окно 1M и начинает сжатие около 980k.", + "kunModelContextModel": "Модель", + "kunModelContextWindow": "Токенов в окне контекста", + "kunModelContextSoft": "Начало сжатия (токенов)", + "kunModelContextHard": "Принудительное сжатие (токенов)", + "kunModelContextSourceBuiltIn": "Встроенная конфигурация модели", + "kunModelContextSourceFallback": "Нет подходящего профиля модели; используются пороги ниже", + "kunCompactionThresholds": "Пороги сжатия для неизвестных моделей", + "kunCompactionThresholdsDesc": "Эти значения используются только когда текущая модель не найдена в models.profiles. Известные модели используют свои пороги.", + "kunCompactionSoftThreshold": "Порог начала сжатия", + "kunCompactionHardThreshold": "Порог принудительного сжатия", + "kunCompactionSummary": "Сводка сжатия", + "kunCompactionSummaryDesc": "Локальные сводки быстрые и бесплатные. Сводки от модели более естественны, но требуют дополнительного запроса.", + "kunCompactionSummaryMode": "Режим сводки", + "kunCompactionSummaryHeuristic": "Локальные правила (рекомендуется)", + "kunCompactionSummaryModel": "Создаётся моделью", + "kunCompactionSummaryTimeout": "Тайм-аут сводки (мс)", + "kunCompactionSummaryMaxTokens": "Макс. токенов сводки", + "kunCompactionSummaryInputBytes": "Байт на входе сводки", + "kunStreamIdleTimeout": "Тайм-аут простоя потока (мс)", + "kunStreamIdleTimeoutDesc": "Завершить шаг, если модель не шлёт данные указанное число мс. Увеличьте для локальных LLM-серверов, молчащих при предзагрузке промпта; 0 отключает лимит. По умолчанию 45000.", + "kunToolStorm": "Защита от повторяющихся вызовов инструментов", + "kunToolStormDesc": "Когда модель повторяет один и тот же вызов инструмента в одном шаге, подавить дубликат и попросить её сменить подход.", + "kunToolStormLimits": "Обнаружение повторов", + "kunToolStormLimitsDesc": "Большее окно отслеживает больше недавних вызовов. Меньший порог подавляет повторы быстрее.", + "kunToolStormWindowSize": "Окно наблюдения", + "kunToolStormThreshold": "Порог повтора", + "kunToolOutputLimits": "Лимиты вывода инструментов", + "kunToolOutputLimitsDesc": "Ограничивает видимый модели вывод от read и shell-инструментов. Увеличьте для просмотра больших файлов или вывода команд.", + "kunToolOutputMaxLines": "Макс. строк", + "kunToolOutputMaxBytes": "Макс. байт", + "kunToolArgumentRepair": "Макс. длина строки аргумента", + "kunToolArgumentRepairDesc": "Строковые аргументы длиннее этого лимита обрезаются перед выполнением, предотвращая аномально большие аргументы.", + "port": "Порт локального сервиса", + "portDesc": "Порт, используемый локальным AI-ассистентом. Большинству пользователей не нужно его менять.", + "portInvalid": "Порт должен быть от 10000 до 65535.", + "runtimeToken": "Локальный токен доступа (опционально)", + "runtimeTokenDesc": "Защищает сервис ассистента на этом компьютере. Kun генерирует его автоматически; заполните только если другой программе нужен фиксированный токен.", + "configFilePath": "Путь к конфигу инструментов", + "configFilePathDesc": "Путь к JSON-конфигу MCP-серверов.", + "skillsLocation": "Папка сохранения навыков", + "skillsLocationDesc": "Выберите папку, которую Плагины > Навыки читают по умолчанию.", + "skillsPath": "Текущий путь", + "skillsPathDesc": "Эта страница управляет только расположением папок. Используйте Плагины > Навыки для создания или редактирования навыков.", + "skillsDetectedDirs": "Директории навыков", + "skillsDetectedDirsDesc": "Автоопределённые папки .agents / .claude / .codex / skills (рабочая директория + глобальные) плюс ваши дополнительные папки.", + "skillsDetectedDirsEmpty": "Директории навыков не обнаружены. Укажите рабочую директорию или добавьте папку.", + "skillsScopeProject": "Рабочая директория", + "skillsScopeGlobal": "Глобальные", + "skillsDirNotFound": "Не найдено", + "skillsDirSkillCount": "{{count}} навыков", + "skillsPermissionSources": "Источники разрешений навыков", + "skillsPermissionSourcesDesc": "Предпросмотр источников навыков перед их экспонированием в рантайм.", + "skillsPermissionEnabledRoots": "Включенные корни", + "skillsPermissionDisabledRoots": "Отключенные корни", + "skillsPermissionWorkspaceRoots": "Корни рабочей директории", + "skillsPermissionGlobalRoots": "Глобальные корни", + "skillsPermissionDisabledIds": "Заблокированные навыки", + "skillsPermissionRuntimeNote": "Только включенные корни попадают в конфиг runtime.", + "skillsScanDirs": "Дополнительные папки навыков", + "skillsScanDirsDesc": "Один путь на строку. Телефонные подключения также могут их использовать.", + "skillsActions": "Управление навыками", + "skillsActionsDesc": "Создавайте, устанавливайте и редактируйте навыки в Плагины > Навыки.", + "skillsOpenRoot": "Открыть папку", + "skillsOpenPlugins": "Открыть Плагины", + "skillsRootUnavailable": "Папка недоступна. Выберите другой вариант.", + "mcpSearchEnabled": "Умный выбор инструментов", + "mcpSearchEnabledDesc": "При множестве внешних инструментов давайте модели только самые релевантные.", + "mcpAdvanced": "Расширенные настройки внешних инструментов", + "mcpAdvancedDesc": "Режим выбора, количество кандидатов, конфигурация.", + "mcpSearchMode": "Метод выбора инструментов", + "mcpSearchModeDesc": "Auto фильтрует при большом количестве; Always filter ищет всегда; Direct даёт все.", + "mcpSearchModeAuto": "Авто (рекомендуется)", + "mcpSearchModeSearch": "Всегда фильтровать", + "mcpSearchModeDirect": "Напрямую (все инструменты)", + "mcpSearchLimits": "Параметры фильтрации", + "mcpSearchLimitsDesc": "Сколько инструментов включает фильтрацию и сколько кандидатов предлагается.", + "mcpSearchAutoThreshold": "Начать фильтрацию после N инструментов", + "mcpSearchTopKDefault": "Кандидатов по умолчанию", + "mcpSearchTopKMax": "Макс. кандидатов", + "mcpSearchMinScore": "Мин. совпадение", + "mcpSearchDiagnostics": "Статус выбора инструментов", + "mcpSearchDiagnosticsDesc": "Проверьте, активна ли фильтрация и сколько инструментов доступно.", + "mcpSearchStatus": "Статус", + "mcpSearchActive": "активен", + "mcpSearchInactive": "неактивен", + "mcpSearchIndexed": "Индексированные инструменты", + "mcpSearchAdvertised": "Предложено модели", + "mcpPermissionSources": "Источники разрешений внешних инструментов", + "mcpPermissionSourcesDesc": "Предпросмотр области MCP-серверов и полей с секретами.", + "mcpPermissionEnabledServers": "Включённые серверы", + "mcpPermissionDisabledServers": "Отключённые серверы", + "mcpPermissionUserServers": "Все рабочие директории", + "mcpPermissionWorkspaceServers": "Только текущая", + "mcpPermissionVisibleServers": "Только видимые", + "mcpPermissionLocalServers": "Локальные команды", + "mcpPermissionRemoteServers": "HTTP/SSE серверы", + "mcpPermissionEnvServers": "Использует env", + "mcpPermissionHeaderServers": "Использует заголовки", + "mcpPermissionParseError": "Предпросмотр недоступен до исправления MCP JSON.", + "mcpPermissionRuntimeNote": "Секреты скрыты. Доступ runtime следует настройкам доверия.", + "mcpPathDesc": "Путь к конфигурационному файлу MCP.", + "mcpEditor": "Конфигурация MCP", + "mcpEditorDesc": "Добавьте MCP-серверы: Local command (stdio), HTTP или SSE.", + "mcpFormEmpty": "Внешних инструментов пока нет. Добавьте сервер MCP.", + "mcpFormAddServer": "Добавить сервер", + "mcpFormEditJson": "Редактировать как JSON", + "mcpFormBackToForm": "Назад к форме", + "mcpFormInvalidJson": "Не удалось разобрать конфиг. Исправьте JSON ниже. ({{error}})", + "mcpFormName": "Имя", + "mcpFormNamePlaceholder": "my-tool", + "mcpFormTransport": "Тип подключения", + "mcpFormTransportStdio": "Локальная команда (stdio)", + "mcpFormTransportHttp": "HTTP", + "mcpFormTransportSse": "SSE", + "mcpFormEnabled": "Включено", + "mcpFormRemoveServer": "Удалить сервер", + "mcpFormCommand": "Команда", + "mcpFormCwd": "Рабочая директория", + "mcpFormCwdPlaceholder": "/Users/me/project", + "mcpFormCwdHint": "Опционально. Если пусто, сервер запускается в первой доверенной директории.", + "mcpFormArgs": "Аргументы (один на строку)", + "mcpFormArgsPlaceholder": "-y\nsome-mcp-package", + "mcpFormEnv": "Переменные окружения", + "mcpFormAddEnv": "Добавить переменную", + "mcpFormEnvKey": "ИМЯ", + "mcpFormEnvValue": "значение", + "mcpFormUrl": "URL сервера", + "mcpFormHeaders": "Заголовки запроса", + "mcpFormAddHeader": "Добавить заголовок", + "mcpFormHeaderKey": "Заголовок", + "mcpFormHeaderValue": "значение", + "mcpFormTrustScope": "Область доверия", + "mcpFormTrustScopeUser": "Все рабочие директории", + "mcpFormTrustScopeWorkspace": "Конкретные директории", + "mcpFormTimeout": "Тайм-аут (мс)", + "mcpFormVisibleRoots": "Видимые пути (один на строку)", + "mcpFormVisibleRootsPlaceholder": "/Users/me/project", + "mcpFormVisibleRootsHint": "Опционально. Оставьте пустым для показа во всех директориях.", + "mcpFormTrustedRoots": "Доверенные пути (один на строку)", + "mcpFormTrustedRootsPlaceholder": "/Users/me/project", + "mcpFormErrorNameRequired": "Имя обязательно.", + "mcpFormErrorNameDuplicate": "Имена должны быть уникальными.", + "mcpFormErrorCommandRequired": "Команда обязательна для локального сервера (stdio).", + "mcpFormErrorUrlRequired": "URL обязателен для HTTP или SSE сервера.", + "mcpFormErrorUrlInvalid": "URL должен начинаться с http:// или https://.", + "mcpFormErrorWorkspaceRoots": "Добавьте хотя бы один путь или измените область доверия.", + "mcpFileStatusReady": "Текущее содержание загружено из конфигурационного файла.", + "mcpFileStatusMissing": "Конфигурационный файл ещё не существует. Будет создан при первом сохранении.", + "mcpActions": "Действия с инструментами", + "mcpRuntimeHint": "Если изменения не вступили в силу, перезапустите сервис ассистента.", + "mcpSave": "Сохранить конфиг", + "mcpReload": "Перезагрузить", + "mcpOpenDir": "Открыть папку конфига", + "mcpSaved": "Сохранено в {{path}}", + "apiKey": "API-ключ DeepSeek", + "apiKeyDesc": "Обязательно. Чаты, письмо и телефон используют его по умолчанию.", + "apiKeySharedDesc": "Обязательно. Чаты, письмо и телефон используют его по умолчанию.", + "baseUrl": "URL сервиса (опционально)", + "baseUrlDesc": "Endpoint сервиса по умолчанию. Оставьте пустым для официального DeepSeek.", + "baseUrlSharedDesc": "Endpoint сервиса по умолчанию. Оставьте пустым для официального DeepSeek.", + "baseUrlPlaceholder": "например https://api.deepseek.com", + "proxyUrl": "Прокси для запросов модели", + "proxyUrlDesc": "Направляет HTTP-запросы к сервису модели через прокси. Поддерживаются http, https, socks, socks4, socks5.", + "proxyEnabled": "Использовать прокси", + "proxyUrlPlaceholder": "например http://127.0.0.1:7890", + "showSecret": "Показать значение", + "hideSecret": "Скрыть значение", + "firstRunBadge": "Первоначальная настройка", + "firstRunPreviewBadge": "Предпросмотр гайда", + "firstRunTitle": "Настройте основное перед началом работы.", + "firstRunSubtitle": "Выберите язык и провайдера модели, затем добавьте API-ключ.", + "firstRunProviderLabel": "Провайдер модели", + "firstRunProviderDeepseekDesc": "серия deepseek-v4", + "firstRunProviderXiaomiDesc": "серия MiMo", + "firstRunProviderMinimaxDesc": "серия M", + "firstRunCapabilityChat": "Чат", + "firstRunCapabilitySpeech": "Распознавание речи", + "firstRunCapabilityImage": "Генерация изображений", + "firstRunModeLabel": "Режим доступа", + "firstRunModeApi": "Оплата по мере использования", + "firstRunModeTokenPlan": "Token Plan", + "firstRunPermissionLabel": "Разрешения агента по умолчанию", + "firstRunPermissionFullAccessRisk": "«Полный доступ» позволяет агенту запускать инструменты без подтверждения. Выбирайте только при полном доверии к задаче.", + "firstRunRegionLabel": "Регион тарифа", + "firstRunRegion_cn": "Китай", + "firstRunRegion_global": "Глобальный", + "firstRunRegion_sgp": "Сингапур", + "firstRunRegion_ams": "Европа", + "firstRunApiKeyLabel": "API-ключ {{provider}}", + "firstRunGetKeyAction": "Получить ключ", + "firstRunKeyHintXiaomiApi": "Создайте API-ключ (sk-) в консоли Xiaomi MiMo.", + "firstRunKeyHintXiaomiTokenPlan": "Получите ключ Token Plan (tp-) на странице подписки Xiaomi.", + "firstRunKeyHintMinimaxApi": "Получите API-ключ на странице ключей интерфейса MiniMax.", + "firstRunKeyHintMinimaxTokenPlan": "Получите ключ подписки в управлении Token Plan MiniMax.", + "firstRunAutoWireSpeech": "Голосовой ввод будет включён после сохранения.", + "firstRunAutoWireImage": "Генерация изображений будет включена после сохранения.", + "firstRunTokenPlanNoSpeech": "Распознавание речи работает только с pay-as-you-go ключами.", + "firstRunTokenPlanNoImage": "Token Plan не настроен для генерации изображений.", + "firstRunClose": "Закрыть", + "firstRunSave": "Сохранить и продолжить", + "firstRunSaving": "Сохранение…", + "firstRunChangeLater": "Вы можете изменить эти настройки позже в разделе «Настройки».", + "firstRunPreviewHint": "Это повторяет первый запуск; предпросмотр темы восстанавливается при закрытии.", + "firstRunBuyApiHint": "Нет API-ключа? Посетите официальный сайт DeepSeek.", + "firstRunBuyApiAction": "Купить доступ к API", + "firstRunApiKeyValidation": "Пожалуйста, введите API-ключ {{provider}} перед продолжением.", + "autoStart": "Автозапуск сервиса", + "autoStartDesc": "Рекомендуется. Приложение запускает сервис при необходимости.", + "corsOrigins": "Дополнительные CORS-источники", + "corsOriginsDesc": "Дополнительные разрешённые значения Origin для локального HTTP-сервера.", + "toolPermissionMode": "Режим разрешений инструментов", + "toolPermissionModeDesc": "Управление подтверждением инструментов и локальными разрешениями.", + "toolPermissionAlwaysAsk": "Всегда спрашивать", + "toolPermissionAlwaysAskDesc": "Каждый вызов инструмента требует подтверждения. Безопасно, но прерывает работу.", + "toolPermissionReadOnly": "Только чтение", + "toolPermissionReadOnlyDesc": "Инструменты чтения работают автоматически; запись и команды спрашивают.", + "toolPermissionSensitiveAsk": "Спрашивать при чувствительных операциях", + "toolPermissionSensitiveAskDesc": "Обычное чтение — автоматически; чувствительное — с подтверждением.", + "toolPermissionWorkspaceWrite": "Спрашивать при записи в проект", + "toolPermissionWorkspaceWriteDesc": "Изменения файлов в проекте — с подтверждением; вне проекта — заблокированы.", + "toolPermissionTrustedWorkspace": "Доверенный проект", + "toolPermissionTrustedWorkspaceDesc": "Изменения в проекте — без подтверждения; вне проекта и команды — заблокированы.", + "toolPermissionBypass": "Полный доступ", + "toolPermissionBypassDesc": "Никогда не спрашивать, полный доступ. Только для доверенных задач.", + "permissionsBehaviorHint": "Always ask: запрос перед каждым вызовом. Read only: чтение автоматически, остальное с запросом. Sensitive: чтение авто, чувствительное с запросом. Workspace write: запись в проект с запросом. Trusted: запись в проект без запроса. Full access: полный доступ без запросов.", + "designQualityTitle": "Качество дизайна", + "designQualityHint": "После записи/правки фронтенд-файлов Kun автоматически сканирует на признаки AI-дизайна и возвращает замечания модели.", + "designQualityEnable": "Включить самопроверку дизайна", + "designQualityEnableDesc": "Включено по умолчанию. При выключении проверка не выполняется.", + "designQualityStrictness": "Строгость", + "designQualityStrictnessDesc": "Relaxed: только AI-признаки. Standard: признаки + общие проблемы. Strict: добавляет эвристики.", + "designQualityStrictnessRelaxed": "Мягкая", + "designQualityStrictnessStandard": "Стандартная", + "designQualityStrictnessStrict": "Строгая", + "computerUseTitle": "Управление компьютером (экран)", + "computerUseHint": "Позволяет агенту видеть экран и управлять мышью/клавиатурой. Включайте только при намерении следить за ним.", + "computerUseModelQualityTitle": "Замечание о качестве моделей", + "computerUseModelQualityBody": "Китайские мультимодальные модели (MiniMax, Qwen-VL, Kimi, GLM) пока плохо справляются со скриншотами и многошаговым управлением. Для реального использования предпочитайте Claude (Sonnet/Opus vision) или GPT.", + "computerUseEnable": "Включить управление компьютером", + "computerUseEnableDesc": "Регистрирует инструмент computer_use для скриншотов и управления мышью и клавиатурой.", + "computerUseMode": "Доступность", + "computerUseModeDesc": "Auto — только для моделей со зрением; Always — для всех; Off — скрыт.", + "computerUseModeAuto": "Авто (только vision-модели)", + "computerUseModeAlways": "Всегда", + "computerUseModeOff": "Выкл", + "computerUsePermissions": "Системные разрешения", + "computerUsePermissionsDesc": "macOS требует Accessibility (мышь/клавиатура) и Screen Recording (скриншоты).", + "computerUseAccessibility": "Accessibility", + "computerUseScreenRecording": "Screen Recording", + "computerUseGrantAccessibility": "Предоставить Accessibility", + "computerUseGrantScreenRecording": "Открыть настройки Screen Recording", + "computerUseRecheck": "Проверить снова", + "computerUsePermission_granted": "предоставлено", + "computerUsePermission_denied": "не предоставлено", + "computerUsePermission_unknown": "неизвестно", + "computerUsePermissionNeedsRestart": "предоставлено — перезапустите для применения", + "computerUseRestartHint": "Accessibility включена в Системных настройках, но macOS применяет изменения только после перезапуска приложения.", + "autoApplyHint": "Изменения применяются автоматически", + "applying": "Применение…", + "applied": "Применено", + "applyFailed": "Не удалось применить", + "retrySave": "Повторить", + "autoApplyBlocked": "Исправьте порт для применения изменений", + "workspaceRoot": "Рабочая директория по умолчанию", + "workspaceRootDesc": "При первом запуске используется ~/.kun/default_workspace. Можно изменить.", + "workspaceRootPlaceholder": "~/.kun/default_workspace", + "conversationWorkspaceRoot": "Рабочая директория для бесед", + "conversationWorkspaceRootDesc": "Беседы без привязки к проекту создают подпапку с датой в этой директории.", + "conversationWorkspaceRootPlaceholder": "~/Documents/Kun", + "restoreConversationWorkspaceDefault": "Восстановить по умолчанию", + "writeWorkspaceRoot": "Рабочая директория письма", + "writeWorkspaceRootDesc": "Режим «Письмо» читает Markdown-файлы отсюда. При первом запуске создаётся welcome.md.", + "writeWorkspaceRootPlaceholder": "~/.kun/write_workspace", + "writeAutoSave": "Автосохранение", + "writeAutoSaveDesc": "Файлы автоматически сохраняются после паузы в редактировании. Выключите для ручного сохранения.", + "writeAutoSaveDelay": "Задержка автосохранения", + "writeAutoSaveDelayDesc": "Сохранять через N секунд после остановки редактирования ({{min}}с–{{max}}мин).", + "writeTypography": "Типографика и шрифт", + "writeFontPreset": "Шрифт редактора", + "writeFontPresetDesc": "Шрифт для поверхности письма — выберите комфортный для длинных текстов.", + "writeFontSystem": "Системный", + "writeFontSourceHanSans": "Source Han Sans", + "writeFontYahei": "Microsoft YaHei", + "writeFontPingfang": "PingFang SC", + "writeFontSimhei": "SimHei", + "writeFontSimsun": "SimSun (с засечками)", + "writeFontKaiti": "KaiTi (с засечками)", + "writeFontCustom": "Свой…", + "writeFontCustomPlaceholder": "CSS font-family, например «LXGW WenKai», serif", + "writeFontSize": "Размер шрифта", + "writeFontSizeDesc": "Размер текста ({{min}}–{{max}}px). Для редактора и предпросмотра.", + "writeLineHeight": "Межстрочный интервал", + "writeLineHeightDesc": "Большие значения добавляют воздух между строк.", + "writeTypographyReset": "Сбросить типографику", + "writeTypographyResetDesc": "Вернуть шрифт, размер и интервал по умолчанию.", + "writeTypographyResetButton": "Сбросить", + "writeAgentPresets": "Пользовательские промпты агентов письма", + "writeAgentPresetsDesc": "Настройка агентов для длинных текстов. Каждый агент — промпт поведения (сюжетный координатор, редактор, проверка целостности и т.д.).", + "writeAgentPresetAdd": "Добавить агента", + "writeAgentPresetRemove": "Удалить", + "writeAgentPresetNamePlaceholder": "Назовите агента", + "writeAgentPersonaPlaceholder": "Опишите личность, роль и правила поведения агента…", + "writeInlineCompletion": "Подсказки при письме", + "writeInlineCompletionEnabled": "Показывать подсказки после паузы", + "writeInlineCompletionEnabledDesc": "Серые подсказки продолжения в Markdown-редакторе. Tab — принять.", + "writeInlineCompletionRetrieval": "Ссылаться на другие документы", + "writeInlineCompletionRetrievalDesc": "Перед подсказкой быстро сверяться с Markdown-файлами для согласованности терминов.", + "writeInlineCompletionProvider": "Провайдер подсказок", + "writeInlineCompletionProviderDesc": "Оставьте наследование, чтобы использовать провайдера ассистента.", + "writeInlineCompletionProviderInherit": "Наследовать от ассистента ({{value}})", + "writeInlineCompletionProviderInherited": "Сейчас наследуется: {{value}}", + "writeInlineCompletionProviderOverride": "Сейчас используется: {{value}}", + "writeInlineCompletionBaseUrl": "URL сервиса подсказок", + "writeInlineCompletionBaseUrlDesc": "По умолчанию используется общий URL. Заполните, если письму нужен другой сервис.", + "writeInlineCompletionBaseUrlInherited": "Сейчас используется общий URL: {{value}}", + "writeInlineCompletionBaseUrlOverride": "Сейчас используется отдельный URL: {{value}}", + "writeInlineCompletionApiKey": "API-ключ для письма", + "writeInlineCompletionApiKeyDesc": "Опционально. Оставьте пустым для наследования общего ключа.", + "writeInlineCompletionApiKeyPlaceholder": "Оставьте пустым для наследования", + "writeInlineCompletionApiKeyInherited": "Сейчас наследуется общий API-ключ.", + "writeInlineCompletionApiKeyMissing": "Общий API-ключ ещё не настроен.", + "writeInlineCompletionApiKeyOverride": "Сейчас используется отдельный API-ключ.", + "writeInlineCompletionModel": "Модель подсказок", + "writeInlineCompletionModelDesc": "Оставьте пустым для использования модели ассистента.", + "writeInlineCompletionModelPlaceholder": "Оставьте пустым для модели ассистента", + "writeInlineCompletionModelInherited": "Сейчас используется модель ассистента: {{value}}", + "writeInlineCompletionModelOverride": "Сейчас используется отдельная модель: {{value}}", + "writeInlineCompletionModelPro": "Подсказки · Pro", + "writeInlineCompletionModelFlash": "Подсказки · Flash", + "writeInlineCompletionModelCurrent": "Текущая: {{model}}", + "writeInlineCompletionDebounce": "Скорость подсказок", + "writeInlineCompletionDebounceDesc": "Задержка после остановки набора до показа подсказки. Меньше = быстрее, больше = тише.", + "writeInlineCompletionDelayFast": "Быстро · 300 мс", + "writeInlineCompletionDelayBalanced": "Сбалансировано · 650 мс", + "writeInlineCompletionDelayCalm": "Спокойно · 1000 мс", + "writeInlineCompletionDelaySlow": "Тихо · 1500 мс", + "writeInlineCompletionThreshold": "Частота подсказок", + "writeInlineCompletionThresholdDesc": "Строгие настройки — меньше, но стабильнее подсказок.", + "writeInlineCompletionThresholdCreative": "Активно · больше подсказок", + "writeInlineCompletionThresholdBalanced": "Сбалансировано · рекомендуется", + "writeInlineCompletionThresholdStrict": "Строго · меньше отвлечений", + "writeInlineCompletionThresholdVeryStrict": "Очень строго · только уверенные", + "writeInlineCompletionMaxTokens": "Макс. длина короткой подсказки", + "writeInlineCompletionMaxTokensDesc": "Больше = длиннее подсказки. Держите короткими для естественного продолжения.", + "writeInlineLongCompletion": "Подсказки для абзацев", + "writeInlineLongCompletionDesc": "При долгой паузе на конце строки показывать полноценное предложение или абзац.", + "writeInlineLongCompletionMaxTokens": "Макс. длина длинной подсказки", + "writeInlineLongCompletionMaxTokensDesc": "Лучше всего на один абзац продолжения.", + "writeInlineCompletionApiNote": "Эти настройки влияют только на авто-подсказки в режиме «Письмо». Tab — принять, Esc — скрыть.", + "writeDebugLogTitle": "Логи подсказок", + "writeDebugLogOpen": "Посмотреть последние вызовы", + "writeDebugLogDesc": "Просмотр запросов и ответов подсказок для диагностики.", + "writeDebugLogOpenButton": "Посмотреть логи", + "writeDebugLogModalDesc": "Инспекция контекста, сырых ответов модели и распарсенного вывода.", + "close": "Закрыть", + "writeInlineEditDebugTitle": "Отладка правки текста", + "writeInlineEditDebugDesc": "Просмотр последних вызовов правки: что отправлялось модели, сырой ответ и распарсенное действие.", + "writeInlineEditDebugRefresh": "Обновить", + "writeInlineEditDebugClear": "Очистить", + "writeInlineEditDebugEmpty": "Вызовов правки пока нет. Запустите AI Edit на выделении.", + "writeInlineEditDebugOk": "OK", + "writeInlineEditDebugFailed": "Ошибка", + "writeInlineEditDebugNoInstruction": "Нет инструкции", + "writeInlineEditDebugModel": "Модель", + "writeInlineEditDebugContext": "Контекст", + "writeInlineEditDebugContextCounts": "{{references}} RAG-фрагментов / {{edits}} последних правок", + "writeInlineEditDebugFile": "Файл", + "writeInlineEditDebugOriginal": "Исходный объём правки", + "writeInlineEditDebugPrompt": "Отправлено модели", + "writeInlineEditDebugSuffix": "Текст после курсора", + "writeInlineEditDebugReplacement": "Распарсенная замена", + "writeInlineEditDebugRawResponse": "Сырой ответ модели", + "writeCompletionDebugEmpty": "Вызовов подсказок пока нет. Запустите подсказку в режиме «Письмо».", + "writeCompletionDebugContextCounts": "{{references}} RAG-фрагментов / {{edits}} последних правок", + "writeCompletionDebugCompletion": "Распарсенный вывод", + "writeApiKey": "API-ключ DeepSeek", + "writeApiKeyDesc": "Подсказки и ассистент письма наследуют общий ключ, если не задан отдельный.", + "restoreWorkspaceDefault": "Восстановить по умолчанию", + "browse": "Обзор", + "apiKeyRequiredTitle": "Требуется API-ключ", + "apiKeyRequiredBody": "Сначала добавьте API-ключ в разделе «Провайдеры». После этого приложение запустит локальный сервис.", + "guiUpdate": "Обновления GUI", + "guiUpdateChannel": "Канал обновлений", + "guiUpdateChannelDesc": "Stable — стабильные релизы. Frontier — только после переключения.", + "guiUpdateChannelFrontier": "Frontier", + "guiUpdateChannelStable": "Stable", + "guiUpdateNotConfiguredTitle": "Не удалось проверить обновления", + "guiUpdateDesc": "Проверить канал обновлений и установить новую версию.", + "guiUpdateChecking": "Проверка обновлений…", + "guiUpdateCheckFailed": "Не удалось проверить обновления", + "guiUpdateErrNotConfigured": "Проверка обновлений сейчас недоступна.", + "guiUpdateErrUnsupported": "Эта сборка не поддерживает автообновление. Установите вручную.", + "guiUpdateErrDownloadFailed": "Не удалось загрузить обновление: {{message}}", + "guiUpdateErrInstallFailed": "Не удалось установить обновление: {{message}}", + "guiUpdateErrRepoNotFound": "Источник обновлений «{{repo}}» не найден на GitHub.", + "guiUpdateErrForbidden": "Не удалось получить информацию об обновлении.", + "guiUpdateErrRateLimit": "Слишком много запросов. Попробуйте позже.", + "guiUpdateErrNoStableVersion": "Стабильного релиза или тега ещё нет. Репозиторий: {{repo}}.", + "guiUpdateCurrent": "Актуальная версия: {{version}}", + "guiUpdateAvailable": "Доступна новая версия: {{current}} → {{latest}}", + "guiUpdateAvailableManual": "Доступна новая версия: {{current}} → {{latest}}. Скачайте вручную.", + "guiUpdateDownloading": "Загрузка обновления… {{percent}}%", + "guiUpdateDownloadProgress": "{{transferred}} / {{total}}, {{speed}}/с", + "guiUpdateDownloaded": "Обновление {{version}} загружено", + "guiUpdateDownloadedDesc": "Перезапустите приложение для установки.", + "guiUpdateInstalling": "Перезапуск для установки…", + "guiUpdateCheck": "Проверить обновления", + "guiUpdateDownload": "Загрузить обновление", + "guiUpdateInstall": "Перезапустить и установить", + "guiUpdateOpenRelease": "Открыть страницу загрузки", + "settingsFooter": "Настройки хранятся локально.", + "logTitle": "Локальный журнал ошибок", + "logDir": "Папка логов", + "logDirDesc": "Логи приложения и локального сервиса пишутся в ежедневные файлы в этой папке.", + "logDirOpen": "Открыть папку", + "logEnabled": "Включить журнал ошибок", + "logEnabledDesc": "Записывать ошибки вызовов инструментов, сбои запросов и вывод сервиса в лог-файлы.", + "logRetention": "Хранение", + "logRetentionDesc": "Удалять файлы логов старше указанного количества дней.", + "logRetentionOne": "1 день", + "logRetentionTwo": "2 дня", + "logRetentionThree": "3 дня", + "logRetentionFive": "5 дней", + "logRetentionSeven": "7 дней", + "gitCheckpointTitle": "Управление Git-точками восстановления", + "checkpointCleanupEnabled": "Автоматически удалять неиспользуемые точки", + "checkpointCleanupEnabledDesc": "Периодически удалять каталоги точек, на которые не ссылается ни один чат.", + "checkpointCleanupInterval": "Очистка неиспользуемых точек", + "checkpointCleanupIntervalDesc": "Удалять каталоги точек, не используемые ни одним чатом.", + "checkpointCleanupInterval1": "Каждый 1 день", + "checkpointCleanupInterval2": "Каждые 2 дня", + "checkpointCleanupInterval3": "Каждые 3 дня", + "checkpointCleanupInterval5": "Каждые 5 дней", + "checkpointCleanupInterval10": "Каждые 10 дней", + "checkpointDirectory": "Папка хранения точек", + "checkpointDirectoryDesc": "Своё расположение для точек (укажите другой диск, чтобы не забивать системный).", + "checkpointDirectoryPlaceholder": "например D:\\kun-checkpoints или ~/kun-checkpoints", + "checkpointMaxPerThread": "Макс. точек на чат", + "checkpointMaxPerThreadDesc": "Хранить не более N точек на чат. По умолчанию 5.", + "loading": "Загрузка", + "loadFailed": "Не удалось загрузить настройки: {{message}}", + "preloadBridgeError": "Мост приложения недоступен. Перезапустите приложение или проверьте путь preload.", + "uiModeWorkshopTitle": "Маскоты", + "uiModeWorkshopDesc": "Выберите набор маскотов. Встроенный iKun — пример UI-плагина.", + "uiModeDefaultTitle": "Обычный Kun", + "uiModeDefaultSubtitle": "Маленькая синяя птица", + "uiPaletteRetromaOn": "Retroma палитра включена — нажмите для обычной", + "uiPaletteRetromaOff": "Переключить на Retroma палитру", + "uiPluginInstall": "Установить папку плагина…", + "uiPluginActivate": "Использовать", + "uiPluginActive": "Активен", + "uiPluginRemove": "Удалить плагин", + "uiPluginEmpty": "Нет установленных плагинов. Встроенный iKun мог быть удалён.", + "uiPluginInstallFailed": "Установка не удалась", + "uiPluginDocsHint": "Руководство: docs/UI_PLUGINS.md", + "worktree": "Worktrees", + "sectionWorktree": "Git Worktrees", + "gitBranchPrefix": "Префикс веток", + "gitBranchPrefixDesc": "Префикс для имён веток из picker. Оставьте пустым для точного имени.", + "worktreeOverview": "Worktrees", + "worktreeOverviewDesc": "Просмотр Git worktrees из бесед и очистка ненужных.", + "worktreeMainBranch": "Основная ветка", + "worktreeInUse": "Используется", + "worktreePoolDir": "Папка хранения worktrees", + "worktreeRefresh": "Обновить", + "worktreePool": "Пул", + "worktreeBusy": "Занято", + "worktreeIdle": "Свободно", + "worktreeEmpty": "Пусто", + "worktreeNotCreated": "Ещё не создано", + "worktreeUncommitted": "не сохранено", + "worktreeCreate": "Создать", + "worktreeRelease": "Освободить", + "worktreeRemove": "Удалить", + "worktreeEmptyList": "Worktrees для текущего проекта пока нет.", + "worktreeConversation": "Беседа", + "worktreeCreatedAt": "Создано", + "worktreeNoConversation": "Не привязано", + "worktreeMergeTitle": "Слить в main", + "worktreeSyncTitle": "Синхронизировать из main (rebase)", + "worktreeCleanupAll": "Очистить всё", + "worktreeForceConfirm": "У worktree {{count}} несохранённых изменений. Сброс удалит их. Продолжить?", + "worktreeNotGitRepo": "Текущая директория не является Git-репозиторием.", + "memory": "Память", + "sectionMemory": "Долгосрочная память", + "memoryOverview": "Обзор", + "memoryOverviewDesc": "Записи памяти сохраняют факты и предпочтения между сессиями. Они автоматически встраиваются в контекст ассистента.", + "memoryActiveCount": "Активных", + "memoryTombstoneCount": "Удалённых", + "memoryEnabled": "Состояние", + "memoryOn": "Вкл", + "memoryOff": "Выкл", + "memoryRecords": "Записи памяти", + "memoryRecordsDesc": "Создавайте, редактируйте, отключайте или удаляйте записи памяти.", + "memoryImport": "Импорт", + "memoryExport": "Экспорт", + "memoryExported": "Файл памяти экспортирован.", + "memoryExportUnavailable": "Экспорт недоступен в этом окружении.", + "memoryImportTitle": "Импорт в Kun", + "memoryImportStepPrompt": "Скопируйте этот промпт в другой чат с ИИ", + "memoryImportCopy": "Копировать", + "memoryImportCopied": "Скопировано", + "memoryImportStepPaste": "Вставьте результат ниже для добавления в память Kun", + "memoryImportPastePlaceholder": "Вставьте данные памяти", + "memoryImportTargetPathPlaceholder": "Абсолютный путь к директории проекта", + "memoryImportUserScopeHint": "Пользовательские записи доступны во всех проектах.", + "memoryImportTargetRequired": "Выберите путь проекта перед импортом.", + "memoryImportParsedPrefix": "Будет импортировано ", + "memoryImportParsedSuffix": " записей(и)", + "memoryImportMorePrefix": "Ещё ", + "memoryImportMoreSuffix": "", + "memoryImportAdd": "Добавить в память", + "memoryImporting": "Добавление…", + "memoryImportedPrefix": "Импортировано ", + "memoryImportedSuffix": " записей(и) памяти.", + "memoryImportPartialPrefix": "Импортировано ", + "memoryImportPartialMiddle": ", не удалось ", + "memoryImportPartialSuffix": ". Проверьте ошибку runtime.", + "memoryImportSkippedPrefix": "Пропущено ", + "memoryImportSkippedSuffix": " дубликатов(а).", + "memoryImportAllDuplicate": "Новых записей нет — все уже существуют.", + "memoryCreate": "Новая", + "memoryCreateTitle": "Создать запись памяти", + "memoryEditTitle": "Редактировать запись", + "memoryEdit": "Редактировать", + "memoryDetails": "Подробности", + "memoryClose": "Закрыть", + "memoryDisable": "Отключить", + "memoryRestore": "Восстановить", + "memoryDelete": "Удалить", + "memoryDisabled": "отключено", + "memorySave": "Сохранить", + "memorySaveFailed": "Не удалось сохранить. Проверьте, включена ли память.", + "memoryCancel": "Отмена", + "memoryEmpty": "Записей памяти пока нет. Ассистент создаст их автоматически.", + "memoryContentPlaceholder": "Что должен помнить ассистент? Например: «Предпочитать TypeScript с отступами 2 пробела.»", + "memoryTargetPathPlaceholder": "Абсолютный путь к директории проекта", + "memoryTagsPlaceholder": "Теги через запятую", + "memoryConfidence": "Уверенность", + "memoryProject": "Проект", + "memoryScope_all": "Все", + "memoryScope_user": "Пользователь", + "memoryScope_workspace": "Рабочая директория", + "memoryScope_project": "Проект", + "memoryLastInjected": "Последнее внедрение", + "memoryLastInjectedDesc": "ID записей, внедрённых в последний шаг.", + "memoryDisabledHint": "Память отключена. Включите в конфиге runtime для создания записей.", + "memoryEnable": "Включить память", + "memoryEnableDesc": "Ассистент запоминает факты между сессиями и автоматически встраивает их в контекст.", + "codexEndpointLocked": "Подписка ChatGPT использует фиксированный endpoint.", + "codexLoginButton": "Войти в ChatGPT", + "claudeLoginButton": "Войти в Claude", + "claudeEndpointLocked": "Подписка Claude использует фиксированный endpoint.", + "claudeExtraUsageNotice": "Сторонние приложения используют Extra Usage, а не лимиты тарифа.", + "codexLoginDeviceCodeFallback": "Использовать device code", + "codexBrowserOpened": "Браузер открыт. Завершите вход.", + "codexDisconnect": "Отключить", + "codexCancel": "Отмена", + "codexEnterCode": "Откройте ссылку и введите код для авторизации:", + "codexOpenBrowser": "Открыть в браузере", + "codexWaitingAuth": "Ожидание авторизации…", + "codexPreparingDeviceLogin": "Подготовка device-code входа…", + "codexLoginPortBusyFallback": "Порты 1455 и 1457 заняты, используется device-code вход.", + "memoryDiscardConfirm": "Отменить несохранённые изменения?", + "memoryDiscardConfirmDetail": "Правки будут потеряны.", + "memoryDiscardConfirmAction": "Отменить", + "memoryDiscardCancel": "Продолжить правку", + "memoryDisableConfirm": "Отключить эту запись?", + "memoryDisableConfirmDetail": "Ассистент перестанет её использовать. Можно восстановить позже.", + "memoryDeleteConfirm": "Удалить эту запись?", + "memoryDeleteConfirmDetail": "Удалённые записи убираются из списка и не могут быть восстановлены." +} \ No newline at end of file diff --git a/src/shared/app-settings-normalize.ts b/src/shared/app-settings-normalize.ts index fad4f6d2e..3e372bdb3 100644 --- a/src/shared/app-settings-normalize.ts +++ b/src/shared/app-settings-normalize.ts @@ -82,7 +82,7 @@ export function normalizeAppSettings(settings: AppSettingsV1): AppSettingsV1 { }) return { version: 1, - locale: maybeSettings.locale === 'zh' ? 'zh' : 'en', + locale: maybeSettings.locale === 'zh' ? 'zh' : maybeSettings.locale === 'ru' ? 'ru' : 'en', theme: maybeSettings.theme === 'light' || maybeSettings.theme === 'dark' || maybeSettings.theme === 'system' ? maybeSettings.theme