---
{
  "title": "Automatisez la traduction terminologique avec le moteur TX d'Aidbox",
  "description": "Les systèmes de santé échangent constamment des données à l'aide de différents jeux de codes, ce qui génère des milliers de traductions terminologiques quotidiennes. Le moteur TX d'Aidbox automatise ce processus grâce à FHIR ConceptMap et $translate, éliminant ainsi les tableurs, les scripts personnalisés et les erreurs d'intégration.",
  "date": "2025-12-08",
  "author": "Guillermo Rodríguez",
  "reading-time": "7 minutes",
  "tags": [
    "Terminology",
    "Aidbox"
  ]
}
---
## Le problème de décalage terminologique

Les organisations font face à un défi d'intégration persistant : le décalage [terminologique](/blog/introducing-hybrid-terminology-engine) entre les systèmes. Les interfaces et données HL7v2 héritées, les [implémentations FHIR](/articles/how-to-create-a-fhir-implementation-guide) modernes, les catalogues de procédures internes et les exigences de tiers créent un réseau complexe de besoins en traduction de codes. Un système de laboratoire envoie des résultats à l'aide de codes internes tandis que le DSE exige du LOINC. La radiologie utilise des codes de procédures propriétaires tandis que la facturation réclame des codes CPT. Chaque décalage nécessite une traduction et, à grande échelle, ces traductions se multiplient en milliers de conversions quotidiennes.

Les approches manuelles s'effondrent rapidement. La gestion de tableurs de correspondances de codes devient sujette aux erreurs lorsque plusieurs équipes mettent à jour différentes versions. La logique de traduction personnalisée intégrée dans les moteurs d'intégration crée des défis techniques et rend les mises à jour coûteuses. Sans gestion systématique des correspondances, les organisations font face à des défaillances d'intégration, des problèmes de qualité des données et des coûts de maintenance croissants.

La ressource FHIR `ConceptMap` et l'opération `$translate` offrent une façon structurée et interopérable de gérer les correspondances terminologiques. `ConceptMap` définit les relations entre les concepts de différents systèmes de codes, créant des règles de correspondance réutilisables et versionnées. L'opération `$translate` exécute ces correspondances de façon programmatique, permettant des traductions automatisées et cohérentes à travers votre écosystème. Cet article explore comment utiliser `ConceptMap` et `$translate` pour la traduction automatisée de codes, ainsi que leur comportement dans un environnement hybride.

## Comprendre les notions de base

### Qu'est-ce qu'un `ConceptMap`?

