diff --git a/website/README.md b/website/README.md index 4b10a2b..1a6fcc9 100644 --- a/website/README.md +++ b/website/README.md @@ -1,7 +1,8 @@ # OpenTerminal 官网 OpenTerminal 的产品介绍站点,部署在 GitHub Pages。 -纯静态 HTML + CSS,**无构建步骤、无第三方依赖**,改完即可发布。 +纯静态 HTML + CSS + 原生 JS,**无构建步骤、无第三方依赖**,改完即可发布。 +支持四语言:简体中文(源码基准)、繁体中文、English、日本語。 ## 线上地址 @@ -11,10 +12,12 @@ OpenTerminal 的产品介绍站点,部署在 GitHub Pages。 ``` website/ -├── index.html # 单页站点:功能介绍 / 下载 / 更新日志 +├── index.html # 单页站点:功能介绍 / 下载 / 更新日志(文案挂 data-i18n 键) ├── .nojekyll # 让 GitHub Pages 原样托管(跳过 Jekyll 处理) └── assets/ ├── style.css # 全部样式(深色默认 / 浅色可切换,主题令牌在 :root 与 html[data-theme='light']) + ├── i18n.js # 四语言文案字典 window.OPENTERMINAL_I18N + ├── i18n-apply.js # 语言层:选定语言 → 写 DOM / / title / meta,并绑定语言切换控件 ├── fonts/ # 自托管 woff2:Space Grotesk 400/500/600/700、JetBrains Mono 400/500/600 ├── shot-terminal.jpg # 主界面截图(三路分屏并行 AI 编程 Agent,含背景图个性化) ├── shot-agents.png # 多路 AI Agent 分屏截图(无背景图版) @@ -25,9 +28,80 @@ website/ └── icon.png # 应用图标(来自仓库 build/icon.png) ``` +## 语言层(i18n) + +**单文件 + 语言层**,不是复制四份 HTML:HTML 只有一份(文案是简体中文原文,同时作为缺键时的兜底), +所有可翻译文本通过 data 属性挂键,`assets/i18n.js` 提供四语言字典,`assets/i18n-apply.js` 在运行时写入。 + +### 三种挂键方式 + +| 属性 | 行为 | 例子 | +| --- | --- | --- | +| `data-i18n="k"` | 写 `textContent`(纯文本) | `

下载

` | +| `data-i18n-html="k"` | 写 `innerHTML`(需要内联标签时) | `

…
同一个…

