Skip to content

feat(i18n): add localization support for 13 languages#305

Merged
therealbrad merged 3 commits into
mainfrom
feat/multilingual-support
May 12, 2026
Merged

feat(i18n): add localization support for 13 languages#305
therealbrad merged 3 commits into
mainfrom
feat/multilingual-support

Conversation

@therealbrad
Copy link
Copy Markdown
Contributor

Description

Expands UI language support from 3 languages (English, Spanish, French) to 13, adding German, Italian, Dutch, Polish, Portuguese (Brazil), Vietnamese, Chinese Simplified, Chinese Traditional, Japanese, and Korean.

Introduces a single source of truth for supported locales so adding a new language in the future requires changes to exactly two files (i18n/navigation.ts and i18n/dateFnsLocales.ts) plus running pnpm generate:dev and pnpm crowdin:sync.

Key changes:

  • i18n/navigation.ts — canonical locale list and display names (endonym order, CJK at end)
  • i18n/dateFnsLocales.ts — date-fns locale map with coverage guard test
  • next.config.mjs converted to next.config.ts to import from TS source
  • schema.zmodel / prisma/schema.prisma — 10 new Locale enum values
  • crowdin.yml — all 12 non-English language mappings configured
  • lib/server-date-formatter.ts — locale-specific "at" word for datetime strings
  • components/onboarding/InitialPreferencesDialog.tsx — fixed: locale change now sets NEXT_LOCALE cookie and reloads so the language switch takes effect immediately
  • Fixed TestPlanIt brand name casing across all locale message files (was being mangled by machine translation)
  • Docs and blog post updated

Related Issue

N/A

Type of Change

  • Bug fix (non-breaking change that fixes an issue)
  • New feature (non-breaking change that adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to change)
  • Documentation update
  • Refactoring (no functional changes)
  • Performance improvement

How Has This Been Tested?

  • Unit tests — i18n/dateFnsLocales.test.ts includes a coverage guard that fails if a locale is added to navigation.ts without a date-fns mapping
  • Manual testing — switched between all 13 languages via Profile > Preferences; verified locale change in initial preferences dialog takes effect on reload

Test Configuration:

  • OS: macOS
  • Browser: Chrome
  • Node version: 24

Checklist

  • My code follows the project's style guidelines
  • I have performed a self-review of my code
  • I have commented my code, particularly in hard-to-understand areas
  • I have made corresponding changes to the documentation
  • My changes generate no new warnings
  • I have added tests that prove my fix is effective or that my feature works
  • New and existing unit tests pass locally with my changes
  • Any dependent changes have been merged and published
  • I have signed the CLA (https://testplanit.com/cla)

Additional Notes

Translations are managed via Crowdin. The TestPlanIt brand name has been added to the Crowdin glossary as Do Not Translate to prevent machine translation from altering it in future syncs.

To add a new language in the future:

  1. Add the locale to i18n/navigation.ts (locale array + display name)
  2. Add the date-fns mapping to i18n/dateFnsLocales.ts
  3. Run pnpm generate:dev
  4. Add the language in Crowdin and run pnpm crowdin:sync

therealbrad and others added 2 commits May 12, 2026 13:13
Expands UI language support from 3 (en, es, fr) to 13 languages:
German, Italian, Dutch, Polish, Portuguese (Brazil), Vietnamese,
Chinese Simplified, Chinese Traditional, Japanese, and Korean — in
addition to the existing English, Spanish, and French.

Key changes:
- Single source of truth: locale list and display names live in
  i18n/navigation.ts; date-fns mappings live in i18n/dateFnsLocales.ts
- next.config.mjs converted to next.config.ts to import from TS sources
- Schema, Zod validation, and crowdin.yml updated for all 13 locales
- server-date-formatter updated with locale-specific "at" word map
- InitialPreferencesDialog now reloads with correct locale URL on save
- Fixed "TestPlanIt" brand name casing across all locale message files
- Docs and blog post updated to reflect full language list

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@therealbrad therealbrad changed the title feat: add localization support for 13 languages feat(i18n): add localization support for 13 languages May 12, 2026
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@therealbrad therealbrad merged commit b739945 into main May 12, 2026
5 checks passed
@therealbrad therealbrad deleted the feat/multilingual-support branch May 12, 2026 22:23
@therealbrad
Copy link
Copy Markdown
Contributor Author

🎉 This PR is included in version 0.27.0 🎉

The release is available on GitHub release

Your semantic-release bot 📦🚀

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant