• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

andrepcg

Sistema multi-language

8 mensagens neste tópico

Eu sei que no tópico codebetter estão lá muitos scripts sobre este tema mas nao consegui por nenhum a funcionar bem.

Neste momento tenho este:

<?php
session_start();
//session_register(lang);
if ($_GET['lang'] != "") {
$_SESSION['lang'] = $_GET['lang'];
if ($_SESSION['lang'] == "eng") {
$_SESSION['lang'] = "eng";
include 'lang.eng.php';
}
if ($_SESSION['lang'] == "pt") {
$_SESSION['lang'] = "pt";
include 'lang.pt.php';
}
} else {
if ($_SESSION['lang'] == "") {
$_SESSION['lang'] = "eng";
include 'lang.eng.php';
}
}
?>
<html>
<head>
<title><?php echo TITLE; ?></title>
</head>
<body>
<p><a href="?lang=eng">Eng</a> | <a href="?lang=pt">PT</a></p>
<p><?php echo NEWS; ?><br />
  <br />
  <br />
  <?php echo FOOTER; ?>
</p>
</body>
</html>




lang.eng.php:

<?php
define("TITLE", "Title of page", true);
define("NEWS", "News of the day", true);
define("FOOTER", "This is a footer", true);
?>



lang.pt.php:

<?php
define("TITLE", "Titulo da pagina", true);
define("NEWS", "Noticia do dia", true);
define("FOOTER", "Isto e um footer", true);
?>

quando no endereço coloco http://localhost/lang/index.php ele carrega muito bem a linguagem por defeito. quando coloco http://localhost/spread/index.php?lang=pt ele tambem carrega, mas depois quando volto a ficar com apenas index.php, ele já não faz echo ao TITLE em pt e aparece mesmo a dizer TITLE em vez de "Titulo da pagina".

preciso que me ajudem

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

o que preciso mesmo é de um script que baste colocar uma vez ?lang=pt e fica registado para todas as paginas, e sempre que mudo de pagina ele ja sabe que é lang=pt. só depois de se especificar outra vez lang=eng é que ele volta a mudar para eng em todas as paginas

capitche?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Indenta o teu código!!!

<?php
session_start();
//session_register(lang);
if ($_GET['lang'] != "") {
    $_SESSION['lang'] = $_GET['lang'];
    if ($_SESSION['lang'] == "eng") {
        $_SESSION['lang'] = "eng";
        include 'lang.eng.php';
    }
    if ($_SESSION['lang'] == "pt") {
        $_SESSION['lang'] = "pt";
        include 'lang.pt.php';
    }
} else {
    if ($_SESSION['lang'] == "") {
        $_SESSION['lang'] = "eng";
        include 'lang.eng.php';
    }
}
?>

Primeira vez, sem $_GET nem $_SESSION

faz o último include 'lang.eng.php' e mete $_SESSION['lang'] = "eng"

Segunda vez, com $_SESSION['lang'] == 'eng' e $_GET['lang'] == 'pt'

faz o segundo include 'lang.pt.php' e mete $_SESSION['lang'] = 'pt' (duas vezes!)

Terceira vez, com $_SESSION['lang'] == 'pt' e sem $_GET

Não faz include nenhum.

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

Sugestão (não testada): muda o teu código para

<?php
session_start();

if ($_GET['lang'] != "") {
    $_SESSION['lang'] = $_GET['lang'];
}
if (!isset($_SESSION['lang'])) {
    $_SESSION['lang'] = 'eng';
}
include "lang.{$_SESSION['lang']}.php"
?>

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

haha! és um génio. a tua sugestão funcionou. obrigado.

só mais uma coisa. o que aconselhas para adicionar esta função em todas as páginas? include?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu fazia desse pedaço de código uma função,

punha essa função junto com outras que precisasse para todas as páginas do site

e inluia o ficheiro com as funções.

Depois, no princípio das páginas, logo a seguir ao session_start(), chamava a função da linguagem.

Basicamente é um include, mas dentro do include só há funções que é preciso chamar.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mas umas dicas para ficares com um sistema bem escrito:

Usa variáveis em vez de constantes. Há diversas razões para o fazeres: não afastas a possibilidade de redifinir a string, dá mais flexibilidade na medida em que strings podem conter outras strings e evita por exemplo o problema que te apareceu de te fazer output do nome da constante.

PMG, essa solução precisa de validação, assim é demasiado perigosa, sendo apenas precisa uma conta no mesmo servidor para injectar código.

Saneia (é assim que se diz?) a variável $_SESSION["lang"]

qualquer coisa tipo:

<?php
session_start();

if ($_GET['lang'] != "") {
    $_SESSION['lang'] = $_GET['lang'];
}
if (!isset($_SESSION['lang'])) {
    $_SESSION['lang'] = 'eng';
}

if($preg_match("|[a-zA-Z]{2,3}|")){
    die("Olha um script kid!!...uuuuuhu!");
    
}
include "lang.{$_SESSION['lang']}.php"
?>

Assim a a definição da lingua só pode ter duas ou três letras.

Tambem é boa ideia colocares as permissões de escrita desligadas para todas as pessoas menos tu na pasta onde tens os ficheiros da linguagem.

chmod goa-w lang

supondo que a pasta se chama 'lang'

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Saneia (é assim que se diz?) a variável $_SESSION["lang"]

Tens toda a razão, pedrotuga.

Só não falei nisso para não complicar ... mas já que tocaste no assunto, em vez de sanear o $_SESSION, eu saneava o $_GET

$allowed_langs = array('eng', 'pt', 'fr', 'it',
                       'chinese_cantonese', 'chinese_mandarin');

/* ... */

if ($_GET['lang'] != "") {
    if (in_array($_GET['lang'], $allowed_langs)) {
        $_SESSION['lang'] = $_GET['lang'];
    }
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Assim como tens foi a primeira coisa que me ocorreu, só tem a desvantagem de se ter que definir à partida os idiomas possíveis, por isso é que meti ali aquela expressão regular.

Quanto ao saneamento ( ? ) não estava a ver porque é que o tinha feito... a questão  é queo código usa mal a variáveis de sessão o que acabou por me deixar todo confundido.

Adicionalmente esqueci-me de um parametro na chamada à preg_match();

O que eu queria/devia ter escrito era mais ou menos isto:

<?php
session_start();

if (!isset($_SESSION['lang'])) {
    
    if($preg_match("|[a-zA-Z]{2,3}|",$_GET["lang"])){ die("Olha um script kid!!...uuuuuhu!");}
    $_SESSION['lang'] = $_GET["lang"];
}


if(!include ("lang.{$_SESSION['lang']}.php")){die("ERRO: Ficheiro de linguagem inválido!")}

?>

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora