Restaurant menus guests read in their own language
Working menus for all 8 brands of the restaurant group where I work.
Result
13 languages, 3 of them right to left
The menu’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.
- On the phone, guests filter by the allergens they avoid.
- Printed menus show the allergen warnings on every dish.
- 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
The problem
The project began with a restaurant in the group and its designed PDF menu in English. Guests read many languages, and anyone 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.
- All of it built from one set of data, so a change is made once.
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.
Keeping menus current
Prices are changed once in the menu data; dish text is updated in each language. The build remakes the phone menus and the PDFs in every language.
Decisions
-
One set of menu data, so a price changes once.
Why: a price can’t drift between languages or between phone and print.
Trade-off: dish text is still edited in each language.
-
Keep allergen warnings available without JavaScript.
Each page includes a plain menu for when JavaScript is switched off. Every dish in that menu keeps its 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.
-
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 use typefaces drawn for Korean, Chinese, Japanese, Arabic, Farsi, Hindi and Russian, and traditional Nastaliq for Urdu.
- Line height follows the script.
- Scripts without capitals get no forced capitals or letter-spacing.
- Korean and Japanese keep their own line-break rules.
Why: a printed menu in the wrong typeface, or with clipped letters, is the first thing a native reader notices.
The same printed menu in English and Urdu
Contact
Want a menu like this, or something else built? I reply within one business day.
Or email hanjames1999@gmail.com