Files
OpenTerminal/src/shared/i18n/dicts/en/settings.ts
T
Bill cee616a23a
CI / typecheck + test + build (windows) (push) Canceled after 0s
feat: 字体与高亮系统改进(CJK 对齐、ReDoS 防护、链接规则、崩溃类设置修复)
基于两轮专项调研(字体/高亮各两路,子代理实测探针交叉印证)实施的完整改进。

## 修复的真实 bug

**设置越界导致窗格永久死亡(用户报告)**
行高设 0.95 → xterm 构造/热更抛错 → 错误边界卸载整个 dockview 窗格;坏值已
落盘,每次重启都崩。根因是一整类缺陷:UI 允许值 / 配置能写值 与 xterm 硬约束
不一致,且主进程不校验。同类还有 scrollback<0(抛错)、cursorStyle 非法值
(更隐蔽:构造期被吞掉、只有热更期抛错,导致「重试」按钮永远无效、窗格死循环)。

修复:FONT_LIMITS/CURSOR_STYLES/RENDERER_MODES 收拢到 shared 层单一来源,
主进程加载时钳制 + 白名单化,healClampedFontSettings() 回写自愈;设置页
InputNumber、字体热键共用同一常量(照 LOCK_AUTO_DELAYS 先例,杜绝再次漂移)。

**perm 预设锚定失效**
^[-dlbcps]... 的 ^ 锚定的是「转义序列之间的 text run 起点」而非行首,ls -l
多行输出只有第一行权限位上色;带颜色的 ls(run 以转义切开)完全不触发。
改为 (?<=^|\s)[-dlbcps][rwxstST-]{9}(?![rwxstST-])——用负向前瞻而不是
(?=\s|$) 是因为后者会让带 ACL `+` / macOS `@` 后缀的真实 ls -l 输出不再染色。
旧 pattern 登记进 LEGACY_BUILTIN_PATTERNS,存量安装下次启动自动升级。

