
🔢 Traduction de nombres avec PHP et JavaScript : chiffres arabes en devanagari et inversement
Un utilisateur remplit un formulaire sur un site web et les chiffres se transforment en caractères illisibles. C’est une situation familière pour toute personne travaillant sur des projets multilingues: la version népalaise d’une boutique en ligne affiche les prix en अक्षर, et le formulaire de contact échoue à la validation à cause de chiffres «incorrects».
Le problème vient du fait que différentes langues utilisent différents systèmes de numération. L’anglais et le russe utilisent les chiffres arabes (0-9). Le hindi, le népalais et le marathi utilisent les symboles devanagari (०-९). PHP et JavaScript ne basculent pas de l’un à l’autre automatiquement. Pourtant, la tâche peut être résolue sans aucune bibliothèque externe, en utilisant uniquement les fonctions de chaîne natives. Aucune dépendance à installer, aucune API tierce.
Voici deux extraits de code prêts à l’emploi qui résolvent ce problème en 5 minutes. Pas de frameworks, pas de packages Composer, pas de dépendances npm, juste du PHP standard et du JavaScript vanilla. Copiez-les, remplacez les symboles par les vôtres, et cela fonctionne.
💡 Aperçu rapide:
- Copiez la fonction PHP dans le fichier functions.php de votre thème ou via le plugin Code Snippets; elle convertit les chiffres arabes en devanagari et inversement
- Pour le frontend, utilisez le code JavaScript prêt à l’emploi avec des objets dictionnaires pour une conversion à la volée directement dans le champ de saisie
- Le remplacement utilise une table de correspondance de glyphes plutôt qu’un calcul mathématique, ce qui rend la méthode universelle pour tout système d’écriture
- Testez-la: passez 1234 et obtenez १२३४, et vice versa; les deux sens fonctionnent de manière symétrique
Comment fonctionnent les systèmes de numération dans différentes langues
La plupart des sites web fonctionnent avec les chiffres arabes: 0 1 2 3 4 5 6 7 8 9. Historiquement, ce système vient d’Inde mais s’est répandu via le monde arabe, d’où son nom.
Des jeux de caractères alternatifs existent dans des dizaines de systèmes d’écriture. Le devanagari (hindi, népalais, marathi) utilise sa propre série: ० १ २ ३ ४ ५ ६ ७ ८ ९. Les chiffres arabes orientaux (arabe, persan, ourdou) utilisent un jeu différent: ٠ ١ ٢ ٣ ٤ ٥ ٦ ٧ ٨ ٩. Le bengali, le thaï et le khmer ont chacun leurs propres glyphes et leurs propres plages Unicode. Il existe plus d’une vingtaine de systèmes de ce type au total.
Mais la valeur numérique reste la même. 5, ५ et ٥ représentent tous le même nombre «cinq», simplement écrit avec des symboles différents. Par conséquent, la traduction entre systèmes est un remplacement de glyphes utilisant une table de correspondance, pas une conversion mathématique. Il n’y a rien à recalculer; vous avez juste besoin de connaître les paires de symboles correctes.
C’est exactement le principe qui sous-tend le code ci-dessous.
Étape 1: Convertir les nombres avec PHP

