Como criar um site multi-idiomas em PHP

Aprenda a usar a extensão intl para responder conteúdo no idioma do visitante

21/03/2024

Como criar um site multi-idiomas em PHP

Como criar um site multi-idiomas em PHP

Introdução

Este artigo explora a adaptação do conteúdo de um site ao idioma do visitante usando PHP e a extensão intl. A internacionalização é chave para atingir uma audiência mais ampla, melhorando a experiência do usuário.

Detalharemos o processo de detecção automática do idioma do navegador através do cabeçalho Accept-Language, permitindo a apresentação do conteúdo na língua preferida do usuário de forma automática e eficiente.

Código Pronto para Uso

Este é o código que detecta o idioma do navegador do usuário e responde com mensagens apropriadas:

<?php
// Dicionários de idiomas com mensagens
$messages = [
    'en' => [
        'welcome' => 'Welcome, user!',
        'date_info' => 'Today is {0, date, long}',
        'money_info' => 'Your balance is {0, number, currency}',
        'visits_info' => 'You have visited us {0, plural, one{# time} other{# times}}.'
    ],
    'pt' => [
        'welcome' => 'Bem-vindo, usuário!',
        'date_info' => 'Hoje é {0, date, long}',
        'money_info' => 'Seu saldo é {0, number, currency}',
        'visits_info' => 'Você nos visitou {0, plural, one{# vez} other{# vezes}}.'
    ]
];

// Detectar idioma do navegador ou usar inglês como padrão
$acceptLang = $_SERVER['HTTP_ACCEPT_LANGUAGE'] ?? 'en';
$preferredLang = substr($acceptLang, 0, 2);
$locale = in_array($preferredLang, ['en', 'pt']) ? $preferredLang : 'en';
$fmtLocale = $locale == 'pt' ? 'pt_BR' : 'en_US';


// Exibir mensagens formatadas
echo "<h1>" . $messages[$locale]['welcome'] . "</h1>\n";
echo "<p>" . MessageFormatter::formatMessage($fmtLocale, $messages[$locale]['date_info'], [new DateTime()]) . "</p>\n";
echo "<p>" . MessageFormatter::formatMessage($fmtLocale, $messages[$locale]['money_info'], [1234.56]) . "</p>\n";
echo "<p>" . MessageFormatter::formatMessage($fmtLocale, $messages[$locale]['visits_info'], [3]) . "</p>\n";
?>

Explicando o Código

Vamos dividir o código em partes menores para entender cada seção melhor.

Dicionários de Idiomas

Os dicionários armazenam as mensagens em diferentes idiomas. Usamos placeholders como {0, date, long} e {0, number, currency} nos textos. Esses placeholders serão substituídos por valores formatados pelo MessageFormatter, permitindo a personalização de datas e números conforme o idioma.

$messages = [
    'en' => [
        'welcome' => 'Welcome, user!',
        'date_info' => 'Today is {0, date, long}',
        'money_info' => 'Your balance is {0, number, currency}',
        'visits_info' => 'You have visited us {0, plural, one{# time} other{# times}}.'
    ],
    'pt' => [
        'welcome' => 'Bem-vindo, usuário!',
        'date_info' => 'Hoje é {0, date, long}',
        'money_info' => 'Seu saldo é {0, number, currency}',
        'visits_info' => 'Você nos visitou {0, plural, one{# vez} other{# vezes}}.'
    ]
];

Detectando o Idioma do Navegador

Para proporcionar uma experiência mais personalizada, é crucial determinar o idioma preferido do usuário. Este processo é realizado inspecionando o cabeçalho HTTP_ACCEPT_LANGUAGE enviado pelo navegador do usuário. Este cabeçalho lista as preferências de idioma do usuário, que geralmente são configuradas em seu sistema operacional ou nas configurações do navegador.

