Internacionalização (i18n) em PHP: biblioteca gettext e abordagens modernas

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

Internacionalização (i18n) em PHP: do básico às soluções modernas

\n\n

Internacionalização (i18n) é o processo de projetar software de forma que ele possa ser facilmente adaptado para diferentes idiomas e regiões sem alterar o código. Em PHP, existem várias abordagens para implementar i18n, desde funções nativas até bibliotecas poderosas. Neste artigo, veremos as principais ferramentas e melhores práticas.

\n\n

Por que a internacionalização é necessária?

\n

O principal objetivo do i18n é separar o texto da interface do código. Isso permite:

\n
    \n
  • Adicionar novos idiomas sem alterar a lógica da aplicação
  • \n
  • Suportar múltiplos locales (formatos de data, números, moedas)
  • \n
  • Simplificar o processo de tradução para tradutores
  • \n
  • Cumprir padrões regionais (por exemplo, formato de número de telefone)
  • \n
\n\n

Suporte nativo: gettext

\n

O PHP oferece um mecanismo poderoso gettext para trabalhar com traduções. Esta é uma abordagem clássica, usada na maioria dos sistemas Linux.

\n\n

Instalação e configuração

\n

Certifique-se de que a extensão gettext esteja instalada. Na maioria das distribuições Linux, ela está disponível por padrão. Para Windows, pode ser necessário habilitar php_gettext.dll no php.ini.

\n\n

Criação de arquivos de tradução

\n

Primeiro, crie um diretório para os locales. Estrutura típica:

\n
locale/\n  pt_BR/\n    LC_MESSAGES/\n      messages.po\n      messages.mo\n  en_US/\n    LC_MESSAGES/\n      messages.po\n      messages.mo
\n\n

Os arquivos .po (Portable Object) são arquivos de texto com traduções. Exemplo de conteúdo de messages.po para português:

\n
msgid "Welcome"\nmsgstr "Bem-vindo"\n\nmsgid "Hello, %s!"\nmsgstr "Olá, %s!"
\n\n

Compile o .po para o binário .mo usando o utilitário msgfmt:

\n
msgfmt locale/pt_BR/LC_MESSAGES/messages.po -o locale/pt_BR/LC_MESSAGES/messages.mo
\n\n

Uso no código

\n

Exemplo de script PHP com gettext:

\n
<?php\n// Define o locale e o domínio\n$locale = 'pt_BR';\nputenv("LANG=$locale");\nsetlocale(LC_ALL, $locale);\nbindtextdomain('messages', __DIR__ . '/locale');\ntextdomain('messages');\n\n// Tradução de strings\necho gettext('Welcome'); // Exibe "Bem-vindo"\necho _('Hello, %s!', 'João'); // Exibe "Olá, João!"\n?>
\n\n

A função _() é uma abreviação para gettext(). Para tradução com placeholders, use sprintf():

\n
echo sprintf(_('Hello, %s!'), $username);
\n\n

Abordagem moderna: symfony/translation

\n

Para projetos grandes, é mais conveniente usar a biblioteca symfony/translation. Ela oferece uma interface mais flexível, suporte a diferentes formatos (YAML, XLIFF, JSON) e integra-se facilmente com frameworks.

\n\n

Instalação via Composer

\n
composer require symfony/translation
\n\n

Exemplo de uso

\n
<?php\nrequire_once __DIR__ . '/vendor/autoload.php';\n\nuse Symfony\\Component\\Translation\\Translator;\nuse Symfony\\Component\\Translation\\Loader\\ArrayLoader;\n\n$translator = new Translator('pt_BR');\n$translator->addLoader('array', new ArrayLoader());\n\n// Adiciona traduções diretamente (para demonstração)\n$translator->addResource('array', [\n    'Welcome' => 'Bem-vindo',\n    'Hello %name%' => 'Olá, %name%',\n], 'pt_BR');\n\n// Alterna para inglês\n$translator->setLocale('en_US');\n$translator->addResource('array', [\n    'Welcome' => 'Welcome',\n    'Hello %name%' => 'Hello, %name%',\n], 'en_US');\n\n// Uso\necho $translator->trans('Welcome'); // "Welcome"\necho $translator->trans('Hello %name%', ['%name%' => 'John']); // "Hello, John"\n?>
\n\n

Trabalhando com arquivos YAML

\n

Crie o arquivo messages.pt.yaml:

Recommendations