feat(translation): per-field language detection for mixed-language posts
_translate_one translated [title, description] in ONE Interpreter call and keyed the whole-post passthrough on the aggregate detected_lang (the FIRST item). So an English title + non-English description detected "en" and marked the post handled, leaving the description untranslated. Now each field is translated independently (its own detected_lang / passthrough) and the non-target field is stored on its own; translated_source_lang reflects the translated field's language. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -115,6 +115,35 @@ def test_translate_posts_passthrough_english_marks_handled(db_sync, monkeypatch)
|
||||
assert p.post_title_translated is None # ...but nothing to show
|
||||
|
||||
|
||||
def test_translate_posts_mixed_language_translates_nonenglish_field(db_sync, monkeypatch):
|
||||
# English title + Japanese description: the description is still translated
|
||||
# even though the title is already English (per-field detection, not the old
|
||||
# aggregate first-item bail). Source lang comes from the translated field.
|
||||
_patch(monkeypatch, db_sync)
|
||||
monkeypatch.setattr("backend.app.tasks.translation.ic.health", lambda *a, **k: True)
|
||||
|
||||
def fake_translate(texts, **k):
|
||||
t = texts[0]
|
||||
if t.isascii(): # already English → passthrough
|
||||
return {"translations": [t], "detected_lang": "en",
|
||||
"engine": "none", "engine_version": None}
|
||||
return {"translations": [f"EN:{t}"], "detected_lang": "ja",
|
||||
"engine": "llm", "engine_version": "v9"}
|
||||
|
||||
monkeypatch.setattr("backend.app.tasks.translation.ic.translate", fake_translate)
|
||||
a = _artist(db_sync)
|
||||
p = _post(db_sync, a.id, title="hello", desc="ねこ")
|
||||
_enable(db_sync)
|
||||
db_sync.commit()
|
||||
|
||||
assert "translated=1" in translate_posts()
|
||||
db_sync.refresh(p)
|
||||
assert p.post_title_translated is None # English title untouched
|
||||
assert p.description_translated == "EN:ねこ" # Japanese desc translated
|
||||
assert p.translated_source_lang == "ja" # from the translated field
|
||||
assert p.translation_engine_version == "v9"
|
||||
|
||||
|
||||
def test_translate_posts_disabled_is_noop(db_sync, monkeypatch):
|
||||
_patch(monkeypatch, db_sync)
|
||||
a = _artist(db_sync)
|
||||
|
||||
Reference in New Issue
Block a user