# General Translation Knowledge Base: General Translation ou nestjs-i18n : lequel choisir ?
URL: https://generaltranslation.com/fr/kb/general-translation-vs-nestjs-i18n.mdx
Docs index: https://generaltranslation.com/llms.txt
Description: nestjs-i18n résout la langue de chaque requête dans une application NestJS et affiche les messages à partir de catalogues JSON ou YAML propres à chaque langue, mais il ne traduit rien. La CLI de General Translation traduit ces catalogues, et sa bibliothèque gt-node traduit le contenu qui n’existe qu’à l’exécution : vous pouvez donc conserver nestjs-i18n et lui adjoindre General Translation.
Category: Internationalisation
Last updated: 2026-10-16
Authors: Kevin Wu, Jackie Chen
Published: 2026-10-16

nestjs-i18n est un module d’i18n open source pour NestJS : il détermine la langue de chaque requête à partir de la chaîne de requête, d’un en-tête, d’un cookie ou de `Accept-Language`, puis `I18nContext` ou `I18nService` renvoie depuis vos catalogues le message correspondant à cette langue. Il affiche les traductions, mais ne les produit pas : c’est donc à vous, à vos traducteurs ou à un prestataire de rédiger le catalogue de chaque langue et de le tenir à jour. General Translation comble cette lacune de deux façons : sa CLI traduit les catalogues de nestjs-i18n, et sa bibliothèque `gt-node` traduit le contenu qui n’existe qu’à l’exécution.

## Les points forts de nestjs-i18n

