Page 1 sur 1

Une aide pas difficile pour un pro du php

Posté : 16 mars 2011, 19:53
par clem1412
Voila j'ai créé un script en PHP me permettant de charger un fichier XML suivant un formulaire.
En fait j'ai réalisé ce script pour me permettre de réaliser un site multilingue or puisque mon site a pas mal de contenu je souhaite créer un fichier XML par page par lequel je gère mes traductions.
Or le problème c'est que je ne sais pas comment faire pour réaliser une fonction qui permettrait de sélectionner le bon fichier XML suivant la page! Ci-joint le code PHP:
<?php
header( 'content-type: text/html; charset=utf-8' );
function findLocale ($loc = '', $block = 'notext') { // fonction allant chercher la traduction d'un bloc donné dans le fichier xml de localisation. Prend en paramètre la langue à utiliser, et l'élément contenant le texte. L'élément a pour le nom l'ID du block où on va afficher le texte
  if ($loc === '') { // si loc n'existe pas
    $loc = $_SESSION['locale']; // on lui assigne la variable de session
  }
  $doc = simplexml_load_file ('locales.xml'); // on charge le fichier de localisation
  $resultat = $doc ->xpath ($loc.'/'.$block); // on va chercher le noeud correct
  if (!empty ($resultat)) { // si le tableau n'est pas vide, il y a un texte
    foreach ($resultat as $noeud) {
       utf8_encode($noeud );
        return $noeud; // on renvoie ce texte
    }
  }
  else {
    $resultat = $doc ->xpath ($loc.'/notext'); // sinon on va chercher le message d'erreur
    foreach ($resultat as $noeud) {
        $noeud= utf8_encode($noeud); 
      return $noeud;
    }
  }
}
?>
<?php
session_start ();
function checkLocale () { // fonction pour tenter de déterminer la langue utilisée par le système client (non garantie)
    $locale = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
    if (substr ($locale, 0, 2) === 'fr') {
      return 'FRANCAIS';
    }
    if (substr ($locale, 0, 2) === 'en') {
      return 'ENGLISH';
    }
    return false;
}

if (!isset ($_SESSION['locale'])) { 
    if (false !== ($check = checkLocale ())) {
        $_SESSION['locale'] = $check;
    }
    else {
        $_SESSION['locale'] = 'FRANCAIS'; // on met une langue par défaut dans une variable de session
    }
}

?>
<!-- Formulaire pour le choix des langues -->
<form method="post" action="">
<input type="submit" value="ENGLISH" name="langue" />
<input type="submit" value="FRANCAIS" name="langue" />
</form>
<?php
// on vérifie le choix de la langue dans le formulaire, et on assigne la valeur correcte à la variable de session
if (isset ($_POST['langue'])) {
 $_SESSION['locale'] = $_POST['langue']; 
}
?>
 
Voila j'espère obtenir une réponse positive je ne suis qu'un débutant en php et xml. ;)

Re: Une aide pas difficile pour un pro du php

Posté : 16 mars 2011, 21:09
par jojolapine
Bonsoir,

A quoi ressemble ton fichier xml actuellement?
Comment te sers-tu de tes fonctions? (comment tu affiches tes traductions quoi...)

Re: Une aide pas difficile pour un pro du php

Posté : 17 mars 2011, 10:31
par clem1412
Voila comment j' affiche mes traduction dans mes page.php:

Code : Tout sélectionner

<?php echo findLocale ($_SESSION['locale'], 'titre1'); ?>
et dans mon fichier xml voici comment je classe les traduction:

Code : Tout sélectionner

<?xml version="1.0" encoding="iso-8859-1"?> <Locales> <ENGLISH> <titre1>Hello world</titre1> <notext>No text available</notext> </ENGLISH> <FRANCAIS> <titre1>Bonjour</titre1> <notext>pas de texte disponible</notext> </FRANCAIS>
Voila la je t'ai mis qu'un exemple succin, moi ayant beaucoup de ocntenu je souhaiterai avoir une fichier xml par pages de mon site, étant débutant en programation web je ne sait pas réaliser la fonction permettant de récuperer le bon fichier xml suivant la page ou on se trouve ;)

Re: Une aide pas difficile pour un pro du php

