Files
2026Technology-Competition/scripts/make_zh_template.py
T
lhl d01e1b720f feat(writer): 输出语言一致性保障 + 用户可选输出语言
- 步骤0: 新增中文镜像模板 scripts/make_zh_template.py 与 samples/概要设计书模板_中文.docx(7章锚点原样保留)
- 步骤1: config.WriterConfig.output_language→Settings.writer;GenerationContext.output_language + to_vars.language_instruction(zh/ja/auto);writer_agent【语言约束】改引变量;context_builder/orchestrator/run_trial 透传 --output-language
- 步骤A: 新建 src/genesis/writer/language.py(detect_script/resolve_expected_language/find_language_violations);WriterAgent.generate_chapter 按期望语言强制、违规重试、耗尽硬失败;max_retries 默认 1→2
- 步骤B: _format_impact 影响调查标签按 output_language 本地化(zh 新建/变更/删除/警告)
- 步骤C: eval scorer 第 11 维度 language_consistency(不可验证=满分,不拉低总分);ChapterArtifact.expected_language;QAValidator.validate_doc 透传;QALoop.run 透传 output_language
- 测试: test_zh_template/test_language_plumbing/test_writer_language/test_scorer_language/test_language_coverage,并更新 test_phase5_e2e
- 全量 pytest 424 passed / 99.15%(覆盖率门槛 99% 达标)
2026-08-25 23:30:24 +08:00

83 lines
3.2 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""生成中文镜像模板(步骤 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()