"""生成中文镜像模板(步骤 0)。 镜像既有日文概要设计书模板的结构与锚点 id(section:xxx 原样保留), 仅将 H1/H2 标题与封面字段翻译为中文,产物 samples/概要设计书模板_中文.docx 入库。 锚点段落文本保持不变是硬约束:Writer 子系统(template_mapper / docx_injector) 依赖这些占位符定位章节,任何改动都会破坏映射与注入。 """ from __future__ import annotations import shutil from pathlib import Path from docx import Document # H1/H2 标题日文 → 中文(保持编号前缀一一对应) HEADING_TRANSLATIONS: dict[str, str] = { "1. はじめに": "1. 前言", "2. 機能一覧": "2. 功能一览", "2.1 機能一覧表": "2.1 功能一览表", "2.2 機能詳細": "2.2 功能详细", "3. 画面一覧": "3. 画面一览", "3.1 画面遷移図": "3.1 画面迁移图", "3.2 画面一覧表": "3.2 画面一览表", "4. 帳票一覧": "4. 报表一览", "5. DB設計": "5. DB设计", "5.1 テーブル一覧": "5.1 表一览", "5.2 ER図": "5.2 ER图", "6. IF定義": "6. 接口定义", "7. バッチ一覧": "7. 批处理一览", } # 封面字段(Normal 段落)日文 → 中文 COVER_TRANSLATIONS: dict[str, str] = { "概要設計書": "概要设计书", "ドキュメント名: {{doc_title}}": "文档名: {{doc_title}}", "バージョン: {{version}}": "版本: {{version}}", "作成日: {{created_at}}": "创建日期: {{created_at}}", "テンプレート開始": "模板开始", } def _translate(text: str) -> str: """锚点段落({{section:...}})原样保留;其余按字典翻译,未命中则原样。""" if text.startswith("{{section:"): return text return HEADING_TRANSLATIONS.get(text, COVER_TRANSLATIONS.get(text, text)) def build_zh_template(src: str, dst: str) -> str: """镜像 src(日文模板)为 dst(中文模板),返回 dst 路径。""" src_path = Path(src) dst_path = Path(dst) if not src_path.exists(): raise FileNotFoundError(f"源模板不存在: {src_path}") dst_path.parent.mkdir(parents=True, exist_ok=True) # 先物理复制(保留样式/编号定义等所有非文本属性),再逐段改写文本 shutil.copyfile(str(src_path), str(dst_path)) doc = Document(str(dst_path)) for para in doc.paragraphs: new_text = _translate(para.text) if new_text != para.text: para.text = new_text doc.save(str(dst_path)) return str(dst_path) def main() -> None: import argparse parser = argparse.ArgumentParser(description="生成中文镜像模板") default_src = str(Path(__file__).resolve().parents[1] / "samples" / "概要設計書テンプレート.docx") default_dst = str(Path(__file__).resolve().parents[1] / "samples" / "概要设计书模板_中文.docx") parser.add_argument("--src", default=default_src, help="源日文模板") parser.add_argument("--dst", default=default_dst, help="输出中文模板") args = parser.parse_args() out = build_zh_template(args.src, args.dst) print(f"中文模板已生成: {out}") if __name__ == "__main__": main()