DEV Community

Cover image for Building a Multilingual Compliance Pipeline for CSDDD Supplier Documentation
Diogo Heleno
Diogo Heleno

Posted on Originally published at m21global.com

Building a Multilingual Compliance Pipeline for CSDDD Supplier Documentation

Compliance teams dealing with CSDDD requirements are discovering a problem that looks like a translation task but is actually a data and workflow problem. If your company has suppliers in a dozen countries, you don't need a one-off translation job. You need a pipeline: versioned source documents, a controlled glossary, a way to track who received what version in which language, and proof of acknowledgment that holds up under audit.

This is a problem developers are well positioned to solve, even if the actual translation still needs human linguists for anything legally binding. Here's how to think about the technical side of it.

Why this isn't a solved problem with off-the-shelf i18n tools

If you've built multilingual products, your instinct is to reach for the standard i18n stack: extract strings, push to a translation management system, pull back localized files, ship. That works fine for UI copy. It breaks down for compliance documents for a few reasons:

  • The content isn't strings in a codebase, it's long-form legal and normative text in Word or PDF
  • Terminology has to match international legal standards (ILO conventions, human rights language), not just read naturally
  • You need an audit trail: timestamps, versions, who translated what, who reviewed it, and proof of supplier acknowledgment
  • Machine translation introduces exactly the kind of terminology drift that fails an audit, as the source article on CSDDD supplier code of conduct translation points out

So the pipeline you build looks more like a document management + workflow automation system with translation as one stage, not a typical TMS setup.

A practical architecture for this pipeline

Here's a rough shape that works whether you're building this in-house or integrating with a translation vendor's API.

1. Source of truth for the document

Keep the approved code of conduct in version control, even if it's not code. A private git repo with the document in Markdown or structured XML (DocBook, DITA) gives you diffs, history, and the ability to track exactly what changed between CSDDD amendments.

# structure example
compliance-docs/
  code-of-conduct/
    v1.2-en.md
    v1.2-en.CHANGELOG.md
    glossary.yaml
Enter fullscreen mode Exit fullscreen mode

2. A validated glossary as structured data

This is the part teams skip and then regret. Terms like "forced labour" or "living wage" need one approved translation per target language, locked by legal/compliance before anything goes to a translator.

# glossary.yaml
forced_labour:
  en: "forced labour"
  pt: "trabalho forçado"
  fr: "travail forcé"
  status: validated_by_legal
  source: ILO_C029
living_wage:
  en: "living wage"
  pt: "salário digno"
  fr: "salaire décent"
  status: validated_by_legal
Enter fullscreen mode Exit fullscreen mode

Feed this glossary into whatever translation workflow you use, whether that's a vendor's CAT tool via API or an internal review tool. Translation memory systems (SDL Trados, memoQ, Phrase) all support glossary import, and most expose APIs to automate this instead of uploading files by hand each cycle.

3. Workflow state machine, not a spreadsheet

Track each document through states: draft -> legal_approved -> sent_for_translation -> translated -> reviewed -> sent_to_supplier -> acknowledged. A lot of teams track this in a spreadsheet and it falls apart past 20 suppliers in 7 languages. A simple state machine, even just a Postgres table with triggers, scales better and gives you a queryable audit log.

CREATE TABLE supplier_document_status (
  id SERIAL PRIMARY KEY,
  supplier_id INT REFERENCES suppliers(id),
  document_version TEXT,
  language TEXT,
  state TEXT, -- draft, legal_approved, translated, reviewed, sent, acknowledged
  acknowledged_at TIMESTAMP,
  acknowledgment_method TEXT, -- e-signature, signed PDF, portal click
  created_at TIMESTAMP DEFAULT now()
);
Enter fullscreen mode Exit fullscreen mode

This table alone answers the auditor's question: "prove supplier X in Bangladesh received and acknowledged version 1.2 in Bengali." Without it, you're digging through email threads.

4. Acknowledgment as a tracked event, not an assumption

Sending the PDF is not due diligence. You need a mechanism that records acceptance. Options depending on your stack:

  • An e-signature API (DocuSign, HelloSign) tied to supplier records
  • A supplier portal where login + click-to-accept is logged with IP/timestamp
  • A signed PDF returned and hashed/stored for integrity checks

Whichever you pick, store the acknowledgment event with a reference to the exact document version and language, not just "code of conduct v1."

Where automation should stop

It's tempting to automate the translation step itself with an LLM or MT engine and call it done. Don't, at least not for the final legal text. The source article makes a solid case for why: legal and normative language needs human review against established terminology, and a second linguist review catches exactly the kind of material divergence that creates liability.

Where automation genuinely helps:

  • Pre-processing: extracting text, diffing versions, flagging which sections changed since the last approved version so translators only re-translate what's new
  • Glossary consistency checks: scripting a QA pass that flags terms translated inconsistently across files before human review
  • Routing: automatically determining which documents need the highest-rigor review tier versus which can go through a faster process, based on whether the document is attached to a binding contract

A quick example of a consistency check script:

import yaml, re

glossary = yaml.safe_load(open('glossary.yaml'))

def check_consistency(translated_text, lang):
    issues = []
    for term, data in glossary.items():
        expected = data.get(lang)
        if expected and expected.lower() not in translated_text.lower():
            issues.append(f"Missing validated term '{expected}' for '{term}'")
    return issues
Enter fullscreen mode Exit fullscreen mode

This won't replace a linguist, but it catches obvious drift before the document goes to expensive human review, saving a review cycle.

The real takeaway

CSDDD compliance for supplier documentation is less a translation challenge and more a document lifecycle challenge. If you're the engineer asked to "help compliance with the translation thing," push for version control, a structured glossary, and an explicit acknowledgment-tracking system before anyone talks about which CAT tool or vendor to use. The tooling matters less than having a system that can answer an auditor's questions in minutes instead of days.

For the legal and process side, like which documents need certified translation versus internal-only translation, and how review tiers map to legal risk, the source article at m21global.com covers that ground well.

Top comments (0)