Page 1 sur 3

Formulaire trilingue

Posté : 05 sept. 2009, 21:53
par dunbar
Bonjour,

Il y a quelques temps j'ai du choisir une méthode pour rendre un site multilingue, et comme il y des questions sur le sujet de temps en temps je vais vous montrer quelle solution j'ai choisi.
Cette méthode est un exemple, il y a d'autres façons d'y arriver.
J'ai opté pour des tableaux dans un switch(), l'avantage à mon sens est qu'il est trés simple de rajouter des langues aux sites et cela sans devoir modifier des pages et des pages.
La page qui contient les différentes langues

:arrow: language.php
<?php
 //-->Déclaration de la variable $Langue, et ici le fraçais par défaut en cas d'absence de valeur $_GET['language'].
 $Langue = (isSet($_GET['language'])) ? $_GET['language'] : 'FR' ;

        switch ($Langue)
         {
           case 'FR': //-->Partie français.--//
                   $Language = array('text_bonjour'      => 'Bonjour',
                                     'text_bonsoir'      => 'Bonsoir',
                                     'text_accueil'      => 'Accueil',
                                     'text_login'        => 'Votre nom d\'utilisateur',
                                     'text_pass'        => 'Votre mot de passe',
                                     'text_oublie_pass'  => 'Mot de passe oublier cliquez ici svp',
                                     'text_send'         => 'Envoie');
             break;


           case 'US'://-->Partie Anglais.--//
                  $Language = array('text_bonjour'       => 'Hello',
                                     'text_bonsoir'      => 'Good evening',
                                     'text_accueil'      => 'Home',
                                     'text_login'        => 'Your username',
                                     'text_pass'        => 'Your password',
                                     'text_oublie_pass'  => 'Forget password Please click here',
                                     'text_send'         => 'Send');
             break;

           case 'ES'://-->Partie Espagnol.--//
                 $Language = array('text_bonjour'      => 'Hola',
                                   'text_bonsoir'      => 'Buenas tardes',
                                   'text_accueil'      => 'Inicio',
                                   'text_login'        => 'Su nombre de usuario',
                                   'text_pass'        => 'Su contraseña',
                                   'text_oublie_pass'  => 'Olvido de contraseña Por favor, haga clic aquí',
                                   'text_send'         => 'Enviar');
             break;
         }
?>
Dans l’exemple ci-dessus il y trois tableaux français, anglais, et espagnol et suivant la valeur de la variable $_GET['language'] php va aller chercher les valeurs demandées dans tel ou tel tableau.

Pour afficher les valeurs rien de plus simple.
Voici un exemple de formulaire trilingue.
:arrow: index.php
<?php
include_once 'commun/language.php'; //-->Ont va chercher le fichier language.php
$Titre = (isSet($Language['text_accueil'])) ? $Language['text_accueil'] : 'Index';

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

<head>
<meta content="text/html; charset=iso-8859-1" http-equiv="Content-Type" />
<title><?php echo $Titre; ?></title>
</head>

<body>

<?php
echo '<p>Langue : <a href="index.php?language=FR">FR</a> | <a href="index.php?language=US">US</a> | <a href="index.php?language=ES">ES</a></p>';

echo '<form action="" method="post" style="width: 524px">
	<table style="width: 99%">
		<tr>
			<td style="width: 191px">'.$Language['text_login'].' :</td>
			<td style="width: 289px"><input name="Text1" type="text" /></td>
		</tr>
		<tr>
			<td style="width: 191px">'.$Language['text_pass'].' :</td>
			<td style="width: 289px"><input name="Password1" type="password" /></td>
		</tr>
		<tr>
			<td style="width: 191px">&nbsp;</td>
			<td style="width: 289px"><input name="Submit1" type="submit"
			value="'.$Language['text_send'].'" /></td>
		</tr>
		<tr>
			<td style="width: 191px">&nbsp;</td>
			<td style="width: 289px">'.$Language['text_oublie_pass'].'.</td>
		</tr>
	</table>
</form>';
?>
</body>

