Appearance
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) orUnpublished(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.checkTranslationmethod 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.translateReceiptSettingfor 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
| Property | Value |
|---|---|
| Field ID | available_languages |
| Label | Available Languages |
| Type | Multi-select |
| Required | Yes (at least one) |
Description: Languages available for customer-facing interfaces.
Supported Languages:
| Code | Language | Native Name |
|---|---|---|
en | English | English |
nl | Dutch | Nederlands |
fr | French | Français |
de | German | Deutsch |
es | Spanish | Español |
pt | Portuguese | Português |
it | Italian | Italiano |
Default Language
| Property | Value |
|---|---|
| Field ID | default_language |
| Label | Default Language |
| Type | Select |
| Required | Yes |
Description: Language shown by default when customer first visits.
Business Logic:
- Used when no preference detected
- Fallback for missing translations
Auto-Detect Language
| Property | Value |
|---|---|
| Field ID | auto_detect |
| Label | Auto-Detect Language |
| Type | Toggle |
| Default | true |
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
| Property | Value |
|---|---|
| Field ID | show_selector |
| Label | Show Language Selector |
| Type | Toggle |
| Default | true |
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
| Property | Value |
|---|---|
| Field ID | online_languages |
| Label | Online Ordering Languages |
| Type | Multi-select |
| Default | All available |
Description: Languages available in Online Ordering.
Kiosk Languages
| Property | Value |
|---|---|
| Field ID | kiosk_languages |
| Label | Kiosk Languages |
| Type | Multi-select |
| Default | All available |
Description: Languages available on kiosks.
Backoffice Language
| Property | Value |
|---|---|
| Field ID | backoffice_language |
| Label | Backoffice Language |
| Type | Select |
| Default | English |
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 textCustomer 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
Related Features
Business Rules
- A language must be in
Publishedstatus 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
throwparameter is set to false, in which case the existing language is returned. - Publishing or unpublishing a language triggers a
ReloadMenuevent 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:
- Auto-detect using browser language
- Default language incorrect
- Cookie/cache storing old preference
Solutions:
- Disable auto-detect or change browser settings
- Set correct default language
- Clear cookies/cache
Problem: Language selector not showing
Causes:
- Show selector disabled
- Only one language enabled
- UI issue
Solutions:
- Enable show_selector
- Enable multiple languages
- Check UI configuration
Problem: Some text not translated
Causes:
- Translation missing
- Custom content not translated
- Fallback to default
Solutions:
- Add missing translations
- Translate custom content
- 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 │ ║
║ └─────────┘ └─────────┘ ║
║ ║
╚═══════════════════════════════════════╝