[PHP] Module de traduction V2

Avatar du membre
voxdemonix
Messages : 1237
Enregistré le : lun. févr. 02, 2015 7:28 pm

[PHP] Module de traduction V2

Message par voxdemonix » ven. août 28, 2015 10:05 pm

[LGPL] Module de traduction V2
sound for read : Epic Melodic Dubstep Collection 2015 [2 Hours]


En gros: Ce module transforme des balisesDeCeTypeInssenssibleAlaCasse par ce que vous avez défini dans le fichier de traduction respectif. Pour ajouter une langue il suffit d'ajouter le fichier dans le dossier ./vue/traduction en respectant le format trad-AbreviationLangue.xml (ex: trad-fr.xml ). Pour indiquer au script la langue de l'utilisateur, envoyez l'abréviation de la langue dans $_COOKIE["lang"], dans $_GET["lang"], ou dans $_POST["lang"]. Le script utilise le token "lang" pour se "souvenir" de la langue choisie par l'user.
Lorsque vous voulez traduire quelque chose, envoyez la $string à
simpleUniversalTraductor($string4Trad); pour une String OU arrayUniversalTraductor($array4Trad); si vous souhaitez traduire un Array.
Un exemple de Hello World est indiqué dans le code du fichier trad-fr.xml

Créez le fichier trad.php en suivant le chemin indiqué ci-bas. Et faites appels (require_once('./vue/trad.php');) à ce script quand vous avez besoin de lui.
./vue/trad.php

Code : Tout sélectionner

