Localization teams that bolt translation onto the end of a product cycle inevitably face the same problems: missed release dates, inconsistent terminology, truncated UI strings, and defect tickets that should never have existed. The root cause is rarely the translation itself, it's the absence of a structured, repeatable workflow that connects engineering, content, and localization from the first string commit to the final release gate.
This guide maps an enterprise-grade text localization workflow designed to ship on time and at quality. It covers every phase, from auditing your source strings and preparing files, through translation routing and quality assurance, to release gating and continuous improvement. Whether you manage five locales or fifty, the principles here will help you build a process that scales with your product rather than against it.
String Inventory and Content Audit
Before any translation begins, you need a clear accounting of what exists, what's changed, and what's actually ready to localize.
Building a Source-String Registry
A source-string registry is a canonical inventory of every localizable string in your product. It maps each string to its key, file location, component or feature, and current translation status across all target locales. Without it, teams waste cycles re-translating unchanged content, miss newly added strings, or discover orphaned keys that inflate costs.
Start by extracting all resource files from your codebase, whether they live in JSON, XLIFF, .properties, .strings, or YAML formats. Parse them into a flat registry that includes:
- String key (unique identifier)
- Source text (English or primary language)
- File path and component (where the string lives in the product)
- Character count and context notes
- Last modified timestamp
- Translation status per locale (untranslated, in-progress, reviewed, published)
Automate registry updates by hooking into your version control system. Every pull request that touches a resource file should trigger a diff against the registry, flagging new, modified, and deleted strings. This eliminates the manual "string handoff" that causes delays in most organizations.
Identifying Gaps, Duplicates, and Hardcoded Text
With a registry in place, run an audit to surface problems before they reach translators:
- Duplicates: Strings with identical source text but different keys waste translation budget and create inconsistency risk. Consolidate them or create shared references.
- Hardcoded text: Scan templates, scripts, and even error logs for user-facing strings that bypass resource files entirely. Regular expression sweeps and static analysis tools like i18n-lint catch most offenders.
- Missing context: Strings without developer comments or screenshots are ambiguous. A button labeled "Set" could mean "configure," "a collection," or a verb imperative. Flag context-free strings and route them back to product teams before translation.
- Stale strings: Keys referenced nowhere in the current codebase inflate translation memory and confuse linguists. Prune them.
The goal of this phase is simple: ensure that every string entering the localization pipeline is necessary, unique, contextualized, and extracted from the codebase properly.
Internationalization Readiness
Translation quality depends on internationalization quality. Poorly internationalized source code produces strings that translators cannot adapt correctly, no matter how skilled they are.
Placeholder Syntax and Variable Handling
Placeholders, the dynamic segments in strings like Welcome, {userName}, must follow a consistent, translator-safe syntax. Mixed formats (%s in one file, {{name}} in another, $variable in a third) confuse translators and break tooling.
Standardize on a single placeholder format per platform. For web and cross-platform projects, ICU MessageFormat is the strongest choice because it handles not just simple substitution but also pluralization, gender selection, and nested arguments in a single syntax. For example:
{count, plural,
one {You have {count} new message.}
other {You have {count} new messages.}
}
Enforce placeholder conventions through linting rules that run on every commit. If a developer introduces a string with a bare concatenation ("Hello, " + name) instead of a proper placeholder, the build should fail.
Plural Rules, Gender, and ICU MessageFormat
English has two plural forms (singular and plural). Arabic has six. Polish has four, with complex mathematical rules governing which form applies. Hardcoding plural logic with simple if/else blocks guarantees broken translations in most languages.
ICU MessageFormat solves this by letting translators define the correct form for every plural category (zero, one, two, few, many, other) specified by the Unicode CLDR plural rules. The same mechanism handles gender-dependent phrasing ({gender, select, female {She left} male {He left} other {They left}}).
Adopting ICU at the source level is a one-time engineering investment that prevents a recurring class of defects across every locale you add.
Source-Quality Improvements Before Handoff
Translators work faster and more accurately when the source text is clear, concise, and unambiguous. Before handing strings off, apply these source-quality practices:
- Eliminate jargon and cultural idioms that don't translate. "Hit the ground running" means nothing in most languages.
- Keep sentences short. Compound sentences with multiple clauses are harder to restructure in languages with different word orders.
- Use full sentences, not fragments that rely on surrounding UI context the translator may not see.
- Provide context notes for every string: what UI element it appears in, what state triggers it, any character-length constraints.
- Run controlled language checks if you operate in regulated industries. Tools that enforce simplified English (like ASD-STE100 for aerospace) reduce ambiguity systematically.
Investing in source quality pays compound returns, fewer translator queries, higher first-pass accuracy, and lower post-editing effort across every target language.
Content Tiering and Routing Rules
Not every string deserves the same localization treatment. Treating a legal disclaimer the same as a tooltip wastes budget; treating a checkout button the same as a blog post risks revenue.
Critical UI vs. Growth Copy vs. Long-Form Documentation
Organize your string inventory into tiers based on business impact and risk:
| Tier | Content Type | Examples | Risk if Wrong |
|---|---|---|---|
| Tier 1, Critical UI | Transactional, legal, safety | Checkout flows, consent forms, error messages, navigation labels | Revenue loss, legal liability, user safety |
| Tier 2, Growth Copy | Marketing, onboarding, engagement | Landing pages, email campaigns, in-app prompts, feature announcements | Conversion drops, brand damage |
| Tier 3, Long-Form Docs | Support, knowledge base, internal | Help articles, release notes, internal documentation | Increased support tickets, slower self-service |
Tiering decisions should be codified, ideally as metadata on each string or file, so routing happens automatically rather than through manual triage every cycle.
MT-Only, MT + Post-Editing, and Human-First Paths
Each tier maps to a translation routing path:
- Tier 1 → Human-first: Professional translators work from scratch or with translation memory suggestions. Every string passes through linguistic review. No shortcuts.
- Tier 2 → MT + post-editing (MTPE): Machine translation generates the initial draft; a human post-editor refines it for fluency, brand voice, and accuracy. This path typically reduces turnaround time significantly while maintaining publishable quality.
- Tier 3 → MT-only (with guardrails): Raw machine translation output is published directly, but only after automated quality checks (placeholder integrity, length limits, terminology adherence) pass. Reserve this path for low-risk, high-volume content where speed matters more than polish.
These routing rules should be configurable per locale, too. A Tier 2 string might route to human-first for Japanese (where MT quality for marketing copy is still inconsistent) but MTPE for Spanish (where MT engines perform well on similar content types). Platforms like Ollang allow you to configure these routing rules across languages and content types within a single workflow, you can book a demo to see how this works in practice.
File Preparation and Connector Setup
Choosing Between JSON, XLIFF, and Other Formats
Your resource file format affects tooling compatibility, translator experience, and the complexity of your build pipeline. The most common formats in modern localization:
- JSON (flat or nested): The default for web apps and many mobile frameworks. Simple to parse, well-supported by TMS platforms. Nested JSON preserves component hierarchy but can complicate diff tracking. Flat JSON is easier to manage at scale.
- XLIFF 2.0: The OASIS standard specifically designed for localization interchange. It supports inline metadata, notes, size restrictions, and state tracking natively. Ideal for complex workflows involving multiple tools and vendors.
- Android XML / iOS .strings / .stringsdict: Platform-native formats required by mobile build systems. Convert to XLIFF for translation, then back to native format for builds.
- PO/POT (gettext): Common in open-source and legacy systems. Well-supported but lacks some metadata richness of XLIFF.
Choose the format that your engineering team already uses, then ensure your localization tooling can round-trip it without data loss. Format conversion errors, lost placeholders, collapsed plurals, stripped context notes, are among the most common sources of localization defects.
TMS and Repository Connectors
Manual file handoffs (emailing ZIP files to a vendor, uploading to a shared drive) do not scale. Connect your source repository directly to your translation management system using API-based connectors.
A well-configured connector should:
- Monitor specific branches or directories for changes to resource files
- Push only new and modified strings to the TMS (not the entire file)
- Pull completed translations back into the correct file paths and branch
- Preserve file encoding, key ordering, and formatting
- Support branch-based workflows (feature branches get their own translation jobs)
Ollang and most modern TMS platforms offer GitHub, GitLab, and Bitbucket integrations out of the box. Ollang's connectors are diff-aware and preserve branch context to avoid redundant work. For custom setups, webhook-driven pipelines provide the same automation.
Branching Strategy and Version Control for Locale Files
Locale files should live in your main repository alongside the source code they serve, not in a separate "translations repo" that drifts out of sync.
Adopt a branching strategy that mirrors your development workflow:
- Feature branches: New strings added in a feature branch get translated before the branch merges to main. This prevents a backlog of untranslated strings accumulating on the main branch.
- Release branches: When a release branch is cut, lock the string set. Any string changes after the cut require explicit approval to avoid scope creep.
- Merge conflict resolution: Automated merge of locale files should be key-based, not line-based. Tools that understand resource file structure prevent the garbled merges that plain git merge produces on JSON or XML files.
Tag every release with the exact set of locale files shipped. This makes rollback straightforward, you can revert to the last known-good translation state for any locale without affecting others.
Glossary, Style Guide, and Pre-Translation Setup
Creating and Maintaining Terminology Databases
A glossary is the single most impactful quality lever in localization. It ensures that "dashboard" is always translated the same way, that product names remain untranslated where required, and that industry-specific terms follow established conventions.
Build your glossary systematically:
- Extract high-frequency terms from your string registry using term-extraction tools.
- Add product-specific terms, feature names, and branded vocabulary.
- Define "do not translate" terms (product names, technical identifiers).
- For each term, provide a definition, approved translation per locale, part of speech, and usage context.
- Assign term ownership, someone must approve additions and changes.
Store the glossary in your TMS so it's enforced during translation and QA. Glossary violations should surface as warnings during translation and as errors during review.
Update the glossary every release cycle. New features introduce new terms; deprecated features leave behind terms that confuse translators if not cleaned up.
Locale-Specific Style Guides
A style guide goes beyond terminology to cover voice, tone, formality level, date/number formatting conventions, and UI-specific rules (capitalization, punctuation in buttons, use of honorifics).
Each target locale needs its own style guide, even if they share a source language. Brazilian Portuguese and European Portuguese differ in formality conventions, spelling, and idiomatic preferences. Simplified Chinese and Traditional Chinese diverge not just in character sets but in phrasing norms.
Effective style guides are short, example-heavy, and structured for quick reference, not 40-page PDFs that no one reads. Organize them by category: UI elements, error messages, marketing copy, legal text. Include "do this / not this" pairs for every rule.
Leveraging Translation Memory for Consistency
Translation memory (TM) stores previously approved translations as source-target pairs. When a new string matches or closely resembles a stored segment, the TM suggests the existing translation, saving time and enforcing consistency.
TM effectiveness depends on maintenance:
- Segment regularly: Purge outdated translations after major product rewrites.
- Penalize fuzzy matches appropriately: A 75% fuzzy match still requires human review. Don't auto-populate without verification.
- Separate TMs by content type: Marketing TM and UI TM serve different purposes. Mixing them produces tone mismatches.
- Share TMs across projects carefully: Cross-project sharing boosts leverage but can introduce terminology from unrelated products.
Pre-translation, running new strings against TM and glossary before assigning them to translators, accelerates the workflow by resolving exact matches automatically and giving translators a head start on fuzzy matches.
