Skip to content

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

FormatPlatformsParameter SyntaxDownloaded File
i18n JSONReact, Vue, Angular, Node.js (i18next and similar){{param}}translations.en.json
Android XMLAndroid (native)%1$sstrings.xml
iOS StringsiOS/macOS (native)%1$@Localizable.strings
Flutter ARBFlutter{param}intl_en.arb
Flat JSONGeneric{{param}}translations-en.json
Nested JSONGeneric, vue-i18n{{param}}translations-en.json

Learn more about formats ->

Exporting from the Dashboard

  1. Open Import & Export in the sidebar (or Export on the Translations page) and switch to Export
  2. Choose the Export Format
  3. Select Languages - one or more of the project’s languages
  4. Optionally Filter by Module
  5. Optionally turn on Include draft keys
  6. Check the Preview - pick a preview language to see the file exactly as it will be downloaded
  7. 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.

CLI module filtering
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

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:

json
{
"home": {
  "welcome": "Welcome, {{username}}!",
  "subtitle": "Get started with {{appName}}"
},
"auth": {
  "login": {
    "title": "Sign In"
  }
}
}

Android XML

strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Main welcome message -->
<string name="home.welcome">Welcome, %1$s!</string>
</resources>

iOS Strings

Localizable.strings
/* Main welcome message */
"home.welcome" = "Welcome, %1$@!";

Flutter ARB

json
{
"@@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:

.github/workflows/deploy.yml
- 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

  1. Load the files in your development environment
  2. Check for missing keys
  3. Verify parameter replacement
  4. 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