DEV Community

Cover image for Building a Localization Pipeline for Employee Onboarding Content (So You Don't Ship Broken Translations)
Diogo Heleno
Diogo Heleno

Posted on Originally published at m21global.com

Building a Localization Pipeline for Employee Onboarding Content (So You Don't Ship Broken Translations)

Most engineering teams treat onboarding docs as a one-time HR task. Then the company opens a branch in another country, someone exports the employee handbook to a translation API, and three months later you're fielding support tickets because half the new hires in the Berlin office don't understand the safety procedures.

The M21Global article on translating onboarding materials covers this well from a translation-service perspective: which documents need certified human review versus which can go through lighter workflows. That's the right framing for HR and legal teams. But if you're the person actually building the internationalization pipeline, there's a separate set of technical problems worth solving before any document reaches a translator or an LLM.

This post covers how to structure that pipeline so onboarding content doesn't rot the moment it's translated.

Why onboarding content breaks translation pipelines

Marketing copy and product UI strings are usually short, atomic, and reused. Onboarding material is the opposite: long-form documents, embedded terminology, cross-references between policies, and content that changes every time HR updates a procedure. A few structural issues show up repeatedly:

  • No single source of truth. The code of conduct lives in a Google Doc, the safety manual is a PDF, and the onboarding deck is in Keynote. Each has its own export path and none of them talk to a glossary.
  • No versioning tied to translation state. When the source document changes, nothing flags that the Spanish or Portuguese version is now stale.
  • Terminology drift. Different translators (or different LLM prompts) render the same internal term five different ways across documents.
  • Text trapped in non-text formats. Screenshots with embedded UI labels, PDFs with no text layer, slide decks with text inside images.

None of this is a translation quality problem. It's a content architecture problem, and it's fixable with tooling most dev teams already use.

Step 1: Treat onboarding docs like source code

The fix that pays off fastest is moving onboarding content out of Word/PDF/Keynote and into a plain-text, versionable format: Markdown or MDX in a git repo, or structured JSON/YAML if it's rendered through a CMS.

/onboarding-content
  /en
    code-of-conduct.md
    safety-procedures.md
    hr-policies.md
  /pt
  /es
  /de
  glossary.yaml
  translation-status.json
Enter fullscreen mode Exit fullscreen mode

This gets you three things for free:

  • Diffs. You can see exactly what changed in the source document since the last translation pass.
  • CI hooks. You can automatically flag or block a merge if a source file changes but its translated counterparts weren't touched.
  • Reusable tooling. The same i18n libraries you use for product strings (i18next, Format.js, Lingui) can extract and manage long-form content too, even if it feels unusual at first.

Step 2: Automate staleness detection

A simple script comparing content hashes catches most of the "translation went out of date silently" problem:

import hashlib, json, pathlib

SOURCE_LANG = "en"
TARGET_LANGS = ["pt", "es", "de"]

def file_hash(path):
    return hashlib.sha256(path.read_bytes()).hexdigest()

def check_staleness(content_dir):
    status = {}
    source_dir = content_dir / SOURCE_LANG
    for source_file in source_dir.glob("*.md"):
        current_hash = file_hash(source_file)
        for lang in TARGET_LANGS:
            meta_path = content_dir / lang / f"{source_file.stem}.meta.json"
            if not meta_path.exists():
                status[f"{lang}/{source_file.name}"] = "missing"
                continue
            meta = json.loads(meta_path.read_text())
            if meta.get("source_hash") != current_hash:
                status[f"{lang}/{source_file.name}"] = "stale"
    return status
Enter fullscreen mode Exit fullscreen mode

Run this in CI on every PR that touches /onboarding-content/en. Fail the build, or at least post a comment, when translations go stale. This is the same pattern used for translation memory systems, just implemented with tools you already have.

Step 3: Enforce a real glossary, not a spreadsheet

The source article correctly identifies inconsistent terminology as one of the biggest recurring problems. The technical fix is a machine-readable glossary that gets injected into every translation request, whether that request goes to a human translator, a TMS, or an LLM.

# glossary.yaml
terms:
  - source: "Code of Conduct"
    pt: "Código de Conduta"
    es: "Código de Conducta"
    context: "Always capitalized, refers to the formal internal policy document"
  - source: "People Team"
    pt: "Equipa de Pessoas"
    es: "Equipo de Personas"
    context: "Do not translate as 'Recursos Humanos'  this is a distinct internal department name"
Enter fullscreen mode Exit fullscreen mode

If part of your pipeline uses an LLM for first-pass translation or for translating high-volume, low-criticality reference material (FAQs, benefits catalogues, the kind of content the source article flags as suitable for AI translation with light review), feed this glossary into the prompt directly:

prompt = f"""
Translate the following onboarding document from English to {target_lang}.
Use this glossary strictly. Do not deviate from these terms:

{glossary_terms}

Maintain a professional but approachable tone consistent with internal
company communication, not legal or marketing language.

Document:
{source_text}
"""
Enter fullscreen mode Exit fullscreen mode

This doesn't replace human review for anything with legal weight, contracts, compliance policy, safety procedures. It does mean that when human review happens, the translator isn't fixing the same terminology error eight times across eight documents.

Step 4: Route by risk, not by convenience

The most useful idea in the source article is deciding translation rigor per document rather than per project: certified/ISO-level review for anything with legal exposure, standard human translation for operational manuals, AI-plus-spot-check for low-stakes reference material.

You can encode that decision directly in your pipeline metadata instead of leaving it as a manual judgment call each time:

{
  "code-of-conduct.md": { "risk_tier": "legal", "review": "certified" },
  "safety-procedures.md": { "risk_tier": "legal", "review": "certified" },
  "tool-integration-guide.md": { "risk_tier": "operational", "review": "standard" },
  "benefits-faq.md": { "risk_tier": "reference", "review": "ai-assisted" }
}
Enter fullscreen mode Exit fullscreen mode

A build step reads this file and routes each document to the correct workflow automatically, whether that's a certified translation vendor's API, a standard TMS queue, or an LLM batch job. This removes the failure mode the source article warns about: picking the cheapest option for everything and manually patching what breaks later.

Fixing the source format problem before translation starts

One more thing worth automating: rejecting bad source files before they enter the pipeline at all. A simple pre-flight check catches most friction points:

  • Flag PDFs with no extractable text layer.
  • Flag slide decks where text is embedded in images rather than text boxes.
  • Flag documents with heavy manual formatting that won't survive round-tripping through a TMS.

A five-line script using pdftotext or python-pptx to check for extractable text saves days of back-and-forth later:

pdftotext safety-procedures.pdf - | wc -w
# if word count is near zero, the PDF is image-based and needs OCR or a source rebuild
Enter fullscreen mode Exit fullscreen mode

The takeaway

Translation quality for onboarding material is partly a vendor and process question, which the M21Global article covers well. But a lot of the pain, stale translations, inconsistent terminology, blocked launches because a PDF wasn't editable, is a pipeline problem that's entirely within a dev team's control. Treat onboarding content as versioned, structured data with automated staleness checks and risk-based routing, and the translation vendor's job gets a lot easier too.

Top comments (0)