site bilingue (français / anglais)

Eléphant du PHP | 197 Messages

06 août 2006, 02:28

voilà ce bout de code permet de savoir quelle langue utiliser.

Plusieurs possibilté :
- automatique : recherche de la langue principale du browser, si c'est français ou alors dans tous les autres cas en anglais.
- manuel : page.php?lang=fr changement manuel de la langue en français

Avantages :
- Stockage en session (pas besoin de spécifier le langage à chaque changement de page)
- recherche de la langue principale du browser
- possibilité de changer de langue manuelement
- 100% compatible ie, ff

Inconvéniants :
- référencement aléatoire (il faut améliorer ce script...)
- limité à 2 langues

function select_lang() { // by HanX
$lang=$_GET[lang];
if($lang)
	{
	if($lang=='fr')
		{ $_SESSION[lang]='fr'; }
	elseif($lang=='en')
		{ $_SESSION[lang]='en'; }
	}
elseif(!$_SESSION[lang])
	{
	$lang=$_SERVER["HTTP_ACCEPT_LANGUAGE"];
	$p=strpos($lang,',');
	if($p === false)
		{ $l=$lang; }
	else
		{
		$langf =substr($lang,0,$p);
		$langfa=strpos($langf,'-');
		if($langfa === false)
			{ $l=$langf; }
		else
			{
			$langf =substr($lang,0,$langfa);
			$l=$langf;
			}
		}
	if($l!='en' && $l!='fr')
		{ $l='en'; }
	$_SESSION[lang]=$l;
	}
}
// exemple : echo '<br>'.trad('Bonjour tout le monde','Hello World').'<br>';
function trad($fr,$en,$lang='') { // fonction pour traduire
if($_SESSION[lang]=='fr' xor $lang=='fr')
	{ return $fr; }
elseif($_SESSION[lang]=='en' xor $lang=='en')
	{ return $en; }
else
	{ return 'ERREUR de traduction !'; }
}



Mammouth du PHP | 19672 Messages

06 août 2006, 09:34

Pas inintéressant même si ça va limiter beaucoup : tu ne pourras en effet de cette manière pas ajouter d'autres langues.

J'ai également noté dans la fonction select_lang() deux structures if/elseif dépourvues du else : ça pose problème, si j'ai une url avec en paramètre lang=it, on va rentrer dans la première structure, on va passer le if, le esleif et aucune variable de session ne sera créée. Je suggère donc l'ajour d'un else pour définir la langue par défaut. N'oublions pas qu'une url peut être manipulée manuellement par l'internaute.

Je te propose donc la ré-écriture commentée de ton code de la manière suivante (basique bien entendu):
<?php
/**
 * Fonctions de traduction.
 *
 * @author HanX
 * Revu et corrigé par Cyrano
 */

/**
 * Définition de la langue d'affichage.
 *
 * La fonction vérifie si un paramètre de langue est défini dans 
 * l'url ou bien si une variable de session a été définie.
 * Si rien de tout ça n'existe, la langue par défaut sera déterminée.
 * 
 * Attention, implique qu'une session doit être démarrée au préalable.
 */
function select_lang()
{
    $lang = isset($_GET['lang']) ? $_GET['lang'] : null;
    if(isset($lang))
    {
        switch ($lang)
        {
            case "en":
                $_SESSION['lang'] = "en";
                break;
            case "fr":
            default:
            $_SESSION['lang'] = 'fr';
        }
    }
    elseif(!isset($_SESSION['lang']))
    {
        $lang = $_SERVER["HTTP_ACCEPT_LANGUAGE"];
        $p = strpos($lang, ',');
        if($p === false)
        {
            $l = $lang;
        }
        else
        {
            $langf  = substr($lang, 0, $p);
            $langfa = strpos($langf, '-');
            if($langfa === false)
            {
                $l = $langf;
            }
            else
            {
                $langf = substr($lang, 0, $langfa);
                $l = $langf;
            }
        }
        /**
         * Si la langue du navigateur n'est ni le français, ni 
         * l'anglais, on définit la langue par défaut.
         */
        if(($l != 'en') && ($l != 'fr'))
        {
            $l = 'en';
        }
        $_SESSION['lang'] = $l;
    }
    /**
     * Définition d'une langue par défaut si n'existent ni le 
     * paramètre $_GET ni la variable de session.
     */
    else
    {
        $_SESSION['lang'] = "fr";
    }
}

/**
 * Fonction de traduction.
 *
 * On envoie en paramètre la chaîne dans les deux langues et la fonction 
 * retourne celle qui devra être affichée selon la langue définie dans 
 * la fonction select_lang()
 * Exemple d'utilisation :
 * <code>select_lang();
 * echo '<br>'.trad('Bonjour tout le monde','Hello World').'<br>';</code>
 *  
 * @param  String $fr    Chaîne en français
 * @param  String $en    Chaîne en anglais
 * @param  String $lang  Langue dans laquelle on doit afficher
 * @return String        Chaîne dans la langue définie
 */
function trad($fr,$en,$lang = '')
{
    if($_SESSION['lang'] == 'fr' xor $lang == 'fr')
    {
        return $fr;
    }
    elseif($_SESSION['lang'] == 'en' xor $lang == 'en')
    {
        return $en;
    }
    else
    {
        return 'ERREUR de traduction !';
    }
}
?>
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 197 Messages

06 août 2006, 14:21

pas mal :lol: