按《参赛成果物提交规范·赛道一》§6 红线: - samples/ 目录改名 sample/(git mv,保留历史) - 10 个中日文样本文件 + docs 参赛手册 PDF 重命名为 ASCII (requirements_*/template_*/rules_*/contestant-handbook.pdf) - tests/test_zh_template.py 硬编码绝对路径 D:\00_project\Genesis 改为相对路径 - 全局更新 21 个活动文件引用;历史日志/审查文档不改(追加说明记录) 全量 pytest 431 passed / 99.15%
83 lines
3.1 KiB
Python
83 lines
3.1 KiB
Python
"""生成中文镜像模板(步骤 0)。
|
||
|
||
镜像既有日文概要设计书模板的结构与锚点 id(section:xxx 原样保留),
|
||
仅将 H1/H2 标题与封面字段翻译为中文,产物 sample/template_design_zh.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] / "sample" / "template_design_ja.docx")
|
||
default_dst = str(Path(__file__).resolve().parents[1] / "sample" / "template_design_zh.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()
|