Skip to main content

i18n em Angular com Transloco: guia de configuração e tradução

Da instalação à produção: configure Transloco, trate plurais com sintaxe ICU, adicione fallbacks regionais inteligentes e automatize traduções com IA.

1

Instalar Transloco

Transloco é a biblioteca de i18n de terceiros mais popular para Angular. Oferece carregamento de traduções durante a execução, compatibilidade com o formato de mensagens ICU, âmbitos com carregamento diferido e uma API simples para modelos, com diretivas estruturais e pipes.

Por que Transloco em vez de i18n integrado no Angular? A solução integrada exige uma compilação separada para cada idioma e não permite mudar durante a execução. Transloco carrega as traduções durante a execução, por isso lança uma só compilação e muda de idioma imediatamente.
Terminal
npm install @jsverse/transloco
2

Configurar Transloco

Registre Transloco na configuração da aplicação. Deve fornecer os idiomas disponíveis, definir um idioma predefinido e configurar o carregador de traduções. Transloco aceita componentes autônomos —Angular 14 ou posterior— e padrões NgModule.

Componentes autônomos (recomendado)

app.config.ts
// app.config.ts
import { ApplicationConfig } from '@angular/core';
import { provideHttpClient } from '@angular/common/http';
import {
  provideTransloco,
  TranslocoHttpLoader,
} from '@jsverse/transloco';

export const appConfig: ApplicationConfig = {
  providers: [
    provideHttpClient(),
    provideTransloco({
      config: {
        availableLangs: ['en', 'de', 'ja', 'es', 'fr'],
        defaultLang: 'en',
        fallbackLang: 'en',
        reRenderOnLangChange: true,
        prodMode: true,
      },
      loader: TranslocoHttpLoader,
    }),
  ],
};

Padrão NgModule

app.module.ts
// app.module.ts
import { NgModule } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import {
  TranslocoModule,
  TRANSLOCO_LOADER,
  TranslocoHttpLoader,
  provideTransloco,
} from '@jsverse/transloco';

@NgModule({
  imports: [TranslocoModule],
  providers: [
    provideTransloco({
      config: {
        availableLangs: ['en', 'de', 'ja', 'es', 'fr'],
        defaultLang: 'en',
        fallbackLang: 'en',
        reRenderOnLangChange: true,
        prodMode: true,
      },
      loader: TranslocoHttpLoader,
    }),
  ],
})
export class AppModule {}
Se as traduções aparecerem como chaves em bruto, como «nav.home», em vez de «Home», a causa mais frequente é TranslocoHttpLoader não encontrar os arquivos JSON. Verifique se estão em src/assets/i18n/ e se a lista assets de angular.json inclui esse caminho.

Criar arquivos de tradução

Crie um arquivo JSON por idioma em src/assets/i18n/. Utilize chaves aninhadas para organizar as strings por funcionalidade. Transloco utiliza o formato de mensagens ICU para plurais e variáveis.

