Nine languages without moving a single URL
Adding languages to a site that is already indexed is mostly a routing problem wearing a translation costume. The translation is work, but it is predictable work. What breaks a site is moving its URLs.
The default is to move them
The tidy way to build a multilingual site is to put every language behind a
prefix: /en/services, /ja/services, /de/services. The routing is
symmetrical, there are no special cases, and every page is reached the same way.
It also means hotorize.com/services — an address that exists, is indexed, and
sits in whatever emails and decks have gone out — becomes a redirect. Redirects
are not free. Every link pointing at the old address now costs an extra round
trip, and the crawler has to be told, page by page, that the thing it knew about
has moved.
So we did not do that. English keeps its bare URLs. hotorize.com/services is
still hotorize.com/services, serving the same page it served last week.
What that costs
One special case, in one file. Requests without a language prefix are rewritten
internally to the English route — the address bar never changes — and requests
that do carry the default prefix are redirected back out, so /en/services
answers with a permanent redirect to /services.
That second rule matters more than it looks. Without it, every English page exists at two addresses, and the canonical tag spends the rest of its life arguing with the crawler about which one counts.
Translation is the easy half
Every string a visitor reads moved out of the components and into one dictionary
per language. English is the schema: the other eight are type-checked against
it, so a missing key fails the build rather than rendering undefined on a live
page in a language nobody on the team reads.
That last part is the whole reason to do it this way. A missing translation on a site you can read is embarrassing. A missing translation on a site you cannot read is invisible until a customer finds it.
What we did not automate
There is no automatic redirect based on browser language. A visitor whose browser is set to Japanese gets a bar offering the Japanese version, and nothing happens until they click it.
Automatic redirection sounds helpful and behaves badly. Googlebot always sends
Accept-Language: en, so it would see a different page than a Japanese reader
gets from the same URL — and a link shared between two people would resolve to
two different pages depending on who opened it.
The part that has no technical answer
Eight of the nine languages have a proofreader lined up or do not need one. Te Reo Māori has neither, and machine translation into it is noticeably weaker than into the others — weak enough that in New Zealand, using it badly is worse than not using it.
That is not a problem the build solves. It is a problem you solve by finding a speaker, or by not shipping the language. Knowing which of those you are doing is the part that matters.