Changeset 119835 in spip-zone


Ignore:
Timestamp:
Jan 20, 2020, 4:38:49 AM (5 weeks ago)
Author:
Cerdic
Message:

refactoring ecriveur, wip

Location:
_plugins_/trad-lang/trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/trad-lang/trunk

    • Property subgit:lock:31958fee15838b46471996f730740f5715b28985 deleted
    • Property subgit:lock:4fda5e2f69b99bc2343fe812cd9b082270e672db set to 2020-01-20T09:05:30.367
  • _plugins_/trad-lang/trunk/inc/salvatore_ecriveur.php

    r119834 r119835  
    134134                         * Le fichier n'est pas suffisamment traduit et n'existe pas, on ne fera donc rien
    135135                         */
    136                         if (!file_exists($dir_module . '/' . $module . '_' . $row['lang'] . '.php')){
    137                                 $liste_lang_non_exportees[] = $row['lang'];
     136                        if (!file_exists($dir_module . '/' . $module . '_' . $langue['lang'] . '.php')){
     137                                $liste_lang_non_exportees[] = $langue['lang'];
    138138                        } else {
    139139                                /**
     
    143143                                $liste_lang[] = $langue['lang'];
    144144                                $liste_lang_a_supprimer[] = $langue['lang'];
    145                                 $percent = (($row['N']/$count_trad_reference)*100);
     145                                $percent = (($langue['count']/$count_trad_reference)*100);
    146146                                if ($percent<($seuil_export-15)){
    147147                                        $message_commit .= "La langue '" . $langue['lang'] . "' devrait être supprimée car trop peu traduite (" . number_format($percent, 2) . " %)\n";
     
    160160                $tab = "\t";
    161161
    162                 $x = $tous = $tradlangs = array();
    163                 $prev = '';
    164                 $traduits = $modifs = $relire = 0;
     162                $php_lines = $chaines = $id_tradlangs = array();
     163                $initiale = '';
    165164
    166165                // On ne prend que les MODIF, les RELIRE et les OK pour ne pas rendre les sites multilingues en français
    167                 $res = sql_allfetsel('id_tradlang,id,str,comm,statut,md5', 'spip_tradlangs', 'module = "' . $module . '" AND lang = "' . $lang . '" AND statut != "NEW" AND statut != "attic"', 'id');
    168                 foreach ($res as $row){
    169                         $tradlangs[] = $row['id_tradlang'];
    170                         $tous[$row['id']] = $row;
    171                 }
    172                 ksort($tous);
    173 
    174                 foreach ($tous as $row){
    175                         if ($row['statut']=='OK'){
    176                                 $traduits++;
    177                         } elseif ($row['statut']=='MODIF') {
    178                                 $modifs++;
    179                         } elseif ($row['statut']=='RELIRE') {
    180                                 $relire++;
    181                         }
    182 
    183                         if (strlen($row['comm'])>1){
    184                                 // On remplace les sauts de lignes des commentaires sinon ça crée des erreurs php
    185                                 $row['comm'] = str_replace(array("\r\n", "\n", "\r"), ' ', $row['comm']);
    186                                 // Conversion des commentaires en utf-8
    187                                 $row['comm'] = unicode_to_utf_8(html_entity_decode(preg_replace('/&([lg]t;)/S', '&amp;\1', $row['comm']), ENT_NOQUOTES, 'utf-8'));
    188                         }
    189 
    190                         if ($prev!=strtoupper($row['id'][0])){
    191                                 $x[] = "\n$tab// " . strtoupper($row['id'][0]);
    192                         }
    193                         $prev = strtoupper($row['id'][0]);
    194 
    195                         if (strlen($row['statut']) and ($row['statut']!='OK')){
    196                                 $row['comm'] .= ' ' . $row['statut'];
    197                         }
    198                         if (trim($row['comm'])){
    199                                 $row['comm'] = ' # ' . trim($row['comm']); // on rajoute les commentaires ?
    200                         }
    201 
    202                         $str = $row['str'];
    203 
    204                         /**
    205                          * On enlève les sauts de lignes windows pour des sauts de ligne linux
    206                          */
    207                         $str = str_replace("\r\n", "\n", $str);
    208 
    209                         /**
    210                          * protection dans les balises genre <a href="..." ou <img src="..."
    211                          * cf inc/filtres
    212                          */
    213                         if (preg_match_all(_TYPO_BALISE, $str, $regs, PREG_SET_ORDER)){
    214                                 foreach ($regs as $reg){
    215                                         $insert = $reg[0];
    216                                         // hack: on transforme les caracteres a proteger en les remplacant
    217                                         // par des caracteres "illegaux". (cf corriger_caracteres())
    218                                         $insert = strtr($insert, _TYPO_PROTEGER, _TYPO_PROTECTEUR);
    219                                         $str = str_replace($reg[0], $insert, $str);
    220                                 }
    221                         }
    222 
    223                         /**
    224                          * Protéger le contenu des balises <html> <code> <cadre> <frame> <tt> <pre>
    225                          */
    226                         define('_PROTEGE_BLOCS_HTML', ',<(html|code|cadre|pre|tt)(\s[^>]*)?>(.*)</\1>,UimsS');
    227                         if ((strpos($str, '<')!==false) and preg_match_all(_PROTEGE_BLOCS_HTML, $str, $matches, PREG_SET_ORDER)){
    228                                 foreach ($matches as $reg){
    229                                         $insert = $reg[0];
    230                                         // hack: on transforme les caracteres a proteger en les remplacant
    231                                         // par des caracteres "illegaux". (cf corriger_caracteres())
    232                                         $insert = strtr($insert, _TYPO_PROTEGER, _TYPO_PROTECTEUR);
    233                                         $str = str_replace($reg[0], $insert, $str);
    234                                 }
    235                         }
    236 
    237                         /**
    238                          * On applique la typographie de la langue
    239                          */
    240                         $str = $typographie($str);
    241                         /**
    242                          * On remet les caractères normaux sur les caractères illégaux
    243                          */
    244                         $str = strtr($str, _TYPO_PROTECTEUR, _TYPO_PROTEGER);
    245 
    246                         $str = unicode_to_utf_8(html_entity_decode(preg_replace('/&([lg]t;)/S', '&amp;\1', $str), ENT_NOQUOTES, 'utf-8'));
     166                $chaines = sql_allfetsel('id_tradlang,id,str,comm,statut,md5', 'spip_tradlangs', 'id_tradlang_module=' . intval($id_tradlang_module) . ' AND lang=' . sql_quote($lang) . " AND statut!='NEW' AND statut!='attic'", 'id');
     167                $id_tradlangs = array_column($chaines, 'id_tradlang');
     168                $chaines = array_combine(array_column($chaines, 'id'), $chaines);
     169                ksort($chaines);
     170
     171                $total_chaines = ['OK' => 0, 'MODIF' => 0, 'RELIRE' => 0];
     172                foreach ($chaines as $chaine){
     173                        $total_chaines[$chaine['statut']]++;
     174
     175                        $comment = salvatore_clean_comment($chaine['comm']);
     176
     177                        if ($initiale !== strtoupper($chaine['id'][0])){
     178                                $initiale = strtoupper($chaine['id'][0]);
     179                                $php_lines[] = "\n$tab// $initiale";
     180                        }
     181
     182                        if (strlen($chaine['statut']) and ($chaine['statut']!=='OK')){
     183                                $comment .= ' ' . $chaine['statut'];
     184                        }
     185                        if ($comment){
     186                                $comment = ' # ' . trim($comment); // on rajoute les commentaires ?
     187                        }
     188
     189                        $str = savlatore_nettoyer_chaine_base($chaine['str'], $lang);
    247190
    248191                        /**
     
    254197                         * Si le md5 ou la chaine à changé, on la met à jour dans la base
    255198                         */
    256                         if (($row['md5']!=$newmd5) || ($str!=$row['str'])){
    257                                 $r = sql_updateq('spip_tradlangs', array('md5' => $newmd5, 'str' => $str), 'id_tradlang = ' . intval($row['id_tradlang']));
    258                         }
    259 
    260                         $x[] = $tab . var_export($row['id'], 1) . ' => ' . var_export($str, 1) . ',' . $row['comm'];
    261                 }
     199                        if (($chaine['md5']!==$newmd5) || ($str!=$chaine['str'])){
     200                                $r = sql_updateq('spip_tradlangs', array('md5' => $newmd5, 'str' => $str), 'id_tradlang = ' . intval($chaine['id_tradlang']));
     201                        }
     202
     203                        $php_lines[] = $tab . var_export($chaine['id'], 1) . ' => ' . var_export($str, 1) . ',' . $comment;
     204                }
     205
     206
    262207                $orig = ($lang==$lang_ref) ? $url_repo : false;
    263208
    264                 salvatore_log(" - traduction ($traduits/$count_trad_reference OK | $relire/$count_trad_reference RELIRE | $modifs/$count_trad_reference MODIFS), export\n");
     209                salvatore_log(" - traduction ($total_chaines['OK']/$count_trad_reference OK | $total_chaines['RELIRE']/$count_trad_reference RELIRE | $total_chaines['MODIF']/$count_trad_reference MODIFS), export\n");
    265210                // historiquement les fichiers de lang de spip_loader ne peuvent pas etre securises
    266211                $secure = ($module=='tradloader')
     
    273218
    274219                # supprimer la virgule du dernier item
    275                 $x[count($x)-1] = preg_replace('/,([^,]*)$/', '\1', $x[count($x)-1]);
    276 
    277                 $contenu = join("\n", $x);
     220                $php_lines[count($php_lines)-1] = preg_replace('/,([^,]*)$/', '\1', $php_lines[count($php_lines)-1]);
     221
     222                $contenu = join("\n", $php_lines);
    278223
    279224                // L'URL du site de traduction
     
    306251                $infos[$lang] = $people_unique = array();
    307252                $infos[$lang]['traducteurs'] = array();
    308                 $infos[$lang]['traduits'] = $traduits;
    309                 $infos[$lang]['modifs'] = $modifs;
    310                 $infos[$lang]['relire'] = $relire;
     253                $infos[$lang]['traduits'] = $total_chaines['OK'];
     254                $infos[$lang]['modifs'] = $total_chaines['MODIF'];
     255                $infos[$lang]['relire'] = $total_chaines['RELIRE'];
    311256                if (defined('_ID_AUTEUR_SALVATORE') and intval(_ID_AUTEUR_SALVATORE)>0){
    312257                        $people_unique[] = _ID_AUTEUR_SALVATORE;
     
    353298                if (in_array(substr(exec('svn status ' . _DIR_SALVATORE_TMP . $module . '/' . $module . "_$lang.php"), 0, 1), array('A', 'M'))){
    354299                        $last_change = exec('env LC_MESSAGES=en_US.UTF-8 svn info ' . _DIR_SALVATORE_TMP . $module . '/' . $module . "_$lang.php | awk '/^Last Changed Date/ { print $4 \" \" $5 }'");
    355                         $auteur_versions = sql_allfetsel('id_auteur', 'spip_versions', 'objet="tradlang" AND date > ' . sql_quote($last_change) . ' AND ' . sql_in('id_objet', $tradlangs) . ' AND id_auteur != "-1" AND id_auteur !=' . intval(_ID_AUTEUR_SALVATORE), 'id_auteur');
     300                        $auteur_versions = sql_allfetsel('id_auteur', 'spip_versions', 'objet="tradlang" AND date > ' . sql_quote($last_change) . ' AND ' . sql_in('id_objet', $id_tradlangs) . ' AND id_auteur != "-1" AND id_auteur !=' . intval(_ID_AUTEUR_SALVATORE), 'id_auteur');
    356301                        if (count($auteur_versions)==1){
    357302                                $email = sql_getfetsel('email', 'spip_auteurs', 'id_auteur = ' . intval($auteur_versions[0]['id_auteur']));
     
    423368        }
    424369}
     370
     371/**
     372 * Nettoyer le commentaire avant ecriture dans le PHP
     373 * @param $comment
     374 * @return mixed|string
     375 */
     376function salvatore_clean_comment($comment) {
     377        if (strlen(trim($comment))>1){
     378                // On remplace les sauts de lignes des commentaires sinon ça crée des erreurs php
     379                $comment = str_replace(array("\r\n", "\n", "\r"), ' ', $comment);
     380                // Conversion des commentaires en utf-8
     381                $comment = unicode_to_utf_8(html_entity_decode(preg_replace('/&([lg]t;)/S', '&amp;\1', $comment), ENT_NOQUOTES, 'utf-8'));
     382                return $comment;
     383        }
     384        return '';
     385}
     386
     387/**
     388 * Nettoyer la chaine traduite qui est en base avant export dans le PHP
     389 * @param string $chaine
     390 * @param string $lang
     391 * @return string
     392 */
     393function savlatore_nettoyer_chaine_base($chaine, $lang) {
     394        static $typographie_functions = array();
     395
     396        if (!isset($typographie_functions[$lang])){
     397                $typo = (in_array($lang, array('eo', 'fr', 'cpf')) || strncmp($lang, 'fr_', 3)==0) ? 'fr' : 'en';
     398                $typographie_functions[$lang] = charger_fonction($typo, 'typographie');
     399        }
     400
     401        /**
     402         * On enlève les sauts de lignes windows pour des sauts de ligne linux
     403         */
     404        $chaine = str_replace("\r\n", "\n", $chaine);
     405
     406        /**
     407         * protection dans les balises genre <a href="..." ou <img src="..."
     408         * cf inc/filtres
     409         */
     410        if (preg_match_all(_TYPO_BALISE, $chaine, $regs, PREG_SET_ORDER)){
     411                foreach ($regs as $reg){
     412                        $insert = $reg[0];
     413                        // hack: on transforme les caracteres a proteger en les remplacant
     414                        // par des caracteres "illegaux". (cf corriger_caracteres())
     415                        $insert = strtr($insert, _TYPO_PROTEGER, _TYPO_PROTECTEUR);
     416                        $chaine = str_replace($reg[0], $insert, $chaine);
     417                }
     418        }
     419
     420        /**
     421         * Protéger le contenu des balises <html> <code> <cadre> <frame> <tt> <pre>
     422         */
     423        define('_PROTEGE_BLOCS_HTML', ',<(html|code|cadre|pre|tt)(\s[^>]*)?>(.*)</\1>,UimsS');
     424        if ((strpos($chaine, '<')!==false) and preg_match_all(_PROTEGE_BLOCS_HTML, $chaine, $matches, PREG_SET_ORDER)){
     425                foreach ($matches as $reg){
     426                        $insert = $reg[0];
     427                        // hack: on transforme les caracteres a proteger en les remplacant
     428                        // par des caracteres "illegaux". (cf corriger_caracteres())
     429                        $insert = strtr($insert, _TYPO_PROTEGER, _TYPO_PROTECTEUR);
     430                        $chaine = str_replace($reg[0], $insert, $chaine);
     431                }
     432        }
     433
     434        /**
     435         * On applique la typographie de la langue
     436         */
     437        $chaine = $typographie_functions[$lang]($chaine);
     438
     439        /**
     440         * On remet les caractères normaux sur les caractères illégaux
     441         */
     442        $chaine = strtr($chaine, _TYPO_PROTECTEUR, _TYPO_PROTEGER);
     443
     444        $chaine = unicode_to_utf_8(html_entity_decode(preg_replace('/&([lg]t;)/S', '&amp;\1', $chaine), ENT_NOQUOTES, 'utf-8'));
     445
     446        return $chaine;
     447}
Note: See TracChangeset for help on using the changeset viewer.