DEV Community

Cover image for Building a Terminology Pipeline for Multilingual Compliance Documentation (ISO 14001 and Beyond)
Diogo Heleno
Diogo Heleno

Posted on Originally published at m21global.com

Building a Terminology Pipeline for Multilingual Compliance Documentation (ISO 14001 and Beyond)

If you've ever worked on internal tooling for a compliance, legal, or QA team, you know the drill: someone eventually asks for a way to "just translate the docs" for an audit, a certification, or a foreign regulator. It sounds like a translation problem. It's actually a terminology consistency problem, and that's something we as developers can actually help solve with tooling instead of throwing it entirely at a vendor and hoping for the best.

A good reference point for why this matters is this piece on ISO 14001 document translation for EMS audits. It walks through the compliance stakes: an auditor reviewing environmental management system (EMS) documentation across languages will flag inconsistent terminology as a nonconformity, even if the underlying practice is fine. That article is written for compliance managers deciding when to hire certified translators. This one is for the engineers who end up building or maintaining the systems that manage that documentation before it ever reaches a translator.

Why this is a data problem, not just a language problem

Standards like ISO 14001, ISO 9001, and ISO 45001 share a common structure (Annex SL) and a controlled vocabulary. Terms like significant environmental aspect, interested party, and compliance obligation aren't just phrases, they're normative concepts with specific definitions. If your documentation pipeline treats these as free text, you're going to get drift: different translators, different tools, or even different writers on your own team will phrase the same concept five different ways across a document set.

This is the exact same class of problem we solve in software with:

  • Shared enums instead of magic strings
  • A single source of truth for config
  • Linting rules that catch inconsistent naming

Compliance terminology deserves the same treatment. Instead of leaving terminology consistency to whoever is translating a document that week, you can enforce it structurally.

Step 1: Build a terminology glossary as structured data

Don't keep your approved terminology in a Word doc. Model it as structured data you can validate against.

{
  "term_id": "significant_environmental_aspect",
  "source_lang": "pt",
  "source_term": "aspeto ambiental significativo",
  "target_lang": "en-GB",
  "approved_term": "significant environmental aspect",
  "standard_ref": "ISO 14001:2015 clause 6.1.2",
  "do_not_use": ["important environmental factor", "key environmental issue"]
}
Enter fullscreen mode Exit fullscreen mode

This becomes your glossary of record. It can live in a simple JSON/YAML file in a repo, a spreadsheet synced via API, or a proper TMS (translation management system) like Phrase, Lokalise, or memoQ's terminology module. The important part is that it's machine-readable and versioned.

Step 2: Validate documents against the glossary before they go anywhere

Once you have structured terminology, you can write a linter. Something as simple as a Python script that scans translated documents for banned terms or missing approved terms goes a long way.

import re
import json

with open("glossary.json") as f:
    glossary = json.load(f)

def check_document(text, glossary):
    issues = []
    for entry in glossary:
        for bad_term in entry.get("do_not_use", []):
            if re.search(rf"\b{re.escape(bad_term)}\b", text, re.IGNORECASE):
                issues.append({
                    "found": bad_term,
                    "should_be": entry["approved_term"],
                    "reference": entry["standard_ref"]
                })
    return issues
Enter fullscreen mode Exit fullscreen mode

Run this as a CI check on your documentation repo, the same way you'd run a spell checker or a link checker. If your EMS docs live in Markdown, AsciiDoc, or even Confluence exported to plain text, this is a five-minute integration that catches terminology drift before a human translator (or an auditor) ever sees it.

Step 3: Separate your document tiers programmatically

The source article makes a good practical point: not every document carries the same audit risk. You can encode that directly into your document management system instead of relying on someone remembering which tier a file belongs to.

document_tiers:
  high_risk:
    - environmental_policy.md
    - operational_control_procedures/*.md
    - management_review_minutes/*.md
  medium_risk:
    - monitoring_records/*.csv
    - internal_meeting_notes/*.md
  low_risk:
    - archived_data/**
Enter fullscreen mode Exit fullscreen mode

High-risk documents get routed to human review workflows (or flagged as requiring certified translation). Low-risk, high-volume documents can go through machine translation with spot-checks. This mapping can drive an actual routing script in your CI/CD pipeline or document management tool, rather than living as tribal knowledge in someone's head.

Step 4: Version control your standard references, not just your docs

One detail from the source article is worth its own callout: documents translated under an older version of a standard (say, ISO 14001:2004 vs. 2015) can contain outdated terminology that no longer matches the current system structure. This is a stale-reference bug, conceptually identical to a dependency that hasn't been bumped.

A simple mitigation: tag every controlled document with the standard version it was written against, and write a check that flags anything referencing an outdated version.

OUTDATED_STANDARDS = ["ISO 14001:2004", "ISO 14001:1996"]

def flag_outdated_refs(doc_text):
    return [s for s in OUTDATED_STANDARDS if s in doc_text]
Enter fullscreen mode Exit fullscreen mode

Run it across your whole documentation corpus periodically, the same way you'd run a dependency audit.

Where machine translation fits (and where it doesn't)

MT engines (DeepL API, Google Cloud Translation, Azure AI Translator) all support custom glossaries or terminology bases now. If you're already maintaining structured glossary data from Step 1, you can feed it directly into these APIs:

import deepl

translator = deepl.Translator("YOUR_API_KEY")
result = translator.translate_text(
    "O aspeto ambiental significativo foi identificado.",
    source_lang="PT",
    target_lang="EN-GB",
    glossary=my_deepl_glossary_id
)
Enter fullscreen mode Exit fullscreen mode

This works well for your low-risk tier. It does not replace human review for high-risk documents like the environmental policy or audit reports, where an auditor is actively checking conceptual accuracy against a normative standard, not just checking that the sentence reads naturally.

The takeaway

Compliance teams often treat translation as a procurement decision: pick a vendor, send the docs, wait. But the quality of that translation depends heavily on what you hand over. If your documentation pipeline already enforces terminology consistency, flags outdated standard references, and routes documents by risk tier, you've done most of the hard work before a translator (human or AI) ever touches the file.

If you're responsible for compliance tooling, this is a good project to pitch: a terminology validation layer sitting in front of your document translation workflow. It's a small amount of tooling that meaningfully reduces audit risk, and it complements rather than replaces the human expertise described in the original piece on ISO 14001 documentation translation.

Top comments (0)