From adc184334011b282374e56cfd341383d723f8718 Mon Sep 17 00:00:00 2001 From: webadderall <131426131+webadderall@users.noreply.github.com> Date: Sun, 15 Mar 2026 21:58:49 +1100 Subject: [PATCH 1/2] =?UTF-8?q?docs(readme):=20add=20EN/=E7=AE=80=E4=B8=AD?= =?UTF-8?q?=20language=20flipper?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 3 + README.zh-CN.md | 252 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 255 insertions(+) create mode 100644 README.zh-CN.md diff --git a/README.md b/README.md index 375f40c2..2ab88df8 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,7 @@ # Recordly + +Language: EN | [简中](README.zh-CN.md) + [Live on Product Hunt - go check it out!](https://www.producthunt.com/products/recordly-make-stunning-product-demos?launch=recordly-2)

Recordly logo diff --git a/README.zh-CN.md b/README.zh-CN.md new file mode 100644 index 00000000..0d2dfbb4 --- /dev/null +++ b/README.zh-CN.md @@ -0,0 +1,252 @@ +# Recordly + +语言: [English](README.md) | 简体中文 + +[Product Hunt 页面 - 欢迎支持!](https://www.producthunt.com/products/recordly-make-stunning-product-demos?launch=recordly-2) + +

+ Recordly logo +

+ +

+ macOS Windows Linux + MIT license +

+ +### 创建精致、专业级的屏幕录制视频 +[Recordly](https://www.recordly.dev) 是一款**开源的录屏与视频编辑器**,用于制作**演示、教程、产品讲解和工作流视频**。 + +**FAQ**:这个项目与 **Openscreen** 有什么区别? +答:Recordly 增加了完整的光标动画/渲染管线、Mac 和 Windows 原生录制能力、更贴近 Screen Studio 的缩放动画、光标循环、更平滑的平移行为,以及更多底层改进。 + +> 该分支存在的原因是:原维护者不计划引入这些需要调整架构才能实现的能力(例如不同的录制管线)。 + +> [!NOTE] +> 非常感谢 **tadees** 对项目的支持!这笔捐助直接帮助支付 Apple Developer 账户费用,以便 Recordly 在 macOS 上签名与公证。 +[**支持项目**](https://ko-fi.com) + +

+ Recordly demo video +

+ +--- + +## Recordly 是什么? + +Recordly 可以录制屏幕,并自动将内容转换为更精致的视频。它会自动放大关键操作、平滑光标抖动,让你的演示默认看起来更专业。 + +Recordly 支持: + +- **macOS** +- **Windows** +- **Linux** + +Linux 当前使用 Electron 捕获路径,因此录制时系统光标不一定总能被隐藏。 + +--- + +# 功能 + +### 录制 + +- 录制整屏或单个窗口 +- 录制结束后可直接进入编辑器 +- 支持麦克风和系统音频录制 +- Windows / Linux 使用 Chromium 捕获 API +- macOS 使用原生 **ScreenCaptureKit** +- Windows 提供原生 WGC 录制辅助(屏幕与应用窗口)以及 WASAPI 系统/麦克风音频能力 + +### 智能运动 + +- 类 Apple 风格缩放动画 +- 基于光标活动自动建议缩放区域 +- 支持手动添加缩放区域 +- 区域之间平滑过渡 + +### 光标控制 + +- 可调节光标大小 +- 光标平滑 +- 运动模糊 +- 点击弹跳动画 +- macOS 风格光标素材 + +### 光标循环 + +

+ Recordly demo video +

+ +- 在视频/GIF 结尾冻结帧中让光标回到原始位置(默认关闭) + +### 编辑工具 + +- 时间线裁剪 +- 变速区域 +- 注释 +- 缩放片段 +- 项目保存与重新打开(`.recordly` 文件) + +### 画面样式 + +- 壁纸 +- 渐变 +- 纯色背景 +- 内边距 +- 圆角 +- 模糊 +- 阴影 + +### 导出 + +- MP4 导出 +- GIF 导出 +- 画幅比例控制 +- 质量选项 + +--- + +# 截图 + +