<?php
// ::    Version 1.4  ;  CODE BY VOXDEMONIX ; LICENCE LGPLV3    :: //
// ::		Code Source infos : https://www.0rion.netlib.re/forum4/viewtopic.php?f=9&t=211		:: //
/*   les fonctions à utiliser sont simpleUniversalTraductor($string4Trad) et arrayUniversalTraductor($array4Trad) */


   $lang = "fr"; //on definit la langue par défaut

      $dicoFolder = "./vue/traduction/";  //default PATH OF THE FOLDER WITH ALL TRAD FILE
      global $dicoForceUrlFolder;         //define $dicoForceUrlFolder in your script if you want change the path without change default path (ex: for ajax)
   if (isset($dicoForceUrlFolder) & !empty($dicoForceUrlFolder)) {
      $dicoFolder = $dicoForceUrlFolder;
   }
   $globalListingLanguage = langList();
   langChoosed(); //on verifie si l'utilisateur ne désire pas changer de langue
   $dicoTraduction = openDictionnary(); //if ($dicoTraduction === false) { break; /* zero dictionnary found */ }
   function langChoosed(){
      global $lang; global $globalListingLanguage;/*$langueList = langList();*/
      if (filter_has_var(INPUT_COOKIE, 'lang') & isset($_COOKIE["lang"])){
          if(in_array(strval($_COOKIE["lang"]), $globalListingLanguage)){
            $lang = $_COOKIE["lang"];   
          }
      }
      // on place la verif de la variable GET en dernier pour lui donner la priorité
      if (filter_has_var(INPUT_GET, 'lang') & !empty($_GET["lang"])){
          if(in_array(strval($_GET["lang"]), $globalListingLanguage)){
              $lang = $_GET["lang"];
              setcookie("lang", $lang);
          }
      }
      if (filter_has_var(INPUT_POST, 'lang') & !empty($_POST["lang"])){
          if(in_array(strval($_POST["lang"]), $globalListingLanguage)){
              $lang = $_POST["lang"];
              setcookie("lang", $lang);
          }
      }
   }



   function openDictionnary(){
      global $lang; // langue choisie par l'utilisateur par defaut fr / Language choosed by user, by default fr
      global $dicoFolder;
      if(strlen(strval($lang)) <= 3 & file_exists($dicoFolder."trad-".$lang.".xml")){
         //langue choisie par l'user / Language choosed by user
         $dictionnaire = simplexml_load_file($dicoFolder."trad-".$lang.".xml");
      }elseif(file_exists($dicoFolder."trad-fr.xml")){
         //langue par defaut (fr) / Default language
         $dictionnaire = simplexml_load_file($dicoFolder."trad-fr.xml");
      }else{
         echo 'no dictionnary file / pas trouvé de dictionnaire';
         if (isset($main["title"]) && !empty($main["title"])){ $title = $main["title"]; }else{ $title = $_SERVER["PHP_SELF"];}
         error_log($title." -> No Dictionnary Found (path : ".$dicoFolder.")");
         $dictionnaire = false;
      }
      return    $dictionnaire;
   }


   function simpleUniversalTraductor($string4Trad){
      global $dicoTraduction;
         //verif anti-bug
      if($dicoTraduction){
         //moulinette
         foreach ($dicoTraduction as $pattern => $replace) {         
            $string4Trad = preg_replace('/'.$pattern.'/i', $replace, $string4Trad);
         }
      }
      return escapeString($string4Trad);
   }


   function arrayUniversalTraductor($array4Trad){
      /*   si au lieu de traduire une string on veut traduire un array */
    //  $array4Trad = /*unserialize(*/  simpleUniversalTraductor(  serialize($array4Trad)    )  /*)*/ ;
      global $dicoTraduction; global $memory;
         //verif anti-bug
      if($dicoTraduction){

         //on transforme les éventuels objets en array
         $array4Trad = objectToArray($array4Trad);

         //moulinette
            foreach ($dicoTraduction as $pattern => $replace) { 
              $memory = array('pattern'=> $pattern, 'replace'=>$replace);
               array_walk_recursive( $array4Trad, function (&$value) {
                      global $memory;
                        if (is_array($value)===false) {
                           $value = preg_replace('/('.$memory['pattern'].')/i', $memory['replace'], strval($value)); //traduction
                     }
               });
         }
         $memory['pattern'] = ''; //flush memory
         $memory['replace'] = '';
      }
      return $array4Trad;
   }


    function langList(){
      /*   CREAT A LIST OF AVAILABLE LANGUAGE BASED ON FILE trad-lang.xml in folder ./content/traduction/ */
       $langTab = array(); global $dicoFolder;
          if($dir = scandir($dicoFolder)){
             foreach($dir as $fichier){
                if(preg_match('/trad-([a-z]{1,3})\.xml/i', $fichier, $langue)  ){
                   $langTab[] = strval($langue[1]);     
                }
             }
          }else{
             $langTab = false;
          }
       return $langTab;
    }   
   
   
   function escapeString($text){
      $text = htmlentities($text, ENT_NOQUOTES, "UTF-8");
      $text = htmlspecialchars_decode($text);
      return $text;
   }   

    function objectToArray( $object )
    {
        if( !is_object( $object ) && !is_array( $object ) )
        {
            return $object;
        }
        if( is_object( $object ) )
        {
            $object = get_object_vars( $object );
        }
        return array_map( 'objectToArray', $object );
    }


    function formTraductionUniversal(){
      /*  user langList(); for creat a form for all language <option style="background-image: url(langOfLanguage.gif)">langueFromLangList</option>  */
      /*  le script utilise javascript pour auto inter-agir avec l'application (rechargement de la page en ajoutant lang=langueQueLutilisateurVeut à l'url)  */
      /*  for customize CSS, use  .formTraduction {} */
      global $dicoFolder; $option = ''; $userLang = ''; global $globalListingLanguage;
       $banItem = array(); // if you want ban some language to display, said here
       $form = '<form class="formTraduction">';
       if($globalListingLanguage){
          foreach ($globalListingLanguage as $lang) {
            if(!in_array($lang, $banItem)){
                $selected = '';
                $backgroundImg = ''; // check if trad image exist
                if(  file_exists($dicoFolder.$lang.'.gif') ){ $backgroundImg = 'background-image: url('.$dicoFolder.$lang.'.gif);';  }

                if(filter_has_var(INPUT_GET, "lang")){
                    if($lang==$_GET["lang"] ){
                        $selected = 'selected="selected"';   
                        $userLang = 'style="width: 25%; background-size:cover; float: right; '.$backgroundImg.'"';
                    }
                  }
                 $option .= '<option onclick="location.assign(\''.$_SERVER["PHP_SELF"].'?lang='.$lang.'\');" style="background-size:cover; '.$backgroundImg.'"  value="'.$lang.'" '.$selected.'>'.$lang.'</option>';               
            }
          }
       }
       $form .= '<select name="lang" '.$userLang.'>';
       $form .= $option;
       $form .= '</select>';
       $form .= '</form>';
       return $form;
    }    

    function giveLangToAngularJS () {
      $angularVariable = ''; global $lang; global $globalListingLanguage;
      if($lang){
          if($globalListingLanguage){
              if(in_array(strval($lang), $globalListingLanguage)){
              $angularVariable = '&lang='.$lang;
              }
          }
      }
      return $angularVariable;
    }

    function checkDictionnaryIntegrity ($byWhat) {
      // si $byWhat = "lang" on retourne les erreurs par lang, si par "identifiant" on retourne les erreurs par identifiants
      $tabWithAllKeyAndLangGood = array();//ce tableau va être rempli de la façon suivante [identifiant_dictionnaire] = array(langue_disponible)
      $tabWithError = array(); global $dicoFolder; global $globalListingLanguage;
      if(is_array($globalListingLanguage)){
          /* on lancce unne boucle par langue disponible */
          foreach ($globalListingLanguage as $language) {
            /* on ouvre le fichier langue */
            if($xml=simplexml_load_file($dicoFolder.'trad-'.$language.".xml")){
                foreach ($xml as $key => $value) {
                  if(!empty(strval($value))){
                      $tabWithAllKeyAndLangGood[$key][] = $language;
                  }
                }
            }
          }
          /* maintenant on cherche les erreurs */
          foreach($tabWithAllKeyAndLangGood as $identifiant=>$listCompatibleLang){
            $cpt=1;
              foreach($globalListingLanguage as $language){
                if(!in_array($language, $listCompatibleLang)){
                    switch($byWhat){
                    /*   on trie les erreurs de la manière choisie par l'user */
                        case 'pourcentageErreur':
                           $tabWithError[$identifiant] = (count($globalListingLanguage)-$cpt)/count($globalListingLanguage)*100;
                           $cpt++;
                        break;
                    /*   on trie par id */
                        case 'identifiant':
                        case 'id':
                           $tabWithError[$identifiant][] = $language;
                        break;
                    /*   on trie les erreurs par langue */
                        case 'lang':
                        default:
                           $tabWithError[$language][]= $identifiant;
                        break;
                    }
                }
              }
          }
      }
      return $tabWithError;
    }
