This one surprised people when we shipped it. An email forwarding service with full internationalization isn't something you see often. Most providers are English-only, maybe with a Spanish or French translation that covers half the UI and falls back to English for the rest.
We went all in.
10 languages
English, Spanish, French, German, Italian, Hindi, Japanese, Portuguese (Brazilian), Chinese (Simplified), and Arabic.
Every surface is translated:
- All marketing pages (home, pricing, about, comparisons, blog index, changelog)
- The full dashboard (domain tree, tabs, settings, command palette, status messages)
- Email templates (verification, password reset, notifications, scheduled reports)
- Error messages and validation feedback
- The onboarding wizard
- The TOS acceptance screen
- The billing page
We're talking about 2,300+ translation keys per locale. Not a partial effort where the landing page is translated but the dashboard reverts to English the moment you log in.
Arabic and RTL
Arabic was the hardest to get right. It's not just translating strings. The entire layout needs to flip: navigation goes right-to-left, text alignment reverses, directional icons mirror, and CSS needs to account for the different reading direction.
We added dir="rtl" detection based on the active locale and wrote RTL-specific CSS overrides for the navigation, footer, sidebar, dropdowns, and form layouts. The marketing pages and the dashboard both respect the direction.
How it works technically
We use Laravel's __() translation function with JSON locale files. Each locale has a single JSON file mapping English keys to translated values. The SetLocale middleware reads the user's preference from their session cookie (set via the language switcher) or falls back to the Accept-Language header.
Marketing pages have locale-prefixed URLs for SEO: /es/pricing, /fr/about, /de/pricing, etc. Each localized URL gets proper hreflang tags and an x-default pointing to the English version. Canonical tags on localized pages point to the English URL to avoid duplicate content issues with search engines.
The language switcher
It's in the navigation bar on every page. Shows the current locale code (EN, ES, FR, etc.) with a globe icon. Click it, pick your language, the page reloads in that locale. Your preference is saved in a cookie so it persists across sessions.
What we learned
Some things that caught us off guard:
- Date formatting varies wildly. "April 19, 2026" in English becomes "19 avril 2026" in French and "2026年4月19日" in Japanese. Laravel's
translatedFormat()handles this but you have to use it consistently everywhere. - Number formatting matters too. "1,000.50" in English is "1.000,50" in German. Currency symbols go in different positions.
- Some translated strings are significantly longer than English, which breaks layouts that were designed for English string lengths. German is especially bad for this.
- RTL isn't just "flip everything." Some elements (like code blocks, URLs, and email addresses) should stay left-to-right even in an RTL context.
Why bother?
Email is global. If someone in Tokyo or Riyadh or Sao Paulo wants to manage their domain's email forwarding, they shouldn't have to do it in a language they're not comfortable with. The infrastructure doesn't care what language the UI is in, so there's no technical reason to limit it.
What languages are underserved in the email infrastructure space? Are there locales we should add? We're open to expanding if there's demand.