• Websites · Next.js i18n-routing

Multilingual site with correct hreflang

The development of a multilingual site is an address scheme, separate content for each language and a technical declaration of languages ​​that is read by search. We make the second and third versions so that each page has its own address, its own meta tags, its own hreflang and gets into the site map along with all the others. Term — 12–30 working days; the time of the translation itself is not included here, it goes parallel on the side of your translator. There is no price on the page on purpose: the volume of the text and the state of the existing site are first measured by an audit.

See how it works
Price
after a free audit
Guarantee
30 days after project sign-off
Language versions in the measured underwear store
the three working branches are root ru, /ua/, and /pl/, all returning HTTP 200s
after a free audit
Price
30
Guarantee

days after project sign-off

the three working branches are root ru, /ua/, and /pl/, all returning HTTP 200s
Language versions in the measured underwear store
hreflang is set twice by two different mechanisms, the sets contradict each other
What is broken there
lang="ua" instead of uk, and in Polish - lang="code": the variable did not fit into the template
The language codes are there
three bg/en/ru versions, first response 512.6 ms at 220.4 KB HTML
Brand website for the EU market
hreflang uk-ua / ru-ua / x-default are correct, 1,992 addresses in the site map without duplicates
Bilingual B2B catalog of spare parts
12–30
Term of works

working days, without time for the translation itself

free audit of language versions, 2-4 working days
Before the estimate
Process steps

Transparent stages with approval at every step

Total duration:12–30 days

  1. Analysis of language versions and decisions by language

    2-4 working days

    We capture what the site actually provides: language codes, hreflang, canonical, site map composition. We record the list of languages ​​and markets under them, as well as which version the visitor who entered without a choice sees.

  2. Address scheme and redirect plan

    2-3 working days

    Choose a prefix, subdomain or domain and justify your choice in writing. The "old address → new" table is compiled here, which then becomes a 301-redirect plan.

  3. Language routing in the engine

    3-6 working days

    We are deploying language branches, a switch with a transition to the same page, service pages and forms in each language. On Next.js, this is i18n-routing, on WordPress - WPML, on OpenCart - regular multilingualism.

  4. Files for translation and filling of the finished product

    2-8 working days

    We give the text in structured files with separate fields under title and description, accept the translation back and upload it. The spread in days is large precisely because of the volume of the text, and not because of the number of languages.

  5. hreflang, canonical, meta tags, sitemap

    2-5 working days

    We set mutual hreflang with x-default, self-referencing canonical, check that each branch is present in the sitemap, and add the Sitemap directive to robots.txt.

  6. Verification in every language, analytics, transmission

    1-4 working days

    We go through the forms and service scripts in each language, look at the layout for long words, divide traffic by language in GA4, give instructions for setting up pages.

Technologies & integrations

What we build on and what it connects to

Stack

  • Next.js i18n-routing — language prefix and dictionaries out of the box; limitation: the new language is added by the release, the editor will not introduce it himself
  • React and TypeScript - typed translation keys catch a forgotten string on the build, not on the live site
  • WordPress + WPML — the editor handles languages ​​itself; limitations: the plugin is paid, and on a large site it noticeably loads the admin
  • Native OpenCart multilingualism — when a language version is added to an existing store without changing the engine
  • nginx and HTTP/2 — language redirect rules and certificates if markets diverge on subdomains
  • Cloudflare — language prefix-aware cache; limitation: wrong cache key gives one language instead of another

Integrations

  • Google Search Console — separate properties for language versions
  • GA4 with language separation
  • Google Tag Manager
  • WPML
  • Crowdin - translation file sharing
  • eSputnik — newsletters in languages
What's included

Complete list of work and what you get as a result

  • Language address scheme—prefix in path, subdomain, or separate domain—with written justification for choice
  • Language routing: the switch leads to the same page in a different language, instead of dumping to the main page
  • hreflang with x-default and self-referencing canonical in each version - search reads them as variants of the same page
  • Interface translation: menus, buttons, field captions, form errors, 404 and thank you pages
  • Separate title and description for each language — its own snippet instead of a copy of the original
  • All language branches in the sitemap plus the Sitemap directive in robots.txt
  • Number, date and currency formats for language and case in templates — without "3 products" instead of "3 products"
  • Migration of existing content with analysis of old addresses and 301-redirects one to one
  • GA4 with separation by language versions - you can see which language brings hits and which is empty
  • Transfer: instructions on how to start a page at once in all languages, a guarantee of 30 calendar days
