Apparence
Internationalisation
Slab est multilingue et multidevise. La traduction se joue sur trois plans distincts — le contenu (sur les modèles), l'interface (fichiers de langue) et la navigation (routes localisées) — tandis que langues, devises et zones sont des données gérées en base.
Langues, devises et zones en base
Language (locale, name, is_active), Currency (iso, name, exchange_rate, is_active) et Area (iso, name) sont des modèles persistés et activables. Point clé : la liste des locales supportées du site n'est pas figée en config — LanguageServiceProvider la (re)construit au boot à partir des langues actives en base, puis la passe à laravel-localization. Activer une langue dans le back-office l'ajoute donc au site ; un observer matérialise au passage son dossier lang/<locale> (création, renommage, suppression). La langue de repli reste app.fallback_locale, la devise par défaut shop.default_currency_iso.
Traduire le contenu (modèles)
Le contenu éditorial est porté par les modèles via le trait HasTranslations (spatie/laravel-translatable), stocké en colonnes JSON : Product, Page et Category traduisent slug + name ; la plupart des autres (Attribute, Tax, OrderStatus…) traduisent name. La lecture suit la locale courante ; getTranslations('name') donne toutes les langues (ce que consomment les éditeurs du BO). Pour rendre votre propre modèle multilingue, voir modèles.
Traduire l'interface (fichiers de langue)
Les libellés, e-mails et messages vivent dans des fichiers de langue sous le namespace de chaque package : framework:: et frontend:: les déclarent via loadTranslationsFrom ; le skeleton porte les groupes globaux (auth, validation, passwords, et les chaînes JSON). L'éditeur de traductions du back-office découvre ces namespaces automatiquement — il interroge le loader du translator Laravel, donc tout package qui appelle loadTranslationsFrom apparaît sans réglage. Il permet l'édition en ligne et l'export/import JSON par langue.
TIP
Sans loadTranslationsFrom, les traductions de votre package restent invisibles à l'éditeur BO.
Routes localisées
Le front est servi sous un préfixe de locale (laravel-localization), avec les middlewares localeSessionRedirect, localizationRedirect, localeViewPath et localize. Les segments d'URL eux-mêmes sont traduits : les routes passent par LaravelLocalization::transRoute('frontend::routes.…'), résolu depuis lang/<locale>/routes.php. La locale par défaut n'apparaît pas dans l'URL (hideDefaultLocaleInURL).
Devise d'affichage courante
La devise d'affichage est résolue par CurrentCurrencyResolver : un cookie (shop.cookies.currency) sinon la devise par défaut. Le binding est scopé à la requête et substituable ; un changement émet CurrencyChanged, dont un listener persiste la préférence sur le User/Guest. Le calcul en devise relève du pipeline de prix, pas de l'affichage.
Par où l'étendre
| Je veux… | Point d'extension | Mécanique |
|---|---|---|
| traduire les libellés de mon package | loadTranslationsFrom(__DIR__.'/../lang', 'mon-pkg') | namespaces de lang |
| rendre un modèle multilingue | trait HasTranslations (colonnes JSON) | modèles |
| ajouter une langue au site | activer une ligne dans Langues (BO) → table languages | — |
| changer la devise d'affichage courante | CurrentCurrencyResolver (bind) | résolveurs |
Voir aussi
- Les résolveurs — la devise courante.
- Modèles & relations —
HasTranslations. - Pricing & taxe — le calcul en devise.