Por que a internacionalização PHP não é apenas "tradução de palavras"
\n\nImagine: 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\nSituaçã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\nNeste 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\ni18n vs l10n: qual a diferença (e por que é importante)
\n\nAntes 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\nUma 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\nPara 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\nStack tecnológico para i18n em PHP
\n\nNo 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.
1. Gettext — o avô do multilíngue
\n\nGettext 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.
2. ICU MessageFormat — para lógica complexa
\n\nA 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.
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
Prática: configurando gettext em PHP do zero
\n\nSuponha que temos um script simples index.php que exibe uma saudação. Vamos torná-lo multilíngue.
Passo 1. Preparação do código
\n\nEnvolva todas as strings na função _() (alias para gettext()):
<?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\nPasso 2. Geração do arquivo .pot
\n\nInstale o gettext no servidor ou use xgettext:
xgettext -o locales/messages.pot index.php --from-code=UTF-8\n\nPasso 3. Criação da tradução
\n\nCopie messages.pot para locales/pt_BR/LC_MESSAGES/messages.po e edite:
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