Guias Detalhados
Internacionalização

Preparar component para tradução

Para preparar seu projeto para tradução, complete as seguintes ações.

  • Use o atributo i18n para marcar texto em templates de components
  • Use o atributo i18n- para marcar strings de texto de atributos em templates de components
  • Use a tagged message string $localize para marcar strings de texto no código do component

Marcar texto no template do component

Em um template de component, os metadados i18n são o valor do atributo i18n.

<element i18n="{i18n_metadata}">{string_to_translate}</element>

Use o atributo i18n para marcar uma mensagem de texto estática em seus templates de components para tradução. Coloque-o em cada tag de elemento que contenha texto fixo que você deseja traduzir.

HELPFUL: O atributo i18n é um atributo personalizado que as ferramentas e compiladores do Angular reconhecem.

Exemplo de i18n

A seguinte tag <h1> exibe uma saudação simples em inglês, "Hello i18n!".

src/app/app.component.html

<h1>Hello i18n!</h1><h1 i18n>Hello i18n!</h1><h1 i18n="An introduction header for this sample">Hello i18n!</h1><h1 i18n="site header|An introduction header for this sample">Hello i18n!</h1><h1 i18n="An introduction header for this sample@@introductionHeader">Hello i18n!</h1><h1 i18n="site header|An introduction header for this sample@@introductionHeader">Hello i18n!</h1><h1 i18n="@@introductionHeader">Hello i18n!</h1><img [src]="logo" title="Angular logo" alt="Angular logo"><h3 i18n="@@myId">Hello</h3><!-- ... --><p i18n="@@myId">Good bye</p>

Para marcar a saudação para tradução, adicione o atributo i18n à tag <h1>.

src/app/app.component.html

<h1>Hello i18n!</h1><h1 i18n>Hello i18n!</h1><h1 i18n="An introduction header for this sample">Hello i18n!</h1><h1 i18n="site header|An introduction header for this sample">Hello i18n!</h1><h1 i18n="An introduction header for this sample@@introductionHeader">Hello i18n!</h1><h1 i18n="site header|An introduction header for this sample@@introductionHeader">Hello i18n!</h1><h1 i18n="@@introductionHeader">Hello i18n!</h1><img [src]="logo" title="Angular logo" alt="Angular logo"><h3 i18n="@@myId">Hello</h3><!-- ... --><p i18n="@@myId">Good bye</p>

Usando declaração condicional com i18n

A seguinte tag <div> exibirá texto traduzido como parte da div e aria-label baseado no status de alternância

src/app/app.component.html

<h1 i18n="User welcome|An introduction header for this sample@@introductionHeader">  Hello i18n!</h1><ng-container i18n>I don't output any element</ng-container><br /><img [src]="logo" i18n-title title="Angular logo" alt="Angular logo"/><br><button type="button" (click)="inc(1)">+</button> <button type="button" (click)="inc(-1)">-</button><span i18n>Updated {minutes, plural, =0 {just now} =1 {one minute ago} other {{{ minutes }} minutes ago}}</span>({{ minutes }})<br><br><button type="button" (click)="male()">&#9794;</button><button type="button" (click)="female()">&#9792;</button><button type="button" (click)="other()">&#9895;</button><span i18n>The author is {gender, select, male {male} female {female} other {other}}</span><br><br><span i18n>Updated: {minutes, plural,  =0 {just now}  =1 {one minute ago}  other {{{ minutes }} minutes ago by {gender, select, male {male} female {female} other {other}}}}</span><br><br><button type="button" (click)="toggleDisplay()">Toggle</button><div i18n [attr.aria-label]="toggleAriaLabel()">{{toggle()}}</div>

src/app/app.component.ts

import {Component, computed, signal} from '@angular/core';import {$localize} from '@angular/localize/init';@Component({  selector: 'app-root',  templateUrl: './app.component.html',})export class AppComponent {  minutes = 0;  gender = 'female';  fly = true;  logo = '${this.baseUrl}/angular.svg';  readonly toggle = signal(false);  readonly toggleAriaLabel = computed(() => {    return this.toggle()      ? $localize`:Toggle Button|A button to toggle status:Show`      : $localize`:Toggle Button|A button to toggle status:Hide`;  });  inc(i: number) {    this.minutes = Math.min(5, Math.max(0, this.minutes + i));  }  male() {    this.gender = 'male';  }  female() {    this.gender = 'female';  }  other() {    this.gender = 'other';  }  toggleDisplay() {    this.toggle.update((toggle) => !toggle);  }}