[ConceptMap](https://build.fhir.org/conceptmap.html) est une ressource FHIR qui définit comment les codes d'un système terminologique correspondent à des codes d'un autre système. Pensez-y comme à un dictionnaire de traduction pour les codes médicaux — lisible par machine, versionné et partageable.

Par exemple, votre hôpital pourrait avoir des codes de laboratoire internes qui doivent être associés à LOINC pour le partage externe :
- Code hospitalier : GLU-FAST-001 → LOINC : 1558-6 (Glycémie à jeun)
- Code hospitalier : HBA1C-TOTAL → LOINC : 4548-4 (Hémoglobine A1c)

Chaque correspondance comprend un type de relation — comme « équivalent » (même signification) ou « source-is-broader-than-target » (la cible est plus spécifique) — afin que les systèmes consommateurs comprennent à quel point les codes concordent. Avec ces définitions en place, un `ConceptMap` devient une source unique de vérité réutilisable, versionnée et pouvant être partagée au sein de votre organisation ou même publiée pour que d'autres puissent l'utiliser.

### Qu'est-ce que `$translate`?

L'opération [$translate](https://build.fhir.org/conceptmap-operation-translate.html) est une API FHIR qui utilise des `ConceptMap` pour traduire automatiquement des codes d'un système à un autre. Au lieu d'écrire une logique de recherche personnalisée, vous effectuez une simple requête HTTP :

Entrée : « Traduire le code GLU-FAST-001 de notre système hospitalier vers LOINC »

Sortie : « Code 1558-6 en LOINC, avec relation : équivalent »

En arrière-plan, l'opération gère toute la complexité — trouver les `ConceptMap` pertinents, rechercher le code, filtrer par système cible et retourner des résultats structurés. Vous obtenez ainsi des traductions cohérentes et fiables sans avoir à maintenir du code personnalisé dans plusieurs systèmes.

### Exemple simple de requête/réponse

Voici à quoi ressemble une requête de traduction de base :


```javascript
POST /fhir/ConceptMap/$translate
Content-Type: application/json

{
  "resourceType": "Parameters",
  "parameter": [
    {
      "name": "sourceCode",
      "valueCode": "female"
    },
    {
      "name": "sourceSystem",
      "valueUri": "http://hl7.org/fhir/administrative-gender"
    },
    {
      "name": "targetSystem",
      "valueUri": "http://terminology.hl7.org/CodeSystem/v2-0001"
    }
  ]
}
```


La réponse indique si une traduction a été trouvée (result: true) et fournit le code cible :


```javascript
{
  "resourceType": "Parameters",
  "parameter": [
    {
      "name": "result",
      "valueBoolean": true
    },
    {
      "name": "match",
      "part": [
        {
          "name": "relationship",
          "valueCode": "equal"
        },
        {
          "name": "concept",
          "valueCoding": {
            "system": "http://terminology.hl7.org/CodeSystem/v2-0001",
            "code": "F",
            "display": "F"
          }
        },
        {
          "name": "source",
          "valueUri": "http://hl7.org/fhir/ConceptMap/cm-administrative-gender-v2"
        }
      ]
    }
  ]
}
```


## Correspondances multiples

Dès que vous commencez à utiliser `ConceptMap` dans des scénarios réels, vous remarquerez que certains codes apparaissent dans plusieurs contextes de correspondance. C'est particulièrement fréquent avec les codes de statut génériques ou les concepts administratifs réutilisés par différentes ressources FHIR et guides d'implémentation. Dans de tels cas, `$translate` se comporte de manière prévisible : au lieu de choisir une « meilleure » correspondance, il retourne toutes les correspondances pertinentes afin que les clients puissent décider comment les traiter.

L'utilisation la plus simple de `$translate` consiste à trouver des correspondances pour un code. Les utilisateurs peuvent ne spécifier que le système et le code, et `$translate` est capable de localiser les `ConceptMap` applicables ainsi que les entrées correspondantes. C'est le cas de l'exemple précédent. Il peut arriver que le concept à traduire corresponde à des correspondances définies dans différents systèmes de codes. En supposant que nous avons plusieurs `ConceptMap` dans notre instance Aidbox incluant une correspondance pour `http://hl7.org/fhir/event-status|completed`, nous obtenons toutes les correspondances provenant des différents `ConceptMap`.

**Requête**


```javascript
POST /fhir/ConceptMap/$translate
Content-Type: application/json

{
  "resourceType": "Parameters",
  "parameter": [
    {
      "name": "sourceCode",
      "valueCode": "completed"
    },
    {
      "name": "sourceSystem",
      "valueUri": "http://hl7.org/fhir/event-status"
    }
  ]
}
```



```javascript
{
  "resourceType": "Parameters",
  "parameter": [
    {
      "name": "result",
      "valueBoolean": true
    },
    {
      "name": "match",
      "part": [
        {
          "name": "relationship",
          "valueCode": "equivalent"
        },
        {
          "name": "concept",
          "valueCoding": {
            "system": "http://hl7.org/fhir/resource-status",
            "code": "complete",
            "display": "complete"
          }
        },
        {
          "name": "source",
          "valueUri": "http://hl7.org/fhir/ConceptMap/sc-clinicalimpression-status"
        }
      ]
    },
    {
      "name": "match",
      "part": [
        {
          "name": "relationship",
          "valueCode": "equivalent"
        },
        {
          "name": "concept",
          "valueCoding": {
            "system": "http://hl7.org/fhir/resource-status",
            "code": "complete",
            "display": "complete"
          }
        },
        {
          "name": "source",
          "valueUri": "http://hl7.org/fhir/ConceptMap/sc-event-status"
        }
      ]
    },
    {
      "name": "match",
      "part": [
        {
          "name": "relationship",
          "valueCode": "equivalent"
        },
        {
          "name": "concept",
          "valueCoding": {
            "system": "http://hl7.org/fhir/resource-status",
            "code": "complete",
            "display": "complete"
          }
        },
        {
          "name": "source",
          "valueUri": "http://hl7.org/fhir/ConceptMap/sc-immunization-status"
        }
      ]
    }
  ]
}
```


## ConceptMap connu

ConceptMap définit des groupes de correspondances. Chaque groupe possède un système `source` et un système `target` qui représentent respectivement le système source où le code à associer est défini et le système cible vers lequel le concept sera associé. Dans certains cas, vous savez déjà quel `ConceptMap` vous souhaitez utiliser. Peut-être implémentez-vous un profil spécifique, ou suivez-vous les règles de correspondance d'un IG particulier. Au lieu de vous fier à une recherche à l'échelle du système, vous pouvez demander à `$translate` d'utiliser un seul `ConceptMap` connu.

Cela réduit la portée de la traduction et garantit des résultats prévisibles et spécifiques au contexte — particulièrement utile lorsque plusieurs `ConceptMap` définissent des correspondances similaires.

**Requête**


```javascript
POST /fhir/ConceptMap/$translate
Content-Type: application/json

{
  "resourceType": "Parameters",
  "parameter": [
    {
      "name": "url",
      "valueUri": "http://hl7.org/fhir/ConceptMap/sc-composition-status"
    },
    {
      "name": "sourceCode",
      "valueCode": "preliminary"
    },
    {
      "name": "sourceSystem",
      "valueUri": "http://hl7.org/fhir/composition-status"
    }
  ]
}
```


Le paramètre `url` spécifie le `ConceptMap` à utiliser lors de la traduction. Le serveur reçoit l'instruction d'utiliser ce conteneur de correspondances spécifique lors de la traduction.

**Réponse**


```javascript
{
  "resourceType": "Parameters",
  "parameter": [
    {
      "name": "result",
      "valueBoolean": true
    },
    {
      "name": "match",
      "part": [
        {
          "name": "relationship",
          "valueCode": "equivalent"
        },
        {
          "name": "concept",
          "valueCoding": {
            "system": "http://hl7.org/fhir/resource-status",
            "code": "draft",
            "display": "draft"
          }
        },
        {
          "name": "source",
          "valueUri": "http://hl7.org/fhir/ConceptMap/sc-composition-status"
        }
      ]
    }
  ]
}
```


## L'avantage hybride

Créer des `ConceptMap` pour les besoins spécifiques de votre organisation — comme les codes internes vers LOINC — est tout à fait logique. Vous connaissez vos codes, vous contrôlez les correspondances et vous pouvez les mettre à jour selon vos besoins. Mais créer tous les `ConceptMap` possibles est irréaliste. À l'instar des systèmes de codes externes ou standards, il existe des `ConceptMap` qui définissent des données de traduction pour des scénarios courants. Voici quelques exemples :
- Codes administratifs FHIR → HL7 V2
- Tous les ConceptMap de US Core
- ICD-10 → SNOMED CT
- Correspondances régionales et spécialisées

C'est là que l'approche hybride d'Aidbox brille. Aidbox vérifie d'abord vos `ConceptMap` locaux. Si une traduction est trouvée, elle est retournée immédiatement — rapidement et localement. Si aucune traduction n'est trouvée et qu'aucun `ConceptMap` local n'existe pour ce système source, Aidbox délègue automatiquement la traduction au [serveur terminologique externe](https://www.health-samurai.io/docs/aidbox/terminology-module/aidbox-terminology-module/hybrid#external-terminology-servers) configuré (comme tx.health-samurai.io).

Cela signifie que vous obtenez :
- Vos correspondances personnalisées (gérées par vous, utilisées en premier)
- Les correspondances standard (gérées en externe, accessibles automatiquement)
- Aucune duplication (vous ne recréez pas les correspondances standard)

**Requête**


```javascript
POST /fhir/ConceptMap/$translate
Content-Type: application/json

{
  "resourceType": "Parameters",
  "parameter": [
    {
      "name": "sourceCode",
      "valueCode": "D"
    },
    {
      "name": "sourceSystem",
      "valueUri": "http://hl7.org/fhir/us/vr-common-library/CodeSystem/codesystem-ije-vr"
    },
    {
      "name": "targetSystem",
      "valueUri": "http://snomed.info/sct"
    }
  ]
}
```


**Réponse**


```javascript
{
  "resourceType": "Parameters",
  "parameter": [
    {
      "name": "result",
      "valueBoolean": true
    },
    {
      "name": "match",
      "part": [
        {
          "name": "equivalence",
          "valueCode": "equivalent"
        },
        {
          "name": "concept",
          "valueCoding": {
            "system": "http://snomed.info/sct",
            "code": "434651000124107"
          }
        },
        {
          "name": "source",
          "valueString": "http://hl7.org/fhir/us/vrdr/ConceptMap/CertifierTypesCM"
        }
      ]
    },
    {
      "name": "match",
      "part": [
        {
          "name": "equivalence",
          "valueCode": "equivalent"
        },
        {
          "name": "concept",
          "valueCoding": {
            "system": "http://snomed.info/sct",
            "code": "449951000124101"
          }
        },
        {
          "name": "source",
          "valueString": "http://hl7.org/fhir/us/vrdr/ConceptMap/MethodOfDispositionCM"
        }
      ]
    }
  ]
}
```


## La traduction ConceptMap dans Aidbox

Aidbox a introduit `ConceptMap` dans la [version 2508](https://www.health-samurai.io/docs/aidbox/overview/release-notes#august-2025-2508), avec la prise en charge de l'opération `$translate`; consultez le [registre des capacités](https://www.health-samurai.io/docs/aidbox/terminology-module/aidbox-terminology-module/capabilities). Si vous souhaitez essayer cela localement, commencez par exécuter Aidbox en suivant le [guide Exécuter Aidbox localement](https://www.health-samurai.io/docs/aidbox/getting-started/run-aidbox-locally).

**Préparer la ressource de correspondance locale**

Ouvrez la [console REST](http://localhost:8080/ui/console#/rest) d'Aidbox et envoyez :


```javascript
PUT /fhir/ConceptMap/cm1
Content-Type: application/json

{
  "resourceType": "ConceptMap",
  "id": "cm1",
  "url": "http://hl7.org/fhir/ConceptMap/sc-clinicalimpression-status-TEST",
  "version": "0.1.0",
  "status": "active",
  "group": [
    {
      "source": "http://hl7.org/fhir/event-status|5.0.0",
      "target": "http://hl7.org/fhir/resource-status",
      "element": [
        {
          "code": "entered-in-error",
          "target": [
            {
              "code": "error",
              "equivalence": "equivalent"
            }
          ]
        },
        {
          "code": "preparation",
          "target": [
            {
              "code": "planned",
              "equivalence": "equivalent"
            }
          ]
        },
        {
          "code": "in-progress",
          "target": [
            {
              "code": "active",
              "equivalence": "equivalent"
            }
          ]
        },
        {
          "code": "on-hold",
          "target": [
            {
              "code": "suspended",
              "equivalence": "equivalent"
            }
          ]
        },
        {
          "code": "stopped",
          "target": [
            {
              "code": "failed",
              "equivalence": "equivalent"
            }
          ]
        },
        {
          "code": "completed",
          "target": [
            {
              "code": "complete",
              "equivalence": "equivalent"
            }
          ]
        },
        {
          "code": "not-done",
          "target": [
            {
              "code": "abandoned",
              "equivalence": "equivalent"
            }
          ]
        },
        {
          "code": "unknown",
          "target": [
            {
              "code": "unknown",
              "equivalence": "equivalent"
            }
          ]
        }
      ]
    }
  ]
}
```


**Exécuter l'opération $translate de ConceptMap**


```javascript
POST /fhir/ConceptMap/$translate
Content-Type: application/json

{
  "resourceType": "Parameters",
  "parameter": [
    {
      "name": "url", 
      "valueUri": "http://hl7.org/fhir/ConceptMap/sc-clinicalimpression-status-TEST"
    },
    {
      "name": "sourceCode",
      "valueCode": "completed"
    },
    {
      "name": "sourceSystem",
      "valueUri": "http://hl7.org/fhir/event-status"
    },
    {
      "name": "sourceVersion",
      "valueString": "5.0.0"
    }
  ]
}
```


**Réponse**


```javascript
{
 "resourceType": "Parameters",
 "parameter": [
  {
   "name": "result",
   "valueBoolean": true
  },
  {
   "name": "match",
   "part": [
    {
     "name": "relationship",
     "valueCode": "equivalent"
    },
    {
     "name": "concept",
     "valueCoding": {
      "system": "http://hl7.org/fhir/resource-status",
      "code": "complete",
      "display": "complete"
     }
    },
    {
     "name": "source",
     "valueUri": "http://hl7.org/fhir/ConceptMap/sc-clinicalimpression-status-TEST"
    }
   ]
  }
 ]
}
```


Démarrez votre instance Aidbox et automatisez la traduction terminologique à la manière FHIR. Cessez d'écrire du code de recherche et de traduction personnalisé.

Voir aussi :
- [Présentation du moteur terminologique hybride](https://www.health-samurai.io/articles/introducing-hybrid-terminology-engine)
- [Moteur TX d'Aidbox - ConceptMap](https://www.health-samurai.io/docs/aidbox/terminology-module/fhir-terminology/conceptmap)
- [Moteur TX d'Aidbox - Mode hybride](https://www.health-samurai.io/docs/aidbox/terminology-module/aidbox-terminology-module/hybrid)

Voir aussi : [Catégories résiduelles en terminologie FHIR](/blog/residual-categories-in-fhir-terminology).