Internacionalização (i18n) em PHP: do básico às soluções modernas
\n\nInternacionalizaçã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\nPor que a internacionalização é necessária?
\nO 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
Suporte nativo: gettext
\nO PHP oferece um mecanismo poderoso gettext para trabalhar com traduções. Esta é uma abordagem clássica, usada na maioria dos sistemas Linux.
\n\nInstalação e configuração
\nCertifique-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.
Criação de arquivos de tradução
\nPrimeiro, crie um diretório para os locales. Estrutura típica:
\nlocale/\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\nOs arquivos .po (Portable Object) são arquivos de texto com traduções. Exemplo de conteúdo de messages.po para português:
msgid "Welcome"\nmsgstr "Bem-vindo"\n\nmsgid "Hello, %s!"\nmsgstr "Olá, %s!"\n\nCompile o .po para o binário .mo usando o utilitário msgfmt:
msgfmt locale/pt_BR/LC_MESSAGES/messages.po -o locale/pt_BR/LC_MESSAGES/messages.mo\n\nUso no código
\nExemplo 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\nA função _() é uma abreviação para gettext(). Para tradução com placeholders, use sprintf():
echo sprintf(_('Hello, %s!'), $username);\n\nAbordagem moderna: symfony/translation
\nPara 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\nInstalação via Composer
\ncomposer require symfony/translation\n\nExemplo 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\nTrabalhando com arquivos YAML
\nCrie o arquivo messages.pt.yaml:
Também na biblioteca
Geração Swagger/OpenAPI para Go (Golang): guia completo
Filas de tarefas para Rust: visão geral e exemplos de uso
Monitoramento de aplicações PHP: ferramentas e bibliotecas para rastrear desempenho
Geração de relatórios PDF em Go (Golang): bibliotecas e exemplos