FuncionalidadesPluginPreçosRecursos
Mudar idioma
RecursosComo Traduzir Arquivos XLIFF (Drupal, Symfony, Angular, iOS)

Como Traduzir Arquivos XLIFF (Drupal, Symfony, Angular, iOS)

SimplePoTranslate Team16 de abril de 2026
Como Traduzir Arquivos XLIFF (Drupal, Symfony, Angular, iOS)

Uma desenvolvedora Drupal postou no Stack Overflow na semana passada com uma história que se repete milhares de vezes por ano em equipes de localização empresarial. Sua equipe exportou um arquivo XLIFF de 40MB do site Drupal. Ela o abriu em um editor de texto, colou partes no Google Translate, remontou o arquivo, importou de volta para o Drupal - e metade das páginas se recusou a renderizar porque as strings traduzidas continham XML malformado, caracteres de escape nos lugares errados e tags <g> quebradas onde a formatação inline havia sido destruída.

XLIFF é o padrão de localização empresarial por uma razão. É baseado em XML, agnóstico a ferramentas e suporta os ricos metadados que projetos de tradução sérios precisam: estados de tradução, traduções alternativas, notas entre tradutores e desenvolvedores e marcação inline estruturada. Mas sua própria flexibilidade o torna fácil de corromper, e as ferramentas que lidam com arquivos .po com segurança geralmente falham com o XLIFF.

Este guia detalha o que torna o XLIFF distinto, por que abordagens genéricas de tradução o quebram e a maneira correta de traduzir arquivos XLIFF para Drupal, Symfony, Angular e iOS - as quatro plataformas onde o XLIFF é mais comumente usado em 2026.

O Que É XLIFF (e Por Que Equipes Empresariais O Usam)

XLIFF significa XML Localization Interchange File Format. É um padrão OASIS projetado especificamente para mover conteúdo de tradução entre ferramentas - sistemas de gerenciamento de conteúdo, bancos de dados de memória de tradução, ferramentas CAT e plataformas de localização. Ao contrário dos arquivos .po do Gettext (que armazenam pares chave-valor planos) ou arquivos de localização JSON (que se aninham arbitrariamente), o XLIFF é um documento XML estruturado com um esquema padronizado.

XLIFF 1.2 vs XLIFF 2.0

Duas versões existem em uso, e não são totalmente compatíveis.

XLIFF 1.2 é a versão mais antiga e amplamente implantada. Ele usa elementos <trans-unit> para envolver conteúdo traduzível, com filhos <source> e <target>. A formatação inline usa tags emparelhadas <g>, <x> e <bpt> / <ept>. A Translation Management Tool do Drupal e muitas plataformas mais antigas ainda exportam a versão 1.2.

XLIFF 2.0 é a revisão de 2014, mais simples e limpa. Ele usa <unit> e <segment> com <source> e <target>. A marcação inline usa <pc> (código emparelhado) e <ph> (marcador de posição). O componente de tradução do Symfony e as exportações modernas do iOS padronizam para 2.0.

Uma ferramenta de tradução que lida com 1.2 não lida automaticamente com 2.0. Os vocabulários de tags são diferentes e as regras de escape diferem ligeiramente. Sempre verifique qual versão sua plataforma exporta antes de escolher um pipeline de tradução.

A Anatomia de uma Unidade XLIFF

Uma trans-unit XLIFF 1.2 mínima se parece com isto:

<trans-unit id="msg_welcome" datatype="plaintext">
  <source>Welcome, <g id="1">%name%</g>!</source>
  <target state="needs-translation">Welcome, <g id="1">%name%</g>!</target>
  <note>Displayed on the homepage after login</note>
</trans-unit>

A tag <g id="1"> envolve uma variável de placeholder. O atributo state informa à plataforma que esta string precisa de tradução. A tag <note> é uma dica do desenvolvedor. Um tradutor que entende XLIFF deve produzir:

<target state="translated">¡Bienvenido, <g id="1">%name%</g>!</target>

Um tradutor que trata o arquivo como texto simples pode produzir qualquer uma destas variantes quebradas:

<target>¡Bienvenido, <g id="1">%nombre%</g>!</target>
<target>¡Bienvenido, &lt;g id="1"&gt;%name%&lt;/g&gt;!</target>
<target>¡Bienvenido, %name%!</target>

Cada uma destas quebra a importação de forma diferente. A primeira renomeia a variável. A segunda escapa o XML. A terceira descarta a tag de formatação inteiramente.

