Translations

Current release

English is the only active runtime language. Arabic translation files ship in lang/ar and can be turned on later by adding ar back to available_locales in config/app.php (see below). Until then, language switchers stay hidden, browser language hints and stored Arabic preferences fall back to English, and customer-facing pages stay in English.

Adding a language

Calbok ships English out of the box. Arabic files are included but deferred in the current release. Another language is a folder plus config lines, with no code change and no extra package.

  1. Copy lang/en to lang/{code} (for example lang/fr). Translate every string. Keep the array keys identical; placeholders such as :name and :count stay as they are.
  2. Add the code to available_locales in config/app.php (or the APP locale list your deploy already overrides). To enable the bundled Arabic files, include 'ar' in that list.
  3. Add the language's own name to locale_native_names in the same file, so the switcher can show it (for example 'fr' => 'Français'). Arabic is already listed as 'ar' => 'العربية'.
  4. If the language is right-to-left, add the code to rtl_locales. The public pages, the panels, the installer, and the staff invite page set dir from that list. Arabic is already in rtl_locales.
  5. After enabling more than one locale, open a page with ?lang={code} or use the language switcher in the admin and tenant panels. A signed-in user's choice is saved on their account. A business can set a default for customer-facing pages under Business profile → Default language. Visitors who have not chosen a language are matched from the browser Accept-Language header, then that default.

Filament (the admin and tenant panels) already ships its own translations for framework chrome such as "Save" and "Delete". You do not re-translate those. Strings we wrote (navigation, form labels, the installer, invitations, validation) come from lang/{code}.

Customer-facing booking pages and emails use the customer's language when that locale is in available_locales. Service, provider, and location names have an optional translation on each record (the Translations section). When a translation is missing, the default name is shown.