Glozr docs

Run your workspace

Internationalization

Glozr ships with internationalization support for more than 130 locales out of the box. English, Spanish, French, and Turkish are fully translated; the rest have their UI chrome translated with graceful English fallback for any remaining strings.

Overview

Locale handling spans the admin app, the agent runtime, and the visitor widget. The same translation dictionaries power all three, so a new language added in one place becomes available everywhere.

Adding a language

Adding a locale takes one file. Drop a JSON dictionary into lang/ (for example lang/sv.json for Swedish) and the runtime auto-discovers it — no code changes, no service restart, no rebuild. The language picker lists the new locale on the next page load.

Right-to-left support

RTL locales — Arabic, Hebrew, Persian, Urdu, and others — are first-class. The system handles them through:

  • dir="rtl" on root elements where needed.
  • Tailwind logical properties (ms-*, pe-*, etc.) that flip automatically.
  • Radix UI primitives that adjust alignment and animation direction.
  • Hooks like useIsRtl() and useDirection() for explicit direction logic in custom components.
  • A <DirArrow> component for icons that need to mirror.

Locale resolution order

The active locale is decided in this priority order:

  1. Query string: ?locale=<code>.
  2. Authenticated user's stored preference (users.locale).
  3. Persistent cookie (pb_locale).
  4. Browser Accept-Language header.
  5. Application default.

Geo-location banner

When Cloudflare geolocation headers tag a visitor with a country whose locale is available, a non-intrusive banner suggests switching. The visitor can accept, dismiss, or ignore — Glozr never switches locale automatically.

Translation coverage

The dictionary is around 2,300 keys. Four locales are fully covered today; the rest translate the essential UI chrome (buttons, forms, navigation) and fall back to English for the long tail. A Node.js coverage command reports the current percentage per locale so you know where the gaps are.

Where translations live

  • lang/{locale}.json — the primary application dictionary.
  • lang/{locale}/{auth,validation,passwords,pagination}.php — Laravel framework messages.
  • lang/_glossary.md — terminology standards so translations stay consistent across the product.

Adding new strings

Wrap any user-facing text with the appropriate translation helper:

  • __('Text') in Blade templates.
  • t('Text') in React and the widget runtime.

Missing translations fall back to English without breaking the layout, so you can ship new copy before every locale is filled in.