Uma aplicação multilíngue não consiste apenas em traduzir rótulos da interface. Se também oferece artigos, fichas de produtos ou outros recursos editoriais, deve representar o idioma de cada conteúdo, como suas versões se relacionam e o que significa uma tradução estar pronta para publicação. Um modelo impreciso acaba exibindo textos desatualizados, links sem destino ou rascunhos a usuários que não deveriam vê-los.
Para planejar a gestão de conteúdo multilíngue em PHP, convém separar as decisões de interface, dados e fluxo editorial. A implementação pode usar arquivos de tradução para a interface e o banco de dados para conteúdo variável, mas essa divisão deve atender ao domínio e às necessidades de quem edita.
Separar idioma da interface, idioma original e tradução

O idioma da interface determina rótulos, mensagens de validação, formatos de data e outros textos próprios do produto. Em uma aplicação PHP, isso pode ser gerenciado por meio de catálogos de tradução, por exemplo, arquivos organizados por locale, e selecionado com base na preferência do usuário ou em uma configuração de sessão. Não deve ser confundido com o idioma do conteúdo consultado.
Já o idioma original identifica a língua em que um recurso editorial foi criado. Cada tradução é uma versão associada a esse recurso e tem seu próprio idioma. Um usuário pode navegar pela interface em português e abrir uma página cujo conteúdo original está em inglês; a aplicação deve decidir explicitamente se isso é permitido e como informar o usuário.
Armazene códigos de idioma normalizados e aplique uma política coerente para locales regionais quando necessário. Não suponha que idioma e país sejam intercambiáveis: uma variante regional pode afetar o texto, mas também formatos, disponibilidade ou requisitos comerciais. Defina quais locales o produto aceita e quais são usados para resolver uma preferência incompleta.
Escolher um modelo de dados que represente o domínio
Há três padrões comuns, com diferentes compromissos:
- Campos por idioma: colunas como
title_esetitle_ensão simples quando há poucos idiomas, um conjunto estável de campos e consultas diretas. Perdem flexibilidade quando novos idiomas são adicionados e fazem com que cada alteração no esquema dependa do catálogo de idiomas. - Registros independentes: cada versão é armazenada como um recurso separado. Pode ser apropriado se as versões tiverem ciclos de vida ou estruturas realmente independentes, mas exige outra forma confiável de agrupá-las. Não use um título parecido ou uma URL como vínculo implícito.
- Tabela de traduções relacionada: um recurso comum é associado a uma linha por idioma, por exemplo, por meio de
content_idelocale. Isso facilita adicionar idiomas e consultar as versões disponíveis. São necessárias restrições que impeçam duplicar a tradução de um mesmo recurso no mesmo idioma.
A tabela relacionada costuma ser adequada quando as versões compartilham identidade e estrutura, mas não é uma regra universal. Se alguns campos não forem traduzidos — por exemplo, uma referência interna — eles podem permanecer na entidade comum; os campos editoriais localizados ficam na tradução. Esclareça também se uma tradução pode ter URL, metadados de busca ou data de publicação próprios.
No banco de dados, defina chaves estrangeiras, unicidade por recurso e idioma e o comportamento ao excluir dados. A lógica da aplicação em PHP também deve validar se o idioma é aceito e se o recurso relacionado existe. As restrições do banco de dados protegem contra gravações concorrentes e erros que uma validação prévia, por si só, não evita.
Relacionar versões sem exigir que todas existam
Nem todos os recursos existirão em todos os idiomas, e nem todas as traduções serão concluídas ao mesmo tempo. Modele essa realidade: a ausência de uma linha não deve ser interpretada como erro de integridade se a tradução for opcional. Por outro lado, um estado editorial deve indicar o que acontece quando existe uma linha, mas ela ainda não pode ser publicada.
Evite duplicar em cada tradução informações que pertencem ao recurso compartilhado, a menos que o domínio exija variações. Se as traduções puderem ser desvinculadas, transferidas ou preservadas como arquivo, defina essas operações e suas permissões. Para identificar o grupo de versões, use uma relação estável, não correspondências de texto, slug ou data.
Quando uma tradução mudar, registre qual versão do original serviu de referência se a equipe precisar detectar conteúdo potencialmente desatualizado. Esse sinal não comprova, por si só, que a tradução está incorreta; ele permite priorizar uma revisão. Para alguns produtos, bastará uma indicação de revisão pendente, enquanto outros precisarão de histórico de versões e auditoria.
Definir estados editoriais por idioma
O estado de publicação deve pertencer a cada tradução quando cada idioma puder ser redigido, revisado e publicado de forma independente. Um recurso pode estar publicado em um idioma e continuar como rascunho em outro. Um único booleano de publicação no nível do recurso não representa essa diferença.
Projete um fluxo pequeno e explícito, por exemplo: rascunho, em revisão e publicado. Defina quem pode alterar cada estado, quais campos são obrigatórios e se uma revisão exige aprovação. A data de publicação, a pessoa responsável e o histórico de alterações podem ser necessários para operar o processo; evite adicionar estados que não correspondam a ações reais da equipe.
As consultas públicas devem filtrar por estado e idioma, sem confiar que a interface editorial oculte as linhas não publicadas. Em PHP, concentre essas regras em uma camada de acesso ao domínio ou em consultas reutilizáveis e teste se controladores, API e tarefas em segundo plano as respeitam. As ações de edição e publicação também devem verificar as permissões para o idioma e o recurso específicos.
Resolver ausências, URLs e busca de forma coerente
Se uma tradução estiver ausente, há várias políticas possíveis. A aplicação pode ocultar o recurso nesse idioma, informar que ele só existe em outro ou exibir um fallback. Escolha de acordo com o tipo de conteúdo e o efeito sobre a experiência; um fallback não deve ser apresentado como se fosse uma tradução. Se o conteúdo for exibido em outro idioma, indique isso claramente e preserve a possibilidade de voltar à versão solicitada.
Aplique uma regra diferente à interface e ao conteúdo. O fato de os rótulos de navegação recorrerem a outro catálogo como fallback não significa que os artigos devam ser substituídos automaticamente pela versão original. O fallback editorial deve se limitar a idiomas permitidos e a conteúdo publicável, e não deve retornar rascunhos.
As URLs devem identificar uma versão real ou seguir uma regra de redirecionamento documentada. Ao mudar de idioma, procure a tradução do mesmo recurso; se ela não existir, ofereça uma alternativa explícita em vez de construir uma rota que pareça válida. Para SEO, evite publicar páginas vazias ou duplicadas por causa de fallbacks invisíveis. A busca deve indexar apenas versões elegíveis e usar o idioma correspondente para filtrar e apresentar os resultados.
Lista de verificação antes de publicar

- A interface, o idioma original e o idioma de cada tradução são conceitos separados no modelo?
- É impossível salvar duas traduções do mesmo recurso no mesmo idioma?
- Uma tradução pode estar ausente sem criar um estado incoerente?
- A equipe consegue distinguir rascunho, revisão e publicação por idioma?
- As rotas públicas e os links para mudar de idioma verificam se existe uma versão visível?
- O fallback está definido para cada caso de uso, é comunicado ao usuário e nunca expõe rascunhos?
- A busca filtra por idioma e estado e deixa de indexar uma versão retirada?
- As permissões, a edição concorrente, a exclusão, o conteúdo incompleto e as mudanças de idioma foram testados?
Teste também a retirada de uma tradução já vinculada, a atualização do original depois da publicação de uma versão e o acesso direto a uma URL indisponível. Em cada caso, verifique a resposta, a navegação e a visibilidade na busca. O objetivo não é obrigar todos os idiomas a avançar no mesmo ritmo, mas garantir que cada versão tenha uma identidade, um estado verificável e um comportamento previsível para editores e usuários.



