Multi-Language Knowledge Article Lifecycle Architecture
Core Data Model Clarity First
KnowledgeArticleVersion is the parent-agnostic record. The actual translatable content lives in your article type object (e.g., Knowledge__kav). Each language variant shares the same KnowledgeArticleId but has a distinct Id and Language field. Query the relationship like this:
SELECT Id, KnowledgeArticleId, Language, PublishStatus, VersionNumber, Title
FROM Knowledge__kav
WHERE KnowledgeArticleId = '5AN...'
AND PublishStatus IN ('Online', 'Draft')
ORDER BY Language
Recommended Architecture: Master-Language + Derivative Drafts
Treat English (or your source locale) as authoritative. When an English article is updated and published, a Platform Event or Flow/Apex trigger fires to orchestrate the translation workflow. Equal-treatment models collapse quickly under partial-readiness scenarios — the master-language approach gives you a clear source-of-truth for version lineage.
Versioning strategy that works in practice:
- Store
VersionNumber of the English article on each translation record (custom field) at draft creation time — this pins translations to a specific English version, not just “the latest”
- Use a custom Translation Status field (
Not Started / In Progress / Ready / Published) rather than relying solely on PublishStatus
- Never auto-publish translations independently — gate final publish behind an aggregation check
API Flow for Draft Creation Across Languages
When the English publish event fires, call the Knowledge Articles REST API to create draft translations:
POST /services/data/vX.X/knowledgeManagement/articles/{articleId}/translations
Content-Type: application/json
{
"language": "fr",
"urlName": "article-title-fr",
"title": "[TRANSLATION PENDING] Article Title"
}
Wrap this in a loop across your 8 target locales. Capture returned draft Id values and write them to a Translation Tracking custom object linking KnowledgeArticleId, Language, DraftId, SourceVersionNumber, and TranslationStatus. (Verify endpoint path behavior in your version — the knowledgeManagement namespace has shifted between API v50 and v58+.)
Partial Translation Handling
Build a scheduled Apex job or Flow that queries your tracking object nightly:
SELECT KnowledgeArticleId, COUNT(Id) readyCount
FROM TranslationTracking__c
WHERE TranslationStatus__c = 'Ready'
GROUP BY KnowledgeArticleId
HAVING COUNT(Id) = 8
Adjust the HAVING threshold per article if some languages are lower priority. For tiered rollout (Tier 1 = 4 languages, Tier 2 = 4 languages), partition your tracking records with a Tier field and publish in two waves.
Notification Layer
Use Salesforce Flow calling an Invocable Action or external middleware (MuleSoft, Make, Workato) to POST translator assignments to your TMS (Translation Management System) via webhook. Pass DraftId, SourceVersionNumber, and deadline. Avoid email-only notification — it creates no auditable assignment record inside Salesforce.
Coordinated Publish
When all tracked drafts for an article reach Ready, trigger a batch that calls PATCH on each draft’s publish endpoint. Sequence matters — publish source locale last if your org has locale inheritance rules configured.
This draft is based on general Salesforce knowledge. It has not been verified against your specific version and environment. Practitioners: verify the steps and share your experience below.