Dashboard guide
Export Translations
Download a project’s translations as files for your app, in six formats, with placeholders converted to each platform’s syntax.
Supported Export Formats
| Format | Platforms | Parameter Syntax | Downloaded File |
|---|---|---|---|
| i18n JSON | React, Vue, Angular, Node.js (i18next and similar) | {{param}} | translations.en.json |
| Android XML | Android (native) | %1$s | strings.xml |
| iOS Strings | iOS/macOS (native) | %1$@ | Localizable.strings |
| Flutter ARB | Flutter | {param} | intl_en.arb |
| Flat JSON | Generic | {{param}} | translations-en.json |
| Nested JSON | Generic, vue-i18n | {{param}} | translations-en.json |
Exporting from the Dashboard
- Open Import & Export in the sidebar (or Export on the Translations page) and switch to Export
- Choose the Export Format
- Select Languages - one or more of the project’s languages
- Optionally Filter by Module
- Optionally turn on Include draft keys
- Check the Preview - pick a preview language to see the file exactly as it will be downloaded
- Download a single language’s file, or click Export All to download one file per selected language
The page also shows the equivalent langctl pull command under Prefer the terminal?, ready to copy.
What’s Included
Published Keys Only (default)
By default only published keys are exported - the same as langctl pull. Turn on Include draft keys to include unpublished keys as well, for example to test work in progress.
AI Translations Awaiting Review
AI translations that nobody has approved or edited yet are left out, and the page tells you how many were skipped. Your app falls back to the default language for those strings. Click Review them to go and approve them, or Include them to put them in this export anyway.
Module Filter
Export only the keys of one module - for example an “auth” module for a login flow, or “marketing” for landing pages.
langctl export my-app -l en -f json --module auth -o auth-en.json
# or, in a repo with langctl.json
langctl pull --module dashboard Format Examples
i18n JSON / Flat JSON
{
"home.welcome": "Welcome, {{username}}!",
"home.subtitle": "Get started with {{appName}}",
"auth.login.title": "Sign In"
} Nested JSON
Hierarchical structure based on the dots in key names:
{
"home": {
"welcome": "Welcome, {{username}}!",
"subtitle": "Get started with {{appName}}"
},
"auth": {
"login": {
"title": "Sign In"
}
}
} Android XML
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Main welcome message -->
<string name="home.welcome">Welcome, %1$s!</string>
</resources> iOS Strings
/* Main welcome message */
"home.welcome" = "Welcome, %1$@!"; Flutter ARB
{
"@@locale": "en",
"home.welcome": "Welcome, {username}!",
"@home.welcome": {
"description": "Main welcome message",
"placeholders": {
"username": { "type": "String" }
}
}
} Key descriptions are written as comments (Android, iOS) or description metadata (ARB).
Android and Flutter: prefer the CLI
The dashboard writes key names as they are. langctl pull additionally converts them into valid Android resource names (home.welcome → home_welcome) and Dart identifiers (homeWelcome), gives a repeated placeholder the same position, writes ARB files without timestamps, and puts each language’s file in the platform’s folder layout (res/values-es/strings.xml, es.lproj/Localizable.strings, lib/l10n/app_es.arb). See Pull, Push & Import.
Exporting in CI/CD
For files that live in your repository, use the CLI instead of downloading from the dashboard:
- name: Pull Translations
env:
LANGCTL_API_KEY: ${{ secrets.LANGCTL_API_KEY }}
run: npx langctl@0 pull # project, format and paths from langctl.json
- name: Build Application
run: npm run build Best Practices
Version Control Your Exports
Commit translation files to git:
- Track translation changes over time
- Roll back if needed
- Review translation updates in PRs
Test After Export
- Load the files in your development environment
- Check for missing keys
- Verify parameter replacement
- Check the strings in your app’s UI
Troubleshooting
Export File is Empty
Common causes:
- No published keys - publish keys, or turn on Include draft keys
- The module filter excludes all keys
- The language has no translations yet
Keys Missing from Export
Check:
- The key is published (or Include draft keys is on)
- The translation isn’t an AI translation awaiting review
- The module filter
- The language has a translation for that key
Parameters Not Converting
If {{param}} appears instead of platform syntax:
- Check the format selection (JSON formats keep
{{param}}) - Check the placeholder is written with double braces in langctl
Next Steps
- Import Translations - Import existing translation files
- Platform Integrations - Set up in your app
- CI/CD Integration - Automate pulls
- Export Formats Reference - Detailed format specs