</html>
Voilà un exemple simple très facile à faire évoluer.

Re: Formulaire trilingue

Posté : 05 sept. 2009, 23:57
par sadeq
bonsoir dunbar et merci pour ce topic. En parlant d'autres méthodes que la tienne, en v'la une qui utilise un fichier CSV. Donc, la traduction peut se faire à tête reposée en dehors du programme. Dans cette méthode ton programme index.php ne change pas d'un mot. Seul le module language.php est réécrit:

commun/language.php
<?php
 //-->Déclaration de la variable $Langue, et ici le fraçais par défaut en cas d'absence de valeur $_GET['language'].
 $Langue = (isSet($_GET['language'])) ? $_GET['language'] : 'fr' ;
 $Data = file('lang.txt'); // lire tout le fichier langues sous forme de tableau
 $Keys = explode(";", $Data[0]);  // 1° ligne csv = entête de colonnes = noms des champs
 // lire les valeurs correspondant au langage choisi
 for($i=1; $i<count($Data); $i++){
	$Values = explode(";", $Data[$i]); // lecture csv des valeurs
 	if (strtolower($Values[0]) == strtolower($Langue)) {
		$Language = array_combine($Keys, $Values); // construire le tableau langage
		break; // arrêt si langue trouvée
	}
 }
 //print_r($Language);
?>
Et voici le fichier CSV qui contient les données. La première ligne étant l'entête des colonnes où se trouvent les noms des champs.
lang.txt

Code : Tout sélectionner

lang;text_bonjour;text_bonsoir;text_accueil;text_login;text_pass;text_oublie_pass;text_send; fr;Bonjour;Bonsoir;Accueil;Votre nom d'utilisateur;Votre mot de passe;Mot de passe oublié? cliquez ici svp;Envoie; us;Hello;Good evening;Home;Your username;Your password;Forget password? Please click here;Send; es;Hola;Buenas tardes;Inicio;Su nombre de usuario;Su contraseña;Olvido de contraseña Por favor, haga clic aquí;Enviar;

Re: Formulaire trilingue

Posté : 06 sept. 2009, 01:47
par Sékiltoyai
Sinon, en performant, ya l'inclusion :) :
include('lang/default.lang.php');
foreach(array_reverse($prefered_languages) as $lang)
{
	if(file_exists('lang/' . $lang . '.lang.php'))
	{
		include('lang/' . $lang . '.lang.php');
	}
}
On inclue la langue par défaut, et ensuite les langages par ordre inverse de préférence. Si les traductions sont incomplètes, le système pioche par ordre de préférence.

Et dans les fichiers :
<?php
$text1='machin';
$text2='truc';
?>
Après, on peut aussi bien wrapper ça dans un objet ou dans un tableau, au choix. :)

Re: Formulaire trilingue

Posté : 06 sept. 2009, 10:33
par Dr@ke
Vue le nombre de possibilités, ce qui serait intéressant, ce serait de faire un genre benchmark (vitesse, requêtes sql, php et/ou serveur, sécurité, bugs possibles...) pour chaque techniques possibles de fichiers langues...
En ajoutant peut-être aussi la vielle technique des constantes, juste pour comparer...
Le but au final n'est pas de dire quelle est la meilleur, mais surtout de définir les plus performantes à tous les niveaux, sans se limiter à une seule évidemment...

[EDIT]
Perso, les 3 techniques sont très bien, mais pour le moment j'ai une préférence, pour celle de Selki, inclusion de fichier par défaut avec des variables, si l'utilisateur choisis un autre langage -> inclusion d'un autre fichier contenant des variables...

[EDIT2]
Perso pour changer quelques éléments j'utilise les arguments d'une fonction, par exemple pour changer la balise robots dans mes pages Php suivant si erreur ou pas...
Exemple:
function mon_header($robots = 'noarchive')
{
echo '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
//...
<meta name="robots" content="' . $robots . '" />
//...
';
}
if ($erreur === 0) {
function mon_header();
}
else {
function mon_header(none);
}
PS: au départ, j'utilisais bêtement des constantes, évidement le code à Selki est bien meilleur quand il existe plusieurs arguments...