?>
Créez le fichier trad-fr.xml en créant les dossiers indiqué dans le cheminement plus bas
./vue/traduction/trad-fr.xml

Code : Tout sélectionner

<?xml version="1.0" encoding="UTF-8" ?>
<xml>
		<!-- GENERALITE -->
		<-- test : envoyez helloWorld au module de traduction et vous aurez un Hello World -->
		<helloWorld>Hello World</helloWorld>
</xml>
Modifié en dernier par voxdemonix le lun. juin 06, 2016 12:22 am, modifié 10 fois.
~ Infernalis Creatorem ~
  • Rejoins le côté obscure, on a des cookies !
Donation Bitcoin : 1N8QGrhJGWdZNQNSspm3rSGjtXaXv9Ngat
Donation Dash : XmowiBRku3tsEREp7PhpheY4TgeLLDyKdM

Avatar du membre
voxdemonix
Messages : 1237
Enregistré le : lun. févr. 02, 2015 7:28 pm

Re: [PHP] Module de traduction V2

Message par voxdemonix » mer. déc. 23, 2015 2:34 pm

Créer une nouvelle traduction :
  • Il suffit d'ajouter dans votre dossier traduction (voir $dicoFolder dans le script) le fichier de traduction en lui donnant comme titre trad-AbreviationLangue.xml ainsi qu'un fichier gif (image) portant le nom AbreviationLangue.gif
    Veillez a ce que toutes les correspondances (les traductions) soient présente dans votre nouveau fichier de traduction (bien qu'oublier certaines valeurs n'est PAS censé faire planter le script, au pire il ne traduit pas)

    Exemple pour l'anglais :
    • trad-en.xml
      en.gif

