Dashboard guide
AI Translation
langctl uses DeepL to fill in missing translations from your default language. AI translations are held back from your app until someone reviews them.
Overview
AI translation in langctl provides:
- Suggest: Translate one language of one key in its detail panel
- Translate missing: Fill every empty translation for many keys and languages at once
- Placeholder protection:
{{parameters}}are kept intact - Project AI settings: context, a do-not-translate list, a glossary and tone per language, applied to every AI translation
- Key descriptions as context: each key’s description tells DeepL what a short string means
- Review before shipping: AI translations are left out of exports and
langctl pulluntil they’re approved or edited
AI translation is managed by langctl - there’s no provider key to configure. It’s available to members, admins and owners (not viewers), and your email address must be verified.
Included in All Plans
Every plan includes a monthly allowance of AI translations:
- Free: 300 / month
- Starter: 2,000 / month
- Pro: 8,000 / month
- Team: 25,000 / month
- Enterprise: Custom
Project AI Settings
Short UI strings are ambiguous: on its own, “Book” is a thing you read, “Open” is a command and “Credit” can mean praise. Give DeepL the context it needs in Project settings → AI translation. Members can see these settings; owners and admins can change them (API keys need the projects:write scope).
| Setting | What it does |
|---|---|
| Project context | Up to 1,000 characters describing your product, sent to DeepL with every AI translation of the project. It isn’t translated or billed. Say what the product is and what ambiguous words mean, e.g. “QwikTik is a booking app for salons and clinics in India; ‘Book’ means make a booking.” |
| Do not translate | Up to 200 terms (brand names, codes, product names: QwikTik, WhatsApp, UPI, GST, GSTIN) that are kept exactly as written. Matching is case-sensitive and whole-word only, and the longest term wins (GSTIN before GST). A string that is only such terms (plus placeholders, numbers or punctuation) is copied without calling DeepL. |
| Glossary | Preferred translations of a term for one target language, e.g. booking → बुकिंग for Hindi. An entry for pt applies to pt-BR and pt-PT; an entry for pt-BR only to pt-BR and wins over pt. |
| Tone | Formality per target language: default, more formal or less formal. It’s applied as a preference, so languages without a formality option in DeepL are translated as usual. |
Key descriptions
A key’s description is sent to DeepL as context too, after the project context, so describe where a short string appears: “Button that makes a booking”, “Badge: the business is open right now”, “Transaction type: money coming in”. Set descriptions in the key’s detail panel, or in bulk with an import file that carries them (rich values { "value": "…", "description": "…" }); an import sets the description of existing keys whenever it differs from the stored one.
How the glossary is applied
- Where DeepL supports glossaries for the language pair (for example English → German, French, Spanish, Japanese or Portuguese), langctl creates a DeepL glossary from your entries and uses it. It’s rebuilt automatically when you change the glossary.
- For other pairs (for example English → Hindi), langctl puts your preferred translation in place of the source term before the text goes to DeepL and tells DeepL to leave it alone, so it comes back exactly as you wrote it. This is the same mechanism as Do not translate, so the rest of the sentence is translated around the term. Add each form you use (
booking,Booking,bookings): matching is case-sensitive and whole-word.
Turn context on before a large first translation
Set the project context, do-not-translate list and glossary, and add descriptions to short or ambiguous keys, before translating a whole project. It’s much cheaper than reviewing thousands of drafts afterwards.
Translating a Single Key
- On Translations, click the key to open its detail panel
- Next to an empty language, click Suggest
- The AI translation of the default-language text appears in the field
- Edit it if needed, then save the key
Note
AI translations always use the project’s default language as the source. Make sure the default-language text is filled in and accurate.
Translating Missing Translations in Bulk
- On Translations, either:
- click Translate missing in the toolbar to translate the keys in the current view (use search and filters to narrow it down), or
- select keys with the checkboxes and click Translate missing in the bulk bar
- In the dialog, check the source language and choose the target languages
- The dialog shows how many translations will be created and how much of this month’s allowance is left
- Click Translate and keep the page open until it finishes
Bulk translation only fills empty translations - existing translations are never overwritten, including ones a teammate fills in while it runs. The server translates and saves up to 100 keys per request, applying the project’s AI settings and key descriptions. When it’s done you’ll see how many translations were saved and how many DeepL couldn’t translate (those stay empty for a person to fill in).
Tip
Start with a small batch (10-20 keys) to check translation quality before translating a whole project.
Reviewing AI Translations
How review state is set
| How the text got there | Review state |
|---|---|
AI translation (Suggest, Translate missing, langctl translate, the API’s translate endpoints) | Needs review until someone approves it or edits it |
| Typed or edited by a person in the dashboard | Reviewed |
Pushed with langctl push, imported from a file, or set through the API | Reviewed (it’s your own text) |
langctl remembers the exact text the AI produced. As soon as the stored text differs from it - edited in the dashboard, pushed from the CLI, imported - it counts as human text and no longer needs review. Approving keeps the AI text and marks it reviewed.
Every AI translation starts as needing review:
- It shows an AI · review badge in the translations list
- It’s left out of exports and
langctl pull- your app falls back to the default language for that string until it’s reviewed - A notice on the Translations page shows how many AI translations need review, with Show them (applies the Needs review filter) and Approve all
- The Languages page shows how many translations each language has waiting for review
To review:
- Filter by Needs review
- Open a key and read each AI translation
- Edit it if needed - editing a translation counts as reviewing it
- Or click Approve next to the language to accept it as is
To approve many at once, select keys and click Approve AI in the bulk bar, or use Approve all in the notice.
Always Review
AI translations are a starting point, not a final product. Pay particular attention to:
- Marketing copy
- Legal text
- Brand names and product terminology (add them to Do not translate or the glossary)
- Tone and formality (e.g. tú/usted, tu/vous)
Review state is separate from publishing: a key still needs to be published to be exported, and its AI translations need to be approved (or edited) as well.
If you need unreviewed AI translations in a file anyway - for testing, say - the Export page can include them.
Usage and Quota
Checking Your Quota
- Plan & Billing - AI translations used this month and when the allowance resets
- Settings - AI translations this month
- The Translate missing dialog - what’s left before you start
What Counts as a Translation?
Each key translated into one language counts as one AI translation:
Translating 1 key to 3 languages = 3 translations
Translating 10 keys to 2 languages = 20 translations
Each plan also includes a monthly character allowance sized for typical UI strings (roughly 100 characters per translation), so translating very long texts can use it up sooner.
When You Run Out
When the monthly allowance is used up:
- AI translation is unavailable until it resets; everything else (editing, publishing, pulling, exporting) keeps working
- The allowance resets at the start of each calendar month, independent of when you signed up
- Unused translations don’t roll over
- See Plan & Billing for plans with a higher allowance
Best Practices
Prepare Your Source Content
Write clear source translations:
✅ "Enter your email address to continue"
❌ "Email here pls"
Use consistent terminology:
✅ Always use "user" (not switching between user/member/person)
Module-by-Module Translation
Translate one module at a time:
- Filter by module, then click Translate missing
- Review and approve before moving on
- Small batches are easier to review and keep related keys consistent
Quality Check Process
- Translate: Use AI for initial translations
- Review: Check AI output for accuracy, then edit or approve it
- Publish: Mark keys as ready for production
- Test: Pull the translations and check them in your app
Language-Specific Considerations
Right-to-Left Languages
Arabic and Hebrew require special attention:
- Check text direction in your app
- Test UI layout with RTL text
- Review punctuation placement
Chinese and Japanese
- Simplified vs Traditional Chinese
- Text length differs from English
- Font and rendering considerations
European Languages
- Formal vs informal (tu/vous, tú/usted) - set the Tone per language in Project settings
- Gender agreement
- Regional variations (es-ES vs es-MX)
Tip
Consider having native speakers review AI translations for important content, especially for your primary target markets.
Troubleshooting
AI Translation Failed or Unavailable
Common causes:
- Quota used up: Check Plan & Billing
- Empty source: The default-language translation of the key is empty
- Email not verified: Verify your email address first
- Unsupported language pair: DeepL doesn’t support every language; the error names the pair
- Viewer role: Viewers can’t use AI translation
Parameters Not Preserved
Source: "Welcome, {{username}}!"
AI Output: "¡Bienvenido, username!" ❌
Expected: "¡Bienvenido, {{username}}!" ✅ langctl protects placeholders (and do-not-translate terms) before sending text to DeepL, so this should be rare. If it happens, edit the translation to restore the placeholder and let us know at support@langctl.com.
From the CLI
Coming in CLI 0.4.0
langctl translate (fill missing translations with AI from the terminal), langctl review (list and approve AI translations) and langctl pull --include-unreviewed are part of CLI 0.4.0, which hasn’t been published to npm yet. With the current release (0.3.x), use the dashboard for AI translation and review; langctl pull already leaves out AI translations awaiting review.
Next Steps
- Translation Management - Learn more about managing translations
- Publishing Workflow - Understand draft vs published
- Export Translations - Export your translations
- Subscription & Usage - Plans and AI allowances