Traduzir texto inline sem elemento HTML

Use o elemento <ng-container> para associar um comportamento de tradução para texto específico sem alterar a forma como o texto é exibido.

HELPFUL: Cada elemento HTML cria um novo elemento DOM. Para evitar criar um novo elemento DOM, envolva o texto em um elemento <ng-container>. O exemplo a seguir mostra o elemento <ng-container> transformado em um comentário HTML não exibido.

<h1 i18n="User welcome|An introduction header for this sample@@introductionHeader">  Hello i18n!</h1><ng-container i18n>I don't output any element</ng-container><br /><img [src]="logo" i18n-title title="Angular logo" alt="Angular logo"/><br><button type="button" (click)="inc(1)">+</button> <button type="button" (click)="inc(-1)">-</button><span i18n>Updated {minutes, plural, =0 {just now} =1 {one minute ago} other {{{ minutes }} minutes ago}}</span>({{ minutes }})<br><br><button type="button" (click)="male()">&#9794;</button><button type="button" (click)="female()">&#9792;</button><button type="button" (click)="other()">&#9895;</button><span i18n>The author is {gender, select, male {male} female {female} other {other}}</span><br><br><span i18n>Updated: {minutes, plural,  =0 {just now}  =1 {one minute ago}  other {{{ minutes }} minutes ago by {gender, select, male {male} female {female} other {other}}}}</span><br><br><button type="button" (click)="toggleDisplay()">Toggle</button><div i18n [attr.aria-label]="toggleAriaLabel()">{{toggle()}}</div>

Marcar atributos de elementos para traduções

Em um template de component, os metadados i18n são o valor do atributo i18n-{attribute_name}.

<element i18n-{attribute_name}="{i18n_metadata}" {attribute_name}="{attribute_value}" />

Os atributos de elementos HTML incluem texto que deve ser traduzido junto com o resto do texto exibido no template do component.

Use i18n-{attribute_name} com qualquer atributo de qualquer elemento e substitua {attribute_name} pelo nome do atributo. Use a seguinte sintaxe para atribuir um significado, descrição e ID personalizado.

i18n-{attribute_name}="{meaning}|{description}@@{id}"

Exemplo de i18n-title

Para traduzir o título de uma imagem, revise este exemplo. O exemplo a seguir exibe uma imagem com um atributo title.

src/app/app.component.html

<h1>Hello i18n!</h1><h1 i18n>Hello i18n!</h1><h1 i18n="An introduction header for this sample">Hello i18n!</h1><h1 i18n="site header|An introduction header for this sample">Hello i18n!</h1><h1 i18n="An introduction header for this sample@@introductionHeader">Hello i18n!</h1><h1 i18n="site header|An introduction header for this sample@@introductionHeader">Hello i18n!</h1><h1 i18n="@@introductionHeader">Hello i18n!</h1><img [src]="logo" title="Angular logo" alt="Angular logo"><h3 i18n="@@myId">Hello</h3><!-- ... --><p i18n="@@myId">Good bye</p>

Para marcar o atributo title para tradução, complete a seguinte ação.

  1. Adicione o atributo i18n-title

    O exemplo a seguir mostra como marcar o atributo title na tag img adicionando i18n-title.

    src/app/app.component.html

    <h1 i18n="User welcome|An introduction header for this sample@@introductionHeader">  Hello i18n!</h1><ng-container i18n>I don't output any element</ng-container><br /><img [src]="logo" i18n-title title="Angular logo" alt="Angular logo"/><br><button type="button" (click)="inc(1)">+</button> <button type="button" (click)="inc(-1)">-</button><span i18n>Updated {minutes, plural, =0 {just now} =1 {one minute ago} other {{{ minutes }} minutes ago}}</span>({{ minutes }})<br><br><button type="button" (click)="male()">&#9794;</button><button type="button" (click)="female()">&#9792;</button><button type="button" (click)="other()">&#9895;</button><span i18n>The author is {gender, select, male {male} female {female} other {other}}</span><br><br><span i18n>Updated: {minutes, plural,  =0 {just now}  =1 {one minute ago}  other {{{ minutes }} minutes ago by {gender, select, male {male} female {female} other {other}}}}</span><br><br><button type="button" (click)="toggleDisplay()">Toggle</button><div i18n [attr.aria-label]="toggleAriaLabel()">{{toggle()}}</div>

Marcar texto no código do component

