Tourist-market restaurants have a harder QR menu problem than neighbourhood restaurants. The diner doesn’t speak the local language, doesn’t know the local allergen vocabulary, and is often on hotel Wi-Fi or roaming. This post is a checklist for restaurants in Lisbon, Berlin, Barcelona, Florence, Seoul, Bangkok, and anywhere else tourists are a meaningful share of covers.
TLDR
Five things matter: (1) language toggle uses sibling URLs (/menu/en, /menu/es) not query strings; (2) hreflang annotations on each version; (3) allergen names are human-translated, not Google-translated; (4) sticker placement adapts to seating type; (5) the page still loads on slow international roaming.
Why tourist menus are different
In our 5-restaurant sample (S-301), the Lisbon and Berlin menus both routed to PDFs that were single-language (Portuguese and German respectively). The Berkeley menu was bilingual EN/ES but rendered as one PDF page with both languages mixed — readable to neither audience.
The pain is the same as in any QR menu — pinch-and-squint (S-001) — magnified by the language barrier.
The 7-row tourist-market checklist
Row 1 — Language toggle uses sibling URLs
Pass: /menu/en, /menu/es, /menu/pt — three distinct URLs, each with its own canonical and meta description.
Fail: /menu?lang=en query strings; or worse, all languages on one page.
Why: Google can index each language version separately and rank for native-language queries (“menu” vs “menú vegano” vs “Speisekarte”). Sibling URLs are cleaner with hreflang.
Row 2 — hreflang annotations are present
In each version’s <head>:
<link rel="alternate" hreflang="en" href="https://yourdomain.com/menu/en">
<link rel="alternate" hreflang="es" href="https://yourdomain.com/menu/es">
<link rel="alternate" hreflang="pt" href="https://yourdomain.com/menu/pt">
<link rel="alternate" hreflang="x-default" href="https://yourdomain.com/menu/en">
This tells Google which version to show for which user’s language preference.
Row 3 — Allergen names are human-translated
Run the allergen line past a human translator for each language. The cost is under $50 per language; the risk of getting it wrong is non-trivial.
Specific pitfalls from the allergen labelling post:
- “Shellfish” → Spanish mariscos in colloquial use, but EU law splits crustáceos (crab/prawns/lobster) from moluscos (clams/mussels/scallops) (S-019). The right translation is the regulatory term.
- “Tree nuts” → German Schalenfrüchte, French fruits à coque. But list the actual nuts (almond, hazelnut, walnut…) because the umbrella term is unfamiliar to many.
- “Wheat” vs “gluten” — the EU groups under gluten-containing cereals (S-019), the US splits wheat out (S-017). Use both terms if in doubt.
Row 4 — Body text scales to 17px+ on mobile
Same as the 10-row audit row 2. WCAG 2.2 SC 1.4.4 applies regardless of language (S-008). Translated menus often have longer words — German item names blow up width; CJK characters need at least 16px to be readable.
Row 5 — Sticker placement adapts to seating
Tourist restaurants have a wider seating mix than neighbourhood spots:
| Seating type | Best sticker placement |
|---|---|
| 4-top dining table | Centre of table, near the salt/pepper. Avoid edges where elbows cover it. |
| Bar stool / stand-up bar | On the bar surface near the menu rail, or on a small table-tent if no surface available. Bartenders often prefer the table tent. |
| Outdoor patio | Laminated sticker on the table corner, plus a backup stand. Outdoor sunlight glare matters — see row 7. |
| Communal long table | Repeat the QR every 4-6 seats. One QR on a 16-seat communal is unfindable. |
| Counter / takeout | Window decal at eye level + a small sticker at the register. |
Row 6 — The page loads on international roaming
Tourists often roam at slow speeds. LCP under 2.5s on a slow-4G profile (per Google’s Core Web Vitals threshold) is the target. PDFs fail; HTML pages routinely pass.
Workflow test: in Chrome DevTools, throttle to “Slow 4G”, reload your menu URL, check the LCP in the Performance tab. If above 2.5s, the LCP element is probably an image or a font. Inline critical CSS, drop the web font above the fold, lazy-load images.
Row 7 — Glare and laminate considerations for outdoor menus
A small physical detail with a real impact: glossy laminated QR stickers reflect sunlight and become unscannable. Use a matte laminate for outdoor seating. If the QR is on a wood table outdoors, dark sticker + light QR area scans better in direct sun than the reverse.
Language toggle pattern (HTML)
In the header of each language version:
<nav aria-label="Languages">
<a href="/menu/en" hreflang="en" lang="en"
aria-current={current === "en" ? "page" : null}>English</a>
<a href="/menu/es" hreflang="es" lang="es"
aria-current={current === "es" ? "page" : null}>Español</a>
<a href="/menu/pt" hreflang="pt" lang="pt"
aria-current={current === "pt" ? "page" : null}>Português</a>
</nav>
Notes:
langattributes on each link tell screen readers to switch pronunciation.aria-current="page"marks the active version.- Don’t auto-redirect based on browser locale — guests often want the local-language menu to learn the names.
Common mistakes
- Auto-translating with Google Translate at page load. The menu becomes inconsistent between visits and accents get butchered.
- One PDF with all languages stacked. Each language is half-readable; together they fail every accessibility row.
- Different QR stickers for each language. Confusing. Use one QR with the language toggle.
- Forgetting hreflang. Google ranks the wrong version for tourist searches.
- Glossy sticker laminate outdoors. Unscannable in direct sun.
FAQ
What languages should I publish in?
Look at your reservation/walk-in mix. Most tourist markets justify two or three languages (the local language + English + one regional language). Four+ languages means longer maintenance.
Should I use auto-detection?
No — explicit toggle. Auto-detection annoys diners who want the original-language version, and it interferes with hreflang.
What about right-to-left languages (Arabic, Hebrew)?
Use dir="rtl" on the <html> of the RTL version. Mirror the layout so prices land on the left, not the right. Test the toggle UI doesn’t break.
Do I need a translator for the entire menu?
For allergens and dietary labels: yes, human translator. For item names, menu descriptions: human-preferred, but a competent server who speaks the language can review machine-translated text in 30 minutes.
What if the QR sticker is the wrong language?
The QR is language-agnostic — it just encodes a URL. The destination URL routes to the language toggle. Make sure your dynamic QR (S-024) points at the language-selector page, not directly at /menu/en.
For the deeper bilingual setup, see the bilingual QR menu post. For the underlying menu audit, the 10-row scorecard still applies — language compliance is on top.