← Desenvolvimento

Redireccionar para a língua do Browser ou OS

Lida 3746 vezes

Offline

Luís Salvador 
Membro
Mensagens 2068 Gostos 37
Feedback +4

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

É o seguinte, aqui no trabalho a empresa tem o seu site em Português, Espanhol e Francês. E preciso de arranjar um script que redireccione os visitantes para a língua correcta, fazendo com que estes não percam tempo a clicar em bandeiras ou whatever...

Neste caso que redireccione para:

http://www.sitedaempresa.com/store/?___store=pt
http://www.sitedaempresa.com/store/?___store=es
http://www.sitedaempresa.com/store/?___store=fr

O site está em Magento.

Alguém conhece algum script?
Offline

JVieira 
Membro
Mensagens 54 Gostos 0
Troféus totais: 22
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Level 4 Level 3 Level 2 Level 1 50 Posts 10 Posts

Também preciso de um script que faça exactamente o mesmo (língua do OS, não do Browser).
Offline

Pedro Lopes 
Beta tester
Mensagens 3568 Gostos 18
Feedback +6

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

Para quem usa WordPress, é simples...
Offline

JVieira 
Membro
Mensagens 54 Gostos 0
Troféus totais: 22
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Level 4 Level 3 Level 2 Level 1 50 Posts 10 Posts

pois, mas neste caso utilizo um simples HTML, não tem nenhuma plataforma por trás.

Estive a investigar e parece que a melhor forma é através do IP mas não encontrei códigos. No entanto, talvez ajude alguém, encontrei código para redireccionamento pelo idioma do browser.

Código: [Seleccione]
<script language='Javascript' type='text/javascript'>
   if(navigator.browserLanguage)
      var language = navigator.browserLanguage;   
   else if(navigator.language)
      var language = navigator.language;
   switch (language.substring(0,2))
      {
      case "pt" : idioma = 1;
         break;
      case "en" : idioma = 2;
         break;
      case "es" : idioma = 3;
         break;
      default : idioma = 1;
      }
   location.href='index.php?idioma='+idioma;
</script>
Offline

Mister_Magoo 
Membro
Mensagens 594 Gostos 38
Troféus totais: 29
Trófeus: (Ver todos)
Nineth year Anniversary Eighth year Anniversary Quick Poster Signature Level 5 Search Windows User Super Combination Combination Topic Starter

Preciso disso.

Desculpas pela pergunta onde adiciona esse código ?
Offline

diogoosorio 
Membro
Mensagens 134 Gostos 1
Feedback +1

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

A MaxMind tem uma extensão PHP para detecção do país do utilizador através do seu IP.

Uma maneira "simples" será colocares uma página "à frente" do Magento onde é feita a detecção do país do utilizador.

Tens aqui a documentação da extensão: http://www.php.net/manual/en/book.geoip.php

Isto já se encontra nos repositórios da Debian, portanto assumo que CentOS e afins também já lá tenham isto (para não teres de andar a compilar à mão, ...).

Crias uma tabela na base de dados com todos os países, os ISO's e a língua correspondente. Deixo algum pseudo-código para ficares com uma ideia:


Citar
<?php
/* Recolher IP do cliente e retornar ISO
 * http://www.php.net/manual/en/function.geoip-country-code-by-name.php
 */
$ip $_SERVER['REMOTE_ADDR'];
$iso country_code_by_name($ip);

if(!
$iso)
    
$iso 'US';
    
/* Ir à base de dados verificar qual a lingua
 * do país
 */
$sqlLanguage "SELECT language FROM countries WHERE iso='$iso'";
$qryLanguage $this->db->query($sqlLanguage);
$objLanguage $qryLanguage->result();

$language $objLanguage->language;

// Encaminhar o cliente consoante a lingua
switch($language)
{
    case 
'PT':
    
header('Location: http://www.sitedaempresa.com/store/?___store=pt');
    break;
    
    case 
'EN':
    
header('Location: http://www.sitedaempresa.com/store/?___store=en');
    break;
    
    case 
'ES':
    
header('Location: http://www.sitedaempresa.com/store/?___store=es');
    break;
    
    case 
'FR':
    
header('Location: http://www.sitedaempresa.com/store/?___store=fr');
    break;
    
    default:
    
header('Location: http://www.sitedaempresa.com/store/?___store=en');
    break;
}

/** End of test.php **/

Atenção que isto é pseudo-código (principalmente na parte da base de acesso à bd, é tudo genérico só para ficares com uma ideia).

A estrutura da base de dados seria qualquer coisa assim:

Citar
id | país | iso | lingua

