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, acrescente recursos 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.

Porquê 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, pelo que lança uma só compilação e muda de idioma imediatamente.
Terminal
npm install @jsverse/transloco
2

Configurar Transloco

Registe Transloco na configuração da aplicação. Tem de 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 ficheiros JSON. Verifique se estão em src/assets/i18n/ e se a lista assets de angular.json inclui esse caminho.

Criar ficheiros de tradução

Crie um ficheiro JSON por idioma em src/assets/i18n/. Utilize chaves aninhadas para organizar as cadeias 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 subscrição 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 subscrição em cada utilização. Nos modelos com muitas cadeias traduzidas, prefira a diretiva estrutural *transloco, que cria uma única subscrição 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 cadeia. Defina as regras nos ficheiros 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 ficheiros de tradução.

Recursos regionais inteligentes com angular-locale-chain

Por predefinição, Transloco recorre à região predefinida quando falta uma chave. Um utilizador 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 recurso por chave quando um ficheiro de tradução está parcialmente completo.

Estrutura de ficheiros 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 ficheiros regionais 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 ficheiro de origem, traduza apenas as diferenças em vez de voltar a gerar tudo. Assim preserva as traduções revistas por pessoas e evita alterações desnecessárias.

Automatizar a qualidade das traduções

Detete 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 ficheiros 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 ficheiros de tradução têm de estar em assets/i18n/[scope]/[lang].json, não na pasta i18n de raiz. Certifique-se também de que o âmbito está registado na lista providers do componente através de TRANSLOCO_SCOPE.

Avisos na consola em produção

Defina prodMode: true na configuração de Transloco para as compilações de produção. Sem esta opção, Transloco regista avisos sobre chaves em falta na consola. Também desativa verificações de desenvolvimento que acrescentam 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 por traduzir. Utilize TRANSLOCO_LOADING_TEMPLATE integrado no Transloco para mostrar um estado de carregamento ou pré-carregue as traduções numa proteção de rota.

Os utilizadores regionais veem inglês em vez da região principal

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

Experimente já o i18n Agent

Largue aqui o seu ficheiro de tradução

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

ou clique para selecionar

Idiomas de destino

Sem registoEstimativa imediata

Recurso regional com angular-locale-chain

Quando falta uma chave de tradução numa região como pt-BR, TranslocoLoader do Angular passa diretamente para a região predefinida em vez de verificar primeiro a região 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 o nosso guia de recurso regional para ver a lista completa de frameworks compatíveis e as 75 cadeias integradas. Learn more →

Perguntas frequentes sobre i18n em Angular