[RESOLU] Bug dans le code PHP de changement de langues

Eléphanteau du PHP | 27 Messages

02 déc. 2017, 00:14

Bonjour
J'ai repris un site bilingue (Français et Anglais) et je doit rajouter l'allemand comme 3ème langue. Aidez moi à modifier le code PHP de gestion de langues. Merci

Voici le code PHP de départ avec les 2 langues :
<?php
/*
	Gestion de langue Front End
-------------------------------------------------------------------------- */
$Lang_List=array("fr","en");  
// Règles
if (isset($_GET['l'])&&(@in_array($_GET['l'],$Lang_List))) {
	define('LG', $_GET['l']);
}
elseif (isset($_SESSION["userLg"])) {
	define('LG', $_SESSION["userLg"]);
}
elseif (!defined('LG')) {
	define('LG', "fr");
}
else { 
	$Accept_Lang=explode(",",$_SERVER['HTTP_ACCEPT_LANGUAGE']);  
	reset($Accept_Lang);
	while (list($Index, $Language)=@each($Accept_Lang)) {

		if (eregi("^(.+);q=([0-9.]*)$", $Language, $Part)) {
			$Accept_Lang[$Index]=$Part[2].';'.strtolower($Part[1]);
		}
		else {
			$Accept_Lang[$Index]='1.0;'.strtolower($Accept_Lang[$Index]);
		}
	}
	//tri par ordre de préférence
	arsort($Accept_Lang);
	reset($Accept_Lang);
	while (list(,$ALang)=@each($Accept_Lang)) {

		reset($Lang_List);
		while (list(,$Language)=@each($Lang_List)) {

			if (strpos($ALang,$Language)!=0) {
				define('LG', $Language);
				break 2;	
			}
		}
	}
unset($Accept_Lang, $ALang, $Language);
}
$_SESSION["userLg"]=LG;

/*
	GET control
------------------------------------------------------------------------- */
function getControl($getter) {

	return htmlentities(stripslashes($getter), ENT_QUOTES, 'UTF-8');
}

/*
	GET link
------------------------------------------------------------------------- */
function getLink($url) {

	return PATH.'/'.getControl(LG).'/'.$url;
}

/*
	GET title
------------------------------------------------------------------------- */
function getTitle($fr, $en) {
	
	switch(LG) {
		case 'fr' : return $fr;
		break;
		case 'en' : return $en;
		break;
	}
}

/*------------------------------------------------------------------------*/
function getCurrent($url) {

	return substr(strrchr($url, '/'), 0);
}
Voici le code PHP avec la 3ème langue et là ça bug, ça plante le site :
<?php
/*
	Gestion de langue Front End
-------------------------------------------------------------------------- */
$Lang_List=array("fr","en", "de");
// Règles
if (isset($_GET['l'])&&(@in_array($_GET['l'],$Lang_List))) {
	define('LG', $_GET['l']);
}
elseif (isset($_SESSION["userLg"])) {
	define('LG', $_SESSION["userLg"]);
}
elseif (!defined('LG')) {
	define('LG', "fr");
}
else {
	$Accept_Lang=explode(",",$_SERVER['HTTP_ACCEPT_LANGUAGE']);
	reset($Accept_Lang);
	while (list($Index, $Language)=@each($Accept_Lang)) {

		if (eregi("^(.+);q=([0-9.]*)$", $Language, $Part)) {
			$Accept_Lang[$Index]=$Part[2].';'.strtolower($Part[1]);
		}
		else {
			$Accept_Lang[$Index]='1.0;'.strtolower($Accept_Lang[$Index]);
		}
	}
	//tri par ordre de préférence
	arsort($Accept_Lang);
	reset($Accept_Lang);
	while (list(,$ALang)=@each($Accept_Lang)) {

		reset($Lang_List);
		while (list(,$Language)=@each($Lang_List)) {

			if (strpos($ALang,$Language)!=0) {
				define('LG', $Language);
				break 2;
			}
		}
	}
unset($Accept_Lang, $ALang, $Language);
}
$_SESSION["userLg"]=LG;

/*
	GET control
------------------------------------------------------------------------- */
function getControl($getter) {

	return htmlentities(stripslashes($getter), ENT_QUOTES, 'UTF-8');
}

/*
	GET link
------------------------------------------------------------------------- */
function getLink($url) {

	return PATH.'/'.getControl(LG).'/'.$url;
}

