When to Trust Machine Translation and When to Pay a Human
Machine translation is good enough for most interface strings and reliably wrong on the ones that matter most. Here's a decision rule by content type, and the failure modes to review for.
17 articles tagged “i18n”
Machine translation is good enough for most interface strings and reliably wrong on the ones that matter most. Here's a decision rule by content type, and the failure modes to review for.
artisan optimize caches config, routes, events and views — not translations. Here's what the translator does on every request, why that's usually fine, and when it isn't.
A database-backed admin UI over your lang files solves the non-developer problem and creates three new ones. Here's the honest accounting before you install one.
Three locales compete in a multi-tenant app: the tenant's default, the user's preference, and the request. Get the precedence wrong and you leak one tenant's language — or their custom copy — to another.
Most localization bugs are silent — missing keys fall back, plural forms degrade quietly, queue jobs leak locale. Here are the Pest tests that turn those into build failures.
Translating your app doesn't make it findable in other languages. Cookie-based locale switching is invisible to Google — here's the URL structure, hreflang and sitemap work that makes translations rank.
1,234.50 or 1.234,50? €1,234.50 or 1.234,50 €? Laravel's Number class knows. Here's what it gets right, why you should store money as integers, and the currency-vs-locale distinction people conflate.
Your app is in Spanish, the confirmation email arrives in English. The locale doesn't survive the queue — here's the fix, plus the subject line and worker leakage nobody catches.
PHP files load one group at a time; a JSON file loads entirely on the first lookup. Nested JSON silently doesn't work. Here's what actually differs, verified against the framework.
You don't need a separate RTL stylesheet. Tailwind's logical properties plus one dir attribute handle most of it — here's what they cover, and the parts you still have to think about.
Sessions don't exist, so the locale has to come from the request. Here's how Accept-Language negotiation actually behaves in Laravel, the fallback that silently misfires, and how to keep API responses cacheable.
__() works the same inside Livewire — until the second request. Here's why locale resets on every update, which middleware actually runs, and how to keep validation and JS text translated.
These three aren't competitors — they solve different problems. Here's the line between interface text and database content, and why picking wrong is expensive to undo.
format() never localizes. translatedFormat() translates the words but keeps your ordering. isoFormat() is the one you usually want. Here's the difference, with real output in five languages.
Validation messages are the largest block of user-facing text most Laravel apps never translate. Here's the full structure — custom, attributes, nested rule types — and how to stop it drifting out of date.
Laravel's plural rules aren't CLDR — they're derived from Zend Framework code. Here's what that means for your lang files, why Polish and hyphenated locales silently break, and how to write forms that survive every language.
Stop searching manually for hardcoded strings in Laravel. The Code Scanner finds them automatically, suggests translation keys, and updates your code.
We'd like to use analytics and marketing cookies to understand how the site is used. They stay off unless you accept them. Cookie Policy
Essential
Required for the site to work
Google Analytics, to see which pages help
Measuring and personalising ads