When this service isn't right

What's not included — so there are no surprises at delivery

  • The translation of the texts itself — we prepare the files and accept the finished translation from your translator
  • Legal adaptation of conditions under the legislation of another country
  • We do not use machine translation as a substitute for human translation
  • Multicurrency and local payment methods are a separate scope of work
  • Promote language versions in search after launch
Who it's for

Situations where this service delivers results

Scenario 1 of 4

The second language has already been added, but there are no requests from it

The switch in the hat works, the pages open, and in GA4 the second language gives units of visits. The reason is usually technical: the version did not get into the sitemap, or canonical leads from it to the main language, or hreflang declares a pair that does not exist. It should be checked by measurements, not by eye - at a live store, we saw how 590 addresses of the site map led to one branch out of the two announced.

We'll review your situation in a free audit
A language prefix is ​​on its way against a single domain to market

How this option differs from the alternative

Domain weightaccumulates on one host, a new language does not start from scratch
How many places of administrationone codebase, one panel, one publication
hreflangis placed inside the project and checked with a single check
Local signal for the marketweaker: one domain and one zone
When to takethe same business speaks several languages

Free audit of language versions

Multilingualism breaks quietly: the pages exist, the switch works, and search only sees one branch. This is visible only by measurements, and we do them for free.

What we measure

  • What language versions are actually in the sitemapThe most frequent defect in our sample. On one site, all 590 unique map addresses led to only one language branch, although two were announced; on the other, not a single address of the second language got into the map.
  • Doesn't hreflang contradict itselfOn the measured store, hreflang was set up twice by two different mechanisms, and the sets contradicted each other: the link for the Ukrainian version provided content in another language.
  • Language codes and x-defaultWe check the validity of the codes. We encountered lang="ua" instead of uk and even lang="code" - the variable was not inserted into the template, and the page declared the language as a non-existent code.
  • Are the title and description really translated?Classic: the interface is translated, the language attribute is changed, and the title and description remain in the original language - two pages with the same meta tags, which the search engine reads as a duplicate.
  • Self-referencing canonical on each versionIf the canonical of all language versions leads to one, the remaining languages ​​are dropped from the index along with all their content.
  • The volume of the text to be translatedWe calculate the real volume in characters by type of pages - the deadline and the budget for the translation, which you do not pay us, depend on this.

What you get

  • Document with measurements: which languages ​​are declared, which are actually in the sitemap, where hreflang contradicts itself.
  • A list of pages where meta tags are not translated, with an explanation of the consequences.
  • The scheme of language addresses: according to what principle paths are built and what to do with old links.
  • Evaluation of the amount of text to be translated in characters by type of pages.

Timeline: 2-4 working days after receiving the site address

Why is it free

Because we don't know in advance whether it's a three-day setup or a three-week restructuring. Measurements give an answer in two to four days and remain with you.

What's next

After the audit, we give an estimate by stages. If it turns out that you only need to fix the hreflang and the sitemap, let's just say it's a few days of work.

Short form: your contact and site URL

Did not find your case?

Describe how it works on your side — we will tell you whether “Development of a multilingual site” fits and what it means in your situation. No brief and no call: one question, one answer.

  • Contract, act and 30-day warranty

    Every project gets a written contract: scope, deadlines, amount, acceptance procedure. After delivery — act and invoice, then 30 calendar days of warranty.

  • Sole proprietor & bank transfer

    The contractor is a registered sole proprietor. Payment by invoice with closing documents.

  • Rights & access — yours

    Code, design and materials transfer to you after full payment. Domain, hosting, repository and analytics are registered to you.

  • Client portal instead of email chains

    During the project you get access to a portal: contracts, invoices, acts and project status in one place.

  • European clients

    Among our work — projects for Norway, Bulgaria, Moldova and Spain.

  • Verifiable numbers

    Every case in the portfolio comes with a link to a live site and a technical measurement.

  • Audit first, then pricing

    There is no price list on the site intentionally: the scope of the same work differs multiples between clients.

  • We say "no" when unsure

    If the task isn't ours or the deadline is unrealistic — we tell you upfront.