` | +| `data-i18n-attr="attr:k"` | 写属性,多组用 `;` 分隔 | `` | + +`` 和三个 meta 也走同一套机制(`<title data-i18n="meta.title">`、`<meta … data-i18n-attr="content:meta.description">`), +所以「HTML 里出现的键」和「字典里的键」可以一次性机器比对,不存在漏网的特殊分支。 + +### 键命名 + +扁平命名,与 HTML 结构对应: + +- `meta.*`、`a11y.skip`、`brand.*` +- `nav.*`(含 `nav.themeToLight` / `nav.themeToDark`,由页尾脚本在主题切换时取用) +- `hero.*`、`spec.*` +- `features.*`、`cap.NN.title` / `cap.NN.li.N`(8 张能力卡)、`cap.hint` +- 四个 feature-row:`fw.*`(Workbench / AI Agent)、`fs.*`(SFTP)、`fc.*`(Customize)、`fl.*`(Security) +- `dl.*`(下载表格与自动更新说明)、`cl.*`(更新日志小节)、`changelog.<版本>.li.N`(每条更新一条键) +- `footer.*` + +产品名 `OpenTerminal`、版本号、命令、URL、快捷键(`Ctrl+L` / `Ctrl+F`)、技术名词(SSH / SFTP / WebGL / xterm.js / ZMODEM / MIT…)一律不译。 +各节拉丁 eyebrow(`Capabilities` / `Workbench` / `SFTP` / `Customize` / `Security` / `Download` / `Changelog`)是刻意的排版元素,四语言保持一致。 + +### 加一条文案 + +1. 在 `index.html` 的对应元素上加 `data-i18n="新键"`,元素里保留简体中文原文(作为兜底) +2. 在 `assets/i18n.js` 的**四个语言块里都加上同名键**——键集合必须完全一致 +3. 跑下面的「改完必跑」三条命令 + +漏加某个语言的键不会显示空白:`i18n-apply.js` 会回落到简体中文。但键集合不一致会让「键一致性」检查失败,属于必须修的。 + +### 语言选择与首帧防闪 + +选定语言优先级(`index.html` 头部内联脚本与 `i18n-apply.js` 用的是同一套判定): + +1. URL 参数 `?lang=xx`(一次性,不写 localStorage,便于分享指定语言的链接) +2. `localStorage['openterminal.lang']` +3. `navigator.languages` 前缀匹配(`zh-TW`/`zh-HK`/`zh-MO` → 繁中,其余 `zh*` → 简中,`ja*` → 日文,`en*` → 英文) +4. 默认 `zh-CN` + +**首帧不闪中文**:HTML 源码是简体中文,若等脚本跑完再翻译,非中文用户会先看到一帧中文。 +所以头部内联脚本在设置 `document.documentElement.lang` 的同时,非 `zh-CN` 时给 `<html>` 挂上 `data-i18n-pending`, +`style.css` 末尾的 `html[data-i18n-pending] body { visibility: hidden }` 把 body 先藏住; +页尾的 `i18n-apply.js` 应用完文案后立刻摘掉该属性(`finally` 里摘,异常也不会把页面藏死)。 +另有一条 2.5s 兜底定时器(头部脚本里),保证脚本加载失败时页面最终一定可见。 + +导航栏 `.nav-right` 里的 `<select class="lang-select" id="lang-select">`(在主题按钮左侧)负责切换: +换语言 → 写 `localStorage` → 重写全部文案与 `<html lang>` → 派发 `openterminal:langchange` 事件, +页尾脚本收到事件后重刷主题按钮的 `aria-label` / `title`。全程不刷新页面。 + ## 发新版本时需要更新的地方 -`index.html` 中搜索当前版本号,共 2 处下载链接(hero 主按钮、下载表格 exe)。 +版本号与链接都是**硬编码在 `index.html`**(版本号本身不翻译,不进字典),需要改的地方: + +1. `index.html` 中搜索旧版本号,替换为 `v<新版本>` / `<新版本>`: + - hero 主按钮 `id="dl-exe"` 的直链(1 处) + - hero-note 里的 `<span class="mono">`(1 处) + - `spec-strip` 里的 `<strong class="mono">`(1 处) + - 下载表格的 exe 文件名单元格与「下载」链接(2 处) +2. 下载表格里的文件大小(`.mono` 单元格,如 `109 MB`) +3. 「近期更新」小节:新增一条 `<article>`(最新的在最前面,结构保持 + `<h3><span class="mono">版本</span><span class="rel-date">日期</span></h3>` + `<ul><li>`), + 并删掉最旧的一条以控制长度(当前保留最近 5 条:1.0.25 / 1.0.24 / 1.0.23 / 1.0.22 / 1.0.21) +4. `assets/i18n.js`:给新版本加 `changelog.<新版本>.li.N` 键(**四个语言块都要加**), + 并删掉被移除那条的 `changelog.<旧版本>.li.*` 键(同样是四个语言块) + 自 v1.0.22 起不再提供 MSI,只有 NSIS exe 一条直链: ``` @@ -38,7 +112,44 @@ https://github.com/billowliu2/OpenTerminal/releases/download/v<版本>/OpenTermi (`HTTPS_PROXY=http://127.0.0.1:7897 node scripts/release.cjs <版本> --skip-gitea`), 否则直链 404。 -同时更新「近期更新」小节(与 RELEASE_NOTES.md 内容保持一致)和下载表格里的文件大小。 +### 改完必跑 + +```bash +# 1) 语法(在仓库根执行) +node --check website/assets/i18n.js +node --check website/assets/i18n-apply.js + +# 2) 四语言键集合一致性(缺失 / 多余 / 同一语言内重复键) +node -e ' +const fs=require("fs"); global.window={}; +require("./website/assets/i18n.js"); +const D=window.OPENTERMINAL_I18N, langs=Object.keys(D), base=new Set(Object.keys(D[langs[0]])); +let bad=false; +for (const l of langs) console.log(l, Object.keys(D[l]).length); +for (const l of langs.slice(1)) { + const s=new Set(Object.keys(D[l])); + const miss=[...base].filter(k=>!s.has(k)), extra=[...s].filter(k=>!base.has(k)); + if (miss.length||extra.length) { bad=true; console.log(l, "missing:", miss, "extra:", extra); } +} +console.log("键集合一致:", !bad);' + +# 3) index.html 引用的键在字典里都存在(防漏键显示空白) +node -e ' +const fs=require("fs"); global.window={}; +require("./website/assets/i18n.js"); +const D=window.OPENTERMINAL_I18N, langs=Object.keys(D); +const html=fs.readFileSync("website/index.html","utf8"); +const keys=new Set(); +for (const m of html.matchAll(/data-i18n(?:-html)?="([^"]+)"/g)) keys.add(m[1]); +for (const m of html.matchAll(/data-i18n-attr="([^"]+)"/g)) + m[1].split(";").forEach(p=>{const i=p.indexOf(":"); if(i>0) keys.add(p.slice(i+1).trim());}); +["nav.themeToLight","nav.themeToDark"].forEach(k=>keys.add(k)); +const dict=new Set(); langs.forEach(l=>Object.keys(D[l]).forEach(k=>dict.add(k))); +const missing=[...keys].filter(k=>!dict.has(k)); +const unused=[...dict].filter(k=>!keys.has(k)); +console.log("HTML 引用键:", keys.size, "字典键:", dict.size); +console.log("缺失:", missing.length?missing:"无", "| 未引用:", unused.length?unused:"无");' +``` ## 部署方式 @@ -61,14 +172,16 @@ python -m http.server 8080 --directory website npx serve website ``` -然后访问 `http://localhost:8080`。直接双击 `index.html` 也可以(无跨域资源)。 +然后访问 `http://localhost:8080`。直接双击 `index.html` 也可以(无跨域资源); +想看指定语言加参数即可,例如 `index.html?lang=ja`。 ## 设计约定 - **深色为主**:默认深色(`#0b0e12` 底 + 终端绿强调色),右上角按钮可切浅色;两套主题共用同一份令牌,新增样式一律走 CSS 变量,不要写死颜色 -- 主题选择存 `localStorage['openterminal.theme']`,首帧前由 `index.html` 头部的内联脚本定好,避免闪白/闪黑 +- 主题选择存 `localStorage['openterminal.theme']`,语言选择存 `localStorage['openterminal.lang']`,两者都在首帧前由 `index.html` 头部的内联脚本定好,避免闪白/闪黑与闪中文 +- 新增样式**只追加在 `style.css` 末尾**,不重排已有规则;语言切换控件(`.lang-select`)复用既有令牌,不改 `.theme-toggle` 的规则 - 全站只用**一个强调色**:深底 `#3fb950`、浅底 `#1a7f37`(对比度 ≥ 4.5:1) - 字体自托管(`assets/fonts/`),不依赖 Google Fonts:展示字体 Space Grotesk、等宽 JetBrains Mono;中文回落到系统栈 - 「核心能力」是横向滚动卡片轨道(箭头翻页 + 拖拽 + 键盘方向键),不再用三栏等高卡片 - 截图来自真实运行界面,与应用内设置一致;涉及 IP / 主机名等敏感信息的截图必须打码后再放入 `assets/` -- 中文为主要语言;文案保持具体、平实,避免营销套话 +- 文案保持具体、平实,避免营销套话;四语言都按各语言习惯写,不做逐字直译 diff --git a/website/assets/i18n-apply.js b/website/assets/i18n-apply.js new file mode 100644 index 0000000..baff421 --- /dev/null +++ b/website/assets/i18n-apply.js @@ -0,0 +1,128 @@ +/* OpenTerminal 官网语言层 + 选定语言的优先级(与 index.html 头部内联脚本完全一致): + 1. URL 参数 ?lang=xx + 2. localStorage['openterminal.lang'] + 3. navigator.language(s) 前缀匹配 + 4. 默认 zh-CN + index.html 头部内联脚本先按同一优先级把 <html lang> 定好(首帧防闪), + 本文件直接读 document.documentElement.lang 作为唯一事实源,不重复判定。 + + 应用规则: + - [data-i18n="k"] → textContent + - [data-i18n-html="k"] → innerHTML(字典是本地静态文件,非用户输入) + - [data-i18n-attr="alt:k;title:k2"] → 逐对写属性,分号分隔 + 缺键回落到 zh-CN;仍缺则保持 HTML 里的原文,不会把页面写空。 + + 语言切换后派发 document 事件 'openterminal:langchange'(detail.lang), + 页面尾部的内联脚本据此重刷主题按钮文案。 */ +(function () { + 'use strict'; + + var DICT = window.OPENTERMINAL_I18N || {}; + var STORAGE_KEY = 'openterminal.lang'; + var FALLBACK = 'zh-CN'; + var SUPPORTED = ['zh-CN', 'zh-TW', 'en', 'ja']; + + function normalize(tag) { + if (!tag) return null; + var t = String(tag).replace(/_/g, '-'); + if (/^zh-?(tw|hk|mo)/i.test(t)) return 'zh-TW'; + if (/^zh/i.test(t)) return 'zh-CN'; + if (/^ja/i.test(t)) return 'ja'; + if (/^en/i.test(t)) return 'en'; + return null; + } + + function tableOf(lang) { + return DICT[lang] || DICT[FALLBACK] || {}; + } + + function lookup(lang, key) { + var table = tableOf(lang); + if (Object.prototype.hasOwnProperty.call(table, key)) return table[key]; + var fb = DICT[FALLBACK] || {}; + if (Object.prototype.hasOwnProperty.call(fb, key)) return fb[key]; + return null; + } + + function applyAttrs(lang) { + var nodes = document.querySelectorAll('[data-i18n-attr]'); + for (var i = 0; i < nodes.length; i++) { + var pairs = nodes[i].getAttribute('data-i18n-attr').split(';'); + for (var j = 0; j < pairs.length; j++) { + var parts = pairs[j].split(':'); + if (parts.length < 2) continue; + var attr = parts[0].trim(); + var key = parts.slice(1).join(':').trim(); + var val = lookup(lang, key); + if (attr && val !== null) nodes[i].setAttribute(attr, val); + } + } + } + + function applyText(lang) { + var nodes = document.querySelectorAll('[data-i18n]'); + for (var i = 0; i < nodes.length; i++) { + var val = lookup(lang, nodes[i].getAttribute('data-i18n')); + if (val !== null) nodes[i].textContent = val; + } + } + + function applyHtml(lang) { + var nodes = document.querySelectorAll('[data-i18n-html]'); + for (var i = 0; i < nodes.length; i++) { + var val = lookup(lang, nodes[i].getAttribute('data-i18n-html')); + if (val !== null) nodes[i].innerHTML = val; + } + } + + function clearPending() { + document.documentElement.removeAttribute('data-i18n-pending'); + } + + function apply(lang, announce) { + var target = normalize(lang) || FALLBACK; + try { + document.documentElement.lang = target; + applyText(target); + applyHtml(target); + applyAttrs(target); + } finally { + // 任何异常都不能让 body 一直藏在 visibility:hidden 后面 + clearPending(); + } + var sel = document.getElementById('lang-select'); + if (sel && sel.value !== target) sel.value = target; + if (announce) { + try { + document.dispatchEvent(new CustomEvent('openterminal:langchange', { detail: { lang: target } })); + } catch (e) { + var ev = document.createEvent('Event'); + ev.initEvent('openterminal:langchange', true, true); + ev.detail = { lang: target }; + document.dispatchEvent(ev); + } + } + return target; + } + + // 头部内联脚本已经定好语言;这里只是把它落到 DOM 上 + var current = apply(document.documentElement.lang || FALLBACK, false); + + var select = document.getElementById('lang-select'); + if (select) { + select.value = current; + select.addEventListener('change', function () { + var next = normalize(select.value) || FALLBACK; + try { localStorage.setItem(STORAGE_KEY, next); } catch (e) {} + current = apply(next, true); + }); + } + + window.OPENTERMINAL_SET_LANG = function (lang) { + current = apply(lang, true); + try { localStorage.setItem(STORAGE_KEY, current); } catch (e) {} + return current; + }; + window.OPENTERMINAL_I18N_SUPPORTED = SUPPORTED.slice(); +})(); diff --git a/website/assets/i18n.js b/website/assets/i18n.js new file mode 100644 index 0000000..e07ff25 --- /dev/null +++ b/website/assets/i18n.js @@ -0,0 +1,719 @@ +/* OpenTerminal 官网文案字典 + 四语言键集合必须完全一致(zh-CN / zh-TW / en / ja)。 + 扁平命名:nav.* / hero.* / spec.* / cap.NN.* / fw|fs|fc|fl.* / dl.* / changelog.* / cl.* / footer.* + - 键名以 HTML 里的 data-i18n / data-i18n-html / data-i18n-attr 为准,改键名要两边一起改 + - data-i18n-html 的值允许内联标签(目前只有 hero.title 用到 <br /> 与 <span class="accent">) + - 产品名 OpenTerminal、版本号、命令、URL、快捷键(Ctrl+L 等)、技术名词(SSH/SFTP/WebGL/xterm.js/ZMODEM/MIT…)一律不译 + - 各节拉丁 eyebrow(Capabilities / Workbench / SFTP / Customize / Security / Download / Changelog)是刻意的排版元素,四语言保持一致 + 新增键后请跑:node --check website/assets/i18n.js,并比对四语言键集合 */ +window.OPENTERMINAL_I18N = { + + 'zh-CN': { + 'meta.title': 'OpenTerminal - 本地终端 / SSH / SFTP 桌面终端,开源 Windows 终端工具', + 'meta.description': 'OpenTerminal 是开源的 Windows 桌面终端:本地终端、SSH 远程会话、SFTP 文件管理、分屏与广播输入、主题定制。MIT 协议,支持自动更新。', + 'meta.ogTitle': 'OpenTerminal - 本地终端 / SSH / SFTP 桌面终端', + 'meta.ogDescription': '开源的 Windows 桌面终端:本地终端、SSH 远程会话、SFTP 文件管理、分屏与广播输入。MIT 协议,支持自动更新。', + + 'a11y.skip': '跳到主要内容', + 'brand.iconAlt': 'OpenTerminal 图标', + + 'nav.aria': '站内导航', + 'nav.features': '功能', + 'nav.download': '下载', + 'nav.changelog': '更新日志', + 'nav.langAria': '界面语言', + 'nav.themeToggle': '切换明暗主题', + 'nav.themeToLight': '切换到浅色主题', + 'nav.themeToDark': '切换到深色主题', + + 'hero.kicker': '开源桌面终端 · MIT 协议', + 'hero.title': '本地终端、SSH 与 SFTP<br />装进<span class="accent">同一个</span>桌面应用', + 'hero.sub': 'OpenTerminal 面向开发和运维场景:WebGL 加速的终端渲染、可分屏的 SSH 会话、内置 SFTP 文件管理与广播输入。安装即用,支持自动更新。', + 'hero.download': '下载 Windows 安装包', + 'hero.source': '查看源码', + 'hero.notePre': '当前版本', + 'hero.notePost': '· NSIS exe 安装包,支持应用内自动更新。', + 'hero.shot.alt': 'OpenTerminal 主界面:三路分屏并行运行 Kimi Code、Claude Code 与 Codex', + 'hero.shot.caption': '三路分屏并行运行 AI 编程 Agent,背景图与压暗层可自定义', + + 'spec.version': '当前版本', + 'spec.os': 'Windows 10 / 11 · x64', + 'spec.license': 'MIT 开源协议', + 'spec.update': 'exe 支持应用内自动更新', + + 'features.eyebrow': 'Capabilities', + 'features.title': '核心能力', + 'features.sub': '按使用场景划分的能力组,左右拖动或用箭头浏览;完整清单见仓库 README。', + 'features.prev': '向左浏览能力卡片', + 'features.next': '向右浏览能力卡片', + 'features.trackAria': '核心能力,可横向滚动', + + 'cap.01.title': '终端核心', + 'cap.01.li.1': 'node-pty 本地会话,自动探测 PowerShell / zsh / bash', + 'cap.01.li.2': 'xterm.js WebGL 渲染,声明 256 色与真彩,异常自动降级', + 'cap.01.li.3': '内嵌搜索(Ctrl+F)、命令历史、粘贴风险确认', + 'cap.01.li.4': '关键词高亮 22 条内置规则,支持自定义正则与三档强度', + 'cap.01.li.5': '字体、字重、字距、行高、光标样式实时生效', + + 'cap.02.title': 'SSH 会话', + 'cap.02.li.1': 'ssh2 实现:密码、私钥(文件或粘贴内容)、SSH Agent', + 'cap.02.li.2': '多路分屏与广播输入,一次操作下发到多台主机', + 'cap.02.li.3': '主机指纹校验、首次连接确认、变更告警', + 'cap.02.li.4': 'ZMODEM 传输支持(sz / rz)', + 'cap.02.li.5': 'OSC 7 上报工作目录,新会话按上次位置恢复', + + 'cap.03.title': 'SFTP 文件面板', + 'cap.03.li.1': '列表头列分明:名称、大小、修改时间、权限、用户/组', + 'cap.03.li.2': '点击列头排序;文件名解析为真实用户与组名', + 'cap.03.li.3': '字体缩放 80%–180%,Ctrl+滚轮或工具栏按钮', + 'cap.03.li.4': '上传下载、同名覆盖确认、chmod / chown 编辑', + 'cap.03.li.5': '大目录虚拟滚动,上万条目不卡窗口', + + 'cap.04.title': '工作区与布局', + 'cap.04.li.1': 'dockview 分屏:任意拆分、拖拽、合并与浮动', + 'cap.04.li.2': '布局模板保存与一键套用', + 'cap.04.li.3': '启动恢复上次会话布局', + 'cap.04.li.4': '界面缩放 50% 至 150%', + + 'cap.05.title': '主题与外观', + 'cap.05.li.1': '主题编辑器:22 个颜色位逐项调整,实时预览', + 'cap.05.li.2': '内置 11 套主题,跟随系统明暗自动切换', + 'cap.05.li.3': '自定义背景图片、不透明度与压暗层', + 'cap.05.li.4': '标签强调色、高亮配色跟随主题', + + 'cap.06.title': '效率工具', + 'cap.06.li.1': '命令库:保存常用命令片段,跨会话发送到指定终端', + 'cap.06.li.2': '高亮规则集按主机绑定,不同服务器不同配色', + 'cap.06.li.3': '规则导入导出、实时预览与命中统计', + 'cap.06.li.4': '会话快照与恢复、终端标签自动命名', + + 'cap.07.title': '系统监控', + 'cap.07.li.1': 'CPU、负载、内存、磁盘、网络实时面板', + 'cap.07.li.2': '每核占用与磁盘分区明细', + 'cap.07.li.3': '运行时长与网络速率曲线', + 'cap.07.li.4': '随会话打开,不额外占用通道', + + 'cap.08.title': '锁屏与安全', + 'cap.08.li.1': 'Ctrl+L 一键锁屏,支持闲置自动锁定与启动即锁', + 'cap.08.li.2': '密码经 scrypt 加盐哈希存储,不落盘明文', + 'cap.08.li.3': '输错触发递增冷却;锁定期间禁用菜单与刷新快捷键', + 'cap.08.li.4': '锁屏只是遮罩:背后会话与传输不中断', + + 'cap.hint': '← 拖动浏览 · 共 8 组能力', + + 'fw.eyebrow': 'Workbench', + 'fw.title': 'AI Agent 工作台', + 'fw.li.1': '多路分屏并行运行 Kimi Code、Claude Code、Codex 等 AI 编程工具', + 'fw.li.2': '为高频刷新的 TUI 界面优化:终端尺寸去抖同步,避免反复重绘', + 'fw.li.3': '中文输入法候选窗紧贴光标,TUI 内输入中文不再漂移', + 'fw.li.4': '关键词高亮自动标出错误、警告、HTTP 状态码与百分比', + 'fw.shot.alt': 'OpenTerminal 多路分屏运行 Kimi Code、Claude Code、Codex 等 AI 编程 Agent', + + 'fs.eyebrow': 'SFTP', + 'fs.title': '远程文件面板', + 'fs.li.1': '列表头列分明:名称、大小、修改时间、权限、用户/组,点击列头排序', + 'fs.li.2': '文件名解析为真实用户与组名(root/root、eveuser/eveuser),不再只有数字', + 'fs.li.3': '字体缩放 80%–180%:Ctrl+滚轮或工具栏按钮,行高与字号联动并记忆', + 'fs.li.4': '上传 / 下载、同名覆盖确认、chmod 权限与 chown 属主编辑', + 'fs.li.5': '大目录虚拟滚动,上万条目不卡窗口', + 'fs.shot.alt': 'OpenTerminal SFTP 文件面板:列表头、可排序列、完整修改时间与用户/组', + 'fs.shot.alt2': 'OpenTerminal 在文件列表空白处右键弹出同款文件菜单', + 'fs.caption': '列表空白处右键同样是完整文件菜单,行内右键则作用于所选条目', + + 'fc.eyebrow': 'Customize', + 'fc.title': '定制与效率', + 'fc.li.1': '主题编辑器:22 个颜色位逐项调整,实时预览;支持自定义背景图片、不透明度与压暗层', + 'fc.li.2': '内置 11 套主题,跟随系统明暗自动切换', + 'fc.li.3': '命令库:保存常用命令片段,跨会话发送到指定终端', + 'fc.li.4': '启动恢复上次会话布局;界面缩放 50% 至 150%', + 'fc.li.5': '四语言界面:简体中文、繁体中文、English、日本語', + 'fc.shot.alt': 'OpenTerminal 主题设置:背景图片、不透明度、压暗层与主题画廊', + + 'fl.eyebrow': 'Security', + 'fl.title': '锁屏与安全', + 'fl.li.1': 'Ctrl+L 一键锁屏,支持闲置自动锁定与启动即锁', + 'fl.li.2': '锁定期间禁用应用菜单、页面刷新与开发者工具快捷键', + 'fl.li.3': '密码经 scrypt 加盐哈希存储,不落盘明文;输错触发递增冷却', + 'fl.li.4': '锁屏只是遮罩:背后的终端会话与文件传输保持运行不中断', + 'fl.shot.alt': 'OpenTerminal 锁屏界面:不透明遮罩与密码解锁', + + 'dl.eyebrow': 'Download', + 'dl.title': '下载', + 'dl.sub': '从 GitHub Releases 下载;全部历史版本在同一页面。', + 'dl.th.pkg': '安装包', + 'dl.th.scene': '适用场景', + 'dl.th.size': '大小', + 'dl.th.link': '链接', + 'dl.table.exe': 'NSIS 安装包,支持应用内自动更新(推荐)', + 'dl.table.download': '下载', + 'dl.table.history': '历史版本', + 'dl.table.historyScene': '全部发布记录与更新说明', + 'dl.table.releases': 'releases 列表', + 'dl.note.title': '自动更新说明', + 'dl.note.body': '应用内检查更新优先访问 GitHub Releases(跟随系统代理),失败时自动回退国内 git.codingplan.site 更新通道(直连)。更新包经 SHA-512 校验后安装。更新说明文字从发布通道的 release-notes.md 读取,与每次发布同步更新。自 v1.0.22 起不再提供 MSI 安装包,统一使用 NSIS exe。', + + 'cl.eyebrow': 'Changelog', + 'cl.title': '近期更新', + + 'changelog.1.0.25.li.1': '定时检查更新(从不 / 4 / 12 / 24 小时,默认 4)', + 'changelog.1.0.25.li.2': '自动下载更新开关(后台静默下载,安装时机仍由用户决定,绝不自动退出)', + 'changelog.1.0.25.li.3': '下载完成 / 发现新版本时窗口最小化到托盘则弹提示', + 'changelog.1.0.25.li.4': '同版本不重复提示或重复下载', + + 'changelog.1.0.24.li.1': '修复应用旧版布局模板会误杀全部 SSH 会话', + 'changelog.1.0.24.li.2': '配置文件损坏时先备份再重置(不再静默销毁命令库 / 书签 / 设置)', + 'changelog.1.0.24.li.3': '会话日志退出不再丢尾部', + 'changelog.1.0.24.li.4': 'SFTP 删除不再误报失败;ZMODEM 接收大文件内存可控;新增 3 组渲染层测试', + + 'changelog.1.0.23.li.1': 'SFTP 文件面板改为真正的表格:六列对齐、表头吸顶、点击列头排序', + 'changelog.1.0.23.li.2': '字体可缩放 0.8–1.8 倍(A- / A+ 或 Ctrl+滚轮),行高联动并记忆设置', + 'changelog.1.0.23.li.3': '用户 / 组列显示真实名称,不再只有数字 UID / GID', + 'changelog.1.0.23.li.4': '列表空白处右键即可唤出文件菜单;修复六列此前未真正按网格对齐的问题', + + 'changelog.1.0.22.li.1': '修复中文输入法候选窗不跟随光标(v1.0.21 回归)', + 'changelog.1.0.22.li.2': '不再提供 MSI 安装包,统一使用 NSIS exe', + 'changelog.1.0.22.li.3': '打包流程新增依赖一致性校验,防止旧依赖混入安装包', + + 'changelog.1.0.21.li.1': '背景图体验:任意主题下调透明度均为压暗、文字自动提亮到 WCAG AA、新增背景压暗滑杆', + 'changelog.1.0.21.li.2': '性能:设置热更不再触发全窗格重排,SFTP 大目录虚拟滚动,面板独立错误边界', + 'changelog.1.0.21.li.3': '安装包精简约 90MB;SFTP/ZMODEM 本地路径准入与多处安全加固', + + 'cl.morePre': '完整日志见仓库', + 'cl.morePost': '。', + + 'footer.copyright': '© 2026 CodingPlan.Site · OpenTerminal 以 MIT 协议开源', + 'footer.channel': '更新通道:git.codingplan.site' + }, + + 'zh-TW': { + 'meta.title': 'OpenTerminal - 本機終端機 / SSH / SFTP 桌面終端機,開源 Windows 終端機工具', + 'meta.description': 'OpenTerminal 是開源的 Windows 桌面終端機:本機終端機、SSH 遠端連線、SFTP 檔案管理、分割視窗與廣播輸入、主題自訂。MIT 授權,支援自動更新。', + 'meta.ogTitle': 'OpenTerminal - 本機終端機 / SSH / SFTP 桌面終端機', + 'meta.ogDescription': '開源的 Windows 桌面終端機:本機終端機、SSH 遠端連線、SFTP 檔案管理、分割視窗與廣播輸入。MIT 授權,支援自動更新。', + + 'a11y.skip': '跳至主要內容', + 'brand.iconAlt': 'OpenTerminal 圖示', + + 'nav.aria': '站內導覽', + 'nav.features': '功能', + 'nav.download': '下載', + 'nav.changelog': '更新日誌', + 'nav.langAria': '介面語言', + 'nav.themeToggle': '切換明暗主題', + 'nav.themeToLight': '切換到淺色主題', + 'nav.themeToDark': '切換到深色主題', + + 'hero.kicker': '開源桌面終端機 · MIT 授權', + 'hero.title': '本機終端機、SSH 與 SFTP<br />裝進<span class="accent">同一個</span>桌面應用程式', + 'hero.sub': 'OpenTerminal 面向開發與維運場景:WebGL 加速的終端機渲染、可分割視窗的 SSH 連線、內建 SFTP 檔案管理與廣播輸入。安裝即用,支援自動更新。', + 'hero.download': '下載 Windows 安裝程式', + 'hero.source': '檢視原始碼', + 'hero.notePre': '目前版本', + 'hero.notePost': '· NSIS exe 安裝程式,支援應用程式內自動更新。', + 'hero.shot.alt': 'OpenTerminal 主畫面:三路分割視窗同時執行 Kimi Code、Claude Code 與 Codex', + 'hero.shot.caption': '三路分割視窗同時執行 AI 編程 Agent,背景圖片與壓暗層可自訂', + + 'spec.version': '目前版本', + 'spec.os': 'Windows 10 / 11 · x64', + 'spec.license': 'MIT 開源授權', + 'spec.update': 'exe 支援應用程式內自動更新', + + 'features.eyebrow': 'Capabilities', + 'features.title': '核心能力', + 'features.sub': '依使用情境劃分的能力群組,可左右拖曳或用箭頭瀏覽;完整清單請見倉庫 README。', + 'features.prev': '向左瀏覽能力卡片', + 'features.next': '向右瀏覽能力卡片', + 'features.trackAria': '核心能力,可橫向捲動', + + 'cap.01.title': '終端機核心', + 'cap.01.li.1': 'node-pty 本機工作階段,自動偵測 PowerShell / zsh / bash', + 'cap.01.li.2': 'xterm.js WebGL 渲染,宣告 256 色與全彩,異常時自動降級', + 'cap.01.li.3': '內嵌搜尋(Ctrl+F)、指令歷史、貼上風險確認', + 'cap.01.li.4': '關鍵字標亮 22 條內建規則,支援自訂正規表達式與三種強度', + 'cap.01.li.5': '字型、字重、字距、行高、游標樣式即時生效', + + 'cap.02.title': 'SSH 工作階段', + 'cap.02.li.1': 'ssh2 實作:密碼、私密金鑰(檔案或貼上內容)、SSH Agent', + 'cap.02.li.2': '多路分割視窗與廣播輸入,一次操作下發到多台主機', + 'cap.02.li.3': '主機指紋驗證、首次連線確認、變更告警', + 'cap.02.li.4': 'ZMODEM 傳輸支援(sz / rz)', + 'cap.02.li.5': 'OSC 7 回報工作目錄,新工作階段依上次位置還原', + + 'cap.03.title': 'SFTP 檔案面板', + 'cap.03.li.1': '表頭欄位分明:名稱、大小、修改時間、權限、使用者 / 群組', + 'cap.03.li.2': '點擊表頭排序;檔名解析為真實使用者與群組名稱', + 'cap.03.li.3': '字型縮放 80%–180%,Ctrl+滾輪或工具列按鈕', + 'cap.03.li.4': '上傳下載、同名覆寫確認、chmod / chown 編輯', + 'cap.03.li.5': '大目錄虛擬捲動,上萬項目不卡視窗', + + 'cap.04.title': '工作區與版面配置', + 'cap.04.li.1': 'dockview 分割視窗:任意分割、拖曳、合併與浮動', + 'cap.04.li.2': '版面配置範本儲存與一鍵套用', + 'cap.04.li.3': '啟動時還原上次工作階段版面', + 'cap.04.li.4': '介面縮放 50% 至 150%', + + 'cap.05.title': '主題與外觀', + 'cap.05.li.1': '主題編輯器:22 個顏色欄位逐項調整,即時預覽', + 'cap.05.li.2': '內建 11 套主題,跟隨系統明暗自動切換', + 'cap.05.li.3': '自訂背景圖片、不透明度與壓暗層', + 'cap.05.li.4': '分頁強調色、標亮配色跟隨主題', + + 'cap.06.title': '效率工具', + 'cap.06.li.1': '指令庫:儲存常用指令片段,跨工作階段傳送到指定終端機', + 'cap.06.li.2': '標亮規則集依主機綁定,不同伺服器不同配色', + 'cap.06.li.3': '規則匯入匯出、即時預覽與命中統計', + 'cap.06.li.4': '工作階段快照與還原、終端機分頁自動命名', + + 'cap.07.title': '系統監控', + 'cap.07.li.1': 'CPU、負載、記憶體、磁碟、網路即時面板', + 'cap.07.li.2': '每核心使用率與磁碟分割區明細', + 'cap.07.li.3': '運行時間與網路速率曲線', + 'cap.07.li.4': '隨工作階段開啟,不額外佔用通道', + + 'cap.08.title': '鎖定畫面與安全', + 'cap.08.li.1': 'Ctrl+L 一鍵鎖定,支援閒置自動鎖定與啟動即鎖定', + 'cap.08.li.2': '密碼以 scrypt 加鹽雜湊儲存,不寫入明文', + 'cap.08.li.3': '輸入錯誤觸發遞增冷卻;鎖定期間停用選單與重新整理快速鍵', + 'cap.08.li.4': '鎖定畫面只是遮罩:背後的工作階段與傳輸不中斷', + + 'cap.hint': '← 拖曳瀏覽 · 共 8 組能力', + + 'fw.eyebrow': 'Workbench', + 'fw.title': 'AI Agent 工作台', + 'fw.li.1': '多路分割視窗同時執行 Kimi Code、Claude Code、Codex 等 AI 編程工具', + 'fw.li.2': '為高頻更新的 TUI 介面最佳化:終端機尺寸去抖同步,避免反覆重繪', + 'fw.li.3': '中文輸入法候選窗緊貼游標,在 TUI 內輸入中文不再漂移', + 'fw.li.4': '關鍵字標亮自動標出錯誤、警告、HTTP 狀態碼與百分比', + 'fw.shot.alt': 'OpenTerminal 多路分割視窗執行 Kimi Code、Claude Code、Codex 等 AI 編程 Agent', + + 'fs.eyebrow': 'SFTP', + 'fs.title': '遠端檔案面板', + 'fs.li.1': '表頭欄位分明:名稱、大小、修改時間、權限、使用者 / 群組,點擊表頭排序', + 'fs.li.2': '檔名解析為真實使用者與群組名稱(root/root、eveuser/eveuser),不再只有數字', + 'fs.li.3': '字型縮放 80%–180%:Ctrl+滾輪或工具列按鈕,行高與字級連動並記憶', + 'fs.li.4': '上傳 / 下載、同名覆寫確認、chmod 權限與 chown 擁有者編輯', + 'fs.li.5': '大目錄虛擬捲動,上萬項目不卡視窗', + 'fs.shot.alt': 'OpenTerminal SFTP 檔案面板:表頭、可排序欄位、完整修改時間與使用者 / 群組', + 'fs.shot.alt2': 'OpenTerminal 在檔案清單空白處按右鍵彈出同款檔案選單', + 'fs.caption': '清單空白處按右鍵同樣是完整檔案選單,行內按右鍵則作用於所選項目', + + 'fc.eyebrow': 'Customize', + 'fc.title': '自訂與效率', + 'fc.li.1': '主題編輯器:22 個顏色欄位逐項調整,即時預覽;支援自訂背景圖片、不透明度與壓暗層', + 'fc.li.2': '內建 11 套主題,跟隨系統明暗自動切換', + 'fc.li.3': '指令庫:儲存常用指令片段,跨工作階段傳送到指定終端機', + 'fc.li.4': '啟動時還原上次工作階段版面;介面縮放 50% 至 150%', + 'fc.li.5': '四語言介面:簡體中文、繁體中文、English、日本語', + 'fc.shot.alt': 'OpenTerminal 主題設定:背景圖片、不透明度、壓暗層與主題畫廊', + + 'fl.eyebrow': 'Security', + 'fl.title': '鎖定畫面與安全', + 'fl.li.1': 'Ctrl+L 一鍵鎖定,支援閒置自動鎖定與啟動即鎖定', + 'fl.li.2': '鎖定期間停用應用程式選單、頁面重新整理與開發者工具快速鍵', + 'fl.li.3': '密碼以 scrypt 加鹽雜湊儲存,不寫入明文;輸入錯誤觸發遞增冷卻', + 'fl.li.4': '鎖定畫面只是遮罩:背後的終端機工作階段與檔案傳輸保持運行不中斷', + 'fl.shot.alt': 'OpenTerminal 鎖定畫面:不透明遮罩與密碼解鎖', + + 'dl.eyebrow': 'Download', + 'dl.title': '下載', + 'dl.sub': '從 GitHub Releases 下載;所有歷史版本都在同一頁面。', + 'dl.th.pkg': '安裝程式', + 'dl.th.scene': '適用情境', + 'dl.th.size': '大小', + 'dl.th.link': '連結', + 'dl.table.exe': 'NSIS 安裝程式,支援應用程式內自動更新(推薦)', + 'dl.table.download': '下載', + 'dl.table.history': '歷史版本', + 'dl.table.historyScene': '所有發佈記錄與更新說明', + 'dl.table.releases': 'releases 清單', + 'dl.note.title': '自動更新說明', + 'dl.note.body': '應用程式內檢查更新會優先存取 GitHub Releases(跟隨系統代理設定),失敗時自動回退到國內 git.codingplan.site 更新通道(直連)。更新檔經 SHA-512 校驗後安裝。更新說明文字從發佈通道的 release-notes.md 讀取,與每次發佈同步更新。自 v1.0.22 起不再提供 MSI 安裝程式,統一使用 NSIS exe。', + + 'cl.eyebrow': 'Changelog', + 'cl.title': '近期更新', + + 'changelog.1.0.25.li.1': '定時檢查更新(從不 / 4 / 12 / 24 小時,預設 4)', + 'changelog.1.0.25.li.2': '自動下載更新開關(背景靜默下載,安裝時機仍由使用者決定,絕不自動結束)', + 'changelog.1.0.25.li.3': '下載完成 / 發現新版本時,視窗若最小化到系統匣會彈出提示', + 'changelog.1.0.25.li.4': '同一版本不重複提示、不重複下載', + + 'changelog.1.0.24.li.1': '修復套用舊版版面配置範本會誤殺全部 SSH 工作階段的問題', + 'changelog.1.0.24.li.2': '設定檔損毀時先備份再重置(不再靜默銷毀指令庫 / 書籤 / 設定)', + 'changelog.1.0.24.li.3': '工作階段日誌結束時不再遺失尾段', + 'changelog.1.0.24.li.4': 'SFTP 刪除不再誤報失敗;ZMODEM 接收大檔案的記憶體用量可控;新增 3 組渲染層測試', + + 'changelog.1.0.23.li.1': 'SFTP 檔案面板改為真正的表格:六欄對齊、表頭固定、點擊表頭排序', + 'changelog.1.0.23.li.2': '字型可縮放 0.8–1.8 倍(A- / A+ 或 Ctrl+滾輪),行高連動並記憶設定', + 'changelog.1.0.23.li.3': '使用者 / 群組欄顯示真實名稱,不再只有數字 UID / GID', + 'changelog.1.0.23.li.4': '清單空白處按右鍵即可喚出檔案選單;修復六欄先前未真正依格線對齊的問題', + + 'changelog.1.0.22.li.1': '修復中文輸入法候選窗不跟隨游標(v1.0.21 回歸)', + 'changelog.1.0.22.li.2': '不再提供 MSI 安裝程式,統一使用 NSIS exe', + 'changelog.1.0.22.li.3': '打包流程新增相依性一致性校驗,防止舊相依性混入安裝程式', + + 'changelog.1.0.21.li.1': '背景圖片體驗:任何主題下調低不透明度都是壓暗、文字自動提亮至 WCAG AA、新增背景壓暗滑桿', + 'changelog.1.0.21.li.2': '效能:設定熱更新不再觸發全部窗格重排,SFTP 大目錄虛擬捲動,面板獨立錯誤邊界', + 'changelog.1.0.21.li.3': '安裝程式精簡約 90MB;SFTP/ZMODEM 本機路徑准入與多處安全加固', + + 'cl.morePre': '完整日誌請見倉庫', + 'cl.morePost': '。', + + 'footer.copyright': '© 2026 CodingPlan.Site · OpenTerminal 以 MIT 授權開源', + 'footer.channel': '更新通道:git.codingplan.site' + }, + + en: { + 'meta.title': 'OpenTerminal - Local terminal, SSH & SFTP desktop terminal for Windows', + 'meta.description': 'OpenTerminal is an open-source desktop terminal for Windows: local shells, SSH sessions, SFTP file management, split panes with broadcast input, and deep theming. MIT licensed, with built-in auto-update.', + 'meta.ogTitle': 'OpenTerminal - Local terminal, SSH & SFTP desktop terminal', + 'meta.ogDescription': 'An open-source desktop terminal for Windows: local shells, SSH sessions, SFTP file management, and split panes with broadcast input. MIT licensed, with built-in auto-update.', + + 'a11y.skip': 'Skip to main content', + 'brand.iconAlt': 'OpenTerminal icon', + + 'nav.aria': 'Site navigation', + 'nav.features': 'Features', + 'nav.download': 'Download', + 'nav.changelog': 'Changelog', + 'nav.langAria': 'Interface language', + 'nav.themeToggle': 'Toggle light and dark theme', + 'nav.themeToLight': 'Switch to light theme', + 'nav.themeToDark': 'Switch to dark theme', + + 'hero.kicker': 'Open-source desktop terminal · MIT licensed', + 'hero.title': 'Local shells, SSH and SFTP<br />in <span class="accent">one</span> desktop app', + 'hero.sub': 'OpenTerminal is built for developers and sysadmins: WebGL-accelerated terminal rendering, SSH sessions you can split into panes, built-in SFTP file management and broadcast input. Install and go, with auto-update built in.', + 'hero.download': 'Download for Windows', + 'hero.source': 'View source', + 'hero.notePre': 'Current version', + 'hero.notePost': '· NSIS installer with in-app auto-update.', + 'hero.shot.alt': 'OpenTerminal main window: three split panes running Kimi Code, Claude Code and Codex side by side', + 'hero.shot.caption': 'Three AI coding agents running side by side — background image and dim layer are customizable', + + 'spec.version': 'Current version', + 'spec.os': 'Windows 10 / 11 · x64', + 'spec.license': 'MIT open-source license', + 'spec.update': 'In-app auto-update via exe', + + 'features.eyebrow': 'Capabilities', + 'features.title': 'Core capabilities', + 'features.sub': 'Capability groups organized by workflow — drag sideways or use the arrows to browse. See the repository README for the full list.', + 'features.prev': 'Scroll capability cards left', + 'features.next': 'Scroll capability cards right', + 'features.trackAria': 'Core capabilities, horizontally scrollable', + + 'cap.01.title': 'Terminal core', + 'cap.01.li.1': 'node-pty local sessions with automatic PowerShell / zsh / bash detection', + 'cap.01.li.2': 'xterm.js WebGL rendering, 256-color and true-color advertised, automatic fallback on failure', + 'cap.01.li.3': 'Built-in search (Ctrl+F), command history, paste-risk confirmation', + 'cap.01.li.4': 'Keyword highlighting with 22 built-in rules, custom regex and three intensity levels', + 'cap.01.li.5': 'Font, weight, letter spacing, line height and cursor style apply live', + + 'cap.02.title': 'SSH sessions', + 'cap.02.li.1': 'Built on ssh2: password, private key (file or pasted) and SSH Agent auth', + 'cap.02.li.2': 'Multi-pane split view with broadcast input — send one command to many hosts at once', + 'cap.02.li.3': 'Host key verification, first-connection confirmation and change warnings', + 'cap.02.li.4': 'ZMODEM transfer support (sz / rz)', + 'cap.02.li.5': 'OSC 7 working-directory reporting — new sessions resume where you left off', + + 'cap.03.title': 'SFTP file panel', + 'cap.03.li.1': 'Clear column headers: name, size, modified time, permissions, user / group', + 'cap.03.li.2': 'Click a header to sort; user and group IDs resolve to real names', + 'cap.03.li.3': 'Font scaling from 80% to 180% via Ctrl+wheel or toolbar buttons', + 'cap.03.li.4': 'Upload and download, overwrite confirmation, chmod / chown editing', + 'cap.03.li.5': 'Virtual scrolling for huge directories — tens of thousands of entries stay smooth', + + 'cap.04.title': 'Workspace and layout', + 'cap.04.li.1': 'dockview panes: split, drag, merge and float freely', + 'cap.04.li.2': 'Save layout templates and apply them in one click', + 'cap.04.li.3': 'Restore your last session layout on startup', + 'cap.04.li.4': 'Interface zoom from 50% to 150%', + + 'cap.05.title': 'Themes and appearance', + 'cap.05.li.1': 'Theme editor: tune all 22 color slots with live preview', + 'cap.05.li.2': '11 built-in themes that follow the system light / dark setting', + 'cap.05.li.3': 'Custom background image, opacity and dim layer', + 'cap.05.li.4': 'Tab accent color; highlight colors follow the theme', + + 'cap.06.title': 'Productivity tools', + 'cap.06.li.1': 'Command library: save snippets and send them to any terminal from any session', + 'cap.06.li.2': 'Bind highlight rule sets per host — different colors for different servers', + 'cap.06.li.3': 'Import and export rules, live preview and match statistics', + 'cap.06.li.4': 'Session snapshots and restore, automatic terminal tab naming', + + 'cap.07.title': 'System monitoring', + 'cap.07.li.1': 'Live CPU, load, memory, disk and network panel', + 'cap.07.li.2': 'Per-core usage and per-partition disk details', + 'cap.07.li.3': 'Uptime and network throughput graphs', + 'cap.07.li.4': 'Opens with the session — no extra channel needed', + + 'cap.08.title': 'Lock screen and security', + 'cap.08.li.1': 'Ctrl+L locks instantly; idle auto-lock and lock-on-startup available', + 'cap.08.li.2': 'Passwords stored as salted scrypt hashes — never in plain text', + 'cap.08.li.3': 'Wrong attempts trigger escalating cooldowns; menus and reload shortcuts are disabled while locked', + 'cap.08.li.4': 'The lock screen is just an overlay — sessions and transfers keep running behind it', + + 'cap.hint': '← Drag to browse · 8 capability groups', + + 'fw.eyebrow': 'Workbench', + 'fw.title': 'AI agent workbench', + 'fw.li.1': 'Run Kimi Code, Claude Code, Codex and other AI coding tools side by side', + 'fw.li.2': 'Tuned for fast-refreshing TUIs: terminal size updates are debounced to avoid redundant repaints', + 'fw.li.3': 'The IME candidate window sticks to the cursor — no more drift when typing Chinese in a TUI', + 'fw.li.4': 'Highlighting flags errors, warnings, HTTP status codes and percentages automatically', + 'fw.shot.alt': 'OpenTerminal running Kimi Code, Claude Code, Codex and other AI coding agents in multiple panes', + + 'fs.eyebrow': 'SFTP', + 'fs.title': 'Remote file panel', + 'fs.li.1': 'Clear column headers — name, size, modified time, permissions, user / group — click any header to sort', + 'fs.li.2': 'User and group IDs resolve to real names (root/root, eveuser/eveuser) instead of bare numbers', + 'fs.li.3': 'Font scaling 80%–180% via Ctrl+wheel or toolbar buttons; row height follows and the setting is remembered', + 'fs.li.4': 'Upload / download, overwrite confirmation, chmod permissions and chown ownership editing', + 'fs.li.5': 'Virtual scrolling keeps directories with tens of thousands of entries responsive', + 'fs.shot.alt': 'OpenTerminal SFTP file panel: column headers, sortable columns, full timestamps and user / group names', + 'fs.shot.alt2': 'OpenTerminal showing the same file menu from a right-click on empty list space', + 'fs.caption': 'Right-click empty space for the full file menu; right-click a row to act on that entry', + + 'fc.eyebrow': 'Customize', + 'fc.title': 'Customization and efficiency', + 'fc.li.1': 'Theme editor with live preview for all 22 color slots, plus custom background image, opacity and dim layer', + 'fc.li.2': '11 built-in themes that follow the system light / dark setting', + 'fc.li.3': 'Command library: save snippets and send them to a chosen terminal from any session', + 'fc.li.4': 'Restore your last session layout on startup; interface zoom from 50% to 150%', + 'fc.li.5': 'Four interface languages: Simplified Chinese, Traditional Chinese, English and Japanese', + 'fc.shot.alt': 'OpenTerminal theme settings: background image, opacity, dim layer and theme gallery', + + 'fl.eyebrow': 'Security', + 'fl.title': 'Lock screen and security', + 'fl.li.1': 'Ctrl+L locks instantly; idle auto-lock and lock-on-startup available', + 'fl.li.2': 'While locked, the app menu, page reload and devtools shortcuts are disabled', + 'fl.li.3': 'Passwords stored as salted scrypt hashes, never plain text; wrong attempts trigger escalating cooldowns', + 'fl.li.4': 'The lock screen is only an overlay: terminal sessions and file transfers keep running behind it', + 'fl.shot.alt': 'OpenTerminal lock screen: opaque overlay with password unlock', + + 'dl.eyebrow': 'Download', + 'dl.title': 'Download', + 'dl.sub': 'Download from GitHub Releases — every past version lives on the same page.', + 'dl.th.pkg': 'Package', + 'dl.th.scene': 'Best for', + 'dl.th.size': 'Size', + 'dl.th.link': 'Link', + 'dl.table.exe': 'NSIS installer with in-app auto-update (recommended)', + 'dl.table.download': 'Download', + 'dl.table.history': 'All versions', + 'dl.table.historyScene': 'Every release and its notes', + 'dl.table.releases': 'Release list', + 'dl.note.title': 'About auto-update', + 'dl.note.body': 'In-app update checks try GitHub Releases first (following the system proxy) and fall back to the China-based git.codingplan.site channel (direct connection) on failure. Packages are verified with SHA-512 before installation. Release notes are read from release-notes.md on the update channel and stay in sync with each release. Since v1.0.22 no MSI installer is provided; NSIS exe is the only option.', + + 'cl.eyebrow': 'Changelog', + 'cl.title': 'Recent updates', + + 'changelog.1.0.25.li.1': 'Scheduled update checks (never / 4 / 12 / 24 hours, default 4)', + 'changelog.1.0.25.li.2': 'Auto-download toggle: silent background download, install timing still up to you, never quits on its own', + 'changelog.1.0.25.li.3': 'Tray notification when a new version is found or a download finishes while the window is minimized', + 'changelog.1.0.25.li.4': 'No repeated prompts or repeated downloads for the same version', + + 'changelog.1.0.24.li.1': 'Fixed: applying an older layout template could kill every SSH session', + 'changelog.1.0.24.li.2': 'Corrupted config files are now backed up before resetting — no more silent loss of the command library, bookmarks or settings', + 'changelog.1.0.24.li.3': 'Session logs no longer lose their tail when the app exits', + 'changelog.1.0.24.li.4': 'SFTP delete no longer reports false failures; ZMODEM downloads of large files keep memory bounded; 3 new renderer test suites', + + 'changelog.1.0.23.li.1': 'SFTP file panel is now a real table: six aligned columns, sticky header, click-to-sort', + 'changelog.1.0.23.li.2': 'Font scaling from 0.8x to 1.8x (A- / A+ or Ctrl+wheel); row height follows and the setting is remembered', + 'changelog.1.0.23.li.3': 'User / group columns show real names instead of bare UID / GID numbers', + 'changelog.1.0.23.li.4': 'Right-click empty list space for the file menu; fixed columns that were not actually aligned to the grid', + + 'changelog.1.0.22.li.1': 'Fixed the IME candidate window not following the cursor (regression in v1.0.21)', + 'changelog.1.0.22.li.2': 'MSI installer dropped; NSIS exe is now the only package', + 'changelog.1.0.22.li.3': 'Build pipeline now verifies dependency consistency to keep stale dependencies out of the installer', + + 'changelog.1.0.21.li.1': 'Background images: lowering opacity now always dims the image in any theme, text is auto-brightened to WCAG AA, and a new dim slider was added', + 'changelog.1.0.21.li.2': 'Performance: settings hot-updates no longer reflow every pane, SFTP virtual scrolling for large directories, per-pane error boundaries', + 'changelog.1.0.21.li.3': 'Installer slimmed by about 90MB; local path admission for SFTP / ZMODEM plus several security hardening fixes', + + 'cl.morePre': 'Full changelog in', + 'cl.morePost': '.', + + 'footer.copyright': '© 2026 CodingPlan.Site · OpenTerminal is open source under the MIT license', + 'footer.channel': 'Update channel: git.codingplan.site' + }, + + ja: { + 'meta.title': 'OpenTerminal - ローカルターミナル / SSH / SFTP 対応の Windows デスクトップターミナル', + 'meta.description': 'OpenTerminal はオープンソースの Windows デスクトップターミナル。ローカルシェル、SSH セッション、SFTP ファイル管理、分割ペインとブロードキャスト入力、テーマのカスタマイズ。MIT ライセンス、自動更新対応。', + 'meta.ogTitle': 'OpenTerminal - ローカルターミナル / SSH / SFTP デスクトップターミナル', + 'meta.ogDescription': 'オープンソースの Windows デスクトップターミナル。ローカルシェル、SSH セッション、SFTP ファイル管理、分割ペインとブロードキャスト入力。MIT ライセンス、自動更新対応。', + + 'a11y.skip': 'メインコンテンツへスキップ', + 'brand.iconAlt': 'OpenTerminal のアイコン', + + 'nav.aria': 'サイト内ナビゲーション', + 'nav.features': '機能', + 'nav.download': 'ダウンロード', + 'nav.changelog': '更新履歴', + 'nav.langAria': '表示言語', + 'nav.themeToggle': 'ライト/ダークテーマの切り替え', + 'nav.themeToLight': 'ライトテーマに切り替え', + 'nav.themeToDark': 'ダークテーマに切り替え', + + 'hero.kicker': 'オープンソースのデスクトップターミナル · MIT ライセンス', + 'hero.title': 'ローカルシェルも SSH も SFTP も<br /><span class="accent">ひとつ</span>のデスクトップアプリに', + 'hero.sub': 'OpenTerminal は開発者と運用担当者のためのターミナルです。WebGL による高速な描画、分割できる SSH セッション、SFTP ファイル管理、ブロードキャスト入力。インストールすればすぐ使え、自動更新にも対応します。', + 'hero.download': 'Windows 版をダウンロード', + 'hero.source': 'ソースコードを見る', + 'hero.notePre': '現在のバージョン', + 'hero.notePost': '· NSIS インストーラー、アプリ内自動更新に対応。', + 'hero.shot.alt': 'OpenTerminal のメイン画面。3 つの分割ペインで Kimi Code、Claude Code、Codex を同時に実行', + 'hero.shot.caption': '3 つの AI コーディングエージェントを並行実行。背景画像と減光レイヤーは自由に設定できます', + + 'spec.version': '現在のバージョン', + 'spec.os': 'Windows 10 / 11 · x64', + 'spec.license': 'MIT オープンソースライセンス', + 'spec.update': 'exe はアプリ内自動更新に対応', + + 'features.eyebrow': 'Capabilities', + 'features.title': '主な機能', + 'features.sub': '用途ごとにまとめた機能グループです。左右にドラッグするか矢印ボタンでご覧ください。全機能の一覧はリポジトリの README にあります。', + 'features.prev': '機能カードを左へスクロール', + 'features.next': '機能カードを右へスクロール', + 'features.trackAria': '主な機能(横スクロール可能)', + + 'cap.01.title': 'ターミナルの中核', + 'cap.01.li.1': 'node-pty によるローカルセッション。PowerShell / zsh / bash を自動検出', + 'cap.01.li.2': 'xterm.js の WebGL レンダリング。256 色とトゥルーカラーに対応し、異常時は自動でフォールバック', + 'cap.01.li.3': '組み込み検索(Ctrl+F)、コマンド履歴、貼り付け時のリスク確認', + 'cap.01.li.4': 'キーワードハイライトは組み込み 22 ルール。独自の正規表現と 3 段階の強度に対応', + 'cap.01.li.5': 'フォント、太さ、字間、行間、カーソル形状を即時反映', + + 'cap.02.title': 'SSH セッション', + 'cap.02.li.1': 'ssh2 による実装。パスワード、秘密鍵(ファイルまたは貼り付け)、SSH Agent に対応', + 'cap.02.li.2': '複数ペインの分割表示とブロードキャスト入力。1 回の操作で複数のホストへ送信', + 'cap.02.li.3': 'ホスト鍵の検証、初回接続の確認、鍵変更時の警告', + 'cap.02.li.4': 'ZMODEM 転送に対応(sz / rz)', + 'cap.02.li.5': 'OSC 7 による作業ディレクトリの通知。新しいセッションは前回の場所から再開', + + 'cap.03.title': 'SFTP ファイルパネル', + 'cap.03.li.1': '名前、サイズ、更新日時、パーミッション、ユーザー / グループの列を明示', + 'cap.03.li.2': 'ヘッダーをクリックして並べ替え。UID / GID は実際のユーザー名・グループ名に解決', + 'cap.03.li.3': '文字サイズは 80%〜180%。Ctrl+ホイールまたはツールバーのボタンで変更', + 'cap.03.li.4': 'アップロードとダウンロード、同名ファイルの上書き確認、chmod / chown の編集', + 'cap.03.li.5': '大量のファイルがあるディレクトリも仮想スクロールで快適。数万件でも固まりません', + + 'cap.04.title': 'ワークスペースとレイアウト', + 'cap.04.li.1': 'dockview によるペイン分割。自由な分割、ドラッグ、統合、フローティング', + 'cap.04.li.2': 'レイアウトテンプレートの保存とワンクリック適用', + 'cap.04.li.3': '起動時に前回のセッションレイアウトを復元', + 'cap.04.li.4': 'UI のズームは 50%〜150%', + + 'cap.05.title': 'テーマと外観', + 'cap.05.li.1': 'テーマエディター:22 個のカラースロットを個別に調整し、リアルタイムでプレビュー', + 'cap.05.li.2': '組み込みテーマ 11 種。システムのライト/ダーク設定に自動追従', + 'cap.05.li.3': '背景画像、不透明度、減光レイヤーをカスタマイズ', + 'cap.05.li.4': 'タブのアクセントカラー。ハイライトの配色はテーマに追従', + + 'cap.06.title': '生産性ツール', + 'cap.06.li.1': 'コマンドライブラリ:よく使うコマンドを保存し、任意のセッションから指定したターミナルへ送信', + 'cap.06.li.2': 'ハイライトルールセットはホストごとに割り当て。サーバーによって配色を変えられます', + 'cap.06.li.3': 'ルールのインポート/エクスポート、リアルタイムプレビュー、一致回数の統計', + 'cap.06.li.4': 'セッションのスナップショットと復元、ターミナルタブの自動命名', + + 'cap.07.title': 'システム監視', + 'cap.07.li.1': 'CPU、ロードアベレージ、メモリ、ディスク、ネットワークをリアルタイム表示', + 'cap.07.li.2': 'コアごとの使用率とディスクパーティションの内訳', + 'cap.07.li.3': '稼働時間とネットワーク速度のグラフ', + 'cap.07.li.4': 'セッションと一緒に開き、追加のチャンネルは使いません', + + 'cap.08.title': 'ロック画面とセキュリティ', + 'cap.08.li.1': 'Ctrl+L で即座にロック。アイドル時の自動ロックと起動時ロックにも対応', + 'cap.08.li.2': 'パスワードは scrypt のソルト付きハッシュで保存。平文はディスクに残りません', + 'cap.08.li.3': '誤入力時はクールダウンが段階的に延長。ロック中はメニューと再読み込みショートカットを無効化', + 'cap.08.li.4': 'ロック画面はオーバーレイにすぎません。背後のセッションと転送は動き続けます', + + 'cap.hint': '← ドラッグで閲覧 · 全 8 グループ', + + 'fw.eyebrow': 'Workbench', + 'fw.title': 'AI エージェント作業台', + 'fw.li.1': 'Kimi Code、Claude Code、Codex などの AI コーディングツールを並行して実行', + 'fw.li.2': '高頻度で更新される TUI 向けに最適化。ターミナルサイズの同期をデバウンスし、無駄な再描画を抑制', + 'fw.li.3': 'IME の変換候補ウィンドウがカーソルに追従。TUI 内での日本語入力でもずれません', + 'fw.li.4': 'キーワードハイライトがエラー、警告、HTTP ステータスコード、パーセントを自動で色分け', + 'fw.shot.alt': 'OpenTerminal で Kimi Code、Claude Code、Codex などの AI コーディングエージェントを複数ペインで実行', + + 'fs.eyebrow': 'SFTP', + 'fs.title': 'リモートファイルパネル', + 'fs.li.1': '名前、サイズ、更新日時、パーミッション、ユーザー / グループの列を明示。ヘッダーをクリックで並べ替え', + 'fs.li.2': 'UID / GID は実際の名前(root/root、eveuser/eveuser)で表示。数字だけではありません', + 'fs.li.3': '文字サイズは 80%〜180%。Ctrl+ホイールまたはツールバーのボタンで変更でき、行の高さも連動して記憶されます', + 'fs.li.4': 'アップロード/ダウンロード、同名ファイルの上書き確認、chmod 権限と chown 所有者の編集', + 'fs.li.5': '数万件のファイルがあるディレクトリも仮想スクロールで快適に操作', + 'fs.shot.alt': 'OpenTerminal の SFTP ファイルパネル。列ヘッダー、並べ替え可能な列、完全な更新日時、ユーザー / グループ', + 'fs.shot.alt2': 'OpenTerminal でファイル一覧の空白部分を右クリックし、同じファイルメニューを表示', + 'fs.caption': '空白部分の右クリックでも同じファイルメニューが開きます。行の右クリックはその項目だけが対象です', + + 'fc.eyebrow': 'Customize', + 'fc.title': 'カスタマイズと効率化', + 'fc.li.1': 'テーマエディターで 22 個のカラースロットを個別に調整し、リアルタイムでプレビュー。背景画像、不透明度、減光レイヤーにも対応', + 'fc.li.2': '組み込みテーマ 11 種。システムのライト/ダーク設定に自動追従', + 'fc.li.3': 'コマンドライブラリ:よく使うコマンドを保存し、任意のセッションから指定したターミナルへ送信', + 'fc.li.4': '起動時に前回のセッションレイアウトを復元。UI のズームは 50%〜150%', + 'fc.li.5': '4 つの表示言語:簡体字中国語、繁体字中国語、英語、日本語', + 'fc.shot.alt': 'OpenTerminal のテーマ設定。背景画像、不透明度、減光レイヤー、テーマギャラリー', + + 'fl.eyebrow': 'Security', + 'fl.title': 'ロック画面とセキュリティ', + 'fl.li.1': 'Ctrl+L で即座にロック。アイドル時の自動ロックと起動時ロックにも対応', + 'fl.li.2': 'ロック中はアプリのメニュー、再読み込み、開発者ツールのショートカットを無効化', + 'fl.li.3': 'パスワードは scrypt のソルト付きハッシュで保存し、平文は残しません。誤入力時はクールダウンが段階的に延長', + 'fl.li.4': 'ロック画面はオーバーレイにすぎません。背後のターミナルセッションとファイル転送は動き続けます', + 'fl.shot.alt': 'OpenTerminal のロック画面。不透明なオーバーレイとパスワードによる解除', + + 'dl.eyebrow': 'Download', + 'dl.title': 'ダウンロード', + 'dl.sub': 'GitHub Releases からダウンロードできます。過去のバージョンも同じページに揃っています。', + 'dl.th.pkg': 'パッケージ', + 'dl.th.scene': '用途', + 'dl.th.size': 'サイズ', + 'dl.th.link': 'リンク', + 'dl.table.exe': 'NSIS インストーラー。アプリ内自動更新に対応(推奨)', + 'dl.table.download': 'ダウンロード', + 'dl.table.history': '過去のバージョン', + 'dl.table.historyScene': 'すべてのリリースと変更内容', + 'dl.table.releases': 'リリース一覧', + 'dl.note.title': '自動更新について', + 'dl.note.body': 'アプリ内の更新確認はまず GitHub Releases(システムプロキシに追従)へアクセスし、失敗した場合は国内の git.codingplan.site 更新チャンネル(直接接続)へ自動的に切り替わります。更新パッケージは SHA-512 で検証してからインストールします。更新内容は配信チャンネルの release-notes.md から読み込み、リリースごとに同期されます。v1.0.22 以降 MSI インストーラーは提供せず、NSIS exe に統一されています。', + + 'cl.eyebrow': 'Changelog', + 'cl.title': '最近の更新', + + 'changelog.1.0.25.li.1': '定期的な更新チェック(しない / 4 / 12 / 24 時間、既定は 4 時間)', + 'changelog.1.0.25.li.2': '自動ダウンロードのオン/オフ(バックグラウンドで静かにダウンロード。インストールのタイミングは従来どおりユーザーが決定し、自動で終了することはありません)', + 'changelog.1.0.25.li.3': '新バージョンの検出時やダウンロード完了時に、ウィンドウがトレイに最小化されていれば通知を表示', + 'changelog.1.0.25.li.4': '同じバージョンで通知やダウンロードを繰り返しません', + + 'changelog.1.0.24.li.1': '古いレイアウトテンプレートを適用すると SSH セッションがすべて切断される問題を修正', + 'changelog.1.0.24.li.2': '設定ファイルが壊れている場合は先にバックアップしてから初期化(コマンドライブラリ、ブックマーク、設定が黙って失われることはなくなりました)', + 'changelog.1.0.24.li.3': '終了時にセッションログの末尾が欠けなくなりました', + 'changelog.1.0.24.li.4': 'SFTP の削除が誤って失敗扱いにならなくなりました。ZMODEM の大容量受信もメモリ使用量を抑制。レンダラー層のテストを 3 組追加', + + 'changelog.1.0.23.li.1': 'SFTP ファイルパネルを本格的なテーブルに変更:6 列の整列、ヘッダーの固定表示、ヘッダークリックで並べ替え', + 'changelog.1.0.23.li.2': '文字サイズを 0.8〜1.8 倍に変更可能(A- / A+ または Ctrl+ホイール)。行の高さも連動し、設定は記憶されます', + 'changelog.1.0.23.li.3': 'ユーザー / グループ列に実際の名前を表示。数字だけの UID / GID ではなくなりました', + 'changelog.1.0.23.li.4': '一覧の空白部分を右クリックでファイルメニューを表示。6 列が実際にはグリッドに揃っていなかった問題を修正', + + 'changelog.1.0.22.li.1': 'IME の変換候補ウィンドウがカーソルに追従しない問題を修正(v1.0.21 のリグレッション)', + 'changelog.1.0.22.li.2': 'MSI インストーラーの提供を終了し、NSIS exe に統一', + 'changelog.1.0.22.li.3': 'ビルド手順に依存関係の整合性チェックを追加し、古い依存関係が混入しないようにしました', + + 'changelog.1.0.21.li.1': '背景画像の扱いを改善。どのテーマでも不透明度を下げると画像が暗くなり、文字は WCAG AA まで自動的に明るく調整。減光スライダーも追加', + 'changelog.1.0.21.li.2': 'パフォーマンス:設定のホットアップデートで全ペインが再レイアウトされなくなり、SFTP の大規模ディレクトリは仮想スクロール、ペインごとにエラーバウンダリを追加', + 'changelog.1.0.21.li.3': 'インストーラーを約 90MB 削減。SFTP / ZMODEM のローカルパス検証と複数のセキュリティ強化', + + 'cl.morePre': '完全な変更履歴は', + 'cl.morePost': ' をご覧ください。', + + 'footer.copyright': '© 2026 CodingPlan.Site · OpenTerminal は MIT ライセンスで公開されています', + 'footer.channel': '更新チャンネル:git.codingplan.site' + } + +}; diff --git a/website/assets/style.css b/website/assets/style.css index 1506938..4665731 100644 --- a/website/assets/style.css +++ b/website/assets/style.css @@ -770,3 +770,47 @@ section { position: relative; } html { scroll-behavior: auto; } *, *::before, *::after { transition: none !important; } } + +/* ---- 语言切换(i18n 层新增,只消费既有令牌,不改动上面任何规则) ---- */ +.lang-select { + appearance: none; + -webkit-appearance: none; + height: 38px; + padding: 0 30px 0 13px; + border-radius: 19px; + border: 1px solid var(--border-strong); + background-color: var(--surface); + color: var(--text-2); + font-family: var(--mono); + font-size: 12.5px; + font-weight: 500; + letter-spacing: 0.02em; + cursor: pointer; + flex-shrink: 0; + /* 下拉箭头:两个主题各一份 data URI(内联 SVG 用不了 currentColor),色值取自 --text-2 */ + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6' viewBox='0 0 10 6' fill='none'%3E%3Cpath d='M1 1l4 4 4-4' stroke='%2399a49c' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E"); + background-repeat: no-repeat; + background-position: right 11px center; + background-size: 10px 6px; + transition: color 0.2s ease, border-color 0.2s ease, background-color 0.2s ease, transform 0.15s ease; +} +.lang-select:hover { color: var(--accent-text); border-color: var(--accent); transform: translateY(-1px); } +.lang-select:active { transform: translateY(0) scale(0.98); } +.lang-select option { background: var(--surface); color: var(--text); } + +html[data-theme='light'] .lang-select { + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6' viewBox='0 0 10 6' fill='none'%3E%3Cpath d='M1 1l4 4 4-4' stroke='%2359615a' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E"); +} + +/* 非中文用户首帧先藏住 body,等 i18n 应用完由 assets/i18n-apply.js 摘掉该属性(另有 2.5s 兜底定时器) */ +html[data-i18n-pending] body { visibility: hidden; } + +@media (max-width: 640px) { + .lang-select { + height: 32px; + padding: 0 24px 0 10px; + font-size: 11.5px; + background-position: right 8px center; + background-size: 9px 5px; + } +} diff --git a/website/index.html b/website/index.html index 805a98f..9dc1f1e 100644 --- a/website/index.html +++ b/website/index.html @@ -3,45 +3,89 @@ <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> - <title>OpenTerminal - 本地终端 / SSH / SFTP 桌面终端,开源 Windows 终端工具 - + OpenTerminal - 本地终端 / SSH / SFTP 桌面终端,开源 Windows 终端工具 + - - + + - +