Adding a second language to a website is a structural change, not a translation job: a multilingual website structure needs a separate URL per language, hreflang declarations that point both ways, a sitemap that agrees with them, and a switcher that lands the reader on the page they were already reading. Translation is the last step and the cheapest one.
The common approach is to add a language switcher, run the content through a translator, and serve both versions from the same address. It works until you look at search results and find the English page ranking in Türkiye, the Turkish page nowhere, and the two cannibalising each other. Almost every decision that prevents that is made before a sentence is translated.
Every language needs its own URL
A search engine indexes URLs, not toggles. If both languages live at the same address and the content swaps on a cookie, a header or a script, only one version can be indexed — and you do not get to choose which. Whatever the crawler was served on its first visit is the version that exists.
Give each language its own path: the primary language at the root, the second under a prefix. This site is built that way, English at the root and Turkish under a tr prefix. A prefix is enough to make both versions indexable, which is why most projects stop there. It is not enough to make the URL useful to the person reading it.
Localised slugs are the part worth the extra work. A URL is a sentence the reader sees before clicking, and a Turkish path tells a Turkish reader what the page is, while an English slug under a Turkish prefix asks them to translate it first. A crawler does not read the words in a path for meaning; it follows the path it is given, so localised slugs cost it nothing. The only cost is a route table mapping one internal key to two public paths, which you need anyway to generate hreflang.
hreflang, and the reciprocity rule
hreflang tags tell search engines that two pages are the same content in different languages, so the right version reaches the right person. The rule people miss is that the relationship must be declared in both directions: if the English page points at the Turkish one, the Turkish one must point back, and each set must list itself as well.
A one-way hreflang declaration is ignored, and the reason is worth knowing. An hreflang tag is a claim about a page you may not control, and anyone can publish a tag announcing their page is the German version of yours. The claim is confirmed by fetching the page it points at and finding the return pointer; with no return pointer there is nothing to confirm, and the annotation is dropped rather than trusted. The same failure happens when the URLs are not canonical: a relative path, a URL that redirects, or a trailing slash the site does not serve.
x-default is the entry for visitors whose language matches none of the versions you publish. It is not a declaration of your main language; it is the fallback, and it should point at whatever a stranger with unfamiliar browser settings can use — the root-language version, or a page that lets them choose. Leave it out and search engines choose for you.
The switcher is part of the multilingual website structure
A language switcher has one job: take the reader to the counterpart of the page they are on. Sending everyone to the homepage instead is the most common defect in a bilingual site: a reader three levels into a services section is asked to find their way back in a language they were not reading a moment ago. The switcher is usually the only link between the two trees, so it is also how a crawler finds the second language.
What a switcher must not do is redirect automatically on IP address. A Turkish speaker travelling in Germany is handed the wrong language, a reader who deliberately typed the English URL is thrown back to Turkish, and a crawler requesting the English page from an address geolocated elsewhere never sees it. Offer the other language; honour the URL the visitor asked for.
When a page exists in one language only, the switcher has nothing to point at, and both honest options are small: link to the section index in the other language and label it as such, or hide the switcher. Do not declare an hreflang pair between a page and something that is not its counterpart, and do not machine-translate a page you have no intention of maintaining. A missing page is a gap; a wrong pairing is a claim that turns out to be false.
Metadata is content, not chrome
Titles, descriptions and structured data all need translating, and translating well — a title is the sentence deciding whether someone clicks. Copying the English description onto the Turkish page is a common shortcut and a visible one, since the description is what a reader sees before the writing.
The sitemap is not chrome either. An XML sitemap can declare the alternates itself: an entry for each URL listing every language version including its own, the same reciprocal set the head declares, delivered a second way that needs no rendering. The two have to agree; a head and a sitemap that disagree are two contradictory claims about one page. Generate both from the same route table rather than by hand.
A good admin panel earns its keep here. SEO fields that are per language and editable can be improved over time, one page at a time; fields generated from the translated body cannot be improved at all.
The details that only show up later
Dates, numbers and currencies format differently. Turkish uses a comma as the decimal separator; English does not. Form validation messages, error states, email notifications, the 404 page and the cookie banner all need translating too — these are the ones that get missed, because nobody reviews them during design.
Text length changes as well. Turkish runs longer than English in most sentences, and German longer still. A layout tested only in the shortest language will break in the others — usually in a navigation bar, a button, or a table header that had exactly enough room.
Plan for the third language
Adding a second language to a structure built for one is expensive. Adding a third to a structure built for two should be close to free, and there is a concrete test for whether it is: count the files you would have to touch. A route table and a dictionary means the structure holds. Templates, components and hand-written head tags mean the second language hid the problem instead of solving it.
None of this makes the second language rank. What it removes are the structural reasons it cannot: two of your pages competing for one query, an hreflang annotation nothing confirmed, a version a crawler never reached. The writing still has to be worth reading in the second language, and a translated page up against better native ones will lose on merit. The point of getting the structure right is that when you lose, the reason is the writing, not two of your own pages arguing with each other.