Alpine Linux, les anglophones et le reste du monde
Publié le 24 février 2023
Alpine Linux est connu pour être une distribution particulièrement légère en termes de taille. Pour obtenir cette légèreté, des choix sont faits par l’équipe de développement pour ne retenir que les fonctionnalités qui leur semblent utiles. Cependant, ce qui est inutile pour certains peut être nécessaire pour d’autres.
Une demande simple
Récemment, un client m’a demandé de développer la génération de factures pour l’application dont je m’occupe. Le back-office ayant été fait avec Symfony, c’est tout naturellement que je me suis tourné vers Twig pour le rendu visuel.
Twig a l’énorme avantage d’intégrer des filtres permettant de transformer des nombres bruts en une chaîne de caractères représentant une somme d’argent. Par exemple, 1250 | format_currency(‘EUR’)
retourne €1,250.00
.
Ce n’est pas idéal car mon client est français, et ce format n’est pas celui qu’on utilise habituellement. La documentation de Twig nous indique donc que l’on peut forcer la locale grâce au paramètre éponyme. Je m’attends donc à ce que 1250 | format_currency(‘EUR’, locale=’fr’)
me retourne 1 250,00€
.
Et pourtant, j’obtiens toujours le résultat en format «américain», malgré mes différentes tentatives pour forcer la locale que ce soit au niveau du filtre ou grâce au LocaleSwitcher
de Symfony.
Pelle et pioche
Rien sur internet ne m’indique que le filtre format_currency
comporte un bug. Creusons dans l’implémentation de cette fonction. Elle utilise in fine la méthode NumberFormatter::formatCurrency
du module PHP intl
. Je me tourne donc vers ma configuration. Habituellement, j’utilise le container Docker officiel de PHP pour ce projet. Mais, en exécutant mon programme de test sur mon hôte (Ubuntu), tout fonctionne correctement. Pourtant, les versions de PHP sont identiques et le module intl
est installé et activé.
En examinant les librairies nécessaires à ce module, on retrouve ICU. Qu’en est-il de sa présence sur mon container :
$ apk list | grep icu
icu-libs-72.1-r1 x86_64 {icu} (MIT ICU Unicode-TOU) [installed]
icu-data-en-72.1-r1 x86_64 {icu} (MIT ICU Unicode-TOU) [installed]
Le voilà le problème ! Seules les données ICU pour l’anglais sont disponibles dans le container. Dans son souci de fournir des images les plus petites possibles, Alpine Linux fait l’impasse sur des données moins utilisées. Les anglo-saxons ne remarquent pas ce choix, c’est pourquoi il est assez difficile de trouver des informations via les moteurs de recherche.
Il me suffit donc d’ajouter dans mon Dockerfile l’installation du paquet icu-data-full
pour que tout fonctionne comme attendu.
Prochaine étape
L’installation du paquet icu-data-full
a substantiellement augmenté la taille de mon image (environ 30 Mo). Mon cas d’utilisation étant de générer des factures uniquement en français. Il faudrait idéalement créer un paquet Alpine contenant les données ICU dédiées au français à la manière de icu-data-en
.