assets/i18n/*.json
// assets/i18n/en.json
{
  "nav": {
    "home": "Home",
    "about": "About",
    "settings": "Settings"
  },
  "greeting": "Hello, {{ name }}!",
  "cart": {
    "itemCount": "{count, plural, one {# item} other {# items}}"
  }
}

// assets/i18n/de.json
{
  "nav": {
    "home": "Startseite",
    "about": "Uber uns",
    "settings": "Einstellungen"
  },
  "greeting": "Hallo, {{ name }}!",
  "cart": {
    "itemCount": "{count, plural, one {# Artikel} other {# Artikel}}"
  }
}
3

Utilizar traduções em modelos e serviços

Transloco oferece três formas de traduzir em modelos: a diretiva estrutural (*transloco), o pipe (| transloco) e o serviço TranslocoService para código TypeScript. A diretiva é recomendada na maioria dos casos porque cria uma única assinatura e disponibiliza a função de tradução a todo o bloco do modelo.

Tradução no modelo

component.html
<!-- Using the transloco directive (recommended) -->
<ng-container *transloco="let t">
  <h1>{{ t('greeting', { name: userName }) }}</h1>
  <nav>
    <a routerLink="/">{{ t('nav.home') }}</a>
    <a routerLink="/about">{{ t('nav.about') }}</a>
  </nav>
</ng-container>

<!-- Using the transloco pipe -->
<h1>{{ 'greeting' | transloco:{ name: userName } }}</h1>

<!-- Using the structural directive with read -->
<ng-container *transloco="let t; read: 'nav'">
  <a routerLink="/">{{ t('home') }}</a>
  <a routerLink="/about">{{ t('about') }}</a>
</ng-container>
Utilize o parâmetro read na diretiva estrutural para limitar as traduções a uma chave aninhada. Assim evita repetir o prefixo em todas as chamadas t() e simplifica os modelos.

Tradução no serviço (TypeScript)

notification.component.ts
import { Component, inject } from '@angular/core';
import { TranslocoService } from '@jsverse/transloco';

@Component({
  selector: 'app-notification',
  template: '<span>{{ message }}</span>',
})
export class NotificationComponent {
  private translocoService = inject(TranslocoService);
  message = '';

  showSuccess() {
    // Translate in TypeScript
    this.message = this.translocoService.translate('notifications.saved');
  }

  switchLanguage(lang: string) {
    this.translocoService.setActiveLang(lang);
  }
}
O pipe transloco cria uma nova assinatura em cada utilização. Nos modelos com muitas strings traduzidas, prefira a diretiva estrutural *transloco, que cria uma única assinatura para todo o bloco.
4

Tratar plurais com o formato de mensagens ICU

Transloco utiliza o formato de mensagens ICU para plurais e expressões select. ICU trata automaticamente regras complexas —árabe com 6 formas, russo com 3 e japonês com 1— a partir de uma única string. Defina as regras nos arquivos e Transloco seleciona a forma correta durante a execução.

ICU plural syntax
// assets/i18n/en.json
{
  "cart": {
    "itemCount": "{count, plural, one {# item} other {# items}}",
    "emptyMessage": "Your cart is empty"
  },
  "notifications": {
    "unread": "{count, plural, =0 {No new notifications} one {# new notification} other {# new notifications}}"
  }
}

// assets/i18n/ar.json — Arabic has 6 plural forms
{
  "cart": {
    "itemCount": "{count, plural, zero {لا عناصر} one {عنصر واحد} two {عنصران} few {# عناصر} many {# عنصرًا} other {# عنصر}}"
  }
}

// Template usage:
// <span>{{ t('cart.itemCount', { count: cartItems.length }) }}</span>
Nunca implemente lógica de plural personalizada nos componentes. Os idiomas têm regras muito diferentes já tratadas pela especificação ICU. Deixe Transloco e ICU fazer o trabalho; deve apenas definir as formas corretas nos arquivos de tradução.

Fallbacks regionais inteligentes com angular-locale-chain

Por padrão, Transloco recorre à localidade predefinida quando falta uma chave. Um usuário pt-BR vê inglês em vez de traduções pt-PT perfeitamente válidas. angular-locale-chain corrige isto ao combinar profundamente as traduções de uma cadeia configurável antes de as entregar a Transloco. Todas as chaves são preenchidas, sem lacunas nem traduções em falta.

Terminal
npm install angular-locale-chain
app.config.ts (with locale chain)
// app.config.ts — with angular-locale-chain
import { ApplicationConfig } from '@angular/core';
import { provideHttpClient } from '@angular/common/http';
import {
  provideTransloco,
  TranslocoHttpLoader,
  TRANSLOCO_LOADER,
  TRANSLOCO_FALLBACK_STRATEGY,
} from '@jsverse/transloco';
import {
  LocaleChainLoader,
  LocaleChainFallbackStrategy,
} from 'angular-locale-chain';

export const appConfig: ApplicationConfig = {
  providers: [
    provideHttpClient(),
    provideTransloco({
      config: {
        availableLangs: ['en', 'fr', 'fr-CA', 'pt', 'pt-BR', 'de', 'de-AT'],
        defaultLang: 'en',
        fallbackLang: 'en',
        reRenderOnLangChange: true,
        prodMode: true,
      },
    }),
    {
      provide: TRANSLOCO_LOADER,
      useFactory: () => {
        const inner = new TranslocoHttpLoader();
        return new LocaleChainLoader(inner, {
          defaultLocale: 'en',
        });
      },
    },
    {
      provide: TRANSLOCO_FALLBACK_STRATEGY,
      useFactory: () => new LocaleChainFallbackStrategy(),
    },
  ],
};
angular-locale-chain é uma biblioteca de código aberto que resolve o erro n.º 574 de Transloco: ausência de fallback por chave quando um arquivo de tradução está parcialmente completo.

Estrutura de arquivos recomendada

Project Structure
my-angular-app/
├── src/
│   ├── assets/
│   │   └── i18n/
│   │       ├── en.json           # Source language
│   │       ├── de.json           # German
│   │       ├── ja.json           # Japanese
│   │       ├── es.json           # Spanish
│   │       └── fr.json           # French
│   ├── app/
│   │   ├── app.config.ts         # Transloco provider config
│   │   ├── app.component.ts
│   │   └── components/
│   │       └── lang-switcher/
│   │           └── lang-switcher.component.ts
│   └── main.ts
├── angular.json
└── package.json

Automatizar as traduções

Depois de concluir a configuração de Transloco, traduza os arquivos de localidade com IA. No IDE, peça ao assistente para traduzir o JSON de origem ou utilize a CLI do i18n Agent no pipeline de CI/CD para uma localização totalmente automatizada.

Terminal
# In your IDE, ask your AI assistant:
> Translate src/assets/i18n/en.json to German, Japanese, and Spanish

✓ de.json created (1.2s)
✓ ja.json created (1.5s)
✓ es.json created (1.1s)

# Or use the CLI in CI/CD:
npx i18n-agent translate src/assets/i18n/en.json --lang de,ja,es
Traduza de forma incremental: quando adicionar novas chaves ao arquivo de origem, traduza apenas as diferenças em vez de voltar a gerar tudo. Assim preserva as traduções revisadas por pessoas e evita alterações desnecessárias.

Automatizar a qualidade das traduções

Detecte chaves em falta e marcadores danificados antes da publicação com i18n-validate. Teste a interface com pseudotraduções através de i18n-pseudo antes de chegarem as traduções reais.

Erros frequentes

As traduções mostram chaves em bruto

TranslocoHttpLoader não encontra os arquivos JSON. Confirme se estão em src/assets/i18n/, se a lista assets de angular.json inclui esse caminho e se os nomes correspondem exatamente à configuração availableLangs —incluindo maiúsculas e minúsculas—.

As chaves com âmbito não são resolvidas

Ao utilizar âmbitos de Transloco, os arquivos de tradução devem estar em assets/i18n/[scope]/[lang].json, não na pasta i18n de raiz. Verifique também se o âmbito está registrado na lista providers do componente através de TRANSLOCO_SCOPE.

Avisos no console em produção

Defina prodMode: true na configuração de Transloco para as compilações de produção. Sem esta opção, Transloco registra avisos sobre chaves em falta no console. Também desativa verificações de desenvolvimento que adicionam encargos.

As traduções piscam ao navegar entre rotas

As rotas com carregamento diferido obtêm as traduções depois de o componente ser apresentado, provocando uma breve aparição de chaves não traduzidas. Utilize TRANSLOCO_LOADING_TEMPLATE integrado no Transloco para mostrar um estado de carregamento ou pré-carregue as traduções em uma proteção de rota.

Os usuários regionais veem inglês em vez da localidade principal

O fallback integrado do Transloco só é acionado quando falta todo o arquivo de localidade, não em chaves individuais. Utilize angular-locale-chain para combinar profundamente traduções de localidades relacionadas —por exemplo, pt-BR recorre a pt-PT, depois pt e finalmente inglês—.

Experimente já o i18n Agent

Solte aqui seu arquivo de tradução

JSON, YAML, PO, XML, CSV, Markdown, Properties

ou clique para selecionar

Idiomas de destino

Sem cadastroEstimativa imediata

Fallback regional com angular-locale-chain

Quando falta uma chave de tradução em uma localidade como pt-BR, TranslocoLoader do Angular passa diretamente para a localidade predefinida em vez de verificar primeiro a localidade principal pt.

Terminal
npm install angular-locale-chain
Configuration
import { LocaleChainLoader } from 'angular-locale-chain';

new LocaleChainLoader(innerLoader, {
  fallbacks: {
    'pt-BR': ['pt', 'en'],
    'zh-Hant-HK': ['zh-Hant', 'zh', 'en'],
  },
  defaultLocale: 'en',
});

Consulte nosso guia de fallback regional para ver a lista completa de frameworks compatíveis e as 75 cadeias integradas. Learn more →

Perguntas frequentes sobre i18n em Angular