Page 1 sur 1

site multilingues

Posté : 24 mai 2013, 09:10
par miiidooo19
Bonjour,

j'aimerai bien apprendre comment on fait un site multilingues ?
biensur j'ai regardé sur google... mais j'aimerai savoir si vous avez un bon tuto a ce sujet que vous me conseillez

Merci d'avance

Re: site multilingues

Posté : 24 mai 2013, 10:41
par sirakawa
Voici ce que je fais:
Tous les messages sont stockés dans un seul fichier à part d'extension .fr/.en.... ou dans ou dans des fichiers à part de même nom que le fichier auquel ils sont nécessaires et de même nom.
Dans ces fichiers, tu définis tes messages par des constantes (comme elles sont générales, elles sont connues dans de genre de situation:

messages.fr
define ("TRUC", "bidule");

appel.php
include ("messages.fr");
$z = fonction($u);

fonction ($w)
{
print TRUC;
}
alors que si tu les définis par des variables, il faut faire des globals dans ce cas. Les noms de constantes en majuscules, parce que c'est le choix de PHP pour ses propres constantes....
)
Enfin, tu fais choisir la langue d'interface ( à l'entrée ou à n'importe quel moment) par un select dont les val ="fr"... et tu stockes cette valeur en session et ton appel.php devient:
$langue = $_SESSION['langue'];
$fic = "messages.".$langue;
include ($fic);

Re: site multilingues

Posté : 24 mai 2013, 10:51
par lalmat
1) Créer une table de traduction du style
table traduction {
  trad_code   string 32
  trad_locale string 5
  trad_text   string 255
}
2) Charge ton dictionnaire en session en fonction de la langue de l'utilisateur en executant une requête SQL sur ta table de traduction afin de récupérer tous les codes à traduire pour la lange $locale. (Ceci constituera la fonction getDico). $locale est à définir soit par l'utilisateur soit par détection du navigateur.
$_SESSION['DICO'] = getDico($locale);
3) Ecrit une fonction qui te retourne le code traduit :
function traduire($code) {
  return $_SESSION['DICO'][$code];
}
Voilà l'idée.

Si tu as la bonne idée d'utiliser Smarty pour la gestion de tes templates, tu peux envoyer tout le dictionnaire à Smarty et t'éviter bien du code :
$s = new Smarty();
foreach($_SESSION['DICO'] as $code=>$trad) {
  $s->assign("TRAD_".$code, $trad);
}
ainsi si ton tempate contient la valeur smarty {$TRAD_UTILISATEUR} il sera automatiquement remplacé par la valeur du code "UTILISATEUR" du dictionnaire.

Re: site multilingues

Posté : 24 mai 2013, 10:56
par ghost5922
Bonjour,

pareil je fais un répertoire lang et a l’intérieure fr.php,en.php etc

puis sois en utilisant la variable de la langue $HTTP_ACCEPT_LANGUAGE ou par sélection de visiteur voir encore par htaccess

puis j’inclue le fichier lang cela le resultat

<?php
$lang='fr';
include ("lang/".$lang.".php");

?>

puis les fichiers on pour chaque text une ligne

fichier fr.php
define ("_hello", "Bonjour");

fichier en.php

define ("_hello", "Hello");


et dans la page php

echo _hello;

Re: site multilingues

Posté : 24 mai 2013, 11:40
par sirakawa
J'ajouterai que tous les projets à la traduction desquels j'ai participé (entre autres musescore) qui recouraient à des dictionnaires ont nécessité des heures de correction manuelle, en raison, entre autres des contextes, et pourtant il s'agissait d'un vocabulaire spécialisé...

Re: site multilingues

Posté : 25 mai 2013, 19:51
par miiidooo19
Merci pour vos réponses tous c'est trés gentil

je trouve vous méthodes sont bien sauf que je m'interesse a celle de lalmat comme j'utilise smarty
sauf que j'utilise pas une table pour enregistrer les traductions de chaque langue
je décolare des variable dans des fichier genre fr.php en.php... j'include le fichier de langue selon le choix de l'utilisateur

et je fait un assign de tous les variable (ça fait moche quand on a beaucoup des variable y a pas moyen de faire un assigne de fichier de langue et les afficher direct dans fichier tpl ?

Si tu as la bonne idée d'utiliser Smarty pour la gestion de tes templates, tu peux envoyer tout le dictionnaire à Smarty et t'éviter bien du code :
$s = new Smarty();
foreach($_SESSION['DICO'] as $code=>$trad) {
  $s->assign("TRAD_".$code, $trad);
}
ainsi si ton tempate contient la valeur smarty {$TRAD_UTILISATEUR} il sera automatiquement remplacé par la valeur du code "UTILISATEUR" du dictionnaire.

Re: site multilingues

Posté : 26 mai 2013, 23:47
par ghost5922
Bonjour,

Tu peux faire notre façon de faire mais avec smarty c'est juste que tu vas avoir un include puis pour chaque texte une ligne du type



$s->assign("Hello", _hello);

_hello etant definis dans le fichier php de langue

sinon lui il peu faire un foreach car toute les variables sont dans la bdd :)

Re: site multilingues

Posté : 30 mai 2013, 18:46
par lesolutionneur
Pourquoi ne pas utiliser les fonctions PHP prévues pour ?

http://www.php.net/manual/fr/book.gettext.php

Re: site multilingues

Posté : 31 mai 2013, 16:56
par sirakawa
Pourqui ne pas utiliser gettext?
1) on n'est pas sûr que ce soit implémenté partout.
2) pas beaucoup de fonctions, doc énigmatique, exemples absents, contributions rares.

Re: site multilingues

Posté : 01 juin 2013, 17:06
par miiidooo19
Ok merci beaucoup je vais essayer de mettre mes fichier fr en de ... dans la bdd c'est plus pratique comme vous avez dit :)

Re: [RESOLU] site multilingues

Posté : 01 juin 2013, 21:26
par moogli
Attention la solution base de données est peu performante, une solution de cache est obligatoire dans ce cas (simplement parce que s'il y a beaucoup de monde sur ton site il y a des chances que tu soit vite limité par le sgbd).


@+

Re: [RESOLU] site multilingues

Posté : 02 juin 2013, 17:44
par sirakawa
Je suppose, moogli, que même si en bdd ou en fichier standard , ce sont de toutes façons des fichiers, le trafic va être différent:
un include ('fic.fr"); sollicite le serveur une fois ^pour tous les messages de la page qui sont dès lors stockés par php, alors que faire un select de la bdd demande plus d'opérations zt d'échanges

Re: [RESOLU] site multilingues

Posté : 02 juin 2013, 19:17
par moogli
oui l'appel au sgbd c'est
- une requête : cpu + ram
- un aller version vers le SGBD : ressource réseau
- traitement de la demande + réponse par le sgbd : ressource mémoire / cpu
- retour vers "php"
- Traitement de la requête par php

suivant si la base est bien modélisé, la requete bien faite (etc) le plus long peux être le temps réseau.

En dehors de ça les traductions n'étant pas des choses qui change souvent un système de cache devrait éviter les tonnes de requête pour chaque page.

après il faudrait un bench complet mais il y a des chances que l'inclusion php soit un poil plus rapide.
Par contre je suis d'accord c'est de loin la moins commode pour gérer les traductions par d'autre personne que les dev (qui au final on autre chose à faire généralement :mrgreen: ).


@+