Проверка языка результата перевода: совпадения числа абзацев недостаточно; недостающие зависимости стороннего репозитория
This commit is contained in:
@@ -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
@@ -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__":
|
||||
|
||||
Reference in New Issue
Block a user