source: spip-zone/_plugins_/langonet/trunk/inc/langonet_generer_fichier.php @ 71992

Last change on this file since 71992 was 71992, checked in by eric@…, 7 years ago

Suite du refactoring de la génération:

  • on supprime des modes 'nouveau' devenus inutiles car on inclut systématiquement le commentaire # NEW pour les nouveaux items par cohérence avec TradLang?.
  • on code le retour de la fonction traiter comme les autres formulaires
  • Property svn:eol-style set to native
File size: 7.4 KB
Line 
1<?php
2
3if (!defined('_ECRIRE_INC_VERSION')) return;
4
5if (!defined('_LANGONET_SIGNATURE'))
6        define('_LANGONET_SIGNATURE', "// Ceci est un fichier langue de SPIP -- This is a SPIP language file");
7
8if (!defined('_LANGONET_DEFINITION_L'))
9        define('_LANGONET_DEFINITION_L', '<LANGONET_DEFINITION_L>');
10if (!defined('_LANGONET_DEFINITION_MANQUANTE'))
11        define('_LANGONET_DEFINITION_MANQUANTE', '<LANGONET_DEFINITION_MANQUANTE>');
12if (!defined('_LANGONET_DEFINITION_OBSOLETE'))
13        define('_LANGONET_DEFINITION_OBSOLETE', '<LANGONET_DEFINITION_OBSOLETE>');
14
15if (!defined('_LANGONET_TAG_NOUVEAU'))
16        define('_LANGONET_TAG_NOUVEAU', '# NEW');
17if (!defined('_LANGONET_TAG_MODIFIE'))
18        define('_LANGONET_TAG_MODIFIE', '# MODIF');
19
20
21/**
22 * Ecriture des fichiers de langue
23 *
24 * @param string $module
25 * @param string $langue_source
26 * @param string $ou_langue
27 * @param string $langue_cible [optional]
28 * @param string $mode [optional]
29 * @param string $encodage [optional]
30 * @param array $oublis_inutiles [optional]
31 * @return
32 */
33function inc_langonet_generer_fichier($module, $langue_source, $ou_langue, $langue_cible='en', $mode='valeur', $encodage='utf8', $oublis_inutiles=array()) {
34
35        // Initialisation du tableau des resultats
36        // Si une erreur se produit lors du deroulement de la fonction, le tableau contient le libelle
37        // de l'erreur dans $resultats['erreur'].
38        // Sinon, cet index n'existe pas
39        $resultats = array();
40
41        // On charge le fichier de langue source si il existe dans l'arborescence $ou_langue
42        // (evite le mecanisme standard de surcharge SPIP)
43        include_spip('inc/traduire');
44        $var_source = "i18n_" . $module . "_" . $langue_source;
45        // Trouver dans quel cas ce fichier n'a pas deja ete inclus a ce stade
46        if (empty($GLOBALS[$var_source])) {
47                if (!file_exists($source = _DIR_RACINE . $ou_langue . $module . '_' . $langue_source . '.php'))
48                        return array('erreur' =>  _T('langonet:message_nok_fichier_langue',  array('langue' => $langue_source, 'module' => $module, 'dossier' => $ou_langue)));
49                $GLOBALS['idx_lang'] = $var_source;
50                include($source);
51        }
52
53        // Récupérer le bandeau d'origine si il existe.
54        // Le bandeau est composé des lignes qui précèdent la signature habituelle
55        $bandeau = '';
56        if ($tableau = file($source)) {
57                array_shift($tableau); // saute < ? php
58                $signature_trouvee = false;
59                foreach($tableau as $_ligne) {
60                        $bandeau .= $_ligne;
61                        if (strpos($_ligne, _LANGONET_SIGNATURE) !== false) {
62                                $signature_trouvee = true;
63                                break;
64                        }
65                }
66                if (!$signature_trouvee)
67                        $bandeau = '';
68        }
69
70        // On charge le fichier de langue cible si il existe dans l'arborescence $ou_langue
71        $var_cible = "i18n_" . $module . "_" . $langue_cible;
72        if (empty($GLOBALS[$var_cible])) {
73                if (file_exists($cible = _DIR_RACINE . $ou_langue . $module . '_' . $langue_cible . '.php')) {
74                        $GLOBALS['idx_lang'] = $var_cible;
75                        include($cible);
76                }
77        }
78
79        // Créer la liste des items du fichier cible sous la forme d'un tableau (raccourci, traduction)
80        $source = langonet_generer_items_cible($module, $var_source, $var_cible, $mode, $encodage, $oublis_inutiles);
81
82        // Ecriture du fichier de langue à partir de la liste des items cible
83        $dir = sous_repertoire(_DIR_TMP,"langonet");
84        $dir = sous_repertoire($dir,"generation");
85        $bandeau .= "// Produit automatiquement par le plugin LangOnet à partir de la langue source $langue_source";
86        $ok = ecrire_fichier_langue_php($dir, $langue_cible, $module, $source, $bandeau);
87
88        if (!$ok) {
89                $resultats['erreur'] = _T('langonet:message_nok_ecriture_fichier', array('langue' => $langue_cible, 'module' => $module));
90        }
91        else {
92                $resultats['fichier'] = $ok;
93        }
94
95        return $resultats;
96}
97
98
99/**
100 * @param string $module
101 * @param array $var_source
102 * @param array $var_cible
103 * @param string $mode
104 * @param string $encodage
105 * @param array $oublis_inutiles
106 * @return array
107 */
108function langonet_generer_items_cible($module, $var_source, $var_cible, $mode='index', $encodage='utf8', $oublis_inutiles=array()) {
109        if ($encodage == 'utf8')
110                include_spip('inc/langonet_utils');
111
112        // On recupere les items du fichier de langue si celui ci n'est pas vide
113        $source = $GLOBALS[$var_source] ? $GLOBALS[$var_source] : array();
114
115        // Si on demande de generer le fichier corrige alors on fournit la liste des items à ajouter ou supprimer
116        $source = ($mode == 'oublie' OR $mode == 'fonction_l') ? array_merge($source, $oublis_inutiles) : $source;
117        if ($mode != 'inutile')
118                $oublis_inutiles = array();
119
120        foreach ($source as $_item => $_valeur) {
121                $texte = @$GLOBALS[$var_cible][$_item];
122                if ($texte) {
123                        $avec_commentaire = in_array($_item, $oublis_inutiles);
124                }
125                else {
126                        $avec_commentaire = false;
127                        if ($mode != 'pas_item') {
128                                if ($mode == 'valeur')
129                                        $texte = _LANGONET_TAG_NOUVEAU . $_valeur;
130                                else if ($mode == 'vide')
131                                        $texte = _LANGONET_TAG_NOUVEAU;
132                                else if (($mode == 'fonction_l') OR (($mode == 'oublie') AND $_valeur))
133                                        $texte = array(_LANGONET_DEFINITION_L, preg_replace("/'[$](\w+)'/", '\'@\1@\'', $_valeur), $mode);
134                                else if ($mode !== 'oublie')
135                                        $texte = _LANGONET_TAG_NOUVEAU . $_item;
136                                else if (preg_match('/^[a-z]+$/i', $_item))
137                                        $texte = $_item;
138                                else $texte = _LANGONET_DEFINITION_MANQUANTE;
139                        }
140                }
141                if ($encodage == 'utf8')
142                        $texte = entite2utf($texte);
143                $source[$_item] = $avec_commentaire ? array(_LANGONET_DEFINITION_OBSOLETE, $texte, $mode) : $texte;
144        }
145
146        return $source;
147}
148
149
150/**
151 * Produit un fichier de langue a partir d'un tableau (index => trad)
152 * Si la traduction n'est pas une chaine mais un tableau, on inclut un commentaire
153 *
154 * @param $langue
155 * @param $module
156 * @param $items
157 * @param string $producteur
158 * @return string
159 */
160function produire_fichier_langue($langue, $module, $items, $producteur='') {
161        ksort($items);
162        $initiale = '';
163        $contenu = array();
164        foreach($items as $_item => $_traduction) {
165                if ($initiale != strtoupper($_item[0])) {
166                        $initiale = strtoupper($_item[0]);
167                        $contenu[]= "\n// $initiale";
168                }
169                if (!is_string($_traduction)) {
170                        $t = str_replace("'", '\\\'', $_traduction[1]);
171                        if ($_traduction[2] == 'inutile')
172                                $contenu[]= "/*\t" . $_traduction[0] ."\n\t'$_item' => '$t',*/";
173                        else {
174                                $com = !$_traduction[0] ? '' : ("/*\t". $_traduction[0] ." */\n");
175                                $contenu[]= "$com\t'$_item' => '$t',";
176                        }
177                }
178                else {
179                        $t = str_replace("'", '\\\'', $_traduction);
180                        $t = str_replace('\\\\n', "' . \"\\n\" .'", $t);
181                        $t = str_replace(_LANGONET_TAG_NOUVEAU, '', $t, $c);
182                        $contenu[]= "\t'$_item' => '$t'," . ($c>0 ? ' ' . _LANGONET_TAG_NOUVEAU : '');
183                }
184        }
185        if (!strpos($producteur, _LANGONET_SIGNATURE)) 
186                $producteur = "\n" . _LANGONET_SIGNATURE . "\n" . preg_replace(",\\n[/#]*,", "\n/// ", $producteur);
187
188        return '<'. "?php\n" .
189$producteur . '
190// Module: ' . $module . '
191// Langue: ' . $langue . '
192// Date: ' . date('d-m-Y H:i:s') . '
193// Items: ' . count($items) . '
194
195if (!defined(\'_ECRIRE_INC_VERSION\')) return;
196
197$GLOBALS[$GLOBALS[\'idx_lang\']] = array(
198' .
199          join("\n", $contenu)  .
200          "\n);\n?".'>';
201}
202
203
204/**
205 * Ecriture d'un fichier de langue à partir de la liste de ces couples (item, traduction)
206 * et de son bandeau d'information
207 * Cette fonction est aussi utilisée par PlugOnet
208 *
209 * @param $dir
210 * @param $langue
211 * @param $module
212 * @param $items
213 * @param string $producteur
214 * @return bool|string
215 */
216function ecrire_fichier_langue_php($dir, $langue, $module, $items, $producteur='') {
217        $nom_fichier = $dir . $module . "_" . $langue   . '.php';
218        $contenu = produire_fichier_langue($langue, $module, $items, $producteur);
219
220        return ecrire_fichier($nom_fichier, $contenu) ? $nom_fichier : false;
221}
222?>
Note: See TracBrowser for help on using the repository browser.