Aller au contenu

Points d'extension

phil/locale-dimensions

La librairie est du PHP simple et ne déclare ni service ni interface. Le paquet est en 0.x : ses types ne sont stables qu'à partir de sa version 1.0 ; d'ici là, une version mineure peut les changer, et son CHANGELOG dit comment.

Déclarer les locales

Un bundle lit les locales dans sa configuration et les construit une seule fois, à la construction du conteneur, pour qu'une déclaration mal formée échoue là et non à la première requête :

$services->set(DeclaredLocales::class)
    ->factory([DeclaredLocales::class, 'fromArray'])
    ->args([$config['locales']]);
locales:
    fr_CA: [fr, en]
    fr: [en]
    en: []

Gardez les clés telles qu'elles sont écrites : la normalisation par défaut de la configuration de Symfony lirait fr-CA comme fr_CA, là où la librairie le refuse.

Parcourir une chaîne

Une lecture demande la chaîne de la locale demandée, puis donne à resolve() les locales qui ont quelque chose à servir — les lignes d'une page, les traductions d'une fiche —, lues en une requête pour les locales de la chaîne :

$chain = $locales->chainFor($requested);
$available = $repository->localesOf($record, $chain->locales);
$served = $chain->resolve($available) ?? throw new NotFoundHttpException();

Une locale tapée par un visiteur est lue par Locale::fromString() ; son refus, et celui de chainFor() pour une locale qui n'est pas servie, sont l'endroit où répondre par une 404.