* Initial plan * Initial analysis: understanding locale system issues Co-authored-by: denshooter <44590296+denshooter@users.noreply.github.com> * Fix translation types to match actual component usage Co-authored-by: denshooter <44590296+denshooter@users.noreply.github.com> * Add comprehensive locale system documentation and fix API route types Co-authored-by: denshooter <44590296+denshooter@users.noreply.github.com> * Address code review feedback: improve readability and translate comments to English Co-authored-by: denshooter <44590296+denshooter@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: denshooter <44590296+denshooter@users.noreply.github.com>
4.8 KiB
Locale System Improvements - Summary
Problem Statement (Original)
The locale stuff is not really working please fix this and bring more structure to it i think there are to many field it dont know how exists. Then i have the question on how i can design stuff then when i use directus as a cms. because some words i maybe want to be writting thicker or so.
Issues Identified
- Confusing translation system - Mix of Directus API + JSON fallbacks with unclear flow
- Too many fields - Translation loaders had many keys that don't actually exist or aren't used
- Type mismatches - TypeScript interfaces didn't match actual component usage
- Missing documentation - No clear guide on how the locale system works
- No rich text support guidance - No documentation on how to style text (bold, italic, etc.) in Directus
Changes Made
1. Fixed Translation Types (types/translations.ts)
Before: Types had many unused fields and wrong structure
AboutTranslationshad fakeinterestsstructure that was never usedHeroTranslationshad fields likegreeting,name,rolethat don't existFooterTranslationshad nestedlinksstructure and wrong keysContactTranslationswas missing many form validation error keys
After: All types now match actual component usage
- Removed all unused/fake fields
- Added all missing fields that components actually use
- Flattened overly-nested structures
- Types now provide accurate autocomplete and type checking
2. Fixed Translation Loaders (lib/translations-loader.ts)
Before:
- Loaders tried to fetch non-existent keys
- Had confusing comments like "Diese Keys sind NICHT korrekt"
- Mapped keys to wrong structure (e.g., hobbies mapped to interests)
After:
- All loaders now fetch only keys that exist in JSON files
- Removed misleading comments
- Correct mapping from keys to return structure
- Clear, straightforward code
3. Fixed API Routes
- Updated
app/api/i18n/[namespace]/route.tsfor Next.js 15 async params - Fixed
app/api/projects/[id]/translation/route.tsPrisma null handling
4. Added Comprehensive Documentation
Created docs/LOCALE_SYSTEM.md with:
- Complete architecture explanation
- All translation structures with TypeScript types
- How to use translations in server/client components
- Rich text content guide - How to format text in Directus CMS
- Adding new translations workflow
- Fallback behavior explanation
- Best practices
- Troubleshooting guide
5. Clarified Directus Integration
Updated DIRECTUS_MIGRATION.md:
- Made it clear that Directus is optional
- Emphasized JSON files work perfectly without CMS
- Removed confusing sections
- Added "what was fixed" section
- Better troubleshooting
6. Updated Main README
Added link to locale system documentation for easy discovery.
How to Use (For Developers)
Static Translations (Most Common)
All translations are in messages/en.json and messages/de.json. Components use:
const t = useTranslations('home.hero');
return <h1>{t('title')}</h1>;
Rich Text Content (For Styling)
For content that needs bold, italic, lists, etc.:
- In component:
const [cmsDoc, setCmsDoc] = useState<JSONContent | null>(null);
useEffect(() => {
fetch(`/api/content/page?key=home-hero&locale=${locale}`)
.then(res => res.json())
.then(data => setCmsDoc(data?.content?.content));
}, [locale]);
return cmsDoc ? <RichTextClient doc={cmsDoc} /> : <p>{t('fallback')}</p>;
- In Directus CMS, use the rich text editor to format text
Adding New Translations
- Add to both
messages/en.jsonandmessages/de.json - Update types in
types/translations.tsif needed - Add loader in
lib/translations-loader.tsif needed - Use in components with
useTranslations()
Testing
- ✅ Application builds successfully
- ✅ All unit tests pass (11 test suites, 17 tests)
- ✅ TypeScript types are correct
- ✅ No more confusing "NICHT korrekt" comments
- ✅ All translation keys align with JSON files
Benefits
- Clear structure - Developers now know exactly which translations exist
- Type safety - TypeScript autocomplete works correctly
- Documentation - Complete guide on how everything works
- Rich text support - Clear instructions on how to style text in CMS
- Maintainability - No more guessing which fields are real vs fake
- Flexibility - Works perfectly without Directus, can add it later if needed
Migration Guide for Existing Code
No breaking changes! All existing code continues to work because:
- We only removed unused types/keys
- We fixed types to match what was already being used
- All JSON files remain unchanged
- All component usage remains the same
The changes are purely organizational and documentation improvements.