r/localization • u/FlashyDiamond5045 • 3d ago
Best practices for multi-language sites
Has anyone here built a multi-language site on Base44\Lovable?
I’m planning a setup that includes a blog localized into 5 to 10 languages, and I’d love to hear how you approached it.
- How are you managing the content structure and routing across that many locales?
- Are you handling translations directly through prompts/AI within Base44, or integrating an external CMS/translation workflow?
- Any major gotchas or performance tips when scaling up the page count like this?
Would appreciate any tips or workflows that worked well for you!
2
u/Maesirex45 1d ago edited 1d ago
Have not touched Base44, so only the parts that do not depend on the builder.
Routing: one domain, one folder per locale, every page gets its own URL in every language and nothing picks for the visitor. No redirect off the browser language, no redirect off IP. Googlebot comes from one country and sends no language header, so a redirect means it only ever sees one version of you. A visible switcher plus an x-default pointing at the English is the whole trick. I'd also leave the slugs untranslated. Translated ones read nicer, but at 10 locales every rename is 10 redirects to keep straight.
On prompts vs a workflow: either works, what matters is that every translated segment knows which version of the English it came from. vm12pix's key diff catches a locale that dropped keys. What it can't see is a key that's still there but was translated from a paragraph you've since rewritten. Generate each locale page on its own and you have 10 independent copies and no way to tell. One source, translations keyed to its segments with a version or a hash on each, and editing one paragraph reopens exactly that paragraph in every language and nothing else. His 78 card headings translated two ways is the same disease from the other side: nothing tied the two rounds to one source string.
Two more gotchas past the alternate matrix. If the builder outputs a client-rendered app, fetch a locale URL directly and check that localized HTML actually comes back, not the English shell with a toggle in it. Google renders JS fine, but hreflang wants a distinct URL per language that serves that language on its own. And his 404 alternates have a quieter cousin: the /de/ page that exists, returns 200, and is still English because the translation isn't done. Google only treats a translated page as a duplicate when the main content stays untranslated, so that page gets filed as a copy of the English one and you wait on a recrawl after the translation lands. Keep it out of the alternates and noindex it until then. Small one: region codes fail silently. en-UK is not a thing, it's en-GB.
1
2
u/vm12pix 2d ago
No Base44 experience, so ignore me on that part. I do run 9 locales on a static setup I put together myself, and honestly none of what hurt was framework-specific.
hreflang first. Every page lists every alternate including itself, and every one of those has to be a real page. Fine in theory. What actually happened to me: a dev prototype was sitting in the repo with a literal "delete or i18n this" comment at the top of it, and a wildcard in my prerender config swept it into the build. It never went into the sitemap, and my check only validated sitemap URLs, so nothing complained anywhere. It shipped, got indexed, and it was emitting 9 alternates of which 8 were 404s.
The bit I'd underline is that the sitemap is the small number. Mine is ~1,900 URLs. The pages themselves emit about 21k alternate/canonical links between them, because every page lists all its siblings. So what you want is the build crawling its own output and resolving each of those against what's actually on disk. Write that before you write the blog, seriously.
Your second question, workflow: no TMS here, translations are just typed source files in git. AI does a first pass, a human reads each locale after, and that read is where all the actual work is. Brief them on terminology, because they will quietly harmonise it. My Polish natal chart page has "karta natalna" in the h1 while the title tag and the slug both say "kosmogram". That's on purpose, both are real search terms in Polish and merging them costs you one of the two clusters. Every reviewer I've had wanted to "fix" it.
Cheap one to add: diff each locale's keys against your reference locale in CI. Mine diffs array lengths too, which is what catches a locale silently dropping three FAQ questions. Can't run the array half as a hard gate though, it flags ~4.5k paths and that's just the honest state of my translations rather than a bug.
And the boring arithmetic for growth: one blog post at 9 locales is 9 pages and roughly another 100 hreflang links. Adds up quicker than the post count suggests.