* **Conçu pour Nest.** Un seul appel à `I18nModule.forRoot()`, [un décorateur de paramètre `@I18n()` pour `I18nContext`, et `I18nContext.current()` dans les services](https://nestjs-i18n.com/quick-start). Il fonctionne avec HTTP, GraphQL, gRPC et WebSockets.
* **Résolveurs de langue.** [`QueryResolver`, `HeaderResolver`, `CookieResolver` et `AcceptLanguageResolver`](https://nestjs-i18n.com/concepts/resolver) s&#39;exécutent dans l&#39;ordre où vous les déclarez, des résolveurs dédiés prennent en charge GraphQL et gRPC, et vous pouvez écrire les vôtres.
* **Catalogues simples.** Un dossier par langue (`src/i18n/en/`, `src/i18n/es/`) contenant des [fichiers JSON ou YAML](https://nestjs-i18n.com/concepts/loader), où chaque nom de fichier devient un espace de noms (`inbox.title`), avec rechargement à chaud en développement.
* **Formes plurielles et interpolation.** Des espaces réservés `{name}`, des références `$t()` vers d&#39;autres clés, et des [objets pluriels dont les clés `zero`, `one`, `two`, `few`, `many` et `other`](https://nestjs-i18n.com/guides/plurals) sont sélectionnées via `Intl.PluralRules`. Une option `useICU` à activation volontaire, [ajoutée dans la version 10.8.0](https://github.com/toonvanstrijp/nestjs-i18n/releases/tag/v10.8.0), permet de formater les messages avec ICU MessageFormat à la place.
* **Sécurité du typage.** [`typesOutputPath` génère les types `I18nTranslations` et `I18nPath`](https://nestjs-i18n.com/guides/type-safety) : une clé mal orthographiée provoque donc une erreur de compilation, et la commande `nestjs-i18n check` se termine en erreur lorsqu&#39;il manque des clés dans une langue.
* **Messages de validation.** `I18nValidationPipe`, `I18nValidationExceptionFilter` et `i18nValidationMessage()` [traduisent les erreurs de class-validator pour les DTO](https://nestjs-i18n.com/guides/dto_validation/global-validation).

Il est distribué sous licence MIT, et [la version 10.8.5 nécessite Node.js 22 ou version ultérieure](https://github.com/toonvanstrijp/nestjs-i18n/blob/v10.8.5/package.json).

## Ce que nestjs-i18n vous laisse à gérer

Voici un catalogue en anglais pour une boîte de réception, avec un pluriel :

```json title="src/i18n/en/inbox.json"
{
  "title": "Inbox",
  "unread": {
    "one": "You have {count} unread message.",
    "other": "You have {count} unread messages."
  }
}
```

Le dossier espagnol contient une copie traduite du fichier, et un contrôleur renvoie `i18n.t('inbox.unread', { args: { count } })`. Il n&#39;y a pas de dossier allemand. Voici les requêtes envoyées à une application Nest 11 minimale utilisant nestjs-i18n 10.8.5 :

```text title="Output"
?lang=es&count=3  "Tienes 3 mensajes sin leer."
?lang=de&count=3  "You have 3 unread messages."
```

L&#39;allemand bascule sur l&#39;anglais, car son catalogue n&#39;a pas été traduit. La détection de la langue fonctionne, mais elle ne peut pas fournir le texte manquant. C&#39;est précisément ce que nestjs-i18n vous laisse à faire : produire les catalogues et les maintenir à jour à chaque modification du texte anglais.

## Comment General Translation s&#39;intègre à une application NestJS

La CLI de General Translation traduit les catalogues de nestjs-i18n là où ils se trouvent, sans les déplacer. Faites pointer une entrée `json` vers les dossiers de langue :

```json title="gt.config.json"
{
  "defaultLocale": "en",
  "locales": [
    "es",
    "de"
  ],
  "files": {
    "json": {
      "include": [
        "src/i18n/[locale]/*.json"
      ]
    }
  }
}
```

[`npx gt translate`](/docs/cli/reference/commands/translate) lit `src/i18n/en/inbox.json` et génère `src/i18n/es/inbox.json` et `src/i18n/de/inbox.json`, en conservant toutes les clés. Exécutez-le dans votre CI : les entrées inchangées réutilisent leurs traductions précédentes. nestjs-i18n charge les catalogues générés via son loader existant.

Cet exemple utilise des messages en anglais, en espagnol et en allemand avec les formes `one` et `other`. Prévisualisez les messages générés avec des valeurs de 1 et 3, puis exécutez `nestjs-i18n check -p src/i18n` pour détecter les clés manquantes avant la livraison.

Pour le contenu qui n&#39;existe qu&#39;à l&#39;exécution, comme la publication d&#39;un collègue ou un enregistrement en base de données, utilisez [`gt-node`](/docs/node/quickstart) de General Translation. Initialisez-le une seule fois, puis transmettez la langue résolue par nestjs-i18n à [`withGT`](/docs/node/reference/functions/with-gt) lorsque vous appelez [`tx`](/docs/node/reference/functions/tx) :

```ts title="src/main.ts"
import { NestFactory } from '@nestjs/core';
import { initializeGT } from 'gt-node';
import { AppModule } from './app.module';

// Lit GT_PROJECT_ID et GT_API_KEY (une clé de projet disposant de la traduction à l’exécution) depuis l’environnement.
initializeGT({ defaultLocale: 'en', locales: ['en', 'es', 'de'] });

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  await app.listen(3000);
}
bootstrap();
```

```ts title="src/posts.controller.ts"
import { Controller, Get, Param } from '@nestjs/common';
import { I18n, I18nContext } from 'nestjs-i18n';
import { tx, withGT } from 'gt-node';
import { PostsService } from './posts.service';

@Controller('posts')
export class PostsController {
  constructor(private readonly posts: PostsService) {}

  @Get(':id')
  async findOne(@Param('id') id: string, @I18n() i18n: I18nContext) {
    return withGT(i18n.lang, async () => {
      const post = await this.posts.findOne(id);
      return { ...post, body: await tx(post.body, { $context: 'A post written by a user' }) };
    });
  }
}
```

Les deux outils utilisent désormais la langue sélectionnée par vos résolveurs nestjs-i18n existants. Si `?lang=es` est prioritaire sur `Accept-Language: de`, les messages du catalogue comme l&#39;article traduit sont en espagnol. Utilisez les catalogues pour les textes fixes de l&#39;interface et [`tx`](/docs/node/reference/functions/tx) pour le contenu créé par vos utilisateurs.

Conservez nestjs-i18n pour les clés typées, les recherches dans les catalogues et les messages de validation. General Translation se charge de la génération des traductions et fournit un glossaire et des instructions personnalisées partagés, ainsi que la [relecture dans le tableau de bord](/docs/platform/dashboard/guides/reviewing-translations). Utilisez le workflow de catalogue décrit ci-dessus pour les textes fixes et `tx` pour le contenu dynamique.

## nestjs-i18n vs. General Translation en un coup d&#39;œil

| Fonctionnalité         | nestjs-i18n                                                                            | General Translation                                                                                                 |
| ---------------------- | -------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------- |
| Rôle                   | Résout la langue de la requête et affiche les messages à partir des catalogues         | Traduit les catalogues, ainsi que le contenu dynamique à l&#39;exécution                                            |
| Traduit votre contenu  | Non                                                                                    | Oui, avec [`npx gt translate`](/docs/cli/reference/commands/translate) et [`tx`](/docs/node/reference/functions/tx) |
| Détection de la langue | Requête, en-tête, cookie, `Accept-Language`, GraphQL, gRPC et résolveurs personnalisés | Utilise la même langue résolue via [`withGT`](/docs/node/reference/functions/with-gt)                               |
| Formes plurielles      | Clés de catégorie propres à chaque langue, sélectionnées avec `Intl.PluralRules`       | Traduit les clés plurielles présentes dans votre fichier source                                                     |
| Sécurité du typage     | Types de clés générés et détection des clés manquantes                                 | Conserve les clés de catalogue pour réutiliser les mêmes types générés                                              |
| Messages de validation | Intégration avec class-validator                                                       | Traduit les catalogues dont proviennent ces messages                                                                |
| Coût                   | Gratuit, sous licence MIT                                                              | [Facturation à l&#39;usage](https://generaltranslation.com/pricing)                                                 |

## Quand utiliser l&#39;un ou l&#39;autre

Conservez nestjs-i18n pour ses résolveurs, ses clés typées et son intégration avec la validation. Ajoutez General Translation si vous souhaitez que vos catalogues soient traduits dans votre CI au fil de l&#39;évolution du texte anglais, ou si votre API renvoie du contenu utilisateur ou issu de la base de données à traduire à la volée. Vos contrôleurs existants continuent d&#39;utiliser les mêmes clés ; General Translation se charge de maintenir à jour le texte associé à ces clés.

## Utiliser les deux

1. Conservez nestjs-i18n et ses dossiers tels quels.
2. Ajoutez un fichier `gt.config.json` contenant le chemin de votre catalogue, puis définissez `GT_API_KEY` et `GT_PROJECT_ID`. (Consultez [Configurer la CLI](/docs/cli/guides/configuring#credentials).)
3. Téléversez vos traductions existantes avec [`npx gt upload`](/docs/cli/reference/commands/upload), puis exécutez [`npx gt translate`](/docs/cli/reference/commands/translate) dans votre CI.
4. Si vous modifiez ensuite des traductions locales, exécutez [`npx gt save-local`](/docs/cli/reference/commands/save-local) avant de relancer la génération. Ajoutez `gt-node` là où vous avez besoin de la traduction à l’exécution.

## Points clés

* nestjs-i18n gère la détection de la langue, les clés typées, les formes plurielles et les messages de validation dans NestJS, mais c&#39;est à vous de rédiger chaque catalogue dans chaque langue, y compris les formes du pluriel propres à chaque langue.
* La CLI de General Translation traduit sur place les catalogues JSON de nestjs-i18n, et `gt-node` traduit le contenu dynamique dans la langue de la requête.
* Utilisez-les ensemble : nestjs-i18n se charge de l&#39;affichage, General Translation de la traduction.

## Related questions

- [General Translation vs i18next, react-intl et next-intl : quelle bibliothèque d’i18n choisir ?](https://generaltranslation.com/fr/kb/general-translation-vs-i18n-libraries.mdx): Les bibliothèques open source comme i18next, react-intl et next-intl ne traduisent rien. Elles affichent les traductions que vous leur fournissez dans un fichier de catalogue par langue, rédigées par vous, vos traducteurs ou un service tiers. Les bibliothèques de General Translation sont elles aussi open source et remplissent le même rôle, mais General Translation se charge en plus de la traduction, en s’appuyant sur votre code comme contexte.
- [Pourquoi utiliser General Translation plutôt qu’un TMS (Smartling, Lokalise, Phrase, Crowdin ou Transifex) ?](https://generaltranslation.com/fr/kb/general-translation-vs-tms.mdx): Un système de gestion de la traduction (TMS) comme Smartling, Lokalise, Phrase, Crowdin ou Transifex coordonne les traducteurs, mais les ingénieurs doivent toujours extraire les chaînes, les envoyer, attendre les traductions, puis les réintégrer dans le produit. General Translation traduit le contenu directement dans votre code, avec son contexte, fournit toutes les langues à chaque livraison et repose sur des bibliothèques open source, sans dépendance à un fournisseur.
- [Faut-il développer votre propre i18n ou utiliser General Translation ?](https://generaltranslation.com/fr/kb/general-translation-vs-in-house-i18n.mdx): Une i18n faite maison (un dictionnaire par langue et un petit utilitaire t()) suffit pour une ou deux langues et un peu de texte. À mesure que l’application grandit, vous finissez par réécrire les règles de pluriel, les solutions de repli et la synchronisation des fichiers, et il vous reste à produire les traductions. Les bibliothèques open source de General Translation gèrent l’affichage, et General Translation génère et met à jour les traductions à partir de votre code.
- [General Translation ou Symfony Translation : lequel choisir ?](https://generaltranslation.com/fr/kb/general-translation-vs-symfony-translation.mdx): Symfony Translation affiche les messages en PHP et en Twig. General Translation traduit ses catalogues YAML en CI, les maintient à jour à mesure que votre source évolue et offre aux relecteurs un tableau de bord pour les modifier. Conservez le rendu de Symfony et intégrez la traduction automatisée à votre workflow de livraison.
- [Peut-on faire de l’i18n sans fichiers de traduction ?](https://generaltranslation.com/fr/kb/i18n-without-translation-files.mdx): Oui. Avec gt-react ou gt-next, le contenu reste intégré dans vos composants, à l’intérieur d’un composant `<T>`, et les traductions sont générées lors du build. Il n’y a donc ni clés ni fichiers JSON par paramètre régional à écrire et à garder synchronisés.

## Previous and next questions

- Previous question: [General Translation ou Mobility : lequel choisir ?](https://generaltranslation.com/fr/kb/general-translation-vs-mobility.mdx)
- Next question: [General Translation ou Paraglide JS : lequel choisir ?](https://generaltranslation.com/fr/kb/general-translation-vs-paraglide.mdx)

## Sitemap

See the [Knowledge Base sitemap](https://generaltranslation.com/fr/kb/sitemap.md) for every article.