// Detectar idioma do navegador ou usar inglês como padrão
$acceptLang = $_SERVER['HTTP_ACCEPT_LANGUAGE'] ?? 'en';
$preferredLang = substr($acceptLang, 0, 2);
$locale = in_array($preferredLang, ['en', 'pt']) ? $preferredLang : 'en';

Este trecho de código tenta obter o idioma preferencial a partir do cabeçalho HTTP_ACCEPT_LANGUAGE. Se não conseguir detectar um idioma suportado (neste caso, inglês ou português), ele define o inglês como idioma padrão. A função substr é usada para extrair apenas os dois primeiros caracteres do código do idioma, que representam o idioma principal, ignorando variantes regionais ou dialetos.

Formatando Mensagens com Locale

Após determinar o idioma preferido do usuário, o próximo passo é utilizar essa informação para formatar mensagens, datas e números de forma que se alinhem com as convenções culturais do idioma escolhido. Isso é feito com o auxílio da classe MessageFormatter da extensão intl do PHP.

$fmtLocale = $locale == 'pt' ? 'pt_BR' : 'en_US';

// Exibir mensagens formatadas
echo "<h1>" . $messages[$locale]['welcome'] . "</h1>\n";
echo "<p>" . MessageFormatter::formatMessage($fmtLocale, $messages[$locale]['date_info'], [new DateTime()]) . "</p>\n";
echo "<p>" . MessageFormatter::formatMessage($fmtLocale, $messages[$locale]['money_info'], [1234.56]) . "</p>\n";
echo "<p>" . MessageFormatter::formatMessage($fmtLocale, $messages[$locale]['visits_info'], [3]) . "</p>\n";

Este segmento do código define o locale a ser usado na formatação das mensagens, escolhendo entre português do Brasil (pt_BR) e inglês dos Estados Unidos (en_US), baseado na preferência de idioma detectada anteriormente. Utilizamos a classe MessageFormatter para aplicar a formatação localizada de datas, números e pluralizações, garantindo que as mensagens exibidas estejam alinhadas com as convenções culturais e linguísticas do idioma selecionado.

Resultado do Programa em Inglês e Português

Quando executado, o programa identifica o idioma do navegador do usuário e exibe as mensagens apropriadas no idioma selecionado. Abaixo, apresentamos exemplos de como serão as saídas do programa tanto em inglês quanto em português, considerando que a data atual é 21 de março de 2024, o saldo do usuário é de 1234.56, e ele visitou o site 3 vezes.

Em Inglês (en_US)

<h1>Welcome, user!</h1>
<p>Today is March 21, 2024.</p>
<p>Your balance is $1,234.56.</p>
<p>You have visited us 3 times.</p>

Em Português (pt_BR)

<h1>Bem-vindo, usuário!</h1>
<p>Hoje é 21 de março de 2024.</p>
<p>Seu saldo é R$ 1.234,56.</p>
<p>Você nos visitou 3 vezes.</p>

Esses exemplos demonstram a capacidade do programa de adaptar-se automaticamente ao idioma do usuário, oferecendo uma experiência personalizada e acessível.

Conclusão

Este artigo demonstrou como personalizar o conteúdo do seu site para se adaptar ao idioma do visitante utilizando PHP e a extensão intl. Através de exemplos práticos, abordamos a detecção do idioma do usuário, o uso de dicionários de idiomas e a formatação de mensagens conforme as convenções locais.

A implementação dessas técnicas pode significativamente enriquecer a experiência do usuário, tornando seu site mais acessível e amigável a uma audiência global. Embora tenhamos focado em exemplos com inglês e português, os métodos discutidos são aplicáveis a qualquer idioma suportado pela extensão intl.

Para mais informações e aprofundamento técnico, consulte a documentação oficial da extensão intl. Encorajamos o uso dessas práticas para melhorar a internacionalização de seus projetos web.

Este artigo nas redes sociais: Facebook, Twitter/X, LinkedIn, Telegram, Pinterest, Tumblr, Flipboard, Mastodon

Domínios hospedados
Clientes satisfeitos