Internacionalização PHP: como criar um site em todos os idiomas do mundo

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Por que a internacionalização PHP não é apenas "tradução de palavras"

\n\n

Imagine: você escreveu um projeto PHP incrível. Ele funciona, agrada os usuários, gera lucro. Mas um dia, nas estatísticas, você percebe que 30% do tráfego é da Alemanha, 15% do Japão e 10% dos Emirados Árabes Unidos. Seu site fala apenas russo. Os usuários vão embora sem encontrar o botão "Comprar" no seu idioma.

\n\n

Situação familiar? A internacionalização (i18n) de aplicações PHP não é apenas substituir palavras em um template. É uma abordagem arquitetônica que permite que seu código "entenda" cultura, moeda, datas e até mesmo a direção do texto (da esquerda para a direita ou da direita para a esquerda).

\n\n

Neste artigo, vamos explorar como transformar um site PHP comum em uma plataforma multilíngue, usando ferramentas nativas e melhores práticas. Você aprenderá como funciona o gettext em PHP, a diferença entre localização e internacionalização, e como evitar armadilhas com pluralização.

\n\n

i18n vs l10n: qual a diferença (e por que é importante)

\n\n

Antes de escrever código, vamos alinhar os termos. Internacionalização (i18n) é a preparação do código para tradução: extrair strings, trabalhar com formatos de números, datas, moedas. Localização (l10n) é o processo de tradução e adaptação para uma região específica.

\n\n

Uma analogia simples: internacionalização é construir uma casa com cômodos vazios onde se pode colocar qualquer mobília. Localização é arrumar a mobília de acordo com o gosto do morador.

\n\n

Para o desenvolvedor PHP, isso significa: não hardcode strings! Nunca. Mesmo que o site seja apenas em russo agora. Cada frase deve ser envolvida em uma função de tradução.

\n\n

Stack tecnológico para i18n em PHP

\n\n

No ecossistema PHP, existem várias ferramentas poderosas. Vamos abordar duas abordagens principais: o clássico gettext e o moderno ICU MessageFormat através da extensão intl.

\n\n

1. Gettext — o avô do multilíngue

\n\n

Gettext em PHP é o padrão de facto para muitos CMS (WordPress, Drupal). Ele usa arquivos .po e .mo para armazenar traduções. Vantagens: simplicidade, suporte a formas plurais, integração com Poedit.

\n\n

2. ICU MessageFormat — para lógica complexa

\n\n

A extensão PHP intl (Internationalization) fornece as classes MessageFormatter e NumberFormatter. É a escolha para projetos que precisam de templates complexos com seleção de caso, gênero e número.

\n\n

3. Bibliotecas wrapper

\n
    \n
  • symfony/translation — componente do Symfony, funciona com YAML/XLIFF e gettext.
  • \n
  • laravel-localization — para Laravel (pacote mcamara/laravel-localization).
  • \n
  • zend-i18n — para Laminas (antigo Zend Framework).
  • \n
\n\n

Prática: configurando gettext em PHP do zero

\n\n

Suponha que temos um script simples index.php que exibe uma saudação. Vamos torná-lo multilíngue.

\n\n

Passo 1. Preparação do código

\n\n

Envolva todas as strings na função _() (alias para gettext()):

\n\n
<?php\n// index.php\necho _("Bem-vindo ao nosso site!");\n\n$items = 5;\n// Para formas plurais, use ngettext\necho ngettext("%d item", "%d itens", $items);\n?>
\n\n

Passo 2. Geração do arquivo .pot

\n\n

Instale o gettext no servidor ou use xgettext:

\n\n
xgettext -o locales/messages.pot index.php --from-code=UTF-8
\n\n

Passo 3. Criação da tradução

\n\n

Copie messages.pot para locales/pt_BR/LC_MESSAGES/messages.po e edite:

\n\n
msgid "Bem-vindo ao nosso site!"\nmsgstr "Welcome to our site!"\n\nmsgid "%d item"\nmsgid_plural "%d itens"\nmsgstr[0] "%d item"\nmsgstr[1] "%d items"
\n\n

Passo 4. Compilação e pós

Blogs

Book Recommendations