Community写作与编辑github.com

jasveerai88/localization-packager

将单个视频(或应用)打包为多种语言,无需任何翻译。`manifest` 打印每种语言的交付计划;`sheet` 导出翻译交接表;`check` 验证每种语言包的结构完整性。

localization-packager 是什么?

localization-packager 是一个纯 Python 标准库编写的本地化打包工具,专注于处理多语言发布时的文件结构问题。它不执行任何翻译,也不评判翻译质量,而是严格检查每个语言包是否包含所需的 4 个文件(title.txt、description.txt、subtitles.srt、thumbnail.txt),并验证标题长度(YouTube 100 字符限制)、字幕 SRT 可解析性、提示数量偏差(超过源文件的 25% 标记)以及提示开始时间漂移(超过 2.0 秒标记)。该工具支持三个子命令:`manifest` 生成每个语言的交付计划,`sheet` 导出翻译交接表(Markdown 或 CSV 格式),`check` 验证已填充的语言包并报告 COMPLETE 或 INCOMPLETE 状态,非零退出码表示存在问题。它特别适用于向翻译人员交接任务后的结构验收,但明确指出 COMPLETE 仅代表结构完整,不保证翻译质量。

兼容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/jasveerai88/localization-packager/tree/HEAD

Installed? Explore more 写作与编辑 skills: steipete/notion, langchain-ai/langchain, bytedance/podcast-generation · View all 6 →

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

localization-packager — agent 技能

用途

实现多语言本质上是一个打包问题:每种语言都需要相同的 4 个文件,返回的内容需要检查——文件存在性、标题长度、字幕可解析性、提示数量、提示时间漂移。此工具从一个项目 JSON 文件中生成计划、交接表和结构检查。纯 Python 标准库;仅本地运行。

此工具的核心诚实原则: 它不翻译任何内容,也不评判任何翻译。check 验证结构——文件存在性、可解析性、长度、时间。一个 COMPLETE 的语言包仍然可能包含糟糕的翻译;只有懂该语言的人才能评判。切勿将 COMPLETE 结论报告为“翻译良好”或“可发布”——它只是“结构完整,可供人工质量审阅”。

何时使用 / 不使用

使用场景:

  • 视频或应用即将以其他语言发布,工作交付给翻译人员:manifest 用于制定计划,sheet 用于交接,check 作为返回内容的验收关卡。
  • 管道需要每种语言的通过/不通过结果:check 退出码 0 = 每种语言结构完整;退出码 1 = 输出指出每种不完整的语言及其具体问题。

不要使用的情况:

  • 需要翻译本身——此工具不调用任何翻译 API,也不生成任何翻译文本。空白的“目标”列是为人类翻译人员准备的。
  • 需要翻译质量保证——这里没有拼写检查、回译或质量评分,这是有意为之。
  • 需要频道级资源(横幅、结束画面)或应用商店元数据(超出 4 个打包文件的范围)——刻意排除在外。

命令

每个命令都将项目文件作为位置参数,并支持 --json。

# 每种语言的交付计划
python3 src/localization_packager.py manifest PROJECT.json

# 翻译交接表(默认 Markdown,或 CSV;单个语言或所有目标语言)
python3 src/localization_packager.py sheet PROJECT.json \
    [--format md|csv] [--language CODE]

# 验证填充的语言包(任何语言不完整时退出码为 1;当文件夹位于其他位置时使用 --root)
python3 src/localization_packager.py check PROJECT.json \
    [--root DIR]

项目字段:project(名称)、source_language、source_title、source_description、source_thumbnail_text、source_subtitles(源 SRT 文件路径,相对于项目文件)、targets——{"language", "name", "translator"?} 列表;语言代码必须唯一。每次读取都会验证文件;结构问题(缺少字段、重复语言、源 SRT 缺失或无法解析)是退出码为 2 的错误,会明确指出问题。

包的目录结构:每种语言一个文件夹,包含 title.txt、description.txt、subtitles.srt、thumbnail.txt。

检查规则(精确)

每种语言,按文件顺序:

  • title.txt——缺失或为空是问题;去除空白后的文本超过 100 个字符 是问题(100 通过,101 标记)。字符按 Unicode 码点计算。
  • description.txt——缺失或为空是问题。
  • subtitles.srt——缺失或为空是问题;文本无法解析为 SRT 是问题(解析错误会被引用);提示数量与源文件相差超过 25% 是问题(正好 25% 通过,小于 25% 会记录,但不标记);每个位置开始时间漂移超过 2000 毫秒 是问题,会指出提示和漂移值(正好 2000 毫秒通过,2100 毫秒标记为 "2.1s")。漂移通过位置配对各提示,范围是 min(源提示数, 目标提示数) 的起始,仅比较开始时间。
  • thumbnail.txt——缺失或为空是问题。

结论:零问题的语言为 COMPLETE,否则为 INCOMPLETE 并显示问题数量。只有所有语言都是 COMPLETE 时,check 的退出码才为 0。

输出 JSON 模式(--json)

通用字段:tool("localization-packager")、version、command、project_file(文件名)、project。

manifest:source_language、source_title、source_cues、languages——每个 {language, name, translator, folder, files},其中 files 是 4 个必需文件,每个 {file, what, source_fact}。 check:source_cues、root、languages——每个 {language, name, translator, status ("complete" | "incomplete"), items, problems},其中 items 是 4 个每个文件的结果 {file, ok, detail},problems 列出失败细节——以及 complete、total、all_complete 和一个重申检查仅为结构性的 note。 sheet:sheets——每个目标语言一个,每个 {language, name, translator, rows};rows 是 {n, item, timing, source, target}——3 个字符串行(标题、描述、缩略图文本),然后每个源提示一行(item = "cue N",timing = SRT 格式 "start --> end");target 始终为 ""——空白列供翻译人员填写。

出错时,标准输出是一个单一对象:{"error": "<message>"},退出码为 2——包括 --json 模式下的 argparse 使用错误。不输出纯文本,不输出回溯。

退出码

  • 0——命令成功;对于 check,每种语言都是 COMPLETE。
  • 1——发现:check 至少发现一种不完整的语言。不是崩溃——问题列表就是发送回翻译人员的修复列表。
  • 2——错误:项目文件丢失或不是有效 JSON、缺少必需字段、重复的目标语言、源字幕缺失或无法解析、未知的 --language、无效标志。失败的运行中不得引用任何输出事实。

agent 必须遵守的限制与诚实原则

  • COMPLETE 仅表示结构完整——仅此而已。 切勿将其提升为“翻译正确”、“良好”或“可发布”。发布仍需懂该语言的人审阅;报告 COMPLETE 语言包时务必说明这一点。
  • INCOMPLETE 是一个修复列表,而非翻译人员的失败。 报告确切的问题(文件、提示编号、漂移、字符数)——它们被设计为可直接转发。
  • 此工具不产生任何翻译文本。 交接表中的“目标”列有意留空。切勿通过机器翻译填充并声称这是此工具的输出,也切勿在语言包的 4 个文件实际存在于磁盘上且 check 已运行之前声称该语言包存在。
  • 漂移标记基于位置。 如果翻译人员将一个提示拆分为两个,后续提示的位置会偏移并可能被标记;输出中的提示数量注释提供了上下文。报告这两个事实,而不只是标记。
  • 仅本地运行: 该工具仅读取项目文件、源 SRT 和命令行中指定的包文件夹,不会发送任何数据到任何地方。

相关技能