Skip to content

Languages

Overview

Language settings control which languages are available in your Online Ordering, Kiosk, and backoffice interfaces.

Key Purpose: Configure available languages for customers and staff.

Purpose

This page lets you add, publish, unpublish, and set a default language so that customers and staff see the interface and menu content in the correct language.

Key Concepts

  • Language Status: Each language has a status of Published (visible to customers) or Unpublished (hidden); only published languages appear in the language selector.
  • Default Language: One published language is set as the vendor-level default; it serves as the fallback when a customer's preferred language is unavailable or translations are missing.
  • Translation Completeness Check: The LanguageService.checkTranslation method verifies whether all translatable entities (items, categories, modifiers, display groups, variant groups, loyalty rewards) have translations for a given language.
  • Auto-Translate on Create: When a new language is created, the system automatically triggers ReceiptSettingService.translateReceiptSetting for every location to translate receipt custom text into the new language.
  • Location Preferred Language: Each location can have its own preferred language; unpublishing a language that is in use by any location is blocked with an error message.

Actions

Add a Language

Select a language to add; the system creates it in Unpublished status and auto-translates receipt settings for all locations.

Publish or Unpublish a Language

Toggle a language between Published and Unpublished; unpublishing is blocked if the language is the default or is used as the preferred language by any location.

Set Default Language

Designate a published language as the vendor-wide default; only published languages can be set as default.

Check Translation Coverage

View which entities (items, categories, modifiers, etc.) have missing translations for each language.

Location

  • Backoffice Route: /settings/languages
  • Backend Controller: app/Http/Controllers/Api/LanguageController.php
  • Vue Component: src/views/settings/LanguagesComponent.vue

Fields

Available Languages

PropertyValue
Field IDavailable_languages
LabelAvailable Languages
TypeMulti-select
RequiredYes (at least one)

Description: Languages available for customer-facing interfaces.

Supported Languages:

CodeLanguageNative Name
enEnglishEnglish
nlDutchNederlands
frFrenchFrançais
deGermanDeutsch
esSpanishEspañol
ptPortuguesePortuguês
itItalianItaliano

Default Language

PropertyValue
Field IDdefault_language
LabelDefault Language
TypeSelect
RequiredYes

Description: Language shown by default when customer first visits.

Business Logic:

  • Used when no preference detected
  • Fallback for missing translations

Auto-Detect Language

PropertyValue
Field IDauto_detect
LabelAuto-Detect Language
TypeToggle
Defaulttrue

Description: Automatically detect customer's preferred language from browser settings.

Business Logic:

  • If enabled: Use browser language if available
  • If disabled: Always use default language

Show Language Selector

PropertyValue
Field IDshow_selector
LabelShow Language Selector
TypeToggle
Defaulttrue

Description: Show language selection option to customers.

Customer Impact:

  • Enabled: Language dropdown/flags visible
  • Disabled: No manual language selection

Per-Channel Settings

Online Ordering Languages

PropertyValue
Field IDonline_languages
LabelOnline Ordering Languages
TypeMulti-select
DefaultAll available

Description: Languages available in Online Ordering.


Kiosk Languages

PropertyValue
Field IDkiosk_languages
LabelKiosk Languages
TypeMulti-select
DefaultAll available

Description: Languages available on kiosks.


Backoffice Language

PropertyValue
Field IDbackoffice_language
LabelBackoffice Language
TypeSelect
DefaultEnglish

Description: Language for the backoffice interface.


Business Logic

Language Selection Flow

Customer visits Online Ordering


Auto-detect enabled?
├── Yes → Check browser language
│         ├── Supported? → Use browser language
│         └── Not supported? → Use default

└── No → Use default language


Show interface in selected language


Customer can change via selector (if enabled)

Translation Fallback

Display text needed


Translation exists in selected language?
├── Yes → Use translation

└── No → Fallback to default language
        ├── Translation exists? → Use default
        └── No translation? → Show original text

Customer Impact

Online Ordering

  • Interface in selected language
  • Menu items in selected language (if translated)
  • Checkout flow in selected language
  • Confirmation emails in selected language

Kiosk

  • Welcome screen with language selection
  • Full interface in selected language
  • Receipt in selected language

Receipts & Emails

  • Order confirmation in customer's language
  • Receipt text in location's language

Relations

Depends On

  • Locations: Languages can be per-location