**高亮 span 吃掉应用自身 SGR**
wrap 固定追加 \x1b[0m,把应用设的颜色一并清掉。改为 SgrState 跟踪并重放。
四条护栏(每条都踩过坑,详见 AGENTS.md):
- reset 判定解析参数:ESC[00m/ESC[0;0m/ESC[0;32m(Go/Java 日志库常写)原先
  被追加进累积器,逐行增长直到撞上限,之后所有 span 恢复永久失效
- 回放闸门按序列条数而非字节数:同一个"单个前景色"长度差近 4 倍,按字节卡
  会砍掉真彩色却放过索引色
- 恢复串只插在可见间隙和最后一个 span 后:每 span 都重放会让 Kimi 这类全彩
  TUI(~19 span/行)把 9.5KB 输出膨胀到 40.8KB(4.30x),渲染线程实测卡
  18.4 秒。现为 3.05x 且长间隙着色正常
- 基准测试守门(膨胀 < 3.2x),改参数必须重跑

**CSI 私有参数导致整行失去高亮**
ESCAPE_RE 漏了 <>= 前缀与中间字节,\x1b[>4;1m(modifyOtherKeys)、
\x1b[<0;1;2M(SGR 鼠标)、\x1b[=1;1$y(DECRQM) 让整行成含裸 ESC 的文本,该行
之后所有关键词失去高亮(vim/tmux 常发)。

**超长行拖垮整段高亮**:一条 >4KB 的行让整个 text run 失去高亮。改为逐行降级。

**统计「最后写入者赢」**:模块级 totals 被各 pane 覆盖,设置页数据在窗格间
跳动。改为按 pane 实例 UUID 聚合(不能用 sessionId——SSH 分屏同一 session 挂
两个 pane,正好复制该 bug)。

## 新增能力

- **CJK 对齐三件套**:@xterm/addon-unicode11@0.10.0-beta.301(peer 恰好接受
  锁定的 6.1.0-beta.304,升 xterm 必须同步重配)、rescaleOverlappingGlyphs、
  cjkFontFamily 回退槽位。默认字体栈没有任何 CJK 字体,中文靠 Chromium 回退
  到比例字体导致列错位
- **字体名引号包裹**:quoteFontStack() 逐段判定(含反斜杠转义——只转义 " 会
  让尾部反斜杠把闭合引号转义掉,CSS 字符串不终止)
- **等宽徽标**:canvas measureText 逐字符采样,等宽排前
- **规则按行匹配**(lineAnchor → m flag)
- **命中提醒**(notify + onMatch 事件出口,60s 冷却,只显示规则名不显示原文)
- **可点击链接规则**(WezTerm hyperlink_rules 式,安全闸门在生成 span 时就
  丢弃非 http/https 目标)

## 其它

- 主题语义变量改为单一命名体系:semanticVars() 键就是最终 CSS 属性名,字面量
  键联合让拼错成为编译错误;删除 cssVarName()/semanticCssVars() 中间层
  (自定义属性名大小写敏感,转换被绕过会静默回落到深色兜底值)
- 删除死代码:automaticFontFallback 与顶层 overviewRuler 在 6.1.0-beta.304
  中均不存在,且移除了让任何伪造键都能通过 tsc 的 as 断言
- ReDoS 防护(MAX_PATTERN_LEN + 编辑器 backtracksBadly 实时探测)——注意这
  只是止血,(a+)+$ 配 30 字符实测仍卡 8.2 秒,根治需把正则执行挪进 Worker

测试 29 → 32(新增 font-stack、link-rules),全部通过;AGENTS.md 已同步。
2026-10-17 20:23:56 +08:00

369 lines
23 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/** Namespace: settings (the settings dialog: font/cursor/render/highlight/theme/system/about). Owner: settings page. */
const settings: Record<string, string> = {
'settings.title': 'Settings',
'settings.tabs.font': 'Font',
'settings.tabs.cursor': 'Cursor & Scrollback',
'settings.tabs.render': 'Rendering & Behavior',
'settings.tabs.highlight': 'Highlighting',
'settings.tabs.theme': 'Themes',
'settings.tabs.system': 'System',
'settings.tabs.lock': 'Lock',
'settings.tabs.about': 'About',
'settings.resizeHandle': 'Drag to resize',
'settings.preview': 'Preview',
'settings.deleteConfirmDesc': 'This cannot be undone. Continue?',
'settings.color.foreground': 'Foreground',
'settings.color.background': 'Background',
'settings.color.cursor': 'Cursor',
'settings.color.selection': 'Selection',
'settings.color.ansi.black': 'Black',
'settings.color.ansi.red': 'Red',
'settings.color.ansi.green': 'Green',
'settings.color.ansi.yellow': 'Yellow',
'settings.color.ansi.blue': 'Blue',
'settings.color.ansi.magenta': 'Magenta',
'settings.color.ansi.cyan': 'Cyan',
'settings.color.ansi.white': 'White',
'settings.color.ansi.brightBlack': 'Bright Black',
'settings.color.ansi.brightRed': 'Bright Red',
'settings.color.ansi.brightGreen': 'Bright Green',
'settings.color.ansi.brightYellow': 'Bright Yellow',
'settings.color.ansi.brightBlue': 'Bright Blue',
'settings.color.ansi.brightMagenta': 'Bright Magenta',
'settings.color.ansi.brightCyan': 'Bright Cyan',
'settings.color.ansi.brightWhite': 'Bright White',
'settings.font.label': 'Font',
'settings.font.desc': 'Primary terminal font: the built-in default or any system font (prefer ones tagged monospace)',
'settings.font.placeholder': 'Select a font',
'settings.font.default': 'Default',
'settings.font.monoBadge': 'MONO',
'settings.font.cjkFamily': 'CJK font',
'settings.font.cjkFamilyNone': 'Default (append nothing)',
'settings.font.cjkFamilyExtra':
'Appended to the end of the font stack, used only as the CJK fallback. Pick a monospace CJK face such as Sarasa Mono SC',
'settings.font.size': 'Font size',
'settings.font.sizeDesc': 'Pixel size of the terminal text',
'settings.font.weight': 'Weight',
'settings.font.weightDesc': '400 is regular, 700 is bold',
'settings.font.boldWeight': 'Bold weight',
'settings.font.boldWeightDesc': 'Weight used for bold text',
'settings.font.letterSpacing': 'Letter spacing',
'settings.font.letterSpacingDesc': 'Horizontal distance between characters',
'settings.font.lineHeight': 'Line height',
'settings.font.lineHeightDesc': 'Vertical distance between adjacent lines',
'settings.cursor.blink': 'Blinking cursor',
'settings.cursor.blinkDesc': 'Whether the cursor blinks periodically',
'settings.cursor.style': 'Cursor style',
'settings.cursor.styleDesc': 'Shape used to draw the cursor',
'settings.cursor.inactiveStyle': 'Inactive cursor style',
'settings.cursor.inactiveStyleDesc': 'Cursor style while the window is unfocused',
'settings.cursor.scrollback': 'Scrollback buffer',
'settings.cursor.scrollbackDesc': 'How many lines you can scroll back',
'settings.cursorStyle.bar': 'Bar',
'settings.cursorStyle.block': 'Block',
'settings.cursorStyle.underline': 'Underline',
'settings.cursorStyle.outline': 'Outline',
'settings.cursorStyle.none': 'None',
'settings.rendererMode.auto': 'Automatic',
'settings.rendererMode.autoHint': 'Prefer WebGL acceleration, falling back to DOM rendering if it fails',
'settings.rendererMode.webgl': 'High-performance WebGL',
'settings.rendererMode.webglHint':
'Force GPU-accelerated rendering; best for high refresh rates and heavy scrolling',
'settings.rendererMode.dom': 'Compatible DOM',
'settings.rendererMode.domHint':
'Pure CPU rendering with the widest compatibility; best without a GPU or over remote desktop',
'settings.render.modeLabel': 'Renderer',
'settings.render.modeHint': 'How terminal cells are accelerated; applies to every terminal',
'settings.render.copyOnSelect': 'Copy on select',
'settings.render.copyOnSelectDesc': 'Copy text automatically when you select it with the mouse',
'settings.render.pasteRiskConfirm': 'Confirm risky paste',
'settings.render.pasteRiskConfirmDesc':
'Ask before pasting multi-line text (or a very long single line); single lines paste directly',
'settings.render.confirmTabClose': 'Confirm before closing terminal tabs',
'settings.render.confirmTabCloseDesc':
'Ask for confirmation before closing a local terminal tab',
'settings.render.confirmSshTabClose': 'Confirm before closing SSH tabs',
'settings.render.confirmSshTabCloseDesc':
'Ask for confirmation before closing an SSH connection tab',
'settings.render.suggest': 'Input suggestions',
'settings.render.suggestDesc':
'Show command suggestions while typing; Tab accepts, Enter always runs the command right away',
'settings.render.history': 'Record command history',
'settings.render.historyDesc': 'When off, new commands are no longer recorded; saved history is kept',
'settings.render.historyLimit': 'History limit',
'settings.render.historyLimitDesc': 'Most commands to keep; duplicates are stored only once',
'settings.render.recButton': 'Terminal toolbar · Record',
'settings.render.recButtonDesc': 'Show the "Record session log" button in the top-right corner',
'settings.render.openLogsButton': 'Terminal toolbar · Open log folder',
'settings.render.openLogsButtonDesc': 'Show the "Open log folder" button in the top-right corner',
'settings.render.openCwdButton': 'Terminal toolbar · Open workspace folder',
'settings.render.openCwdButtonDesc':
'Show the "Open current folder" button in the top-right corner (hidden in SSH sessions; the folder follows cd in real time and needs shell integration or the cd command)',
'settings.system.launchAtLogin': 'Launch at startup',
'settings.system.launchAtLoginDesc':
'Start OpenTerminal when the system boots (in development mode the dev build is registered)',
'settings.system.preventSleep': 'Prevent system sleep',
'settings.system.preventSleepDesc':
'While on, OpenTerminal keeps the system from sleeping automatically; when off, the system follows its own power settings',
'settings.system.updateCheckInterval': 'Periodic update check',
'settings.system.updateCheckIntervalDesc':
'Check for new versions periodically in the background (startup and manual checks always work)',
'settings.system.updateCheckNever': 'Never',
'settings.system.updateCheck4h': 'Every 4 hours',
'settings.system.updateCheck12h': 'Every 12 hours',
'settings.system.updateCheck24h': 'Every 24 hours',
'settings.system.autoDownload': 'Download updates automatically',
'settings.system.autoDownloadDesc':
'Silently download new versions in the background; installing stays your call (it installs when you quit the app)',
'settings.system.restoreSession': 'Restore last session on startup',
'settings.system.restoreSessionDesc':
'Restore the split layout on the next launch and return each terminal to its last directory; when off, OpenTerminal always starts with a single terminal',
'settings.system.shellIntegration': 'Shell integration',
'settings.system.shellIntegrationDesc':
'Let the shell report its working directory (OSC 7) for more precise path tracking, including cd inside scripts; it wraps your prompt, so turn it off if the prompt theme looks wrong',
'settings.system.diagnosticLog': 'Diagnostic log',
'settings.system.diagnosticLogDesc':
'Write key events (startup, UI freezes, crashes) to the log directory — one file per day, auto-deleted after 7 days; nothing is recorded while this is off',
'settings.system.closeAction': 'Close button behavior',
'settings.system.closeActionDesc':
'What happens when you click the window close button; after minimizing to the tray you can quit from the tray icon context menu',
'settings.system.closeActionTray': 'Minimize to tray',
'settings.system.closeActionExit': 'Quit directly',
'settings.system.closeActionAsk': 'Ask every time',
'settings.system.globalShortcut': 'Global show/hide shortcut',
'settings.system.globalShortcutDesc':
'Click the field, then press the key combination; Esc cancels, Backspace clears and disables it',
'settings.system.globalShortcutHint':
'Together with the global key this shows or hides the window from anywhere; if registration fails (a conflict with another app) it simply has no effect and the app reports no error.',
'settings.system.shortcutRecording': 'Press the keys…',
'settings.system.shortcutPlaceholder': 'Click and press a shortcut, leave empty to disable',
'settings.system.shortcutConflict':
'This shortcut is already used by the app (Ctrl+= / Ctrl+- / Ctrl+0 / Ctrl+PgUp / Ctrl+PgDn). Please choose another.',
'settings.lock.password.title': 'Lock password',
'settings.lock.password.desc': 'A password is required before the lock can be enabled',
'settings.lock.password.configured': 'Set',
'settings.lock.password.notConfigured': 'Not set',
'settings.lock.password.current': 'Current password',
'settings.lock.password.currentPlaceholder': 'Enter the current password',
'settings.lock.password.new': 'New password',
'settings.lock.password.newPlaceholder': 'Enter a new password',
'settings.lock.password.confirm': 'Confirm new password',
'settings.lock.password.confirmPlaceholder': 'Repeat the new password',
'settings.lock.password.set': 'Set password',
'settings.lock.password.change': 'Change password',
'settings.lock.password.clear': 'Remove password',
'settings.lock.password.clearTitle': 'Remove the lock password?',
'settings.lock.password.clearDesc':
'The lock is turned off along with it. The current password is required to confirm.',
'settings.lock.password.mismatch': 'The two new passwords do not match',
'settings.lock.password.empty': 'Enter a password',
'settings.lock.password.saved': 'Password saved',
'settings.lock.password.cleared': 'Lock password removed',
'settings.lock.password.forgot':
'A forgotten lock password cannot be recovered from any cloud or backdoor: the only way back in is deleting this machine\u2019s lock data and setting a new one.',
'settings.lock.enabled': 'Enable lock',
'settings.lock.enabledDesc':
'Lock the main window when idle or at startup; unlocking needs the password above',
'settings.lock.needPassword': 'Set a lock password first',
'settings.lock.autoLock': 'Lock when idle',
'settings.lock.autoLockDesc': 'Lock once the system has been idle this long (0 = never)',
'settings.lock.autoLockOff': 'Off',
'settings.lock.autoLockMinutes': '{n} min',
'settings.lock.lockAtStartup': 'Lock at startup',
'settings.lock.lockAtStartupDesc': 'Ask for the password right after every launch',
'settings.lock.lockNow': 'Lock now',
'settings.lock.lockNowDesc': 'Lock the main window immediately (sessions keep running, Ctrl+L)',
'settings.lock.title': 'Locked',
'settings.lock.screenDesc': 'Enter the lock password to unlock',
'settings.lock.passwordPlaceholder': 'Password',
'settings.lock.unlock': 'Unlock',
'settings.lock.unlocking': 'Unlocking…',
'settings.lock.screenForgot':
'Forgot it? The lock password cannot be recovered \u2014 the only way out is deleting this machine\u2019s lock data.',
'settings.lock.error.invalidPassword': 'Password is invalid (empty or too short)',
'settings.lock.error.wrongPassword': 'Wrong password',
'settings.lock.error.cooldown': 'Too many attempts \u2014 try again in {n}s',
'settings.lock.error.cooldownGeneric': 'Too many attempts \u2014 try again later',
'settings.lock.error.saveFailed': 'Save failed, please retry',
'settings.resetTerminal': 'Reset terminal settings',
'settings.resetTerminalTitle': 'Reset terminal settings?',
'settings.resetTerminalDesc': 'All terminal settings — font, cursor, rendering and theme — will be restored to defaults.',
'settings.highlight.alert':
'Custom highlighting improves readability at a small performance cost. Rules are applied in priority order. PS: colors are injected as text is written to the terminal, so existing scrollback is unaffected',
'settings.highlight.enabled': 'Enabled',
'settings.highlight.pattern': 'Pattern',
'settings.highlight.patternPlaceholder': 'e.g. \\b(ERROR|FAILED)\\b',
'settings.highlight.patternSlow': 'This pattern may be extremely slow (catastrophic backtracking) and can freeze the UI on longer output — consider simplifying it',
'settings.highlight.invalidRegex': 'Invalid regular expression',
'settings.highlight.priority': 'Priority',
'settings.highlight.priorityHint': 'Lower values apply first',
'settings.highlight.color': 'Color',
'settings.highlight.clearBg': 'Clear',
'settings.highlight.addBg': 'Add',
'settings.highlight.palette': 'Palette',
'settings.highlight.sampleText': 'Highlight',
'settings.highlight.note': 'Note',
'settings.highlight.notePlaceholder': 'Rule description (optional)',
'settings.highlight.caseInsensitive': 'Ignore case',
'settings.highlight.caseInsensitiveHint': 'letters match in any case (OK also matches ok)',
'settings.highlight.lineAnchor': 'Match per line',
'settings.highlight.lineAnchorHint': '^ and $ anchor to each line (otherwise only the start and end of the whole output)',
'settings.highlight.notify': 'Alert on hit',
'settings.highlight.notifyHint': 'Show one in-app alert when this rule matches (at most once a minute)',
'settings.highlight.notifyTitle': 'Highlight rule matched',
'settings.highlight.notifyBody': 'Rule "{name}" matched in the terminal output',
'settings.highlight.bands': 'Value bands',
'settings.highlight.bandsHint':
'Colour by the first number in the match; no number (or below the lowest band) keeps the foreground colour',
'settings.highlight.bandMin': 'Min',
'settings.highlight.addBand': '+ Add band',
'settings.highlight.removeBand': 'Remove band',
'settings.highlight.importExport': 'Import / export',
'settings.highlight.importExportTitle': 'Import / export highlight rules',
'settings.highlight.exportSection': 'Export — copy or save this JSON to share the set',
'settings.highlight.copy': 'Copy',
'settings.highlight.copied': 'Copied',
'settings.highlight.download': 'Save as file',
'settings.highlight.importSection': 'Import — paste JSON, or pick a .json file',
'settings.highlight.chooseFile': 'Choose file',
'settings.highlight.importMode': 'Mode',
'settings.highlight.importReplace': 'Replace current rules',
'settings.highlight.importAppend': 'Append to current rules',
'settings.highlight.importReplaceTitle': 'Replace current rules?',
'settings.highlight.importReplaceDesc':
'Importing overwrites every current rule with this file. This cannot be undone.',
'settings.highlight.importOk': 'Import',
'settings.highlight.importEmpty': 'No usable rules found',
'settings.highlight.importBadJson': 'Not valid JSON',
'settings.highlight.importWrongKind': 'This JSON is not a highlight-rule file',
'settings.highlight.importWrongVersion': 'This JSON has an unsupported version',
'settings.highlight.importReadFailed': 'Could not read the file',
'settings.highlight.importSkipped': 'Skipped {n}: {list}',
'settings.highlight.imported': 'Imported {n} rule(s)',
'settings.highlight.testText': 'Test text',
'settings.highlight.testHint': 'see the effect as you edit the pattern (first 2000 characters only)',
'settings.highlight.mode': 'Highlighting',
'settings.highlight.modeAll': 'All',
'settings.highlight.modeBasic': 'Basic only',
'settings.highlight.modeOff': 'Off',
'settings.highlight.modeDesc':
'Basic only: keeps just the key rules (errors, success, warnings, dangerous commands, secrets) — cheaper and quieter. Off: no colour injection at all (rules and colours are kept).',
'settings.highlight.basic': 'Basic rule',
'settings.highlight.basicHint': 'keep this rule active when the highlight mode is "Basic only"',
'settings.highlight.category': 'Category',
'settings.highlight.groupByCategory': 'Group by category',
'settings.highlight.category.safety': 'Safety',
'settings.highlight.category.status': 'Status',
'settings.highlight.category.file': 'Files',
'settings.highlight.category.net': 'Network',
'settings.highlight.category.text': 'Text',
'settings.highlight.category.metric': 'Metrics',
'settings.highlight.category.none': 'Uncategorised',
'settings.highlight.stats': 'Count hits and time',
'settings.highlight.statsHint':
'Collect per-rule hit counts and durations for this page (zero cost while off)',
'settings.highlight.statsHits': 'Hits',
'settings.highlight.statsMs': 'Time',
'settings.highlight.statsReset': 'Reset stats',
'settings.highlight.statsEmpty': 'No stats yet — run some output in a terminal first',
'settings.highlight.themeColors': 'Follow theme colours',
'settings.highlight.themeColorsHint':
'Map highlight colours onto the active terminal palette by hue (neutral greys are kept as-is)',
'settings.highlight.perHost': 'Per-host rule sets',
'settings.highlight.perHostHint':
'When on, an SSH connection bound to a rule set runs only that subset; when off every session uses all rules',
'settings.highlight.profiles': 'Host rule sets',
'settings.highlight.profilesHint':
'Save a subset of the rules under a name, then bind it to a host in the connection editor',
'settings.highlight.profileNew': '+ New rule set',
'settings.highlight.profileEdit': 'Edit rule set',
'settings.highlight.profileName': 'Name',
'settings.highlight.profileNamePlaceholder': 'e.g. production (errors only)',
'settings.highlight.profileRules': 'Included rules',
'settings.highlight.profileRulesHint': 'Unchecked rules stay off on that host',
'settings.highlight.profileExcluded': 'Excluded {n}: {list}',
'settings.highlight.profileEmpty': 'No rule sets yet',
'settings.highlight.profileDeleteTitle': 'Delete rule set',
'settings.highlight.linksTitle': 'Clickable link rules',
'settings.highlight.linksHint': 'Match terminal output with a regex and turn the hit into a clickable link; Ctrl+Click (Cmd on macOS) opens the expanded template in your browser (http / https only)',
'settings.highlight.linkAdd': '+ Add link rule',
'settings.highlight.linkEmpty': 'No link rules yet — click "+ Add link rule" to create one',
'settings.highlight.linkEditTitle': 'Edit link rule',
'settings.highlight.linkCreateTitle': 'New link rule',
'settings.highlight.linkDeleteTitle': 'Delete link rule',
'settings.highlight.linkPatternHint': 'Runs against the whole logical line (wrapped rows are joined first); use groups for the parts you want to keep',
'settings.highlight.linkTemplate': 'Link template',
'settings.highlight.linkTemplateHint': '$0 is the whole match, $1–$9 the capture groups, $$ a literal $; the template must expand to an http:// or https:// link',
'settings.highlight.linkInvalidTemplate': 'The template must expand to an http:// or https:// link',
'settings.highlight.linkPattern': 'Pattern',
'settings.highlight.linkEnabled': 'Enabled',
'settings.highlight.actions': 'Actions',
'settings.highlight.addRule': '+ Add rule',
'settings.highlight.empty': 'No highlight rules yet — click "+ Add rule" to create one',
'settings.highlight.deleteTitle': 'Delete highlight rule',
'settings.highlight.resetTitle': 'Restore default highlight rules',
'settings.highlight.resetDesc': 'Replaces every current rule with the built-in presets. This cannot be undone.',
'settings.highlight.resetOk': 'Restore',
'settings.highlight.createTitle': 'New highlight rule',
'settings.highlight.editTitle': 'Edit highlight rule',
'settings.highlight.builtin.perm': 'Linux permissions and user/group',
'settings.highlight.builtin.path': 'Linux file paths',
'settings.highlight.builtin.shellkw': 'Shell keywords and control flow',
'settings.highlight.builtin.danger': 'Dangerous / destructive commands',
'settings.highlight.builtin.secret': 'Possible secret / token',
'settings.highlight.builtin.loglevel': 'Log levels',
'settings.highlight.builtin.rootat': 'Root prompt (root@)',
'settings.highlight.builtin.exitcode': 'Exit codes',
'settings.highlight.builtin.percent': 'Percentages & progress',
'settings.highlight.builtin.http': 'HTTP status codes',
'settings.highlight.builtin.latency': 'Durations (milliseconds)',
'settings.highlight.builtin.delop': 'Delete / move / overwrite operations',
'settings.highlight.builtin.createop': 'Create / add operations',
'settings.highlight.builtin.okstate': 'Success states',
'settings.highlight.builtin.warnstate': 'Warnings and TODO markers',
'settings.highlight.builtin.badstate': 'Error / failure states',
'settings.highlight.builtin.quoted': 'Strings and quotes',
'settings.highlight.builtin.envvar': 'Environment variables and arguments',
'settings.highlight.builtin.ipv4': 'Network and IP addresses',
'settings.highlight.builtin.datetime': 'Time and date',
'settings.highlight.builtin.numbers': 'Numbers and counts',
'settings.highlight.builtin.url': 'Web links',
'settings.theme.accent': 'Tab accent color',
'settings.theme.accentDesc': 'Accent color for the active tab border, the sidebar indicator, and SSH badges',
'settings.theme.backgroundImage': 'Background image',
'settings.theme.backgroundImageDesc': 'Show an image behind the terminal; remove it to go back to a solid background. In every theme the image dims toward dark and text is brightened automatically; lower the opacity if it is still hard to read (20–40% works well for bright images)',
'settings.theme.chooseImage': 'Choose image',
'settings.theme.clearImage': 'Remove',
'settings.theme.imageOpacity': 'Image opacity',
'settings.theme.backgroundImageDim': 'Background dim',
'settings.theme.backgroundImageDimDesc': 'Overlays a black dim layer on top of the image; text is brightened automatically. 30–50% works well for bright images',
'settings.theme.customBadge': 'Custom',
'settings.theme.deleteTitle': 'Delete custom theme',
'settings.theme.create': 'New theme',
'settings.theme.editTitle': 'Edit theme',
'settings.themeEditor.name': 'Name',
'settings.themeEditor.namePlaceholder': 'Theme name',
'settings.themeEditor.duplicateName': 'Same name as another theme (saving is still allowed)',
'settings.themeEditor.copySuffix': ' (copy)',
'settings.about.currentVersion': 'Current version',
'settings.about.statusIdle': 'Click to check for updates',
'settings.about.statusChecking': 'Checking for updates…',
'settings.about.statusAvailable': 'A new version is available',
'settings.about.statusLatest': 'Already up to date',
'settings.about.statusDownloading': 'Downloading…',
'settings.about.statusDownloaded': 'Download complete — restart to install',
'settings.about.statusDownloadedAuto': 'Downloaded in the background — installs when you quit',
'settings.about.statusError': 'Check failed',
'settings.about.statusDev': 'Update checks are unavailable in development mode',
'settings.about.autoCheck': 'Check automatically at startup',
'settings.about.download': 'Download update',
'settings.about.downloadGithub': ' (GitHub source)',
'settings.about.install': 'Restart and install',
'settings.about.check': 'Check for updates',
'settings.about.checkingButton': 'Checking',
'settings.about.changelog': 'Changelog',
'settings.about.changelogEmpty': 'No changelog available'
}
export default settings