Depois é só associares uma língua a cada ISO.

Se precisares de uma base de dados já pré-feita, apita.
Offline

Mister_Magoo 
Membro
Mensagens 594 Gostos 38
Troféus totais: 29
Trófeus: (Ver todos)
Nineth year Anniversary Eighth year Anniversary Quick Poster Signature Level 5 Search Windows User Super Combination Combination Topic Starter

Estou usando o plugin Global Translator não sei se faz isso que pensa
Offline

JVieira 
Membro
Mensagens 54 Gostos 0
Troféus totais: 22
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Level 4 Level 3 Level 2 Level 1 50 Posts 10 Posts

hm, pois, precisava disso mesmo era em html :\ ninguém orienta?
Offline

João Godinho 
Membro
Mensagens 1755 Gostos 2
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

hm, pois, precisava disso mesmo era em html :\ ninguém orienta?
#-o
Offline

diogoosorio 
Membro
Mensagens 134 Gostos 1
Feedback +1

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

hm, pois, precisava disso mesmo era em html :\ ninguém orienta?

hm, pois, precisava disso mesmo era em html :\ ninguém orienta?

Só em "HTML", tens de recorrer mesmo a uma solução javascript.

A colocada acima pelo JVieira funciona, apesar de ser extremamente imprecisa. No IE, por exemplo a língua que é devolvida é a língua do sistema operativo: http://msdn.microsoft.com/en-us/library/ms533542%28VS.85%29.aspx.

Na melhor das hipóteses retorna a língua do browser, que nem sempre é a mesma que a do cliente (eu por exemplo tenho tudo em inglês).

Dentro de todas as soluções (pois todas são falíveis), a detecção via javascript será a menos recomendável - ainda para mais num site empresarial.

Via IP também não é infalível, mas tem uma taxa de sucesso bastante mais elevada.

De qualquer das formas, ao optar-se por uma solução destas é imperativo haver uma referência clara na página seguinte em relação às restantes línguas (um link bem visível para se saltar para outra língua). Senão é uma falha grave em termos de acessibilidade.

Para colocares aquele "código" a funcionar, faz com que a página onde queres que haja a detecção da língua (e encaminhamento para um url definido) fique assim:

Código: (html4strict) [Seleccione]
<html>
<head>
<title>A encaminhar.../Forwarding...</title>
<script language='Javascript' type='text/javascript'>
  
   // Substituir aqui os endereços correctos
   // O url_defeito é para onde é encaminhado, caso nenhuma
   // das línguas seja válida.
   var url_pt         = 'http://www.teste.com/pt';
   var url_en         = 'http://www.teste.com/en';
   var url_es        = 'http://www.teste.com/es';
   var url_defeito     = 'http://www.teste.com/pt';
  
  
    if(navigator.browserLanguage)
        var language = navigator.browserLanguage;    
    else if(navigator.language)
        var language = navigator.language;
    
    switch (language.substring(0,2))
    {
        case "pt" :
            location.href = url_pt;
        break;
        
        case "en" :
            location.href = url_en;
        break;
        
        case "es" :
            location.href = url_es;
        break;
        
        default :
            location.href = url_pt;
        break;
    }
</script>
</head>
<body>
A encaminhar para o site. / Forwarding to the website.
<body>
</html>

Só tens de substituir no inicio do código pelos endereços certos.

E esse código podia estar bem melhor. Vai-te ser impossível separar o pt-PT do pt-BR (vai tudo para o mesmo sítio), por exemplo. Mas desenrasca. :)
Offline

Diogo92 
Membro
Mensagens 62 Gostos 0
Feedback +1

Troféus totais: 21
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Level 4 Level 3 Level 2 Level 1 50 Posts 10 Posts First Post

Citar
Para quem usa WordPress, é simples...

Como é que se faz?  :)
Offline

Pedro Lopes 
Beta tester
Mensagens 3568 Gostos 18
Feedback +6

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

Enganei-me... Pensei que fosse o browser e não a língua. lol
Offline

Tonif4 
Membro
Mensagens 70 Gostos 0
Troféus totais: 21
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Level 4 Level 3 Level 2 Level 1 50 Posts 10 Posts

Olá pessoal,
Como já disseram acima, o problema do código em javascript é não dar para diferenciar pt-pt de pt-br.

Como faço para o conseguir?
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

Lê a primeira resposta aqui http://stackoverflow.com/questions/1043339/javascript-for-detecting-browser-language-preference é bastante fácil obter o pt-pt ou pt-br ou whatever, esta solução é em JS no teu outro tópico referi uma PHP, agora é só implementares a que se adequar melhor para ti.