21/03/2024
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.
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";
?>
Vamos dividir o código em partes menores para entender cada seção melhor.
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}}.'
]
];
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.
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.
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.
<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>
<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.
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.