What affects the price

Why two seemingly identical tasks are priced differently

  • The volume of the text, not the number of languagesTwo languages ​​on a website with twenty pages and two languages ​​on a product catalog with two hundred — different projects with the same number of languages. At the audit, we count marks by type of pages, and it is this number that moves the deadline more than anything else.
  • Status of the existing siteAdding language to a clean structure is one job. Untangling a site where language versions already contradict each other with two hreflang mechanisms is another: first we remove what is actually rendered, and only then change something.
  • Type of language addressesThe prefix in the path remains within the same project. A subdomain or separate domain adds handling of DNS, certificates, separate properties in Search Console, and hreflang linking between hosts.
  • Who translates and how quicklyFilling in the finished translation is a predictable stage. Waiting for the translation is not: if the files are with the translator for three weeks, the calendar term of the project is shifted by these three weeks, no matter how many days are in the plan.
  • Moving from old addressesIf the pages already have traffic, the analysis of old addresses and 301-redirects one-to-one is added to the work. Without it, the language version starts cleanly, and the old position is extinguished along with the references to it.
  • Languages ​​with long wordsGerman, Hungarian and Finnish give lines twice as long as Ukrainian. Buttons, tabs and menu items are checked in each language separately - this is a separate pass through the layout, which is immediately visible at the evaluation stage.
Cases

Tasks and results in numbers — all metrics measured by us

online retail underwear store with a catalog of over 110,000 items

Task
Keep the three language versions in a directory where each size and color is entered in a separate entry, and keep the pages indexable.
Solution
OpenCart 3 over HTTP/2 with gzip. Three language branches: root ru, /ua/ and /pl/. The site map is made with an index of 42 submaps. Self-referential canonical on each language version.
Result
Measurement 08/01/2026: Three branches return HTTP 200, canonical in place and self-referencing in each. The catalog of 115,456 items was confirmed by two methods — a standard search and a site map, with a discrepancy of 2.4%. Defects were found specifically in the language part: hreflang was set up twice by two different mechanisms, and the link for uk-ua gives Russian content; the Ukrainian version has lang="ua" instead of the valid uk, and the Polish version has lang="code" and dir="direction", that is, no variables have been inserted into the template.

a brand of natural cosmetics, a corporate website for the EU market

Task
Bring the brand to the European market in three languages ​​so that each version has its own content and is correctly announced to search engines.
Solution
Site on OpenCart 3 with three language versions bg/en/ru and hreflang. Local store layout: Store with opening hours, contact point and search function. Courier delivery across the country with a free threshold.
Result
Measure 07/31/2026: Three working language versions with hreflang, six JSON-LD types on the main — Store, WebSite, SearchAction, ContactPoint, EntryPoint, OpeningHoursSpecification. First server response 512.6 ms at 220.4 KB of HTML. Defects found: there is no analytics counter on the main page, and the sitemap and robots.txt return an empty body or HTML instead of XML - three language versions exist, but no one lists them for search.

B2B catalog of spare parts for industrial sewing machines

Task
Keep two language versions of the directory so that the search receives a complete list of addresses without duplicates.
Solution
Bilingual version with hreflang uk-ua / ru-ua and x-default. The site map is compiled into one complete map for the entire catalog.
Result
Measurement 07/31/2026: hreflang uk-ua / ru-ua / x-default are correct, the site map contains 1,992 addresses without any duplicates — 1,848 cards and 138 categories. First response 388.1 ms, full download 419.5 ms. Defect found: robots.txt does not contain a Sitemap directive, although the map itself is working and complete - the search has to find it randomly.
What we need from you

We can't start without this — best to prepare in advance

  1. List of languages ​​and markets for which they are made - English for the EU and English for the US are different texts.
  2. Who translates: your translator, an agency or a native speaker on your side.
  3. Available site with access if we add the language to the finished project.
  4. The decision of which language is the main one and what the visitor who entered without a choice sees.
  5. Local contacts, if the market needs its own phone number and address.
  6. One person who accepts translation for each language.