[EDIT 3]
Donc en cumulant des 2 techniques, un truc du genre:
function mon_header($langue = 'fr.inc')
{
require_once($langue);
//...
echo 'hey ' . $bonjour . ', ' . $bonsoir; 
//...
}

$langue=explode(",",$_SERVER["HTTP_ACCEPT_LANGUAGE"]);

if ($langue[0] === 'fr') {
function mon_header();
}
else {
function mon_header('us.inc');
}
Ps: pas testé, mais c'est en gros ce que je ferais personnellement...

Re: Formulaire trilingue

Posté : 06 sept. 2009, 16:11
par Rem73
J'avais étudier les différentes méthodes de traduction et surtout leurs performances ainsi que leur portabilité. Parce qu'un site comporte énormément de texte et on doit souvent demander la traductions à des personnes qui ne développe pas le site.

J'avais fait des bench là dessus, je vous montre la conclusion que j'en ai tirer : Le système par array est la méthode la plus lente pour beaucoup de traduction et utilise beaucoup de mémoire vive mais est très rapide pour moins de 100 variable de langue. C'est aussi peux portable, du code PHP reste, pas très pratique à ajouter des variables, avoir une vue d'ensemble.

J'avais essayer en XML avec parseur DOM : Plus performant qu'avec des array à partir de 100 variables, assez portable puisque le XML est un format très ouvert qui permet de faire simplement une application Web de traduction.

Et puis gettext, c'est une librairie PHP par contre mais est 2 fois plus rapide que les deux méthodes. Très portable avec le logiciel poedit. Gettext est installer par défaut sur les serveurs Linux en plus.
La mise en place est un peux plus contraignante, si la traduction n'existe pas, il n'y aura pas de message d'erreur. Travail sur des fichier compiler donc doit être compiler avec un logiciel. Ne permet pas de travailler sur deux langue en même temps (c'est possible mais compliqué). Le logiciel poedit n'est pas le seule logiciel qui permet l'édition de fichier .po (fichier de traduction), mais il est très simple d'utilisation, récupère les traductions depuis le code source ce qui enlève le soucis du : "Je met quoi comme nom de variable", "il y a des variables que j'utilise plus ?", "Il y a des messages non traduit ?". Très utiliser dans le monde du libre et est présent dans un bon nombre de langage, moi je vous le recommande.

Plus d'info sur les bench que j'avais fait : ici

Re: Formulaire trilingue

Posté : 06 sept. 2009, 16:45
par Dr@ke
Pour le array c'est effectivement compréhensible puisqu'il est sollicité à chaque mots demandant une traduction...
C'était pourquoi, les constantes étaient utilisées...
Maintenant pourquoi se compliquer la vie et ne pas utiliser une simple inclusion de variables?
Cela me parait le plus simple et le plus rapide...

Re: Formulaire trilingue

Posté : 06 sept. 2009, 18:18
par Sékiltoyai
@Drake : Après c'est totalement adaptable en fait. Je donnais surtout une idée. On pourrait la décliner en pas mal de méthodes. Je pense que je vais la mettre en oeuvre d'ailleurs, même si je n'ai pas de langues à gérer. Bref, c'est un début mais en l'état ça reste imparfait :)
@Rem73 : Le module gettext reste malheureusement absent sur beaucoup de mutualisés, et comme tu l'as souligné, c'est compliqué à mettre en place. J'aime bien le principe du XML, plus particulièrement XSL.

Re: Formulaire trilingue

Posté : 06 sept. 2009, 19:53
par Rem73
Pour ce qui est de gettext je suis jamais tomber encore sur un hébergeur mutualisé qui ne propose pas gettext. La plus part du temps les version de PHP installer sur les serveurs sont des version qui viennent des dépôts APT, et qui sont modifier pour ajouter ou supprimer des services. Ce qui fait donc que gettext reste bien souvent. Pour ce qui est Free je pense pas qu'ils l'ont, je crois même qu'il sont encore au PHP 4. Mais sur olympe-network il est présent, et sur tout les hébergeur que j'ai pu rencontrer quand j'ai cherché un hébergeur qui propose Postgresql.

