Internacionalização (i18n) em PHP: como tornar um site multilíngue
Internacionalização (i18n) é o processo de projetar software de forma que ele possa ser facilmente adaptado para diferentes idiomas e regiões sem alterações no código. Em PHP, existem várias ferramentas poderosas para isso, que permitem separar o código do texto e, em seguida, carregar dinamicamente o idioma desejado.
Neste artigo, veremos as principais abordagens e bibliotecas para implementar i18n em PHP, incluindo as funções nativas gettext, a extensão intl e bibliotecas populares como Symfony Translation.
1. Conceitos básicos de i18n
Antes de passar para as ferramentas, é importante entender os termos-chave:
- Locale — combinação de idioma e região (por exemplo,
pt_BR,en_US,de_DE). - Tradução — substituição da string original pelo seu equivalente em outro idioma.
- Pluralização — flexão correta das palavras de acordo com o número (por exemplo, "1 arquivo", "2 arquivos", "10 arquivos").
- Formatação — adaptação de datas, números, moedas ao locale.
2. Biblioteca nativa gettext
gettext é uma ferramenta clássica para i18n, embutida no PHP. Ela usa arquivos .po (Portable Object) e .mo (Machine Object) para armazenar traduções.
Instalação e configuração
Certifique-se de que a extensão gettext está habilitada no php.ini:
extension=gettextExemplo de configuração básica:
<?php// Define o localesetlocale(LC_ALL, 'pt_BR.UTF-8');// Define o domínio (nome do arquivo .mo)bindtextdomain('messages', './locale');// Codificaçãobind_textdomain_codeset('messages', 'UTF-8');// Seleciona o domíniotextdomain('messages');
// Usa a traduçãoecho gettext("Hello, World!"); // exibirá "Olá, Mundo!"// ou de forma abreviadaecho _("Hello, World!");?>Estrutura de arquivos
Seus arquivos de tradução devem estar na pasta locale:
locale/├── pt_BR/│ └── LC_MESSAGES/│ └── messages.po│ └── messages.mo└── en_US/ └── LC_MESSAGES/ └── messages.po └── messages.moExemplo de arquivo messages.po:
msgid "Hello, World!"msgstr "Olá, Mundo!"
msgid "Files: %d"msgstr "Arquivos: %d"Para compilar .po em .mo, use o utilitário msgfmt:
msgfmt messages.po -o messages.mo3. Extensão intl (Internationalization Functions)
A extensão intl fornece recursos mais modernos para trabalhar com locales, incluindo formatação de números, datas e mensagens.
Instalação
sudo apt-get install php-intl # para Ubuntu/DebianFormatação de mensagens com MessageFormatter
<?php$locale = 'pt_BR';$message = '{0} saúda {1}!';$fmt = new MessageFormatter($locale, $message);echo $fmt->format(['PHP', 'Mundo']);// Exibirá: PHP saúda Mundo!?>Pluralização
<?php$locale = 'pt_BR';$pattern = '{0, plural, one {# arquivo} other {# arquivos}}';$fmt = new MessageFormatter($locale, $pattern);echo $fmt->format([1]); // 1 arquivoecho $fmt->format([2]); // 2 arquivosecho $fmt->format([10]); // 10 arquivos?>Formatação de datas e números
<?php$locale = 'pt_BR';$fmt = new NumberFormatter($locale, NumberFormatter::DECIMAL);echo $fmt->format(1234567.89); // 1.234.567,89
$dateFmt = new IntlDateFormatter($locale, IntlDateFormatter::LONG, IntlDateFormatter::NONE);echo $dateFmt->f Também na biblioteca
Biblioteca Padrão Go (Golang): visão geral completa
Registro para Swift (iOS/macOS): melhores soluções
Gerador de QR Codes em Rust: criação e integração em aplicações web
Cliente OAuth para TypeScript: integração de autorização em aplicações web
Serialização de objetos em Java: guia completo com exemplos