Skip to content

Data Model: Translation

Feature: 004-translation | Date: 2026-05-29

Entities

AnalysesContent (Domain Entity)

Translation of an article's analysis content in a specific language.

FieldTypeConstraintsNotes
idUUIDPK, auto-generated
analysis_idUUIDFK → analyses.id, NOT NULLParent analysis
languageVARCHAR(10)NOT NULLTarget language code (e.g., "zh-TW")
summaryTEXTnullableTranslated summary
pain_pointsTEXTnullableTranslated pain points
insightsTEXTnullableTranslated insights
innovationsTEXTnullableTranslated innovations
created_atDATETIMENOT NULL
updated_atDATETIMENOT NULL

Unique constraint: (analysis_id, language) — one translation per analysis per language.

Indexes: analysis_id, language.

Relationships: Many-to-one with Analysis (CASCADE delete).


TagsTranslation (ORM Model)

Translation of a tag name in a specific language.

FieldTypeConstraintsNotes
idUUIDPK
tag_idUUIDFK → tags.id, NOT NULLParent tag
languageVARCHAR(10)NOT NULLTarget language code
nameTEXTNOT NULLTranslated tag name
created_atDATETIMENOT NULL

Unique constraint: (tag_id, language) — one translation per tag per language.

Indexes: tag_id, language.

Relationships: Many-to-one with Tag (CASCADE delete).


TagGroupDefinitionsTranslation (ORM Model)

Translation of a tag group display name and description in a specific language.

FieldTypeConstraintsNotes
idUUIDPK
tag_group_definition_idUUIDFK → tag_group_definitions.id, NOT NULLParent group
languageVARCHAR(10)NOT NULLTarget language code
display_nameVARCHAR(200)NOT NULLTranslated display name
descriptionTEXTnullableTranslated description
created_atDATETIMENOT NULL

Unique constraint: (tag_group_definition_id, language) — one translation per group per language.

Indexes: tag_group_definition_id, language.

Relationships: Many-to-one with TagGroupDefinition (CASCADE delete).


ArticleTranslation (ORM Model)

Translation of an article's title and content in a specific language.

FieldTypeConstraintsNotes
idUUIDPK, auto-generated
article_idUUIDFK → articles.id, NOT NULLParent article
languageVARCHAR(10)NOT NULLTarget language code (e.g., "zh-TW")
titleTEXTNOT NULLTranslated article title
contentTEXTnullableTranslated article content (abstract/body)
created_atDATETIMENOT NULL
updated_atDATETIMENOT NULL

Unique constraint: (article_id, language) — one translation per article per language.

Indexes: article_id, language.

Relationships: Many-to-one with Article (CASCADE delete).


Value Objects

AnalysesTranslationContent

Content-only value object used in the translation result (no IDs or language).

FieldTypeNotes
summaryOptional[str]
pain_pointsOptional[str]
insightsOptional[str]
innovationsOptional[str]

AnalysesTranslationResult

Result of a translation attempt.

FieldTypeNotes
analysis_idUUID
languagestr
contentAnalysesTranslationContent
successboolFalse when LLM fails or save fails

ArticleBodyTranslationContent

Content-only value object for article title and content translation result (no IDs or language).

FieldTypeNotes
titleOptional[str]Translated title
contentOptional[str]Translated content

ArticleBodyTranslationResult

Result of an article body translation attempt.

FieldTypeNotes
article_idUUID
languagestr
contentArticleBodyTranslationContent
successboolFalse when LLM fails or save fails

Translation Prompt Value Objects

Prompt ClassPlaceholdersRender Method
ArticleTranslationPrompt__TARGET_LANGUAGE__, __SUMMARY__, __PAIN_POINTS__, __INSIGHTS__, __INNOVATIONS__render(target_language, summary, pain_points, insights, innovations)
ArticleBodyTranslationPrompt__TARGET_LANGUAGE__, __TITLE__, __CONTENT__render(target_language, title, content)
TagTranslationPrompt__TARGET_LANGUAGE__, __TAGS__render(target_language, tags)
GroupTranslationPrompt__TARGET_LANGUAGE__, __GROUPS__render(target_language, groups)

LANGUAGE_NAMES Mapping

CodeDisplay Name
zh-TWTraditional Chinese (Taiwan)
zh-CNSimplified Chinese
jaJapanese
koKorean
esSpanish
frFrench
deGerman

Events

TagNormalizationCompletedEvent (extended)

The pipeline trigger event that kicks off all translation. Extended to carry article fields so the translation handler does not need an additional query.

FieldTypeNotes
analysis_idUUID
article_idUUID
article_titlestrOriginal English article title
article_contentstrOriginal English article content (abstract/body)
topic_idOptional[UUID]

State Transitions

Translation Lifecycle (per analysis or article, per language)

Not translated → [LLM call] → Translated (success)
Not translated → [LLM call] → Failed (all providers exhausted / save error)
Not translated → [Dedup check] → Already translated (return existing)

No further state transitions — translations are immutable once created (only upsert on re-save with same content).