Sistema Multi-Linguagem em PHP
Introdução
Neste tutorial vou explicar como criar um Sistema Multi-Linguagem em PHP, como o que é utilizado no meu próprio website:
www.ruigomes.eu.
O sistema consiste em ter vários ficheiros que apenas contêm o texto e, na página em que se quer ter várias linguagens, faz-se um include do ficheiro adequado.
Parte 1 - Ficheiros Necessários
Neste tutorial vou usar como exemplo um site com duas línguas: Português e Inglês.
Começamos por criar uma pasta onde vamos ter os ficheiros com os textos.
Vou utilizar como exemplo uma pasta de nome: "lang".
Dentro dessa pasta criamos dois ficheiros: 'en.php' e 'pt.php'
No ficheiro 'en.php' vamos escrever o seguinte:
<?php
define( 'TEXTO1', 'This is a test.' );
?>
E no ficheiro 'pt.php' vamos escrever o seguinte:
<?php
define( 'TEXTO1', 'Isto é um teste.' );
?>
Basicamente, temos de definir uma constante com
o mesmo nome, mas em diferentes linguagens.
Para adicionar mais variáveis é apenas necessário acrescentar:
define( 'NOME_DA_VARIAVEL', 'texto da variável' );
É necessário ter a váriavel com o mesmo nome em ambos os ficheiros (pt.php e en.php), com o texto na linguagem devida (em 'pt.php' o texto deve estar em português, e em 'en.php' o texto deve estar em inglês.
Pode criar todas as linguagens que quiser, apenas criando outro ficheiro dentro da pasta "lang", com as constantes definidas na lingua que deseja adicionar
Se, por exemplo, quiser ter texto em Francês, pode criar o ficheiro 'fr.php' com o seguinte código:
<?php
define( 'TEXTO1', 'Ceci est un test' );
?>
Parte 2 - Carregar a linguagem
No ínicio do index.php (ou a página a traduzir) devemos incluir o seguinte código:
<?php
if (!isset($_COOKIE["lang"])) {
include "lang/en.php"; }
elseif ($_COOKIE["lang"]=="en") {
include "lang/en.php"; }
elseif ($_COOKIE["lang"]=="pt") {
include "lang/pt.php"; }
?>
O que este código faz é:
- Se não houver nenhum cookie definido, o sistema carrega o ficheiro 'en.php'
- Se houver um cookie que definida que a linguagem a utilizar é o Inglês, o sistema carrega o ficheiro 'en.php'
- Se houver um cookie que definida que a linguagem a utilizar é o Português, o sistema carrega o ficheiro 'pt.php'
Para incluir outras linguagens, basta inserir o seguinte código, depois de [b" ]include "lang/pt.php"; } "[/b]:
elseif ($_COOKIE["lang"]=="lingua") {
include "lang/lingua.php"; }
Se, por exemplo, desejasse incluir texto em Francês, o código completo ficaria assim:
<?php
if (!isset($_COOKIE["lang"])) {
include "lang/en.php"; }
elseif ($_COOKIE["lang"]=="en") {
include "lang/en.php"; }
elseif ($_COOKIE["lang"]=="pt") {
include "lang/pt.php"; }
elseif ($_COOKIE["lang"]=="fr") {
include "lang/fr.php"; }
?>
Parte 3 - Definir os Cookies
Agora é necessário ter uma maneira de definir a linguagem que queremos utilizar.
Para tal, vamos criar dois ficheiros: 'change_en.php' e 'change_pt.php' (sem as aspas, obviamente).
No ficheiro 'change_en.php' vamos escrever o seguinte código:
<?php
$expire=time()+60*60*24*30;
setcookie("lang", "en", $expire);
$back = $_SERVER['HTTP_REFERER'];
header('Location: ' . $back);
?>
No ficheiro 'change_pt.php' vamos escrever o seguinte código:
<?php
$expire=time()+60*60*24*30;
setcookie("lang", "pt", $expire);
$back = $_SERVER['HTTP_REFERER'];
header('Location: ' . $back);
?>
Para adicionar a sua própria língua, apenas precisa de mudar o "pt" ou o "en" para a língua em questão.
Se, por exemplo, desejasse incluir texto em Francês, teria de criar um novo ficheiro: 'change_fr.php', e nesse ficheiro escreveria:
<?php
$expire=time()+60*60*24*30;
setcookie("lang", "fr", $expire);
$back = $_SERVER['HTTP_REFERER'];
header('Location: ' . $back);
?>
Parte 4 - Finalizar
Agora resta aplicar o texto nas várias línguas onde quiser que ele apareça, e criar link's para os ficheiros que mudam a linguagem.
Para mostrar o texto dentro dos ficheiros de texto apenas precisa de escrever:
<?php echo TEXTO1 ?>
Para criar os links para mudar de texto precisa de escrever o seguinte:
<a href="change_en.php">Change language to English</a>
<br>
<a href="change_pt.php">Mudar a linguagem para Português</a>
Sistema de detecção de país automatizado
O tutorial incluí agora um sistema que detecta automaticamente o país do utilizador, carregando automaticamente o texto na linguagem adequada. Se o utilizador quiser, mesmo assim, visitar o site noutra linguagem, poderá continuar a fazê-lo, apenas clicando nos links para mudar a linguagem.
Para incluir esta automatização, é necessário criar um novo ficheiro chamado "detect_country.php", com o seguinte código:
<?php
function locateIp($ip){
$d = file_get_contents("http://www.ipinfodb.com/ip_query.php?ip=$ip&output=xml");
//Use backup server if cannot make a connection
if (!$d){
$backup = file_get_contents("http://backup.ipinfodb.com/ip_query.php?ip=$ip&output=xml");
$answer = new SimpleXMLElement($backup);
if (!$backup) return false; // Failed to open connection
}else{
$answer = new SimpleXMLElement($d);
}
$country_code = $answer->CountryCode;
$country_name = $answer->CountryName;
$region_name = $answer->RegionName;
$city = $answer->City;
$zippostalcode = $answer->ZipPostalCode;
$latitude = $answer->Latitude;
$longitude = $answer->Longitude;
$timezone = $answer->Timezone;
$gmtoffset = $answer->Gmtoffset;
$dstoffset = $answer->Dstoffset;
//Return the data as an array
return array('ip' => $ip, 'country_code' => $country_code, 'country_name' => $country_name, 'region_name' => $region_name, 'city' => $city, 'zippostalcode' => $zippostalcode, 'latitude' => $latitude, 'longitude' => $longitude, 'timezone' => $timezone, 'gmtoffset' => $gmtoffset, 'dstoffset' => $dstoffset);
}
?>
E modificar o código da "Parte 2 - Carregar a linguagem" para:
<?php
include "detect_country.php";
if (!isset($_COOKIE["lang"])) {
$ip = $_SERVER['REMOTE_ADDR'];
$ip_data = locateIp($ip);
if ($ip_data['country_name']=="Portugal") {
include "lang/pt.php";
} else {
include "lang/en.php"; }
}
elseif ($_COOKIE["lang"]=="en") {
include "lang/en.php"; }
elseif ($_COOKIE["lang"]=="pt") {
include "lang/pt.php"; }
?>
Para utilizar isto com outra linguagem serão necessárias algumas alterações.
Vou exemplificar, utilizando o Francês:
<?php
include "detect_country.php";
if (!isset($_COOKIE["lang"])) {
$ip = $_SERVER['REMOTE_ADDR'];
$ip_data = locateIp($ip);
if ($ip_data['country_name']=="Portugal") {
include "lang/pt.php"; }
elseif ($ip_data['country_name']=="France") {
include "lang/fr.php"; }
else {
include "lang/en.php"; }
}
elseif ($_COOKIE["lang"]=="en") {
include "lang/en.php"; }
elseif ($_COOKIE["lang"]=="pt") {
include "lang/pt.php"; }
?>
A sugestão de um sistema automatizado foi feita pelo user cenourinha, e a detecção do país é feita pelo
http://ipinfodb.com/.
Conclusão
Espero que este tutorial tenha sido útil.
Em caso de dúvida, é preferível que responda ao tópico em vez de enviar PM, pois a dúvida de uma pessoa pode ser a dúvida de outra.
Cumprimentos,
Rui Gomes