Soluções Ruins (Por Que Você Não Pode Apenas Traduzir XML)

A maioria das equipes começa com as mesmas três abordagens e gasta vários dias antes de desistir.

Alimentando XLIFF para uma IA Genérica

Copie o arquivo, cole no Claude ou ChatGPT, peça a tradução. O modelo geralmente faz um trabalho razoável com o texto, mas trata as tags XLIFF de forma inconsistente. Às vezes, ele preserva as tags <g>, às vezes traduz o atributo id, às vezes as remove completamente. A validação falha. Sua importação gera erros de análise de XML.

Usando uma Ferramenta CAT Sem Suporte XLIFF

Ferramentas como o Poedit são construídas para o formato .po. Elas podem abrir XLIFF, mas o tratam como um contêiner de texto genérico. As tags inline não são travadas. Os placeholders não são protegidos. Você obtém uma tradução que parece boa no editor, mas falha na validação do esquema na importação.

Escrevendo um Script Personalizado

Sua equipe escreve um script Node ou Python que analisa XLIFF com xml2js, extrai strings de origem, chama o Google Translate e grava os destinos de volta. Funciona para 90% das strings. Os outros 10% - strings com formatação aninhada, grupos plurais ou caracteres especiais - quebram de maneiras que só aparecem depois que você já fez o envio.

O mesmo modo de falha "formato flexível encontra tradutor ingênuo" afeta os arquivos JSON i18next e .po do Gettext. Nosso guia sobre tradução de arquivos JSON i18next para React e Next.js e nossa postagem sobre como traduzir arquivos .po sem quebrar variáveis de código cobrem os problemas paralelos para esses formatos.

A Maneira Correta: Processamento XLIFF Ciente da Sintaxe

Um pipeline de tradução XLIFF adequado segue os mesmos princípios do nosso mecanismo PO, adaptado para XML.

Analise, Não Use Regex

Trate XLIFF como um documento estruturado. Analise-o com um verdadeiro parser XML, construa uma árvore e percorra os elementos <trans-unit> (ou <unit> para 2.0). Tentar fazer correspondência de conteúdo de origem e destino com regex é o caminho rápido para arquivos corrompidos.

Travar Tags Inline Antes da Tradução

Cada <g>, <x>, <bpt>, <ept>, <ph>, <pc> dentro de um <source> deve ser preservado por posição e atributo id. Substitua-os por placeholders numéricos antes de enviar o texto para o LLM e, em seguida, reinsira as tags originais com seus atributos após o retorno da tradução.

Respeite a Máquina de Estados

As unidades XLIFF possuem atributos de estado: new, needs-translation, translated, reviewed, final, signed-off. Um pipeline deve traduzir apenas unidades nos estados new ou needs-translation, e definir o estado de saída para translated (não final - um revisor ainda deve verificar).

Preserve a Estrutura Além das Unidades de Tradução

Arquivos XLIFF contêm cabeçalhos, metadados, atributos de nível de arquivo, notas e traduções alternativas (<alt-trans>). Estes devem permanecer inalterados durante o processo de ida e volta. Removê-los ou reordená-los quebra a compatibilidade de ida e volta com a plataforma de origem.

Validar Antes da Entrega

Antes de retornar o XLIFF traduzido, valide-o contra o esquema. O XLIFF 1.2 tem um XSD oficial. O XLIFF 2.0 tem o seu próprio. Uma ferramenta que não pode se autovalidar é uma ferramenta que entregará arquivos quebrados.

Notas Específicas da Plataforma

Cada plataforma principal que usa XLIFF tem peculiaridades que valem a pena conhecer.

Drupal

A Translation Management Tool (TMGMT) do Drupal exporta XLIFF 1.2. Os tipos de conteúdo incluem nós (páginas, artigos), termos de taxonomia e configuração. A TMGMT envolve cada campo traduzível em uma <trans-unit> separada com um formato de ID específico do Drupal (fieldname:delta:format).

Armadilha: O Drupal armazena informações de formato de texto (HTML filtrado, HTML completo, texto simples) junto com o conteúdo. A tradução deve preservar a marcação HTML quando o formato permitir, e remover para texto simples quando o formato não permitir. Seu pipeline precisa de conhecimento por campo.

Symfony

O componente de tradução do Symfony usa XLIFF 2.0 por padrão (desde o Symfony 4). As strings vivem em translations/messages.xx.xliff. O Symfony suporta o formato de mensagem ICU dentro do XLIFF, o que significa que uma única unidade pode conter estruturas {count, plural, one {...} other {...}}.

