
One QR code, every language: how to route international scans to the right page
How does a multi-language QR code know which page to show? A practical guide to device-language detection, IP geolocation fallback, BCP 47 tags and the Accept-Language header, with the failure modes agencies need to plan for.
ScanKit · Organization
· 14 min read
A retailer selling the same product in Rotterdam, Berlin and Milan used to need three QR codes: one per market, one per language, printed on three separate packaging runs. That approach still works, but it is not how most agencies solve the problem any more. A single dynamic QR code can now detect what language the scanning device is set to and send that scan straight to the matching landing page, without the shopper ever touching a language switcher.
This matters more than it looks like it should. For agencies running packaging, trade show, tourism or direct mail campaigns across several countries, a language-aware QR code removes an entire category of print planning: no more coordinating which SKU gets which code, no more reprinting when a new market is added, and no more guessing which language a scan "should" resolve to. The code stays the same. Only the destination changes, and it changes automatically, based on a signal the phone is already sending.
This post explains how that detection actually works under the hood, which signal to trust first when two disagree, where it breaks (VPNs, shared devices, travellers), and how to build in a fallback so nobody gets stuck on a page they cannot read.
What a "multi-language QR code" actually is
There is no such thing as a QR code that stores multiple languages inside it. A QR code is just a container for one payload, almost always a single URL. What makes a code feel "multilingual" is that the URL it points to is a dynamic redirect: this is the same mechanism behind dynamic QR codes generally. The code stays fixed on the packaging or the flyer, but the destination behind it is a small decision layer that branches by language before it ever serves content.
That decision layer looks at the request the phone sends, picks a language, and forwards the visitor to the matching version of the page. Get the branching logic right and the shopper never sees a language menu at all. Get it wrong and the visitor lands on a page in a language they cannot read, no matter how well-designed the QR code itself is.
The three signals, and the order to trust them in
There are three ways to work out what language to show someone, and they are not equally reliable. Getting the order right is most of the job.
- Explicit choice, always wins. If a visitor has already picked a language, on this scan or a previous one, via a switcher or a saved cookie, that choice overrides everything else. Never silently override a language a person selected on purpose. This sounds obvious, but it is the single most common mistake in language-detection implementations: a fresh check on every visit that quietly reroutes someone who deliberately chose English on a previous session.
- Device language, the strongest automatic signal. Every browser sends an
Accept-Languageheader with each request, and every phone exposes the equivalent to JavaScript asnavigator.language. Both are populated from the device's own language and region setting, using tags defined by BCP 47, the standard that combines an ISO 639 language code with an optional ISO 3166 region or script subtag, such asen-GB,pt-BRorzh-Hans. A header commonly looks likefr-FR, fr;q=0.9, en;q=0.5: a ranked list, French (France) preferred, generic French next, English as a fallback, with theqvalues expressing relative preference. Reading the first entry with the highest weight is normally enough to pick a language. - IP geolocation, a fallback only. Where the phone is physically located, inferred from its IP address, is useful when the device language is missing, unavailable, or set to something you have not translated. It is not a proxy for what language someone speaks. Plenty of people in the Netherlands run their phone in English; plenty of tourists in Rome are not carrying an Italian-language device. Treat IP geolocation as a last resort, not a primary signal, and pair it with the fallback switcher described below.
Why device language beats location, and why neither is perfect
Device language reflects a choice the phone's owner actually made at some point, or the default their carrier or manufacturer shipped with. Location reflects nothing about the person at all, only about a network connection. That is why the priority order matters: language signal, then location, then a visible manual option.
None of the three signals is airtight, though. Phones travel with their owners, so a French tourist scanning a code in Amsterdam still presents as French by device language, which is correct, but the same tourist connected through a hotel VPN routed via Germany could present as being in Germany by IP, which is not. Shared devices, a shop's demo tablet, a library kiosk, often carry whatever language the last person left it in. And a meaningful share of smartphone owners worldwide simply never change their phone away from its factory-default language, English being the most common default, which means device language sometimes tells you about a manufacturer's shipping defaults rather than a spoken language at all.
None of this makes the approach unreliable, it makes a visible fallback non-negotiable. Detection should feel like a convenience, not a decision made irreversibly on someone else's behalf.