Ajouter le formulaire sur une page web afin que l'utilisateur puisse changer de langue :
  • Il vous suffit d'ajouter un require_once(path_du_script_de_traduction); dans votre script et, à l'endroit où vous souhaitez ajouter le bouton de choix de langue ajouter un simple

    Code : Tout sélectionner

    <?php echo formTraductionUniversal(); ?>
    Le script va se charger lui-même de créer le formulaire en fonction du nombre de traduction disponible (qu'il va chercher en listant les fichiers dans le dossier de traduction) et en ajoutant les images correspondantes.
    Ce formulaire utilise javascript (location.assign(PATH)) pour recharger la page lorsque l'utilisateur veut changer de langue, en envoyant la variable $_GET["lang"]. Utiliser javascript évite de devoir ajouter un bouton submit.

Comment utiliser le traducteur dans des requêtes Ajax avec AngularJS :
  • C'est très simple, dans votre code AngularJS, ajoutez '<?php echo giveLangToAngularJS(); ?>' à la variable que vous souhaitez définir afin d'ajouter dans votre requête ajax la variable $_GET["lang"].

    Voici un exemple de définition de variable :

    Code : Tout sélectionner

    $rootScope.ajaxLanguage = '<?php echo giveLangToAngularJS(); ?>'; /*	it's write '&lang=en' when user want english language	*/
    Pour faire une requête Ajax via $http.get :

    Code : Tout sélectionner

    $http.get('./someUrl.php?myExampleVar=helloWorld' + $rootScope.ajaxLanguage, config).then(	    
    	function(response) {
    	      $scope.yourVariable = response.data;
        	}, errorCallback);
    
    


Checker l'intégrité des dictionnaires via checkDictionnaryIntegrity ($byWhat); :
  • Cette fonction vous permet de rechercher des erreurs/incohérences dans vos dictionnaires. Elle va ouvrir tout les fichiers de traductions (trad-xxx.xml), récupérer tout les identifiants de traduction et vérifier qu'ils sont présent dans tout les dico. Ensuite elle renvoie un tableau en résultat avec les incohérences classées au choix par langue (checkDictionnaryIntegrity ("lang");), par identifiant de traduction (checkDictionnaryIntegrity ("id");) ou enfin par pourcentage d'erreur par identifiant de traduction (checkDictionnaryIntegrity ("pourcentageErreur");).
    Si vous exécutez cette fonction hors du cadre "par défaut", n'oubliez pas de préciser où sont situé les fichiers de traduction via $dicoForceUrlFolder = "votrePath"; (doit obligatoirement être précisé AVANT le require/include de trad.php).
    • Exemple très simple pour afficher les erreurs :

      Code : Tout sélectionner

      <?php
      $dicoForceUrlFolder = "../moshop/content/traduction/";
      require_once("../moshop/ctrl/trad.php");
      
      //display via id
      print_r(checkDictionnaryIntegrity('id'));
      echo '<br />';
      //display via lang
      print_r(checkDictionnaryIntegrity('lang'));
      echo '<br />';
      //display % errors by id
      print_r(checkDictionnaryIntegrity('pourcentageErreur'));
       ?>
~ Infernalis Creatorem ~
  • Rejoins le côté obscure, on a des cookies !
Donation Bitcoin : 1N8QGrhJGWdZNQNSspm3rSGjtXaXv9Ngat
Donation Dash : XmowiBRku3tsEREp7PhpheY4TgeLLDyKdM

Qui est en ligne

Utilisateurs parcourant ce forum : CommonCrawl [Bot] et 0 invité