+ Recordly editor screenshot +

+ +

+ Recordly recording interface screenshot +

+ +--- + +# 安装 + +## 下载预编译版本 + +发布页面: + +https://github.com/webadderall/Recordly/releases + +## Homebrew(Cask) + +Recordly 是图形应用,因此通过 cask 安装。 + +```bash +brew tap webadderall/tap +brew install --cask recordly +``` + +## 从源码构建 + +```bash +git clone https://github.com/webadderall/Recordly.git recordly +cd recordly +npm install +npm run dev +``` + +## macOS:提示“无法打开应用” + +Recordly 默认未签名,本地构建后的应用可能被 macOS 隔离。 + +```bash +xattr -rd com.apple.quarantine /Applications/Recordly.app +``` + +--- + +# 使用方法 + +## 录制 + +1. 启动 Recordly +2. 选择屏幕或窗口 +3. 选择音频录制选项 +4. 开始录制 +5. 停止录制并进入编辑器 + +## 编辑 + +在编辑器中你可以: + +- 手动添加缩放区域 +- 使用自动缩放建议 +- 调整光标行为 +- 裁剪视频 +- 添加变速片段 +- 添加注释 +- 调整画面样式 + +你可以随时将工程保存为 `.recordly` 项目文件。 + +## 导出 + +导出选项: + +- **MP4**(高质量视频) +- **GIF**(轻量分享) + +可调整参数: + +- 画幅比例 +- 输出分辨率 +- 质量设置 + +--- + +# 限制 + +### Linux 光标捕获 + +Electron 的桌面捕获 API 不允许在录制时隐藏系统光标。 + +如果启用动画光标图层,录制结果中可能会出现**双光标**。 + +欢迎贡献以改进跨平台光标捕获体验。 + +### 系统音频 + +系统音频捕获能力取决于平台支持。 + +**Windows** +- 开箱即用 + +**Linux** +- 需要 PipeWire(Ubuntu 22.04+、Fedora 34+) +- 较旧的 PulseAudio 环境可能不支持系统音频 + +**macOS** +- 需要 macOS 12.3+ +- 使用 ScreenCaptureKit 辅助程序 + +--- + +# 工作原理 + +Recordly 是一个**桌面视频编辑器**,核心是渲染驱动的运动管线 + 平台特定捕获层。 + +**捕获层** +- Electron 负责录制流程编排 +- macOS 使用原生辅助程序处理 ScreenCaptureKit 和光标遥测 +- Windows 使用原生 WGC 进行屏幕捕获 + +**运动层** +- 缩放区域 +- 光标追踪 +- 变速 +- 时间线编辑 + +**渲染层** +- 场景组合由 **PixiJS** 处理 + +**导出层** +- 使用同一渲染场景逐帧输出 +- 编码为 MP4 或 GIF + +**项目文件** +- `.recordly` 文件保存源视频路径与编辑状态 + +--- + +# 贡献 + +欢迎所有贡献者参与! From 049ff73fff59b3ea618729d3f1a5e2a9e3932015 Mon Sep 17 00:00:00 2001 From: webadderall <131426131+webadderall@users.noreply.github.com> Date: Sun, 15 Mar 2026 22:01:51 +1100 Subject: [PATCH 2/2] ci(docs): auto-translate README to zh-CN via GitHub Models --- .github/workflows/readme-translation.yml | 46 +++++++++++++++ scripts/translate-readme-zh.mjs | 73 ++++++++++++++++++++++++ 2 files changed, 119 insertions(+) create mode 100644 .github/workflows/readme-translation.yml create mode 100644 scripts/translate-readme-zh.mjs diff --git a/.github/workflows/readme-translation.yml b/.github/workflows/readme-translation.yml new file mode 100644 index 00000000..8de7ec04 --- /dev/null +++ b/.github/workflows/readme-translation.yml @@ -0,0 +1,46 @@ +name: Auto Translate README (zh-CN) + +on: + push: + branches: [main] + paths: + - README.md + workflow_dispatch: + +permissions: + contents: write + pull-requests: write + +jobs: + translate-readme: + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: 22 + + - name: Translate README.md to Simplified Chinese + id: translate + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + README_TRANSLATION_MODEL: openai/gpt-4.1-mini + GITHUB_MODELS_API_URL: https://models.inference.ai.azure.com/chat/completions + run: node scripts/translate-readme-zh.mjs + + - name: Create PR with translation update + if: steps.translate.outputs.changed == 'true' + uses: peter-evans/create-pull-request@v7 + with: + commit-message: "docs(readme): auto-update Simplified Chinese translation" + title: "docs(readme): auto-update Simplified Chinese translation" + body: | + Automated update of README Simplified Chinese translation based on latest README.md changes. + branch: chore/auto-update-readme-zh + delete-branch: true + add-paths: | + README.zh-CN.md diff --git a/scripts/translate-readme-zh.mjs b/scripts/translate-readme-zh.mjs new file mode 100644 index 00000000..3b6016a8 --- /dev/null +++ b/scripts/translate-readme-zh.mjs @@ -0,0 +1,73 @@ +import fs from "node:fs/promises"; +import path from "node:path"; + +const MODEL = process.env["README_TRANSLATION_MODEL"] || "openai/gpt-4.1-mini"; +const API_URL = process.env["GITHUB_MODELS_API_URL"] || "https://models.inference.ai.azure.com/chat/completions"; +const token = process.env["GITHUB_TOKEN"]; + +if (!token) { + throw new Error("GITHUB_TOKEN is required for README translation workflow."); +} + +const repoRoot = process.cwd(); +const sourcePath = path.join(repoRoot, "README.md"); +const targetPath = path.join(repoRoot, "README.zh-CN.md"); + +const source = await fs.readFile(sourcePath, "utf8"); +const currentTarget = await fs.readFile(targetPath, "utf8").catch(() => ""); + +const systemPrompt = [ + "You are a technical translator for GitHub README files.", + "Translate English Markdown content into Simplified Chinese.", + "Requirements:", + "- Keep all Markdown structure, links, image URLs, and code blocks intact.", + "- Translate only human-readable prose.", + "- Keep product names, file names, commands, and technical tokens unchanged.", + "- Output only the translated Markdown document, no explanation.", +].join("\n"); + +const userPrompt = [ + "Translate the following README.md into Simplified Chinese.", + "Return only the final Markdown content.", + "\n--- BEGIN README ---\n", + source, + "\n--- END README ---", +].join("\n"); + +const response = await fetch(API_URL, { + method: "POST", + headers: { + "Content-Type": "application/json", + Authorization: `Bearer ${token}`, + }, + body: JSON.stringify({ + model: MODEL, + temperature: 0.1, + messages: [ + { role: "system", content: systemPrompt }, + { role: "user", content: userPrompt }, + ], + }), +}); + +if (!response.ok) { + const body = await response.text(); + throw new Error(`Translation request failed (${response.status}): ${body}`); +} + +const data = await response.json(); +const translated = data?.choices?.[0]?.message?.content?.trim(); + +if (!translated) { + throw new Error("No translated content returned by model."); +} + +await fs.writeFile(targetPath, `${translated}\n`, "utf8"); + +const changed = currentTarget !== `${translated}\n`; +const outputPath = process.env["GITHUB_OUTPUT"]; +if (outputPath) { + await fs.appendFile(outputPath, `changed=${changed}\n`, "utf8"); +} + +console.log(`[translate-readme-zh] README.zh-CN.md ${changed ? "updated" : "unchanged"}.`);