If something is missing — let us know, we'll help you gather it or do it as a separate task.

FAQ

Most frequently asked questions — with concrete answers

How to understand what is wrong with the language versions?

Look at the sitemap, not the switch. In the spice shop we measured, all 590 unique map addresses led exclusively to one language branch, although the markup declared two. At the store of garden equipment, only the Ukrainian-speaking branch was included in the map, and the Russian one, declared in hreflang, was not. The switch worked in both cases, and the owners were sure that everything was fine.

Prefix in path, subdomain or separate domain?

By default, the prefix in the path: one code base, one administrative panel, the weight of the domain is accumulated on one host. A subdomain makes sense when markets serve different teams with different content. A separate domain — when a local domain zone and a separate legal presence are critical for the market. Mixing approaches is not worth it: then hreflang has to be stitched manually between hosts.

Is it possible to do the translation automatically?

We don't do that. UI machine translation is still alive, commercial text machine translation is not: it produces grammatically correct sentences that don't sell anything, and in sensitive niches produces outright errors. We prepare text files, you give them to the translator, we upload the finished result and check the layout - long words in German and Hungarian break the buttons, and this should be seen before launch.

What is x-default and why is it?

This is an indication of which version to show a visitor whose language does not match any available. Without it, the search decides itself, and the decision is not always in your favor. In the measured B2B catalog of sewing spare parts, the pair uk-ua / ru-ua is supplemented with the correct x-default — there language versions were made deliberately. Where a second language has been added hastily, x-default is usually simply absent.

Do I need separate meta tags for each language?

Necessarily. The most common error we saw: the interface was translated, the language attribute of the page was changed, and the title and description remained in the original language. For search purposes, these are two pages with the same meta tags — that is, a duplicate, and one of them will fall out of the search results. Localization of meta tags is included in the work, and not in a separate line of the estimate.

How long does it take to add a language to an existing site?

12-30 working days depending on the volume and condition of the site. Parsing and address scheme 2-4 days, setting up language routing 3-6, preparing files for translation 2-3, filling the finished translation 3-8, checking hreflang, sitemaps and redirects 2-4, testing 2-3. Translation time is not included here: it is on the side of your translator and usually goes in parallel.

Will traffic drop after going multilingual?

Swelling for a few weeks is possible - this is a normal reaction to a change of addresses, and we will not promise that it will not happen. What reduces the risk: one-to-one 301-redirects from old addresses, preservation of title pages that already give traffic, and a full sitemap with all language branches immediately after launch. The error after which the traffic does not return is "all to main" redirects.

Can I launch one language now and add another later?

It is possible, and often cheaper. There is only one condition: we set the address scheme for several languages ​​at once, even if only one is working. Then the second language is added as a branch, not as an entire site move with redirects. If the first version lived at addresses without a language prefix, the appearance of a second language almost always means a change of addresses - and this is where the weeks of subsidence asked about above come from.

Who makes sure language versions don't diverge after launch?

The person is on your side, and it's fairer to say it right away. The language version multiplies the amount of content that needs to be maintained: every new page, every price change, and every edit in the description must be repeated in all languages. We put it in the interface - the page without translation is clearly marked in the admin, and the instructions describe how to start it in all languages ​​at once. But if no one accepts the translation, the versions will diverge in six months, and no technical adjustment can withstand this.

Send the website address and the list of languages ​​you want.

In response, there is a document with measurements of language versions, a scheme of addresses and an assessment of works by stages. If it turns out that it is enough to fix the hreflang and the sitemap, we will say so in the first email.

From measured casesMeasurement 08/01/2026: Three branches return HTTP 200, canonical in place and self-referencing in each

View cases
  • Reply within 2 hours
  • No commitment
  • We work under a contract

There is no price list on the site on purpose: the same work differs several times over between two clients, and a “from” figure explains nothing in that case. First a free audit — we count your pages, duplicates and speed — then we name the sum and the deadline and fix both in the contract.