L’approche PHP est aussi simple que possible: la fonction str_replace() prend deux tableaux, ce qu’il faut chercher et par quoi remplacer. La chaîne est traitée en une seule passe, et toutes les correspondances sont remplacées.
Ajoutez ce code au fichier functions.php de votre thème enfant ou via le plugin Code Snippets. La fonction accepte un nombre ou une chaîne contenant des chiffres et retourne le résultat avec les symboles devanagari.
1 <?php 2 /** 3 * Converts Arabic numerals to Devanagari characters (Hindi, Nepali). 4 * 5 * @param string|int $input String or number to convert. 6 * @return string String with Devanagari numerals. 7 */ 8 function convert_to_devanagari($input) { 9 $english = array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9"); 10 $devanagari = array("०", "१", "२", "३", "४", "५", "६", "७", "८", "९"); 11 12 return str_replace($english, $devanagari, (string) $input); 13 } 14 15 /* Usage example */ 16 echo convert_to_devanagari(2026); 17 // Output: २०२६ 18 ?>
Ce qui se passe ici: str_replace() parcourt le tableau $english, et pour chaque élément (par exemple, "2") substitue l’élément correspondant de $devanagari ("२"). La conversion en (string) garantit que la fonction fonctionne à la fois avec des nombres et des chaînes.
La conversion inverse, du devanagari vers les chiffres arabes, se fait en échangeant les tableaux:
1 <?php 2 /** 3 * Converts Devanagari characters back to Arabic numerals. 4 * 5 * @param string $input String with Devanagari numerals. 6 * @return string String with Arabic numerals. 7 */ 8 function convert_from_devanagari($input) { 9 $english = array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9"); 10 $devanagari = array("०", "१", "२", "३", "४", "५", "६", "७", "८", "९"); 11 12 return str_replace($devanagari, $english, $input); 13 } 14 15 /* Example */ 16 echo convert_from_devanagari('२०२६'); 17 // Output: 2026 18 ?>
Les tableaux sont les mêmes; seul l’ordre des arguments change. Le premier tableau contient maintenant les symboles devanagari (ce que nous cherchons), le second contient les chiffres arabes (par quoi nous remplaçons).
Où l’utiliser. La fonction est utile partout dans le thème où des nombres sont affichés: prix des produits dans WooCommerce, dates dans les articles de blog, numérotation des pages. Enveloppez l’appel partout où vous avez besoin d’une localisation des chiffres pour une audience spécifique.
Gestion des cas particuliers en PHP
La fonction convert_to_devanagari() accepte string|int, mais en pratique l’entrée peut être n’importe quoi. Que se passe-t-il si vous passez null, une chaîne vide ou une chaîne sans chiffres? (string) null retourne une chaîne vide, et str_replace() avec une chaîne vide retourne également une chaîne vide sans erreur. Une chaîne sans chiffres (par exemple, "Hello") est retournée inchangée puisque le remplacement ne trouve aucune correspondance.
Si le nombre contient des séparateurs (virgules pour les milliers, un point pour les décimales), ils restent en place; seuls les chiffres eux-mêmes sont remplacés. Pour les nombres à virgule flottante, ce comportement est correct, mais si le formatage des nombres est important et que les séparateurs doivent changer selon la locale, ajoutez un traitement séparé via number_format() avant la conversion.
Pour les nombres très longs (par exemple, des identifiants à 20 chiffres), l’approche fonctionne sans changement: str_replace() traite des chaînes de n’importe quelle longueur, limitée uniquement par la mémoire PHP disponible. Les caractères devanagari occupent 3 octets chacun en UTF-8, donc la chaîne résultante sera plus longue que l’originale en octets. Pour le comptage des caractères, utilisez mb_strlen(), pas strlen().
Étape 2: Convertir les nombres avec JavaScript
Côté frontend, la même logique est implémentée en utilisant des objets dictionnaires et la méthode String.replace() avec une expression régulière. C’est pratique pour les interfaces dynamiques: l’utilisateur saisit un nombre dans un champ, et le script affiche instantanément l’équivalent devanagari.
Placez ce code dans un fichier .js séparé dans votre thème ou via wp_add_inline_script dans functions.php. Aucune dépendance, ES5 standard, fonctionne même dans les anciens navigateurs.
1 /** 2 * Dictionaries for translating between Arabic numerals and Devanagari. 3 */ 4 var englishToDevanagari = { 5 '0': '०', '1': '१', '2': '२', '3': '३', '4': '४', 6 '5': '५', '6': '६', '7': '७', '8': '८', '9': '९' 7 }; 8 9 var devanagariToEnglish = { 10 '०': '0', '१': '1', '२': '2', '३': '3', '४': '4', 11 '५': '5', '६': '6', '७': '7', '८': '8', '९': '9' 12 }; 13 14 /** 15 * Converts Arabic numerals in a string to Devanagari characters. 16 * @param {string|number} input 17 * @returns {string} 18 */ 19 function toDevanagari(input) { 20 return String(input).replace(/[0-9]/g, function(match) { 21 return englishToDevanagari[match]; 22 }); 23 } 24 25 /** 26 * Converts Devanagari characters to Arabic numerals. 27 * @param {string} input 28 * @returns {string} 29 */ 30 function fromDevanagari(input) { 31 return input.replace(/[०-९]/g, function(match) { 32 return devanagariToEnglish[match]; 33 }); 34 } 35 36 // Examples: 37 console.log(toDevanagari(9857)); // ९८५७ 38 console.log(fromDevanagari('१२३४')); // 1234
Le point clé est l’expression régulière /[0-9]/g. Le drapeau g (global) fait que replace() traite chaque chiffre de la chaîne, pas seulement le premier. La fonction de rappel anonyme reçoit le caractère correspondant et retourne son équivalent depuis le dictionnaire.
Pour les chiffres devanagari, la plage [०-९] est utilisée; en Unicode, ces caractères sont séquentiels, donc l’expression régulière fonctionne correctement.
Où l’utiliser. Saisie en direct dans les formulaires (conversion à la volée pendant la frappe), affichage des prix et des dates dans les versions localisées du site, conversion inverse avant l’envoi du formulaire au serveur afin que les chiffres arabes arrivent toujours en base de données.
Exemple pratique: formulaire de contact avec conversion à la volée
Combinons les deux approches dans une configuration fonctionnelle. Supposons que la version népalaise d’un site ait un formulaire de commande où l’utilisateur saisit un montant en devanagari. La tâche: afficher le nombre saisi dans les deux systèmes pour vérification et envoyer les chiffres arabes au serveur.
Le balisage du formulaire contient un <input> et un bloc d’aperçu. À chaque frappe dans le champ, le gestionnaire d’événement input se déclenche, appelle toDevanagari() et affiche le résultat dans un <span> adjacent. Lorsque le formulaire est soumis, fromDevanagari() se déclenche, et le corps de la requête POST envoyé au serveur contient des chiffres arabes. Le code PHP côté serveur reçoit le nombre au format standard et travaille avec comme d’habitude, sans conversion supplémentaire.
Ce même schéma s’applique aux champs de prix, aux dates, aux numéros de téléphone et à tout autre champ où l’utilisateur s’attend à voir son système de numération natif tandis que le système a besoin de stocker un format unifié. La conversion prend des microsecondes et n’affecte pas la réactivité de l’interface.
Voir aussi: vidéo sur les systèmes de numération en programmation
Pour un aperçu plus large du sujet sur le fonctionnement des systèmes de numération dans le code et comment convertir entre eux en JavaScript, regardez cette analyse par Techno Geek. Elle couvre les systèmes binaire, octal et décimal avec un projet prêt à l’emploi.
⁉️🤔 Foire aux questions
Cette même méthode peut-elle convertir les chiffres en arabe (symboles arabes orientaux)?
Oui. Remplacez le tableau devanagari par les symboles arabes orientaux:
array("٠", "١", "٢", "٣", "٤", "٥", "٦", "٧", "٨", "٩"). La logique est la même:str_replace()en PHP et un dictionnaire avec une expression régulière en JS. Cela s’adapte tout aussi facilement au bengali, au thaï, au khmer et à tout autre système d’écriture avec ses propres glyphes numériques.
Est-il sûr d’utiliser str_replace() pour les chaînes multi-octets en PHP?
Oui,
str_replace()fonctionne correctement avec UTF-8 et les caractères multi-octets, contrairement àstrpos()ousubstr()qui nécessitent des équivalents mbstring. Les symboles devanagari (२,३) occupent 3 octets chacun en UTF-8, maisstr_replace()les gère de manière sûre au niveau des octets car il recherche des correspondances exactes de séquences binaires. Il n’y aura aucun problème.
Que faire si la chaîne contient un mélange de chiffres arabes et de symboles devanagari?
Les deux fonctions traitent uniquement leurs plages respectives. Si
convert_to_devanagari()reçoit la chaîne"Price: 500 रुपय", le nombre500devient५००tandis que le texte reste intact. La fonction inverseconvert_from_devanagari()n’affecte que les chiffres devanagari. Une entrée mixte est gérée correctement automatiquement.
Comment puis-je appliquer la conversion à tous les nombres d’une page WordPress sans modifier chaque template?
Utilisez l’approche JavaScript de l’étape 2 et exécutez un parcours des nœuds du DOM au chargement de la page. Trouvez tous les nœuds texte contenant des chiffres (via
TreeWalkerou un parcours récursif dechildNodes) et appliqueztoDevanagari()à leur contenu. Pour l’approche PHP côté serveur, utilisez un filtre surthe_contentougettextsi les nombres sont intégrés dans les traductions.
Où puis-je trouver les tables de caractères pour d’autres systèmes d’écriture?
La source de référence est le Consortium Unicode. Pour les chiffres devanagari, il s’agit de la plage U+0966-U+096F. L’arabe oriental est U+0660-U+0669. Le bengali est U+09E6-U+09EF. Copiez simplement les caractères de la table et substituez-les dans les tableaux; le code n’a pas besoin d’être modifié.
Performance et limites de l’approche
str_replace() avec des tableaux de 10 éléments effectue exactement 10 comparaisons pour chaque position dans la chaîne. Pour une chaîne typique avec 5 à 10 chiffres, cela signifie 50 à 100 opérations; le temps d’exécution se mesure en microsecondes. En comparaison, l’approche utilisant preg_replace_callback() avec une expression régulière ajoute une surcharge pour la compilation du motif et l’invocation de la fonction de rappel pour chaque correspondance. La différence est imperceptible pour de petites chaînes, mais str_replace() l’emporte sur de gros volumes.
La principale limite de l’approche est qu’elle remplace les glyphes, pas la sémantique du nombre. Si vous avez besoin de faire de l’arithmétique sur des nombres devanagari (addition, multiplication), les symboles devanagari ne seront pas reconnus comme des nombres par PHP. Convertissez toujours en chiffres arabes avant les opérations mathématiques et reconvertissez ensuite. Ce n’est pas un défaut de la méthode mais une conséquence de la différence entre les systèmes d’écriture et les types de données numériques.
Autre nuance: la méthode suppose une correspondance biunivoque «un glyphe, un chiffre». Pour les systèmes d’écriture où les nombres sont écrits avec des ligatures composites (comme dans certains systèmes historiques), l’approche de remplacement simple ne fonctionnera pas. Mais pour toutes les écritures indiennes modernes (devanagari, bengali, gurmukhi, gujarati, odia, tamoul, télougou, kannada, malayalam), ainsi que pour les chiffres arabes orientaux, la correspondance est strictement de 1 pour 1, et la méthode fonctionne parfaitement.
Que déployer en production: PHP, JavaScript, ou les deux?
La solution PHP est destinée aux cas où les nombres doivent être rendus dans le système de symboles cible sur le serveur avant l’envoi du HTML. C’est correct pour le SEO: le moteur de recherche voit le contenu immédiatement dans la locale cible, pas des chiffres arabes qui sont ensuite remplacés par un script. Pour une boutique WooCommerce, cela signifie que les prix du catalogue et des pages produits sont indexés avec des chiffres devanagari, ce qui a un impact positif sur le classement dans les segments népalais et hindi.
La variante JavaScript est pour l’interaction dynamique: un champ de saisie avec aperçu instantané, un changement de langue sans rechargement de page, une conversion des données du formulaire avant soumission. Elle est également indispensable pour les applications monopages (SPA) où le serveur retourne du JSON avec des chiffres arabes et le frontend les affiche dans la locale de l’utilisateur.
En pratique, une combinaison fonctionne bien: PHP rend la page avec des chiffres localisés pour l’indexation, tandis que JavaScript gère la saisie utilisateur et convertit dans les deux sens à la volée. Les deux extraits de code, sans dépendances externes, font moins de 40 lignes au total, et ils résolvent complètement la tâche pour tout système d’écriture avec ses propres glyphes numériques.
Avant de déployer en production, testez trois scénarios: un appel direct de la fonction avec un nombre, une chaîne avec un contenu mixte (chiffres plus texte) et la conversion inverse. Assurez-vous que les chiffres arabes arrivent toujours au serveur, et que l’interface montre à l’utilisateur le système qui correspond à ses attentes linguistiques. Cinq minutes de test permettent d’économiser des heures de débogage sur le trafic réel.
Copiez les deux extraits de code dans votre projet, substituez les symboles nécessaires depuis la table Unicode pour votre système d’écriture, et la tâche est accomplie. Tout ce dont vous avez besoin est déjà intégré dans le langage.



