CI / typecheck + test + build (windows) (push) Canceled after 0s
基于两轮专项调研(字体/高亮各两路,子代理实测探针交叉印证)实施的完整改进。
## 修复的真实 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 已同步。
369 lines
23 KiB
TypeScript
369 lines
23 KiB
TypeScript
/** 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
|