site multilingue

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : site multilingue

par x@v » 20 sept. 2007, 14:49

c'est surtout le changement de langue en cliquant sur le drapeaux qui m'***.
En faite le seul moyen c'est de mettre des fichiers, ouverture, fermeture...
en faite je croyais qu'une variable $_GET était obligatoirement dans href://...
Ce qui ma emmener sur autre chose que les sessions, mais je me demande si je ne devrai pas utilisez les sessions, questions de rapidités et de simplicité ?
mon système de langue fonctionne (pour qui veux s'en servir)
le fichier des fonction et variable...
<?php
$IP=(isset($_SERVER['SERVER_ADDR'])? $_SERVER['SERVER_ADDR']:getenv($_SERVER['SERVER_ADDR']));
$serverback="$IP";
$chemin_bo=$_SERVER["DOCUMENT_ROOT"].'';
// chemin du répertoire lang
$lang_bo=$chemin_bo."/lang/";

// recuperation des langues dispo
// retourne 1 table contenant les noms
function available_lang() {
	global $chemin_bo, $lang_bo;
	$lang_dispo=array();
	// les répertoires indésirable
	$badrep=array(".","..");
	if ($dirLang=opendir($lang_bo)) {
	$i=0;
	while($repLang=readdir($dirLang)) {
	$cheminRepLang=$lang_bo.$repLang;
	if(is_dir($cheminRepLang) && !in_array($repLang, $badrep)) {
	$lang_dispo[$i]=$repLang;
	$i++;
			}	
		}
	}
	else {
		print die("Impossible de lire le répèrtoire");
		}
			return $lang_dispo;
			}
		
// choix de la langues.
// met en place le fichier default_lang.php 
// ce dernier contiendra la constante MY_lang précisant la langue à utiliser
function set_default_lang($choix_lang="") {
	global $chemin_bo;
	$lang_def=$chemin_bo."/lang/default_lang.php";
	if(!file_exists($lang_def)) {
	
	// default_lang.php n'existe pas et on recupère les langues disponnible
	$lang_dispo=available_lang();
	if(count($lang_dispo)>0) {
				// écriture du contenu pour le fichier default_lang.php
			$contenu="<?php\n";
			$contenu.="define (\"MY_LANG\",\"$lang_dispo[0]\");\n";
			$contenu.="?>\n";
			$fp=fopen($lang_def, "w");
			if(!$fp)
				die ("Impossible");
			fwrite($fp, $contenu);
			fclose($fp);
	}
	else {
		die ("Il n'y a aucun répertoire de langue");
		}
	}
	else {
	if($choix_lang!="") {
			$contenu="<?php\n";
			$contenu.="define (\"MY_LANG\", \"$choix_lang\");\n";
			$contenu.="?>\n";
			$fp=fopen($lang_def, "w");
			if (!$fp)
				die ("Impossible de créer le contenu");
			fwrite($fp, $contenu);
			fclose($fp);
		}
	}
}
// fichier pour le choix de la langue
while(!@include("$chemin_bo/lang/default_lang.php"))
	set_default_lang();

	include ("$chemin_bo/lang/".MY_LANG."/lang.php");
?>
et je met donc au début de tout mes fichiers
<?php
//////////////////////////////////////////////////////
include ("./fonction.php");
	// chargement de la langue
	if (isset($_GET['CHlangue']) && !empty($_GET['CHlangue'])) {
		// on change la langue
		set_default_lang($_GET["CHlangue"]);
		header("location:dossier.php?id_article=1");
		}
	// La langue par default
	while(!@include("$chemin_bo/lang/default_lang.php")) {
		set_default_lang();
		}
		//  inclusion du fichier de lang
include ("$chemin_bo/lang/".MY_LANG."/lang.php");
//////////////////////////////////////////////////////?>
ensuite il faut ajouter les drapeaux
			<div style="position:absolute;left:55px;top:50px;">
<?php
//Boucle et affiche toutes les langues disponible
//recup des langues dans un tableau
$lang_dispo=available_lang();
if(count($lang_dispo)>1) {
while(list($key, $current_lang)=each($lang_dispo)) {
	if(MY_LANG!=$current_lang){
	$flag=$serverback."/lang/".$current_lang."/flag.gif";
	print '<a href="./dossier.php?CHlangue='.$current_lang.'"><img src="http://'.$flag.'" /></a>';
		}
	}
}?>
</div>
arborescence du site
./lang/english/l ce dossier contient l'image et le fichier txt des constantes
./lang/french/ ce dossier contient l'image et le fichier txt des constantes
dans lang il faut créer un fichier default_lang.php qui sert permet d'écrire la constante MY_LANG
Donc effectivement sa fonctionne mais sa me semble lourd

par Ryle » 20 sept. 2007, 14:33

Euh.. nonon... c'est gentil, mais sans façon... j'ai bien assez à faire de mes propres lignes ;)

