• Online Stores

Multilingual store: so that the second language does not exist only in the switch

A multilingual online store means separate URLs for each language, mutual hreflang tags, and the presence of all versions in the sitemap, not a checkbox switch in the header. We deploy the second and third language versions of the catalog on OpenCart so that search reads them as variants of the same page, and not as competitors. On July 31, 2026, we took the indicators from the stores where it was done cleanly and where it was broken: in one of them, all 590 addresses of the site map led to only one language version of the two announced.
See how it works
Price
after a free audit
Guarantee
30 days after project sign-off
Term
10–25 working days after approval of the list of languages
after a free audit
Price
30
Guarantee

days after project sign-off

10–25
Term

working days after approval of the list of languages

we call it after a free language version check — it lasts 2–3 working days
Cost
the amount of content to be translated, not the number of languages
What sets the estimate
6,234
Measured landmark

addresses for each of the two languages ​​in the catalog for 5,830 products

all 590 addresses of the site map led to one language version of the two announced
The most common defect
50%
Conditions

advance payment, warranty period 30 calendar days after acceptance

Process steps

Transparent stages with approval at every step

Total duration:10–25 days

  1. Language version check and language decisions

    2-3 working days

    Let's see what the site gives now: site map, hreflang, canonical, language codes in addresses. Right here, we fix which language is the main one and what gets x-default — this decision will not be played back without redirects.

  2. Address scheme and site map plan

    1-2 working days

    We decide what the address of each version will look like and how many sitemaps there will be. Up to several thousand items — one file, then a separate card per language. We agree to work in the engine: changing the address scheme after filling in the translations is expensive.

  3. Deployment of language versions in the engine

    3-6 working days

    Second and third languages ​​in the admin, translation of the interface, letter templates, order statuses and checkout texts. The longest stage and the least visible from the outside: nothing changes in the catalog before it.

  4. Filling in translations of the catalog

    2-8 working days

    Categories and top items first, the rest of the catalog later - the structure allows it. Texts are provided by the customer or a separate translator; we are responsible for ensuring that each line falls into place and nothing overwrites the underlying language.

  5. hreflang, canonical, sitemap, markup

    1-3 working days

    Mutual hreflang pairs with x-default, canonical within its language, all versions in the sitemap, JSON-LD separately in each. Pairs are checked individually, not selectively: one non-reciprocal pair devalues ​​the entire group.

  6. Post-launch check and transfer

    1-3 working days

    Touring the site map, comparing language codes with real addresses, measuring the first response along with a redirect to the language branch, submitting maps in Search Console, written instructions to the content manager.

Technologies & integrations

What we build on and what it connects to

Stack

  • OpenCart 4.x is a language in the core: separate product fields for each version, no third-party modules
  • OpenCart 3.x - when you need a module without building under 4.x
  • hreflang with x-default — mutual must, one-way pairs are ignored
  • A separate sitemap per language is a working approach from several thousand addresses
  • nginx, HTTP/2 - we keep the redirect to the language branch at the server level, not in PHP
  • MySQL — the translation is line by line: the new version adds volume, not structure
  • Stack Limit: The engine stores your texts but does not translate them
  • Stack Limit: Each language version is content that someone maintains with each new product

Integrations

  • Google Search Console
  • Google Tag Manager
  • GA4 with separation by language
  • Google Ads
  • Nova Poshta
  • Ukrposhta
  • LiqPay
  • WayForPay
  • monobank
  • eSputnik with language templates of letters
What's included

Complete list of work and what you get as a result

  • Separate addresses for each language instead of switching content on the fly — each version can be given in advertising and in the messenger
  • Mutual hreflang between all versions plus x-default, with individual reconciliation of each pair - versions no longer read as duplicates
  • All language versions in the site map: one file in a small directory or a separate map for each language in a large one
  • Canonical within its language version, no cross-references between languages ​​- the second version no longer excludes itself from the index
  • Translation of the interface, letter templates and order statuses - the buyer receives the letter in the language in which he bought
  • Language versions of service pages: payment, delivery, returns, contacts — without them, checkout in a second language stops at the first question
  • Redirect to the language branch, configured so as not to eat the first server response
  • Language-sensitive micro-markup: Store, Product, BreadcrumbList separately in each version
  • Post-launch validation: sitemap traversal, hreflang matching, map submission, and error checking in Search Console
  • Written instructions to your content manager on how to start translations of new products so that versions do not differ
  • Terms: 50% advance payment, warranty period of 30 calendar days after acceptance
When this service isn't right

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

  • Translation of the texts of product cards as a service — we prepare the structure, the texts are provided by the customer or a separate translator
  • Localization of prices and currencies as a financial task
  • Legal adaptation of terms of sale for other jurisdictions
  • Post-launch advertising
  • Hosting, domain, acquiring
Who it's for

Situations where this service delivers results

Scenario 1 of 4

