{"id":319147,"date":"2023-02-06T10:42:31","date_gmt":"2023-02-06T09:42:31","guid":{"rendered":"https:\/\/blog.jetbrains.com\/?post_type=qodana&#038;p=319147"},"modified":"2025-09-18T08:35:32","modified_gmt":"2025-09-18T07:35:32","slug":"qodana-et-intellij-idea-comment-une-plateforme-de-controle-de-la-qualite-du-code-a-facilite-la-localisation-dun-ide","status":"publish","type":"qodana","link":"https:\/\/blog.jetbrains.com\/fr\/qodana\/2023\/02\/qodana-et-intellij-idea-comment-une-plateforme-de-controle-de-la-qualite-du-code-a-facilite-la-localisation-dun-ide\/","title":{"rendered":"Qodana et IntelliJ IDEA\u00a0: Comment une plateforme de contr\u00f4le de la qualit\u00e9 du code a facilit\u00e9 la localisation d&#8217;un IDE"},"content":{"rendered":"<p>Vous \u00eates-vous d\u00e9j\u00e0 demand\u00e9 comment faire pour que votre d\u00e9termination de d\u00e9but d&#8217;ann\u00e9e \u00e0 mener une vie plus saine, \u00e0 ne plus vous soucier de choses futiles ou \u00e0 maintenir un bon \u00e9quilibre entre votre vie professionnelle et votre vie personnelle, perdure au-del\u00e0 de la Saint-Valentin ? Selon les psychologues, fractionner des objectifs ambitieux en plusieurs petites \u00e9tapes est le meilleur moyen de parvenir \u00e0 tenir ses bonnes r\u00e9solutions.<\/p>\n<p>Ce conseil vaut \u00e9galement pour les bonnes r\u00e9solutions des programmeurs. Si vous planifiez un projet de grande envergure qui implique de refactoriser du code, il est souhaitable que vous ayez une bonne vue d&#8217;ensemble des changements \u00e0 effectuer et que vous vous organisiez en cons\u00e9quence. C&#8217;est exactement ce que l&#8217;\u00e9quipe d&#8217;IntelliJ a fait lorsqu&#8217;elle s&#8217;est attel\u00e9e au projet de localisation de l&#8217;interface utilisateur de l&#8217;IDE en chinois, japonais et cor\u00e9en.<\/p>\n<p>En faisant de Qodana, la plateforme de contr\u00f4le de la qualit\u00e9 du code de JetBrains, la source unique de v\u00e9rit\u00e9 pour son processus de localisation, l&#8217;\u00e9quipe d&#8217;IntelliJ a pu mener son projet \u00e0 bien beaucoup plus rapidement que pr\u00e9vu. Ce succ\u00e8s est le r\u00e9sultat de la mise en \u0153uvre d&#8217;une planification, d&#8217;une r\u00e9partition des responsabilit\u00e9s et d&#8217;une supervision judicieuses. Voici comment ils ont proc\u00e9d\u00e9.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-medium wp-image-321093\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2023\/02\/Qodana-IntelliJ_Blog_Featured_image_1280x600-1200x563.png\" alt=\"\" width=\"1200\" height=\"563\" \/><\/figure>\n<p align=\"center\"><a class=\"jb-download-button\" title=\"ESSAYER QODANA GRATUITEMENT\" href=\"https:\/\/www.jetbrains.com\/fr-fr\/qodana\/\" target=\"_blank\" rel=\"noopener noreferrer\"><i class=\"download-icon\"><\/i>ESSAYER QODANA GRATUITEMENT<\/a><\/p>\n<h3>Le challenge\u00a0: isoler 13\u00a0000\u00a0cha\u00eenes de caract\u00e8res cod\u00e9es en dur et suivre la progression de mani\u00e8re efficace<\/h3>\n<p>Pour simplifier la localisation de l&#8217;interface utilisateur dans trois langues diff\u00e9rentes, l&#8217;\u00e9quipe IntelliJ a extrait tous les \u00e9l\u00e9ments localisables du code source et les a plac\u00e9s dans des fichiers de propri\u00e9t\u00e9s distincts en vue de leur traduction.<\/p>\n<p>Avec plus de 13\u00a0000\u00a0cha\u00eenes de caract\u00e8res, il y a avait un risque assez \u00e9lev\u00e9 d&#8217;oublier des cha\u00eenes localisables, qui seraient donc rest\u00e9es dans le code. La gestion des cha\u00eenes cod\u00e9es en dur peut s&#8217;av\u00e9rer compliqu\u00e9e. Elles sont difficiles \u00e0 trouver car elles n&#8217;apparaissent pas avant que le logiciel ait \u00e9t\u00e9 localis\u00e9. Par cons\u00e9quent, si un utilisateur installait un pack linguistique pour utiliser l&#8217;interface dans sa langue, il y avait un risque de certaines parties de l&#8217;interface soient toujours en anglais.<\/p>\n<p>Le travail s&#8217;annon\u00e7ait fastidieux et r\u00e9p\u00e9titif pour l&#8217;\u00e9quipe, le responsable du projet de localisation a donc recherch\u00e9 une solution qui permettait\u00a0:<\/p>\n<ol>\n<li>d&#8217;automatiser une grande partie du travail gr\u00e2ce \u00e0 l&#8217;ex\u00e9cution d&#8217;une inspection de la base de code en continu pour d\u00e9tecter les litt\u00e9raux de cha\u00eenes cod\u00e9es en dur.<\/li>\n<li>de r\u00e9partir la responsabilit\u00e9 de la r\u00e9solution des probl\u00e8mes entre les d\u00e9veloppeurs.<\/li>\n<li>de superviser l&#8217;extraction des cha\u00eenes de caract\u00e8res localisables.<\/li>\n<\/ol>\n<h3>La solution\u00a0: une inspection du code automatis\u00e9e pour d\u00e9tecter les cha\u00eenes de litt\u00e9raux cod\u00e9es en dur<\/h3>\n<p>Le responsable du projet de localisation a choisi Qodana pour simplifier le processus d&#8217;inspection du code, ce qui a donn\u00e9 lieu \u00e0 un projet comportant les \u00e9tapes suivantes\u00a0:<\/p>\n<p><strong>#1. Connexion de Qodana \u00e0 TeamCity<\/strong><\/p>\n<p>L&#8217;\u00e9quipe d&#8217;IntelliJ a connect\u00e9 Qodana \u00e0 son <a href=\"https:\/\/www.jetbrains.com\/help\/qodana\/teamcity.html\" target=\"_blank\" rel=\"noopener\">pipeline TeamCity<\/a> et activ\u00e9 l&#8217;inspection de code <a href=\"https:\/\/www.jetbrains.com\/help\/idea\/hard-coded-string-literals.html\" target=\"_blank\" rel=\"noopener\"><em>Internationalization<\/em><\/a> afin de mettre en \u00e9vidence les litt\u00e9raux de cha\u00eene cod\u00e9s en dur qui n&#8217;avaient pas \u00e9t\u00e9 plac\u00e9s dans des fichiers de propri\u00e9t\u00e9s.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-312195\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2023\/01\/Example-string.png\" alt=\"\" width=\"1076\" height=\"360\" \/><\/figure>\n<p><strong>#2. Configuration du profil d&#8217;inspection<\/strong><\/p>\n<p>Dans le profil d&#8217;inspection, l&#8217;\u00e9quipe <a href=\"https:\/\/www.jetbrains.com\/help\/qodana\/qodana-yaml.html#Set+up+a+profile\" target=\"_blank\" rel=\"noopener\">a configur\u00e9 la port\u00e9e de l&#8217;inspection<\/a> pour s&#8217;assurer que la plateforme ignore les \u00e9l\u00e9ments tels que le code h\u00e9rit\u00e9, les litt\u00e9raux sans caract\u00e8res alphab\u00e9tiques et les cha\u00eenes de caract\u00e8res compos\u00e9es uniquement d&#8217;espaces blancs.<\/p>\n<p>L&#8217;\u00e9quipe a \u00e9galement veill\u00e9 \u00e0 ce que TeamCity g\u00e9n\u00e8re un rapport de test pour chaque ligne v\u00e9rifi\u00e9e par Qodana et signale comme \u00e9chec toute cha\u00eene non extraite.<\/p>\n<p><strong>#3. D\u00e9finition de la fr\u00e9quence des inspections<\/strong><\/p>\n<p>Une fois configur\u00e9e, Qodana a \u00e9t\u00e9 param\u00e9tr\u00e9e pour inspecter le code toutes les 4\u00a0heures. Il \u00e9tait particuli\u00e8rement important que l&#8217;inspection s&#8217;ex\u00e9cute de mani\u00e8re ind\u00e9pendante sur le serveur, et non sur la machine locale d&#8217;une personne. Cela a permis \u00e0 l&#8217;\u00e9quipe de gagner un temps pr\u00e9cieux.<\/p>\n<p>La premi\u00e8re ex\u00e9cution de Qodana a r\u00e9sult\u00e9 en 10\u00a0000\u00a0tests \u00e9chou\u00e9s dans TeamCity.<\/p>\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/09\/5xWCo4xt5mc1D8v5e_hbZ25hqF7-dI3Lwv4NytD00ddmXqd3unw39POav523WjOCCRiLCDKQq6cOS4RfcGgSFFqQ-X_0XCPA1yxVvRD5y6Dj9Qlu6UFUxhySnPZZqx-XtfJwanN7ginGIT4Tv-fuOWBXo0lBCFFTY4wq0UPBbcFkElIQ6n3klU0O4qM-5A.png\" alt=\"\" \/><figcaption>Vue d&#8217;ensemble des tests ayant \u00e9chou\u00e9.<\/figcaption><\/figure>\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/09\/S-xGTPMyOu-zL-Ghz5Ndo8kQXVLSPvYXUYpyBIwNsfwtpRNLv2vlaN0FX-BiShb422gjiNYc0wFU3wPZcSceog4Ke7Ati8m-Jmx6_RWCbW7YAbtcEwg2dc2cem_mHfATcAo2DbLfQOz93meA9YFDmshdQKjQakys_vEHRpBLAUyHmufBBgqbJK7dkHPXnQ.png\" alt=\"\" \/><\/p>\n<figcaption>Qodana signale le litt\u00e9ral de cha\u00eene cod\u00e9 en dur restant dans le code comme une erreur dans l&#8217;environnement internationalis\u00e9.<\/figcaption>\n<\/figure>\n<p><strong>#4. Assigner les t\u00e2ches<\/strong><\/p>\n<p>Pour chacun des tests \u00e9chou\u00e9s, le chef de projet a charg\u00e9 un d\u00e9veloppeur d&#8217;enqu\u00eater et d&#8217;extraire la cha\u00eene cod\u00e9e en dur dans le fichier de propri\u00e9t\u00e9s.<\/p>\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/09\/Rx5p2vnkFYKL3FEF4IttKzGgE_tnAPbLX9CmFaP20U1wXgN57ramrBJvRrkxQiGIagRx5ETZl7ztDO05l6No7HK4i8hr_crkAdohkw-I_QXSmMLi-wwLdQXelFG2b2lfQu-d2nnI0OmdYUyDxBjfhRoEi-zulqVEoDcc1YvPgCUPtNmm5U7mCUNMYrtOjQ.png\" alt=\"\" \/><\/p>\n<figcaption>Affichage du test assign\u00e9 dans TeamCity.<\/figcaption>\n<\/figure>\n<p><strong>#5. Contr\u00f4le des r\u00e9sultats<\/strong><\/p>\n<p>Apr\u00e8s chaque inspection de Qodana, TeamCity comparait les r\u00e9sultats \u00e0 ceux du rapport pr\u00e9c\u00e9dent. Si le d\u00e9veloppeur responsable de la r\u00e9solution d&#8217;un probl\u00e8me avait extrait la cha\u00eene, TeamCity marquait le test comme \u00e9tant r\u00e9solu. Le chef de projet pouvait ainsi suivre la progression sans avoir \u00e0 marquer manuellement les tests comme r\u00e9solus.<\/p>\n<p>En outre, l&#8217;\u00e9quipe a pu suivre la progression dans le tableau de bord de Qodana Cloud, qui mettait \u00e0 jour temps r\u00e9el les informations sur les probl\u00e8mes de code restants et comparait les r\u00e9sultats entre les diff\u00e9rentes ex\u00e9cutions de Qodana.<\/p>\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/09\/Hoverview.gif\" alt=\"\" \/><\/p>\n<figcaption>Exemple du tableau de bord de Qodana Cloud.\u00a0<\/figcaption>\n<\/figure>\n<p>Qodana a \u00e9galement permis d&#8217;ajouter les probl\u00e8mes s\u00e9lectionn\u00e9s \u00e0 la base de r\u00e9f\u00e9rence, autrement connue comme la section de la dette technique. Ainsi, toute l&#8217;\u00e9quipe avait acc\u00e8s \u00e0 la m\u00eame liste de probl\u00e8mes et pouvait suivre l&#8217;\u00e9volution de la situation directement dans la plateforme. Vous pouvez voir comment cela fonctionne dans l&#8217;exemple ci-dessous.<\/p>\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/09\/Ibaseline.gif\" alt=\"\" \/><\/p>\n<figcaption>La fonctionnalit\u00e9 de base de r\u00e9f\u00e9rence de Qodana.<\/figcaption>\n<\/figure>\n<h3>Principaux r\u00e9sultats obtenus<\/h3>\n<p>En quelques mois seulement, le nombre de <strong>tests \u00e9chou\u00e9s est pass\u00e9 de 10\u00a0000 \u00e0 z\u00e9ro<\/strong>, soit une moyenne d&#8217;environ <strong>175\u00a0tests r\u00e9solus par jour<\/strong>. L&#8217;\u00e9quipe a r\u00e9ussi \u00e0 supprimer tous les litt\u00e9raux de cha\u00eene cod\u00e9s en dur du code source et l&#8217;ensemble de l&#8217;interface utilisateur a \u00e9t\u00e9 localis\u00e9 de mani\u00e8re fluide, sans \u00e9l\u00e9ments ind\u00e9sirables en anglais.<\/p>\n<p>Gr\u00e2ce \u00e0 Qodana, l&#8217;\u00e9quipe IntelliJ a pu r\u00e9duire le nombre d&#8217;\u00e9tapes manuelles dans le processus de localisation et donc limiter le risque d&#8217;erreur humaine et augmenter la fiabilit\u00e9 des builds localis\u00e9s. De plus, gr\u00e2ce aux v\u00e9rifications effectu\u00e9es toutes les 4\u00a0heures, les probl\u00e8mes ont pu \u00eatre d\u00e9tect\u00e9s et r\u00e9solus plus t\u00f4t.<\/p>\n<p>Enfin, Qodana est devenu la source unique de v\u00e9rit\u00e9 pour le responsable de l&#8217;\u00e9quipe, ce qui lui a permis de contr\u00f4ler facilement que les d\u00e9veloppeurs aient bien r\u00e9solu les probl\u00e8mes qui leur avaient \u00e9t\u00e9 assign\u00e9s.<\/p>\n<p>Suite \u00e0 ces r\u00e9sultats positifs, l&#8217;\u00e9quipe d&#8217;IntelliJ a d\u00e9cid\u00e9 de continuer \u00e0 utiliser Qodana comme plateforme de contr\u00f4le de la qualit\u00e9 du code et de planification des ressources pour la livraison de nouvelles fonctionnalit\u00e9s et l&#8217;am\u00e9lioration des performances d&#8217;IntelliJ IDEA. Nous en reparlerons dans de prochains articles.<\/p>\n<p align=\"center\"><a class=\"jb-download-button\" title=\"COMMENCER AVEC QODANA\" href=\"https:\/\/www.jetbrains.com\/fr-fr\/qodana\/\" target=\"_blank\" rel=\"noopener noreferrer\"><i class=\"download-icon\"><\/i>COMMENCER AVEC QODANA<\/a><\/p>\n<p>Bon d\u00e9veloppement et veillez \u00e0 maintenir votre code propre\u00a0!<\/p>\n\n\n<p><em>Article original en anglais de<\/em> :<\/p>\n\n\n    <div class=\"about-author \">\n        <div class=\"about-author__box\">\n            <div class=\"row\">\n                <div class=\"about-author__box-img\">\n                    <img decoding=\"async\" src=\"https:\/\/secure.gravatar.com\/avatar\/?s=200&#038;r=g\" width=\"200\" height=\"200\" alt=\"\" loading=\"lazy\"  class=\"avatar avatar-200 wp-user-avatar wp-user-avatar-200 photo avatar-default\">\n                <\/div>\n                <div class=\"about-author__box-text\">\n                                                        <\/div>\n            <\/div>\n        <\/div>\n    <\/div>\n","protected":false},"author":813,"featured_media":321093,"comment_status":"closed","ping_status":"closed","template":"","categories":[1582,4089,7119,4759,6365,601],"tags":[2547,40,6470,72],"cross-post-tag":[6284],"acf":[],"_links":{"self":[{"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/qodana\/319147"}],"collection":[{"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/qodana"}],"about":[{"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/types\/qodana"}],"author":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/users\/813"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/comments?post=319147"}],"version-history":[{"count":10,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/qodana\/319147\/revisions"}],"predecessor-version":[{"id":627778,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/qodana\/319147\/revisions\/627778"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/media\/321093"}],"wp:attachment":[{"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/media?parent=319147"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/categories?post=319147"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/tags?post=319147"},{"taxonomy":"cross-post-tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/cross-post-tag?post=319147"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}