Mais disons que simplement il te suffit de faire en début de script :
<?php
session_start();

if (isSet($_GET['lang'])) // si une nouvelle langue est demandée
  $lang = $_GET['lang'];
elseif (isSet($_SESSION['lang'])) // sinon et s'il existe une langue en session
  $lang = $_SESSION['lang'];
else // sinon langue du navigateur
  $lang = substr($HTTP_SERVER_VARS['HTTP_ACCEPT_LANGUAGE'],0,2);

// dans tous les cas, une fois la langue déterminée, on l'enregistre en session
$_SESSION['lang'] = $lang;

...
?>
Tu n'as plus ensuite qu'à utiliser $lang pour savoir dans quelle langue afficher la page, et passer dans l'url le paramètre lang=xx pour modifier la langue :)


Tu peux également simplifier l'inclusion du fichier lang ainsi :
include ('lang/'.$lang.'-lang.php');
et virer les if/else pour gagner en lisibilité et en taille :)

par x@v » 20 sept. 2007, 13:58

j'ai trouvé mais sa peut être long à placer...
Mais comment fais-tu Ryle ?
Moi je veux bien te donner mon script mais 150 lignes 4 fonctions

par Ryle » 20 sept. 2007, 13:49

Euh... pourquoi vouloir faire un session_destroy() alors que tout ce dont tu as besoin c'est juste de changer une des valeurs contenue en session ?

et euh... ça :
$lang=$_SESSION['lang']=$lang; 
ça sert à rien tu as déjà affecté la valeur de $lang à $_SESSION['lang']. Elles ont déjà la même valeur, ça sert à rien d'insister et c'est pas en répétant une instruction 3 fois qu'elle fonctionnera mieux ;)

site multilingue

par x@v » 20 sept. 2007, 12:56

Bonjour,
tout est dans le titre, je fais ça sur des sessions qui me semble le plus pratique
<?php
session_start();
 if(isset($_SESSION['lang']))
$lang = $_SESSION['lang'];
else
$lang = substr($HTTP_SERVER_VARS['HTTP_ACCEPT_LANGUAGE'],0,2);
// si aucune langue n'est déclarée on tente de reconnaitre la langue par défaut du navigateur
// une fois récupéré on inclus le fichier de la langue
if ($lang=='fr')
include('lang/fr-lang.php'); 
elseif ($lang=='en')
include('lang/en-lang.php');?>
ou je bloque c'est ici pour changer de langue au clic, la session_destroy() me renvoie un avertissement, apparement la variable n'est pas déclarer ou initialisez ?

Code : Tout sélectionner

Warning: session_destroy() [function.session-destroy]: Trying to destroy uninitialized session in C:\apachefriends\xampp\htdocs\tarik\dossier.php on line 125
<?php
					function lang_fr() {
						session_destroy();
						unset($lang);						
						$_SESSION['lang']='fr';
						$lang=$_SESSION['lang']='fr';
						echo $lang;
					}
					function lang_en() {
						session_destroy();
						unset($lang);
						$_SESSION['lang']='en';
						$lang=$_SESSION['lang']='en';
						echo $lang;
					}					
?>
			<a href=""><?php lang_fr();?></a><a href=""><?php lang_en();?></a>
Merci

edit

j'ai conciser mon script
<?php
session_start();
function lang($lang) {
	//session_destroy();
	//unset($lang);						
	$_SESSION['lang']=$lang;
	$lang=$_SESSION['lang']=$lang;
	print $lang;
}
if(isset($_SESSION['lang']))
$lang = $_SESSION['lang'];
else
$lang = substr($HTTP_SERVER_VARS['HTTP_ACCEPT_LANGUAGE'],0,2);
// si aucune langue n'est déclarée on tente de reconnaitre la langue par défaut du navigateur
// une fois récupéré on inclus le fichier de la langue
if ($lang=='fr')
include('lang/fr-lang.php'); 
elseif ($lang=='en')
include('lang/en-lang.php');?>

<div style="position:absolute;left:900px;top:560px;"><a href=""><?php lang('fr');?></a>&nbsp;<a href=""><?php lang('en');?></a></div>?>