Affects

  • Online Ordering: Interface language
  • Kiosk: Interface language
  • Translations: Which languages need translations
  • Receipts: Receipt language

Business Rules

  • A language must be in Published status before it can be set as the default; attempting to set an unpublished language as default returns a 400 error.
  • The default language cannot be unpublished; the system rejects the request with "Can't unpublish the default language."
  • Unpublishing a language is blocked if any location uses it as its preferred language; the error message names the affected location(s).
  • Creating a duplicate language (same name) returns a 400 "Duplicate language" error unless the throw parameter is set to false, in which case the existing language is returned.
  • Publishing or unpublishing a language triggers a ReloadMenu event for every location under the vendor so all devices update immediately.

FAQs

  • "Why can I not unpublish a language?" Either it is the default language or it is set as the preferred language on one or more locations; change the default or update the location settings first.
  • "What happens when I add a new language?" The language is created in Unpublished status and receipt settings for all locations are auto-translated into the new language.
  • "Do I need to translate every menu item manually?" Not necessarily; if auto-translate is enabled in Translations settings, the system can generate draft translations, but they should be reviewed for accuracy.
  • "Can each location have a different default language?" Each location can have its own preferred language, but the vendor-wide default language serves as the global fallback.
  • "What entities are checked for translation completeness?" Items, display groups, variant groups, categories, modifier groups, and loyalty rewards are all checked when you view translation status.

Troubleshooting

Problem: Wrong language showing

Causes:

  1. Auto-detect using browser language
  2. Default language incorrect
  3. Cookie/cache storing old preference

Solutions:

  1. Disable auto-detect or change browser settings
  2. Set correct default language
  3. Clear cookies/cache

Problem: Language selector not showing

Causes:

  1. Show selector disabled
  2. Only one language enabled
  3. UI issue

Solutions:

  1. Enable show_selector
  2. Enable multiple languages
  3. Check UI configuration

Problem: Some text not translated

Causes:

  1. Translation missing
  2. Custom content not translated
  3. Fallback to default

Solutions:

  1. Add missing translations
  2. Translate custom content
  3. Check translation coverage

Examples

Netherlands Restaurant

json
{
  "available_languages": ["nl", "en"],
  "default_language": "nl",
  "auto_detect": true,
  "show_selector": true,
  "online_languages": ["nl", "en"],
  "kiosk_languages": ["nl", "en"],
  "backoffice_language": "nl"
}

Tourist Area Restaurant

json
{
  "available_languages": ["en", "nl", "de", "fr", "es"],
  "default_language": "en",
  "auto_detect": true,
  "show_selector": true,
  "online_languages": ["en", "nl", "de", "fr", "es"],
  "kiosk_languages": ["en", "nl", "de", "fr"],
  "backoffice_language": "en"
}

Belgium Restaurant

json
{
  "available_languages": ["nl", "fr", "en"],
  "default_language": "nl",
  "auto_detect": true,
  "show_selector": true,
  "online_languages": ["nl", "fr", "en"],
  "kiosk_languages": ["nl", "fr"],
  "backoffice_language": "nl"
}

Single Language (Simple)

json
{
  "available_languages": ["nl"],
  "default_language": "nl",
  "auto_detect": false,
  "show_selector": false,
  "backoffice_language": "nl"
}

Language Selector UI

┌─────────────────────────────────────┐
│  🌐 Language                    ▼   │
├─────────────────────────────────────┤
│  🇳🇱 Nederlands                     │
│  🇬🇧 English              ✓         │
│  🇩🇪 Deutsch                        │
│  🇫🇷 Français                       │
└─────────────────────────────────────┘

Kiosk Welcome Screen

╔═══════════════════════════════════════╗
║                                       ║
║         Welcome / Welkom              ║
║                                       ║
║    Select your language:              ║
║                                       ║
║    ┌─────────┐    ┌─────────┐        ║
║    │   🇳🇱    │    │   🇬🇧    │        ║
║    │Nederlands│    │ English │        ║
║    └─────────┘    └─────────┘        ║
║                                       ║
║    ┌─────────┐    ┌─────────┐        ║
║    │   🇩🇪    │    │   🇫🇷    │        ║
║    │ Deutsch │    │Français │        ║
║    └─────────┘    └─────────┘        ║
║                                       ║
╚═══════════════════════════════════════╝