Jump to content

Recommended Posts

Posted

Boa tarde malta,

Como sei que não gostam de ler e querem é ver código para corrigir vai já daqui a nada.

Problema: O case escolhe sempre a última opção. Seja ela a default ou não. Já tentei com if then else mas o problema persiste. Parece-me que ele não está a fazer o break. Os alerts disparam correspondentemente à lingua. Cá vai então o código:

<?php session_start(); ?>
<html>
<head>
<script type="text/javascript">
function change_language(langu) {
switch (langu) {
case 'en':
  		alert("en: " + langu);
	<?php $lingua = "en"; ?>
  	break;
case 'pt':
	alert("pt: " + langu);
	<?php $lingua = "pt"; ?>
break;
case 'de':
	alert("de: " + langu);
	<?php $lingua = "de"; ?>
break;
default:
	alert("N/D: " + langu);
	<?php $lingua = "en"; ?>
}
<?php $_SESSION["lang"] = $lingua;
include "lang/" . $_SESSION["lang"] . ".php"; ?>
location.reload(true);
}
</script>
</head>
<body>
<img src="lang/en.png" width="16" height="16" onClick="change_language('en')"/> |
<img src="lang/pt.png" width="16" height="16" onClick="change_language('pt')"/> |
<img src="lang/de.png" width="16" height="16" onClick="change_language('de')"/>
<h1>MENU</h1>
<a href="inicio.php"><?=$pag1; ?></a><br />
<a href="pag2.php"><?=$pag2; ?></a><br />
<a href="pag3.php"><?=$pag3; ?></a><br />
<a href="pag4.php"><?=$pag4; ?></a><br /><br />
</body>
</html>

ATENÇÃO: Eu já tenho isto a funcionar de outra maneira que é usar ficheiros change_en.php change_pt.php etc etc... mas se tiver 300 linguas tenho q criar 300 ficheiros. Não procuro novos scripts nem outras opções, procuro solução para este. Obrigado 🙂

Posted

O teu problema é o PHP. Não te esqueças que o PHP corre do lado do servidor e o Javascript do lado do cliente, no browser. Isto significa que o PHP vai ignorar tudo o que esteja fora dos blocos <?php ... ?>. NO teu caso, isto significa que antes de chegar ao cliente, o PHP corre, e faz o seguinte:

- Atribui à variável $lingua o valor "en"

- Atribui à variável $lingua o valor "pt", substituindo o anterior

- Atribui à variável $lingua o valor "de", substituindo o anterior

- Atribui à variável $lingua o valor "en", substituindo o anterior

- Inclui um ficheiro de acordo com a variável de sessão.

Por isso é que a variável PHP $língua tem sempre o valor "en". Tens de pensar noutra arquitetura, porque as estruturas de controlo do Javascript não vão afetar o PHP.

O que fazes com essa variável $lingua?

Já reparei, atribuis à variável de sessão. Para alterar o idioma no servidor, tens de o passar por GET, e depois atualizas a variável. Por exemplo:

<?php
$lingua = $_GET['idioma'];

switch($lingua) {
  case 'pt':
    break;
  case 'de':
    break;
  case 'en':
    break;
  default:
    $lingua = 'en';
}

// usar a variavel de sessão com o valor do idioma (que é um dos 3 acima)
?>

// HTML por aqui fora

<script type="text/javascript">
        switch (langu) {
        case 'en':
                  alert("en: " + langu);
          break;
        case 'pt':
                alert("pt: " + langu);
        break;
        case 'de':
                alert("de: " + langu);
        break;
        default:
                alert("N/D: " + langu);
        }
        <?php $_SESSION["lang"] = $lingua;
        include "lang/" . $_SESSION["lang"] . ".php"; ?>
        window.location = 'pagina.php?idioma=' + langu;
</script>

Para mudares de idioma, tens de passar um argumento à página, por exemplo:

pagina.php?idioma=de

para mudar para alemão. No entanto, isto obriga-te a refrescar a página.

Não testei o código, mas espero que tenhas percebido a ideia, e porque não funcionava.

Nick antigo: softclean | Tens um projeto? | Wiki P@P

Ajuda a comunidade! Se encontrares algo de errado, usa a opção "Denunciar" por baixo de cada post.

Posted

Pois... essa sugestão está muito batida e fica mal andar com a language agarrado ao link sempre que se muda de página. Assim ficaria:

index.php?language=de

pagina1.php?language=de

pagina2.php?language=de

.....

Eu tenho uma solução melhor que passa por ter uma espécie de gateway que serve apenas para ir buscar o id do país! Só que isso faz com que tenha 2 ficheiros para cada lingua! um ficheiro com o texto e outro ficheiro com o tal gateway!

A variável $lingua passava por tentar buscar a variavel do javascript mas ja vi q n era possível.

QUESTÃO: Não é possível passar o resultado de uma variável de javascript para php sem usar GET/POST???!!

Posted

Não precisas de passar em todos os links. Apenas precisas de passar uma vez quando o utilizador quer mudar de idioma. De resto, podes fazer como estás a fazer, guardar a escolha numa sessão e carregar a página normalmente com o idioma escolhido previamente. Ou se insistes em ir por javascript, podes optar por AJAX, em que atualizas o idioma através de uma chamada ao servidor, e depois carregas o conteúdo dinamicamente, ou simplesmente fazer refresh à página, que virá com o idioma que está definido na sessão.

Quanto ao "ficar mal", posso dizer-te que cada URI deveria representar um recurso distinto. Por exemplo, eu quero partilhar a página com um amigo alemão (que prefere a versão em alemão). Se não tiver nenhum identificador do idioma no endereço, não posso simplesmente copiar o endereço com garantia que ele vai ver a página exatamente como eu estou a ver. Mas vamos supor que crias a tal gateway que deteta o IP da pessoa e carrega a versão correta. Resolve este problema, mas cria outro: quando o Googlebot ou outro visitar a tua página, apenas vai indexar o conteúdo que corresponde ao país de origem desse IP. Se não houver links em HTML que liguem diretamente às outras versões traduzidas do documento, estas poderão não ser indexadas nos motores de busca.

Nick antigo: softclean | Tens um projeto? | Wiki P@P

Ajuda a comunidade! Se encontrares algo de errado, usa a opção "Denunciar" por baixo de cada post.

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.