Aujourd’hui j’ai dû traiter une demande qui aurait pu être particulièrement fastidieuse. Le genre de demande qui ne demande pas particulièrement de compétences et s’avère très répétitive. Il s’agissait de modifier une page (ajouter un bloc, remplacer quelques textes, supprimer des éléments), et créer une nouvelle page en se basant sur une page déjà existante (en gros faire un copier/coller et remplacer certains textes/images/liens, mais pas tout).
Jusque là rien d’exceptionnel, si ce n’est qu’il fallait répercuter les modifications pour 16 langues. Avec un bon système de localisation aucune soucis, sauf que dans le cas présent les pages statiques comme celles à faire sont en html directement. On avait donc un dossier par langue avec la même arborescence et 16 fichiers html pour chaque page à modifier.
Mais l’essence même du travail d’un développeur c’est justement de concevoir, se prendre la tête et développer, des outils pour se faciliter la vie. Voici quelques détails de cette expérience. Les traductions à mettre en place étaient dans un fichier Excel, j’ai voulu l’exporter pour que le traitement soit le plus simple possible. En csv dans un premier temps, mais avec les langues type japonais ou coréen, on perdait l’encodage. Je suis passé par un export en web, et j’ai écrit un petit script js qui m’a généré un json avec le contenu des cellules, plus une clé de traduction:
{ "TEXT_1":{ "fr":"Texte", "en":"Text", "nl":"Tekst" }, "TEXT_2":{ "fr":"Texte", "en":"Text", "nl":"Tekst" } }
A partir de là j’ai écrit un script php pour aller lire le contenu de mes fichiers pour remplacer les occurrences de TEXT_1 par la valeur correspondant à la langue. Allez, puisque vous avez lu jusque là, en bonus le code php.
<?php $jsonTradList = file_get_contents('trad.json'); $jsonData = json_decode($jsonTradList, true); // Start from max to avoid replace _10 with _1 for($tradKey = 42; $tradKey >= 1; --$tradKey) { $line = 'TEXT_' . $tradKey; $lineTradList = $jsonData[$line]; foreach($lineTradList as $language => $lineTrad) { $filePath = $language . '/page.html'; replaceTrad($filePath, $line, $lineTrad); } } /** * Replaces a string in a file * * @param string $filePath the file path to replace * @param string $baseText text to be replaced * @param string $newText new text */ function replaceTrad($filePath, $baseText, $newText) { if(file_exists($filePath) === TRUE) { if(is_writeable($filePath)) { try { $fileContent = file_get_contents($filePath); $fileContent = str_replace($baseText, $newText, $fileContent); } catch(Exception $e) {} } } }
Rien de compliqué. J’ai fait une boucle simple pour partir de l’index de TEXT_ le plus élevé, pour ne pas remplacer TEXT_10 si TEXT_1 passait avant dans la vérification. Après avoir vérifié que le script fonctionnait j’ai pu passer à la dernière étape: remplacer les textes existants par les clés de traduction dans les fichiers html de toutes les langues. Je ne vais pas m’étendre très longtemps sur le sujet, j’utilise Eclipse pour développer, j’ai utilisé la recherche avec des expressions régulières. Quand la recherche avait 16 correspondances, je vérifiais que c’était bien une dans chaque langue et je faisais un remplacement partout. Par exemple:
<h2 class="mainTitle">(.*)</h2>
par
<h2 class="mainTitle">TEXT_1</h2>
Parfois Le plupart du temps c’était plus complexe bien sûr: expressions multi-lignes ou quelques assertions pour cibler correctement le contenu voulu, mais les regexp ne sont pas le sujet ici.
Bilan
J’aurais très bien pu partir et passer pas mal de temps à aller dans chaque fichier faire les modifications de texte, j’y aurait peut-être passé moins de temps puisqu’il n’y avait « que » 10 textes à remplacer (dans les 16 langues toujours). Mais je me serais ennuyé à mourir, j’aurais perdu mon temps, et à force de répéter les copier/coller depuis Excel dans les html j’aurais potentiellement fait plusieurs erreurs (mauvais copier/coller, mauvaise ligne ou colonne copiée, ne pas avoir sélectionné le texte entièrement, avoir remplacé au mauvais endroit…), d’autant plus que j’aurais été incapable de vérifier les textes dans pas mal de langues!
En ayant passé du temps à automatiser je n’ai pas eu l’impression de faire une tâche fastidieuse, je suis sûr qu’il n’y a pas d’erreur de saisie, et si on a une nouvelle demande je gagnerai du temps en réutilisant ce bout de code. Même si le script ne m’aura servi que dans ce cas particulier, c’est là le coeur du métier de développeur: perdre du temps à essayer d’en gagner! C’est là qu’on peut se poser la question. Si vous aviez eu une demande similaire, à savoir modifier 16 fois n textes, à partir de combien auriez-vous fait un travail d’automatisation? Dès le premier? le 2ème? plus? Je serai curieux d’avoir votre opinion.