{"id":1959,"date":"2025-06-20T14:55:45","date_gmt":"2025-06-20T18:55:45","guid":{"rendered":"https:\/\/rumandcode.io\/quand-votre-code-parle-une-autre-langue-les-pieges-meconnus-de-la-traduction\/"},"modified":"2025-06-20T14:55:45","modified_gmt":"2025-06-20T18:55:45","slug":"quand-votre-code-parle-une-autre-langue-les-pieges-meconnus-de-la-traduction","status":"publish","type":"post","link":"https:\/\/rumandcode.io\/en\/quand-votre-code-parle-une-autre-langue-les-pieges-meconnus-de-la-traduction\/","title":{"rendered":"Quand votre code parle une autre langue : Les pi\u00e8ges m\u00e9connus de la traduction"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Traduire une application web peut sembler trivial \u00e0 premi\u00e8re vue. Apr\u00e8s tout, avec les avanc\u00e9es de l\u2019intelligence artificielle, une multitude d\u2019outils facilitent grandement cette t\u00e2che. Pourtant, entre les r\u00e8gles de pluriel, l\u2019ordre des mots, la direction du texte et les subtilit\u00e9s du contenu dynamique, traduire correctement devient vite un v\u00e9ritable casse-t\u00eate\u2026 \u00e0 moins d\u2019une planification rigoureuse.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Un client nous a r\u00e9cemment contact\u00e9s pour traduire son syst\u00e8me de gestion d\u2019inventaire, utilis\u00e9 dans des magasins \u00e0 grande surface, du fran\u00e7ais vers l\u2019anglais. Ce projet nous a permis de revisiter nos bonnes pratiques et de tomber dans quelques pi\u00e8ges, que nous avons d\u00fb r\u00e9soudre avec ing\u00e9niosit\u00e9. Voici ce qu\u2019on a retenu de l\u2019exp\u00e9rience.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Le contenu statique<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Chaque environnement technologique (<a href=\"https:\/\/laravel.com\/docs\/11.x\/localization\" target=\"_blank\" rel=\"noreferrer noopener\">Laravel<\/a>, <a href=\"https:\/\/symfony.com\/doc\/current\/translation.html\" target=\"_blank\" rel=\"noreferrer noopener\">Symfony<\/a>, <a href=\"https:\/\/hexdocs.pm\/gettext\/Gettext.html\" target=\"_blank\" rel=\"noreferrer noopener\">Phoenix<\/a>, <a href=\"https:\/\/guides.rubyonrails.org\/i18n.html\" target=\"_blank\" rel=\"noreferrer noopener\">Rails<\/a>, etc.) dispose de son propre syst\u00e8me de traduction pour g\u00e9rer le contenu statique. Sans entrer dans les d\u00e9tails sp\u00e9cifiques \u00e0 chaque librairie, nous allons plut\u00f4t aborder les \u00e9l\u00e9ments communs qu\u2019il est essentiel de comprendre pour bien les utiliser.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Pour commencer, Il est important de comprendre que lorsqu\u2019on parle de contenu statique, nous parlons de texte qui est d\u00e9fini \u00e0 l\u2019avance \u00e0 l\u2019int\u00e9rieur du code de l\u2019application et non pas de texte qui ne change jamais. Un exemple pourrait \u00eatre un libell\u00e9 qui indique le nombre de r\u00e9sultats d\u2019une requ\u00eate:<\/p>\n\n\n\n<figure data-module=\"Figcaption\" class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1920\" height=\"350\" src=\"https:\/\/rumandcode.io\/app\/uploads\/2025\/06\/article-de-blogue-a-simon-2.png\" alt=\"\" class=\"wp-image-1162\" srcset=\"https:\/\/rumandcode.io\/app\/uploads\/2025\/06\/article-de-blogue-a-simon-2.png 1920w, https:\/\/rumandcode.io\/app\/uploads\/2025\/06\/article-de-blogue-a-simon-2-1024x187.png 1024w, https:\/\/rumandcode.io\/app\/uploads\/2025\/06\/article-de-blogue-a-simon-2-500x91.png 500w, https:\/\/rumandcode.io\/app\/uploads\/2025\/06\/article-de-blogue-a-simon-2-768x140.png 768w, https:\/\/rumandcode.io\/app\/uploads\/2025\/06\/article-de-blogue-a-simon-2-1536x280.png 1536w\" sizes=\"auto, (max-width: 1920px) 100vw, 1920px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Aussi simple ces deux mots puissent para\u00eetre, ils ont \u00e9norm\u00e9ment de subtilit\u00e9s et les voici.&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Le pluriel<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">L\u2019un des aspects qui varie le plus d\u2019une langue \u00e0 l\u2019autre est la mani\u00e8re de g\u00e9rer le pluriel. Il est dangereux de supposer que les r\u00e8gles sont identiques, m\u00eame au sein d\u2019une m\u00eame famille linguistique.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Un pi\u00e8ge par lequel \u00e9norm\u00e9ment de personnes se font prendre est de simplement ajouter un s lorsqu\u2019il y a plus d\u2019un r\u00e9sultat. Par exemple, en JavaScript, on pourrait l\u2019\u00e9crire ainsi:<\/p>\n\n\n\n<figure data-module=\"Figcaption\" class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1044\" height=\"640\" src=\"https:\/\/rumandcode.io\/app\/uploads\/2025\/06\/pluriel-1.png\" alt=\"\" class=\"wp-image-1169\" srcset=\"https:\/\/rumandcode.io\/app\/uploads\/2025\/06\/pluriel-1.png 1044w, https:\/\/rumandcode.io\/app\/uploads\/2025\/06\/pluriel-1-1024x628.png 1024w, https:\/\/rumandcode.io\/app\/uploads\/2025\/06\/pluriel-1-500x307.png 500w, https:\/\/rumandcode.io\/app\/uploads\/2025\/06\/pluriel-1-768x471.png 768w\" sizes=\"auto, (max-width: 1044px) 100vw, 1044px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Malgr\u00e9 sa simplicit\u00e9, ce code comporte plusieurs erreurs :<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">D\u2019abord, en fran\u00e7ais comme en anglais, tous les mots ne prennent pas un \u00ab s \u00bb au pluriel. Il existe de nombreux mots irr\u00e9guliers, comme \u00ab cheval \u00bb qui devient \u00ab chevaux \u00bb en fran\u00e7ais, ou \u00ab octopus \u00bb qui peut devenir \u00ab octopi \u00bb ou \u00ab octopuses \u00bb en anglais. M\u00eame en codant une logique pour g\u00e9rer les exceptions, ces r\u00e8gles varient d\u2019une langue \u00e0 l\u2019autre.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ensuite, la r\u00e8gle grammaticale diff\u00e8re pour le cas du z\u00e9ro. En anglais, on accorde g\u00e9n\u00e9ralement le nom au pluriel m\u00eame en l\u2019absence d\u2019objet, comme dans \u00ab There are no results \u00bb. Il faut donc afficher \u00ab 0 results \u00bb, alors qu\u2019en fran\u00e7ais, on \u00e9crit \u00ab 0 r\u00e9sultat \u00bb, au singulier.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La meilleure solution consiste \u00e0 utiliser les fonctions de gestion du pluriel fournies par les biblioth\u00e8ques d\u2019internationalisation. Chaque langue traduite aura donc ses propres d\u00e9clinaisons de chaque cha\u00eene de caract\u00e8res accord\u00e9es selon le nombre d\u2019entr\u00e9es.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Voici un exemple avec la librairie JavaScript i18n-js:<\/p>\n\n\n\n<figure data-module=\"Figcaption\" class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1044\" height=\"1124\" src=\"https:\/\/rumandcode.io\/app\/uploads\/2025\/06\/pluriel-2.png\" alt=\"\" class=\"wp-image-1170\" srcset=\"https:\/\/rumandcode.io\/app\/uploads\/2025\/06\/pluriel-2.png 1044w, https:\/\/rumandcode.io\/app\/uploads\/2025\/06\/pluriel-2-1024x1102.png 1024w, https:\/\/rumandcode.io\/app\/uploads\/2025\/06\/pluriel-2-500x538.png 500w, https:\/\/rumandcode.io\/app\/uploads\/2025\/06\/pluriel-2-768x827.png 768w\" sizes=\"auto, (max-width: 1044px) 100vw, 1044px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">M\u00eame si les r\u00e8gles sont similaires pour le fran\u00e7ais et l\u2019anglais, d\u2019autres langues pr\u00e9sentent bien plus de complexit\u00e9. Les biblioth\u00e8ques modernes permettent g\u00e9n\u00e9ralement de les g\u00e9rer correctement.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Il est crucial de reconna\u00eetre que les r\u00e8gles grammaticales de comptage varient consid\u00e9rablement d&#8217;une langue \u00e0 l&#8217;autre. Avant de se lancer dans la traduction, il est imp\u00e9ratif de mener une recherche approfondie sur les r\u00e8gles sp\u00e9cifiques de la langue cible. Une compr\u00e9hension solide de ces r\u00e8gles est essentielle pour \u00e9viter des erreurs co\u00fbteuses et garantir une communication claire et pr\u00e9cise. Vous pouvez trouver un article (en anglais) qui explique diff\u00e9rentes r\u00e8gles de pluriel <a href=\"https:\/\/cldr.unicode.org\/index\/cldr-spec\/plural-rules\" target=\"_blank\" rel=\"noreferrer noopener\">ici<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">L\u2019ordre des mots<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Il est facile de tomber dans le pi\u00e8ge qui consiste \u00e0 croire que toutes les langues suivent le m\u00eame ordre de mots que le fran\u00e7ais ou l\u2019anglais.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Chez Rum&amp;Code, m\u00eame si nos applications sont principalement traduites en anglais et en fran\u00e7ais, nous pr\u00e9parons d\u00e8s le d\u00e9part nos interfaces pour qu\u2019elles puissent s\u2019adapter facilement \u00e0 d\u2019autres langues, sans n\u00e9cessiter de modifications majeures du code.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En japonais, par exemple, l&#8217;ordre des mots diff\u00e8re de celui du fran\u00e7ais. Le nombre suit g\u00e9n\u00e9ralement le nom. Ainsi, l&#8217;expression \u00ab 5 r\u00e9sultats \u00bb se traduirait par \u7d50\u679c\u304c5\u4ef6 (kekka ga 5 ken). Dans cette formulation, \u7d50\u679c (kekka) signifie r\u00e9sultats, \u304c (ga) est une particule grammaticale, 5 repr\u00e9sente le nombre et \u4ef6 (ken) est un classificateur num\u00e9rique utilis\u00e9 pour d\u00e9signer des objets physiques ou des documents.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">C\u2019est pour cette raison qu\u2019il est crucial de toujours traduire des phrases compl\u00e8tes et non des mots isol\u00e9s. Chaque langue a sa propre structure, et il faut en tenir compte pour que le r\u00e9sultat soit naturel et correct.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Voici comment utiliser la librairie de notre exemple pr\u00e9c\u00e9dent avec l\u2019ajout du Japonais:<\/p>\n\n\n\n<figure data-module=\"Figcaption\" class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1044\" height=\"1124\" src=\"https:\/\/rumandcode.io\/app\/uploads\/2025\/06\/pluriel-3.png\" alt=\"\" class=\"wp-image-1171\" srcset=\"https:\/\/rumandcode.io\/app\/uploads\/2025\/06\/pluriel-3.png 1044w, https:\/\/rumandcode.io\/app\/uploads\/2025\/06\/pluriel-3-1024x1102.png 1024w, https:\/\/rumandcode.io\/app\/uploads\/2025\/06\/pluriel-3-500x538.png 500w, https:\/\/rumandcode.io\/app\/uploads\/2025\/06\/pluriel-3-768x827.png 768w\" sizes=\"auto, (max-width: 1044px) 100vw, 1044px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">La direction du texte<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Certaines langues, comme l\u2019arabe ou l\u2019h\u00e9breu, s\u2019\u00e9crivent de droite \u00e0 gauche. Cette diff\u00e9rence fondamentale de direction modifie profond\u00e9ment la fa\u00e7on dont une interface doit \u00eatre con\u00e7ue.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Traduire une application pour ces langues demande d\u2019adapter l\u2019ensemble de l\u2019interface, et pas seulement les textes. Il faut repenser l\u2019emplacement des \u00e9l\u00e9ments visuels, les formulaires, les ic\u00f4nes directionnelles et l\u2019ordre de navigation.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Par exemple, sur la version arabe de la page d\u2019accueil de YouTube, tous les \u00e9l\u00e9ments qui apparaissent \u00e0 gauche dans la version anglaise se retrouvent \u00e0 droite. Cela correspond au sens de lecture naturel de l\u2019utilisateur.<\/p>\n\n\n\n<figure data-module=\"Figcaption\" class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXdlw9OMEwPjmMsigUVtNzThq1GUN57AlPRh2ZAB7-KG8IRasJ5w1eJ7iPsRJRjon94xPet6qyI_88QgpK7N4d4q-FPiZwyKHZJtrrvGVKyHMJCJpeLDi8sDzkNm9yrRXP_9Bhee5g?key=y-7WKaSBaAxtWMyE_Loe4A\" alt=\"\"\/><\/figure>\n\n\n\n<figure data-module=\"Figcaption\" class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXeAvgDPibPCIb3iMo4KbmuEzRKX6qhc0s5J0a-T3m8e-LsAfV8vUhA8miGuAFXae17VFnTxxOA4G8dm7LQ5ztYIFELrsuiQKO-HuDJ_fN3jXhLDka3oga8YRlnN2Vo2iTmNxNfb4w?key=y-7WKaSBaAxtWMyE_Loe4A\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Une telle transformation n\u00e9cessite souvent une refonte compl\u00e8te de l\u2019interface. Cela peut devenir tr\u00e8s complexe, surtout si la logique applicative est \u00e9troitement li\u00e9e \u00e0 l\u2019interface, comme c\u2019est souvent le cas avec des librairies telles que <a href=\"https:\/\/react.dev\/\" target=\"_blank\" rel=\"noreferrer noopener\">React <\/a>ou <a href=\"http:\/\/vuejs.org\" target=\"_blank\" rel=\"noreferrer noopener\">Vue.JS<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Heureusement, CSS contient plusieurs outils tels que les propri\u00e9t\u00e9s logiques comme padding-inline-end pour remplacer les propri\u00e9t\u00e9s physiques comme padding-right. padding-inline-end ajuste le padding \u00e0 la fin de la direction en ligne, s&#8217;adaptant automatiquement aux langues allant de gauche \u00e0 droite et de droite \u00e0 gauche. Prenez par exemple la propri\u00e9t\u00e9 padding-inline-end: 20px cette derni\u00e8re fonctionne de mani\u00e8re fluide et se positionne donc automatiquement \u00e0 la fin de la ligne selon la direction du texte, contrairement \u00e0 padding-right: 20px qui sera toujours \u00e0 droite des \u00e9l\u00e9ments. Cette approche r\u00e9duit la quantit\u00e9 de code \u00e0 \u00e9crire pour am\u00e9liorer l&#8217;adaptabilit\u00e9.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Pour en apprendre plus sur la directionnalit\u00e9 du texte, vous pouvez vous r\u00e9f\u00e9rer \u00e0 cet article sur\u00a0 MDN (Mozilla Developer Network): <a href=\"https:\/\/developer.mozilla.org\/fr\/docs\/Learn_web_development\/Core\/Styling_basics\/Handling_different_text_directions\" target=\"_blank\" rel=\"noreferrer noopener\">G\u00e9rer la directionnalit\u00e9 du texte &#8211; Apprendre le d\u00e9veloppement web | MDN<\/a><\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Le contenu dynamique<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Les textes d\u2019une application ne sont pas tous \u00e9quivalents au niveau de la traduction. Le contenu dynamique est sans doute l\u2019\u00e9l\u00e9ment le plus complexe \u00e0 traduire. Il s\u2019agit de texte qui \u00e9volue au fil de l\u2019utilisation de l\u2019application, g\u00e9n\u00e9r\u00e9 par les utilisateurs eux-m\u00eames ou par des syst\u00e8mes externes. Contrairement au contenu statique, ce texte n\u2019est pas d\u00e9fini dans le code.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Un bon exemple de contenu dynamique est l\u2019article que vous lisez actuellement. Aucun code n\u2019a \u00e9t\u00e9 \u00e9crit pour l\u2019ajouter \u00e0 notre site. La traduction de contenu dynamique est complexe, car elle doit s\u2019adapter \u00e0 la logique d\u2019affaire de l\u2019application. Chaque type de contenu peut n\u00e9cessiter une strat\u00e9gie de traduction diff\u00e9rente. Explorons trois approches, \u00e0 travers le cas d\u2019un blogue.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Utilisation d&#8217;un identifiant de langue<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Une premi\u00e8re approche consiste \u00e0 ajouter un identifiant sur chaque article pour indiquer la langue dans laquelle il a \u00e9t\u00e9 r\u00e9dig\u00e9. Ainsi, chaque article est associ\u00e9 \u00e0 une langue.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Cette m\u00e9thode pr\u00e9sente l\u2019avantage d\u2019\u00eatre simple \u00e0 mettre en \u0153uvre. Il suffit d\u2019ajouter une colonne dans la base de donn\u00e9es et de filtrer les articles affich\u00e9s en fonction de la langue de l\u2019interface utilisateur.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Cependant, cette simplicit\u00e9 a un co\u00fbt. Il faut appliquer des filtres sur chaque page o\u00f9 les articles sont affich\u00e9s, ce qui peut devenir fastidieux selon la taille de l\u2019application. De plus, les articles ne sont pas r\u00e9ellement traduits, mais existent en plusieurs versions parall\u00e8les. Si un article est partag\u00e9, rien ne garantit que le lecteur sera redirig\u00e9 vers la version dans sa langue, ce qui peut n\u00e9cessiter une logique suppl\u00e9mentaire assez lourde \u00e0 maintenir.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Utilisation de colonnes traduites<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Une deuxi\u00e8me approche pour r\u00e9gler le probl\u00e8me du contenu dynamique, peut \u00eatre d&#8217;ajouter des colonnes avec un identifiant de langue. En d&#8217;autres mots, si notre mod\u00e8le ressemblait \u00e0 ceci:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Id<\/strong><\/td><td><strong>Titre<\/strong><\/td><td><strong>Contenu<\/strong><\/td><\/tr><tr><td><strong>1<\/strong><\/td><td>Bonjour le monde<\/td><td>Lorem ipsum dolor sit amet.<\/td><\/tr><tr><td><strong>2<\/strong><\/td><td>Un nouveau d\u00e9part<\/td><td>Suspendisse et felis ornare, mollis.<\/td><\/tr><tr><td><strong>3<\/strong><\/td><td>Annonce<\/td><td>Nam vitae dui ultrices, maximus.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Nous pourrions le modifier pour ajouter des colonnes traduites et indiquer la langue du contenu dans le nom de chaque colonne, par exemple, comme ceci:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Id<\/strong><\/td><td><strong>Titre_FR<\/strong><\/td><td><strong>Titre_EN<\/strong><\/td><td><strong>Contenu_FR<\/strong><\/td><td><strong>Contenu_EN<\/strong><\/td><\/tr><tr><td><strong>1<\/strong><\/td><td>Bonjour le monde<\/td><td>Hello world<\/td><td>Lorem ipsum dolor sit amet.<\/td><td>Mauris porttitor turpis a arcu.<\/td><\/tr><tr><td><strong>2<\/strong><\/td><td>Un nouveau d\u00e9part<\/td><td>A new start<\/td><td>Suspendisse et felis ornare, mollis.<\/td><td>Etiam ultricies quis augue at.<\/td><\/tr><tr><td><strong>3<\/strong><\/td><td>Annonce<\/td><td>Announcement<\/td><td>Nam vitae dui ultrices, maximus.<\/td><td>Proin aliquet turpis ac fermentum.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">L\u2019avantage ici, est que la gestion des articles sera significativement plus simple. Il suffit d\u2019ajuster notre code pour lire la bonne colonne selon la langue de l\u2019utilisateur.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Cependant, cette solution implique plusieurs contraintes:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Il faut maintenant ajouter des colonnes \u00e0 notre article \u00e0 chaque fois que l\u2019on introduit une nouvelle langue \u00e0 l\u2019application;<\/li>\n\n\n\n<li>Il faut adapter les formulaires de l\u2019application pour permettre l\u2019entr\u00e9e des champs des diff\u00e9rentes langues;<\/li>\n\n\n\n<li>Les articles devront \u00eatre traduits au moment de leur cr\u00e9ation (ou l\u2019on doit ajouter une gestion sp\u00e9ciale pour ne pas afficher les articles non-traduits);<\/li>\n\n\n\n<li>Il faut ajouter de la logique \u00e0 l\u2019application pour tra\u00eeter les diff\u00e9rentes colonnes.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Cette m\u00e9thode est efficace si l\u2019on ne pr\u00e9voit que deux langues, mais elle devient difficilement viable d\u00e8s que le nombre de langues augmente.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Utilisation d\u2019une table de traduction<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Une troisi\u00e8me approche serait de cr\u00e9er une table de traductions qui sera utilis\u00e9e par toutes nos tables en base de donn\u00e9es. <strong>Une table de ce genre contient typiquement cinq colonnes:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>le nom du mod\u00e8le traduit (dans notre cas, \u00ab articles de blogue \u00bb)<\/li>\n\n\n\n<li>un identifiant unique pour le mod\u00e8le (dans notre cas, le num\u00e9ro de l\u2019article)<\/li>\n\n\n\n<li>le champ traduit<\/li>\n\n\n\n<li>la langue de traduction<\/li>\n\n\n\n<li>le contenu<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Cette m\u00e9thode offre une grande flexibilit\u00e9. Elle \u00e9vite de modifier le sch\u00e9ma de base de donn\u00e9es \u00e0 chaque nouvelle langue, et centralise la gestion de la traduction.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Toutefois, cette flexibilit\u00e9 a un prix. Si la table devient trop volumineuse, elle peut ralentir l\u2019ensemble de l\u2019application. Il est donc essentiel de mettre en place des m\u00e9canismes de surveillance des performances et d\u2019optimisation pour garantir la stabilit\u00e9 de l\u2019application.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Les sources de traductions<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Une fois votre architecture de traduction mise en place, la question devient : comment obtenir les traductions ? Collaborer avec des traducteurs externes n\u00e9cessite de choisir la bonne approche selon vos besoins et votre budget.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Fichiers de traduction simples<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">L&#8217;approche la plus directe consiste \u00e0 fournir les fichiers de traduction aux traducteurs. Le format de ces fichiers va varier selon la librairie utilis\u00e9e. Voici quelques exemples de formats:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Les fichiers .po de gettext, utilis\u00e9s par Elixir Phoenix:<\/p>\n\n\n\n<figure data-module=\"Figcaption\" class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1044\" height=\"490\" src=\"https:\/\/rumandcode.io\/app\/uploads\/2025\/06\/fichier-traduction-1.png\" alt=\"\" class=\"wp-image-1172\" srcset=\"https:\/\/rumandcode.io\/app\/uploads\/2025\/06\/fichier-traduction-1.png 1044w, https:\/\/rumandcode.io\/app\/uploads\/2025\/06\/fichier-traduction-1-1024x481.png 1024w, https:\/\/rumandcode.io\/app\/uploads\/2025\/06\/fichier-traduction-1-500x235.png 500w, https:\/\/rumandcode.io\/app\/uploads\/2025\/06\/fichier-traduction-1-768x360.png 768w\" sizes=\"auto, (max-width: 1044px) 100vw, 1044px\" \/><\/figure>\n\n\n\n<pre class=\"wp-block-code\"><code><br><br>Les fichiers .yaml, utilis\u00e9s par Ruby on Rails et i18n-js :<\/code><\/pre>\n\n\n\n<figure data-module=\"Figcaption\" class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1044\" height=\"528\" src=\"https:\/\/rumandcode.io\/app\/uploads\/2025\/06\/fichier-traduction-2.png\" alt=\"\" class=\"wp-image-1173\" srcset=\"https:\/\/rumandcode.io\/app\/uploads\/2025\/06\/fichier-traduction-2.png 1044w, https:\/\/rumandcode.io\/app\/uploads\/2025\/06\/fichier-traduction-2-1024x518.png 1024w, https:\/\/rumandcode.io\/app\/uploads\/2025\/06\/fichier-traduction-2-500x253.png 500w, https:\/\/rumandcode.io\/app\/uploads\/2025\/06\/fichier-traduction-2-768x388.png 768w\" sizes=\"auto, (max-width: 1044px) 100vw, 1044px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Cette m\u00e9thode est simple et gratuite, mais pr\u00e9sente certains d\u00e9fis : les traducteurs doivent comprendre la syntaxe technique, il n&#8217;y a pas de validation automatique, et la gestion des versions devient complexe avec plusieurs collaborateurs.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Solutions sp\u00e9cialis\u00e9es<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Pour une approche plus professionnelle, particuli\u00e8rement quand il y a beaucoup de contenu \u00e0 traduire, plusieurs langues cibles, ou une cadence de d\u00e9veloppement n\u00e9cessitant des traductions fr\u00e9quentes, des outils comme<a href=\"https:\/\/www.accent.reviews\/\"> Accent<\/a> (open source, auto-h\u00e9berg\u00e9) offrent une interface conviviale pour les traducteurs, avec validation automatique et gestion des versions. L&#8217;inconv\u00e9nient ? Il faut maintenir l&#8217;infrastructure.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Les solutions commerciales comme<a href=\"https:\/\/crowdin.com\/\"> Crowdin<\/a> \u00e9liminent la maintenance technique et offrent des fonctionnalit\u00e9s avanc\u00e9es comme la traduction assist\u00e9e par IA, la gestion de m\u00e9moire de traduction, et l\u2019int\u00e9gration dans votre processus de d\u00e9veloppement. Le principal inconv\u00e9nient est le co\u00fbt, qui peut \u00eatre un frein pour de petits projets.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Le choix d\u00e9pend de votre volume de contenu, de votre budget, et de la fr\u00e9quence des mises \u00e0 jour. Pour un projet ponctuel, des fichiers simples suffisent. Pour un projet multilingue \u00e9volutif, un outil sp\u00e9cialis\u00e9 devient vite indispensable.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Conclusion<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Traduire une application Web ne se r\u00e9sume pas \u00e0 un simple remplacement de mots. C&#8217;est un processus complexe qui n\u00e9cessite une planification minutieuse, une compr\u00e9hension profonde des nuances linguistiques et une architecture technique flexible.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En choisissant les bonnes approches pour la gestion du contenu statique et dynamique, et en \u00e9tant conscient des pi\u00e8ges potentiels, il est possible de cr\u00e9er une application Web v\u00e9ritablement multilingue et accessible \u00e0 tous. L&#8217;investissement initial dans une strat\u00e9gie de traduction robuste portera ses fruits en \u00e9largissant l\u2019accessibilit\u00e9 avec une port\u00e9e internationale et en offrant une exp\u00e9rience utilisateur de qualit\u00e9.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Vous envisagez de rendre votre application bilingue ou multilingue ? Nous pouvons vous accompagner pour poser les bonnes fondations d\u00e8s le d\u00e9part.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">-Simon Landry<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Traduire une application web peut sembler trivial \u00e0 premi\u00e8re vue. Apr\u00e8s tout, avec les avanc\u00e9es de l\u2019intelligence artificielle, une multitude d\u2019outils facilitent grandement cette t\u00e2che. Pourtant, entre les r\u00e8gles de pluriel, l\u2019ordre des mots, la direction du texte et les subtilit\u00e9s du contenu dynamique, traduire correctement devient vite un v\u00e9ritable casse-t\u00eate\u2026 \u00e0 moins d\u2019une planification [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":1967,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[53],"tags":[54,59,60,61],"class_list":["post-1959","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-technologie","tag-bonnes-pratiques-techniques","tag-developpement-multilingue","tag-rumcode-expertise","tag-traduction-dapplication-web"],"acf":[],"_links":{"self":[{"href":"https:\/\/rumandcode.io\/en\/wp-json\/wp\/v2\/posts\/1959","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/rumandcode.io\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/rumandcode.io\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/rumandcode.io\/en\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/rumandcode.io\/en\/wp-json\/wp\/v2\/comments?post=1959"}],"version-history":[{"count":0,"href":"https:\/\/rumandcode.io\/en\/wp-json\/wp\/v2\/posts\/1959\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/rumandcode.io\/en\/wp-json\/wp\/v2\/media\/1967"}],"wp:attachment":[{"href":"https:\/\/rumandcode.io\/en\/wp-json\/wp\/v2\/media?parent=1959"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/rumandcode.io\/en\/wp-json\/wp\/v2\/categories?post=1959"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/rumandcode.io\/en\/wp-json\/wp\/v2\/tags?post=1959"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}