There is already a second language, but there is no traffic from it

The pages open, the switch works, the reports are empty. The answer usually lies in the sitemap. In the store of the spice brand, we counted 3,971 records for 590 unique addresses, and all 590 led only to the /ru/ branch, although the Ukrainian one was declared as the main one in the code. In the official store of garden tools, it is a mirror image: only the /ua/ branch is included in the map, and the Russian version declared in hreflang is not. Both cases are measurement findings, not our result.

We'll review your situation in a free audit
Language versions of one store versus a separate site for each country

How this option differs from the alternative

Launch date10-25 working days: engine and catalog already available, language added
Balances and pricesone base: the product starts once and lives in all versions
Risk of duplicates in issuanceis, and is removed by mutual hreflang from x-default
Local payment and deliverya common set of methods in one checkout
Support after launchone store, one manager, content multiplied by the number of languages

Free language version checker

The most frequent error of the multilingual store is not in the translation, but in the fact that the second version is not included in the search. The switch is there, the pages open, but they are not in the sitemap — and they do not exist for the bot. This can be seen in a couple of days even without access to the site.

What we measure

  • Language versions in the site mapAre all announced present? Measured counterexample: In a spice brand store, all 590 unique map addresses led to only one of the two language versions. The second: in the store of garden equipment, out of 8,690 unique addresses, only the Ukrainian-speaking branch was included in the map.
  • hreflang correctnessAre the versions cross-referenced, is there an x-default, do the language codes match the real addresses. Measured sample example: uk-ua, ru-ua and x-default are mutually configured without errors.
  • Separate site maps by languageWorking approach on large catalogs. Measured example: two files for 6,234 addresses, one for each language version of the catalog for 5,830 products.
  • Duplication of addressesHow many addresses does the second language create and are they read as duplicates? At the measured garden equipment store, the card returned 33,493 entries for 8,690 unique addresses—almost four duplicates per address.
  • The volume of content for translationHow many cards, categories and information pages. This is the main figure of the estimate — it determines the volume, not the number of languages.
  • Redirect to language branchDoes the automatic redirect eat up the speed. Measured example: the first response is 789.4ms, and a 301 redirect to the language branch is included in those milliseconds.

What you get

  • Report on language versions: what is now in the sitemap, what is in hreflang, where are the differences.
  • The amount of content to be translated: cards, categories, information pages.
  • Priority search list - which breaks indexing right now.
  • A conversation for 30–40 minutes on the report, where you can argue with the conclusions.

Timeline: 2-3 working days

Why is it free

After all, checking language versions involves several requests and analysis of the site map, and the result often changes the formulation of the problem: instead of "adding a language" it turns out to be "returning an already existing language to the index." It is cheaper to give such a conclusion for free than to sell the wrong work.

What's next

After verification - the amount and term by stages with dates, contract, invoice, act. If, as a result of the measurement, you do not need a second language now, we will write this in the same report.

Short form: your contact and site URL

Did not find your case?

Describe how it works on your side — we will tell you whether “Multilingual online store with hreflang” 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 content for translationThe technical part does not depend on the size of the directory: hreflang, site maps, templates, service pages — fixed work. The only variable is the product card, and it is counted individually. A 23 position store and a 5830 store are the same amount of engineering and different estimates.
  • The number of languages ​​and the availability of the main oneThe second language is more expensive than the third: it builds the address scheme, decides which version is the main one, and sets x-default. The third fits into a ready-made frame — in a Bulgarian cosmetics store, bg, en and ru stand on the same structure.
  • What the site gives nowA store where the second language already exists and simply fell off the site map is repaired faster than one where the content is switched on the fly without separate addresses. In the second case, first you need to dilute the URL and close the old addresses with redirects - this is a separate stage.
  • Checkout, statuses and lettersIt is not enough to translate the catalog. Names of payment and delivery methods, order statuses, form error texts, letter templates are dozens of short lines in different places of the engine, and they most often remain in the same language.
  • Site map sizeOne file is enough for several thousand addresses. Then there is a separate map for the language, and tens of thousands also have an index of submaps. This is another amount of setup and another amount of post-launch testing.
Cases

Tasks and results in numbers — all metrics measured by us

retail online store of heating equipment

Task
Bring online the full assortment of equipment in two languages: navigation and filters for comparison of characteristics and checkout, which equally serves the retail buyer and the VAT company.
Solution
OpenCart 3, two language versions uk and ru with mutual hreflang and x-default. Monobank checkout, cash on delivery, cash on delivery and non-cash account; four delivery services - names and statuses exist in each version.
Result
The catalog of 3,565 products was calculated using the regular OpenCart search: 35 pages with 100 items plus 65 for the last one. TTFB 524.8ms, full load 662.7ms with HTML weight 295.7KB. Language versions with hreflang and x-default are correct. Measurement 07/31/2026; at the same time, they found a defect not in languages ​​— /sitemap.xml returns 200 with an empty body.

