← Tutoriais

[PHP] Sistema Multi-Linguagem

Lida 59427 vezes

Offline

marc.2377 
Membro
Mensagens 10 Gostos 1
Troféus totais: 16
Trófeus: (Ver todos)
Super Combination Combination Level 3 Level 2 Level 1 10 Posts First Post Karma Eighth year Anniversary Seventh year Anniversary

Citar
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:
Código: [Seleccione]
<?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:
Código: [Seleccione]
<?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"; }
?>

A sugestão de um sistema automatizado foi feita pelo user cenourinha, e a detecção do país é feita pelo http://ipinfodb.com/.

Olá amigos, tudo bom...
criei conta aqui nesse fórum para sanar uma dúvida atual, pretendo voltar mais vezes...
Excelente tutorial, me ajudou bastante. Mas quando chega nessa parte, tenho um problema: O allow_url_fopen do servidor está em off, e não consigo modificar.
Devido a isso, o ficheiro detect_country.php não pode carregar dados de uma url externa... no caso
$backup = file_get_contents("http://backup.ipinfodb.com/ip_query.php?ip=$ip&output=xml");
Já contatei o servidor, não tem mesmo como mudar. Mas eu tenho no meu site a tabela mysql do site http://ipinfodb.com/ip_database.php
E ela é usada pra quando o usuário vai fazer registro no meu site, já apontando qual o país do mesmo. Que modificações eu teria que adaptar ao código para puxar esses dados do mysql ao invés do site?
Desde já, muito grato.
Marcelo.
Offline

anjo2 
Membro
Mensagens 3020 Gostos 0
Troféus totais: 31
Trófeus: (Ver todos)
Super Combination Combination Topic Starter 10 Poll Votes Poll Voter Poll Starter Level 5 Level 4 Level 3 Level 2

Tenta criar um ficheiro só com:

Código: (php) [Seleccione]
<?php
$stream 
fopen("http://www.ipdomain.info/cc[".$_SERVER['REMOTE_ADDR']."]""r");
echo 
stream_get_contents($stream);
?>
E depois vê-se dá algum output.
Offline

marc.2377 
Membro
Mensagens 10 Gostos 1
Troféus totais: 16
Trófeus: (Ver todos)
Super Combination Combination Level 3 Level 2 Level 1 10 Posts First Post Karma Eighth year Anniversary Seventh year Anniversary

Tenta criar um ficheiro só com:

Código: [Seleccione]
<?php
$stream 
fopen("http://www.ipdomain.info/cc[".$_SERVER['REMOTE_ADDR']."]""r");
echo 
stream_get_contents($stream);
?>
E depois vê-se dá algum output.
Acontece o mesmo... retorna
Código: [Seleccione]
Warning: fopen() [function.fopen]: URL file-access is disabled in the server configuration in... Obrigado por tentar ajudar.
Offline

anjo2 
Membro
Mensagens 3020 Gostos 0
Troféus totais: 31
Trófeus: (Ver todos)
Super Combination Combination Topic Starter 10 Poll Votes Poll Voter Poll Starter Level 5 Level 4 Level 3 Level 2

Código: (php) [Seleccione]
<?php
$url "http://www.ipdomain.info/cc[".$_SERVER['REMOTE_ADDR']."]";
$ch curl_init();
curl_setopt($chCURLOPT_URL$url);
curl_setopt($chCURLOPT_POST0);
curl_setopt($chCURLOPT_TIMEOUT100);
curl_setopt($chCURLOPT_RETURNTRANSFER1);
curl_setopt($chCURLOPT_HTTPHEADER, array('Expect:'));
curl_setopt($chCURLOPT_POSTFIELDS$send);
$result curl_exec($ch);
curl_close($ch);
echo $result;
?>
E assim?
Offline

marc.2377 
Membro
Mensagens 10 Gostos 1
Troféus totais: 16
Trófeus: (Ver todos)
Super Combination Combination Level 3 Level 2 Level 1 10 Posts First Post Karma Eighth year Anniversary Seventh year Anniversary

Código: [Seleccione]
Fatal error: Call to undefined function locateip() in /home/woodbux2/public_html/themes/GeN4/index.php  on line 9sendo que o conteúdo da linha 9 no index.php é
Código: [Seleccione]
$ip_data = locateIp($ip); (conforme indicado no código da "parte 2" no tutorial adaptado).
Offline

marc.2377 
Membro
Mensagens 10 Gostos 1
Troféus totais: 16
Trófeus: (Ver todos)
Super Combination Combination Level 3 Level 2 Level 1 10 Posts First Post Karma Eighth year Anniversary Seventh year Anniversary