- Explicit choice. A language the visitor has already picked, this scan or a previous one, overrides every automatic signal below it.
- Device language. The
Accept-Languageheader andnavigator.language, read from the phone's own settings, checked first when no explicit choice exists. - IP location, fallback only. Used only when device language is missing or unsupported, shown with a broken border here because it is the weakest signal, not a tier to lean on.
- Manual switch, always present. A visible way to override the automatic guess, reachable no matter which of the three signals made the decision.
Building the fallback: never trap a visitor in the wrong language
The single rule that separates a good multi-language QR implementation from a frustrating one: always offer a way out. Concretely, that means:
- Detect a language automatically and redirect to the best match, but keep a small, visible language switcher on the landing page itself. Flag icons are a weak pattern here, since a flag represents a country, not a language; use the language's own name instead, such as "Nederlands" or "Deutsch".
- If the detected language has no translated page, fall back to a sensible default, often English, or the language of the market the code was printed for, rather than showing a broken or machine-translated page.
- Remember an explicit choice for the rest of that visit, and ideally across return visits, using a cookie, so the same person is not re-prompted or re-redirected on the next scan.
- Log which branch a scan actually took. This is the same tagging discipline described in the QR code UTM parameters guide, applied per language rather than per campaign, so a report of "40% of scans on this SKU resolved to German" is something you can actually pull, not something you have to guess at.
Where this earns its keep: packaging, trade shows, and direct mail
Product packaging is the clearest case. A single carton design, shipped to distributors in several countries, can carry one QR code that resolves to the right product page, safety information or instructions per market. This intersects directly with the labelling reality already covered in the GS1 Digital Link packaging guide: the EU's product safety rules require instructions and safety information in the official language of whichever member state a product is actually sold in, not automatically all EU languages, and GS1's Sunrise 2027 initiative, the point by which retail point-of-sale systems are expected to read a 2D barcode alongside the legacy 1D barcode, by 31 December 2027, is pushing more packaging toward a single, richer QR code rather than per-market codes. A language-branching destination is what lets one printed code satisfy several markets' labelling requirements from one SKU.
Trade shows and international events are the second case: a single banner or badge code can send a German attendee to a German product page and a visitor from Spain to a Spanish one, without printing separate stands per language. This complements the coordination approach in QR codes for events and trade shows, where a single code already needs to serve several purposes; language branching is one more layer on top of that same dynamic destination.
International direct mail and tourism signage round out the common cases: a leaflet distributed across several countries, or signage in a multilingual tourist district, benefits the same way a packaging run does, from one printed asset instead of several.
Language branching versus location branching: you often need both, in order
It is worth being precise about how this differs from geotargeted QR codes, because the two get conflated. Geotargeting routes a scan by where the code is scanned, useful for sending someone to their nearest store or a region-specific offer. Language branching routes by what language the device is set to, useful for showing content the person can actually read. A single campaign frequently needs both, and the order matters: resolve language first, so the page is legible at all, then use location within that language to decide, say, which store's stock or price to show. Doing it the other way round, location first, risks handing someone a page in a language dictated by a network connection rather than a phone they actually own.
Setting it up without touching a language switcher yourself
None of this requires visitors to interact with anything. The branching logic lives entirely in the destination, not in the QR code, which is why it works with any existing dynamic QR code: the printed asset never changes, only the routing rule behind it does. Practically, that means:
- Keep one QR code per product, banner or asset, exactly as you would for a non-language campaign, following the same one-workspace-per-client structure agencies already use to keep multi-market clients organised.
- Set the redirect rule to check device language first, falling back to a default page.
- Add the visible manual switcher on the landing page as the safety net for the cases detection gets wrong.
- Tag each language branch distinctly in analytics, so a scan report shows the split by language, not just a single aggregate number.
- Update the fallback default or add a new language at any time, since the destination is editable without a reprint, the same advantage described in change a QR code's destination without reprinting.
Frequently asked questions
How does a multi-language QR code know what language to show?
It does not store multiple languages. The code points to one dynamic URL, and a redirect rule behind that URL reads the scanning device's language signal, the Accept-Language header, or navigator.language in the browser, and forwards the visitor to the matching translated page. Location, inferred from IP address, is used only as a fallback when no language signal is available.
Does a QR code detect the scanner's real native language, or just the phone's settings?
Only the phone's settings, and the two are not always the same thing. A device reports whatever language it is configured to, which reflects a setting someone chose, or a factory default they never changed, not necessarily the language the person speaks best. That is why a visible manual switcher matters: automatic detection is a strong first guess, not a guarantee.
What is the Accept-Language header, and where does it come from?
It is an HTTP request header, defined by the HTTP specification (RFC 9110), sent automatically by every browser on every request. It lists the languages the device is configured to prefer, ranked by a quality value, for example fr-FR, fr;q=0.9, en;q=0.5 meaning French (France) first, generic French next, English last. A server reads this list and picks the highest-ranked language it has a translation for.
Should you use browser language, IP geolocation, or both?
Both, but not equally. Device language, from the Accept-Language header or navigator.language, should be checked first, since it reflects an actual language setting. IP-based geolocation should only be used as a fallback when device language is missing or unsupported, since location says nothing reliable about what language a visitor reads. An explicit choice a visitor has already made, via a switcher or a saved cookie, should override both.
What is a BCP 47 language tag?
BCP 47 is the standard that defines language tags used across the web, such as en-GB, pt-BR or zh-Hans. It combines a base language code from the ISO 639 family with an optional region subtag from ISO 3166, or a script subtag, so the same base language can be distinguished by country or writing system where that matters, for example British versus American English, or Brazilian versus European Portuguese.
Can VPNs or travelling break a language-based QR redirect?
Yes, in different ways. A VPN can make IP-based geolocation report a country the visitor is not actually in, which only matters if location is being used as the primary signal, and it should not be. Device language survives travel and VPN use fine, since it is a setting on the phone itself, not a network property, which is exactly why it should be trusted ahead of location.
What happens if someone's device language is not one you have translated?
The redirect should fall back to a sensible default page, commonly English, or the language of the market the code was originally printed for, rather than showing a broken or auto-translated page. This is also where a visible manual language switcher earns its place: someone can pick a language you do support even if their device's default was not one of them.
Should the redirect force the detected language, or just suggest it?
Suggest, by redirecting automatically but always leaving a visible way to change it. A silent, unchangeable redirect based on an automatic guess is the failure mode to avoid. If a visitor picks a different language deliberately, that choice should be remembered and respected on later scans, not re-guessed every time.
How do you track which language a scan resolved to?
By tagging each language branch as its own trackable destination, the same discipline used for QR code UTM parameters, just applied per language rather than per channel or campaign. That turns "we support five languages" into an actual report: which languages scans are resolving to, and whether a market you assumed was English-dominant is actually splitting across two or three languages.
The short version
A multi-language QR code is not a special kind of code, it is a dynamic destination that branches by the scanning device's language signal before serving content. Trust an explicit choice first, device language second (Accept-Language and navigator.language, governed by BCP 47), and IP-based location only as a last-resort fallback, because location tells you where a phone is, not what its owner reads. Always leave a visible manual switcher, log which branch each scan takes, and update the fallback or add a new language whenever the campaign needs it, since the destination is editable without a reprint. If you are running a packaging, trade show or international direct mail campaign across more than one language market, set this up once behind your existing dynamic QR code rather than printing a separate code per language.
Keep reading

· 17 min read
Geotargeted QR codes: how location-based redirects really work (and where they break)
IP-based geolocation is reliable at country level (99%+) but shaky at city level (20-75%). GPS geofencing is precise but needs permission. What agencies can promise a client, the GDPR line, and where geotargeting quietly fails.
Read more
· 14 min read
Why your QR code takes so long to redirect (and how to fix it)
Why does a QR code take so long to redirect? A breakdown of redirect hops, 301 vs 302, DNS and TLS overhead, and how to audit your own redirect chain before your next print run.
Read more