Restaurant menus guests read in their own language
- English
- Español
- Tiếng Việt
- 한국어
- 简体中文
- 繁體中文
- Tagalog
- فارسی
- العربية
- 日本語
- Русский
- हिन्दी
- اردو
- Role
- I designed and built it, on my own initiative
- Started
- September 12, 2026
- Stack
- Python, HTML, CSS, JavaScript, GitHub Pages
- Status
- Working versions for all 8 brands, ready for the group’s review
Working menus for all 8 brands of the restaurant group where I work. A guest scans the code at the table, picks one of 13 languages, and sees which dishes contain the allergens they avoid. They are ready for the group’s review.
Before
It started with one of the group’s restaurants. Its menu was a designed PDF, in English.
The problem
Guests at these restaurants read many languages first, but the menu came in one. A guest with an allergy had to ask about each dish.
The goal
One system every brand in the group could use: each dish in 13 languages with its allergens on the page, a printable menu for the table, and all of it built from one set of data, so a change is made once.
Decisions
-
The allergen warning works even when nothing else does.
Every page carries a plain menu inside the page itself, shown when JavaScript is off or fails to load, and each dish in it keeps its own allergen warning.
Why: a guest with an allergy should never see a menu without its warnings, whatever phone or browser they use.
Trade-off: that fallback is in English only, without the language switch or the photos.
-
“Contains: Egg” only where it tells the guest something.
An item that is just an egg, like a fried egg or a sous-vide egg on the side, no longer carries the line; dishes that are more than an egg, like egg fried rice, egg tarts and egg rolls, keep it. The allergen filter still reads the full data, so a guest who marks egg still sees every one of those items flagged or hidden.
Why: on a dish that is an egg, “Contains: Egg” says nothing, and warnings that say nothing teach guests to skip them.
-
Right to left is the whole layout, not just the text.
In Arabic, Farsi and Urdu the whole page mirrors and reads from the right, not just the text. In the printed menus, prices and English names inside those lines keep reading left to right.
Why: a mirrored sentence inside a left-to-right page still reads as a translation stuck onto an English menu.
-
Each script gets its own print rules.
The PDFs set Korean, Chinese, Japanese, Arabic, Farsi, Hindi and Russian each in a typeface drawn for that script, Urdu in its traditional Nastaliq style, with taller lines where the script needs them, no capitals or letter-spacing where a script has no capitals, and line breaks that follow Korean and Japanese rules.
Why: a printed menu in the wrong typeface, or with clipped letters, is the first thing a native reader notices.
What I built
- A phone menu for every brand and location, in 13 languages, one tap to switch.
- An allergen filter for 9 allergens that flags or hides every dish containing one.
- Print-ready PDFs of every menu in every language: 195 of them.
- A QR code for each brand and location, and a directory of every brand’s menu.
- One Python build that makes the web pages and the PDFs from the same data.
Limits
- The allergen lines come from the restaurant’s own published allergen information and the dish descriptions, and are marked as pending the kitchen’s review.
- No native speaker has reviewed the translations yet.
- Without JavaScript the menu is shown in English only.
- The group has not adopted the menus. My part so far is everything up to its review.
Result
13 languages, 3 of them right to left
The menu build’s language list
8 brands, every one with a working menu
The menu repository
195 print-ready PDFs
As of September 2026 · the menu repository
Every brand in the group has a menu a guest can read in their own language, with the allergen warnings on every dish, on the phone and on paper.
Next
The group’s review, the kitchen’s sign-off on the allergen lines, and a native speaker’s read of each language.
Contact
Want a menu like this for your restaurant? QR menus start at $1,200. Email me at hanjames1999@gmail.com; I reply within one business day.