一键导入
i18n-glossary-sync
// Maintain a canonical i18n glossary file — sync new terms across all language pairs, detect drift, flag missing translations, and enforce consistent terminology across the codebase.
// Maintain a canonical i18n glossary file — sync new terms across all language pairs, detect drift, flag missing translations, and enforce consistent terminology across the codebase.
| type | skill |
| id | i18n-glossary-sync |
| name | i18n-glossary-sync |
| description | Maintain a canonical i18n glossary file — sync new terms across all language pairs, detect drift, flag missing translations, and enforce consistent terminology across the codebase. |
| layer | cross |
| category | analysis |
| created_at | "2026-03-02T00:00:00.000Z" |
| updated_at | "2026-03-02T00:00:00.000Z" |
Ensure all domain-specific terms used in i18n translations are documented in the glossary and applied consistently across all languages. Prevents terminology drift and simplifies future language additions.
Usage context: Post-extraction, post-translation, and ongoing (every release). Keeps glossary in sync with actual usage.
{
"locales_path": "locales/",
"glossary_path": "domains/i18n/glossary.md",
"languages": ["en", "fr", "de", "es"],
"domain_terms": [
"lead", "prospect", "expert", "milestone", "direct link",
"spending limit", "flag", "qualification rate", "trust score"
],
"analysis_mode": "comprehensive", // or "quick" (just check coverage)
"output_format": "json"
}
{
"glossary_summary": {
"status": "NEEDS_UPDATE", // UP_TO_DATE, NEEDS_UPDATE, CRITICAL_GAPS
"glossary_terms": 28,
"translations_found": 26,
"missing_translations": 2,
"inconsistent_usage": 5,
"new_terms_discovered": 3,
"deprecated_terms": 1,
"last_updated": "2026-03-01"
},
"term_analysis": [
{
"term": "lead",
"status": "INCONSISTENT",
"glossary": {
"en": "lead",
"fr": "prospect",
"de": "Lead",
"es": "prospecto"
},
"actual_usage": {
"en": {
"usage_count": 12,
"variants": ["lead", "leads"],
"consistent": true
},
"fr": {
"usage_count": 11,
"variants": ["prospect", "prospects", "Leads"], // ❌ "Leads" is variant
"consistent": false,
"inconsistent_instances": [
{
"key": "dashboard.leads.header",
"text": "Mes Leads",
"should_be": "Mes prospects",
"file": "locales/fr/dashboard.json",
"line": 15
}
]
},
"de": {
"usage_count": 8,
"variants": ["Lead", "Leads"],
"consistent": true
},
"es": {
"usage_count": 9,
"variants": ["prospecto", "prospectos"],
"consistent": true
}
},
"recommendations": [
"Fix FR usage: change 'Leads' to 'prospect' in dashboard.leads.header",
"Update glossary note: explain EN 'lead' vs FR 'prospect' distinction"
]
},
{
"term": "milestone",
"status": "COMPLETE",
"glossary": {
"en": "milestone",
"fr": "jalon",
"de": "Meilenstein",
"es": "hito"
},
"actual_usage": {
"en": { "usage_count": 24, "variants": ["milestone", "milestones"], "consistent": true },
"fr": { "usage_count": 24, "variants": ["jalon", "jalons"], "consistent": true },
"de": { "usage_count": 24, "variants": ["Meilenstein", "Meilensteine"], "consistent": true },
"es": { "usage_count": 24, "variants": ["hito", "hitos"], "consistent": true }
},
"recommendations": []
},
{
"term": "qualification_rate",
"status": "MISSING_TRANSLATION",
"glossary": {
"en": "qualification rate",
"fr": null, // ❌ missing
"de": null, // ❌ missing
"es": null // ❌ missing
},
"actual_usage": {
"en": { "usage_count": 5, "variants": ["qualification rate", "qualification_rate"], "consistent": true },
"fr": { "usage_count": 4, "variants": ["taux de qualification"], "consistent": true },
"de": { "usage_count": 4, "variants": ["Qualifizierungsquote"], "consistent": true },
"es": { "usage_count": 4, "variants": ["tasa de calificación"], "consistent": true }
},
"recommendations": [
"Add FR translation to glossary: 'taux de qualification'",
"Add DE translation to glossary: 'Qualifizierungsquote'",
"Add ES translation to glossary: 'tasa de calificación'"
]
}
],
"discovered_terms": [
{
"term": "free mode",
"languages": {
"en": "free mode",
"fr": "mode gratuit",
"de": "kostenloser Modus",
"es": "modo gratuito"
},
"usage_count": 3,
"recommendation": "Add to glossary (new term in E01S01 direct link pricing)"
},
{
"term": "spending limit",
"languages": {
"en": "spending limit",
"fr": "limite de dépenses",
"de": "Ausgabenlimit",
"es": "límite de gasto"
},
"usage_count": 8,
"recommendation": "Already in glossary, but verify ES variant ('límite de gasto' vs 'límite de gastos')"
}
],
"deprecated_terms": [
{
"term": "matchable",
"glossary_status": "active",
"usage_count": 0,
"recommendation": "Remove from glossary — replaced by 'profil visible' (E01S02 milestone rename)"
}
],
"pluralization_analysis": {
"status": "NEEDS_REVIEW",
"note": "Plural forms detected but not formally managed. Consider i18next-plural extension for full support.",
"examples": [
{
"term": "lead/leads",
"en_variants": ["lead", "leads"],
"fr_variants": ["prospect", "prospects"],
"current_handling": "Both forms in translation strings (manual)",
"recommended": "Use i18next pluralization plugin (lead_singular, lead_plural)"
}
]
},
"statistics": {
"glossary_coverage": "92.8%", // terms in glossary / discovered terms
"translation_coverage": {
"fr": "100%",
"de": "92.8%",
"es": "96.4%"
},
"consistency_score": {
"en": "100%",
"fr": "88%",
"de": "95%",
"es": "98%"
},
"missing_glossary_entries": 2,
"inconsistent_term_usage": 5,
"deprecated_terms": 1
},
"glossary_update_proposal": {
"add_terms": [
{
"term": "free mode",
"translations": {
"en": "free mode",
"fr": "mode gratuit",
"de": "kostenloser Modus",
"es": "modo gratuito"
},
"context": "Direct link feature (E01S01) — when spending limit exceeded",
"source": "auto-discovered from locales/*/dashboard.json"
}
],
"update_terms": [
{
"term": "qualification rate",
"action": "add missing translations",
"add": {
"fr": "taux de qualification",
"de": "Qualifizierungsquote",
"es": "tasa de calificación"
}
}
],
"remove_terms": [
{
"term": "matchable",
"reason": "Replaced by 'profil visible' (milestone rename E01S02)",
"deprecation_date": "2026-03-02"
}
]
},
"recommendations": [
"Update glossary with 'free mode' (new term from E01S01)",
"Fix FR inconsistency: change 'Mes Leads' → 'Mes prospects' in dashboard.leads.header",
"Complete glossary translations for 'qualification_rate' (FR, DE, ES already used, just not in glossary)",
"Consider using i18next pluralization plugin for robust lead/leads handling",
"Review ES variant: 'límite de gasto' vs 'límite de gastos' (use consistently)",
"Remove deprecated term 'matchable' from glossary (replaced by 'profil visible')"
]
}
Glossary is the canonical reference. All translations should match glossary definitions.
glossary.md:
"lead": { "en": "lead", "fr": "prospect", "de": "Lead" }
locales/fr/dashboard.json should use "prospect", not "Leads" or "client"
Different languages handle pluralization differently. Options:
Option A: Manual (current MVP approach)
{
"leads.singular": "1 lead",
"leads.plural": "{count} leads"
}
Option B: i18next-plural (recommended post-MVP)
{
"lead_one": "1 lead",
"lead_other": "{count} leads"
}
Glossary should document chosen approach.
Some terms have multiple forms (singular/plural, capitalized/lowercase). Glossary should document ALL accepted variants.
Term: "lead"
Variants:
- "lead" (singular)
- "leads" (plural)
- "Lead" (capitalized, rare)
Status: All variants acceptable if consistent per context
When renaming terms (e.g., milestone rename E01S02):
1. Add new term to glossary ("profil visible")
2. Mark old term as deprecated ("matchable")
3. Update all usage in translations (batch replace)
4. Keep deprecated entry for 1 release (document why)
5. Remove deprecated entry in next major version
Canonical format (Markdown with YAML table):
# {YourProject} i18n Glossary
## Domain Terms
| Term | EN | FR | DE | ES | Context | Notes | Variants |
|---|---|---|---|---|---|---|---|
| dashboard | dashboard | tableau de bord | Dashboard | panel | Navigation | Main overview screen | dashboard, dashboards |
| workspace | workspace | espace de travail | Arbeitsbereich | espacio de trabajo | Multi-tenant | Container for projects/users | workspace, workspaces |
| plan | plan | forfait | Tarif | plan | Billing | Subscription tier name | plan, plans |
## Deprecation Log
| Deprecated | Replaced By | Deprecation Date | Removal Date |
|---|---|---|---|
| matchable | profil visible | 2026-03-02 | 2026-06-02 |
i18n-extract skillidiomatic-translate skill (check glossary reference)i18n-validate skilli18n-glossary-sync skill (this one)This skill is audit + proposal only. Delivery Agent must:
domains/i18n/glossary.md (or use glossary editor UI post-MVP)Post-MVP: Consider UI editor for glossary management (no-code glossary updates).
Identify and formalize durable product and technical decisions from agent outputs into long-term memory. Activate after Discovery produces artefacts, Delivery resolves trade-offs, or product direction materially changes.
Compact verbose memory index / registry files to pointer-only form. Activate when an index file (index.md, index-decisions.md, or any sibling registry table) breaches the file-size budget OR shows substance-duplication drift. Distinct from memory-compact (which targets content categories) and memory-archive-superseded (which migrates superseded rows to archive).
Detect and heal index.md drift — finds memory files on disk not registered in index.md and registers them. Run when /gaai-status reports unregistered files, after batch memory operations, or as a post-delivery gate.
Takes surface scan results, optional LLM synthesis open-question entries, and optional tree-sitter AST signals to score project ambiguities (1-10). Outputs structured ambiguity_feed for smart-question-generator. Pure heuristic — no LLM calls. Designed for Stage 3.5 of the /gaai:bootstrap pipeline (between LLM synthesis and Q&A).
Construct the LLM synthesis prompt from project surface scan + optional tree-sitter context + optional Q&A answers. Call the LLM. Parse and validate the response into 6-8 structured memory entries with clarity tags and source traceability. Used as Stage 3 of the /gaai:bootstrap pipeline.
Write structured memory entries to the Cloud workspace via gaai_memory.store MCP tool with source='bootstrap'. Loops over entries from bootstrap-llm-synthesis, calls the tool per entry, collects success/fail counts. Used as Stage 5 of the /gaai:bootstrap pipeline (Cloud path only).