Internationalisation en PHP : créer des applications multilingues robustes avec Intl et ICU

Guide pratique pour séparer textes et code, choisir la locale et gérer catalogues, pluriels, nombres, devises et dates avec PHP Intl.

Internationalisation en PHP : créer des applications multilingues robustes avec Intl et ICU

Rendre une application PHP multilingue ne consiste pas à remplacer quelques phrases par un tableau. Un système fiable sépare le contenu de la logique, choisit la langue et la région de façon prévisible, formate correctement quantités, devises et dates, et prévoit une langue de repli.

Internationalisation et localisation

L’internationalisation prépare le logiciel à plusieurs langues et conventions culturelles ; la localisation fournit les textes et formats d’un public précis. Le code doit utiliser des clés stables comme checkout.total, tandis que les catalogues contiennent les traductions. Une correction éditoriale ne doit jamais imposer une modification du code.

Activer Intl et définir les locales

L’extension intl expose les fonctions ICU à PHP. En production, vérifiez extension_loaded('intl') et la version ICU disponible. Utilisez des identifiants explicites comme fr-FR. Ne dépendez pas de la valeur par défaut du serveur. Une liste blanche bloque les valeurs non prises en charge et les chemins arbitraires.

<?php
$supported = ['it-IT', 'en-GB', 'de-DE', 'fr-FR', 'es-ES', 'pt-PT'];
$requested = $_GET['lang'] ?? 'it-IT';
$locale = in_array($requested, $supported, true) ? $requested : 'it-IT';

$catalogue = require __DIR__ . '/lang/' . $locale . '.php';

function trans(string $key, array $vars = []): string {
    global $catalogue, $locale;
    $pattern = $catalogue[$key] ?? $key;
    $formatted = MessageFormatter::formatMessage($locale, $pattern, $vars);
    return $formatted === false ? $pattern : $formatted;
}

Les catalogues peuvent être des fichiers PHP ou JSON, ou provenir d’un service. Placez-les hors des répertoires publics, validez-les au déploiement et imposez un ensemble minimal commun de clés. Centralisez la stratégie de repli.

Messages dynamiques et pluriels

Concaténer des fragments impose le même ordre des mots à toutes les langues. MessageFormatter emploie les modèles ICU : chaque traduction contrôle l’ordre, les règles de pluriel et les formats intégrés. Transmettez des valeurs structurées et journalisez les erreurs Intl.

Nombres, devises et dates

Conservez des données neutres : montants en unités mineures ou dans un format décimal fiable, dates en UTC et devises sous forme de codes ISO. La présentation n’intervient qu’à la sortie. NumberFormatter adapte séparateurs et symboles mais ne convertit pas les taux de change. IntlDateFormatter applique langue, calendrier et fuseau horaire explicite.

<?php
$price = new NumberFormatter($locale, NumberFormatter::CURRENCY);
echo $price->formatCurrency(1299.90, 'EUR');

$date = new IntlDateFormatter(
    $locale,
    IntlDateFormatter::LONG,
    IntlDateFormatter::SHORT,
    'Europe/Rome'
);
echo $date->format(new DateTimeImmutable('2026-11-06 10:30:00'));

Choisir la langue

Une priorité pratique est la préférence enregistrée, le réglage de session validé, un cookie signé, Accept-Language, puis la langue de repli. L’en-tête du navigateur reste une indication, jamais un segment de chemin sûr. Conservez la locale canonique et générez des URL localisées cohérentes.

HTML, sécurité et SEO

Échappez les valeurs au rendu selon le contexte HTML, attribut ou JavaScript. Une traduction n’est pas du HTML fiable par défaut. Définissez l’attribut lang, publiez des liens hreflang et conservez une table stable pour les slugs traduits.

Tests et maintenance

Automatisez les contrôles du JSON, des clés manquantes, des paramètres incompatibles et des textes non traduits. Testez zéro, un et plusieurs éléments ainsi qu’une langue aux mots longs. Figez le fuseau horaire dans les tests et consignez les clés manquantes sans les afficher aux visiteurs.

Conclusion

Une architecture multilingue saine sépare logique métier et contenu, puis confie à ICU le formatage culturel. Avec locales validées, catalogues versionnés, replis explicites et tests automatiques, ajouter une langue devient une tâche éditoriale maîtrisée.

Partager

Quelle est votre réaction ?

Aimer Aimer 0
Je n'aime pas Je n'aime pas 0
Amour Amour 0
Drôle Drôle 0
En colère En colère 0
Triste Triste 0
Waouh Waouh 0