Проверка языка результата перевода: совпадения числа абзацев недостаточно; недостающие зависимости стороннего репозитория

This commit is contained in:
Илья Поляков
2026-08-03 10:31:35 +03:00
parent 9c7658df5e
commit b92a0a39c0
4 changed files with 86 additions and 9 deletions
+17
View File
@@ -71,6 +71,21 @@ def test_split_and_rebuild(tmp: Path):
assert result.count("<h1>") == 2
def test_verify_output_catches_untranslated(tmp: Path):
"""Регресс: первый боевой прогон отрапортовал успех на непереведённом файле."""
bad = tmp / "bad.html"
bad.write_text("<p>[UNTRANSLATED] The build is broken.</p>\n" * 30, encoding="utf-8")
assert not t.verify_output(bad, "ru"), "заглушки должны заваливать проверку"
english = tmp / "en.html"
english.write_text("<p>The build is broken again today.</p>\n" * 40, encoding="utf-8")
assert not t.verify_output(english, "ru"), "английский результат должен заваливать проверку"
good = tmp / "ru.html"
good.write_text("<p>Сборка снова сломалась сегодня утром.</p>\n" * 40, encoding="utf-8")
assert t.verify_output(good, "ru")
if __name__ == "__main__":
import tempfile
@@ -79,4 +94,6 @@ if __name__ == "__main__":
test_language_detection()
with tempfile.TemporaryDirectory() as d:
test_split_and_rebuild(Path(d))
with tempfile.TemporaryDirectory() as d:
test_verify_output_catches_untranslated(Path(d))
print("OK")
+23 -1
View File
@@ -146,6 +146,24 @@ def rebuild(src, chapters, workdir, out):
return missing == 0
def verify_output(out, target):
"""Совпадение числа абзацев ещё не значит, что перевод состоялся: внешний
скрипт при ошибке API молча подставляет оригинал. Проверяем язык результата.
"""
text = re.sub("<[^>]+>", "", out.read_text(encoding="utf-8"))
lang, share = detect_language(text)
stub = text.count("[UNTRANSLATED]")
print("результат: %s (кириллица %.0f%%), заглушек [UNTRANSLATED]: %d"
% (lang, share * 100, stub))
if stub:
print("ВНИМАНИЕ: внешний переводчик вернул заглушки — проверь его логи и ключ API")
return False
if lang != target:
print("ВНИМАНИЕ: результат не на языке %s — перевода фактически не было" % target)
return False
return True
def main():
ap = argparse.ArgumentParser(description=__doc__)
ap.add_argument("source", type=Path, help="XHTML от pdf2html.py")
@@ -184,7 +202,11 @@ def main():
extracted = (args.workdir / "extracted").resolve()
write_input(chapters, extracted)
run_translator(args.repo.resolve(), args.workdir.resolve(), extracted, args.workers)
rebuild(args.source, chapters, args.workdir, args.output)
ok = rebuild(args.source, chapters, args.workdir, args.output)
if not verify_output(args.output, args.target):
sys.exit("перевод не состоялся — упаковывать этот файл нельзя")
if not ok:
print("часть блоков осталась на языке оригинала — см. счётчик выше")
if __name__ == "__main__":