← PHP

Redireccionar para a página do idioma

Lida 5871 vezes

Offline

tomassantos 
Membro
Mensagens 1061 Gostos 1
Feedback +1

Troféus totais: 26
Trófeus: (Ver todos)
Super Combination Combination Topic Starter 10 Poll Votes Poll Voter Level 5 Level 4 Level 3 Level 2 Level 1

Olá,

Tenho este código para redireccionar para a página do idioma:

Código: [Seleccione]
<?php

$explode_um 
explode(';'$_SERVER['HTTP_USER_AGENT']);
$explode_dois explode(';'$explode_um['3']);
$lang $explode_dois['0'];

$language['pt-PT'] = 'pt-PT';
$language['pt-BR'] = 'pt-BR';
$language['en'] = 'en';

if (
$language[$lang] == pt-PT or $language[$lang] == pt-BR){
header('Location: pt.html');
} else {
header('Location: en.html');
}

?>

Penso que este script pega o idioma do browser.

Ele está-me a mandar bem para o pt, mas pedi para me experimentarem no estrangeiro e não funcionou.

Alguma alternativa?

Obrigado.
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 ($language[$lang] == pt-PT or $language[$lang] == pt-BR){Esta linha está mal, devia ser:
Código: [Seleccione]
if ($language[$lang] == "pt-PT" or $language[$lang] == "pt-BR"){
Tens a minha solução
Código: [Seleccione]
<?php
        $stream 
fopen("http://www.ipdomain.info/cc[".$_SERVER['REMOTE_ADDR']."]""r");
        if(
stream_get_contents($stream) == "pt") {
                
header('Location: pt.html');
        }
        else {
                
header('Location: en.html');
        }
        
fclose($stream);
}
?>

Podes ver mais em: http://www.anjo2.com/blog/repositorio-de-codigo/
Offline

João Silva 
Membro
Mensagens 1185 Gostos 0
Feedback +6

Troféus totais: 27
Trófeus: (Ver todos)
Super Combination Combination Topic Starter 10 Poll Votes Poll Voter Level 5 Level 4 Level 3 Level 2 Level 1

como se aplica este código mesmo ?

Isto ajuda a melhorar numa indexação noutras linguagens ?
Offline

=IceBurn= 
Membro
Mensagens 897 Gostos 3
Feedback +3

Troféus totais: 32
Trófeus: (Ver todos)
Windows User Level 6 Linux User Mobile User Super Combination Combination Topic Starter Poll Voter Poll Starter Level 5

Bem, no servidor instalei Maxmind Geo IP que é bastante útil para estes casos. Inclusive tenho-o instalado como módulo do Apache, ou seja, tenho isso na superglobal $_SERVER.

O código que tinhas, tomassantos, nunca poderia dar certo, porque a superglobal do HTTP USER AGENT não retorna o idioma preferido do utilizador. Por aí não ias mesmo a lado nenhum.

Já o código do anjo2 tem vários contras:
1) Por exemplo, se o site ipdomain.info estiver em baixo, não te vai servir de grande ajuda, ainda que não seja o caso, vai atrasar-te a velocidade do redireccionamentp pois tens de somar ao tempo de execução do script o tempo que leva a ligar a esse site.

2) Para além de que o código podia estar mais optimizado, bastaria usar file_get_contents em vez de ter que abrir com fopen() para depois chamar stream_get_contents() de depois fechar com fclose(), ainda para mais depois de chamar header(), não faz sentido e está errado.

3) Uma outra coisa é que esse site retorna o código do país em maiúsculas, por isso independentemente do IP, o código como está vai sempre assumir outro idioma que não o 'PT'.

Não leves a mal Anjo2, mas acho que devias rever esses snippets.

Eu, se não tivesse acesso ao Maxmind Geo IP e se quisesse utilizar PHP para o efeito, provavelmente faria algo deste género:

Código: (php) [Seleccione]
<?php

if( stripos$_SERVER['HTTP_ACCEPT_LANGUAGE'], 'pt' ) !== false ) {
    
    
// PT
    
header'Location: http://dominio.com/pt.html'true301 );
    
    
} else {
    
    
// Outro idioma...
    
header'Location: http://dominio.com/en.html'true301 );
    
}

