Changeset 54162 in spip-zone


Ignore:
Timestamp:
Nov 7, 2011, 3:59:50 PM (8 years ago)
Author:
esj@…
Message:

langonet La production automatique de l'index d'un libellé pour un fichier de langue peut produire un homonyme utilisé pour un autre libellé. Pour l'instant on signale le problème dans le log, mais il faudra y revenir.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/langonet/inc/langonet_verifier_items.php

    r54134 r54162  
    5555        }
    5656        if ($verification == 'definition') {
    57                 // Les chaines definies sont dans les fichiers definies par la RegExp ci-dessous
     57                // Les chaines definies sont dans les fichiers definis par la RegExp ci-dessous
    5858                // Autrement dit les fichiers francais du repertoire lang/ sont la reference
    5959                $files = preg_files(_DIR_RACINE, '/lang/[^/]+_fr\.php$');
     
    168168function langonet_classer_items($module, $utilises, $init=array(), $files=array()) {
    169169
     170        $tous_lang = array();
    170171        foreach ($files as $_fichier) {
     172                $module_def = preg_match(',/lang/([^/]+)_fr\.php$,i', $_fichier, $m) ? $m[1] : '';
    171173                foreach ($contenu = file($_fichier) as $ligne => $texte) {
    172                         if (preg_match_all("#^[\s\t]*['\"]([a-z0-9_]+)['\"][\s\t]*=>#i", $texte, $matches)) {
    173                                 foreach ($matches[1] as $cet_item) {
    174                                         $tous_lang[$cet_item][] = $_fichier;
     174                        if (preg_match_all("#^[\s\t]*['\"]([a-z0-9_]+)['\"][\s\t]*=>(.*)$#i", $texte, $matches, PREG_SET_ORDER)) {
     175                                foreach ($matches as $m) {
     176                                        $index = $m[1];
     177                                        $m[0] = $_fichier;
     178                                        $m[1] = $module_def;
     179                                        $tous_lang[$index][] = $m;
    175180                                }
    176181                        }
     
    180185        $item_non = $definition_non_mais_nok = $item_md5 = $fichier_non = array();
    181186        foreach ($utilises['items'] as $_cle => $_valeur) {
    182 
    183187                if (!isset($init[$_valeur])) {
    184188                        if (!$utilises['suffixes'][$_cle]) {
    185                                 if ($utilises['modules'][$_cle] == $module) {
     189                                $mod = $utilises['modules'][$_cle];
     190                                if ($mod == $module) {
    186191                                        // Item indefini alors que le module est explicite, c'est une erreur
    187192                                        $item_non[] = $_valeur;
     
    189194                                                $fichier_non[$_cle] = $utilises['item_tous'][$_cle];
    190195                                        }
    191                                 }
    192                                 else {
    193                                         // L'item est a priori defini dans un autre module. Le fait qu'il ne soit pas
     196                                } else {
     197                                        // L'item peut etre defini dans un autre module. Le fait qu'il ne soit pas
    194198                                        // defini dans le fichier en cours de verification n'est pas forcement une erreur.
    195199                                        // On l'identifie donc a part
    196                                         $definition_ok = false;
    197                                         $definitions = array();
     200                                        $ok = false;
    198201                                        if (array_key_exists($_valeur, $tous_lang)) {
    199                                                 $definitions = $tous_lang[$_valeur];
    200                                                 while ((list($_index, $_fichier) = each($definitions)) AND !$definition_ok)  {
    201                                                         preg_match(',/lang/([^/]+)_fr\.php$,i', $_fichier, $module_trouve);
    202                                                         if ($module_trouve[1]) {
    203                                                                 if ($module_trouve[1] == $utilises['modules'][$_cle]) {
    204                                                                         $definition_ok = true;
    205                                                                 }
    206                                                                 else {
    207                                                                         $definition_ok = ((($module_trouve[1]=='spip') OR ($module_trouve[1]=='ecrire') OR ($module_trouve[1]=='public')) AND (!$utilises['modules'][$_cle]));
    208                                                                 }
     202                                                foreach ($tous_lang[$_valeur] as $m) {
     203                                                  if (!$m[1]) continue;
     204                                                  if ($ok = ($mod ? ($m[1] == $mod) : (($m[1]=='spip') OR ($m[1]=='ecrire') OR ($m[1]=='public')))) {
     205                                                                        break;
    209206                                                        }
    210207                                                }
    211208                                        }
    212                                         if ($definition_ok) {
     209                                        if ($ok) {
     210                                                $definition_non_mais[$_valeur] = array_map('array_shift', $tous_lang[$_valeur]);
    213211                                                $item_non_mais[] = $_valeur;
    214212                                                if (is_array($utilises['item_tous'][$_cle])) {
    215213                                                        $fichier_non_mais[$_cle] = $utilises['item_tous'][$_cle];
    216214                                                }
    217                                                 if ($definitions)
    218                                                         $definition_non_mais[$_valeur] = $definitions;
    219                                         }
    220                                         else {
     215                                        } else {
    221216                                                $item_non_mais_nok[] = $_cle;
    222217                                                if (is_array($utilises['item_tous'][$_cle])) {
    223218                                                        $fichier_non_mais_nok[$_cle] = $utilises['item_tous'][$_cle];
    224                                         // Si pas normalise, c'est une auto-definition
     219                                                        // Si pas normalise, c'est une auto-definition
     220                                                        // Il faudrait gerer l'homonymie, pas seulement la signaler
    225221                                                        if (!preg_match(',^\w+$,', $_valeur)) {
    226                                                                 $item_md5[$_cle] = $_valeur;
     222                                                                  if (!isset($tous_lang[$_cle]) OR preg_match("%^\s*'$_valeur',?\s*$%", $tous_lang[$_cle][0][2]))
     223                                                                        $item_md5[$_cle] = $_valeur;
     224                                                                  else spip_log("homonymie de cle pour '$_valeur' et " . $tous_lang[$_cle][0][2]);
    227225                                                        }
    228226                                                }
    229                                                 if ($definitions)
    230                                                         $definition_non_mais_nok[$_cle] = $definitions;
    231227                                        }
    232228                                }
Note: See TracChangeset for help on using the changeset viewer.