diplomail (Stage D): language detection + lazy translation cache
Replaces the LangUndetermined placeholder with whatlanggo-backed body detection on every send path, then adds a translation cache keyed on (message_id, target_lang) populated lazily on the per-message read endpoint. The noop translator that ships with Stage D returns engine="noop", which the service treats as "translation unavailable" — wiring a real backend (LibreTranslate HTTP client is the documented next step) is a one-file swap. GetMessage and ListInbox now accept a targetLang argument; the HTTP layer resolves the caller's accounts.preferred_language and forwards it. Inbox uses the cache only (never calls the translator) so bulk reads stay fast under future SaaS backends. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -4352,6 +4352,24 @@ components:
|
||||
type: string
|
||||
format: date-time
|
||||
nullable: true
|
||||
translated_subject:
|
||||
type: string
|
||||
description: |
|
||||
Subject rendered into the caller's preferred_language by
|
||||
the translation cache. Absent when the caller's language
|
||||
matches `body_lang` or the translator could not produce
|
||||
a rendering.
|
||||
translated_body:
|
||||
type: string
|
||||
description: |
|
||||
Body rendered into the caller's preferred_language. Same
|
||||
absence semantics as `translated_subject`.
|
||||
translation_lang:
|
||||
type: string
|
||||
description: BCP 47 tag of the rendered translation.
|
||||
translator:
|
||||
type: string
|
||||
description: Identifier of the translation engine that produced the cached row.
|
||||
UserMailSentSummary:
|
||||
type: object
|
||||
additionalProperties: false
|
||||
|
||||
Reference in New Issue
Block a user