C'est donc très courant (pour ce que j'ai vu bien-sur), c'est sur que la mise en place est un peux lourde, puisque c'est spécifique, mais se résume à :
- Définir le/les domaine(s) (fichier de langue qu'on va utiliser)
- Définir la langue qu'on va utiliser
- Et utilise la fonction qui va retourner le texte traduit (ils y en a plusieurs pour différentes utilisations)

Il faut bien-sur crée un nouveau dossier qui va comporter les traductions.

Si je dis tout ça c'est pour vous dire que gettext est la meilleur solution en terme de performance et en terme de maintenance à long terme. Pas super compliquer à mettre en place. Il y a peut-être des problèmes sous windows (devoir relancer le serveur pour utiliser les nouvelles traductions) mais j'ai jamais eu ce problème (je suis sous linux) et sur serveur mutualiser j'ai pas eu besoin de demander de relancer le serveur ^^ (serveur linux aussi)

J'utilise ça pour mon projet et maintenant je pourrais jamais revenir à autre chose, la puissance de Poedit pour trouver les traductions absolette et les nouvelles fait gagner des heures et des heures de boulot qui est franchement pas folichon. Et des outils Web existent pour traduire en communauté, KDE fait ça je crois. En tout cas le logiciel Poedit est traduit de cette manière.

Donc si vous avez gettext sur votre hébergeur je vous conseille de jeter un oeil

Re: Formulaire trilingue

Posté : 06 sept. 2009, 20:29
par Dr@ke
Coté maintenance, possible que gettext soit plus pratique, personnellement je ne sais pas mais je te croie sur parole.
Coté performances et fiabilité, l'inclusion de variables est la meilleur méthode à mon avis.

Re: Formulaire trilingue

Posté : 06 sept. 2009, 22:08
par Rem73
Enfaite gettext travail sur des fichiers compiler et mit en cache ce qui le rend plus rapide qu'une simple variable. J'étais sur le cul quand j'ai fait des bench et vu que gettext était plus rapide.

Après j'avoue que tu ajoute des problème puisque c'est une libraire PHP non coder en PHP (comme GD), pour un petit projet c'est une contrainte de plus mais dès qu'il y a beaucoup de traductions à faire je pense qu'il vaut mieux se tourner vers gettext.

Re: Formulaire trilingue

Posté : 07 sept. 2009, 00:39
par Sékiltoyai
Coté maintenance, possible que gettext soit plus pratique, personnellement je ne sais pas mais je te croie sur parole.
Coté performances et fiabilité, l'inclusion de variables est la meilleur méthode à mon avis.
Au contraire, côté maintenance j'ai l'impression que gettext sera un peu chiant, mais niveau performance gettext est ultra optimisé…

Re: Formulaire trilingue

Posté : 07 sept. 2009, 20:09
par Rem73
Coter maintenance et coter performance gettext est le meilleur.

Coter perf' parce qu'il travail en fichier compiler mis en cache et c'est une librairie qui travail directement sur l'interpréteur PHP.

Coter maintenance tout seul il est très long de traduire, modifier des traductions. Mais coupler avec poedit (ou d'autres logiciels, il en existe sur Eclipse, en interface web etc..) ça devient très simple de maintenance. Le truc c'est qu'avec gettext vous n'avez pas a penser à la traduction, vous faite dans votre code PHP ce-ci printf(_('Bonjour %s, bienvenu sur mon site'), $pseudo); Vous lancez poedit, vous configurer votre nouveau fichier/projet puis il va récupérer votre texte : "Bonjour %s, bienvenu sur mon site" et vous demande la traduction.

Et oui c'est très simple ^^ Il suffit de vous souciez de votre code PHP, et de ne pas oublier qu'il doit jamais y avoir une variable dans une chaine à faire traduire par gettext.

Après sachant que le logiciel récupère les traductions depuis le code ça rend la traduction plus aisée le temps que l'application soit développer.
Voici quelques exemples en développement :
- Vous avez modifier un texte à traduire : Poedit vous le modifira à la prochaine MAJ (à faire manuellement et modifier la traduction)
- Vous avez ajouter un texte à traduire : Poedit vous le rajoutera à la prochaine MAJ (à faire manuellement)
- Vous avez supprimer un texte à traduire : Poedit vous le supprimera à la prochaine MAJ (à faire manuellement)

Je précise bien que quand je dis modifier/supprimer/ajouter du texte à traduire c'est depuis le code PHP

Voici des exemples en production :
- Vous vous demandez à une personne de traduire votre site : Vous donnez le fichier .po, à l'aide de poedit (ou autre) il a juste à traduire à partir de la langue utilisée en développement. Des commentaires peuvent êtres mis pour l'aider. Il vous rend le fichier, vous relisez, compiler et mettez ça sur votre site.


Si j'explique aussi mal allez regarder la doc et faites des test. Parce que ça fait 3 messages que je répète le fonctionnement de gettext et ses attrait, donc je sais plus le dire autrement

Re: Formulaire trilingue

Posté : 08 sept. 2009, 02:57
par Sékiltoyai
Cela demande un logiciel spécial, que l'on ne peut utiliser en ligne de commande. Cela demande une compilation. etc. Parce que si on va par là, je peux dire la même chose d'une solution de traduction tout php :
- Lorsqu'on applique le changement, il est automatiquement pris en compte.
- Il y a des centaines d'IDE parfaitement adaptés pour la traduction. A vrai dire, il suffit qu'ils reconnaissent la syntaxe php.
- Si on demande à quelqu'un de traduire le site, on lui envoie le fichier d'origine, il traduit, il le renvoie en le renommant et c'est fait.
Je ne chipote pas. Une traduction dans des fichiers plein texte (dont php) sera toujours plus facile à maintenir qu'une traduction compilée. Tout simplement parce que quelquesoit la praticité de la compilation ou les outils conçus pour, cela rajoute une étape.

Donc je ne viens pas dire que c'est beaucoup plus compliqué d'utiliser un logiciel comme poedit, je dis seulement que c'est au moins aussi simple d'utiliser des fichiers texte simples. Sur une édition par un logiciel graphique, ce que je reprocherais, c'est qu'il faut éditer le fichier, le compiler, puis l'envoyer sur le serveur (via dav, ftp, scp, rsync, svn, etc), et que la modification directe en ligne de commande est plus difficile. Donc voilà, en cela il est moins maintenable, mais sur la performance, nous sommes parfaitement d'accord.

Re: Formulaire trilingue

Posté : 08 sept. 2009, 12:34
par Dr@ke
Je suis entièrement d'accord avec Selki.
Même si gettext est certainement performant et pratique comme l'explique Rem, et je ne contredis pas ce fait.
Je pense qu'il est plus simple et surtout plus fiable d'utiliser une simple inclusion de variables.
Moins l'on complique les choses, mieux c'est en général...

Comme le souligne Selki, il existe pleins de méthode pour automatiser ou simplifier la mis à jour des traductions d'un fichier en clair et non compressé...

Coté performances, quoi de plus rapide qu'une simple inclusion de variables bien codée? Ok peut-être gettext, admettons, mais sous quelles contraintes?

je pense donc que cela ce joue maintenant surtout sur la fiabilité en général de la méthode, et pour moi rien de plus fiable qu'une simple inclusion de variables...

Re: Formulaire trilingue

Posté : 08 sept. 2009, 14:25
par Nagol
gettext c'est bien, mais dans les faits y'a une contraintes système forte sur un unix c'est que la locale correspondante doit etre installée au niveau système rien que pour ça je l'ai éliminé de mes choix, c'est malheureux parceque c'est un techno superbe et pas si compliquées en + mais bon.

avec php 5.3 y'a intl qui fait tout ca très bien aussi, sans doute mieux que des fichiers de def des langues en php (qui est la seule solution acceptable et rétro compatible j'en ai peur)