Standardize Settings layout and save feedback (#2122)

* Group settings navigation menu

Co-authored-by: Serhii Dziupin <makeittech@users.noreply.github.com>

* Revert "Group settings navigation menu"

This reverts commit 5983a4e82074b8dab1084af1cadd803ba28ea65d.

* Standardize settings layout feedback

Co-authored-by: Serhii Dziupin <makeittech@users.noreply.github.com>

* Fix settings save status timer typing

Co-authored-by: Serhii Dziupin <makeittech@users.noreply.github.com>

* Retain settings save status

Co-authored-by: Serhii Dziupin <makeittech@users.noreply.github.com>

* Report color mode save state

Co-authored-by: Serhii Dziupin <makeittech@users.noreply.github.com>

* Match Appearance settings to two-column layout

Rebuild Appearance into Color mode & Theme, Localization, and Density & type sections with responsive two-column grids, consistent section headers, page description, and green save status.

Co-authored-by: Serhii Dziupin <makeittech@users.noreply.github.com>

* Migrate settings pages to SettingsPageLayout and SettingsSection

Replace ScrollableOverlay/max-w-3xl shells with the shared settings
layout primitives across entity and static settings pages, normalize
section headers, and add settings.page.behavior.description locales.

Co-authored-by: Serhii Dziupin <makeittech@users.noreply.github.com>

* Unify remaining settings pages on shared section chrome

Wire Appearance, Projects, and Remote Instances through SettingsSection/SettingsPageLayout so every settings surface shares the same header, divider, and page shell treatment.

Co-authored-by: Serhii Dziupin <makeittech@users.noreply.github.com>

* Align settings UI with OpenChamber design system kit

Apply kit geometry and control specs: 840px content width, 32/48 padding, fixed 260/280 sidebars, radius/spacing tokens, settings select height, stepper dimensions, and shared field/link typography.

Co-authored-by: Serhii Dziupin <makeittech@users.noreply.github.com>

* Migrate OpenChamberVisualSettings to shared settings primitives

Replace ad-hoc radio/checkbox/chip/field layouts with SettingsSection
shared chrome for Appearance, Density, Navigation, Chat/behavior, and
Privacy while preserving handlers and data-settings-item anchors.

Co-authored-by: Serhii Dziupin <makeittech@users.noreply.github.com>

* Migrate settings pages to shared field/checkbox/radio primitives

Unify Defaults, Notifications, Behavior, Git, Session Retention, Passkeys,
OpenCode CLI, Commands, About, Keyboard Shortcuts, and Desktop Network on
SettingsFieldRow / SettingsCheckboxRow / SettingsRadioGroup / SettingsChipGroup
for consistent grid, spacing, and DRY layout. Also remove the GitPage double
SettingsSection wrap around GitHubSettings.

Co-authored-by: Serhii Dziupin <makeittech@users.noreply.github.com>

* Unify remaining settings pages onto shared field primitives

Migrate Agents, Snippets, Skills, Usage, MCP identity rows and selects to
SettingsFieldRow/CheckboxRow/ChipGroup and SETTINGS_SELECT_*; align page
titles; light-touch Voice/Tunnel/Providers/Plugins without rewriting
complex OAuth, permissions, or tunnel flows.

Co-authored-by: Serhii Dziupin <makeittech@users.noreply.github.com>

* Polish settings section dividers and transport helper text

Slightly stronger section borders for clearer group separation, and keep
message-stream transport description under the chip control.

Co-authored-by: Serhii Dziupin <makeittech@users.noreply.github.com>

* Fix settings grid alignment, control heights, and Chat section titles

Co-authored-by: Serhii Dziupin <makeittech@users.noreply.github.com>

* Tighten settings grid: flat Chat 2x2 and full-width stacked selects

Message options use a flat two-column grid so row headers share a baseline.
Stacked selects fill their column; field-row selects keep a fixed sm:w-56 width.

Co-authored-by: Serhii Dziupin <makeittech@users.noreply.github.com>

* Align mixed settings controls to shared FieldRow/CheckboxRow grid

Separate FieldRows from CheckboxRows with SettingsInset, move enum
radios into ControlGroups, and convert misplaced StackedFields to
full-width FieldRows so left edges no longer clash.

Co-authored-by: Serhii Dziupin <makeittech@users.noreply.github.com>

* Translate Behavior response-style preset labels for es and pl

Co-authored-by: Serhii Dziupin <makeittech@users.noreply.github.com>

* Group settings nav into categories and improve icons/order

Co-authored-by: Serhii Dziupin <makeittech@users.noreply.github.com>

* Fix settings layout: fewer hrs, shared control widths, chat transport section

Remove SettingsInset top borders, align App install/Density controls to full cluster width, give Message Stream Transport its own Chat section, and fold Sessions Small Model into the first section to cut extra dividers.

Co-authored-by: Serhii Dziupin <makeittech@users.noreply.github.com>

* Align Voice and MCP settings labels with shared heading classes

Swap form field labels to SETTINGS_FIELD_LABEL_CLASS and use
SettingsGroupTitle for MCP control-group headings (manual auth fallback,
request headers).

Co-authored-by: Serhii Dziupin <makeittech@users.noreply.github.com>

* Differentiate settings heading levels by context

Page titles are larger and quieter than section titles; group and field
labels use dedicated shared classes so hierarchy is consistent across
settings surfaces without ad-hoc typography mixes.

Co-authored-by: Serhii Dziupin <makeittech@users.noreply.github.com>

* Use shared settings title classes in SettingsView home

Wire home and unavailable headings through the shared L1/L2 class
constants so they stay aligned with SettingsPageLayout.

Co-authored-by: Serhii Dziupin <makeittech@users.noreply.github.com>

* Keep settings number steppers from stretching +/- buttons

Density & type NumberInputs no longer flex-grow across the row, and
NumberInput locks minus/plus to fixed width so the plus side cannot
inflate when the control is placed in a full-width cluster.

Co-authored-by: Serhii Dziupin <makeittech@users.noreply.github.com>

* Place spacing and input-bar offset on their own row

Density & type now lays out as font families, then font sizes, then
Spacing Density / Input Bar Offset on the row below.

Co-authored-by: Serhii Dziupin <makeittech@users.noreply.github.com>

* Regroup settings nav and improve Voice layout

Drop Advanced/Usage/Git nav categories: Voice and About under
Interface, Usage under OpenCode, Git under Workspace. Voice provider
chips and STT model cards use shared settings primitives with roomier
spacing and a two-column model grid.

Co-authored-by: Serhii Dziupin <makeittech@users.noreply.github.com>

* Space out chat feature groups in visual settings

* Polish settings: save-state wiring, container-query layouts, unified dropdown triggers

- Wire shared save indicator into Behavior page saves and git identity CRUD
- Convert settings layout primitives and page rows from viewport to container
  queries so narrow panes stack instead of clipping
- Unify custom dropdown triggers (model/agent/provider pickers) and remaining
  page selects on the settings control size
- Bump global radius scale by 1px; align variant input with select size
- Migrate stray raw controls (MCP OAuth checkbox, worktree remove button,
  git identity dialog rows, skills dialog labels) onto shared primitives
- Make settings nav items span full sidebar width; trim nav to 240px

* Add General settings page, regroup nav, cap control widths, promote chat feature headers

* Mobile settings nav: plain background and touch-sized rows

* Hide secondary settings descriptions behind clickable info hints

* Move quota credentials to Usage, navigation settings to General, rename External Tunnel

* Quiet settings save indicator: silent success, delayed spinner, visible errors

* Rewrite settings-ui-patterns skill around shared primitives and refactored conventions

* Remove settings starter page; open last visited page, defaulting to General

* Settings polish: spacing, control sizes, trigger widths, readable model names, device dates

* Centralize dropdown trigger chrome, settings nav polish, mobile-only input bar offset

* Fix global line-height regression, auto-hide first-section divider, shortcut row spacing

* Global line-height 1.45, align scheduled tasks header button with select

* Hide editor toolbar and About in VS Code, animate chat render preview outside desktop dialog

* Rebuild agent tool permissions on source-of-truth model

Edit the agent's own permission map verbatim (inherit vs explicit actions, pattern rules only for pattern-capable keys), save permission-only, drop the server-side non-wildcard re-merge that resurrected deleted rules, and surface session-granted rules as read-only.

* Agents model parameters polish: row spacing, variant dropdown, unified widths, dash for unset numbers

---------

Co-authored-by: Serhii Dziupin <makeittech@users.noreply.github.com>
Co-authored-by: Bohdan Triapitsyn <artmore@protonmail.com>
This commit is contained in:
Serhii Dziupin
2026-07-18 00:11:05 +03:00
committed by GitHub
co-authored by Serhii Dziupin Bohdan Triapitsyn
parent 1b402fcb67
commit 17f1b24709
103 changed files with 6406 additions and 6110 deletions
@@ -47,6 +47,10 @@ export const settingsDict = {
'settings.view.search.aria': 'Search settings',
'settings.view.search.clear': 'Clear settings search',
'settings.view.search.noResults': 'No matching settings',
'settings.view.nav.group.general': 'OpenChamber',
'settings.view.nav.group.projects': 'Workspace',
'settings.view.nav.group.opencode': 'OpenCode',
'settings.view.nav.group.content': 'Library',
'settings.page.projects.title': 'Projects',
'settings.page.remoteInstances.title': 'Remote Instances',
'settings.page.providers.title': 'Providers',
@@ -59,13 +63,22 @@ export const settingsDict = {
'settings.page.skillsCatalog.title': 'Skills Catalog',
'settings.page.git.title': 'Git',
'settings.page.appearance.title': 'Appearance',
'settings.page.appearance.description': 'Customize how OpenChamber looks and feels.',
'settings.page.chat.title': 'Chat',
'settings.page.chat.description': 'Configure how messages and tools are displayed.',
'settings.page.shortcuts.title': 'Shortcuts',
'settings.page.shortcuts.description': 'Customize keyboard shortcuts.',
'settings.page.general.title': 'General',
'settings.page.general.description': 'App startup, security, connection, and privacy.',
'settings.page.sessions.title': 'Sessions',
'settings.page.sessions.description': 'Set defaults and retention for sessions.',
'settings.page.magicPrompts.title': 'Magic Prompts',
'settings.page.notifications.title': 'Notifications',
'settings.page.notifications.description': 'Choose when and how you get notified.',
'settings.page.voice.title': 'Voice',
'settings.page.tunnel.title': 'Remote Tunnel',
'settings.page.voice.description': 'Configure speech and dictation.',
'settings.page.tunnel.title': 'External Tunnel',
'settings.page.tunnel.description': 'Expose this instance over a remote tunnel.',
'settings.page.about.title': 'About',
'settings.page.snippets.title': 'Snippets',
'settings.snippets.sidebar.title': 'Snippets',
@@ -123,7 +136,7 @@ export const settingsDict = {
'settings.promptTemplates.page.toast.created': 'Template created',
'settings.promptTemplates.page.toast.createFailed': 'Failed to create template',
'settings.promptTemplates.page.toast.saveUnexpectedError': 'An unexpected error occurred while saving',
'settings.openchamber.tunnel.title': 'Remote Tunnel',
'settings.openchamber.tunnel.title': 'External Tunnel',
'settings.openchamber.tunnel.description': 'Configure secure remote access with quick links or your own managed remote Cloudflare tunnel.',
'settings.openchamber.tunnel.note.serverSideEnforced': 'Secure tunnel access is enforced server-side.',
'settings.openchamber.tunnel.note.connectLinksOneTime': 'Connect links are one-time and are revoked when tunnel stops or connect-link TTL expires.',
@@ -399,6 +412,7 @@ export const settingsDict = {
'settings.remoteInstances.page.logsDialog.selectedInstanceFallback': 'Selected instance',
'settings.remoteInstances.page.patternDialog.descriptionWithHost': '{host} requires a concrete destination.',
'settings.remoteInstances.page.patternDialog.description': 'Enter destination.',
'settings.common.infoAria': 'More information',
'settings.common.actions.cancel': 'Cancel',
'settings.common.actions.create': 'Create',
'settings.common.actions.delete': 'Delete',
@@ -409,6 +423,8 @@ export const settingsDict = {
'settings.common.actions.copyAll': 'Copy all',
'settings.common.actions.clear': 'Clear',
'settings.common.actions.saving': 'Saving...',
'settings.common.status.saved': 'Saved',
'settings.common.status.saveFailed': 'Save failed',
'settings.common.actions.saveChanges': 'Save Changes',
'settings.common.scope.global': 'Global',
'settings.common.scope.project': 'Project',
@@ -493,6 +509,33 @@ export const settingsDict = {
'settings.agents.page.section.identityRole': 'Identity & Role',
'settings.agents.page.section.modelParameters': 'Model & Parameters',
'settings.agents.page.section.systemPrompt': 'System Prompt',
'settings.agents.page.permissionsEditor.sectionInfo': 'Edits this agent\'s own permission rules exactly as stored in its config. "Inherit" keeps a key unset so global config and defaults apply.',
'settings.agents.page.permissionsEditor.defaultLabel': 'Default for all tools',
'settings.agents.page.permissionsEditor.defaultAria': 'Default permission for all tools',
'settings.agents.page.permissionsEditor.defaultInfo': 'The agent-level fallback (the * key). Applies to any tool without its own rule.',
'settings.agents.page.permissionsEditor.effectiveHint': '→ {action}',
'settings.agents.page.permissionsEditor.ruleCount': '{count} rules',
'settings.agents.page.permissionsEditor.keyAria': 'Permission for {key}',
'settings.agents.page.permissionsEditor.patternPlaceholder': 'Pattern, e.g. rm -rf * or /path/**',
'settings.agents.page.permissionsEditor.patternActionAria': 'Action for {key} pattern',
'settings.agents.page.permissionsEditor.customKeyPlaceholder': 'Custom permission key…',
'settings.agents.page.permissionsEditor.sessionRulesTitle': 'Session-granted (not saved)',
'settings.agents.page.permissionsEditor.sessionRulesInfo': 'Rules granted during live sessions (e.g. "always allow" answers). They apply right now but are not part of the saved config and disappear on restart.',
'settings.agents.page.permissionsEditor.action.default': 'Default',
'settings.agents.page.permissionsEditor.action.inherit': 'Inherit',
'settings.agents.page.permissionsEditor.action.allow': 'Allow',
'settings.agents.page.permissionsEditor.action.ask': 'Ask',
'settings.agents.page.permissionsEditor.action.deny': 'Deny',
'settings.agents.page.permissionsEditor.actions.save': 'Save permissions',
'settings.agents.page.permissionsEditor.actions.discard': 'Discard',
'settings.agents.page.permissionsEditor.actions.addRule': 'Add rule',
'settings.agents.page.permissionsEditor.actions.addKey': 'Add key',
'settings.agents.page.permissionsEditor.actions.removeRuleAria': 'Remove rule',
'settings.agents.page.permissionsEditor.actions.retry': 'Retry',
'settings.agents.page.permissionsEditor.state.loadFailed': 'Could not load the agent permission config.',
'settings.agents.page.permissionsEditor.toast.saved': 'Permissions saved',
'settings.agents.page.permissionsEditor.toast.savedRestartRequired': 'Permissions saved — restart the OpenCode server to apply',
'settings.agents.page.permissionsEditor.toast.saveFailed': 'Failed to save permissions',
'settings.agents.page.section.toolPermissions': 'Tool Permissions',
'settings.agents.page.field.agentName': 'Agent Name',
'settings.agents.page.field.agentNamePlaceholder': 'agent-name',
@@ -528,6 +571,7 @@ export const settingsDict = {
'settings.agents.page.permissions.permissionPlaceholder': 'Permission...',
'settings.agents.page.permissions.patternPlaceholder': 'Pattern (e.g. *)',
'settings.page.behavior.title': 'Behavior',
'settings.page.behavior.description': 'Guide how the agent responds.',
'settings.behavior.page.title': 'Behavior',
'settings.behavior.page.warning.title': 'Global rules are combined with project rules',
'settings.behavior.page.warning.description': 'Changes made here update {path}. OpenCode also includes any project-level AGENTS.md rules when they exist.',
@@ -913,6 +957,8 @@ export const settingsDict = {
'settings.openchamber.desktopNetwork.field.allowLanAccessDescription': 'Restarts the app so phones, tablets, and other computers on your Wi-Fi can open it.',
'settings.openchamber.desktopNetwork.field.warning': 'Warning: while enabled, the app is reachable by anyone on the same local network.',
'settings.openchamber.desktopNetwork.field.passwordRequiredWarning': 'LAN access requires a Desktop UI Password. Until one is set, the desktop app starts local-only.',
'settings.openchamber.desktopPassword.actions.showPassword': 'Show password',
'settings.openchamber.desktopPassword.actions.hidePassword': 'Hide password',
'settings.openchamber.desktopPassword.field.password': 'Desktop UI Password',
'settings.openchamber.desktopPassword.field.passwordPlaceholder': 'No password required',
'settings.openchamber.desktopPassword.field.passwordDescription': 'OpenChamber asks after restart, then when the login session expires: after 12 hours, or 7 days with Trust this device. Leave empty to disable login.',
@@ -1618,6 +1664,7 @@ export const settingsDict = {
'settings.voice.page.section.playbackAndSummary': 'Playback',
'settings.voice.page.field.provider': 'Provider',
'settings.voice.page.provider.browser': 'Browser',
'settings.voice.page.provider.openai': 'OpenAI',
'settings.voice.page.provider.custom': 'Custom',
'settings.voice.page.provider.say': 'Say',
'settings.voice.page.provider.server': 'Server',
@@ -1697,18 +1744,24 @@ export const settingsDict = {
'settings.voice.page.field.ttsInputModeRaw': 'Raw Markdown',
'settings.voice.page.field.ttsInputModeSummarized': 'summarized',
'settings.openchamber.visual.section.colorMode': 'Color Mode',
'settings.openchamber.visual.section.colorModeAndTheme': 'Color mode & Theme',
'settings.openchamber.visual.section.mobileLayout': 'Mobile Layout',
'settings.openchamber.visual.option.mobileLayout.default': 'Old',
'settings.openchamber.visual.option.mobileLayout.new': 'New',
'settings.openchamber.visual.section.localization': 'Localization',
'settings.openchamber.visual.section.spacingAndLayout': 'Spacing & Layout',
'settings.openchamber.visual.section.densityAndType': 'Density & type',
'settings.openchamber.visual.section.appInstall': 'App install',
'settings.openchamber.visual.section.navigation': 'Navigation',
'settings.openchamber.visual.section.chatRenderMode': 'Chat Render Mode',
'settings.openchamber.visual.section.chatRenderModeAria': 'Chat render mode',
'settings.openchamber.visual.section.chatDisplay': 'Display',
'settings.openchamber.visual.section.chatMessageOptions': 'Message options',
'settings.openchamber.visual.section.chatFeatures': 'Features',
'settings.openchamber.visual.section.messageStreamTransport': 'Message Stream Transport',
'settings.openchamber.visual.section.activityDefault': 'Activity Default',
'settings.openchamber.visual.section.activityDefaultAria': 'Activity default mode',
'settings.openchamber.visual.section.showToolsOpenedByDefault': 'Show tools opened by default:',
'settings.openchamber.visual.section.showToolsOpenedByDefault': 'Show tools opened by default',
'settings.openchamber.visual.section.sessionAssistance': 'Session Assistance',
'settings.openchamber.visual.section.reasoning': 'Reasoning',
'settings.openchamber.visual.section.messageAppearance': 'Message Appearance',
@@ -1839,8 +1892,11 @@ export const settingsDict = {
'settings.openchamber.visual.field.sendAnonymousUsageReports': 'Send anonymous usage reports',
'settings.openchamber.visual.field.sendAnonymousUsageReportsHint': 'Helps us understand which app versions are actively used so we can prioritize improvements. Only app version, platform, and runtime are collected - no personal data or code.',
'settings.openchamber.visual.option.themeMode.system': 'System',
'settings.openchamber.visual.option.themeMode.system.description': 'Follow system setting',
'settings.openchamber.visual.option.themeMode.light': 'Light',
'settings.openchamber.visual.option.themeMode.light.description': 'Always use light appearance',
'settings.openchamber.visual.option.themeMode.dark': 'Dark',
'settings.openchamber.visual.option.themeMode.dark.description': 'Always use dark appearance',
'settings.openchamber.visual.option.diffLayout.dynamic.label': 'Dynamic',
'settings.openchamber.visual.option.diffLayout.dynamic.description': 'New inline, modified side-by-side.',
'settings.openchamber.visual.option.diffLayout.inline.label': 'Always inline',
@@ -47,6 +47,10 @@ export const settingsDict = {
"settings.view.search.aria": "Buscar configuración",
"settings.view.search.clear": "Borrar búsqueda de configuración",
"settings.view.search.noResults": "No hay configuraciones coincidentes",
"settings.view.nav.group.general": "OpenChamber",
"settings.view.nav.group.projects": "Espacio de trabajo",
"settings.view.nav.group.opencode": "OpenCode",
"settings.view.nav.group.content": "Biblioteca",
"settings.page.projects.title": "Proyectos",
"settings.page.remoteInstances.title": "Instancias remotas",
"settings.page.providers.title": "Proveedores",
@@ -59,13 +63,22 @@ export const settingsDict = {
"settings.page.skillsCatalog.title": "Catálogo de habilidades",
"settings.page.git.title": "Git",
"settings.page.appearance.title": "Apariencia",
"settings.page.appearance.description": "Personaliza el aspecto y la sensación de OpenChamber.",
"settings.page.chat.title": "Chat",
"settings.page.chat.description": "Configura cómo se muestran los mensajes y las herramientas.",
"settings.page.shortcuts.title": "Atajos",
"settings.page.shortcuts.description": "Personaliza los atajos de teclado.",
"settings.page.general.title": "General",
"settings.page.general.description": "Inicio de la aplicación, seguridad, conexión y privacidad.",
"settings.page.sessions.title": "Sesiones",
"settings.page.sessions.description": "Define valores predeterminados y retención de sesiones.",
"settings.page.magicPrompts.title": "Prompts mágicos",
"settings.page.notifications.title": "Notificaciones",
"settings.page.notifications.description": "Elige cuándo y cómo recibir notificaciones.",
"settings.page.voice.title": "Voz",
"settings.page.tunnel.title": "Túnel remoto",
"settings.page.voice.description": "Configura la voz y el dictado.",
"settings.page.tunnel.title": "Túnel externo",
"settings.page.tunnel.description": "Expón esta instancia a través de un túnel remoto.",
"settings.page.about.title": "Acerca de",
"settings.page.snippets.title": "Snippets",
"settings.snippets.sidebar.title": "Snippets",
@@ -90,7 +103,7 @@ export const settingsDict = {
"settings.snippets.page.toast.contentRequired": "El contenido del snippet es obligatorio",
"settings.snippets.page.toast.saveFailed": "No se pudo guardar el snippet",
"settings.snippets.page.toast.saved": "Snippet guardado",
"settings.openchamber.tunnel.title": "Túnel remoto",
"settings.openchamber.tunnel.title": "Túnel externo",
"settings.openchamber.tunnel.description": "Configura el acceso remoto seguro con enlaces rápidos o tu propio túnel gestionado de Cloudflare.",
"settings.openchamber.tunnel.note.serverSideEnforced": "El acceso seguro al túnel se aplica en el servidor.",
"settings.openchamber.tunnel.note.connectLinksOneTime": "Los enlaces de conexión son de un solo uso: se revocan cuando el túnel se detiene o vence el TTL del enlace.",
@@ -366,6 +379,7 @@ export const settingsDict = {
"settings.remoteInstances.page.logsDialog.selectedInstanceFallback": "Instancia seleccionada",
"settings.remoteInstances.page.patternDialog.descriptionWithHost": "{host} requiere un destino concreto.",
"settings.remoteInstances.page.patternDialog.description": "Introduce destino.",
"settings.common.infoAria": "Más información",
"settings.common.actions.cancel": "Cancelar",
"settings.common.actions.create": "Crear",
"settings.common.actions.delete": "Eliminar",
@@ -376,6 +390,8 @@ export const settingsDict = {
"settings.common.actions.copyAll": "Copiar todo",
"settings.common.actions.clear": "Limpiar",
"settings.common.actions.saving": "Guardando...",
'settings.common.status.saved': 'Guardado',
'settings.common.status.saveFailed': 'Error al guardar',
"settings.common.actions.saveChanges": "Guardar cambios",
"settings.common.scope.global": "Global",
"settings.common.scope.project": "Proyecto",
@@ -460,6 +476,33 @@ export const settingsDict = {
"settings.agents.page.section.identityRole": "Identidad y rol",
"settings.agents.page.section.modelParameters": "Modelo y parámetros",
"settings.agents.page.section.systemPrompt": "Prompt del sistema",
"settings.agents.page.permissionsEditor.sectionInfo": "Edita las reglas de permisos propias de este agente tal como están guardadas en su config. «Heredar» deja la clave sin definir y aplican la config global y los valores por defecto.",
"settings.agents.page.permissionsEditor.defaultLabel": "Predeterminado para todas las herramientas",
"settings.agents.page.permissionsEditor.defaultAria": "Permiso predeterminado para todas las herramientas",
"settings.agents.page.permissionsEditor.defaultInfo": "El valor de reserva del agente (la clave *). Aplica a cualquier herramienta sin regla propia.",
"settings.agents.page.permissionsEditor.effectiveHint": "→ {action}",
"settings.agents.page.permissionsEditor.ruleCount": "{count} reglas",
"settings.agents.page.permissionsEditor.keyAria": "Permiso para {key}",
"settings.agents.page.permissionsEditor.patternPlaceholder": "Patrón, p. ej. rm -rf * o /path/**",
"settings.agents.page.permissionsEditor.patternActionAria": "Acción para el patrón de {key}",
"settings.agents.page.permissionsEditor.customKeyPlaceholder": "Clave de permiso personalizada…",
"settings.agents.page.permissionsEditor.sessionRulesTitle": "Concedidos en sesión (no guardados)",
"settings.agents.page.permissionsEditor.sessionRulesInfo": "Reglas concedidas durante sesiones en vivo (respuestas de «permitir siempre»). Aplican ahora, pero no forman parte de la config guardada y desaparecen al reiniciar.",
"settings.agents.page.permissionsEditor.action.default": "Predeterminado",
"settings.agents.page.permissionsEditor.action.inherit": "Heredar",
"settings.agents.page.permissionsEditor.action.allow": "Permitir",
"settings.agents.page.permissionsEditor.action.ask": "Preguntar",
"settings.agents.page.permissionsEditor.action.deny": "Denegar",
"settings.agents.page.permissionsEditor.actions.save": "Guardar permisos",
"settings.agents.page.permissionsEditor.actions.discard": "Descartar",
"settings.agents.page.permissionsEditor.actions.addRule": "Añadir regla",
"settings.agents.page.permissionsEditor.actions.addKey": "Añadir clave",
"settings.agents.page.permissionsEditor.actions.removeRuleAria": "Eliminar regla",
"settings.agents.page.permissionsEditor.actions.retry": "Reintentar",
"settings.agents.page.permissionsEditor.state.loadFailed": "No se pudo cargar la config de permisos del agente.",
"settings.agents.page.permissionsEditor.toast.saved": "Permisos guardados",
"settings.agents.page.permissionsEditor.toast.savedRestartRequired": "Permisos guardados: reinicia el servidor de OpenCode para aplicarlos",
"settings.agents.page.permissionsEditor.toast.saveFailed": "No se pudieron guardar los permisos",
"settings.agents.page.section.toolPermissions": "Permisos de herramientas",
"settings.agents.page.field.agentName": "Nombre del agente",
"settings.agents.page.field.agentNamePlaceholder": "nombre-agente",
@@ -495,6 +538,7 @@ export const settingsDict = {
"settings.agents.page.permissions.permissionPlaceholder": "Permiso...",
"settings.agents.page.permissions.patternPlaceholder": "Patrón (ej. *)",
"settings.page.behavior.title": "Comportamiento",
'settings.page.behavior.description': 'Guía cómo responde el agente.',
"settings.behavior.page.title": "Comportamiento",
"settings.behavior.page.warning.title": "Las reglas globales se combinan con las reglas del proyecto",
"settings.behavior.page.warning.description": "Los cambios realizados aquí actualizan {path}. OpenCode también incluye cualquier AGENTS.md a nivel de proyecto cuando existe.",
@@ -504,7 +548,7 @@ export const settingsDict = {
"settings.behavior.page.responseStyle.tooltip": "Cuando está habilitado, estas instrucciones guían cómo responde el asistente en cada conversación nueva. Se envían con tu primer mensaje y no cambian tus reglas globales de AGENTS.md.",
"settings.behavior.page.responseStyle.enableAria": "Habilitar instrucciones de estilo de respuesta",
"settings.behavior.page.responseStyle.enable": "Agregar instrucciones de estilo de respuesta a conversaciones nuevas",
"settings.behavior.page.responseStyle.preset": "Preset",
"settings.behavior.page.responseStyle.preset": "Preajuste",
"settings.behavior.page.responseStyle.option.concise": "Conciso",
"settings.behavior.page.responseStyle.option.detailed": "Detallado",
"settings.behavior.page.responseStyle.option.mentor": "Mentor",
@@ -880,6 +924,8 @@ export const settingsDict = {
"settings.openchamber.desktopNetwork.field.allowLanAccessDescription": "Reinicia la aplicación para que los teléfonos, tablets y otros ordenadores en tu Wi-Fi puedan abrirla.",
"settings.openchamber.desktopNetwork.field.warning": "Advertencia: mientras esté habilitado, la aplicación es accesible por cualquiera en la misma red local.",
"settings.openchamber.desktopNetwork.field.passwordRequiredWarning": "El acceso LAN requiere una contraseña de UI de escritorio. Hasta que se configure, la app de escritorio se inicia solo localmente.",
"settings.openchamber.desktopPassword.actions.showPassword": "Mostrar contraseña",
"settings.openchamber.desktopPassword.actions.hidePassword": "Ocultar contraseña",
"settings.openchamber.desktopPassword.field.password": "Contraseña de UI de escritorio",
"settings.openchamber.desktopPassword.field.passwordPlaceholder": "No se requiere contraseña",
"settings.openchamber.desktopPassword.field.passwordDescription": "OpenChamber la pide después del reinicio y luego cuando vence la sesión: tras 12 horas, o 7 días con Confiar en este dispositivo. Déjalo vacío para desactivar el inicio de sesión.",
@@ -1585,6 +1631,7 @@ export const settingsDict = {
"settings.voice.page.section.playbackAndSummary": "Reproducción",
"settings.voice.page.field.provider": "Proveedor",
"settings.voice.page.provider.browser": "Navegador",
"settings.voice.page.provider.openai": "OpenAI",
"settings.voice.page.provider.custom": "Personalizado",
"settings.voice.page.provider.say": "Decir",
"settings.voice.page.provider.server": "Servidor",
@@ -1664,18 +1711,24 @@ export const settingsDict = {
"settings.voice.page.field.ttsInputModeRaw": "Markdown sin procesar",
"settings.voice.page.field.ttsInputModeSummarized": "resumido",
"settings.openchamber.visual.section.colorMode": "Modo de color",
"settings.openchamber.visual.section.colorModeAndTheme": "Modo de color y tema",
"settings.openchamber.visual.section.mobileLayout": "Diseño móvil",
"settings.openchamber.visual.option.mobileLayout.default": "Anterior",
"settings.openchamber.visual.option.mobileLayout.new": "Nuevo",
"settings.openchamber.visual.section.localization": "Localización",
"settings.openchamber.visual.section.spacingAndLayout": "Espaciado y diseño",
"settings.openchamber.visual.section.densityAndType": "Densidad y tipografía",
"settings.openchamber.visual.section.appInstall": "Instalación de la app",
"settings.openchamber.visual.section.navigation": "Navegación",
"settings.openchamber.visual.section.chatRenderMode": "Modo de renderizado de chat",
"settings.openchamber.visual.section.chatRenderModeAria": "Modo de renderizado de chat",
"settings.openchamber.visual.section.chatDisplay": "Visualización",
"settings.openchamber.visual.section.chatMessageOptions": "Opciones de mensajes",
"settings.openchamber.visual.section.chatFeatures": "Funciones",
"settings.openchamber.visual.section.messageStreamTransport": "Transporte del flujo de mensajes",
"settings.openchamber.visual.section.activityDefault": "Modo predeterminado de actividad",
"settings.openchamber.visual.section.activityDefaultAria": "Modo predeterminado de actividad",
"settings.openchamber.visual.section.showToolsOpenedByDefault": "Mostrar herramientas abiertas por defecto:",
"settings.openchamber.visual.section.showToolsOpenedByDefault": "Mostrar herramientas abiertas por defecto",
"settings.openchamber.visual.section.sessionAssistance": "Asistencia de sesión",
"settings.openchamber.visual.section.reasoning": "Razonamiento",
"settings.openchamber.visual.section.messageAppearance": "Apariencia de los mensajes",
@@ -1806,8 +1859,11 @@ export const settingsDict = {
"settings.openchamber.visual.field.sendAnonymousUsageReports": "Enviar informes anónimos de uso",
"settings.openchamber.visual.field.sendAnonymousUsageReportsHint": "Nos ayuda a entender qué versiones de la aplicación se usan activamente para priorizar mejoras. Solo se recopilan la versión de la aplicación, la plataforma y el entorno de ejecución ; no se recopilan datos personales ni código.",
"settings.openchamber.visual.option.themeMode.system": "Sistema",
"settings.openchamber.visual.option.themeMode.system.description": "Seguir la configuración del sistema",
"settings.openchamber.visual.option.themeMode.light": "Claro",
"settings.openchamber.visual.option.themeMode.light.description": "Usar siempre la apariencia clara",
"settings.openchamber.visual.option.themeMode.dark": "Oscuro",
"settings.openchamber.visual.option.themeMode.dark.description": "Usar siempre la apariencia oscura",
"settings.openchamber.visual.option.diffLayout.dynamic.label": "Dinámico",
"settings.openchamber.visual.option.diffLayout.dynamic.description": "Nuevo en línea, modificado lado a lado.",
"settings.openchamber.visual.option.diffLayout.inline.label": "Siempre en línea",
@@ -55,13 +55,22 @@ export const settingsDict = {
'settings.page.skillsCatalog.title': 'Catalogue de skills',
'settings.page.git.title': 'Git',
'settings.page.appearance.title': 'Apparence',
'settings.page.appearance.description': 'Personnalisez lapparence et le ressenti dOpenChamber.',
'settings.page.chat.title': 'Chat',
'settings.page.chat.description': 'Configurez laffichage des messages et des outils.',
'settings.page.shortcuts.title': 'Raccourcis',
'settings.page.shortcuts.description': 'Personnalisez les raccourcis clavier.',
'settings.page.general.title': 'Général',
'settings.page.general.description': 'Démarrage de l\'application, sécurité, connexion et confidentialité.',
'settings.page.sessions.title': 'Sessions',
'settings.page.sessions.description': 'Définissez les valeurs par défaut et la conservation des sessions.',
'settings.page.magicPrompts.title': 'Prompts magiques',
'settings.page.notifications.title': 'Notifications',
'settings.page.notifications.description': 'Choisissez quand et comment être notifié.',
'settings.page.voice.title': 'Voix',
'settings.page.tunnel.title': 'Tunnel à distance',
'settings.page.voice.description': 'Configurez la synthèse vocale et la dictée.',
'settings.page.tunnel.title': 'Tunnel externe',
'settings.page.tunnel.description': 'Exposez cette instance via un tunnel distant.',
'settings.page.snippets.title': 'Extraits',
'settings.snippets.sidebar.title': 'Extraits',
'settings.snippets.sidebar.total': 'Total : {count}',
@@ -118,7 +127,7 @@ export const settingsDict = {
'settings.promptTemplates.page.toast.created': 'Modèle créé',
'settings.promptTemplates.page.toast.createFailed': 'Échec de la création du modèle',
'settings.promptTemplates.page.toast.saveUnexpectedError': 'Une erreur inattendue s\'est produite lors de l\'enregistrement',
'settings.openchamber.tunnel.title': 'Tunnel à distance',
'settings.openchamber.tunnel.title': 'Tunnel externe',
'settings.openchamber.tunnel.description': 'Configurez un accès à distance sécurisé avec des liens rapides ou votre propre tunnel Cloudflare distant géré.',
'settings.openchamber.tunnel.note.serverSideEnforced': 'L\'accès au tunnel sécurisé est appliqué côté serveur.',
'settings.openchamber.tunnel.note.connectLinksOneTime': 'Les liens de connexion sont uniques et sont révoqués lorsque le tunnel s\'arrête ou lorsque la durée de vie du lien de connexion expire.',
@@ -293,6 +302,7 @@ export const settingsDict = {
'settings.remoteInstances.page.logsDialog.selectedInstanceFallback': 'Instance sélectionnée',
'settings.remoteInstances.page.patternDialog.descriptionWithHost': '{host} nécessite une destination concrète.',
'settings.remoteInstances.page.patternDialog.description': 'Entrez la destination.',
'settings.common.infoAria': 'Plus dinformations',
'settings.common.actions.cancel': 'Annuler',
'settings.common.actions.create': 'Créer',
'settings.common.actions.delete': 'Supprimer',
@@ -303,6 +313,8 @@ export const settingsDict = {
'settings.common.actions.copyAll': 'Copier tout',
'settings.common.actions.clear': 'Effacer',
'settings.common.actions.saving': 'Enregistrement...',
'settings.common.status.saved': 'Enregistré',
'settings.common.status.saveFailed': 'Échec de lenregistrement',
'settings.common.actions.saveChanges': 'Enregistrer les modifications',
'settings.common.scope.global': 'Mondial',
'settings.common.scope.project': 'Projet',
@@ -385,6 +397,33 @@ export const settingsDict = {
'settings.agents.page.section.identityRole': 'Identité et rôle',
'settings.agents.page.section.modelParameters': 'Modèle et paramètres',
'settings.agents.page.section.systemPrompt': 'Prompt système',
'settings.agents.page.permissionsEditor.sectionInfo': 'Modifie les règles de permissions propres à cet agent, telles qu\'enregistrées dans sa config. « Hériter » laisse la clé non définie : la config globale et les valeurs par défaut s\'appliquent.',
'settings.agents.page.permissionsEditor.defaultLabel': 'Défaut pour tous les outils',
'settings.agents.page.permissionsEditor.defaultAria': 'Permission par défaut pour tous les outils',
'settings.agents.page.permissionsEditor.defaultInfo': 'Le repli au niveau de l\'agent (la clé *). S\'applique à tout outil sans règle propre.',
'settings.agents.page.permissionsEditor.effectiveHint': '→ {action}',
'settings.agents.page.permissionsEditor.ruleCount': '{count} règles',
'settings.agents.page.permissionsEditor.keyAria': 'Permission pour {key}',
'settings.agents.page.permissionsEditor.patternPlaceholder': 'Motif, p. ex. rm -rf * ou /path/**',
'settings.agents.page.permissionsEditor.patternActionAria': 'Action pour le motif de {key}',
'settings.agents.page.permissionsEditor.customKeyPlaceholder': 'Clé de permission personnalisée…',
'settings.agents.page.permissionsEditor.sessionRulesTitle': 'Accordées en session (non enregistrées)',
'settings.agents.page.permissionsEditor.sessionRulesInfo': 'Règles accordées pendant des sessions (réponses « toujours autoriser »). Elles s\'appliquent maintenant mais ne font pas partie de la config enregistrée et disparaissent au redémarrage.',
'settings.agents.page.permissionsEditor.action.default': 'Par défaut',
'settings.agents.page.permissionsEditor.action.inherit': 'Hériter',
'settings.agents.page.permissionsEditor.action.allow': 'Autoriser',
'settings.agents.page.permissionsEditor.action.ask': 'Demander',
'settings.agents.page.permissionsEditor.action.deny': 'Refuser',
'settings.agents.page.permissionsEditor.actions.save': 'Enregistrer les permissions',
'settings.agents.page.permissionsEditor.actions.discard': 'Annuler',
'settings.agents.page.permissionsEditor.actions.addRule': 'Ajouter une règle',
'settings.agents.page.permissionsEditor.actions.addKey': 'Ajouter une clé',
'settings.agents.page.permissionsEditor.actions.removeRuleAria': 'Supprimer la règle',
'settings.agents.page.permissionsEditor.actions.retry': 'Réessayer',
'settings.agents.page.permissionsEditor.state.loadFailed': 'Impossible de charger la config de permissions de l\'agent.',
'settings.agents.page.permissionsEditor.toast.saved': 'Permissions enregistrées',
'settings.agents.page.permissionsEditor.toast.savedRestartRequired': 'Permissions enregistrées — redémarrez le serveur OpenCode pour les appliquer',
'settings.agents.page.permissionsEditor.toast.saveFailed': 'Échec de l\'enregistrement des permissions',
'settings.agents.page.section.toolPermissions': 'Autorisations des outils',
'settings.agents.page.field.agentName': 'Nom de l\'agent',
'settings.agents.page.field.agentNamePlaceholder': 'nom-agent',
@@ -420,6 +459,7 @@ export const settingsDict = {
'settings.agents.page.permissions.permissionPlaceholder': 'Autorisation...',
'settings.agents.page.permissions.patternPlaceholder': 'Modèle (e.g. *)',
'settings.page.behavior.title': 'Comportement',
'settings.page.behavior.description': 'Guidez la façon dont l\'agent répond.',
'settings.behavior.page.title': 'Comportement',
'settings.behavior.page.warning.title': 'Les règles globales sont combinées avec les règles du projet',
'settings.behavior.page.warning.description': 'Les modifications apportées ici mettent à jour {path}. OpenCode inclut également toutes les règles AGENTS.md au niveau du projet lorsqu\'elles existent.',
@@ -805,6 +845,8 @@ export const settingsDict = {
'settings.openchamber.desktopNetwork.field.allowLanAccessDescription': 'Redémarre l\'application afin que les téléphones, tablettes et autres ordinateurs connectés à votre réseau Wi-Fi puissent l\'ouvrir.',
'settings.openchamber.desktopNetwork.field.warning': 'Attention : lorsqu\'elle est activée, l\'application est accessible à toute personne se trouvant sur le même réseau local.',
'settings.openchamber.desktopNetwork.field.passwordRequiredWarning': 'L\'accès LAN nécessite un mot de passe de l\'interface utilisateur du bureau. Tant qu\'il n\'est pas défini, l\'application de bureau démarre en accès local uniquement.',
'settings.openchamber.desktopPassword.actions.showPassword': 'Afficher le mot de passe',
'settings.openchamber.desktopPassword.actions.hidePassword': 'Masquer le mot de passe',
'settings.openchamber.desktopPassword.field.password': 'Mot de passe de l\'interface utilisateur du bureau',
'settings.openchamber.desktopPassword.field.passwordPlaceholder': 'Aucun mot de passe requis',
'settings.openchamber.desktopPassword.field.passwordDescription': 'OpenChamber demande après le redémarrage, puis quand la session de connexion expire : après 12 heures, ou 7 jours avec Trust this device. Laissez vide pour désactiver la connexion.',
@@ -1510,6 +1552,7 @@ export const settingsDict = {
'settings.voice.page.section.playbackAndSummary': 'Lecture',
'settings.voice.page.field.provider': 'Fournisseur',
'settings.voice.page.provider.browser': 'Navigateur',
'settings.voice.page.provider.openai': 'OpenAI',
'settings.voice.page.provider.custom': 'Personnalisé',
'settings.voice.page.provider.say': 'Dire',
'settings.voice.page.provider.server': 'Serveur',
@@ -1585,15 +1628,21 @@ export const settingsDict = {
'settings.voice.page.preview.voiceLine': 'Bonjour! Je m\'appelle {voiceName}. C\'est ainsi que je parle.',
'settings.voice.page.preview.customServerLine': 'Bonjour! Ceci est un aperçu du serveur TTS personnalisé.',
'settings.openchamber.visual.section.colorMode': 'Mode couleur',
'settings.openchamber.visual.section.colorModeAndTheme': 'Mode couleur et thème',
'settings.openchamber.visual.section.localization': 'Localisation',
'settings.openchamber.visual.section.spacingAndLayout': 'Espacement et disposition',
'settings.openchamber.visual.section.densityAndType': 'Densité et typographie',
'settings.openchamber.visual.section.appInstall': 'Installation de lapp',
'settings.openchamber.visual.section.navigation': 'Navigation',
'settings.openchamber.visual.section.chatRenderMode': 'Mode de rendu du chat',
'settings.openchamber.visual.section.chatRenderModeAria': 'Mode de rendu du chat',
'settings.openchamber.visual.section.chatDisplay': 'Affichage',
'settings.openchamber.visual.section.chatMessageOptions': 'Options des messages',
'settings.openchamber.visual.section.chatFeatures': 'Fonctionnalités',
'settings.openchamber.visual.section.messageStreamTransport': 'Transport de flux de messages',
'settings.openchamber.visual.section.activityDefault': 'Activité par défaut',
'settings.openchamber.visual.section.activityDefaultAria': 'Mode d\'activité par défaut',
'settings.openchamber.visual.section.showToolsOpenedByDefault': 'Afficher les outils ouverts par défaut :',
'settings.openchamber.visual.section.showToolsOpenedByDefault': 'Afficher les outils ouverts par défaut',
'settings.openchamber.visual.section.sessionAssistance': 'Assistance de session',
'settings.openchamber.visual.section.reasoning': 'Raisonnement',
'settings.openchamber.visual.section.messageAppearance': 'Apparence des messages',
@@ -1713,8 +1762,11 @@ export const settingsDict = {
'settings.openchamber.visual.field.sendAnonymousUsageReports': 'Envoyer des rapports d\'utilisation anonymes',
'settings.openchamber.visual.field.sendAnonymousUsageReportsHint': 'Nous aide à comprendre quelles versions de l\'application sont activement utilisées afin que nous puissions prioriser les améliorations. Seules la version de lapplication, la plate-forme et le runtime sont collectés aucune donnée personnelle ni code.',
'settings.openchamber.visual.option.themeMode.system': 'Système',
'settings.openchamber.visual.option.themeMode.system.description': 'Suivre le réglage système',
'settings.openchamber.visual.option.themeMode.light': 'Clair',
'settings.openchamber.visual.option.themeMode.light.description': 'Toujours utiliser lapparence claire',
'settings.openchamber.visual.option.themeMode.dark': 'Sombre',
'settings.openchamber.visual.option.themeMode.dark.description': 'Toujours utiliser lapparence sombre',
'settings.openchamber.visual.option.diffLayout.dynamic.label': 'Dynamique',
'settings.openchamber.visual.option.diffLayout.dynamic.description': 'Choisit automatiquement entre la vue côte à côte et la vue intégrée selon le contenu modifié.',
'settings.openchamber.visual.option.diffLayout.inline.label': 'Toujours intégré',
@@ -1800,6 +1852,10 @@ export const settingsDict = {
'settings.view.search.aria': 'Rechercher dans les paramètres',
'settings.view.search.clear': 'Effacer la recherche des paramètres',
'settings.view.search.noResults': 'Aucun paramètre correspondant',
'settings.view.nav.group.general': 'OpenChamber',
'settings.view.nav.group.projects': 'Espace de travail',
'settings.view.nav.group.opencode': 'OpenCode',
'settings.view.nav.group.content': 'Bibliothèque',
'settings.page.about.title': 'À propos',
'settings.openchamber.tunnel.notAvailable.dependencyNotFound': '{dependency} est introuvable.',
'settings.magicPrompts.sidebar.item.sessionExplore': 'Tour du codebase',
@@ -47,6 +47,10 @@ export const settingsDict = {
'settings.view.search.aria': '設定を検索',
'settings.view.search.clear': '設定検索をクリア',
'settings.view.search.noResults': '該当する設定がありません',
'settings.view.nav.group.general': 'OpenChamber',
'settings.view.nav.group.projects': 'ワークスペース',
'settings.view.nav.group.opencode': 'OpenCode',
'settings.view.nav.group.content': 'ライブラリ',
'settings.page.projects.title': 'プロジェクト',
'settings.page.remoteInstances.title': 'リモートインスタンス',
'settings.page.providers.title': 'プロバイダー',
@@ -59,13 +63,22 @@ export const settingsDict = {
'settings.page.skillsCatalog.title': 'スキルカタログ',
'settings.page.git.title': 'Git',
'settings.page.appearance.title': '外観',
'settings.page.appearance.description': 'OpenChamber の見た目と操作感をカスタマイズします。',
'settings.page.chat.title': 'チャット',
'settings.page.chat.description': 'メッセージとツールの表示方法を設定します。',
'settings.page.shortcuts.title': 'ショートカット',
'settings.page.shortcuts.description': 'キーボードショートカットをカスタマイズします。',
'settings.page.general.title': '一般',
'settings.page.general.description': 'アプリの起動、セキュリティ、接続、プライバシー。',
'settings.page.sessions.title': 'セッション',
'settings.page.sessions.description': 'セッションのデフォルトと保持期間を設定します。',
'settings.page.magicPrompts.title': 'マジックプロンプト',
'settings.page.notifications.title': '通知',
'settings.page.notifications.description': '通知のタイミングと方法を選択します。',
'settings.page.voice.title': '音声',
'settings.page.tunnel.title': 'リモートトンネル',
'settings.page.voice.description': '音声読み上げとディクテーションを設定します。',
'settings.page.tunnel.title': '外部トンネル',
'settings.page.tunnel.description': 'このインスタンスをリモートトンネルで公開します。',
'settings.page.about.title': '概要',
'settings.page.snippets.title': 'スニペット',
'settings.snippets.sidebar.title': 'スニペット',
@@ -123,7 +136,7 @@ export const settingsDict = {
'settings.promptTemplates.page.toast.created': 'Template を作成しました',
'settings.promptTemplates.page.toast.createFailed': 'Template の作成に失敗しました',
'settings.promptTemplates.page.toast.saveUnexpectedError': '保存中に予期しないエラーが発生しました',
'settings.openchamber.tunnel.title': 'リモートトンネル',
'settings.openchamber.tunnel.title': '外部トンネル',
'settings.openchamber.tunnel.description': 'クイックリンクまたは自身で管理するリモート Cloudflare Tunnel を使用して安全なリモートアクセスを設定します。',
'settings.openchamber.tunnel.note.serverSideEnforced': '安全な Tunnel アクセスはサーバー側で強制されます。',
'settings.openchamber.tunnel.note.connectLinksOneTime': '接続リンクは一度きりで、Tunnel が停止するか接続リンクの TTL が期限切れになると無効になります。',
@@ -399,6 +412,7 @@ export const settingsDict = {
'settings.remoteInstances.page.logsDialog.selectedInstanceFallback': '選択したインスタンス',
'settings.remoteInstances.page.patternDialog.descriptionWithHost': '{host} には具体的な接続先が必要です。',
'settings.remoteInstances.page.patternDialog.description': '接続先を入力してください。',
'settings.common.infoAria': '詳細情報',
'settings.common.actions.cancel': 'キャンセル',
'settings.common.actions.create': '作成',
'settings.common.actions.delete': '削除',
@@ -409,6 +423,8 @@ export const settingsDict = {
'settings.common.actions.copyAll': 'すべてコピー',
'settings.common.actions.clear': 'クリア',
'settings.common.actions.saving': '保存中...',
'settings.common.status.saved': '保存済み',
'settings.common.status.saveFailed': '保存に失敗しました',
'settings.common.actions.saveChanges': '変更を保存',
'settings.common.scope.global': 'グローバル',
'settings.common.scope.project': 'プロジェクト',
@@ -493,6 +509,33 @@ export const settingsDict = {
'settings.agents.page.section.identityRole': '識別情報と役割',
'settings.agents.page.section.modelParameters': 'モデルとパラメーター',
'settings.agents.page.section.systemPrompt': 'システムプロンプト',
'settings.agents.page.permissionsEditor.sectionInfo': 'このエージェント自身の権限ルールを、設定に保存されているとおりに編集します。「継承」はキーを未設定のままにし、グローバル設定とデフォルトが適用されます。',
'settings.agents.page.permissionsEditor.defaultLabel': '全ツールのデフォルト',
'settings.agents.page.permissionsEditor.defaultAria': '全ツールのデフォルト権限',
'settings.agents.page.permissionsEditor.defaultInfo': 'エージェントレベルのフォールバック(* キー)。個別ルールのないツールに適用されます。',
'settings.agents.page.permissionsEditor.effectiveHint': '→ {action}',
'settings.agents.page.permissionsEditor.ruleCount': '{count} 件のルール',
'settings.agents.page.permissionsEditor.keyAria': '{key} の権限',
'settings.agents.page.permissionsEditor.patternPlaceholder': 'パターン(例: rm -rf * や /path/**',
'settings.agents.page.permissionsEditor.patternActionAria': '{key} パターンのアクション',
'settings.agents.page.permissionsEditor.customKeyPlaceholder': 'カスタム権限キー…',
'settings.agents.page.permissionsEditor.sessionRulesTitle': 'セッションで許可(未保存)',
'settings.agents.page.permissionsEditor.sessionRulesInfo': 'ライブセッション中に許可されたルール(「常に許可」の回答など)。現在は有効ですが、保存された設定には含まれず、再起動で消えます。',
'settings.agents.page.permissionsEditor.action.default': 'デフォルト',
'settings.agents.page.permissionsEditor.action.inherit': '継承',
'settings.agents.page.permissionsEditor.action.allow': '許可',
'settings.agents.page.permissionsEditor.action.ask': '確認',
'settings.agents.page.permissionsEditor.action.deny': '拒否',
'settings.agents.page.permissionsEditor.actions.save': '権限を保存',
'settings.agents.page.permissionsEditor.actions.discard': '破棄',
'settings.agents.page.permissionsEditor.actions.addRule': 'ルールを追加',
'settings.agents.page.permissionsEditor.actions.addKey': 'キーを追加',
'settings.agents.page.permissionsEditor.actions.removeRuleAria': 'ルールを削除',
'settings.agents.page.permissionsEditor.actions.retry': '再試行',
'settings.agents.page.permissionsEditor.state.loadFailed': 'エージェントの権限設定を読み込めませんでした。',
'settings.agents.page.permissionsEditor.toast.saved': '権限を保存しました',
'settings.agents.page.permissionsEditor.toast.savedRestartRequired': '権限を保存しました — 適用するには OpenCode サーバーを再起動してください',
'settings.agents.page.permissionsEditor.toast.saveFailed': '権限の保存に失敗しました',
'settings.agents.page.section.toolPermissions': 'ツール権限',
'settings.agents.page.field.agentName': 'Agent 名',
'settings.agents.page.field.agentNamePlaceholder': 'agent-name',
@@ -528,6 +571,7 @@ export const settingsDict = {
'settings.agents.page.permissions.permissionPlaceholder': '権限...',
'settings.agents.page.permissions.patternPlaceholder': 'パターン(例: *',
'settings.page.behavior.title': '動作',
'settings.page.behavior.description': 'エージェントの応答の仕方をガイドします。',
'settings.behavior.page.title': '動作',
'settings.behavior.page.warning.title': 'グローバルルールはプロジェクトルールと組み合わされます',
'settings.behavior.page.warning.description': 'ここでの変更は {path} を更新します。OpenCode はプロジェクトレベルの AGENTS.md ルールも存在する場合は含めます。',
@@ -913,6 +957,8 @@ export const settingsDict = {
'settings.openchamber.desktopNetwork.field.allowLanAccessDescription': 'アプリを再起動して、Wi-Fi 上の他のデバイスから開けるようにします。',
'settings.openchamber.desktopNetwork.field.warning': '警告: 有効にすると、アプリは同じローカルネットワーク上の誰からもアクセス可能になります。',
'settings.openchamber.desktopNetwork.field.passwordRequiredWarning': 'LAN アクセスには Desktop UI パスワードが必要です。設定されるまで、Desktop アプリはローカルのみで起動します。',
'settings.openchamber.desktopPassword.actions.showPassword': 'パスワードを表示',
'settings.openchamber.desktopPassword.actions.hidePassword': 'パスワードを非表示',
'settings.openchamber.desktopPassword.field.password': 'Desktop UI パスワード',
'settings.openchamber.desktopPassword.field.passwordPlaceholder': 'パスワード不要',
'settings.openchamber.desktopPassword.field.passwordDescription': 'OpenChamber は再起動後、およびログイン Session の有効期限後(12時間、または「このデバイスを信頼」の場合は7日)に確認を求めます。空のままにするとログインが無効になります。',
@@ -1618,6 +1664,7 @@ export const settingsDict = {
'settings.voice.page.section.playbackAndSummary': '再生',
'settings.voice.page.field.provider': 'プロバイダー',
'settings.voice.page.provider.browser': 'ブラウザ',
'settings.voice.page.provider.openai': 'OpenAI',
'settings.voice.page.provider.custom': 'カスタム',
'settings.voice.page.provider.say': 'Say',
'settings.voice.page.provider.server': 'サーバー',
@@ -1697,18 +1744,24 @@ export const settingsDict = {
'settings.voice.page.field.ttsInputModeRaw': '生 Markdown',
'settings.voice.page.field.ttsInputModeSummarized': '要約',
'settings.openchamber.visual.section.colorMode': 'カラーモード',
'settings.openchamber.visual.section.colorModeAndTheme': 'カラーモードとテーマ',
'settings.openchamber.visual.section.mobileLayout': 'モバイルレイアウト',
'settings.openchamber.visual.option.mobileLayout.default': '旧',
'settings.openchamber.visual.option.mobileLayout.new': '新',
'settings.openchamber.visual.section.localization': 'ローカライゼーション',
'settings.openchamber.visual.section.spacingAndLayout': '間隔とレイアウト',
'settings.openchamber.visual.section.densityAndType': '密度と書体',
'settings.openchamber.visual.section.appInstall': 'アプリのインストール',
'settings.openchamber.visual.section.navigation': 'ナビゲーション',
'settings.openchamber.visual.section.chatRenderMode': 'Chat 表示モード',
'settings.openchamber.visual.section.chatRenderModeAria': 'Chat 表示モード',
'settings.openchamber.visual.section.chatDisplay': '表示',
'settings.openchamber.visual.section.chatMessageOptions': 'メッセージオプション',
'settings.openchamber.visual.section.chatFeatures': '機能',
'settings.openchamber.visual.section.messageStreamTransport': 'メッセージストリーム転送',
'settings.openchamber.visual.section.activityDefault': 'アクティビティデフォルト',
'settings.openchamber.visual.section.activityDefaultAria': 'アクティビティデフォルトモード',
'settings.openchamber.visual.section.showToolsOpenedByDefault': 'デフォルトで開くツールを表示:',
'settings.openchamber.visual.section.showToolsOpenedByDefault': 'デフォルトで開くツールを表示',
'settings.openchamber.visual.section.sessionAssistance': 'セッション支援',
'settings.openchamber.visual.section.reasoning': '推論',
'settings.openchamber.visual.section.messageAppearance': 'メッセージの外観',
@@ -1839,8 +1892,11 @@ export const settingsDict = {
'settings.openchamber.visual.field.sendAnonymousUsageReports': '匿名使用状況レポートを送信',
'settings.openchamber.visual.field.sendAnonymousUsageReportsHint': 'どのアプリバージョンがアクティブに使用されているかを把握し、改善の優先順位を決めるのに役立ちます。収集されるのはアプリバージョン、プラットフォーム、ランタイムのみで、個人データやコードは収集されません。',
'settings.openchamber.visual.option.themeMode.system': 'システム',
'settings.openchamber.visual.option.themeMode.system.description': 'システム設定に合わせる',
'settings.openchamber.visual.option.themeMode.light': 'ライト',
'settings.openchamber.visual.option.themeMode.light.description': '常にライト表示を使用',
'settings.openchamber.visual.option.themeMode.dark': 'ダーク',
'settings.openchamber.visual.option.themeMode.dark.description': '常にダーク表示を使用',
'settings.openchamber.visual.option.diffLayout.dynamic.label': '動的',
'settings.openchamber.visual.option.diffLayout.dynamic.description': '新規はインライン、変更は並列表示。',
'settings.openchamber.visual.option.diffLayout.inline.label': '常にインライン',
@@ -47,6 +47,10 @@ export const settingsDict = {
'settings.view.search.aria': '설정 검색',
'settings.view.search.clear': '설정 검색 지우기',
'settings.view.search.noResults': '일치하는 설정이 없습니다',
'settings.view.nav.group.general': 'OpenChamber',
'settings.view.nav.group.projects': '워크스페이스',
'settings.view.nav.group.opencode': 'OpenCode',
'settings.view.nav.group.content': '라이브러리',
'settings.page.projects.title': '프로젝트',
'settings.page.remoteInstances.title': '원격 인스턴스',
'settings.page.providers.title': '프로바이더',
@@ -59,13 +63,22 @@ export const settingsDict = {
'settings.page.skillsCatalog.title': '스킬 카탈로그',
'settings.page.git.title': 'Git',
'settings.page.appearance.title': '외관',
'settings.page.appearance.description': 'OpenChamber의 모양과 느낌을 맞춤 설정하세요.',
'settings.page.chat.title': '채팅',
'settings.page.chat.description': '메시지와 도구가 표시되는 방식을 구성합니다.',
'settings.page.shortcuts.title': '단축키',
'settings.page.shortcuts.description': '키보드 단축키를 맞춤 설정합니다.',
'settings.page.general.title': '일반',
'settings.page.general.description': '앱 시작, 보안, 연결 및 개인정보.',
'settings.page.sessions.title': '세션',
'settings.page.sessions.description': '세션 기본값과 보관 기간을 설정합니다.',
'settings.page.magicPrompts.title': '매직 프롬프트',
'settings.page.notifications.title': '알림',
'settings.page.notifications.description': '알림을 받을 시점과 방식을 선택합니다.',
'settings.page.voice.title': '음성',
'settings.page.tunnel.title': '원격 터널',
'settings.page.voice.description': '음성 및 받아쓰기를 구성합니다.',
'settings.page.tunnel.title': '외부 터널',
'settings.page.tunnel.description': '원격 터널로 이 인스턴스를 노출합니다.',
'settings.page.about.title': '정보',
'settings.page.snippets.title': '스니펫',
'settings.snippets.sidebar.title': '스니펫',
@@ -90,7 +103,7 @@ export const settingsDict = {
'settings.snippets.page.toast.contentRequired': '스니펫 내용은 필수입니다',
'settings.snippets.page.toast.saveFailed': '스니펫 저장 실패',
'settings.snippets.page.toast.saved': '스니펫이 저장되었습니다',
'settings.openchamber.tunnel.title': '원격 터널',
'settings.openchamber.tunnel.title': '외부 터널',
'settings.openchamber.tunnel.description': '퀵 링크나 직접 관리하는 Cloudflare 터널로 안전한 원격 접속을 설정하세요.',
'settings.openchamber.tunnel.note.serverSideEnforced': '보안 터널 접근은 서버 측에서 강제됩니다.',
'settings.openchamber.tunnel.note.connectLinksOneTime': '접속 링크는 일회용이며, 터널이 중지되거나 링크 TTL이 만료되면 폐기됩니다.',
@@ -366,6 +379,7 @@ export const settingsDict = {
'settings.remoteInstances.page.logsDialog.selectedInstanceFallback': '선택한 인스턴스',
'settings.remoteInstances.page.patternDialog.descriptionWithHost': '{host}에는 구체적인 대상이 필요합니다.',
'settings.remoteInstances.page.patternDialog.description': '대상을 입력하세요.',
'settings.common.infoAria': '자세한 정보',
'settings.common.actions.cancel': '취소',
'settings.common.actions.create': '생성',
'settings.common.actions.delete': '삭제',
@@ -376,6 +390,8 @@ export const settingsDict = {
'settings.common.actions.copyAll': '모두 복사',
'settings.common.actions.clear': '지우기',
'settings.common.actions.saving': '저장 중...',
'settings.common.status.saved': '저장됨',
'settings.common.status.saveFailed': '저장 실패',
'settings.common.actions.saveChanges': '변경 사항 저장',
'settings.common.scope.global': '전역',
'settings.common.scope.project': '프로젝트',
@@ -460,6 +476,33 @@ export const settingsDict = {
'settings.agents.page.section.identityRole': '정체성 및 역할',
'settings.agents.page.section.modelParameters': '모델 및 파라미터',
'settings.agents.page.section.systemPrompt': '시스템 프롬프트',
'settings.agents.page.permissionsEditor.sectionInfo': '이 에이전트 자체의 권한 규칙을 설정 파일에 저장된 그대로 편집합니다. "상속"은 키를 설정하지 않은 상태로 두어 전역 설정과 기본값이 적용됩니다.',
'settings.agents.page.permissionsEditor.defaultLabel': '모든 도구 기본값',
'settings.agents.page.permissionsEditor.defaultAria': '모든 도구의 기본 권한',
'settings.agents.page.permissionsEditor.defaultInfo': '에이전트 수준 폴백(* 키)입니다. 자체 규칙이 없는 도구에 적용됩니다.',
'settings.agents.page.permissionsEditor.effectiveHint': '→ {action}',
'settings.agents.page.permissionsEditor.ruleCount': '규칙 {count}개',
'settings.agents.page.permissionsEditor.keyAria': '{key} 권한',
'settings.agents.page.permissionsEditor.patternPlaceholder': '패턴, 예: rm -rf * 또는 /path/**',
'settings.agents.page.permissionsEditor.patternActionAria': '{key} 패턴의 동작',
'settings.agents.page.permissionsEditor.customKeyPlaceholder': '사용자 지정 권한 키…',
'settings.agents.page.permissionsEditor.sessionRulesTitle': '세션에서 허용됨(저장 안 됨)',
'settings.agents.page.permissionsEditor.sessionRulesInfo': '라이브 세션 중 허용된 규칙("항상 허용" 응답 등)입니다. 지금은 적용되지만 저장된 설정에는 포함되지 않으며 재시작 시 사라집니다.',
'settings.agents.page.permissionsEditor.action.default': '기본값',
'settings.agents.page.permissionsEditor.action.inherit': '상속',
'settings.agents.page.permissionsEditor.action.allow': '허용',
'settings.agents.page.permissionsEditor.action.ask': '확인',
'settings.agents.page.permissionsEditor.action.deny': '거부',
'settings.agents.page.permissionsEditor.actions.save': '권한 저장',
'settings.agents.page.permissionsEditor.actions.discard': '취소',
'settings.agents.page.permissionsEditor.actions.addRule': '규칙 추가',
'settings.agents.page.permissionsEditor.actions.addKey': '키 추가',
'settings.agents.page.permissionsEditor.actions.removeRuleAria': '규칙 삭제',
'settings.agents.page.permissionsEditor.actions.retry': '다시 시도',
'settings.agents.page.permissionsEditor.state.loadFailed': '에이전트 권한 설정을 불러오지 못했습니다.',
'settings.agents.page.permissionsEditor.toast.saved': '권한이 저장되었습니다',
'settings.agents.page.permissionsEditor.toast.savedRestartRequired': '권한이 저장되었습니다 — 적용하려면 OpenCode 서버를 재시작하세요',
'settings.agents.page.permissionsEditor.toast.saveFailed': '권한 저장에 실패했습니다',
'settings.agents.page.section.toolPermissions': '도구 권한',
'settings.agents.page.field.agentName': '에이전트 이름',
'settings.agents.page.field.agentNamePlaceholder': 'agent-name (예: code-reviewer)',
@@ -495,6 +538,7 @@ export const settingsDict = {
'settings.agents.page.permissions.permissionPlaceholder': '권한...',
'settings.agents.page.permissions.patternPlaceholder': '패턴(예: *)',
'settings.page.behavior.title': '동작',
'settings.page.behavior.description': '에이전트의 응답 방식을 안내합니다.',
'settings.behavior.page.title': '동작',
'settings.behavior.page.warning.title': '전역 규칙은 프로젝트 규칙과 함께 사용됩니다',
'settings.behavior.page.warning.description': '여기에서 변경한 내용은 {path}를 업데이트합니다. 프로젝트 수준의 AGENTS.md가 있으면 OpenCode도 함께 포함합니다.',
@@ -880,6 +924,8 @@ export const settingsDict = {
'settings.openchamber.desktopNetwork.field.allowLanAccessDescription': '휴대폰, 태블릿, Wi-Fi의 다른 컴퓨터에서 열 수 있도록 앱을 다시 시작합니다.',
'settings.openchamber.desktopNetwork.field.warning': '경고: 활성화된 동안 같은 로컬 네트워크의 누구나 앱에 접속할 수 있습니다.',
'settings.openchamber.desktopNetwork.field.passwordRequiredWarning': 'LAN 접속에는 Desktop UI 비밀번호가 필요합니다. 설정하기 전까지 desktop 앱은 로컬 전용으로 시작됩니다.',
'settings.openchamber.desktopPassword.actions.showPassword': '비밀번호 표시',
'settings.openchamber.desktopPassword.actions.hidePassword': '비밀번호 숨기기',
'settings.openchamber.desktopPassword.field.password': 'Desktop UI 비밀번호',
'settings.openchamber.desktopPassword.field.passwordPlaceholder': '비밀번호 필요 없음',
'settings.openchamber.desktopPassword.field.passwordDescription': 'OpenChamber는 다시 시작 후 비밀번호를 요청하고, 이후 로그인 세션이 만료되면 다시 요청합니다. 기본 12시간, 이 디바이스 신뢰 선택 시 7일입니다. 로그인을 끄려면 비워 두세요.',
@@ -1585,6 +1631,7 @@ export const settingsDict = {
'settings.voice.page.section.playbackAndSummary': '재생',
'settings.voice.page.field.provider': '프로바이더',
'settings.voice.page.provider.browser': '브라우저',
'settings.voice.page.provider.openai': 'OpenAI',
'settings.voice.page.provider.custom': '사용자 정의',
'settings.voice.page.provider.say': 'Say',
'settings.voice.page.provider.server': '서버',
@@ -1664,18 +1711,24 @@ export const settingsDict = {
'settings.voice.page.field.ttsInputModeRaw': '원본 Markdown',
'settings.voice.page.field.ttsInputModeSummarized': '요약',
'settings.openchamber.visual.section.colorMode': '색상 모드',
'settings.openchamber.visual.section.colorModeAndTheme': '색상 모드 및 테마',
'settings.openchamber.visual.section.mobileLayout': '모바일 레이아웃',
'settings.openchamber.visual.option.mobileLayout.default': '이전',
'settings.openchamber.visual.option.mobileLayout.new': '새로움',
'settings.openchamber.visual.section.localization': '지역화',
'settings.openchamber.visual.section.spacingAndLayout': '간격 및 레이아웃',
'settings.openchamber.visual.section.densityAndType': '밀도 및 서체',
'settings.openchamber.visual.section.appInstall': '앱 설치',
'settings.openchamber.visual.section.navigation': '내비게이션',
'settings.openchamber.visual.section.chatRenderMode': '채팅 렌더링 모드',
'settings.openchamber.visual.section.chatRenderModeAria': '채팅 렌더링 모드',
'settings.openchamber.visual.section.chatDisplay': '표시',
'settings.openchamber.visual.section.chatMessageOptions': '메시지 옵션',
'settings.openchamber.visual.section.chatFeatures': '기능',
'settings.openchamber.visual.section.messageStreamTransport': '메시지 스트림 전송',
'settings.openchamber.visual.section.activityDefault': 'Activity 기본값',
'settings.openchamber.visual.section.activityDefaultAria': 'Activity 기본 모드',
'settings.openchamber.visual.section.showToolsOpenedByDefault': '도구를 기본으로 펼쳐 표시:',
'settings.openchamber.visual.section.showToolsOpenedByDefault': '도구를 기본으로 펼쳐 표시',
'settings.openchamber.visual.section.sessionAssistance': '세션 지원',
'settings.openchamber.visual.section.reasoning': '추론',
'settings.openchamber.visual.section.messageAppearance': '메시지 모양',
@@ -1806,8 +1859,11 @@ export const settingsDict = {
'settings.openchamber.visual.field.sendAnonymousUsageReports': '익명 사용량 보고서 보내기',
'settings.openchamber.visual.field.sendAnonymousUsageReportsHint': '활성 사용 앱 버전을 파악해 개선 우선순위를 정하는 데 도움이 됩니다. 앱 버전, 플랫폼, 런타임만 수집되며 개인 데이터나 코드는 수집되지 않습니다.',
'settings.openchamber.visual.option.themeMode.system': 'System',
'settings.openchamber.visual.option.themeMode.system.description': '시스템 설정 따르기',
'settings.openchamber.visual.option.themeMode.light': 'Light',
'settings.openchamber.visual.option.themeMode.light.description': '항상 라이트 모양 사용',
'settings.openchamber.visual.option.themeMode.dark': 'Dark',
'settings.openchamber.visual.option.themeMode.dark.description': '항상 다크 모양 사용',
'settings.openchamber.visual.option.diffLayout.dynamic.label': '동적',
'settings.openchamber.visual.option.diffLayout.dynamic.description': '새 항목은 inline, 수정 항목은 side-by-side로 표시합니다.',
'settings.openchamber.visual.option.diffLayout.inline.label': '항상 inline',
@@ -69,6 +69,33 @@ export const settingsDict = {
'settings.agents.page.section.identityRole': 'Tożsamość i Rola',
'settings.agents.page.section.modelParameters': 'Model i Parametry',
'settings.agents.page.section.systemPrompt': 'System Prompt',
'settings.agents.page.permissionsEditor.sectionInfo': 'Edytuje własne reguły uprawnień tego agenta dokładnie tak, jak są zapisane w jego konfiguracji. „Dziedzicz” pozostawia klucz nieustawiony — obowiązują konfiguracja globalna i domyślne.',
'settings.agents.page.permissionsEditor.defaultLabel': 'Domyślne dla wszystkich narzędzi',
'settings.agents.page.permissionsEditor.defaultAria': 'Domyślne uprawnienie dla wszystkich narzędzi',
'settings.agents.page.permissionsEditor.defaultInfo': 'Rezerwa na poziomie agenta (klucz *). Dotyczy narzędzi bez własnej reguły.',
'settings.agents.page.permissionsEditor.effectiveHint': '→ {action}',
'settings.agents.page.permissionsEditor.ruleCount': '{count} reguł',
'settings.agents.page.permissionsEditor.keyAria': 'Uprawnienie dla {key}',
'settings.agents.page.permissionsEditor.patternPlaceholder': 'Wzorzec, np. rm -rf * lub /path/**',
'settings.agents.page.permissionsEditor.patternActionAria': 'Akcja dla wzorca {key}',
'settings.agents.page.permissionsEditor.customKeyPlaceholder': 'Własny klucz uprawnienia…',
'settings.agents.page.permissionsEditor.sessionRulesTitle': 'Przyznane w sesji (niezapisane)',
'settings.agents.page.permissionsEditor.sessionRulesInfo': 'Reguły przyznane w trakcie sesji (odpowiedzi „zawsze zezwalaj”). Działają teraz, ale nie są częścią zapisanej konfiguracji i znikną po restarcie.',
'settings.agents.page.permissionsEditor.action.default': 'Domyślnie',
'settings.agents.page.permissionsEditor.action.inherit': 'Dziedzicz',
'settings.agents.page.permissionsEditor.action.allow': 'Zezwól',
'settings.agents.page.permissionsEditor.action.ask': 'Pytaj',
'settings.agents.page.permissionsEditor.action.deny': 'Odmów',
'settings.agents.page.permissionsEditor.actions.save': 'Zapisz uprawnienia',
'settings.agents.page.permissionsEditor.actions.discard': 'Odrzuć',
'settings.agents.page.permissionsEditor.actions.addRule': 'Dodaj regułę',
'settings.agents.page.permissionsEditor.actions.addKey': 'Dodaj klucz',
'settings.agents.page.permissionsEditor.actions.removeRuleAria': 'Usuń regułę',
'settings.agents.page.permissionsEditor.actions.retry': 'Ponów',
'settings.agents.page.permissionsEditor.state.loadFailed': 'Nie udało się wczytać konfiguracji uprawnień agenta.',
'settings.agents.page.permissionsEditor.toast.saved': 'Uprawnienia zapisane',
'settings.agents.page.permissionsEditor.toast.savedRestartRequired': 'Uprawnienia zapisane — uruchom ponownie serwer OpenCode, aby zastosować',
'settings.agents.page.permissionsEditor.toast.saveFailed': 'Nie udało się zapisać uprawnień',
'settings.agents.page.section.toolPermissions': 'Uprawnienia do narzędzi',
'settings.agents.page.subtitle.edit': 'Edytuj ustawienia agenta',
'settings.agents.page.subtitle.new': 'Skonfiguruj nową personę asystenta',
@@ -117,7 +144,7 @@ export const settingsDict = {
'settings.behavior.page.responseStyle.option.noFiller': 'Bez zbędnych treści',
'settings.behavior.page.responseStyle.option.pushback': 'Krytyczne podejście',
'settings.behavior.page.responseStyle.option.warmPeer': 'Przyjazny kolega',
'settings.behavior.page.responseStyle.preset': 'Preset',
'settings.behavior.page.responseStyle.preset': 'Predefiniowany styl',
'settings.behavior.page.responseStyle.tooltip': 'Jeśli jest włączone, instrukcje te określają sposób odpowiadania asystenta w każdej nowej rozmowie. Są one przesyłane z Twoją pierwszą wiadomością i nie zmieniają Twoich globalnych reguł AGENTS.md.',
'settings.behavior.page.section.responseStyle': 'Styl odpowiedzi',
'settings.behavior.page.section.systemPrompt': 'Globalny AGENTS.md',
@@ -173,6 +200,7 @@ export const settingsDict = {
'settings.commands.sidebar.toast.renameFailed': 'Nie udało się zmienić nazwy polecenia',
'settings.commands.sidebar.toast.resetFailed': 'Nie udało się zresetować polecenia',
'settings.commands.sidebar.total': 'Suma: {count}',
'settings.common.infoAria': 'Więcej informacji',
'settings.common.actions.cancel': 'Anuluj',
'settings.common.actions.clear': 'Wyczyść',
'settings.common.actions.copyAll': 'Kopiuj wszystko',
@@ -184,6 +212,8 @@ export const settingsDict = {
'settings.common.actions.reset': 'Zresetuj',
'settings.common.actions.saveChanges': 'Zapisz zmiany',
'settings.common.actions.saving': 'Zapisywanie...',
'settings.common.status.saved': 'Zapisano',
'settings.common.status.saveFailed': 'Nie udało się zapisać',
'settings.common.badge.modified': 'Zmodyfikowano',
'settings.common.badge.new': 'Nowy',
'settings.common.field.description': 'Opis',
@@ -731,6 +761,8 @@ export const settingsDict = {
'settings.openchamber.desktopNetwork.field.keepAwakeDescription': 'Aby telefony nadal mogły otwierać tę aplikację. Ekran nadal może się wyłączyć.',
'settings.openchamber.desktopNetwork.field.warning': 'Ostrzeżenie: po włączeniu aplikacja jest dostępna dla każdego w tej samej sieci lokalnej.',
'settings.openchamber.desktopNetwork.field.passwordRequiredWarning': 'Dostęp LAN wymaga hasła UI pulpitu. Dopóki go nie ustawisz, aplikacja pulpitu uruchamia się tylko lokalnie.',
'settings.openchamber.desktopPassword.actions.showPassword': 'Pokaż hasło',
'settings.openchamber.desktopPassword.actions.hidePassword': 'Ukryj hasło',
'settings.openchamber.desktopPassword.field.password': 'Hasło UI pulpitu',
'settings.openchamber.desktopPassword.field.passwordPlaceholder': 'Hasło nie jest wymagane',
'settings.openchamber.desktopPassword.field.passwordDescription': 'OpenChamber pyta po restarcie, a potem po wygaśnięciu sesji logowania: po 12 godzinach albo po 7 dniach z opcją Zaufaj temu urządzeniu. Zostaw puste, aby wyłączyć logowanie.',
@@ -915,7 +947,7 @@ export const settingsDict = {
'settings.openchamber.tunnel.state.noExpiry': 'Bez wygaśnięcia',
'settings.openchamber.tunnel.state.revoked': 'Unieważniony',
'settings.openchamber.tunnel.state.tunnelReady': 'Tunel gotowy',
'settings.openchamber.tunnel.title': 'Zdalny Tunel',
'settings.openchamber.tunnel.title': 'Tunel zewnętrzny',
'settings.openchamber.tunnel.toast.addManagedRemoteTokenBeforeStarting': 'Dodaj token tunelu managed remote przed uruchomieniem',
'settings.openchamber.tunnel.toast.checkAvailabilityFailed': 'Nie udało się sprawdzić dostępności tunelu',
'settings.openchamber.tunnel.toast.connectLinkCopied': 'Link połączenia został skopiowany',
@@ -1090,8 +1122,11 @@ export const settingsDict = {
'settings.openchamber.visual.option.pwaOrientation.system.description': 'Uwzględniaj ustawienie obrotu urządzenia.',
'settings.openchamber.visual.option.pwaOrientation.system.label': 'Zgodnie z systemem',
'settings.openchamber.visual.option.themeMode.dark': 'Ciemny',
'settings.openchamber.visual.option.themeMode.dark.description': 'Zawsze używaj ciemnego wyglądu',
'settings.openchamber.visual.option.themeMode.light': 'Jasny',
'settings.openchamber.visual.option.themeMode.light.description': 'Zawsze używaj jasnego wyglądu',
'settings.openchamber.visual.option.themeMode.system': 'Systemowy',
'settings.openchamber.visual.option.themeMode.system.description': 'Zgodnie z ustawieniem systemu',
'settings.openchamber.visual.option.timeFormat.12h.description': 'Pokazuj czas jako 02:15 PM.',
'settings.openchamber.visual.option.timeFormat.12h.label': '12-godzinny',
'settings.openchamber.visual.option.timeFormat.24h.description': 'Pokazuj czas jako 14:15.',
@@ -1111,7 +1146,11 @@ export const settingsDict = {
'settings.openchamber.visual.section.activityDefaultAria': 'Domyślny tryb aktywności',
'settings.openchamber.visual.section.chatRenderMode': 'Tryb renderowania czatu',
'settings.openchamber.visual.section.chatRenderModeAria': 'Tryb renderowania czatu',
'settings.openchamber.visual.section.chatDisplay': 'Wyświetlanie',
'settings.openchamber.visual.section.chatMessageOptions': 'Opcje wiadomości',
'settings.openchamber.visual.section.chatFeatures': 'Funkcje',
'settings.openchamber.visual.section.colorMode': 'Tryb kolorów',
'settings.openchamber.visual.section.colorModeAndTheme': 'Tryb kolorów i motyw',
'settings.openchamber.visual.section.mobileLayout': 'Układ mobilny',
'settings.openchamber.visual.option.mobileLayout.default': 'Poprzedni',
'settings.openchamber.visual.option.mobileLayout.new': 'Nowy',
@@ -1123,13 +1162,15 @@ export const settingsDict = {
'settings.openchamber.visual.section.messageStreamTransport': 'Transport strumienia wiadomości',
'settings.openchamber.visual.section.navigation': 'Nawigacja',
'settings.openchamber.visual.section.privacy': 'Prywatność',
'settings.openchamber.visual.section.showToolsOpenedByDefault': 'Pokaż narzędzia domyślnie otwarte:',
'settings.openchamber.visual.section.showToolsOpenedByDefault': 'Pokaż narzędzia domyślnie otwarte',
'settings.openchamber.visual.section.sessionAssistance': 'Wsparcie sesji',
'settings.openchamber.visual.section.reasoning': 'Rozumowanie',
'settings.openchamber.visual.section.messageAppearance': 'Wygląd wiadomości',
'settings.openchamber.visual.section.toolsAndFiles': 'Narzędzia i pliki',
'settings.openchamber.visual.section.composer': 'Pole wiadomości',
'settings.openchamber.visual.section.spacingAndLayout': 'Odstępy i układ',
'settings.openchamber.visual.section.densityAndType': 'Gęstość i typografia',
'settings.openchamber.visual.section.appInstall': 'Instalacja aplikacji',
'settings.openchamber.visual.section.userMessageRendering': 'Renderowanie wiadomości użytkownika',
'settings.openchamber.visual.section.userMessageRenderingAria': 'Tryb renderowania wiadomości użytkownika',
'settings.openchamber.worktrees.list.deleteWorktreeAria': 'Usuń worktree {name}',
@@ -1152,22 +1193,31 @@ export const settingsDict = {
'settings.openchamber.worktrees.state.selectProject': 'Wybierz projekt, aby zarządzać worktree.',
'settings.page.agents.title': 'Agenci',
'settings.page.appearance.title': 'Wygląd',
'settings.page.appearance.description': 'Dostosuj wygląd i odczucie OpenChamber.',
'settings.page.behavior.title': 'Zachowanie',
'settings.page.behavior.description': 'Kieruj sposobem, w jaki agent odpowiada.',
'settings.page.chat.title': 'Czat',
'settings.page.chat.description': 'Skonfiguruj sposób wyświetlania wiadomości i narzędzi.',
'settings.page.commands.title': 'Polecenia',
'settings.page.git.title': 'Git',
'settings.page.magicPrompts.title': 'Magiczne Prompty',
'settings.page.mcp.title': 'MCP',
'settings.page.plugins.title': 'Plugins',
'settings.page.notifications.title': 'Powiadomienia',
'settings.page.notifications.description': 'Wybierz, kiedy i jak otrzymywać powiadomienia.',
'settings.page.projects.title': 'Projekty',
'settings.page.providers.title': 'Dostawcy',
'settings.page.remoteInstances.title': 'Zdalne instancje',
'settings.page.general.title': 'Ogólne',
'settings.page.general.description': 'Uruchamianie aplikacji, bezpieczeństwo, połączenie i prywatność.',
'settings.page.sessions.title': 'Sesje',
'settings.page.sessions.description': 'Ustaw wartości domyślne i retencję sesji.',
'settings.page.shortcuts.title': 'Skróty',
'settings.page.shortcuts.description': 'Dostosuj skróty klawiszowe.',
'settings.page.skills.title': 'Umiejętności',
'settings.page.skillsCatalog.title': 'Katalog umiejętności',
'settings.page.tunnel.title': 'Zdalny Tunel',
'settings.page.tunnel.title': 'Tunel zewnętrzny',
'settings.page.tunnel.description': 'Udostępnij tę instancję przez zdalny tunel.',
'settings.page.about.title': 'O aplikacji',
'settings.page.snippets.title': 'Fragmenty',
'settings.snippets.sidebar.title': 'Fragmenty',
@@ -1227,6 +1277,7 @@ export const settingsDict = {
'settings.promptTemplates.page.toast.saveUnexpectedError': 'Wystąpił nieoczekiwany błąd podczas zapisywania',
'settings.page.usage.title': 'Użycie',
'settings.page.voice.title': 'Głos',
'settings.page.voice.description': 'Skonfiguruj mowę i dyktowanie.',
'settings.projects.actions.actions.add': 'Dodaj akcję',
'settings.projects.actions.actions.save': 'Zapisz akcje',
'settings.projects.actions.description': 'Polecenia dla projektu wyświetlane w nagłówku obok nazwy projektu.',
@@ -1841,6 +1892,10 @@ export const settingsDict = {
'settings.view.search.aria': 'Szukaj ustawień',
'settings.view.search.clear': 'Wyczyść wyszukiwanie ustawień',
'settings.view.search.noResults': 'Brak pasujących ustawień',
'settings.view.nav.group.general': 'OpenChamber',
'settings.view.nav.group.projects': 'Przestrzeń robocza',
'settings.view.nav.group.opencode': 'OpenCode',
'settings.view.nav.group.content': 'Biblioteka',
'settings.view.badge.beta': 'beta',
'settings.view.home.cards.agents.description': 'Prompty, narzędzia, uprawnienia',
'settings.view.home.cards.agents.title': 'Agenci',
@@ -1899,6 +1954,7 @@ export const settingsDict = {
'settings.voice.page.preview.customServerLine': 'Cześć! To jest podgląd własnego serwera TTS.',
'settings.voice.page.preview.voiceLine': 'Cześć! Jestem {voiceName}. Tak brzmi mój głos.',
'settings.voice.page.provider.browser': 'Przeglądarka',
'settings.voice.page.provider.openai': 'OpenAI',
'settings.voice.page.provider.custom': 'Własny',
'settings.voice.page.provider.say': 'Say',
'settings.voice.page.provider.server': 'Serwer',
@@ -47,6 +47,10 @@ export const settingsDict = {
"settings.view.search.aria": "Buscar configurações",
"settings.view.search.clear": "Limpar busca de configurações",
"settings.view.search.noResults": "Nenhuma configuração encontrada",
"settings.view.nav.group.general": "OpenChamber",
"settings.view.nav.group.projects": "Espaço de trabalho",
"settings.view.nav.group.opencode": "OpenCode",
"settings.view.nav.group.content": "Biblioteca",
"settings.page.projects.title": "Projetos",
"settings.page.remoteInstances.title": "Instâncias remotas",
"settings.page.providers.title": "Provedores",
@@ -59,13 +63,22 @@ export const settingsDict = {
"settings.page.skillsCatalog.title": "Catálogo de habilidades",
"settings.page.git.title": "Git",
"settings.page.appearance.title": "Aparência",
"settings.page.appearance.description": "Personalize a aparência e a sensação do OpenChamber.",
"settings.page.chat.title": "Chat",
"settings.page.chat.description": "Configure como as mensagens e as ferramentas são exibidas.",
"settings.page.shortcuts.title": "Atalhos",
"settings.page.shortcuts.description": "Personalize os atalhos de teclado.",
"settings.page.general.title": "Geral",
"settings.page.general.description": "Inicialização do aplicativo, segurança, conexão e privacidade.",
"settings.page.sessions.title": "Sessões",
"settings.page.sessions.description": "Defina padrões e retenção das sessões.",
"settings.page.magicPrompts.title": "Prompts mágicos",
"settings.page.notifications.title": "Notificações",
"settings.page.notifications.description": "Escolha quando e como receber notificações.",
"settings.page.voice.title": "Voz",
"settings.page.tunnel.title": "Túnel remoto",
"settings.page.voice.description": "Configure fala e ditado.",
"settings.page.tunnel.title": "Túnel externo",
"settings.page.tunnel.description": "Exponha esta instância por um túnel remoto.",
"settings.page.about.title": "Sobre",
"settings.page.snippets.title": "Snippets",
"settings.snippets.sidebar.title": "Snippets",
@@ -90,7 +103,7 @@ export const settingsDict = {
"settings.snippets.page.toast.contentRequired": "O conteúdo do snippet é obrigatório",
"settings.snippets.page.toast.saveFailed": "Falha ao salvar snippet",
"settings.snippets.page.toast.saved": "Snippet salvo",
"settings.openchamber.tunnel.title": "Túnel remoto",
"settings.openchamber.tunnel.title": "Túnel externo",
"settings.openchamber.tunnel.description": "Configure acesso remoto seguro com links rápidos ou com seu próprio túnel gerenciado da Cloudflare.",
"settings.openchamber.tunnel.note.serverSideEnforced": "O acesso seguro ao túnel é aplicado no servidor.",
"settings.openchamber.tunnel.note.connectLinksOneTime": "Os links de conexão são de uso único: eles são revogados quando o túnel para ou quando o TTL do link expira.",
@@ -366,6 +379,7 @@ export const settingsDict = {
"settings.remoteInstances.page.logsDialog.selectedInstanceFallback": "Instância selecionada",
"settings.remoteInstances.page.patternDialog.descriptionWithHost": "{host} exige um destino concreto.",
"settings.remoteInstances.page.patternDialog.description": "Digite destino.",
"settings.common.infoAria": "Mais informações",
"settings.common.actions.cancel": "Cancelar",
"settings.common.actions.create": "Criar",
"settings.common.actions.delete": "Excluir",
@@ -376,6 +390,8 @@ export const settingsDict = {
"settings.common.actions.copyAll": "Copiar tudo",
"settings.common.actions.clear": "Limpar",
"settings.common.actions.saving": "Salvando...",
'settings.common.status.saved': 'Salvo',
'settings.common.status.saveFailed': 'Falha ao salvar',
"settings.common.actions.saveChanges": "Salvar alterações",
"settings.common.scope.global": "Global",
"settings.common.scope.project": "Projeto",
@@ -460,6 +476,33 @@ export const settingsDict = {
"settings.agents.page.section.identityRole": "Identidade e função",
"settings.agents.page.section.modelParameters": "Modelo e parâmetros",
"settings.agents.page.section.systemPrompt": "Prompt do sistema",
"settings.agents.page.permissionsEditor.sectionInfo": "Edita as regras de permissão do próprio agente exatamente como estão salvas na config. “Herdar” deixa a chave sem definição — valem a config global e os padrões.",
"settings.agents.page.permissionsEditor.defaultLabel": "Padrão para todas as ferramentas",
"settings.agents.page.permissionsEditor.defaultAria": "Permissão padrão para todas as ferramentas",
"settings.agents.page.permissionsEditor.defaultInfo": "O fallback no nível do agente (a chave *). Vale para ferramentas sem regra própria.",
"settings.agents.page.permissionsEditor.effectiveHint": "→ {action}",
"settings.agents.page.permissionsEditor.ruleCount": "{count} regras",
"settings.agents.page.permissionsEditor.keyAria": "Permissão para {key}",
"settings.agents.page.permissionsEditor.patternPlaceholder": "Padrão, ex.: rm -rf * ou /path/**",
"settings.agents.page.permissionsEditor.patternActionAria": "Ação para o padrão de {key}",
"settings.agents.page.permissionsEditor.customKeyPlaceholder": "Chave de permissão personalizada…",
"settings.agents.page.permissionsEditor.sessionRulesTitle": "Concedidas na sessão (não salvas)",
"settings.agents.page.permissionsEditor.sessionRulesInfo": "Regras concedidas em sessões ao vivo (respostas “sempre permitir”). Valem agora, mas não fazem parte da config salva e somem ao reiniciar.",
"settings.agents.page.permissionsEditor.action.default": "Padrão",
"settings.agents.page.permissionsEditor.action.inherit": "Herdar",
"settings.agents.page.permissionsEditor.action.allow": "Permitir",
"settings.agents.page.permissionsEditor.action.ask": "Perguntar",
"settings.agents.page.permissionsEditor.action.deny": "Negar",
"settings.agents.page.permissionsEditor.actions.save": "Salvar permissões",
"settings.agents.page.permissionsEditor.actions.discard": "Descartar",
"settings.agents.page.permissionsEditor.actions.addRule": "Adicionar regra",
"settings.agents.page.permissionsEditor.actions.addKey": "Adicionar chave",
"settings.agents.page.permissionsEditor.actions.removeRuleAria": "Remover regra",
"settings.agents.page.permissionsEditor.actions.retry": "Tentar novamente",
"settings.agents.page.permissionsEditor.state.loadFailed": "Não foi possível carregar a config de permissões do agente.",
"settings.agents.page.permissionsEditor.toast.saved": "Permissões salvas",
"settings.agents.page.permissionsEditor.toast.savedRestartRequired": "Permissões salvas — reinicie o servidor OpenCode para aplicar",
"settings.agents.page.permissionsEditor.toast.saveFailed": "Falha ao salvar as permissões",
"settings.agents.page.section.toolPermissions": "Permissões de ferramentas",
"settings.agents.page.field.agentName": "Nome do agente",
"settings.agents.page.field.agentNamePlaceholder": "nome-agente",
@@ -495,6 +538,7 @@ export const settingsDict = {
"settings.agents.page.permissions.permissionPlaceholder": "Permissão...",
"settings.agents.page.permissions.patternPlaceholder": "Padrão (ex.: *)",
"settings.page.behavior.title": "Comportamento",
"settings.page.behavior.description": "Oriente como o agente responde.",
"settings.behavior.page.title": "Comportamento",
"settings.behavior.page.warning.title": "Regras globais são combinadas com regras do projeto",
"settings.behavior.page.warning.description": "As alterações feitas aqui atualizam {path}. O OpenCode também inclui qualquer AGENTS.md a nível de projeto quando existir.",
@@ -880,6 +924,8 @@ export const settingsDict = {
"settings.openchamber.desktopNetwork.field.allowLanAccessDescription": "Reinicia o aplicativo para que os telefones, tablets e outros computadores em seu Wi-Fi possam abri-lo.",
"settings.openchamber.desktopNetwork.field.warning": "Aviso: enquanto estiver habilitado, o aplicativo ficará acessível a qualquer pessoa na mesma rede local.",
"settings.openchamber.desktopNetwork.field.passwordRequiredWarning": "O acesso LAN exige uma senha da UI do desktop. Até configurar uma, o app de desktop inicia apenas localmente.",
"settings.openchamber.desktopPassword.actions.showPassword": "Mostrar senha",
"settings.openchamber.desktopPassword.actions.hidePassword": "Ocultar senha",
"settings.openchamber.desktopPassword.field.password": "Senha da UI do desktop",
"settings.openchamber.desktopPassword.field.passwordPlaceholder": "Nenhuma senha obrigatória",
"settings.openchamber.desktopPassword.field.passwordDescription": "O OpenChamber pede após reiniciar e depois quando a sessão expira: em 12 horas, ou 7 dias com Confiar neste dispositivo. Deixe vazio para desativar o login.",
@@ -1585,6 +1631,7 @@ export const settingsDict = {
"settings.voice.page.section.playbackAndSummary": "Reprodução",
"settings.voice.page.field.provider": "Provedor",
"settings.voice.page.provider.browser": "Navegador",
"settings.voice.page.provider.openai": "OpenAI",
"settings.voice.page.provider.custom": "Personalizado",
"settings.voice.page.provider.say": "Falar",
"settings.voice.page.provider.server": "Servidor",
@@ -1664,18 +1711,24 @@ export const settingsDict = {
"settings.voice.page.field.ttsInputModeRaw": "Markdown bruto",
"settings.voice.page.field.ttsInputModeSummarized": "resumido",
"settings.openchamber.visual.section.colorMode": "Modo de cor",
"settings.openchamber.visual.section.colorModeAndTheme": "Modo de cor e tema",
"settings.openchamber.visual.section.mobileLayout": "Layout móvel",
"settings.openchamber.visual.option.mobileLayout.default": "Anterior",
"settings.openchamber.visual.option.mobileLayout.new": "Novo",
"settings.openchamber.visual.section.localization": "Localização",
"settings.openchamber.visual.section.spacingAndLayout": "Espaçamento e layout",
"settings.openchamber.visual.section.densityAndType": "Densidade e tipografia",
"settings.openchamber.visual.section.appInstall": "Instalação do app",
"settings.openchamber.visual.section.navigation": "Navegação",
"settings.openchamber.visual.section.chatRenderMode": "Modo de renderizado de chat",
"settings.openchamber.visual.section.chatRenderModeAria": "Modo de renderizado de chat",
"settings.openchamber.visual.section.chatDisplay": "Exibição",
"settings.openchamber.visual.section.chatMessageOptions": "Opções de mensagem",
"settings.openchamber.visual.section.chatFeatures": "Recursos",
"settings.openchamber.visual.section.messageStreamTransport": "Transporte do fluxo de mensagens",
"settings.openchamber.visual.section.activityDefault": "Modo padrão de atividade",
"settings.openchamber.visual.section.activityDefaultAria": "Modo padrão de atividade",
"settings.openchamber.visual.section.showToolsOpenedByDefault": "Mostrar ferramentas abertas por padrão:",
"settings.openchamber.visual.section.showToolsOpenedByDefault": "Mostrar ferramentas abertas por padrão",
"settings.openchamber.visual.section.sessionAssistance": "Assistência da sessão",
"settings.openchamber.visual.section.reasoning": "Raciocínio",
"settings.openchamber.visual.section.messageAppearance": "Aparência das mensagens",
@@ -1806,8 +1859,11 @@ export const settingsDict = {
"settings.openchamber.visual.field.sendAnonymousUsageReports": "Enviar relatórios anônimos de uso",
"settings.openchamber.visual.field.sendAnonymousUsageReportsHint": "Ajuda-nos a entender quais versões do aplicativo são usadas ativamente para priorizar melhorias. Coletamos apenas a versão do aplicativo, a plataforma e o ambiente de execução; não coletamos dados pessoais nem código.",
"settings.openchamber.visual.option.themeMode.system": "Sistema",
"settings.openchamber.visual.option.themeMode.system.description": "Seguir configuração do sistema",
"settings.openchamber.visual.option.themeMode.light": "Claro",
"settings.openchamber.visual.option.themeMode.light.description": "Sempre usar aparência clara",
"settings.openchamber.visual.option.themeMode.dark": "Escuro",
"settings.openchamber.visual.option.themeMode.dark.description": "Sempre usar aparência escura",
"settings.openchamber.visual.option.diffLayout.dynamic.label": "Dinâmico",
"settings.openchamber.visual.option.diffLayout.dynamic.description": "Novo em linha, modificado lado a lado.",
"settings.openchamber.visual.option.diffLayout.inline.label": "Sempre em linha",
@@ -47,6 +47,10 @@ export const settingsDict = {
"settings.view.search.aria": "Пошук налаштувань",
"settings.view.search.clear": "Очистити пошук налаштувань",
"settings.view.search.noResults": "Нічого не знайдено",
"settings.view.nav.group.general": "OpenChamber",
"settings.view.nav.group.projects": "Робочий простір",
"settings.view.nav.group.opencode": "OpenCode",
"settings.view.nav.group.content": "Бібліотека",
"settings.page.projects.title": "Проєкти",
"settings.page.remoteInstances.title": "Віддалені інстанси",
"settings.page.providers.title": "Провайдери",
@@ -59,13 +63,22 @@ export const settingsDict = {
"settings.page.skillsCatalog.title": "Каталог навичок",
"settings.page.git.title": "Git",
"settings.page.appearance.title": "Зовнішній вигляд",
"settings.page.appearance.description": "Налаштуйте вигляд і відчуття OpenChamber.",
"settings.page.chat.title": "Чат",
"settings.page.chat.description": "Налаштуйте відображення повідомлень і інструментів.",
"settings.page.shortcuts.title": "Гарячі клавіші",
"settings.page.shortcuts.description": "Налаштуйте комбінації клавіш.",
"settings.page.general.title": "Загальні",
"settings.page.general.description": "Запуск застосунку, безпека, з'єднання та приватність.",
"settings.page.sessions.title": "Сесії",
"settings.page.sessions.description": "Встановіть значення за замовчуванням і зберігання сесій.",
"settings.page.magicPrompts.title": "Магічні промпти",
"settings.page.notifications.title": "Сповіщення",
"settings.page.notifications.description": "Оберіть, коли і як отримувати сповіщення.",
"settings.page.voice.title": "Голос",
"settings.page.tunnel.title": "Віддалений тунель",
"settings.page.voice.description": "Налаштуйте мовлення та диктування.",
"settings.page.tunnel.title": "Зовнішній тунель",
"settings.page.tunnel.description": "Відкрийте цей екземпляр через віддалений тунель.",
"settings.page.about.title": "Про застосунок",
"settings.page.snippets.title": "Сніпети",
"settings.snippets.sidebar.title": "Сніпети",
@@ -90,7 +103,7 @@ export const settingsDict = {
"settings.snippets.page.toast.contentRequired": "Вміст сніпета обов'язковий",
"settings.snippets.page.toast.saveFailed": "Не вдалося зберегти сніпет",
"settings.snippets.page.toast.saved": "Сніпет збережено",
"settings.openchamber.tunnel.title": "Віддалений тунель",
"settings.openchamber.tunnel.title": "Зовнішній тунель",
"settings.openchamber.tunnel.description": "Налаштуйте безпечний віддалений доступ за допомогою швидких посилань або власного керованого тунелю Cloudflare.",
"settings.openchamber.tunnel.note.serverSideEnforced": "Безпечний доступ до тунелю забезпечується на стороні сервера.",
"settings.openchamber.tunnel.note.connectLinksOneTime": "Посилання для підключення одноразові: вони відкликаються, коли тунель зупиняється або минає TTL посилання.",
@@ -366,6 +379,7 @@ export const settingsDict = {
"settings.remoteInstances.page.logsDialog.selectedInstanceFallback": "Вибраний інстанс",
"settings.remoteInstances.page.patternDialog.descriptionWithHost": "Для {host} потрібно вказати конкретне призначення.",
"settings.remoteInstances.page.patternDialog.description": "Введіть призначення.",
"settings.common.infoAria": "Докладніше",
"settings.common.actions.cancel": "Скасувати",
"settings.common.actions.create": "Створити",
"settings.common.actions.delete": "Видалити",
@@ -376,6 +390,8 @@ export const settingsDict = {
"settings.common.actions.copyAll": "Копіювати все",
"settings.common.actions.clear": "Очистити",
"settings.common.actions.saving": "Збереження...",
'settings.common.status.saved': 'Збережено',
'settings.common.status.saveFailed': 'Не вдалося зберегти',
"settings.common.actions.saveChanges": "Зберегти зміни",
"settings.common.scope.global": "Глобальний",
"settings.common.scope.project": "Проєкт",
@@ -460,6 +476,33 @@ export const settingsDict = {
"settings.agents.page.section.identityRole": "Ідентичність і роль",
"settings.agents.page.section.modelParameters": "Модель і параметри",
"settings.agents.page.section.systemPrompt": "Системний промпт",
"settings.agents.page.permissionsEditor.sectionInfo": "Редагує власні правила доступу цього агента рівно так, як вони збережені в його конфігу. «Успадкувати» лишає ключ незаданим — діють глобальний конфіг і дефолти.",
"settings.agents.page.permissionsEditor.defaultLabel": "Дефолт для всіх інструментів",
"settings.agents.page.permissionsEditor.defaultAria": "Дефолтний дозвіл для всіх інструментів",
"settings.agents.page.permissionsEditor.defaultInfo": "Фолбек рівня агента (ключ *). Діє для інструментів без власного правила.",
"settings.agents.page.permissionsEditor.effectiveHint": "→ {action}",
"settings.agents.page.permissionsEditor.ruleCount": "{count} правил",
"settings.agents.page.permissionsEditor.keyAria": "Дозвіл для {key}",
"settings.agents.page.permissionsEditor.patternPlaceholder": "Патерн, напр. rm -rf * або /path/**",
"settings.agents.page.permissionsEditor.patternActionAria": "Дія для патерна {key}",
"settings.agents.page.permissionsEditor.customKeyPlaceholder": "Власний ключ дозволу…",
"settings.agents.page.permissionsEditor.sessionRulesTitle": "Надані в сесії (не збережені)",
"settings.agents.page.permissionsEditor.sessionRulesInfo": "Правила, надані під час живих сесій (відповіді «завжди дозволяти»). Вони діють зараз, але не є частиною збереженого конфігу і зникнуть після рестарту.",
"settings.agents.page.permissionsEditor.action.default": "Стандартно",
"settings.agents.page.permissionsEditor.action.inherit": "Успадкувати",
"settings.agents.page.permissionsEditor.action.allow": "Дозволити",
"settings.agents.page.permissionsEditor.action.ask": "Питати",
"settings.agents.page.permissionsEditor.action.deny": "Заборонити",
"settings.agents.page.permissionsEditor.actions.save": "Зберегти дозволи",
"settings.agents.page.permissionsEditor.actions.discard": "Скасувати",
"settings.agents.page.permissionsEditor.actions.addRule": "Додати правило",
"settings.agents.page.permissionsEditor.actions.addKey": "Додати ключ",
"settings.agents.page.permissionsEditor.actions.removeRuleAria": "Видалити правило",
"settings.agents.page.permissionsEditor.actions.retry": "Повторити",
"settings.agents.page.permissionsEditor.state.loadFailed": "Не вдалося завантажити конфіг дозволів агента.",
"settings.agents.page.permissionsEditor.toast.saved": "Дозволи збережено",
"settings.agents.page.permissionsEditor.toast.savedRestartRequired": "Дозволи збережено — перезапустіть сервер OpenCode, щоб застосувати",
"settings.agents.page.permissionsEditor.toast.saveFailed": "Не вдалося зберегти дозволи",
"settings.agents.page.section.toolPermissions": "Дозволи інструмента",
"settings.agents.page.field.agentName": "Ім'я агента",
"settings.agents.page.field.agentNamePlaceholder": "Ім’я агента",
@@ -495,6 +538,7 @@ export const settingsDict = {
"settings.agents.page.permissions.permissionPlaceholder": "Дозвіл...",
"settings.agents.page.permissions.patternPlaceholder": "Шаблон (наприклад, *)",
"settings.page.behavior.title": "Поведінка",
"settings.page.behavior.description": "Керуйте тим, як агент відповідає.",
"settings.behavior.page.title": "Поведінка",
"settings.behavior.page.warning.title": "Глобальні правила поєднуються з правилами проєкту",
"settings.behavior.page.warning.description": "Зміни тут оновлюють {path}. OpenCode також додає правила з AGENTS.md на рівні проєкту, якщо вони існують.",
@@ -880,6 +924,8 @@ export const settingsDict = {
"settings.openchamber.desktopNetwork.field.allowLanAccessDescription": "Перезапускає застосунок, щоб телефони, планшети та інші комп’ютери в мережі Wi-Fi могли його відкрити.",
"settings.openchamber.desktopNetwork.field.warning": "Попередження: якщо це ввімкнено, застосунок доступний усім у тій самій локальній мережі.",
"settings.openchamber.desktopNetwork.field.passwordRequiredWarning": "Для LAN-доступу потрібен пароль десктопного UI. Доки його не задано, десктопний застосунок запускається лише локально.",
"settings.openchamber.desktopPassword.actions.showPassword": "Показати пароль",
"settings.openchamber.desktopPassword.actions.hidePassword": "Приховати пароль",
"settings.openchamber.desktopPassword.field.password": "Пароль для десктопного UI",
"settings.openchamber.desktopPassword.field.passwordPlaceholder": "Пароль не потрібен",
"settings.openchamber.desktopPassword.field.passwordDescription": "OpenChamber попросить пароль після перезапуску, а потім коли сесія логіну спливе: через 12 годин або через 7 днів із «Довіряти цьому пристрою». Залиште порожнім, щоб вимкнути логін.",
@@ -1585,6 +1631,7 @@ export const settingsDict = {
"settings.voice.page.section.playbackAndSummary": "Відтворення",
"settings.voice.page.field.provider": "Провайдер",
"settings.voice.page.provider.browser": "Браузер",
"settings.voice.page.provider.openai": "OpenAI",
"settings.voice.page.provider.custom": "Власний",
"settings.voice.page.provider.say": "Say",
"settings.voice.page.provider.server": "Сервер",
@@ -1664,18 +1711,24 @@ export const settingsDict = {
"settings.voice.page.field.ttsInputModeRaw": "Сирий Markdown",
"settings.voice.page.field.ttsInputModeSummarized": "скорочений",
"settings.openchamber.visual.section.colorMode": "Режим теми",
"settings.openchamber.visual.section.colorModeAndTheme": "Режим кольору та тема",
"settings.openchamber.visual.section.mobileLayout": "Мобільний макет",
"settings.openchamber.visual.option.mobileLayout.default": "Попередній",
"settings.openchamber.visual.option.mobileLayout.new": "Новий",
"settings.openchamber.visual.section.localization": "Локалізація",
"settings.openchamber.visual.section.spacingAndLayout": "Відступи й компонування",
"settings.openchamber.visual.section.densityAndType": "Щільність і шрифти",
"settings.openchamber.visual.section.appInstall": "Встановлення застосунку",
"settings.openchamber.visual.section.navigation": "Навігація",
"settings.openchamber.visual.section.chatRenderMode": "Режим візуалізації чату",
"settings.openchamber.visual.section.chatRenderModeAria": "Режим візуалізації чату",
"settings.openchamber.visual.section.chatDisplay": "Відображення",
"settings.openchamber.visual.section.chatMessageOptions": "Параметри повідомлень",
"settings.openchamber.visual.section.chatFeatures": "Функції",
"settings.openchamber.visual.section.messageStreamTransport": "Транспорт потокових повідомлень",
"settings.openchamber.visual.section.activityDefault": "Активність за замовчуванням",
"settings.openchamber.visual.section.activityDefaultAria": "Режим активності за замовчуванням",
"settings.openchamber.visual.section.showToolsOpenedByDefault": "Показувати інструменти відкритими за замовчуванням:",
"settings.openchamber.visual.section.showToolsOpenedByDefault": "Показувати інструменти відкритими за замовчуванням",
"settings.openchamber.visual.section.sessionAssistance": "Допомога із сесією",
"settings.openchamber.visual.section.reasoning": "Міркування",
"settings.openchamber.visual.section.messageAppearance": "Вигляд повідомлень",
@@ -1806,8 +1859,11 @@ export const settingsDict = {
"settings.openchamber.visual.field.sendAnonymousUsageReports": "Надсилати анонімні звіти про використання",
"settings.openchamber.visual.field.sendAnonymousUsageReportsHint": "Допомагає нам зрозуміти, які версії застосунків активно використовуються, щоб ми могли визначити пріоритети покращень. Збираються лише версія застосунку, платформа та середовище виконання – без особистих даних чи коду.",
"settings.openchamber.visual.option.themeMode.system": "Системна",
"settings.openchamber.visual.option.themeMode.system.description": "Дотримуватися системних налаштувань",
"settings.openchamber.visual.option.themeMode.light": "Світла",
"settings.openchamber.visual.option.themeMode.light.description": "Завжди використовувати світлий вигляд",
"settings.openchamber.visual.option.themeMode.dark": "Темна",
"settings.openchamber.visual.option.themeMode.dark.description": "Завжди використовувати темний вигляд",
"settings.openchamber.visual.option.diffLayout.dynamic.label": "Динамічний",
"settings.openchamber.visual.option.diffLayout.dynamic.description": "Нові файли показуються inline, змінені — поруч.",
"settings.openchamber.visual.option.diffLayout.inline.label": "Завжди inline",
@@ -47,6 +47,10 @@ export const settingsDict = {
'settings.view.search.aria': '搜索设置',
'settings.view.search.clear': '清除设置搜索',
'settings.view.search.noResults': '没有匹配的设置',
'settings.view.nav.group.general': 'OpenChamber',
'settings.view.nav.group.projects': '工作区',
'settings.view.nav.group.opencode': 'OpenCode',
'settings.view.nav.group.content': '资源库',
'settings.page.projects.title': '项目',
'settings.page.remoteInstances.title': '远程实例',
'settings.page.providers.title': '提供商',
@@ -59,13 +63,22 @@ export const settingsDict = {
'settings.page.skillsCatalog.title': '技能目录',
'settings.page.git.title': 'Git',
'settings.page.appearance.title': '外观',
'settings.page.appearance.description': '自定义 OpenChamber 的外观与体验。',
'settings.page.chat.title': '聊天',
'settings.page.chat.description': '配置消息和工具的显示方式。',
'settings.page.shortcuts.title': '快捷键',
'settings.page.shortcuts.description': '自定义键盘快捷键。',
'settings.page.general.title': '通用',
'settings.page.general.description': '应用启动、安全、连接与隐私。',
'settings.page.sessions.title': '会话',
'settings.page.sessions.description': '设置会话的默认值和保留策略。',
'settings.page.magicPrompts.title': '魔法提示词',
'settings.page.notifications.title': '通知',
'settings.page.notifications.description': '选择何时以及如何接收通知。',
'settings.page.voice.title': '语音',
'settings.page.tunnel.title': '远程隧道',
'settings.page.voice.description': '配置语音朗读与听写。',
'settings.page.tunnel.title': '外部隧道',
'settings.page.tunnel.description': '通过远程隧道公开此实例。',
'settings.page.about.title': '关于',
'settings.page.snippets.title': '代码片段',
'settings.snippets.sidebar.title': '代码片段',
@@ -90,7 +103,7 @@ export const settingsDict = {
'settings.snippets.page.toast.contentRequired': '代码片段内容为必填项',
'settings.snippets.page.toast.saveFailed': '保存代码片段失败',
'settings.snippets.page.toast.saved': '代码片段已保存',
'settings.openchamber.tunnel.title': '远程隧道',
'settings.openchamber.tunnel.title': '外部隧道',
'settings.openchamber.tunnel.description': '通过快速链接或你自己的 Cloudflare Managed Remote 隧道配置安全远程访问。',
'settings.openchamber.tunnel.note.serverSideEnforced': '安全隧道访问在服务端强制执行。',
'settings.openchamber.tunnel.note.connectLinksOneTime': '连接链接为一次性,隧道停止或连接链接 TTL 到期后会被吊销。',
@@ -366,6 +379,7 @@ export const settingsDict = {
'settings.remoteInstances.page.logsDialog.selectedInstanceFallback': '所选实例',
'settings.remoteInstances.page.patternDialog.descriptionWithHost': '{host} 需要一个具体目标地址。',
'settings.remoteInstances.page.patternDialog.description': '输入目标地址。',
'settings.common.infoAria': '更多信息',
'settings.common.actions.cancel': '取消',
'settings.common.actions.create': '创建',
'settings.common.actions.delete': '删除',
@@ -376,6 +390,8 @@ export const settingsDict = {
'settings.common.actions.copyAll': '全部复制',
'settings.common.actions.clear': '清除',
'settings.common.actions.saving': '保存中...',
'settings.common.status.saved': '已保存',
'settings.common.status.saveFailed': '保存失败',
'settings.common.actions.saveChanges': '保存更改',
'settings.common.scope.global': '全局',
'settings.common.scope.project': '项目',
@@ -460,6 +476,33 @@ export const settingsDict = {
'settings.agents.page.section.identityRole': '身份与角色',
'settings.agents.page.section.modelParameters': '模型与参数',
'settings.agents.page.section.systemPrompt': '系统提示词',
'settings.agents.page.permissionsEditor.sectionInfo': '按配置文件中保存的原样编辑此代理自身的权限规则。“继承”表示不设置该键,将应用全局配置和默认值。',
'settings.agents.page.permissionsEditor.defaultLabel': '所有工具的默认值',
'settings.agents.page.permissionsEditor.defaultAria': '所有工具的默认权限',
'settings.agents.page.permissionsEditor.defaultInfo': '代理级别的回退(* 键),适用于没有单独规则的工具。',
'settings.agents.page.permissionsEditor.effectiveHint': '→ {action}',
'settings.agents.page.permissionsEditor.ruleCount': '{count} 条规则',
'settings.agents.page.permissionsEditor.keyAria': '{key} 的权限',
'settings.agents.page.permissionsEditor.patternPlaceholder': '模式,例如 rm -rf * 或 /path/**',
'settings.agents.page.permissionsEditor.patternActionAria': '{key} 模式的操作',
'settings.agents.page.permissionsEditor.customKeyPlaceholder': '自定义权限键…',
'settings.agents.page.permissionsEditor.sessionRulesTitle': '会话中授予(未保存)',
'settings.agents.page.permissionsEditor.sessionRulesInfo': '在会话中授予的规则(如“始终允许”的回答)。当前生效,但不属于已保存的配置,重启后消失。',
'settings.agents.page.permissionsEditor.action.default': '默认',
'settings.agents.page.permissionsEditor.action.inherit': '继承',
'settings.agents.page.permissionsEditor.action.allow': '允许',
'settings.agents.page.permissionsEditor.action.ask': '询问',
'settings.agents.page.permissionsEditor.action.deny': '拒绝',
'settings.agents.page.permissionsEditor.actions.save': '保存权限',
'settings.agents.page.permissionsEditor.actions.discard': '放弃',
'settings.agents.page.permissionsEditor.actions.addRule': '添加规则',
'settings.agents.page.permissionsEditor.actions.addKey': '添加键',
'settings.agents.page.permissionsEditor.actions.removeRuleAria': '删除规则',
'settings.agents.page.permissionsEditor.actions.retry': '重试',
'settings.agents.page.permissionsEditor.state.loadFailed': '无法加载代理的权限配置。',
'settings.agents.page.permissionsEditor.toast.saved': '权限已保存',
'settings.agents.page.permissionsEditor.toast.savedRestartRequired': '权限已保存 — 重启 OpenCode 服务器后生效',
'settings.agents.page.permissionsEditor.toast.saveFailed': '保存权限失败',
'settings.agents.page.section.toolPermissions': '工具权限',
'settings.agents.page.field.agentName': '智能体名称',
'settings.agents.page.field.agentNamePlaceholder': 'agent-name',
@@ -495,6 +538,7 @@ export const settingsDict = {
'settings.agents.page.permissions.permissionPlaceholder': '权限...',
'settings.agents.page.permissions.patternPlaceholder': '模式(例如 *',
'settings.page.behavior.title': '行为',
'settings.page.behavior.description': '引导智能体的回复方式。',
'settings.behavior.page.title': '行为',
'settings.behavior.page.warning.title': '全局规则会与项目规则合并使用',
'settings.behavior.page.warning.description': '此处所做的更改会更新 {path}。当项目级 AGENTS.md 存在时,OpenCode 也会包含它。',
@@ -880,6 +924,8 @@ export const settingsDict = {
'settings.openchamber.desktopNetwork.field.allowLanAccessDescription': '会重启应用,以便手机、平板和同一 Wi‑Fi 下的其他电脑访问。',
'settings.openchamber.desktopNetwork.field.warning': '警告:启用后,同一本地网络中的任何人都可访问此应用。',
'settings.openchamber.desktopNetwork.field.passwordRequiredWarning': '局域网访问需要桌面 UI 密码。在设置密码之前,桌面应用只会以本机访问模式启动。',
'settings.openchamber.desktopPassword.actions.showPassword': '显示密码',
'settings.openchamber.desktopPassword.actions.hidePassword': '隐藏密码',
'settings.openchamber.desktopPassword.field.password': '桌面 UI 密码',
'settings.openchamber.desktopPassword.field.passwordPlaceholder': '不需要密码',
'settings.openchamber.desktopPassword.field.passwordDescription': 'OpenChamber 会在重启后要求输入密码,之后在登录会话过期时再次要求:12 小时后,或选择“信任此设备”后 7 天。留空可关闭登录。',
@@ -1585,6 +1631,7 @@ export const settingsDict = {
'settings.voice.page.section.playbackAndSummary': '播放',
'settings.voice.page.field.provider': '提供方',
'settings.voice.page.provider.browser': '浏览器',
'settings.voice.page.provider.openai': 'OpenAI',
'settings.voice.page.provider.custom': '自定义',
'settings.voice.page.provider.say': 'Say',
'settings.voice.page.provider.server': '服务器',
@@ -1664,18 +1711,24 @@ export const settingsDict = {
'settings.voice.page.field.ttsInputModeRaw': '原始 Markdown',
'settings.voice.page.field.ttsInputModeSummarized': '摘要',
'settings.openchamber.visual.section.colorMode': '颜色模式',
'settings.openchamber.visual.section.colorModeAndTheme': '颜色模式与主题',
'settings.openchamber.visual.section.mobileLayout': '移动端布局',
'settings.openchamber.visual.option.mobileLayout.default': '旧版',
'settings.openchamber.visual.option.mobileLayout.new': '新版',
'settings.openchamber.visual.section.localization': '本地化',
'settings.openchamber.visual.section.spacingAndLayout': '间距与布局',
'settings.openchamber.visual.section.densityAndType': '密度与字体',
'settings.openchamber.visual.section.appInstall': '应用安装',
'settings.openchamber.visual.section.navigation': '导航',
'settings.openchamber.visual.section.chatRenderMode': '聊天渲染模式',
'settings.openchamber.visual.section.chatRenderModeAria': '聊天渲染模式',
'settings.openchamber.visual.section.chatDisplay': '显示',
'settings.openchamber.visual.section.chatMessageOptions': '消息选项',
'settings.openchamber.visual.section.chatFeatures': '功能',
'settings.openchamber.visual.section.messageStreamTransport': '消息流传输方式',
'settings.openchamber.visual.section.activityDefault': '活动默认状态',
'settings.openchamber.visual.section.activityDefaultAria': '活动默认模式',
'settings.openchamber.visual.section.showToolsOpenedByDefault': '默认展开以下工具',
'settings.openchamber.visual.section.showToolsOpenedByDefault': '默认展开以下工具',
'settings.openchamber.visual.section.sessionAssistance': '会话辅助',
'settings.openchamber.visual.section.reasoning': '推理',
'settings.openchamber.visual.section.messageAppearance': '消息外观',
@@ -1806,8 +1859,11 @@ export const settingsDict = {
'settings.openchamber.visual.field.sendAnonymousUsageReports': '发送匿名使用报告',
'settings.openchamber.visual.field.sendAnonymousUsageReportsHint': '帮助我们了解哪些应用版本正在被积极使用,以便优先改进。仅收集应用版本、平台和运行时信息,不收集个人数据或代码。',
'settings.openchamber.visual.option.themeMode.system': '跟随系统',
'settings.openchamber.visual.option.themeMode.system.description': '跟随系统设置',
'settings.openchamber.visual.option.themeMode.light': '浅色',
'settings.openchamber.visual.option.themeMode.light.description': '始终使用浅色外观',
'settings.openchamber.visual.option.themeMode.dark': '深色',
'settings.openchamber.visual.option.themeMode.dark.description': '始终使用深色外观',
'settings.openchamber.visual.option.diffLayout.dynamic.label': '动态',
'settings.openchamber.visual.option.diffLayout.dynamic.description': '新增文件用行内视图,修改文件用并排视图。',
'settings.openchamber.visual.option.diffLayout.inline.label': '始终行内',
@@ -45,6 +45,10 @@
'settings.view.search.aria': '搜尋設定',
'settings.view.search.clear': '清除設定搜尋',
'settings.view.search.noResults': '沒有符合的設定',
'settings.view.nav.group.general': 'OpenChamber',
'settings.view.nav.group.projects': '工作區',
'settings.view.nav.group.opencode': 'OpenCode',
'settings.view.nav.group.content': '資源庫',
'settings.page.projects.title': '專案',
'settings.page.remoteInstances.title': '遠端執行個體',
'settings.page.providers.title': '供應商',
@@ -56,13 +60,22 @@
'settings.page.skillsCatalog.title': 'Skills 目錄',
'settings.page.git.title': 'Git',
'settings.page.appearance.title': '外觀',
'settings.page.appearance.description': '自訂 OpenChamber 的外觀與體驗。',
'settings.page.chat.title': '聊天',
'settings.page.chat.description': '設定訊息與工具的顯示方式。',
'settings.page.shortcuts.title': '快速鍵',
'settings.page.shortcuts.description': '自訂鍵盤快速鍵。',
'settings.page.general.title': '一般',
'settings.page.general.description': '應用程式啟動、安全性、連線與隱私。',
'settings.page.sessions.title': '工作階段',
'settings.page.sessions.description': '設定工作階段的預設值與保留期限。',
'settings.page.magicPrompts.title': '魔法提示詞',
'settings.page.notifications.title': '通知',
'settings.page.notifications.description': '選擇何時以及如何收到通知。',
'settings.page.voice.title': '語音',
'settings.page.tunnel.title': 'Remote Tunnel',
'settings.page.voice.description': '設定語音朗讀與聽寫。',
'settings.page.tunnel.title': '外部通道',
'settings.page.tunnel.description': '透過遠端通道公開此實例。',
'settings.page.about.title': '關於',
'settings.page.snippets.title': '程式片段',
'settings.snippets.sidebar.title': '程式片段',
@@ -87,7 +100,7 @@
'settings.snippets.page.toast.contentRequired': '程式片段內容為必填項',
'settings.snippets.page.toast.saveFailed': '保存程式片段失敗',
'settings.snippets.page.toast.saved': '程式片段已保存',
'settings.openchamber.tunnel.title': 'Remote Tunnel',
'settings.openchamber.tunnel.title': '外部通道',
'settings.openchamber.tunnel.description': '透過快速連結或你自己的 Cloudflare managed remote tunnel 設定安全遠端存取。',
'settings.openchamber.tunnel.note.serverSideEnforced': '安全通道存取由伺服器端強制執行。',
'settings.openchamber.tunnel.note.connectLinksOneTime': '連線連結為一次性,Tunnel 停止或連線連結 TTL 到期後會被撤銷。',
@@ -363,6 +376,7 @@
'settings.remoteInstances.page.logsDialog.selectedInstanceFallback': '所選執行個體',
'settings.remoteInstances.page.patternDialog.descriptionWithHost': '{host} 需要一個具體目標地址。',
'settings.remoteInstances.page.patternDialog.description': '輸入目標地址。',
'settings.common.infoAria': '更多資訊',
'settings.common.actions.cancel': '取消',
'settings.common.actions.create': '建立',
'settings.common.actions.delete': '刪除',
@@ -373,6 +387,8 @@
'settings.common.actions.copyAll': '全部複製',
'settings.common.actions.clear': '清除',
'settings.common.actions.saving': '儲存中...',
'settings.common.status.saved': '已儲存',
'settings.common.status.saveFailed': '儲存失敗',
'settings.common.actions.saveChanges': '儲存變更',
'settings.common.scope.global': '全域',
'settings.common.scope.project': '專案',
@@ -457,6 +473,33 @@
'settings.agents.page.section.identityRole': '身分與角色',
'settings.agents.page.section.modelParameters': '模型與參數',
'settings.agents.page.section.systemPrompt': '系統提示詞',
'settings.agents.page.permissionsEditor.sectionInfo': '按設定檔中儲存的原樣編輯此代理自身的權限規則。「繼承」表示不設定該鍵,將套用全域設定與預設值。',
'settings.agents.page.permissionsEditor.defaultLabel': '所有工具的預設值',
'settings.agents.page.permissionsEditor.defaultAria': '所有工具的預設權限',
'settings.agents.page.permissionsEditor.defaultInfo': '代理層級的後備(* 鍵),適用於沒有個別規則的工具。',
'settings.agents.page.permissionsEditor.effectiveHint': '→ {action}',
'settings.agents.page.permissionsEditor.ruleCount': '{count} 條規則',
'settings.agents.page.permissionsEditor.keyAria': '{key} 的權限',
'settings.agents.page.permissionsEditor.patternPlaceholder': '模式,例如 rm -rf * 或 /path/**',
'settings.agents.page.permissionsEditor.patternActionAria': '{key} 模式的動作',
'settings.agents.page.permissionsEditor.customKeyPlaceholder': '自訂權限鍵…',
'settings.agents.page.permissionsEditor.sessionRulesTitle': '工作階段中授予(未儲存)',
'settings.agents.page.permissionsEditor.sessionRulesInfo': '在工作階段中授予的規則(如「一律允許」的回答)。目前生效,但不屬於已儲存的設定,重新啟動後會消失。',
'settings.agents.page.permissionsEditor.action.default': '預設',
'settings.agents.page.permissionsEditor.action.inherit': '繼承',
'settings.agents.page.permissionsEditor.action.allow': '允許',
'settings.agents.page.permissionsEditor.action.ask': '詢問',
'settings.agents.page.permissionsEditor.action.deny': '拒絕',
'settings.agents.page.permissionsEditor.actions.save': '儲存權限',
'settings.agents.page.permissionsEditor.actions.discard': '放棄',
'settings.agents.page.permissionsEditor.actions.addRule': '新增規則',
'settings.agents.page.permissionsEditor.actions.addKey': '新增鍵',
'settings.agents.page.permissionsEditor.actions.removeRuleAria': '刪除規則',
'settings.agents.page.permissionsEditor.actions.retry': '重試',
'settings.agents.page.permissionsEditor.state.loadFailed': '無法載入代理的權限設定。',
'settings.agents.page.permissionsEditor.toast.saved': '權限已儲存',
'settings.agents.page.permissionsEditor.toast.savedRestartRequired': '權限已儲存 — 重新啟動 OpenCode 伺服器後生效',
'settings.agents.page.permissionsEditor.toast.saveFailed': '儲存權限失敗',
'settings.agents.page.section.toolPermissions': '工具權限',
'settings.agents.page.field.agentName': 'Agent 名稱',
'settings.agents.page.field.agentNamePlaceholder': 'agent-name',
@@ -492,6 +535,7 @@
'settings.agents.page.permissions.permissionPlaceholder': '權限...',
'settings.agents.page.permissions.patternPlaceholder': '模式(例如 *',
'settings.page.behavior.title': '行為',
'settings.page.behavior.description': '引導代理的回應方式。',
'settings.behavior.page.title': '行為',
'settings.behavior.page.warning.title': '全域規則會與專案規則合併使用',
'settings.behavior.page.warning.description': '此處所做的變更會更新 {path}。當專案級 AGENTS.md 存在時,OpenCode 也會包含它。',
@@ -1496,6 +1540,7 @@
'settings.voice.page.section.playbackAndSummary': '播放',
'settings.voice.page.field.provider': '提供方',
'settings.voice.page.provider.browser': '瀏覽器',
'settings.voice.page.provider.openai': 'OpenAI',
'settings.voice.page.provider.custom': '自訂',
'settings.voice.page.provider.say': 'Say',
'settings.voice.page.provider.server': '伺服器',
@@ -1575,16 +1620,22 @@
'settings.voice.page.field.ttsInputModeRaw': '原始 Markdown',
'settings.voice.page.field.ttsInputModeSummarized': '摘要',
'settings.openchamber.visual.section.colorMode': '顏色模式',
'settings.openchamber.visual.section.colorModeAndTheme': '色彩模式與主題',
'settings.openchamber.visual.section.localization': '在地化',
'settings.openchamber.visual.section.spacingAndLayout': '間距與佈局',
'settings.openchamber.visual.section.densityAndType': '密度與字型',
'settings.openchamber.visual.section.appInstall': '應用程式安裝',
'settings.openchamber.visual.section.mobileLayout': '行動版版面',
'settings.openchamber.visual.section.navigation': '導覽',
'settings.openchamber.visual.section.chatRenderMode': '聊天渲染模式',
'settings.openchamber.visual.section.chatRenderModeAria': '聊天渲染模式',
'settings.openchamber.visual.section.chatDisplay': '顯示',
'settings.openchamber.visual.section.chatMessageOptions': '訊息選項',
'settings.openchamber.visual.section.chatFeatures': '功能',
'settings.openchamber.visual.section.messageStreamTransport': '訊息流傳輸方式',
'settings.openchamber.visual.section.activityDefault': '活動預設狀態',
'settings.openchamber.visual.section.activityDefaultAria': '活動預設模式',
'settings.openchamber.visual.section.showToolsOpenedByDefault': '預設展開以下工具',
'settings.openchamber.visual.section.showToolsOpenedByDefault': '預設展開以下工具',
'settings.openchamber.visual.section.sessionAssistance': '工作階段輔助',
'settings.openchamber.visual.section.reasoning': '推理',
'settings.openchamber.visual.section.messageAppearance': '訊息外觀',
@@ -1717,8 +1768,11 @@
'settings.openchamber.visual.field.sendAnonymousUsageReports': '送出匿名使用報告',
'settings.openchamber.visual.field.sendAnonymousUsageReportsHint': '協助我們了解哪些應用程式版本仍在被積極使用,以便優先改進。僅收集應用程式版本、平台與執行階段資訊,不收集個人資料或程式碼。',
'settings.openchamber.visual.option.themeMode.system': '跟隨系統',
'settings.openchamber.visual.option.themeMode.system.description': '跟隨系統設定',
'settings.openchamber.visual.option.themeMode.light': '淺色',
'settings.openchamber.visual.option.themeMode.light.description': '一律使用淺色外觀',
'settings.openchamber.visual.option.themeMode.dark': '深色',
'settings.openchamber.visual.option.themeMode.dark.description': '一律使用深色外觀',
'settings.openchamber.visual.option.diffLayout.dynamic.label': '動態',
'settings.openchamber.visual.option.diffLayout.dynamic.description': '新增檔案用行內檢視,修改檔案用並排檢視。',
'settings.openchamber.visual.option.diffLayout.inline.label': '始終行內',
@@ -1877,6 +1931,8 @@
'settings.openchamber.desktopNetwork.field.keepAwakeAria': 'OpenChamber 執行時保持電腦喚醒',
'settings.openchamber.desktopNetwork.field.keepAwake': 'OpenChamber 執行時保持電腦喚醒',
'settings.openchamber.desktopNetwork.field.keepAwakeDescription': '讓手機可以持續開啟此應用程式。螢幕仍可關閉。',
'settings.openchamber.desktopPassword.actions.showPassword': '顯示密碼',
'settings.openchamber.desktopPassword.actions.hidePassword': '隱藏密碼',
'settings.openchamber.desktopPassword.field.password': '桌面 UI 密碼',
'settings.openchamber.desktopPassword.field.passwordDescription': 'OpenChamber 會在重新啟動後要求輸入密碼,之後會在登入工作階段過期時再次要求:12 小時後,或選擇「信任此裝置」後 7 天。留空可停用登入。',
'settings.openchamber.desktopPassword.field.passwordPlaceholder': '不需要密碼',
+24 -1
View File
@@ -5,7 +5,14 @@ import { registerRuntimeAPIs } from '@/contexts/runtimeAPIRegistry';
import { startModelPrefsAutoSave } from '@/lib/modelPrefsAutoSave';
import { startAppearanceAutoSave } from '@/lib/appearanceAutoSave';
import { useUIStore } from '@/stores/useUIStore';
import { applyPersistedHomeDirectoryToWindow, invalidateSettingsCache, syncDesktopSettings, updateDesktopSettings } from './persistence';
import {
applyPersistedHomeDirectoryToWindow,
getSettingsSaveState,
invalidateSettingsCache,
subscribeToSettingsSaveState,
syncDesktopSettings,
updateDesktopSettings,
} from './persistence';
import { switchRuntimeEndpoint } from './runtime-switch';
type TestWindow = {
@@ -216,6 +223,22 @@ describe('updateDesktopSettings', () => {
expect(secondResolved).toBe(true);
});
test('publishes saving and saved states for an immediate setting update', async () => {
const states: string[] = [];
registerSettingsSave(async (changes) => changes as SettingsPayload);
const unsubscribe = subscribeToSettingsSaveState(() => {
states.push(getSettingsSaveState());
});
try {
await updateDesktopSettings({ useSystemTheme: false, themeVariant: 'light' });
// Success is silent: the shared state machine maps 'saved' back to 'idle'.
expect(states).toEqual(['saving', 'idle']);
} finally {
unsubscribe();
}
});
test('drains a pending save to the previous runtime and ignores its stale response', async () => {
switchRuntimeEndpoint({ apiBaseUrl: 'https://settings-a.example', runtimeKey: 'settings-a' });
const saveResult = deferred<SettingsPayload>();
+60 -2
View File
@@ -142,6 +142,51 @@ const dispatchSettingsSynced = (settings: DesktopSettings): void => {
window.dispatchEvent(new CustomEvent<DesktopSettings>('openchamber:settings-synced', { detail: settings }));
};
type SettingsSaveState = 'idle' | 'saving' | 'error';
let _settingsSaveState: SettingsSaveState = 'idle';
let _settingsSaveStateResetTimer: ReturnType<typeof setTimeout> | null = null;
const _settingsSaveStateListeners = new Set<() => void>();
export const getSettingsSaveState = (): SettingsSaveState => _settingsSaveState;
export const subscribeToSettingsSaveState = (listener: () => void): (() => void) => {
_settingsSaveStateListeners.add(listener);
return () => _settingsSaveStateListeners.delete(listener);
};
/**
* Drive the shared settings save indicator from pages that persist through
* their own APIs instead of updateDesktopSettings. 'error' resets to idle.
*/
export const reportSettingsSaveState = (state: 'saving' | 'saved' | 'error'): void => {
dispatchSettingsSaveState(state);
};
const dispatchSettingsSaveState = (state: 'saving' | 'saved' | 'error'): void => {
if (_settingsSaveStateResetTimer) {
clearTimeout(_settingsSaveStateResetTimer);
_settingsSaveStateResetTimer = null;
}
// Quiet indicator: success is the normal case and renders nothing ('saved' → idle);
// only in-flight saves and failures surface in the UI.
const nextState: SettingsSaveState = state === 'saved' ? 'idle' : state;
if (nextState !== _settingsSaveState) {
_settingsSaveState = nextState;
_settingsSaveStateListeners.forEach((listener) => listener());
}
if (nextState === 'error') {
_settingsSaveStateResetTimer = setTimeout(() => dispatchSettingsSaveState('saved'), 6000);
}
if (typeof window === 'undefined') {
return;
}
window.dispatchEvent(new CustomEvent<'saving' | 'saved' | 'error'>('openchamber:settings-save-state', { detail: state }));
};
type PersistApi = {
hasHydrated?: () => boolean;
onFinishHydration?: (callback: () => void) => (() => void) | undefined;
@@ -1522,7 +1567,11 @@ async function _flushSettingsUpdate(): Promise<void> {
_settingsFlushTimer = null;
_settingsFlushWaiters = [];
try {
if (!changes || !context || Object.keys(changes).length === 0 || !isSettingsRuntimeContextCurrent(context)) return;
if (!changes || !context || Object.keys(changes).length === 0 || !isSettingsRuntimeContextCurrent(context)) {
// Nothing will be written — clear any pending "Saving…" indicator.
dispatchSettingsSaveState('saved');
return;
}
const runtimeSettings = getRuntimeSettingsAPI();
if (runtimeSettings) {
@@ -1535,6 +1584,7 @@ async function _flushSettingsUpdate(): Promise<void> {
dispatchSettingsSynced(updated);
_settingsCache = null;
}
dispatchSettingsSaveState(updated ? 'saved' : 'error');
return;
} catch (error) {
if (!isSettingsRuntimeContextCurrent(context)) return;
@@ -1556,6 +1606,7 @@ async function _flushSettingsUpdate(): Promise<void> {
if (!isSettingsRuntimeContextCurrent(context)) return;
if (!response.ok) {
console.warn('Failed to update shared settings via API:', response.status, response.statusText);
dispatchSettingsSaveState('error');
return;
}
@@ -1565,11 +1616,17 @@ async function _flushSettingsUpdate(): Promise<void> {
persistToLocalStorage(updated);
applyDesktopUiPreferences(updated);
dispatchSettingsSynced(updated);
dispatchSettingsSaveState('saved');
// Invalidate GET cache so next read sees the fresh data
_settingsCache = null;
} else {
dispatchSettingsSaveState('error');
}
} catch (error) {
if (isSettingsRuntimeContextCurrent(context)) console.warn('Failed to update shared settings via API:', error);
if (isSettingsRuntimeContextCurrent(context)) {
console.warn('Failed to update shared settings via API:', error);
dispatchSettingsSaveState('error');
}
}
} finally {
waiters.forEach((resolve) => resolve());
@@ -1590,6 +1647,7 @@ export const updateDesktopSettings = async (changes: Partial<DesktopSettings>):
_pendingSettingsChanges = { ...(_pendingSettingsChanges ?? {}), ...changes };
_pendingSettingsContext = context;
dispatchSettingsSaveState('saving');
if (_settingsFlushTimer) {
clearTimeout(_settingsFlushTimer);
+20 -16
View File
@@ -2,6 +2,7 @@ import type { SidebarSection } from '@/constants/sidebar';
export type SettingsPageSlug =
| 'home'
| 'general'
| 'projects'
| 'remote-instances'
| 'providers'
@@ -26,14 +27,10 @@ export type SettingsPageSlug =
| 'about';
type SettingsPageGroup =
| 'appearance'
| 'projects'
| 'general'
| 'projects'
| 'opencode'
| 'git'
| 'skills'
| 'usage'
| 'advanced';
| 'content';
export interface SettingsRuntimeContext {
isVSCode: boolean;
@@ -61,6 +58,13 @@ export const SETTINGS_PAGE_METADATA: readonly SettingsPageMeta[] = [
description: 'Search and jump to common pages.',
keywords: ['search', 'settings'],
},
{
slug: 'general',
title: 'General',
group: 'general',
kind: 'single',
keywords: ['general', 'startup', 'launch at login', 'autostart', 'tray', 'password', 'passkey', 'security', 'privacy', 'telemetry', 'transport', 'network', 'lan', 'binary', 'cli'],
},
{
slug: 'projects',
title: 'Projects',
@@ -86,7 +90,7 @@ export const SETTINGS_PAGE_METADATA: readonly SettingsPageMeta[] = [
{
slug: 'usage',
title: 'Usage',
group: 'usage',
group: 'general',
kind: 'split',
keywords: ['quota', 'billing', 'tokens', 'usage', 'limits'],
},
@@ -128,21 +132,21 @@ export const SETTINGS_PAGE_METADATA: readonly SettingsPageMeta[] = [
{
slug: 'skills.installed',
title: 'Skills',
group: 'skills',
group: 'content',
kind: 'split',
keywords: ['skill', 'skills', 'instructions', 'install', 'catalog'],
},
{
slug: 'skills.catalog',
title: 'Skills Catalog',
group: 'skills',
group: 'content',
kind: 'single',
keywords: ['install', 'catalog', 'external', 'repository', 'skills catalog'],
},
{
slug: 'git',
title: 'Git',
group: 'git',
group: 'projects',
kind: 'single',
keywords: ['git', 'github', 'identity', 'identities', 'ssh', 'profiles', 'credentials', 'keys', 'commit', 'gitmoji', 'oauth', 'prs', 'issues'],
isAvailable: (ctx) => !ctx.isVSCode,
@@ -150,7 +154,7 @@ export const SETTINGS_PAGE_METADATA: readonly SettingsPageMeta[] = [
{
slug: 'appearance',
title: 'Appearance',
group: 'appearance',
group: 'general',
kind: 'single',
keywords: ['theme', 'font', 'spacing', 'padding', 'corner radius', 'radius', 'input bar', 'keyboard', 'viewport', 'mobile', 'terminal', 'pwa', 'install name', 'app shortcuts'],
},
@@ -179,7 +183,7 @@ export const SETTINGS_PAGE_METADATA: readonly SettingsPageMeta[] = [
{
slug: 'magic-prompts',
title: 'Magic Prompts',
group: 'general',
group: 'content',
kind: 'split',
keywords: ['prompts', 'templates', 'git', 'github', 'review', 'commit', 'pull request'],
isAvailable: (ctx) => !ctx.isVSCode,
@@ -187,15 +191,15 @@ export const SETTINGS_PAGE_METADATA: readonly SettingsPageMeta[] = [
{
slug: 'snippets',
title: 'Snippets',
group: 'general',
group: 'content',
kind: 'split',
keywords: ['prompt', 'templates', 'multi-run', 'strategy', 'approach'],
},
{ slug: 'notifications', title: 'Notifications', group: 'general', kind: 'single', keywords: ['alerts', 'native', 'summary', 'summarization'], },
{ slug: 'voice', title: 'Voice', group: 'advanced', kind: 'single', keywords: ['tts', 'speech', 'voice'], isAvailable: (ctx) => !ctx.isVSCode },
{ slug: 'tunnel', title: 'Remote Tunnel', group: 'advanced', kind: 'single', keywords: ['tunnel', 'cloudflare', 'qr', 'remote', 'mobile', 'share'], isAvailable: (ctx) => !ctx.isVSCode },
{ slug: 'about', title: 'About', group: 'advanced', kind: 'single', keywords: ['about', 'version', 'updates', 'release', 'changelog'], isAvailable: (ctx) => ctx.isMobile },
{ slug: 'voice', title: 'Voice', group: 'general', kind: 'single', keywords: ['tts', 'speech', 'voice'], isAvailable: (ctx) => !ctx.isVSCode },
{ slug: 'tunnel', title: 'External Tunnel', group: 'projects', kind: 'single', keywords: ['tunnel', 'external', 'cloudflare', 'qr', 'remote', 'mobile', 'share'], isAvailable: (ctx) => !ctx.isVSCode },
{ slug: 'about', title: 'About', group: 'general', kind: 'single', keywords: ['about', 'version', 'updates', 'release', 'changelog'], isAvailable: (ctx) => ctx.isMobile && !ctx.isVSCode },
] as const;
const LEGACY_SIDEBAR_SECTION_TO_SETTINGS_SLUG: Record<SidebarSection, SettingsPageSlug> = {
+17 -14
View File
@@ -118,7 +118,7 @@ const SETTINGS_SEARCH_ITEMS: readonly SettingsSearchItem[] = [
},
{
id: 'appearance.terminal-shell',
page: 'appearance',
page: 'general',
titleKey: 'settings.openchamber.visual.field.terminalShell',
descriptionKey: 'settings.openchamber.visual.field.terminalShellHint',
keywords: ['terminal', 'shell', 'bash', 'zsh', 'fish', 'pwsh', 'powershell'],
@@ -142,22 +142,25 @@ const SETTINGS_SEARCH_ITEMS: readonly SettingsSearchItem[] = [
titleKey: 'settings.openchamber.visual.field.inputBarOffset',
descriptionKey: 'settings.openchamber.visual.field.inputBarOffsetTooltip',
keywords: ['input', 'home bar', 'offset'],
// Only the mobile composer applies this offset (ChatInput gates on isMobile).
isAvailable: (ctx) => ctx.isMobile,
},
{
id: 'appearance.expanded-editor-toolbar',
page: 'appearance',
page: 'general',
titleKey: 'settings.openchamber.visual.field.expandedEditorToolbar',
keywords: ['editor', 'toolbar', 'tabs', 'docked', 'files'],
isAvailable: (ctx) => !ctx.isVSCode,
},
{
id: 'appearance.file-editor-keymap',
page: 'appearance',
page: 'general',
titleKey: 'settings.openchamber.visual.field.fileEditorKeymap',
keywords: ['editor', 'vim', 'keymap'],
},
{
id: 'appearance.terminal-quick-keys',
page: 'appearance',
page: 'general',
titleKey: 'settings.openchamber.visual.field.terminalQuickKeys',
descriptionKey: 'settings.openchamber.visual.field.terminalQuickKeysTooltip',
keywords: ['terminal', 'keyboard', 'esc', 'ctrl', 'arrows'],
@@ -165,7 +168,7 @@ const SETTINGS_SEARCH_ITEMS: readonly SettingsSearchItem[] = [
},
{
id: 'appearance.usage-reports',
page: 'appearance',
page: 'general',
titleKey: 'settings.openchamber.visual.field.sendAnonymousUsageReports',
descriptionKey: 'settings.openchamber.visual.field.sendAnonymousUsageReportsHint',
keywords: ['telemetry', 'analytics'],
@@ -178,7 +181,7 @@ const SETTINGS_SEARCH_ITEMS: readonly SettingsSearchItem[] = [
},
{
id: 'chat.message-transport',
page: 'chat',
page: 'general',
titleKey: 'settings.openchamber.visual.section.messageStreamTransport',
keywords: ['streaming', 'sse', 'websocket'],
},
@@ -379,7 +382,7 @@ const SETTINGS_SEARCH_ITEMS: readonly SettingsSearchItem[] = [
},
{
id: 'sessions.desktop-launch-at-login',
page: 'sessions',
page: 'general',
titleKey: 'settings.openchamber.desktopNetwork.field.launchAtLogin',
descriptionKey: 'settings.openchamber.desktopNetwork.field.launchAtLoginDescription',
keywords: ['desktop', 'startup', 'login'],
@@ -387,7 +390,7 @@ const SETTINGS_SEARCH_ITEMS: readonly SettingsSearchItem[] = [
},
{
id: 'sessions.desktop-window-controls-position',
page: 'sessions',
page: 'general',
titleKey: 'settings.openchamber.desktopNetwork.field.windowControlsPosition',
descriptionKey: 'settings.openchamber.desktopNetwork.field.windowControlsPositionDescription',
keywords: ['desktop', 'window', 'controls', 'minimize', 'maximize', 'close', 'titlebar', 'linux', 'windows'],
@@ -395,7 +398,7 @@ const SETTINGS_SEARCH_ITEMS: readonly SettingsSearchItem[] = [
},
{
id: 'sessions.desktop-minimize-to-tray',
page: 'sessions',
page: 'general',
titleKey: 'settings.openchamber.desktopNetwork.field.minimizeToTray',
descriptionKey: 'settings.openchamber.desktopNetwork.field.minimizeToTrayDescription',
keywords: ['desktop', 'tray', 'system tray', 'minimize', 'close', 'background', 'windows'],
@@ -403,7 +406,7 @@ const SETTINGS_SEARCH_ITEMS: readonly SettingsSearchItem[] = [
},
{
id: 'sessions.desktop-keep-awake',
page: 'sessions',
page: 'general',
titleKey: 'settings.openchamber.desktopNetwork.field.keepAwake',
descriptionKey: 'settings.openchamber.desktopNetwork.field.keepAwakeDescription',
keywords: ['desktop', 'sleep', 'awake', 'server', 'mobile', 'phone'],
@@ -411,7 +414,7 @@ const SETTINGS_SEARCH_ITEMS: readonly SettingsSearchItem[] = [
},
{
id: 'sessions.desktop-ui-password',
page: 'sessions',
page: 'general',
titleKey: 'settings.openchamber.desktopPassword.field.password',
descriptionKey: 'settings.openchamber.desktopPassword.field.passwordDescription',
keywords: ['desktop', 'password', 'auth', 'login'],
@@ -419,7 +422,7 @@ const SETTINGS_SEARCH_ITEMS: readonly SettingsSearchItem[] = [
},
{
id: 'sessions.desktop-lan-access',
page: 'sessions',
page: 'general',
titleKey: 'settings.openchamber.desktopNetwork.field.allowLanAccess',
descriptionKey: 'settings.openchamber.desktopNetwork.field.allowLanAccessDescription',
keywords: ['desktop', 'lan', 'network', 'phone', 'tablet'],
@@ -427,14 +430,14 @@ const SETTINGS_SEARCH_ITEMS: readonly SettingsSearchItem[] = [
},
{
id: 'sessions.opencode-binary',
page: 'sessions',
page: 'general',
titleKey: 'settings.openchamber.opencodeCli.field.binaryPath',
keywords: ['opencode', 'cli', 'binary', 'path'],
isAvailable: (ctx) => !ctx.isVSCode,
},
{
id: 'sessions.opencode-update-notifications',
page: 'sessions',
page: 'general',
titleKey: 'settings.openchamber.opencodeCli.field.showUpdateNotifications',
keywords: ['opencode', 'cli', 'updates'],
isAvailable: (ctx) => !ctx.isVSCode,
@@ -564,6 +564,8 @@ const sidebarBaseRgb = hexToRgb(theme.colors.surface.muted);
vars.push(` --text-meta: ${typography.meta};`);
vars.push(' /* Micro text - badges, shortcuts, indicators */');
vars.push(` --text-micro: ${typography.micro};`);
vars.push(' /* Settings page titles - larger than section headers */');
vars.push(` --text-settings-page-title: ${typography.settingsPageTitle};`);
vars.push(' /* Heading line height and letter spacing */');
vars.push(' --h1-line-height: 1.25rem;');
+3
View File
@@ -5,6 +5,8 @@ export const SEMANTIC_TYPOGRAPHY = {
uiLabel: '0.8750rem',
meta: '0.875rem',
micro: '0.875rem',
/** Settings page / detail-pane title — larger than section headers */
settingsPageTitle: '1.125rem',
} as const;
export const VSCODE_TYPOGRAPHY = {
@@ -15,6 +17,7 @@ export const VSCODE_TYPOGRAPHY = {
uiLabel: '0.8438rem',
meta: '0.8438rem',
micro: '0.7813rem',
settingsPageTitle: '1.0625rem',
} as const;
export type SemanticTypographyKey = keyof typeof SEMANTIC_TYPOGRAPHY;