Opa, consegui aqui.
Apliquei a idéia original, e criei um arquivo .htacces no servidor com o conteúdo:
Código: [Seleccione]
php_value allow_url_fopen onE está funcionando.
Mas a minha dúvida agora é que a linha diz:
Código: [Seleccione]
if ($ip_data['country_name']=="Portugal")Sou do Brasil... como faço? já tentai mudar onde está portugal para Brazil ou Brasil, mas não está funcionando.
Obrigado.
Offline

marc.2377 
Membro
Mensagens 10 Gostos 1
Troféus totais: 16
Trófeus: (Ver todos)
Super Combination Combination Level 3 Level 2 Level 1 10 Posts First Post Karma Eighth year Anniversary Seventh year Anniversary

Resolvido. apenas coloquei
if ($ip_data['country_name']=="Brazil")
e deu certo. Mas como eu faço pra deixar os dois países?
Offline

anjo2 
Membro
Mensagens 3020 Gostos 0
Troféus totais: 31
Trófeus: (Ver todos)
Super Combination Combination Topic Starter 10 Poll Votes Poll Voter Poll Starter Level 5 Level 4 Level 3 Level 2

Código: [Seleccione]
if ($ip_data['country_name']=="Portugal" || $ip_data['country_name']=="Brazil")
O código que te dei antes é impossível dar esse erro, eu disse para criar um ficheiro novo, provavelmente não o fizeste.

Esse alojamento não me parece nada seguro...
Offline

marc.2377 
Membro
Mensagens 10 Gostos 1
Troféus totais: 16
Trófeus: (Ver todos)
Super Combination Combination Level 3 Level 2 Level 1 10 Posts First Post Karma Eighth year Anniversary Seventh year Anniversary

Código: [Seleccione]
if ($ip_data['country_name']=="Portugal" || $ip_data['country_name']=="Brazil")
O código que te dei antes é impossível dar esse erro, eu disse para criar um ficheiro novo, provavelmente não o fizeste.

Esse alojamento não me parece nada seguro...
Obrigado!
E realmente, não fiz isso... apenas coloquei o código no ficheiro detect_country.php
Me desculpe a falta de atenção.
Quanto a hospedagem, é o uolhost... até que estou gostando bastante. Quem me sugeriu como ativar o allow_url_fopen do servidor foi o operador do suporte online.
Poderia checar meu site? aqui do brasil está funcionando, e já testei com um proxy alemão também, agora preciso da ajuda de alguém de portugal...
o site é http://www.woodbux.com
E de novo, muito obrigado.
Offline

Ricardo75 
Membro
Mensagens 1660 Gostos 0
Troféus totais: 28
Trófeus: (Ver todos)
Super Combination Combination Topic Starter 10 Poll Votes Poll Voter Level 5 Level 4 Level 3 Level 2 Level 1

Está a dar este erro:

Código: [Seleccione]
Fatal error: Cannot redeclare locateip() (previously declared in /home/woodbux2/public_html/detect_country.php:2) in /home/woodbux2/public_html/detect_country.php on line 27
Offline

marc.2377 
Membro
Mensagens 10 Gostos 1
Troféus totais: 16
Trófeus: (Ver todos)
Super Combination Combination Level 3 Level 2 Level 1 10 Posts First Post Karma Eighth year Anniversary Seventh year Anniversary

Está a dar este erro:

Código: [Seleccione]
Fatal error: Cannot redeclare locateip() (previously declared in /home/woodbux2/public_html/detect_country.php:2) in /home/woodbux2/public_html/detect_country.php on line 27

Levou um tempinho, mas tá corrigido.
Isso começou a acontecer do nada. Por incrível que pareça.
Como não conseguia descobrir o que havia de errado, comecei do zero.
Obrigado pelo toque.
Offline

marc.2377 
Membro
Mensagens 10 Gostos 1
Troféus totais: 16
Trófeus: (Ver todos)
Super Combination Combination Level 3 Level 2 Level 1 10 Posts First Post Karma Eighth year Anniversary Seventh year Anniversary

o site é http://www.woodbux.com
Na verdade, estou usando um dominio temporario enquanto troco de host...
http://woodbux.freevar.com
Offline

tiko165 
Membro
Mensagens 32 Gostos 0
Troféus totais: 19
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Level 4 Level 3 Level 2 Level 1 10 Posts First Post Karma

Como faço para traduzir algo que esteja a ser lido pela Base de Dados???
Offline

Bruno Gaspar 
Membro
Mensagens 242 Gostos 1
Feedback +3

Troféus totais: 18
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Level 3 Level 2 Level 1 100 Posts 50 Posts 10 Posts

Como faço para traduzir algo que esteja a ser lido pela Base de Dados???
Que desenterro...

Mas vá, podes ter uma coluna para cada língua ou então como eu faço que é uma tabela especifica com as varias línguas e as suas traduções..
Offline

tiko165 
Membro
Mensagens 32 Gostos 0
Troféus totais: 19
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Level 4 Level 3 Level 2 Level 1 10 Posts First Post Karma

Parece ser complexo demais  :superlol: