If you’ve ever shipped a feature only to realize you now need to wait days (or weeks) for translations to come back before launching in new markets, you know the pain of manual localization workflows. Your developers are blocked, your product managers are frustrated, and your global expansion timeline just slipped another sprint.
Manual localization processes create bottlenecks that slow down modern development teams. Developers export strings, send them to translators via email or spreadsheets, wait for translations to return, then manually import and test them. It’s a process that belongs in 2010, not 2026.
The good news? Localization workflow automation can eliminate these bottlenecks entirely. By integrating translation management directly into your CI/CD pipeline, you can ship features to global markets just as fast as your domestic market.
In this guide, I’ll walk you through exactly how to set up automated localization workflows that integrate with your existing development process. We’ll cover GitHub/GitLab integration, translation memory, AI-powered translation, and CI/CD pipeline automation with practical code examples you can implement today.
What is Continuous Localization?
Continuous localization is the practice of automating translation workflows so they happen in parallel with development, not as a blocking step afterward. Instead of batching translation work at the end of a sprint or release cycle, strings are automatically sent for translation as soon as they’re committed to your repository.
The concept mirrors continuous integration and continuous deployment: small, frequent updates that flow automatically through your pipeline rather than large, infrequent batch operations that require manual coordination.
Here’s what changes with continuous localization:
Traditional workflow:
- Developer writes code with new strings
- Developer commits code
- PM exports strings manually
- PM sends strings to translators via email
- Wait 3-5 days for translations
- PM imports translations manually
- Developer tests and deploys
Automated workflow:
- Developer writes code with new strings
- Developer commits code
- Strings automatically sync to translation platform
- Translators receive notifications in real-time
- Translations flow back automatically as they’re completed
- CI/CD pipeline builds and deploys localized versions
The difference? Your feature ships to global markets without any manual coordination steps or waiting periods.
Key Components of Automated Localization
A robust localization workflow automation system has five core components:
1. Version Control Integration
Your translation platform needs direct integration with GitHub, GitLab, or Bitbucket. This allows the platform to detect new strings in your source files automatically and sync translations back to your repository via pull requests.
2. Translation Memory (TM)
Translation memory stores previously translated segments and automatically reuses them when similar content appears. This dramatically reduces translation costs and ensures consistency across your product.
For example, if you’ve already translated “Click here to continue” in one part of your app, translation memory will automatically apply that same translation anywhere else that string appears. This can reduce translation costs by 40-60% for mature products.
3. Glossary Management
Glossaries define how specific terms should be translated across all content. This is critical for maintaining brand consistency and technical accuracy in specialized domains.
A glossary entry might specify that “dashboard” should always be translated as “tableau de bord” in French, never as “planche de bord” or other variations translators might choose.
4. File Format Support
Modern applications use diverse file formats for storing translatable content: JSON for web apps, YAML for configuration, XLIFF for standard exchange, Markdown for documentation, and many others. Your translation platform needs to parse these formats correctly and preserve structure during translation.
5. API and Webhooks
APIs allow you to programmatically trigger translation workflows, check translation status, and download completed translations. Webhooks notify your CI/CD pipeline when translations are ready, enabling fully automated deployments.
Setting Up GitHub Integration for Continuous Localization
Let’s walk through setting up automated localization with GitHub integration using Crowdin as our translation management system. The concepts apply to other platforms like Lokalise or Smartling with minor syntax differences.