a brand of natural cosmetics, a branded store for the EU market

Task
Make the store understandable to a buyer from the brand's country, from other EU countries and to a Russian-speaking audience, with clear delivery conditions.
Solution
OpenCart 3 with three language versions and hreflang. Store markup with opening hours, contacts and site search — six JSON-LD types on the main page. Courier delivery to the office or address with a free threshold.
Result
Three language versions — bg, en and ru — on an assortment of 23 products: an OpenCart search with an empty query does not give pagination, that is, it is the entire catalog. TTFB 512.6ms, full load 640ms with HTML weight 220.4KB. Measured on 07/31/2026. A defect was found: the sitemap and robots.txt return an empty body — there are versions, but there is no address list for the bot.

a wholesale supplier of goods from China with a B2B catalog of almost 6,000 items

Task
Allow business customers to order the assortment directly: a large catalog with wholesale prices and a short path from finding an item to an order, in two language versions.
Solution
OpenCart 3, two language versions with a separate sitemap for each. Block of questions and answers with micro-markup, breadcrumbs with markup, site search in structured data.
Result
Catalog of 5,830 products — confirmed by two independent methods: standard search (58 pages of 100 items plus 30) and site map. Maps: 6,234 addresses for the Ukrainian-language version and 6,234 for the Russian-language version, a total of 12,468. TTFB 506.9 ms, full download 552.7 ms with an HTML weight of 333.1 KB. Measured on 07/31/2026.
What we need from you

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

  1. A list of languages ​​and a decision, which of them is the main one.
  2. Ready translations of cards or consent to work with a separate translator.
  3. Translation of service pages: payment, delivery, returns - legally this is your zone.
  4. Access to Search Console if rights are confirmed.
  5. Access to the site and hosting.
  6. One person who is responsible for the terminology in the translation.

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

I have a second language, but no traffic from it - why?

Most often, because it does not exist for searching. Two measured examples. First: For a spice brand store, the sitemap has 3,971 entries for 590 unique addresses, and all 590 lead to only one language version — the second is not advertised anywhere except for the switch. The second: in the store of garden equipment, only the /ua/ branch was included in the map, and the Russian version declared in hreflang was not. In both cases, the pages open, but no one can index them.

Is Hreflang really necessary or is a switch enough?

The switch is for the human, the hreflang is for the search engine. Without it, two versions of the same page are read as competitors, and a random one gets published. The working configuration is cross-references between all versions plus x-default for those whose language didn't match any. Measured example from our sample: uk-ua, ru-ua and x-default configured against each other without any error.

Which version to make the main one and why x-default?

We make the main one in which your content is written and in which most buyers speak - the rest inherits the structure from it. x-default is the default version for a visitor whose language did not match any of the declared ones: without it, Google chooses itself. We fix the solution at the first stage, before filling in the translations: you can then change the main language only through the redirects of all addresses.

One sitemap or separate for each language?

Both options are working. On large catalogs, individual ones are more convenient: in the store we measured for 5,830 products, these are two files of 6,234 addresses, one for each language - so it is easier to monitor the completeness of each version and see which of them lags behind. For a directory of several hundred items, one file containing all language addresses is sufficient.

Won't the second language create a double?

Will create if canonical is set carelessly. The rule is simple: canonical always points inside its language version, and the connection between languages ​​is maintained by hreflang. The error we see most often is the canonical from the secondary language to the primary language: this is how the second version excludes itself from the index with its own hands. Separately, we look at the duplicates within the language: in the measured garden equipment store, the map gave 33,493 records for 8,690 unique addresses.

How much does it cost to add a language to a large catalog?

The technical part does not depend on the volume: hreflang, site map, templates, service pages — fixed work. The variable part is content: the translation of the cards is counted from their number. Therefore, in the free check, we first of all measure the amount of content, not the number of languages, and only after that we name the amount.

Will automatic translation work?

For the interface - partially, for product cards - no. A store with machine translated descriptions looks cheaper than it is, and the buyer notices this in the first second. We make the structure so that translations can be filled in queues: first categories and top items, then the rest of the catalog. Half of the directory with live translation works better than the entire directory with machine translation.

How to check after launch that everything is in place?

Four numbers that we capture ourselves and show you. How many addresses of each language version in the sitemap. How many hreflang pairs are mutual without errors. How many addresses are still not on the map. And the first response from the server with the redirect to the language branch is 789.4ms we measured at the garden equipment store, and the redirect sits within that figure. The actual indexing is further visible in your Search Console: access to it is confirmed by the domain owner, not the contractor.

Please send the store address and the list of languages ​​you need.

The answer is a report: what is currently in the sitemap, what is in hreflang, how much content is available for translation, and what is breaking indexing right now. If it turns out that the language should not be added, but returned to the index, you will hear about it in the first email.

From measured casesCatalog of 5,830 products

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.