exit;

?>

Outra coisa, embora funcione sem URL completo, as "regras HTTP" mandam que o atributo de Location na header seja um URL completo, por isso alteraria isso também.


Para evitar um redireccioamento para o 'EN' quando o 'PT' é um dos idiomas de preferência secundária, podes substituir a condição nesta linha:

Código: (php) [Seleccione]
if( stripos( $_SERVER['HTTP_ACCEPT_LANGUAGE'], 'pt' ) !== false ) {
por esta:

Código: (php) [Seleccione]
if( preg_match('#^pt#', $_SERVER['HTTP_ACCEPT_LANGUAGE']) ) {


Até podes ir mais longe e fazeres um redireccionamento no HTACCESS, ainda poupavas uns milésimos de segundo :) Era como eu faria.
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

IceBurn o meu não está errado, não está lá nenhum exit, logo ele deve executar o código até ao fim.
O código original tem sessões, para que não esteja sempre a ir ver o ip, pode-se mudar para cookies e assim raramente precisa de ir ver, sendo que isto não é em todas as páginas, logo não há grande problema.
Se podia estar melhor o código? Podia, mas para quê? E olha que por só usares uma função não quer dizer que seja mais rápido e ocupe menos memória.

O teu código tem sérios erros, o moved permanently em termos de SEO pode ser muito mau mesmo e nada diz que não deves usar links relativos, no RFC2616 diz para usar um ou outro sem restrições, onde leste que deve ser o extenso e não o relativo?

By the way, a maioria dos meus códigos públicos não são os finais e não estão optimizados, são meros exemplos para ajudar as pessoas sempre que precisem, funcionam a 100%.
Offline

=IceBurn= 
Membro
Mensagens 897 Gostos 3
Feedback +3

Troféus totais: 32
Trófeus: (Ver todos)
Windows User Level 6 Linux User Mobile User Super Combination Combination Topic Starter Poll Voter Poll Starter Level 5

É a tua opinião e respeito, mas não retiro nada do que disse - mas sim, o teu código tem erros, não está optimizado e ainda tem uma '}' a mais.

Obviamente não me recordo onde li a respeito dos URL completos, mas é uma questão de fazeres uma pesquisa.

Quanto aos 301, é só retirares tomassantos, de modo a ficar só ex:  header( 'Location: http://dominio.com/en.html');
Offline

=IceBurn= 
Membro
Mensagens 897 Gostos 3
Feedback +3

Troféus totais: 32
Trófeus: (Ver todos)
Windows User Level 6 Linux User Mobile User Super Combination Combination Topic Starter Poll Voter Poll Starter Level 5

O teu código tem sérios erros,

Não, não tem.
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

Era um erro sério, o do 301, mas tem outros erros, não estás a ver se está definido a variável por exemplo, são pormenores que pouco interessam, mas que fossem estes os maiores erros que fazemos...
Offline

=IceBurn= 
Membro
Mensagens 897 Gostos 3
Feedback +3

Troféus totais: 32
Trófeus: (Ver todos)
Windows User Level 6 Linux User Mobile User Super Combination Combination Topic Starter Poll Voter Poll Starter Level 5

Era um erro sério, o do 301, mas tem outros erros, não estás a ver se está definido a variável por exemplo, são pormenores que pouco interessam, mas que fossem estes os maiores erros que fazemos...

Meu caro, se não estiver definida, o código simplesmente assume que o idioma é outro que não o 'PT' e a menos que ele tenha o error reporting para E_ALL ou similar (coisa que em produção ninguém tem), não vai acontecer nada de estranho, portanto não inventes erros onde eles não existem, porque só estás a confundir as pessoas.

Mas se quiseres adiciono essa verificação na boa.
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

IceBurn, tu falaste na perfeição do código, e esse é um erro que numa linguagem a sério é provável que nem compile... Eu não estou a confundir as pessoas, ambos os códigos não são bons para produção, desenrascam.

Para o dono do tópico aconselho a não utilizar o 301 e a usar links relativos, quando se muda realmente o endereço em definitivo (sem variações) é que é passível de utilizar o extenso.

A minha conversa acaba por aqui.
Offline

=IceBurn= 
Membro
Mensagens 897 Gostos 3
Feedback +3

Troféus totais: 32
Trófeus: (Ver todos)
Windows User Level 6 Linux User Mobile User Super Combination Combination Topic Starter Poll Voter Poll Starter Level 5

Sobre aquele assunto dos URL absolutos, dei-me ao trabalho de pesquisar na documentação, já agora para quem estiver interessado:

Citar
14.30 Location

   The Location response-header field is used to redirect the recipient
   to a location other than the Request-URI for completion of the
   request or identification of a new resource. For 201 (Created)
   responses, the Location is that of the new resource which was created
   by the request. For 3xx responses, the location SHOULD indicate the
   server's preferred URI for automatic redirection to the resource. The
   field value consists of a single absolute URI.

       Location       = "Location" ":" absoluteURI

   An example is:

       Location: http://www.w3.org/pub/WWW/People.html

      Note: The Content-Location header field (section 14.14) differs
      from Location in that the Content-Location identifies the original
      location of the entity enclosed in the request. It is therefore
      possible for a response to contain header fields for both Location
      and Content-Location. Also see section 13.10 for cache
      requirements of some methods.

http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.30


Já agora, só mesmo a título informativo e para que não pensem que ando para aqui a inventar, URI absoluto só não é obrigatório no Content-Location que é muito diferente de Location.

Offline

=IceBurn= 
Membro
Mensagens 897 Gostos 3
Feedback +3

Troféus totais: 32
Trófeus: (Ver todos)
Windows User Level 6 Linux User Mobile User Super Combination Combination Topic Starter Poll Voter Poll Starter Level 5

IceBurn, tu falaste na perfeição do código, e esse é um erro que numa linguagem a sério é provável que nem compile... Eu não estou a confundir as pessoas, ambos os códigos não são bons para produção, desenrascam.

Para o dono do tópico aconselho a não utilizar o 301 e a usar links relativos, quando se muda realmente o endereço em definitivo (sem variações) é que é passível de utilizar o extenso.

A minha conversa acaba por aqui.

Eu não falei em perfeição, falei em optimização, são coisas muito diferentes mas preferes continuar a inventar erros onde não existem.

Estamos a falar de PHP, não estamos a falar de nenhuma outra linguagem.

Eu não sou melhor que os outros de forma alguma, nem sequer tento passar essa imagem (longe de mim bah! detesto pessoas convencidas), mas enquanto aprendia PHP aceitava quando me alertavam para determinadas situações, mas tudo bem, quem realmente entender de PHP facilmente tira as suas conclusões sobre o que está realmente correcto.
Offline

=IceBurn= 
Membro
Mensagens 897 Gostos 3
Feedback +3

Troféus totais: 32
Trófeus: (Ver todos)
Windows User Level 6 Linux User Mobile User Super Combination Combination Topic Starter Poll Voter Poll Starter Level 5

como se aplica este código mesmo ?

Com isto tudo nem levaste resposta...

Bem, a forma mais fácil é colocares o código no index.php (partindo do principio que é esse o ficheiro que tens por defeito nas configurações do Apache) de modo a que quando acederem ao site, as pessoas sejam redireccionadas de acordo com o idioma.


( peço desculpa pelo post triplo :-/ )
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

Por estar enganado sobre o Location, que realmente requer o extenso embora a maioria dos browsers aceitem o relativo, o código deverá ficar algo do género:

Código: [Seleccione]
$host  = $_SERVER['HTTP_HOST'];
$uri   = rtrim(dirname($_SERVER['PHP_SELF']), '/\\');
header("Location: http://$host$uri/en.html");
Isto para que seja aceite em qualquer domínio/directoria.
Offline

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

É um erro assumir que só porque o IP indica que a pessoa pertence a um certo país e linguagem que isso é correcto.

Podes ter portugueses espalhados pelos 4 cantos do mundo que preferem a página em português e não na língua que estão a usar.

E muitas vezes a detecção do ip funciona mal.