# General Translation Knowledge Base: General Translation vs. nestjs-i18n: quale scegliere?
URL: https://generaltranslation.com/it/kb/general-translation-vs-nestjs-i18n.mdx
Docs index: https://generaltranslation.com/llms.txt
Description: nestjs-i18n risolve la lingua di ogni richiesta in un'app NestJS e renderizza i messaggi a partire da cataloghi JSON o YAML separati per lingua, ma non traduce nulla. La CLI di General Translation traduce quei cataloghi e la sua libreria gt-node traduce i contenuti che esistono solo a runtime: puoi quindi continuare a usare nestjs-i18n e affiancargli General Translation.
Category: Internazionalizzazione
Last updated: 2026-10-16
Authors: Kevin Wu, Jackie Chen
Published: 2026-10-16

nestjs-i18n è un modulo i18n open source per NestJS: determina la lingua di ogni richiesta in base alla query string, a un&#39;intestazione, a un cookie o ad `Accept-Language`, mentre `I18nContext` o `I18nService` restituiscono il messaggio in quella lingua prendendolo dai tuoi cataloghi. Renderizza le traduzioni, ma non le produce: il catalogo di ogni lingua va scritto e tenuto aggiornato da te, dai tuoi traduttori o da un servizio esterno. General Translation colma questa lacuna in due modi: la sua CLI traduce i cataloghi di nestjs-i18n e la sua libreria `gt-node` traduce i contenuti che esistono solo a runtime.

## Cosa fa bene nestjs-i18n