No código do component, o texto fonte de tradução e os metadados são cercados por caracteres de crase (`).

Use a tagged message string $localize para marcar uma string em seu código para tradução.

$localize`string_to_translate`;

Os metadados i18n são cercados por caracteres de dois pontos (:) e precedem o texto fonte de tradução.

$localize`:{i18n_metadata}:string_to_translate`

Incluir texto interpolado

Inclua interpolações em uma tagged message string $localize.

$localize`string_to_translate ${variable_name}`;

Nomear o placeholder de interpolação

$localize`string_to_translate ${variable_name}:placeholder_name:`;

Sintaxe condicional para traduções

return this.show ? $localize`Show Tabs` : $localize`Hide tabs`;

Metadados i18n para tradução

{meaning}|{description}@@{custom_id}

Os seguintes parâmetros fornecem contexto e informações adicionais para reduzir confusão para seu tradutor.

Parâmetro de metadados Detalhes
Custom ID Fornecer um identificador personalizado
Description Fornecer informação adicional ou contexto
Meaning Fornecer o significado ou intenção do texto dentro do contexto específico

Para informações adicionais sobre custom IDs, veja Gerenciar texto marcado com IDs personalizados.

Adicionar descrições e significados úteis

Para traduzir uma mensagem de texto com precisão, forneça informação adicional ou contexto para o tradutor.

Adicione uma descrição da mensagem de texto como o valor do atributo i18n ou tagged message string $localize.

O exemplo a seguir mostra o valor do atributo i18n.

src/app/app.component.html

<h1>Hello i18n!</h1><h1 i18n>Hello i18n!</h1><h1 i18n="An introduction header for this sample">Hello i18n!</h1><h1 i18n="site header|An introduction header for this sample">Hello i18n!</h1><h1 i18n="An introduction header for this sample@@introductionHeader">Hello i18n!</h1><h1 i18n="site header|An introduction header for this sample@@introductionHeader">Hello i18n!</h1><h1 i18n="@@introductionHeader">Hello i18n!</h1><img [src]="logo" title="Angular logo" alt="Angular logo"><h3 i18n="@@myId">Hello</h3><!-- ... --><p i18n="@@myId">Good bye</p>

O exemplo a seguir mostra o valor da tagged message string $localize com uma descrição.

$localize`:An introduction header for this sample:Hello i18n!`;

O tradutor também pode precisar saber o significado ou intenção da mensagem de texto dentro deste contexto de aplicação particular, para traduzi-la da mesma forma que outro texto com o mesmo significado. Inicie o valor do atributo i18n com o significado e separe-o da descrição com o caractere |: {meaning}|{description}.

Exemplo de h1

Por exemplo, você pode querer especificar que a tag <h1> é um cabeçalho do site que você precisa traduzido da mesma forma, seja usado como cabeçalho ou referenciado em outra seção de texto.

O exemplo a seguir mostra como especificar que a tag <h1> deve ser traduzida como um cabeçalho ou referenciada em outro lugar.

src/app/app.component.html

<h1>Hello i18n!</h1><h1 i18n>Hello i18n!</h1><h1 i18n="An introduction header for this sample">Hello i18n!</h1><h1 i18n="site header|An introduction header for this sample">Hello i18n!</h1><h1 i18n="An introduction header for this sample@@introductionHeader">Hello i18n!</h1><h1 i18n="site header|An introduction header for this sample@@introductionHeader">Hello i18n!</h1><h1 i18n="@@introductionHeader">Hello i18n!</h1><img [src]="logo" title="Angular logo" alt="Angular logo"><h3 i18n="@@myId">Hello</h3><!-- ... --><p i18n="@@myId">Good bye</p>

O resultado é que qualquer texto marcado com site header, como o significado, é traduzido exatamente da mesma forma.

O exemplo de código a seguir mostra o valor da tagged message string $localize com um significado e uma descrição.

$localize`:site header|An introduction header for this sample:Hello i18n!`;

Como os significados controlam a extração e mesclagem de texto

A ferramenta de extração do Angular gera uma entrada de unidade de tradução para cada atributo i18n em um template. A ferramenta de extração do Angular atribui a cada unidade de tradução um ID único baseado no significado e descrição.

HELPFUL: Para mais informações sobre a ferramenta de extração do Angular, veja Trabalhar com arquivos de tradução.

Os mesmos elementos de texto com significados diferentes são extraídos com IDs diferentes. Por exemplo, se a palavra "right" usa as seguintes duas definições em dois locais diferentes, a palavra é traduzida de forma diferente e mesclada de volta na aplicação como entradas de tradução diferentes.

  • correct como em "you are right"
  • direction como em "turn right"

Se os mesmos elementos de texto atenderem às seguintes condições, os elementos de texto são extraídos apenas uma vez e usam o mesmo ID.

  • Mesmo significado ou definição
  • Descrições diferentes

Essa única entrada de tradução é mesclada de volta na aplicação onde quer que os mesmos elementos de texto apareçam.

Expressões ICU

Expressões ICU ajudam você a marcar texto alternativo em templates de components para atender condições. Uma expressão ICU inclui uma propriedade do component, uma cláusula ICU e as declarações case cercadas por caracteres de chave de abertura ({) e chave de fechamento (}).

{ component_property, icu_clause, case_statements }

A propriedade do component define a variável. Uma cláusula ICU define o tipo de texto condicional.

Cláusula ICU Detalhes
plural Marcar o uso de números no plural
select Marcar escolhas para texto alternativo baseado em seus valores de string definidos

Para simplificar a tradução, use cláusulas International Components for Unicode (cláusulas ICU) com expressões regulares.

HELPFUL: As cláusulas ICU aderem ao Formato de Mensagem ICU especificado nas regras de pluralização CLDR.

Marcar plurais

Idiomas diferentes têm regras de pluralização diferentes que aumentam a dificuldade da tradução. Como outros locales expressam cardinalidade de forma diferente, você pode precisar definir categorias de pluralização que não se alinham com o inglês. Use a cláusula plural para marcar expressões que podem não ser significativas se traduzidas palavra por palavra.

{ component_property, plural, pluralization_categories }

Após a categoria de pluralização, insira o texto padrão (inglês) cercado por caracteres de chave de abertura ({) e chave de fechamento (}).

pluralization_category { }

As seguintes categorias de pluralização estão disponíveis para o inglês e podem mudar com base no locale.

Categoria de pluralização Detalhes Exemplo
zero Quantidade é zero =0 { }
zero { }
one Quantidade é 1 =1 { }
one { }
two Quantidade é 2 =2 { }
two { }
few Quantidade é 2 ou mais few { }
many Quantidade é um número grande many { }
other A quantidade padrão other { }

Se nenhuma das categorias de pluralização corresponder, o Angular usa other para corresponder ao fallback padrão para uma categoria ausente.

other { default_quantity }

HELPFUL: Para mais informações sobre categorias de pluralização, veja Escolhendo nomes de categoria de plural no CLDR - Unicode Common Locale Data Repository.

Muitos locales não suportam algumas das categorias de pluralização. O locale padrão (en-US) usa uma função plural() muito simples que não suporta a categoria de pluralização few. Outro locale com uma função plural() simples é es. O exemplo de código a seguir mostra a função plural() en-US.

function plural(n: number): number {  let i = Math.floor(Math.abs(n)),    v = n.toString().replace(/^[^.]*\.?/, '').length;  if (i === 1 && v === 0) return 1;  return 5;}

A função plural() retorna apenas 1 (one) ou 5 (other). A categoria few nunca corresponde.

Exemplo de minutes

Se você deseja exibir a seguinte frase em inglês, onde x é um número.

updated x minutes ago

E você também deseja exibir as seguintes frases baseado na cardinalidade de x.

updated just now
updated one minute ago

Use marcação HTML e interpolações. O exemplo de código a seguir mostra como usar a cláusula plural para expressar as três situações anteriores em um elemento <span>.

src/app/app.component.html

<h1 i18n="User welcome|An introduction header for this sample@@introductionHeader">  Hello i18n!</h1><ng-container i18n>I don't output any element</ng-container><br /><img [src]="logo" i18n-title title="Angular logo" alt="Angular logo"/><br><button type="button" (click)="inc(1)">+</button> <button type="button" (click)="inc(-1)">-</button><span i18n>Updated {minutes, plural, =0 {just now} =1 {one minute ago} other {{{ minutes }} minutes ago}}</span>({{ minutes }})<br><br><button type="button" (click)="male()">&#9794;</button><button type="button" (click)="female()">&#9792;</button><button type="button" (click)="other()">&#9895;</button><span i18n>The author is {gender, select, male {male} female {female} other {other}}</span><br><br><span i18n>Updated: {minutes, plural,  =0 {just now}  =1 {one minute ago}  other {{{ minutes }} minutes ago by {gender, select, male {male} female {female} other {other}}}}</span><br><br><button type="button" (click)="toggleDisplay()">Toggle</button><div i18n [attr.aria-label]="toggleAriaLabel()">{{toggle()}}</div>

Revise os seguintes detalhes no exemplo de código anterior.

Parâmetros Detalhes
minutes O primeiro parâmetro especifica que a propriedade do component é minutes e determina o número de minutos.
plural O segundo parâmetro especifica que a cláusula ICU é plural.
=0 {just now} Para zero minutos, a categoria de pluralização é =0. O valor é just now.
=1 {one minute} Para um minuto, a categoria de pluralização é =1. O valor é one minute.
other {{{minutes}} minutes ago} Para qualquer cardinalidade sem correspondência, a categoria de pluralização padrão é other. O valor é {{minutes}} minutes ago.

{{minutes}} é uma interpolação.

Marcar alternativas e expressões aninhadas

A cláusula select marca escolhas para texto alternativo baseado em seus valores de string definidos.

{ component_property, select, selection_categories }

Traduza todas as alternativas para exibir texto alternativo baseado no valor de uma variável.

Após a categoria de seleção, insira o texto (inglês) cercado por caracteres de chave de abertura ({) e chave de fechamento (}).

selection_category { text }

Locales diferentes têm construções gramaticais diferentes que aumentam a dificuldade da tradução. Use marcação HTML. Se nenhuma das categorias de seleção corresponder, o Angular usa other para corresponder ao fallback padrão para uma categoria ausente.

other { default_value }

Exemplo de gender

Se você deseja exibir a seguinte frase em inglês.

The author is other

E você também deseja exibir as seguintes frases baseado na propriedade gender do component.

The author is female
The author is male

O exemplo de código a seguir mostra como vincular a propriedade gender do component e usar a cláusula select para expressar as três situações anteriores em um elemento <span>.

A propriedade gender vincula as saídas a cada um dos seguintes valores de string.

Valor Valor em inglês
female female
male male
other other

A cláusula select mapeia os valores para as traduções apropriadas. O exemplo de código a seguir mostra a propriedade gender usada com a cláusula select.

src/app/app.component.html

<h1 i18n="User welcome|An introduction header for this sample@@introductionHeader">  Hello i18n!</h1><ng-container i18n>I don't output any element</ng-container><br /><img [src]="logo" i18n-title title="Angular logo" alt="Angular logo"/><br><button type="button" (click)="inc(1)">+</button> <button type="button" (click)="inc(-1)">-</button><span i18n>Updated {minutes, plural, =0 {just now} =1 {one minute ago} other {{{ minutes }} minutes ago}}</span>({{ minutes }})<br><br><button type="button" (click)="male()">&#9794;</button><button type="button" (click)="female()">&#9792;</button><button type="button" (click)="other()">&#9895;</button><span i18n>The author is {gender, select, male {male} female {female} other {other}}</span><br><br><span i18n>Updated: {minutes, plural,  =0 {just now}  =1 {one minute ago}  other {{{ minutes }} minutes ago by {gender, select, male {male} female {female} other {other}}}}</span><br><br><button type="button" (click)="toggleDisplay()">Toggle</button><div i18n [attr.aria-label]="toggleAriaLabel()">{{toggle()}}</div>

Exemplo de gender e minutes

Combine cláusulas diferentes juntas, como as cláusulas plural e select. O exemplo de código a seguir mostra cláusulas aninhadas baseadas nos exemplos gender e minutes.

src/app/app.component.html

<h1 i18n="User welcome|An introduction header for this sample@@introductionHeader">  Hello i18n!</h1><ng-container i18n>I don't output any element</ng-container><br /><img [src]="logo" i18n-title title="Angular logo" alt="Angular logo"/><br><button type="button" (click)="inc(1)">+</button> <button type="button" (click)="inc(-1)">-</button><span i18n>Updated {minutes, plural, =0 {just now} =1 {one minute ago} other {{{ minutes }} minutes ago}}</span>({{ minutes }})<br><br><button type="button" (click)="male()">&#9794;</button><button type="button" (click)="female()">&#9792;</button><button type="button" (click)="other()">&#9895;</button><span i18n>The author is {gender, select, male {male} female {female} other {other}}</span><br><br><span i18n>Updated: {minutes, plural,  =0 {just now}  =1 {one minute ago}  other {{{ minutes }} minutes ago by {gender, select, male {male} female {female} other {other}}}}</span><br><br><button type="button" (click)="toggleDisplay()">Toggle</button><div i18n [attr.aria-label]="toggleAriaLabel()">{{toggle()}}</div>

Próximos passos