Le blog

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

Et vous ? Aviez-vous déjà croisé ce cas d’usage ou cette problématique ? Dites-le nous sur Twitter ou Mastodon, notre équipe également peut vous aider dans ces problématiques de développement.

Emmanuel Averty

Emmanuel Averty

Backend developer

Mots-clésAlpine Linux, Symfony, Tech

Le blog

Pour aller plus loin