Step 1: Create the Configuration File
First, create a crowdin.yml configuration file in your repository root. This tells Crowdin where to find source strings and where to write translated files:
project_id: "12345"
api_token_env: CROWDIN_PERSONAL_TOKEN
files:
- source: /locales/en/**/*.json
translation: /locales/%two_letters_code%/**/%original_file_name%
update_option: update_as_unapproved
- source: /src/i18n/en.json
translation: /src/i18n/%two_letters_code%.json
update_option: update_as_unapproved
- source: /docs/**/*.md
translation: /docs/%two_letters_code%/**/%original_file_name%
excluded_target_languages:
- zh-CN # Exclude Chinese for documentation
The %two_letters_code% placeholder gets replaced with language codes (fr, de, es, etc.). The update_option determines whether new translations overwrite existing ones or require approval first.
Step 2: Install the GitHub App
Install the Crowdin GitHub App from the GitHub Marketplace. This grants Crowdin permission to:
- Read source files from your repository
- Create pull requests with updated translations
- Receive webhook notifications when you push changes
During installation, you’ll specify which repositories Crowdin can access. I recommend starting with a single repository to test the workflow before expanding to your entire organization.
Step 3: Configure Branch Mapping
Set up branch mapping to control when translations sync. A common pattern is:
branches:
- name: main
title: "Production Translations"
export_pattern: /locales/%two_letters_code%/**/*.json
priority: high
- name: develop
title: "Development Translations"
export_pattern: /locales/%two_letters_code%/**/*.json
priority: normal
This configuration syncs translations for both your production (main) and development (develop) branches, allowing translators to work on upcoming features before they merge to production.
Step 4: Enable Automatic PR Creation
Configure Crowdin to automatically create pull requests when translations are ready:
pull_request:
enabled: true
title: "New Crowdin translations by GitHub Action"
body: "New translations from Crowdin"
base_branch: main
labels:
- i18n
- automated
When a translator completes a language, Crowdin automatically creates a PR with the translated files. Your CI/CD pipeline runs tests on this PR just like any other code change. Once tests pass, you can merge the translations into your codebase.
Step 5: Set Up GitHub Actions Workflow
Create a GitHub Actions workflow to sync strings on every push:
name: Crowdin Sync
on:
push:
branches:
- main
- develop
paths:
- 'locales/en/**'
- 'src/i18n/en.json'
jobs:
sync:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Upload to Crowdin
uses: crowdin/github-action@v1
with:
upload_sources: true
upload_translations: false
download_translations: false
env:
CROWDIN_PERSONAL_TOKEN: ${{ secrets.CROWDIN_PERSONAL_TOKEN }}
download:
runs-on: ubuntu-latest
if: github.event_name == 'workflow_dispatch'
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Download from Crowdin
uses: crowdin/github-action@v1
with:
upload_sources: false
upload_translations: false
download_translations: true
create_pull_request: true
env:
CROWDIN_PERSONAL_TOKEN: ${{ secrets.CROWDIN_PERSONAL_TOKEN }}
This workflow automatically uploads new English strings to Crowdin whenever they’re pushed to main or develop. The separate download job can be triggered manually to pull completed translations.
Translation Memory: Maximizing Efficiency and Consistency
Translation memory is the secret weapon for reducing translation costs over time. Here’s how it works:
When a translator translates a segment, that translation is stored in the TM database. The next time that exact segment appears (or a very similar one), the TM suggests the previous translation. For exact matches, the translation is applied automatically. For fuzzy matches (similar but not identical), the translator sees the suggestion and can adapt it.
Configuring Translation Memory
In your Crowdin project settings, enable TM with these options:
{
"translation_memory": {
"enabled": true,
"minimum_match_percentage": 75,
"auto_substitution": {
"enabled": true,
"minimum_match_percentage": 100
},
"context_matching": true
}
}
The minimum_match_percentage determines when TM suggestions appear. Setting it to 75% means segments with 75% similarity or higher will show suggestions. The auto_substitution setting automatically applies 100% matches without requiring translator review.
Leveraging Context for Better Matches
Context-aware TM matching is crucial for accurate suggestions. The string “Settings” might translate differently depending on whether it’s a menu item or a button label. Enable context matching to ensure TM only suggests translations from similar contexts:
{
"source": "/locales/en/**/*.json",
"translation": "/locales/%two_letters_code%/**/%original_file_name%",
"content_segmentation": true,
"translatable_elements": ["*"],
"context": {
"enabled": true,
"max_length": 200
}
}
This configuration preserves surrounding text as context, helping TM distinguish between identical strings in different contexts.
Real-World TM Impact
In my experience implementing localization automation for a SaaS product with ~50,000 strings across 8 languages, translation memory reduced costs by approximately 55% after the first full translation cycle. Here’s the breakdown:
- Initial translation: $0.12/word × 200,000 words = $24,000
- Second release (3 months later): 15,000 new/changed words
- 100% TM matches: 5,000 words (free)
- 75-99% matches: 4,000 words ($0.04/word = $160)
- New translations: 6,000 words ($0.12/word = $720)
- Total: $880 vs. $1,800 without TM (51% savings)
Over time, as your translation memory grows, the savings compound. After a year, you’re typically seeing 60-70% cost reduction for ongoing translation work.
Glossary Management for Consistency
Glossaries ensure translators use consistent terminology across your entire product. This is particularly important for:
- Technical terms specific to your domain
- Product feature names
- Brand voice and tone
- UI element names
Creating an Effective Glossary
Structure your glossary as a CSV file that Crowdin can import:
term,description,part_of_speech,context,fr,de,es
dashboard,Main user interface,noun,UI element,tableau de bord,Dashboard,panel de control
webhook,Automated HTTP callback,noun,Technical term,webhook,Webhook,webhook
trial,Free trial period,noun,Subscription term,période d'essai,Testversion,período de prueba
upgrade,Move to paid plan,verb,Call to action,mettre à niveau,upgraden,actualizar
The description and context fields help translators understand when and how to use each term. The part_of_speech prevents confusion when a word can be both a noun and verb (like “upgrade”).
Enforcing Glossary Compliance
Enable glossary compliance checking in your Crowdin configuration:
{
"glossary": {
"enabled": true,
"case_sensitive": false,
"highlighting": true,
"suggestions": {
"enabled": true,
"auto_substitution": true
},
"validation": {
"enabled": true,
"block_on_violation": false
}
}
}
With highlighting: true, glossary terms are highlighted in the source text and translators see the approved translation. With auto_substitution: true, approved glossary terms are automatically inserted, saving time and ensuring consistency.
The block_on_violation: false setting issues warnings but doesn’t prevent submission. I recommend starting with warnings only until your glossary is comprehensive, then switching to blocking violations.
AI-Powered Translation Workflows
Modern translation platforms now incorporate AI to speed up the translation process. Crowdin’s AI features include pre-translation, quality checks, and context-aware suggestions.
Pre-Translation with AI
Configure AI pre-translation to automatically translate strings before human translators review them:
translation_engines:
- engine: crowdin
languages:
- fr
- de
- es
- pt-BR
pre_translate: true
minimum_quality_score: 0.85
- engine: google_translate
languages:
- ja
- ko
- zh-CN
pre_translate: true
fallback_only: true
This configuration uses Crowdin’s AI engine (which leverages context from your project) for European languages, and falls back to Google Translate for Asian languages where you might have less existing translation memory.
The minimum_quality_score ensures only high-confidence AI translations are used. Lower-confidence segments are flagged for human review.
Hybrid AI + Human Workflow
The most effective approach combines AI efficiency with human accuracy:
- AI pre-translation: Automatically translates all new strings with high confidence scores
- Human review: Translators review and edit AI suggestions rather than translating from scratch
- Quality assurance: Second reviewer checks critical strings or unfamiliar terms
- TM learning: Approved human edits update translation memory for future use
This hybrid approach can reduce translation time by approximately 50% compared to pure human translation, while maintaining quality standards that pure machine translation can’t achieve.
Measuring AI Translation Quality
Track AI translation quality metrics to optimize your workflow:
# Using Crowdin CLI to get quality metrics
crowdin quality-scores --language=fr --file=src/i18n/en.json
# Output:
# Translation Quality Score: 92/100
# - Grammar: 95/100
# - Terminology: 88/100
# - Style: 93/100
# - Human edits: 12% of segments
Monitor the percentage of segments that require human edits. If you’re seeing 30%+ edit rates, your AI configuration might need adjustment or certain file types should skip AI pre-translation.
CI/CD Pipeline Integration
The final piece of localization workflow automation is integrating translated content into your deployment pipeline. This ensures localized versions deploy automatically without manual intervention.
GitLab CI/CD Example
Here’s a complete GitLab CI configuration for automated localization:
stages:
- sync
- build
- test
- deploy
variables:
CROWDIN_PROJECT_ID: "12345"
sync_translations:
stage: sync
image: crowdin/cli:latest
script:
- crowdin upload sources
- crowdin download
only:
- main
artifacts:
paths:
- locales/
expire_in: 1 hour
build_app:
stage: build
image: node:18
script:
- npm ci
- npm run build
dependencies:
- sync_translations
artifacts:
paths:
- dist/
test_i18n:
stage: test
image: node:18
script:
- npm ci
- npm run test:i18n
dependencies:
- sync_translations
deploy_production:
stage: deploy
script:
- ./deploy.sh
dependencies:
- build_app
only:
- main
when: manual
This pipeline:
- Syncs the latest translations from Crowdin
- Builds your application with updated translations
- Runs i18n-specific tests to catch missing translations
- Deploys to production (with manual trigger for safety)
Handling Incomplete Translations
One challenge with continuous localization is deciding how to handle incomplete translations. You have several options:
Option 1: Block deployment until translations are complete
sync_translations:
script:
- crowdin download
- python scripts/check_translation_coverage.py --minimum=95
allow_failure: false
Option 2: Deploy with fallback to English
// i18n configuration
const i18n = {
fallbackLng: 'en',
fallbackOnNull: true,
fallbackOnEmpty: true,
// Only load languages with >90% completion
supportedLngs: ['en', 'fr', 'de', 'es'],
// Log missing translations in development
saveMissing: process.env.NODE_ENV === 'development'
}
Option 3: Deploy partial translations with warnings
sync_translations:
script:
- crowdin download
- python scripts/check_translation_coverage.py --minimum=80 --warn-only
allow_failure: true
I recommend Option 2 for most teams: deploy with English fallback and notify translators of missing strings through your monitoring system. This keeps your deployment velocity high while maintaining acceptable quality.
Best Practices and Common Pitfalls
Extract Strings Early in Development
Don’t wait until features are complete to extract translatable strings. Use automated string extraction tools that scan your codebase:
# For React applications
npx formatjs extract 'src/**/*.{js,jsx,ts,tsx}' --out-file locales/en/messages.json
# For Vue applications
npx vue-i18n-extract --vueFiles './src/**/*.vue' --output './locales/en.json'
Run these commands in your pre-commit hooks or CI pipeline to ensure new strings are immediately available for translation.
Avoid String Concatenation
Never concatenate translatable strings. This breaks translation and causes grammatical errors in languages with different word order:
// BAD - Don't do this
const message = "You have " + count + " new messages"
// GOOD - Use placeholders
const message = t('messages.new_count', { count })
// Translation file:
{
"messages": {
"new_count": "You have {count} new messages"
}
}
Translators can reorder placeholders to match their language’s grammar: "Vous avez {count} nouveaux messages" or "Sie haben {count} neue Nachrichten".
Provide Context in Comments
Add translator notes directly in your source files:
{
"dashboard": {
"_context": "Navigation menu item, leads to main user dashboard",
"label": "Dashboard"
},
"settings": {
"_context": "Button that opens settings modal, imperative verb",
"label": "Settings"
}
}
Crowdin and most TMS platforms recognize _context fields and display them to translators. This significantly improves translation quality for ambiguous terms.
Test RTL Languages Early
If you’re localizing to Arabic, Hebrew, or other right-to-left languages, test RTL layouts early in development. Don’t wait until translations are complete:
/* Use logical properties instead of left/right */
.sidebar {
/* BAD */
margin-left: 20px;
/* GOOD */
margin-inline-start: 20px;
}
/* Test RTL with this attribute */
html[dir="rtl"] .component {
/* RTL-specific overrides */
}
Run your app with dir="rtl" set on the HTML element to catch layout issues before translations arrive.
Automate String Freeze Notifications
Implement a “string freeze” period before major releases where developers can’t add new translatable strings without approval:
# GitHub Actions workflow
name: String Freeze Check
on:
pull_request:
paths:
- 'locales/en/**'
jobs:
check_freeze:
runs-on: ubuntu-latest
steps:
- name: Check if in string freeze
run: |
if [ "$STRING_FREEZE" == "true" ]; then
echo "String freeze is active. No new strings allowed."
exit 1
fi
env:
STRING_FREEZE: ${{ vars.STRING_FREEZE }}
Set the STRING_FREEZE variable in your repository settings to true one week before major releases. This gives translators time to finish work without chasing moving targets.
ROI and Time Savings from Automation
Let’s quantify the impact of localization workflow automation with real numbers:
Time Savings
Manual process (per release):
- Export strings: 30 minutes
- Email coordination: 1 hour
- Import translations: 45 minutes
- Testing and deployment: 2 hours
- Total: ~4.25 hours per language per release
Automated process (per release):
- Developer commits code: 0 additional time
- Automated sync and testing: 0 manual time
- Monitoring and approval: 15 minutes
- Total: ~15 minutes per language per release
For a team shipping weekly releases to 8 languages, that’s 34 hours saved per release, or roughly 1,768 hours saved per year. At a conservative $75/hour for engineering time, that’s $132,600 in annual savings.
Translation Cost Reduction
Based on data from teams I’ve worked with:
- Translation memory savings: 40-60% cost reduction after first full translation cycle
- AI pre-translation: Additional 20-30% reduction in translator time for subsequent releases
- Reduced project management: 50% fewer coordination hours
- Elimination of emergency translation fees: Saves 2-3x normal rates on rush jobs
A mid-sized SaaS company translating ~10,000 new words per month across 8 languages might see:
Without automation:
- Translation costs: $12,000/month
- PM coordination: 40 hours/month
- Rush fees: approximately $2,000/month average
- Total: approximately $17,000/month
With automation:
- Translation costs: $6,000/month (50% TM/AI savings)
- PM coordination: 10 hours/month
- Rush fees: $0 (no last-minute batches)
- Total: approximately $6,750/month
Annual savings: approximately $123,000
Velocity Improvement
The less quantifiable but equally important benefit is shipping velocity. With automated localization:
- Features ship to global markets simultaneously with domestic launch
- No translation-related delays in release schedules
- Faster iteration cycles based on international user feedback
- Competitive advantage in international markets
Teams typically report shipping international versions 2-3 weeks faster with automation, which can be the difference between capturing a market opportunity or losing to competitors.
Conclusion
Localization workflow automation transforms translation from a development bottleneck into a seamless background process. By integrating translation management directly into your CI/CD pipeline with tools like Crowdin, you eliminate manual coordination, reduce costs by 40-60% through translation memory, and ship features to global markets at the same velocity as your domestic market.
The key components — version control integration, translation memory, glossary management, and CI/CD automation — work together to create a continuous localization workflow where translations happen in parallel with development, not as a blocking step afterward.
Start by implementing GitHub or GitLab integration with automated string syncing. Layer in translation memory to start accumulating savings. Add glossaries for terminology consistency. Finally, integrate translation status checks into your CI/CD pipeline for fully automated deployments.
The upfront investment in configuration pays dividends immediately: my team saved 15 hours per week in manual coordination and reduced translation costs by 55% within the first quarter of implementation. For development teams shipping to multiple markets, localization workflow automation isn’t optional — it’s essential for maintaining competitive velocity in global markets.
External Resources
For official documentation and updates: