Page 1 sur 1

include avec condition (détection de langue)

Posté : 05 nov. 2011, 14:04
par jrmy7
Bonjour à tous !

Comme vous le devinerez je débute en PHP.

Je suis entrain de réaliser un site en 3 langues différentes (en, fr, nl)... il y a donc un script de détection de la langue qui redirige vers
index_en.php
ou index_fr.php
ou index_nl.php.

Tout le texte de mon site se trouve dans un fichier externe en 3 langues :
m_lang_en_inc.php,
m_lang_fr_inc.php,
m_lang_nl_inc.php.

(fichier inclus directement dans l'une des 3 version "index").
Par exemple : m_lang_en_inc.php est inclus directement dans index_en.php

Jusque là tout fonctionne.

Maintenant mon problème:

Certain liens renvoie à une page commune au 3 versions de langues. Par exemple : fichier.php
(c'est pour éviter de créer 3 fichiers : fichier_en.php, fichier_fr.php, fichier_nl.php et donc plus de modifications).

J'ai donc mon script php qui détecte la langue (en, fr ou nl) et sous condition inclura l'un des 3 fichiers contenant le texte du site.
Voici le script :
<?php
if (!isset($langue_user) && !isset($_SESSION["ch_langue"])){
$langue_user=substr($_SERVER["HTTP_ACCEPT_LANGUAGE"], 0, 2);
	switch($langue_user){	
	case"fr":
	$_SESSION["ch_langue"] = "fr";
	include("m_lang_fr_inc.php");
	break;
		
	case "en":
	$_SESSION["ch_langue"] = "en";
	include("m_lang_en_inc.php");
	break;
		
	case "nl":
	$_SESSION["ch_langue"] = "nl";
	include("m_lang_nl_inc.php");
	break;
		
	default:
	$_SESSION["ch_langue"] = "en";
	include(".m_lang_en_inc.php");
	break;
	}
}
?>
Le problème c'est qu'il m'inclus automatiquement les 3 fichiers et utilise le premier par défaut (soit "m_lang_fr_inc.php") au lieu d'inclure seulement le fichiers correspondant à la langue détectée.

J'ai parcourus le NET, essayé maintes solutions en vain...
Alors si quelqu'un peut m'aider ce serait vraiment sympa car je ne sais plus comment faire.

Merci à tous.

jrmy7

Re: include avec condition (détection de langue)

Posté : 05 nov. 2011, 14:38
par xTG
Pas clair ta demande. Ton problème vient-il du fait que lors d'un changement de page tu n'as plus d'inclusion ?
Tu n'as pas de else à ton if avec dedans l'inclusion du fichier.
else {
  include(".m_lang_" . $_SESSION["ch_langue"]  . "_inc.php");
}
Sachant qu'il serait préférable de rajouter un test d'existence du fichier (file_exists()) vu que son nom est dynamique.

Re: include avec condition (détection de langue)

Posté : 05 nov. 2011, 16:32
par jrmy7
En fait je viens de comprendre mon problème et j'ai tout faux depuis le début.
Je m'explique.

1 - Le visiteur arrive sur mon site.
2 - Le programme détecte la langue et inclus le fichiers dans la langue approprier (par exemple "fr").
3 - Le visiteur navigue de page en page (j'ai fait ces pages pour les 3 versions de langues) et décide de changer de langue, il choisi "en" et clique donc sur le petit drapeau "anglais" dans le menu.
4 - Il se retrouve sur la version anglaise.

Jusque là pas de souci.

5 - Il veut aller sur l'une des pages en commun au 3 langues (galeries photos avec un peu de texte : voilà pourquoi je ne veut pas faire une version des ces page pour chaque langues, il y en a vraiment beaucoup !)
6 - Et là le programme doit inclure le fichier langue "en".

Ici est mon erreur : j'ai remis le programme de détection de langue, c'est donc la version "fr" qui est redétecté car je navigue en FR.
Il faut un programme qui détecte sur quel drapeau le visiteur à cliqué (dans l'exemple "en") et inclus la page texte en anglais soit "m_lang_en_inc.php".

Mais là je sèche sachant que le menu est aussi dans un fichier externe... je suis vraiment perdus.
Si quelqu'un peut m'aider..

Merci

Re: include avec condition (détection de langue)

Posté : 05 nov. 2011, 16:59
par jrmy7
La solution est peut-être de garder le fichier inclus dans la page précédente.

Explications:

Si le visiteur à choisi de cliquer sur la version anglaise le fichier inclus sera ""m_lang_en_inc.php" et quand il visitera une page commune au 3 langues cette page inclura automatiquement "m_lang_en_inc.php" (puisque c'était celui inclus précédement).

Mais je ne sais pas si c'est possible...

Re: include avec condition (détection de langue)

Posté : 05 nov. 2011, 19:25
par xTG
Il faut faire le test en priorité sur la variable de session. Et seulement si elle n'existe pas utiliser la valeur envoyée par le navigateur. :)
if( isSet($_SESSION['ch_langue']) ){
  $lang = $_SESSION['ch_langue'];
}elseif( isSet($_SERVER["HTTP_ACCEPT_LANGUAGE"]) ){
  $lang = substr($_SERVER["HTTP_ACCEPT_LANGUAGE"], 0, 2);
  $_SESSION['ch_langue'] = $lang;
}else{
  $lang = 'en';
  $_SESSION['ch_langue'] = $lang;
}
switch($lang){
//...

Re: include avec condition (détection de langue)

Posté : 05 nov. 2011, 19:28
par moogli
salut,

lorsque tu valide un changement de langue (par le clique sur le drapeau) tu place un cookie (setcookie()) avec la valeur de la langue choisie.

lorsque tu arrive sur une page tu test si le cookie existe (voir doc) si oui tu utilise la langue du cookie (en vérifiant quand même si la langue du cookie existe dans tes traductions).
sinon tu utilise la detection "automatique" de la langue ;)


@+

Re: include avec condition (détection de langue)

Posté : 05 nov. 2011, 23:23
par jrmy7
J'ai maintenant à peu près tout essayer et je commence un peu à désespérer mais la solution des cookies me semble très bien...
Malheureusement je n'y arrive pas non plus quelqu'un pourrai t-il m'aider ?

Voilà mon code :
Dans mon premier fichiers "m_page_home_fr.php" : (Tout en haut : les 3 premières lignes de code)
<?php
	setcookie ("ch_langue", "fr"); // Utilisation de la date courante, moins une heure
?>


Dans les pages où je dois récupérer le cookie pour l'utiliser entant que variable :
<?
	$langue = $_COOKIE["ch_langue"];
?> 

	<?php
   	  include("../m_inc_gnrl/m_lang_inc_gnrl/m_lang_" .$langue. "_inc.php");
 	?> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>

	<?php
		include("../m_inc_gnrl/m_head_inc_gnrl/m_head_" .$langue. "_inc.html");
	?>

</head>


<body onorientationchange="updateOrientation();">

	<div id="page_wrapper">

	<?php
   	  include("m_menu_inc_news_gallery_" .$langue. ".php");
 	?> 
    
        </div>
       
        ...

Voilà, merci d'avance...

Re: include avec condition (détection de langue)

Posté : 06 nov. 2011, 00:40
par moogli
et donc ça fait quoi ?

y a des message d'erreur ?

donne une durée de vie au cookie c'est mieux (paramètre 3)
sur la page qui valide le changement (clic que le drapeau)
<?php
if ( validation ) {
setcookie('ch_langue',$langue_choisie,3600);
}
?>
la detection de la langue
<?php
if ( isset($_COOKIE['ch_langue']) && verification_de_langue($_COOKIE['ch_langue'])) {
$langue = $_COOKIE['ch_langue'];
}
else {
// la detection plus classique
}
?>
la fonction verification_de_langue() c'est ma façon de t'indiquer qu'il faut vérifier qu'il s'agit bien d'une langue existe pour toi et pas un truc farfelus (d'ailleurs c'est la même chose quand tu valide le clic sur le drapeau)


@+

Re: include avec condition (détection de langue)

Posté : 07 nov. 2011, 19:43
par jrmy7
Je n'ai aucun message d'erreur mais ma seconde page ne reçoit pas le cookie (enfin en tout cas il ne se passe rien).
Donc je récapitule. Quand je clique sur le drapeau je retourne sur la page "home" de mon site dans la version correspondant au drapeau (fr, nl, ou en)
Dans cette page mon code commence (première ligne de script) par :
<?php
if ( validation ) {
setcookie('ch_langue', 'fr',3600);
}
?>
...pour la page "home" en français.

La valeur que je veux envoyer à la page suivante est "fr".
Ma variable est "ch_langue".

Ensuite je clique sur un lien se trouvant sur ma page "home".
Ce lien m'envoie sur la page qui doit récupérer la variable.

Voici le code:
<?php
if ( isset($_COOKIE['ch_langue']) && verification_de_langue($_COOKIE['ch_langue'])) {
$langue = $_COOKIE['ch_langue'];
}
else {
$langue = "en";
}
?>

	<?php
   	  include("../m_inc_gnrl/m_lang_inc_gnrl/m_lang_" .$langue. "_inc.php");
 	?> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>

	<?php
		include("../m_inc_gnrl/m_head_inc_gnrl/m_head_" .$langue. "_inc.html");
	?>

</head>


<body onorientationchange="updateOrientation();">

	<div id="page_wrapper">

	<?php
   	  include("m_menu_inc_news_gallery_" .$langue. ".php");
 	?> 
    
    </div>

...

Donc mon code récupère la variable "ch_langue" avec comme valeur "fr" et sinon il utilise la valeur "en".

Et le problème c'est qu'il utilise TOUJOURS la valeur "en" car il ne reçoit pas la valeur "fr".

J'espère avoir été assé clair.

Encore merci à ceux qui pourront me donner un coup de pouce.