Internacionalização (i18n) em PHP: Guia Completo com Exemplos

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: 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=gettext


Exemplo 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.mo


Exemplo 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.mo


3. 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/Debian


Formataçã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

Recommendations