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

Sign in to follow this  
andrepcg

Sistema multi-language

Recommended Posts

andrepcg

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


Manda piadas secas por telefone - Piadas.secas.club

Share this post


Link to post
Share on other sites
andrepcg

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?


Manda piadas secas por telefone - Piadas.secas.club

Share this post


Link to post
Share on other sites
pmg

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"
?>


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites
andrepcg

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?


Manda piadas secas por telefone - Piadas.secas.club

Share this post


Link to post
Share on other sites
pmg

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.


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites
pedrotuga

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'

Share this post


Link to post
Share on other sites
pmg
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'];
    }
}


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites
pedrotuga

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!")}

?>

Share this post


Link to post
Share on other sites

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
Sign in to follow this  

×

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.