* **Progettato per Nest.** Basta una chiamata a `I18nModule.forRoot()`, con [un decoratore di parametro `@I18n()` per `I18nContext` e `I18nContext.current()` nei servizi](https://nestjs-i18n.com/quick-start). Funziona su HTTP, GraphQL, gRPC e WebSocket.
* **Resolver della lingua.** [`QueryResolver`, `HeaderResolver`, `CookieResolver` e `AcceptLanguageResolver`](https://nestjs-i18n.com/concepts/resolver) vengono eseguiti nell&#39;ordine in cui li elenchi, appositi resolver coprono i trasporti GraphQL e gRPC, e puoi anche scriverne di tuoi.
* **Cataloghi semplici.** Una cartella per lingua (`src/i18n/en/`, `src/i18n/es/`) con [file JSON o YAML](https://nestjs-i18n.com/concepts/loader), in cui il nome di ciascun file diventa un namespace (`inbox.title`), più il ricaricamento a caldo durante lo sviluppo.
* **Plurali e interpolazione.** Segnaposto `{name}`, riferimenti `$t()` ad altre chiavi e [oggetti plurali le cui chiavi `zero`, `one`, `two`, `few`, `many` e `other`](https://nestjs-i18n.com/guides/plurals) vengono selezionate tramite `Intl.PluralRules`. In alternativa, l&#39;impostazione opt-in `useICU`, [introdotta nella versione 10.8.0](https://github.com/toonvanstrijp/nestjs-i18n/releases/tag/v10.8.0), formatta i messaggi con ICU MessageFormat.
* **Sicurezza dei tipi.** [`typesOutputPath` genera i tipi `I18nTranslations` e `I18nPath`](https://nestjs-i18n.com/guides/type-safety), quindi una chiave scritta male blocca la compilazione, mentre il comando `nestjs-i18n check` termina con un errore se a una lingua mancano delle chiavi.
* **Messaggi di validazione.** `I18nValidationPipe`, `I18nValidationExceptionFilter` e `i18nValidationMessage()` [traducono gli errori di class-validator per i DTO](https://nestjs-i18n.com/guides/dto_validation/global-validation).

È distribuito con licenza MIT e [la versione 10.8.5 richiede Node.js 22 o successivo](https://github.com/toonvanstrijp/nestjs-i18n/blob/v10.8.5/package.json).

## Cosa nestjs-i18n lascia a te

Ecco un catalogo in inglese per una casella di posta, con un plurale:

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

La cartella dello spagnolo contiene una copia tradotta del file e un controller restituisce `i18n.t('inbox.unread', { args: { count } })`. Non c&#39;è una cartella per il tedesco. Ecco le richieste inviate a un&#39;app Nest 11 minimale con 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."
```

Il tedesco ripiega sull&#39;inglese perché il suo catalogo non è ancora stato tradotto. Il rilevamento della lingua funziona, ma non può fornire il testo mancante. Ed è proprio questo il lavoro che nestjs-i18n lascia a te: creare i cataloghi e mantenerli aggiornati ogni volta che il testo inglese cambia.

## Come General Translation si integra in un&#39;app NestJS

La CLI di General Translation traduce i cataloghi di nestjs-i18n direttamente nella loro posizione attuale. Fai puntare una voce `json` alle cartelle delle lingue:

```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) legge `src/i18n/en/inbox.json` e scrive `src/i18n/es/inbox.json` e `src/i18n/de/inbox.json`, mantenendo tutte le chiavi. Eseguilo in CI: le voci invariate riutilizzano le traduzioni precedenti. nestjs-i18n carica i cataloghi generati tramite il loader che già utilizza.

Questo esempio usa messaggi in inglese, spagnolo e tedesco con le forme `one` e `other`. Visualizza un&#39;anteprima dei messaggi generati con conteggi pari a 1 e 3 ed esegui `nestjs-i18n check -p src/i18n` per individuare eventuali chiavi mancanti prima del rilascio.

Per i contenuti che esistono solo a runtime, come il post di un collega o un record del database, usa [`gt-node`](/docs/node/quickstart) di General Translation. Inizializzalo una sola volta, poi passa a [`withGT`](/docs/node/reference/functions/with-gt) la lingua risolta da nestjs-i18n quando chiami [`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';

// Legge dall'ambiente GT_PROJECT_ID e GT_API_KEY (una chiave di progetto con traduzione Runtime abilitata).
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' }) };
    });
  }
}
```

Ora entrambi gli strumenti usano la lingua selezionata dai resolver nestjs-i18n già presenti. Se `?lang=es` ha la precedenza su `Accept-Language: de`, sia i messaggi del catalogo sia il post tradotto saranno in spagnolo. Usa i cataloghi per i testi fissi dell&#39;interfaccia e [`tx`](/docs/node/reference/functions/tx) per i contenuti creati dai tuoi utenti.

Continua a usare nestjs-i18n per le chiavi tipizzate, le ricerche nei cataloghi e i messaggi di validazione. General Translation si occupa della generazione delle traduzioni e mette a disposizione un Glossario condiviso, i prompt personalizzati e la [revisione nella dashboard](/docs/platform/dashboard/guides/reviewing-translations). Usa il flusso di lavoro basato sul catalogo descritto sopra per i testi fissi e `tx` per il contenuto dinamico.

## nestjs-i18n e General Translation a confronto

| Funzionalità             | nestjs-i18n                                                                             | General Translation                                                                                              |
| ------------------------ | --------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------- |
| Ruolo                    | Risolve la lingua della richiesta e renderizza i messaggi dai cataloghi                 | Traduce i cataloghi e il contenuto dinamico a runtime                                                            |
| Traduce i tuoi contenuti | No                                                                                      | Sì, con [`npx gt translate`](/docs/cli/reference/commands/translate) e [`tx`](/docs/node/reference/functions/tx) |
| Rilevamento della lingua | Query, intestazione, cookie, `Accept-Language`, GraphQL, gRPC e resolver personalizzati | Usa la stessa lingua risolta tramite [`withGT`](/docs/node/reference/functions/with-gt)                          |
| Plurali                  | Chiavi di categoria specifiche per lingua, selezionate con `Intl.PluralRules`           | Traduce le chiavi plurali presenti nel tuo file sorgente                                                         |
| Sicurezza dei tipi              | Tipi di chiave generati e controllo delle chiavi mancanti                               | Mantiene le chiavi del catalogo, così i tipi generati restano invariati                                          |
| Messaggi di validazione  | Integrazione con class-validator                                                        | Traduce i cataloghi da cui provengono questi messaggi                                                            |
| Costo                    | Gratuito, con licenza MIT                                                               | [In base all&#39;utilizzo](https://generaltranslation.com/pricing)                                               |

## Quando usare l&#39;uno o l&#39;altro

Continua a usare nestjs-i18n per i suoi resolver, le chiavi tipizzate e l&#39;integrazione con la validazione. Aggiungi General Translation se vuoi che i cataloghi vengano tradotti in CI man mano che il testo inglese cambia, oppure se la tua API restituisce contenuti generati dagli utenti o provenienti dal database che vanno tradotti al volo. I controller esistenti continuano a usare le stesse chiavi; General Translation si occupa di mantenere aggiornato il testo associato a quelle chiavi.

## Usare entrambi

1. Lascia nestjs-i18n e le relative cartelle così come sono.
2. Aggiungi `gt.config.json` con il percorso del tuo catalogo e imposta `GT_API_KEY` e `GT_PROJECT_ID`. (Consulta [Configurare la CLI](/docs/cli/guides/configuring#credentials).)
3. Carica le traduzioni esistenti con [`npx gt upload`](/docs/cli/reference/commands/upload), quindi esegui [`npx gt translate`](/docs/cli/reference/commands/translate) in CI.
4. Se in seguito modifichi le traduzioni in locale, esegui [`npx gt save-local`](/docs/cli/reference/commands/save-local) prima di rigenerarle. Aggiungi `gt-node` dove ti serve la traduzione in fase di esecuzione.

## Punti chiave

* nestjs-i18n gestisce il rilevamento della lingua, le chiavi tipizzate, i plurali e i messaggi di validazione in NestJS, ma tocca a te scrivere ogni catalogo in ogni lingua, comprese le forme plurali di ciascuna.
* La CLI di General Translation traduce in-place i cataloghi JSON di nestjs-i18n, mentre `gt-node` traduce il contenuto dinamico usando la stessa lingua della richiesta.
* Usali insieme: nestjs-i18n renderizza, General Translation traduce.

## Related questions

- [General Translation vs. i18next, react-intl e next-intl: quale libreria i18n scegliere?](https://generaltranslation.com/it/kb/general-translation-vs-i18n-libraries.mdx): Le librerie open source come i18next, react-intl e next-intl non traducono nulla. Si limitano a visualizzare le traduzioni che fornisci in un file di catalogo per ciascuna lingua, scritte da te, dai tuoi traduttori o da un servizio esterno. Anche le librerie di General Translation sono open source e svolgono lo stesso compito, ma General Translation si occupa anche della traduzione, usando il tuo codice come contesto.
- [Perché usare General Translation invece di un TMS (Smartling, Lokalise, Phrase, Crowdin o Transifex)?](https://generaltranslation.com/it/kb/general-translation-vs-tms.mdx): Un sistema di gestione delle traduzioni (TMS) come Smartling, Lokalise, Phrase, Crowdin o Transifex coordina i traduttori, ma gli sviluppatori devono comunque estrarre le stringhe, inviarle, attendere le traduzioni e reintegrarle nel prodotto. General Translation traduce i contenuti direttamente nel tuo codice insieme al loro contesto, distribuisce tutte le lingue a ogni rilascio e si basa su librerie open source, senza vendor lock-in.
- [Conviene creare un sistema i18n in autonomia o usare General Translation?](https://generaltranslation.com/it/kb/general-translation-vs-in-house-i18n.mdx): Un sistema i18n fatto in casa (un dizionario per lingua e un piccolo helper t()) va bene per una o due lingue e pochi testi. Man mano che l'app cresce, ti ritrovi a ricostruire regole del plurale, fallback e sincronizzazione dei file, e le traduzioni vanno comunque prodotte. Le librerie open source di General Translation si occupano del rendering, mentre General Translation genera e aggiorna le traduzioni a partire dal tuo codice.
- [General Translation o Symfony Translation: quale scegliere?](https://generaltranslation.com/it/kb/general-translation-vs-symfony-translation.mdx): Symfony Translation renderizza i messaggi in PHP e Twig. General Translation traduce i suoi cataloghi YAML in CI, li mantiene aggiornati man mano che la sorgente cambia e offre ai revisori una Dashboard per modificarli. Mantieni il rendering di Symfony e aggiungi la traduzione automatica al tuo flusso di lavoro di rilascio.
- [Posso fare i18n senza file di traduzione?](https://generaltranslation.com/it/kb/i18n-without-translation-files.mdx): Sì. Con gt-react o gt-next, i contenuti restano inline nei tuoi componenti, all'interno di un componente `<T>`, e le traduzioni vengono generate come output in fase di compilazione. Non ci sono quindi chiavi né file JSON per ogni impostazione regionale da scrivere e mantenere sincronizzati.

## Previous and next questions

- Previous question: [General Translation vs. Locize: quale scegliere?](https://generaltranslation.com/it/kb/general-translation-vs-locize.mdx)
- Next question: [General Translation vs. Rails I18n: servono entrambi?](https://generaltranslation.com/it/kb/general-translation-vs-rails-i18n.mdx)

## Sitemap

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