The request usually arrives as can we add English? — as though the site is a document and English is a second copy of it. Then the work starts and the second copy turns out to touch the URLs, the routing, the emails, the invoices and the search results.
The URL is part of the translation
A page about web development lives at one address in English and a different one in Indonesian, because a URL that reads naturally in one language reads like a mistake in the other. That means every route exists twice, with its own slug, and every link in the site has to be generated for the language being browsed rather than written by hand.
Two things follow, and both are easy to get wrong. A language switcher must land on the translated version of the page you are on — not the home page, which is what happens when the switcher only knows how to swap a prefix. And each page has to declare its counterpart so a search engine understands the two as one document in two languages rather than as competitors.
Half-translated is worse than missing
Content arrives at different times. A post exists in Indonesian for a week before the English version is ready. The tempting behaviour is to fall back: show the Indonesian text on the English site.
We do not, and the reason is that a fallback teaches the reader that the English site is unreliable. It is better for the post to be absent from the English list entirely until it exists — and absent from the English sitemap too, so nobody is sent to a page that will not be in their language.
That rule costs nothing in code and it removes an entire class of embarrassment.
The parts nobody lists
The site is the visible half. The other half is everything the site sends.
An order confirmation, a password reset, an invoice PDF, a reminder that a domain is expiring. Each of those has a recipient with a language preference, and that preference has to travel all the way to the template — including into queued jobs, which run later, in a process that has no idea who was browsing when the request was made.
That is the part that gets missed, and it is the part customers notice, because an email in the wrong language arrives in their inbox with their name on it.