[RESOLU] site multilingues

Eléphant du PHP | 417 Messages

24 mai 2013, 09:10

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

Mammouth du PHP | 2278 Messages

24 mai 2013, 10:41

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);
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Eléphanteau du PHP | 13 Messages

24 mai 2013, 10:51

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.

Mammouth du PHP | 619 Messages

24 mai 2013, 10:56

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;

Mammouth du PHP | 2278 Messages

24 mai 2013, 11:40

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é...
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Eléphant du PHP | 417 Messages

25 mai 2013, 19:51

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.

Mammouth du PHP | 619 Messages

26 mai 2013, 23:47

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 :)

Petit nouveau ! | 1 Messages

30 mai 2013, 18:46

Pourquoi ne pas utiliser les fonctions PHP prévues pour ?

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

Mammouth du PHP | 2278 Messages

31 mai 2013, 16:56

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.
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Eléphant du PHP | 417 Messages

01 juin 2013, 17:06

Ok merci beaucoup je vais essayer de mettre mes fichier fr en de ... dans la bdd c'est plus pratique comme vous avez dit :)

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

01 juin 2013, 21:26

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).


@+
Il en faut peu pour être heureux ......

Mammouth du PHP | 2278 Messages

02 juin 2013, 17:44

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
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

02 juin 2013, 19:17

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: ).


@+
Il en faut peu pour être heureux ......