/*
	GET title
------------------------------------------------------------------------- */
function getTitle($fr, $en, $de) {

	switch(LG) {
		case 'fr' : return $fr;
		break;
		case 'en' : return $en;
		break;
		case 'de' : return $de;
		break;
	}
}

/*------------------------------------------------------------------------*/
function getCurrent($url) {

	return substr(strrchr($url, '/'), 0);
}

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

02 déc. 2017, 01:38

Bonjour,

On ne va pas le faire à ta place, en revanche on peut t'aider si tu as des problèmes donc commence déjà à comprendre comment fonctionne ton code initial, essaye de le modifier et dis nous quand tu auras des messages erreurs qui te bloqueront.
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphanteau du PHP | 27 Messages

02 déc. 2017, 12:38

Je ne comprend pas entièrement le code, particulièrement cette partie :
if (eregi("^(.+);q=([0-9.]*)$", $Language, $Part)) {
			$Accept_Lang[$Index]=$Part[2].';'.strtolower($Part[1]);
		}
		else {
			$Accept_Lang[$Index]='1.0;'.strtolower($Accept_Lang[$Index]);
		}
Quelqu'un peut-il m'aider ?

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

02 déc. 2017, 12:44

C'est une expression régulière pour analyser la variable $Language et récupérer les langues de cette variable.

Pour tester/construire ou même comprendre le fonctionnement d'une expression régulière, je te recommande le site regex101, en survolant la regex tu auras bloc par bloc ce qui est en train d'essayer d'être extrait :
https://regex101.com/r/kAuMIF/1


Enfin, il faut noter que la fonction eregi() n'existe plus dans les versions récentes de PHP, il faudra que tu la remplace par preg_match() :
http://php.net/manual/fr/function.eregi.php
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphanteau du PHP | 27 Messages

02 déc. 2017, 14:49

Je constate que mon code ne fonctionne pas dès que je modifie cette fonction et je ne comprend pas pourquoi:
GET title
------------------------------------------------------------------------- */
function getTitle($fr, $en) {

	switch(LG) {
		case 'fr' : return $fr;
		break;
		case 'en' : return $en;
		break;
	}
}
Par :
GET title
------------------------------------------------------------------------- */
function getTitle($fr, $en, $de) {

	switch(LG) {
		case 'fr' : return $fr;
		break;
		case 'en' : return $en;
		break;
                case 'de' : return $de;
		break;
	}
}
On m'a également conseillé ce tuto (Site multilingue avec détection de la langue de l'explorateur) et je vois que je n'ai pas d'erreur dans les premières lignes du code :
http://codes-sources.commentcamarche.ne ... xplorateur

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

02 déc. 2017, 15:36

Ce tuto a 11 ans !
Je te déconseille trèèèèèèèèèès fortement de l'utiliser.

Le code que tu indiques me semble correct, quel est le message d'erreur rencontré ?
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphanteau du PHP | 27 Messages

02 déc. 2017, 16:55

Il n'y a pas de message d'erreur mais c juste que la page (les parties à traduire du site) disparaissent. Quand je rajoute la 3ème variable de la 3ème langue, le site ne s'affiche plus !

Mammouth du PHP | 2703 Messages

02 déc. 2017, 18:36

getTitle prenait 2 paramètres, maintenant 3. si l'appel de la fonction se fait toujours en passant 2 paramètres alors cela peut être l'explication.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

02 déc. 2017, 20:18

le site ne s'affiche plus !
Si tu obtiens une page complètement blanche alors c'est qu'il y a un message d'erreur mais que tu n'as pas activé leur affichage ce qui est très gênant pour développer.
On a un tuto ici :
faq-tutoriels/page-blanche-script-php-c ... 73178.html
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphanteau du PHP | 27 Messages

03 déc. 2017, 18:44

Y a une avancée, la page s'affiche déjà car c'était un problème de version de PHP et dans un autre fichier, la fonction getTitle() n'avait conservé que 2 paramètres au lieu de 3.

