# 010123 Multi Language Translations

> Multi-language translations — per-entity translation tables, assembler pattern (fetch all, filter in-memory), cache invalidation, and slug per locale.

- Skill: `natuleadan/010123-multi-language-translations` (Agent Skill, multi-file: 9 files)
- Install (CLI): `npx skillmds@latest add natuleadan/010123-multi-language-translations`
- Raw SKILL.md: https://api.skillmd.com/api/skills/natuleadan/010123-multi-language-translations/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- License: MIT
- Author: natuleadan (https://skillmd.com/u/natuleadan)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/natuleadan/010123-multi-language-translations

---


# Multi-Language Translations

## When to use

When building applications that need to display content in multiple languages without hardcoding translations or using third-party services.

## References

| Topic | File |
|---|---|
| Per-entity translation tables | `references/translation-tables.md` |
| Assembler pattern (fetch all, filter in-memory) | `references/assembler-pattern.md` |
| Cache invalidation across languages | `references/cache-invalidation.md` |
| Slug resolution per locale | `references/slug-resolution.md` |
| Direction from language table | `references/language-direction.md` |

## Quick checklist

- [ ] `sys_languages`: code PK, name, direction (ltr/rtl), isActive, isDefault
- [ ] Per-entity `{entity}_translations` tables with `UNIQUE(entity_id, language_code)`
- [ ] `UNIQUE(slug, language_code)` for per-language URL trees
- [ ] Assembler: SQL JOIN all translations → in-memory `.find(lang)` → fallback to first
- [ ] Cache: single key per entity (all languages bundled), tag-based invalidation
- [ ] Slug resolution: `getTranslationSlug(entity, slug, fromLang, toLang)`
- [ ] Direction: `sys_languages.direction` → `<html dir>` → DirectionProvider
- [ ] FK protection: `ON DELETE RESTRICT` on language_code FK

