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

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

Oups, il vaut mieux créer la variable avant le test.

  • 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        $source = _DIR_RACINE . $ou_langue . $module . '_' . $langue_source . '.php';
46        // Trouver dans quel cas ce fichier n'a pas deja ete inclus a ce stade
47        if (empty($GLOBALS[$var_source])) {
48                if (!file_exists($source))
49                        return array('erreur' =>  _T('langonet:message_nok_fichier_langue',  array('langue' => $langue_source, 'module' => $module, 'dossier' => $ou_langue)));
50                $GLOBALS['idx_lang'] = $var_source;
51                include($source);
52        }
53
54        // Récupérer le bandeau d'origine si il existe.
55        // Le bandeau est composé des lignes qui précèdent la signature habituelle
56        $bandeau = '';
57        if ($tableau = file($source)) {
58                array_shift($tableau); // saute < ? php
59                $signature_trouvee = false;
60                foreach($tableau as $_ligne) {
61                        $bandeau .= $_ligne;
62                        if (strpos($_ligne, _LANGONET_SIGNATURE) !== false) {
63                                $signature_trouvee = true;
64                                break;
65                        }
66                }
67                if (!$signature_trouvee)
68                        $bandeau = '';
69        }
70
71        // On charge le fichier de langue cible si il existe dans l'arborescence $ou_langue
72        $var_cible = "i18n_" . $module . "_" . $langue_cible;
73        $cible = _DIR_RACINE . $ou_langue . $module . '_' . $langue_cible . '.php';
74        if (empty($GLOBALS[$var_cible])) {
75                if (file_exists($cible)) {
76                        $GLOBALS['idx_lang'] = $var_cible;
77                        include($cible);
78                }
79        }
80
81        // Créer la liste des items du fichier cible sous la forme d'un tableau (raccourci, traduction)
82        $source = langonet_generer_items_cible($module, $var_source, $var_cible, $mode, $encodage, $oublis_inutiles);
83
84        // Ecriture du fichier de langue à partir de la liste des items cible
85        $dir = sous_repertoire(_DIR_TMP,"langonet");
86        $dir = sous_repertoire($dir,"generation");
87        $bandeau .= "// Produit automatiquement par le plugin LangOnet à partir de la langue source $langue_source";
88        $ok = ecrire_fichier_langue_php($dir, $langue_cible, $module, $source, $bandeau);
89
90        if (!$ok) {
91                $resultats['erreur'] = _T('langonet:message_nok_ecriture_fichier', array('langue' => $langue_cible, 'module' => $module));
92        }
93        else {
94                $resultats['fichier'] = $ok;
95        }
96
97        return $resultats;
98}
99
100
101/**
102 * @param string $module
103 * @param array $var_source
104 * @param array $var_cible
105 * @param string $mode
106 * @param string $encodage
107 * @param array $oublis_inutiles
108 * @return array
109 */
110function langonet_generer_items_cible($module, $var_source, $var_cible, $mode='index', $encodage='utf8', $oublis_inutiles=array()) {
111        if ($encodage == 'utf8')
112                include_spip('inc/langonet_utils');
113
114        // On recupere les items du fichier de langue si celui ci n'est pas vide
115        $source = $GLOBALS[$var_source] ? $GLOBALS[$var_source] : array();
116
117        // Si on demande de generer le fichier corrige alors on fournit la liste des items à ajouter ou supprimer
118        $source = ($mode == 'oublie' OR $mode == 'fonction_l') ? array_merge($source, $oublis_inutiles) : $source;
119        if ($mode != 'inutile')
120                $oublis_inutiles = array();
121
122        foreach ($source as $_item => $_valeur) {
123                $texte = @$GLOBALS[$var_cible][$_item];
124                if ($texte) {
125                        $avec_commentaire = in_array($_item, $oublis_inutiles);
126                }
127                else {
128                        $avec_commentaire = false;
129                        if ($mode != 'pas_item') {
130                                if ($mode == 'valeur')
131                                        $texte = _LANGONET_TAG_NOUVEAU . $_valeur;
132                                else if ($mode == 'vide')
133                                        $texte = _LANGONET_TAG_NOUVEAU;
134                                else if (($mode == 'fonction_l') OR (($mode == 'oublie') AND $_valeur))
135                                        $texte = array(_LANGONET_DEFINITION_L, preg_replace("/'[$](\w+)'/", '\'@\1@\'', $_valeur), $mode);
136                                else if ($mode !== 'oublie')
137                                        $texte = _LANGONET_TAG_NOUVEAU . $_item;
138                                else if (preg_match('/^[a-z]+$/i', $_item))
139                                        $texte = $_item;
140                                else $texte = _LANGONET_DEFINITION_MANQUANTE;
141                        }
142                }
143                if ($encodage == 'utf8')
144                        $texte = entite2utf($texte);
145                $source[$_item] = $avec_commentaire ? array(_LANGONET_DEFINITION_OBSOLETE, $texte, $mode) : $texte;
146        }
147
148        return $source;
149}
150
151
152/**
153 * Produit un fichier de langue a partir d'un tableau (index => trad)
154 * Si la traduction n'est pas une chaine mais un tableau, on inclut un commentaire
155 *
156 * @param $langue
157 * @param $module
158 * @param $items
159 * @param string $producteur
160 * @return string
161 */
162function produire_fichier_langue($langue, $module, $items, $producteur='') {
163        ksort($items);
164        $initiale = '';
165        $contenu = array();
166        foreach($items as $_item => $_traduction) {
167                if ($initiale != strtoupper($_item[0])) {
168                        $initiale = strtoupper($_item[0]);
169                        $contenu[]= "\n// $initiale";
170                }
171                if (!is_string($_traduction)) {
172                        $t = str_replace("'", '\\\'', $_traduction[1]);
173                        if ($_traduction[2] == 'inutile')
174                                $contenu[]= "/*\t" . $_traduction[0] ."\n\t'$_item' => '$t',*/";
175                        else {
176                                $com = !$_traduction[0] ? '' : ("/*\t". $_traduction[0] ." */\n");
177                                $contenu[]= "$com\t'$_item' => '$t',";
178                        }
179                }
180                else {
181                        $t = str_replace("'", '\\\'', $_traduction);
182                        $t = str_replace('\\\\n', "' . \"\\n\" .'", $t);
183                        $t = str_replace(_LANGONET_TAG_NOUVEAU, '', $t, $c);
184                        $contenu[]= "\t'$_item' => '$t'," . ($c>0 ? ' ' . _LANGONET_TAG_NOUVEAU : '');
185                }
186        }
187        if (!strpos($producteur, _LANGONET_SIGNATURE)) 
188                $producteur = "\n" . _LANGONET_SIGNATURE . "\n" . preg_replace(",\\n[/#]*,", "\n/// ", $producteur);
189
190        return '<'. "?php\n" .
191$producteur . '
192// Module: ' . $module . '
193// Langue: ' . $langue . '
194// Date: ' . date('d-m-Y H:i:s') . '
195// Items: ' . count($items) . '
196
197if (!defined(\'_ECRIRE_INC_VERSION\')) return;
198
199$GLOBALS[$GLOBALS[\'idx_lang\']] = array(
200' .
201          join("\n", $contenu)  .
202          "\n);\n?".'>';
203}
204
205
206/**
207 * Ecriture d'un fichier de langue à partir de la liste de ces couples (item, traduction)
208 * et de son bandeau d'information
209 * Cette fonction est aussi utilisée par PlugOnet
210 *
211 * @param $dir
212 * @param $langue
213 * @param $module
214 * @param $items
215 * @param string $producteur
216 * @return bool|string
217 */
218function ecrire_fichier_langue_php($dir, $langue, $module, $items, $producteur='') {
219        $nom_fichier = $dir . $module . "_" . $langue   . '.php';
220        $contenu = produire_fichier_langue($langue, $module, $items, $producteur);
221
222        return ecrire_fichier($nom_fichier, $contenu) ? $nom_fichier : false;
223}
224?>
Note: See TracBrowser for help on using the repository browser.