Le probleme que j'ai encore ce que la traduction de la page de la 3ème langue ne s'affiche pas et me renvoie vers une page d'erreur 404. Est ce un probleme au niveau du htaccess ? le voici :
ErrorDocument 404 http://www.monsite.com/404
#-----------------------------------------------------------------------------------------
Options +FollowSymlinks
RewriteEngine on
RewriteBase /
#-----------------------------------------------------------------------------------------
RewriteRule ^([fren]+)$ index.php?l=$1 [L]
RewriteRule ^([fren]+)/hebergement$ hebergement/index.php?l=$1 [L]
RewriteRule ^([fren]+)/restauration$ restauration/index.php?l=$1 [L]
RewriteRule ^([fren]+)/bar-brasserie$ bar-brasserie/index.php?l=$1 [L]
RewriteRule ^([fren]+)/seminaire$ seminaire/index.php?l=$1 [L]
RewriteRule ^([fren]+)/environs$ environs/index.php?l=$1 [L]
RewriteRule ^([fren]+)/loisirs$ loisirs/index.php?l=$1 [L]
RewriteRule ^([fren]+)/contact$ contact/index.php?l=$1 [L]
RewriteRule ^([fren]+)/acces$ acces/index.php?l=$1 [L]
RewriteRule ^([fren]+)/legal$ legal/index.php?l=$1 [L]
RewriteRule ^([fren]+)/apropos$ apropos/index.php?l=$1 [L]
RewriteRule ^([fren]+)/404$ 404/index.php?l=$1 [L]
#-----------------------------------------------------------------------------------------
RedirectPermanent /ang.htm http://www.monsite.com/en
RedirectPermanent /all.htm http://www.monsite.com/en
RedirectPermanent /environsetliens.htm http://www.monsite.com/environs
RedirectPermanent /environsetliensang.htm http://www.monsite.com/en/environs
RedirectPermanent /environsetliensall.htm http://www.monsite.com/en/environs
RedirectPermanent /acces.htm http://www.monsite.com/acces
RedirectPermanent /accesall.htm http://www.monsite.com/en/acces
RedirectPermanent /accesang.htm http://www.monsite.com/en/acces
RedirectPermanent /restaurant.htm http://www.monsite.com/restauration
RedirectPermanent /restaurantang.htm http://www.monsite.com/en/restauration
RedirectPermanent /restaurantall.htm http://www.monsite.com/en/restauration
RedirectPermanent /seminaires.htm http://www.monsite.com/seminaire
RedirectPermanent /seminairesang.htm http://www.monsite.com/en/seminaire
RedirectPermanent /seminairesall.htm http://www.monsite.com/en/seminaire
RedirectPermanent /reservation.htm http://www.monsite.com/contact
RedirectPermanent /reservationang.htm http://www.monsite.com/en/contact
RedirectPermanent /reservationall.htm http://www.monsite.com/en/contact
RedirectPermanent /hebergement.htm http://www.monsite.com/hebergement
RedirectPermanent /hebergementall.htm http://www.monsite.com/en/hebergement
RedirectPermanent /hebergementang.htm http://www.monsite.com/en/hebergement
RedirectPermanent /bar.htm http://www.monsite.com/bar-brasserie
RedirectPermanent /barall.htm http://www.monsite.com/en/bar-brasserie
RedirectPermanent /barang.htm http://www.monsite.com/en/bar-brasserie
RedirectPermanent /tarifs.htm http://www.monsite.com/contact
RedirectPermanent /tarifsang.htm http://www.monsite.com/en/contact
RedirectPermanent /tarifsang.htm http://www.monsite.com/en/contact
Et voici le code PHP qui contient les icônes des langues sur lesquelles les utilisateurs cliquent pour obtenir la traduction :
<span id="intl"><a href="<?php print PATH ?>/fr<?php print ((getCurrent($_SERVER['REQUEST_URI'])!='/' && getCurrent($_SERVER['REQUEST_URI'])!='/fr')?getCurrent($_SERVER['REQUEST_URI']):'') ?>" title="Fran&ccedil;ais"><img src="<?php print PATH.'/img/icon/fr.png' ?>" alt="Fran&ccedil;ais" /></a> 
	<a href="<?php print PATH ?>/en<?php print ((getCurrent($_SERVER['REQUEST_URI'])!='/' && getCurrent($_SERVER['REQUEST_URI'])!='/en')?getCurrent($_SERVER['REQUEST_URI']):'') ?>" title="English"><img src="<?php print PATH.'/img/icon/gb.png' ?>" alt="English" /></a> 
	<a href="<?php print PATH ?>/de<?php print ((getCurrent($_SERVER['REQUEST_URI'])!='/' && getCurrent($_SERVER['REQUEST_URI'])!='/de')?getCurrent($_SERVER['REQUEST_URI']):'') ?>" title="Deutsch"><img src="<?php print PATH.'/img/icon/de.png' ?>" alt="Deutsch" /></a></span>

Eléphanteau du PHP | 27 Messages

03 déc. 2017, 20:02

Merci à tous, ça marche, il fallait remplacer :
([fren]+)

Par :

(fr|en|de)