Posté : 17 mars 2011, 10:43
par jojolapine
Bonjour, tu pourrais faire comme ceci:
<?php
header( 'content-type: text/html; charset=utf-8' );
function findLocale ($loc = '', $block = 'notext', $page="default") { // fonction allant chercher la traduction d'un bloc donné dans le fichier xml de localisation. Prend en paramètre la langue à utiliser, et l'élément contenant le texte. L'élément a pour le nom l'ID du block où on va afficher le texte
  if ($loc === '') { // si loc n'existe pas
    $loc = $_SESSION['locale']; // on lui assigne la variable de session
  }

  $file = $page.'.xml';
  // tests de validité du fichier etc...

  $doc = simplexml_load_file ($file); // on charge le fichier de localisation
  $resultat = $doc ->xpath ($loc.'/'.$block); // on va chercher le noeud correct
  if (!empty ($resultat)) { // si le tableau n'est pas vide, il y a un texte
    foreach ($resultat as $noeud) {
       utf8_encode($noeud );
        return $noeud; // on renvoie ce texte
    }
  }
  else {
    $resultat = $doc ->xpath ($loc.'/notext'); // sinon on va chercher le message d'erreur
    foreach ($resultat as $noeud) {
        $noeud= utf8_encode($noeud); 
      return $noeud;
    }
  }
}
et tu l'utiliserais comme ça:
<?php
echo findLocale ($_SESSION['locale'], 'titre1');
echo findLocale ($_SESSION['locale'], 'titre1','page_contact');
echo findLocale ($_SESSION['locale'], 'titre1','page_livredor');
?>
Après j'ajoute une chose, tu pourrais aussi séparer le contenu de tes fichiers xml par langue... (c'est ce que fait gettext)
Donc tu aurais une architecture comme ceci:

Code : Tout sélectionner

/locale /FRANCAIS contact.xml livredor.xml index.xml /ENGLISH contact.xml livredor.xml index.xml
et donc ta fonction deviendrais plus ou moins:
<?php
function findLocale ($loc = '', $block = 'notext', $page="default") { // fonction allant chercher la traduction d'un bloc donné dans le fichier xml de localisation. Prend en paramètre la langue à utiliser, et l'élément contenant le texte. L'élément a pour le nom l'ID du block où on va afficher le texte
  if ($loc === '') { // si loc n'existe pas
    $loc = $_SESSION['locale']; // on lui assigne la variable de session
  }

  $file = $loc.'/'.$page.'.xml';
  // tests de validité du fichier etc...

  $doc = simplexml_load_file ($file); // on charge le fichier de localisation
  $resultat = $doc ->xpath ('/'.$block); // on va chercher le noeud correct
  if (!empty ($resultat)) { // si le tableau n'est pas vide, il y a un texte
    foreach ($resultat as $noeud) {
       utf8_encode($noeud );
        return $noeud; // on renvoie ce texte
    }
  }
  else {
    $resultat = $doc ->xpath ('/notext'); // sinon on va chercher le message d'erreur
    foreach ($resultat as $noeud) {
        $noeud= utf8_encode($noeud); 
      return $noeud;
    }
  }
}
Et une dernière chose,
pourquoi utilises-tu utf8_decode() ? visiblement ton xml est en iso... mais tes sources en utf8? il y a un manque de cohérence ;)

Re: Une aide pas difficile pour un pro du php

Posté : 17 mars 2011, 12:01
par clem1412
Merci beaucoup pour ton aide ;)
Cela ma parrait bon mais j'ai une erreur:
"Warning: simplexml_load_file() [function.simplexml-load-file]: I/O warning : failed to load external entity "page_Recompence.xml" in C:\Users\clem\Desktop\StageAEV\traitement.php on line 10"
il ne me prend pas cette ligne:

Code : Tout sélectionner

$doc = simplexml_load_file ($file); // on charge le fichier de localisation
J'ai peut etre fait une fausse manip je suis vraiment un debutant et je m'en escuse!
Tu a raison pour l'utf-8 ce n'est pas cohérent je l'ai modifié, j'ai dailleur eu un problème au debut mais maintenant c'est réglé!

Re: Une aide pas difficile pour un pro du php

Posté : 17 mars 2011, 12:13
par clem1412
J'ai trouvé mon erreur en fait j'ai mis tout mes fichier xml dans un ficher trad et j'avai oublier d'indiqué le chemin! Oulala je ne suis pas réveillé :shock:
En tout cas merci beaucoup de ton aide et passe une excellente journée ;)