Armadilha: As categorias de plural ICU dentro do XLIFF precisam de dupla proteção. As tags XML permanecem intactas, E as palavras-chave ICU (plural, one, other, =0) não devem ser traduzidas. Muitas ferramentas XLIFF lidam com uma camada, mas não com ambas.

Angular i18n

O Angular exporta XLIFF 1.2 ou 2.0 através do comando ng extract-i18n. Os arquivos contêm strings de template de componente, com tags <x> representando expressões e interpolações Angular como {{ count }}.

Armadilha: O Angular usa colisões de hash de id em strings de origem idênticas. Uma tradução deve manter os IDs de unidade exatamente ou o Angular não poderá correspondi-los na importação. Renomear atributos id durante o processamento causa uma quebra instantânea.

iOS (Xcode Export)

O Xcode exporta XLIFF 1.2 para localização de aplicativos via Product > Export Localizations. As strings vêm de Localizable.strings, entradas Info.plist, storyboards e XIBs. As regras de plural do iOS vivem em arquivos .stringsdict exportados como trans-units adicionais.

Armadilha: As strings de storyboard do iOS referenciam IDs de elementos da UI. Estes não devem ser alterados. Além disso, o Xcode exige que o atributo target-language corresponda exatamente ao formato de localidade esperado (es, não es-ES, em alguns contextos) ou ele ignora silenciosamente a importação.

Traduzindo XLIFF com SimplePoTranslate

SimplePoTranslate suporta XLIFF nos planos Pro e Lifetime. O fluxo de trabalho é o mesmo para arquivos .po.

1. Exporte Seu XLIFF

Da sua plataforma de origem, exporte um ou mais arquivos .xliff. Para Drupal, use a ação de exportação do TMGMT. Para Symfony, encontre translations/messages.en.xliff. Para Angular, execute ng extract-i18n --format=xlf2. Para Xcode, use a exportação de Localização.

2. Faça Upload para SimplePoTranslate

Arraste o arquivo para o painel. A plataforma detecta automaticamente a versão XLIFF (1.2 ou 2.0), analisa a estrutura e identifica as unidades traduzíveis. Escolha seu idioma de destino e tom.

3. Tradução Ciente da Sintaxe

Tags inline, parâmetros ICU, placeholders e IDs de unidade são travados antes da tradução. O mecanismo de IA subjacente vê apenas texto limpo com contexto. O texto traduzido é reinserido na estrutura original exata, os estados são atualizados e o arquivo é validado contra o esquema XLIFF antes da entrega.

4. Baixe e Importe

Baixe o XLIFF traduzido (mais equivalentes .po, .json e .php se precisar de compatibilidade entre plataformas). Importe para sua plataforma de origem. Valide renderizando algumas páginas ou visualizações traduzidas antes de lançar.

# Angular example
ng extract-i18n --format=xlf2 --output-path=src/locale
# upload src/locale/messages.xlf to SimplePoTranslate
# download messages.es.xlf
# reference in angular.json i18n configuration
ng build --localize

5. Integre ao CI

Assim que você confiar no pipeline, automatize-o. Exporte XLIFF em cada lançamento, envie via API, baixe arquivos traduzidos, commit para o repositório, faça deploy. Este é o mesmo padrão amigável ao CI que muitas agências usam para tradução de .po do WordPress - veja nossa postagem sobre tradução baseada em nuvem sem sites quebrados para o padrão arquitetural.

Juntando Tudo

XLIFF é a ferramenta certa para trabalho de localização sério - estruturado, agnóstico a ferramentas e rico o suficiente para transportar metadados de projeto entre sistemas. Mas sua estrutura XML também é frágil. Cada tag, atributo e valor de estado tem peso semântico, e um tradutor que não entende XLIFF como um formato corromperá seu arquivo de maneiras que podem não aparecer até que a importação falhe ou um usuário relate uma UI quebrada.

A abordagem segura é ciente da sintaxe: analise o XML, trave os elementos estruturais, traduza apenas superfícies de texto com contexto, valide contra o esquema antes da entrega. Isso é verdade independentemente de você estar lançando um site Drupal, uma API Symfony, um SPA Angular ou um aplicativo iOS. A plataforma difere, mas a disciplina XLIFF não.

Pronto para traduzir arquivos XLIFF para Drupal, Symfony, Angular ou iOS sem tags quebradas? Experimente o SimplePoTranslate gratuitamente - não é necessário cartão de crédito. Faça upload de .xliff, baixe traduções seguras, importe para sua plataforma.