Skip to content

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 configLanguageServiceProvider 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'extensionMécanique
traduire les libellés de mon packageloadTranslationsFrom(__DIR__.'/../lang', 'mon-pkg')namespaces de lang
rendre un modèle multilinguetrait HasTranslations (colonnes JSON)modèles
ajouter une langue au siteactiver une ligne dans Langues (BO) → table languages
changer la devise d'affichage couranteCurrentCurrencyResolver (bind)résolveurs

Voir aussi