Translation Skill
Translate new entries in XLF translation files by finding
targets, locating source context, and proposing translations for review.
Workflow
Step 1: Find Changed Translation Files
Run these commands to find changed translation files:
bash
git diff --name-only | grep -E 'messages\.[a-z]{2}\.xlf$'
git diff --cached --name-only | grep -E 'messages\.[a-z]{2}\.xlf$'
Combine results and deduplicate. If no changed translation files found, inform the user.
Step 2: Extract New Translations
- Read the file content
- Parse to find all elements
- Filter for those containing
- Extract for each:
- attribute (translation ID)
- content (English text)
- content (current translation, may be empty or placeholder)
- Any placeholder elements ()
Step 3: Find Source Context
For each translation ID, search for its usage in the codebase:
TypeScript files (
strings):
bash
grep -r "@@{ID}:" --include="*.ts" apps/ libs/
HTML files (
attributes):
bash
grep -r "@@{ID}\"" --include="*.html" apps/ libs/
Read the surrounding code (5-10 lines) to understand context.
Step 4: Generate & Review Translations
For each
entry, present to the user:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Translation ID: {id}
File: {xlf_file_path}
Target Language: {language_name}
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Source (English):
{source_text}
Context:
{file_path}:{line_number}
{code_snippet}
Proposed Translation:
{proposed_translation}
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Wait for user confirmation before proceeding. Options:
- Accept the proposed translation
- Provide an alternative translation
- Skip this entry
Step 5: Apply Approved Translations
For approved translations, update the XLF file:
- Replace the element content with the approved translation
- Change to
Before:
xml
<trans-unit id="myTranslationId" datatype="html">
<source>English text</source>
<target state="new">Old or empty translation</target>
</trans-unit>
After:
xml
<trans-unit id="myTranslationId" datatype="html">
<source>English text</source>
<target state="ai">Translated text</target>
</trans-unit>
Language Detection
Identify the target language from the filename pattern:
| Filename Pattern | Language | Native Name |
|---|
| German | Deutsch |
| French | Francais |
| Spanish | Espanol |
| Hungarian | Magyar |
Placeholder Handling
Critical: Preserve all XML placeholder elements exactly as they appear in the source. These include:
| Element | Purpose | Example |
|---|
<x id="INTERPOLATION" equiv-text="{{...}}"/>
| Angular interpolations | |
<x id="INTERPOLATION_n"/>
| Multiple interpolations | Second, third interpolation |
<x id="PH" equiv-text="..."/>
| Named placeholders | ICU expressions |
| Multiple placeholders | Additional placeholders |
<x id="LINE_BREAK" ctype="lb"/>
| Line breaks | |
| Opening HTML tags | |
| Closing HTML tags | |
<x id="START_BOLD_TEXT"/>
| Bold text start | |
<x id="CLOSE_BOLD_TEXT"/>
| Bold text end | |
Example with placeholders:
xml
<source>Hello <x id="INTERPOLATION" equiv-text="{{name}}"/>, you have <x id="INTERPOLATION_1" equiv-text="{{count}}"/> messages.</source>
<target state="ai">Hallo <x id="INTERPOLATION" equiv-text="{{name}}"/>, Sie haben <x id="INTERPOLATION_1" equiv-text="{{count}}"/> Nachrichten.</target>
Translation Guidelines
- Match existing tone: Review other translations in the file to maintain consistent style
- Preserve placeholders: Copy placeholder elements exactly, only translate surrounding text
- Consider context: Use the code context to understand how the text is used
- Domain terminology: Use standard terms for:
- Mobility/transport: commute, emissions, CO2, modal split
- UI elements: buttons, labels, tooltips
- Business terms: audit, score, analysis
- Formal vs informal: German typically uses formal "Sie" form in business software
Common Translation Patterns
German (de)
- "Save" → "Speichern"
- "Cancel" → "Abbrechen"
- "Loading..." → "Wird geladen..."
- "Error" → "Fehler"
- "Success" → "Erfolgreich"
French (fr)
- "Save" → "Enregistrer"
- "Cancel" → "Annuler"
- "Loading..." → "Chargement..."
- "Error" → "Erreur"
- "Success" → "Succes"
Spanish (es)
- "Save" → "Guardar"
- "Cancel" → "Cancelar"
- "Loading..." → "Cargando..."
- "Error" → "Error"
- "Success" → "Exito"
Hungarian (hu)
- "Save" → "Mentes"
- "Cancel" → "Megse"
- "Loading..." → "Betoltes..."
- "Error" → "Hiba"
- "Success" → "Sikeres"
Batch Processing
When multiple entries need translation:
- Group by file for efficiency
- Show a summary of how many entries need translation per file
- Process entries one at a time, waiting for approval
- After all entries are reviewed, show summary of changes made
Error Handling
- If no changed translation files found: Inform user and suggest running
- If no entries found: Inform user that all translations are up to date
- If context not found: Still propose translation based on source text alone, note missing context
- If file parse error: Report the error and skip the problematic file