Restaurant menus guests read in their own language

Working menus for all 8 brands of the restaurant group where I work.

A menu in Arabic, with the text, buttons and dish cards all reading from the right.
A menu in Arabic, laid out right to left

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
Live
Open the live menus

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.

How ongoing changes work

Decisions

  1. 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.

  2. 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.

  3. 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.

  4. 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.

    Open the Urdu PDF

Contact

Want a menu like this, or something else built? I reply within one business day.

Start a project

How a project runs