source: spip-zone/_plugins_/trad-lang/trunk/formulaires/tradlang_importer_langue.php @ 90095

Last change on this file since 90095 was 90095, checked in by kent1@…, 6 years ago

Améliorer la gestion des .po

File size: 16.9 KB
Line 
1<?php
2
3if (!defined("_ECRIRE_INC_VERSION")) return;
4
5function formulaires_tradlang_importer_langue_charger_dist($id_tradlang_module,$lang,$lang_orig) {
6        $valeurs['_etapes'] = 2;
7        $valeurs['lang_orig'] = $lang_orig;
8        $valeurs['lang_cible'] = $lang;
9        if(!$nom_mod = sql_getfetsel('nom_mod','spip_tradlang_modules','id_tradlang_module='.intval($id_tradlang_module))){
10                $valeurs['message_erreur'] = _T('tradlang:erreur_import_module_inexistant',array('id'=>$id_tradlang_module));
11                $valeurs['editable'] = false;
12        }else{
13                if(_request('_etape') == '2'){
14                        $module = sql_getfetsel('module','spip_tradlang_modules','id_tradlang_module='.intval($id_tradlang_module));
15                        $fichier_module = $module.'_'.$lang.'.php';
16                        $fichier_module_po = $module.'_'.$lang.'.po';
17                        $dir_lang = sous_repertoire(_DIR_VAR, 'cache-tradlang');
18                        $dest = $dir_lang.$fichier_module;
19                        $dest_po = $dir_lang.$fichier_module_po;
20                        if(file_exists($dest) || file_exists($dest_po)){
21                                if(file_exists($dest)){
22                                        $modifs = $undefined = array();
23                                        $memtrad = $GLOBALS['idx_lang'] = 'i18n_'.crc32($module).'_tmp';
24                                        include $dest;
25                                       
26                                        /**
27                                         * Recuperation des statuts dans le fichier
28                                         */
29                                        $contenu=file_get_contents($dest);
30                                        $contenu = str_replace("\t",'',$contenu);
31                                        $tab=preg_split("/\r\n|\n\r|;\n|\n\/\/|\(\n|\n\);\n|\'\,\n|\n[\s\t]*(\')|\/\/[\s\t][0-9A-Z]\n[\s\t](\')/", $contenu,'-1',PREG_SPLIT_NO_EMPTY);
32                                        $liste_trad=array();
33                                        reset($tab);
34                                       
35                                        while (list(,$ligne) = each($tab)){
36                                                $ligne = str_replace("\'",'',$ligne);
37                                                if (strlen($ligne)>0) {
38                                                        if (preg_match("/\'(.*?)\'[\s\t]*=>[\s\t]*\'(.*?)\'[\s\t]*,{0,1}[\s\t]*(#.*)?/ms",$ligne,$matches)) {
39                                                                if (isset($matches[1]) and isset($matches[3]) and strlen(trim($matches[3]))>0 ) {
40                                                                        list(,$comm)=explode("#",$matches[3]);
41                                                                        if(in_array(trim($comm),array('NEW','MODIF','RELIRE')))
42                                                                                $liste_trad[$matches[1]]=trim($comm);
43                                                                }
44                                                        }
45                                                }
46                                        }
47                                        reset($liste_trad);
48                                        $keys_liste_trad = array_keys($liste_trad);
49                                       
50                                        $str_lang = $GLOBALS[$memtrad];  // on a vu certains fichiers faire des betises et modifier idx_lang
51                                        // verifie si c'est un fichier langue
52                                        if (!is_array($str_lang))
53                                                $erreurs['fichier_langue'] = _T('tradlang:erreur_upload_fichier_php_array',array('fichier'=>$file['name']));
54                                        else{
55                                                $langues_base = sql_allfetsel('id,str,statut','spip_tradlangs','id_tradlang_module='.intval($id_tradlang_module).' AND lang='.sql_quote($lang));
56                                                foreach($langues_base as $strings_id => $strings){
57                                                        $str_lang[$strings['id']] = preg_replace(',^(<(MODIF|NEW|RELIRE|PLUS_UTILISE)>)+,US', '', $str_lang[$strings['id']]);
58                                                        if((strlen($str_lang[$strings['id']]) > 0) && $strings['str'] != $str_lang[$strings['id']]){
59                                                                $modifs[$strings['id']] = array('orig'=>$strings['str'],'new'=>$str_lang[$strings['id']],'statut' => (in_array($strings['id'],$keys_liste_trad) ? $liste_trad[$strings['id']] : 'OK'));
60                                                        }
61                                                        elseif(strlen($str_lang[$strings['id']]) == 0){
62                                                                $undefined[] = $strings['id'];
63                                                        }
64                                                        elseif(in_array($strings['id'],$keys_liste_trad) && ($strings['statut'] != $liste_trad[$strings['id']])){
65                                                                $modifs[$strings['id']] = array('orig'=>$strings['str'],'new'=>$str_lang[$strings['id']],'statut' => $liste_trad[$strings['id']]);
66                                                        }
67                                                        elseif(!in_array($strings['id'],$keys_liste_trad) && $strings['statut'] != 'OK'){
68                                                                $modifs[$strings['id']] = array('orig'=>$strings['str'],'new'=>$str_lang[$strings['id']],'statut' => 'OK');
69                                                        }
70                                                        unset($langues_base[$strings_id]);
71                                                }
72                                        }
73                                }
74                                if(file_exists($dest_po)){
75                                        lire_fichier($dest_po,$contenu_po);
76                                        preg_match_all(',(\#\, php-format|\#\, fuzzy\, php-format).*msgstr "(.*)\n(\n|\Z),Uims', $contenu_po,$matches);
77                                        $array_po = array();
78                                        foreach($matches[0] as $match){
79                                                $statut = "OK";
80                                                preg_match(',msgstr \"(.*)\n(\n|\Z),Uims',$match,$matches_str);
81                                                $str = rtrim(trim($matches_str[1]),'"');
82                                                $str = trim(str_replace("\"\n\"","\n",$str));
83                                                preg_match(',\#\| msgid \"(.*)\"\n,Uims',$match,$matches);
84                                                if(!isset($matches[1]) || $matches[1] == ''){
85                                                        preg_match(',\nmsgid \"(.*)\nmsgstr,Uims',$match,$matches_str_orig);
86                                                        $str_orig = rtrim(trim($matches_str_orig[1]),'"');
87                                                        $str_orig = trim(str_replace("\"\n\"","",$str_orig));
88                                                        $matches[1] = sql_getfetsel('id','spip_tradlangs','id_tradlang_module='.intval($id_tradlang_module)." AND str=".sql_quote($str_orig));
89                                                }
90                                                if(preg_match(',\#\, fuzzy\, php-format,',$match,$matches_statut))
91                                                        $statut = "MODIF";
92                                                if($str != '')
93                                                        $array_po[$matches[1]] = array('str'=>$str, 'statut'=>$statut);
94                                        }
95                                        $modifs = array();
96                                        $langues_base = sql_allfetsel('id,str,statut','spip_tradlangs','module='.sql_quote($module).' AND lang='.sql_quote($lang));
97                                        foreach($langues_base as $strings_id => $strings){
98                                                $str_lang[$strings['id']] = tradlang_utf8(preg_replace(',^(<(MODIF|NEW|PLUS_UTILISE)>)+,US', '', $str_lang[$strings['id']]));
99                                                if(isset($array_po[$strings['id']]['str']) && strlen(trim($array_po[$strings['id']]['str'])) > 0){
100                                                        if(($strings['str'] != $array_po[$strings['id']]['str']) OR ($strings['statut'] != $array_po[$strings['id']]['statut'])){
101                                                                $modifs[$strings['id']] = array('orig'=>$strings['str'],'new'=>$array_po[$strings['id']]['str'],'statut'=>$array_po[$strings['id']]['statut']);
102                                                        }
103                                                }
104                                                unset($langues_base[$strings_id]);
105                                        }
106                                }
107                        }
108                        $valeurs['_modifs'] = $modifs;
109                }
110        }
111        if(count($undefined) > 0)
112                $valeurs['message_erreur'] = singulier_ou_pluriel(count($undefined),'tradlang:item_non_defini_fichier','tradlang:item_non_defini_fichier_nb');
113               
114        $valeurs['id_tradlang_module'] = $id_tradlang_module;
115        return $valeurs;
116}
117
118function formulaires_tradlang_importer_langue_verifier_1_dist($id_tradlang_module,$lang) {
119        $erreurs = array();
120        if(_request('_etape')==1){
121                $module = sql_getfetsel('module','spip_tradlang_modules','id_tradlang_module='.intval($id_tradlang_module));
122                $fichier_php = $module.'_'.$lang.'.php';
123                $fichier_po = $module.'_'.$lang.'.po';
124                $fichiers_module[] = $fichier_php;
125                $fichiers_module[] = $fichier_po;
126                $post = isset($_FILES) ? $_FILES : $GLOBALS['HTTP_POST_FILES'];
127                $files = array();
128                include_spip('inc/joindre_document');
129                if (is_array($post)){
130                        foreach ($post as $file) {
131                                if (!($file['error'] == 4)){
132                                        if (!in_array($file['name'],$fichiers_module)){
133                                                $fichier_module = $fichier_php.', '.$fichier_po;
134                                                $erreurs['fichier_langue'] =  _T('tradlang:erreur_upload_fichier_php',array('fichier'=>$file['name'],'fichier_attendu'=>$fichier_module));
135                                        }
136                                       
137                                        if(!$erreurs['fichier_langue']){
138                                                $dir_lang = sous_repertoire (_DIR_VAR, 'cache-tradlang');
139                                                $dest = $dir_lang.$file['name'];
140                                                @move_uploaded_file($file['tmp_name'],$dest);
141                                                if(!file_exists($dest)){
142                                                        $erreurs['message_erreur'] = 'Fichier temporaire non créé';
143                                                }
144                                                /**
145                                                 * Gestion du cas des fichiers php
146                                                 */
147                                                if($file['name'] == $fichier_php){
148                                                        $memtrad = $GLOBALS['idx_lang'] = 'i18n_'.crc32($module).'_tmp';
149                                                        include $dest;
150                                                       
151                                                        /**
152                                                         * Recuperation des statuts dans le fichier
153                                                         */
154                                                        $contenu=file_get_contents($dest);
155                                                        $contenu = str_replace("\t",'',$contenu);
156                                                        $tab=preg_split("/\r\n|\n\r|;\n|\n\/\/|\(\n|\n\);\n|\'\,\n|\n[\s\t]*(\')|\/\/[\s\t][0-9A-Z]\n[\s\t](\')/", $contenu,'-1',PREG_SPLIT_NO_EMPTY);
157                                                        $liste_trad=array();
158                                                        reset($tab);
159                                                       
160                                                        while (list(,$ligne) = each($tab)){
161                                                                $ligne = str_replace("\'",'',$ligne);
162                                                                if (strlen($ligne)>0) {
163                                                                        if (preg_match("/\'(.*?)\'[\s\t]*=>[\s\t]*\'(.*?)\'[\s\t]*,{0,1}[\s\t]*(#.*)?/ms",$ligne,$matches)) {
164                                                                                if (isset($matches[1]) and isset($matches[3]) and strlen(trim($matches[3]))>0 ) {
165                                                                                        list(,$comm)=explode("#",$matches[3]);
166                                                                                        if(in_array(trim($comm),array('NEW','MODIF','RELIRE')))
167                                                                                                $liste_trad[$matches[1]]=trim($comm);
168                                                                                }
169                                                                        }
170                                                                }
171                                                        }
172                                                        reset($liste_trad);
173                                                        $keys_liste_trad = array_keys($liste_trad);
174                                                       
175                                                        $str_lang = $GLOBALS[$memtrad];
176                                                        // verifie si c'est un fichier langue
177                                                        if (!is_array($str_lang))
178                                                                $erreurs['fichier_langue'] = _T('tradlang:erreur_upload_fichier_php_array',array('fichier'=>$file['name']));
179                                                        else{
180                                                                $langues_base = sql_allfetsel('id,str,statut','spip_tradlangs','id_tradlang_module='.intval($id_tradlang_module).' AND lang='.sql_quote($lang));
181                                                                $modifs = array();
182                                                                foreach($langues_base as $strings_id => $strings){
183                                                                        $str_lang[$strings['id']] = tradlang_utf8(preg_replace(',^(<(MODIF|NEW|PLUS_UTILISE)>)+,US', '', $str_lang[$strings['id']]));
184                                                                        if($strings['str'] != $str_lang[$strings['id']]){
185                                                                                $modifs[$strings['id']] = array('orig'=>$strings['str'],'new'=>$str_lang[$strings['id']]);
186                                                                                break;
187                                                                        }
188                                                                        if(in_array($strings['id'],$keys_liste_trad) && ($strings['statut'] != $liste_trad[$strings['id']])){
189                                                                                $modifs[$strings['id']] = array('orig'=>$strings['str'],'new'=>$str_lang[$strings['id']]);
190                                                                                break;
191                                                                        }
192                                                                }
193                                                        }
194                                                }
195                                                /**
196                                                 * Gestion du cas des fichiers .po
197                                                 */
198                                                else{
199                                                        lire_fichier($dest,$contenu_po);
200                                                        preg_match_all(',(\#\, php-format|\#\, fuzzy\, php-format).*msgstr "(.*)\n(\n|\Z),Uims', $contenu_po,$matches);
201                                                        $array_po = array();
202                                                        foreach($matches[0] as $match){
203                                                                $statut = "OK";
204                                                                preg_match(',msgstr \"(.*)\n(\n|\Z),Uims',$match,$matches_str);
205                                                                $str = rtrim(trim($matches_str[1]),'"');
206                                                                $str = trim(str_replace("\"\n\"","\n",$str));
207                                                                preg_match(',\#\| msgid \"(.*)\"\n,Uims',$match,$matches);
208                                                                if(!isset($matches[1]) || $matches[1] == ''){
209                                                                        preg_match(',\nmsgid \"(.*)\nmsgstr,Uims',$match,$matches_str_orig);
210                                                                        $str_orig = rtrim(trim($matches_str_orig[1]),'"');
211                                                                        $str_orig = trim(str_replace("\"\n\"","",$str_orig));
212                                                                        $matches[1] = sql_getfetsel('id','spip_tradlangs','id_tradlang_module='.intval($id_tradlang_module)." AND str=".sql_quote($str_orig));
213                                                                }
214                                                                if(preg_match(',\#\, fuzzy\, php-format,',$match,$matches_statut))
215                                                                        $statut = "MODIF";
216                                                                if($str != '')
217                                                                        $array_po[$matches[1]] = array('str'=>$str, 'statut'=>$statut);
218                                                        }
219                                                        $langues_base = sql_allfetsel('id,str,statut','spip_tradlangs','id_tradlang_module='.intval($id_tradlang_module).' AND lang='.sql_quote($lang));
220                                                        $modifs = array();
221                                                        foreach($langues_base as $strings_id => $strings){
222                                                                $str_lang[$strings['id']] = tradlang_utf8(preg_replace(',^(<(MODIF|NEW|PLUS_UTILISE)>)+,US', '', $str_lang[$strings['id']]));
223                                                                if(isset($array_po[$strings['id']]['str']) && strlen(trim($array_po[$strings['id']]['str'])) > 0){
224                                                                        if(($strings['str'] != $array_po[$strings['id']]['str']) OR ($strings['statut'] != $array_po[$strings['id']]['statut'])){
225                                                                                $modifs[$strings['id']] = array('orig'=>$strings['str'],'new'=>$array_po[$strings['id']]['str'],'statut'=>$array_po[$strings['id']]['statut']);
226                                                                                break;
227                                                                        }
228                                                                }
229                                                        }
230                                                }
231                                        }
232                                }
233                        }
234                }
235                if (!count($post) && !$erreurs['fichier_langue'])
236                        $erreurs['fichier_langue'] = _T('medias:erreur_indiquez_un_fichier');
237               
238                if(!count($modifs) && !$erreurs['fichier_langue'])
239                        $erreurs['fichier_langue'] = _T('tradlang:erreur_upload_aucune_modif');
240        }
241        return $erreurs;
242}
243
244function formulaires_tradlang_importer_langue_verifier_2_dist($id_tradlang_module,$lang) {
245        $module = sql_getfetsel('module','spip_tradlang_modules','id_tradlang_module='.intval($id_tradlang_module));
246        $fichier_php = $module.'_'.$lang.'.php';
247        $fichier_po = $module.'_'.$lang.'.po';
248        $dir_lang = sous_repertoire (_DIR_VAR, 'cache-tradlang');
249        $dest = $dir_lang.$fichier_php;
250        $destpo = $dir_lang.$fichier_po;
251        $modifs = $erreurs = array();
252        if(file_exists($dest)){
253                $memtrad = $GLOBALS['idx_lang'] = 'i18n_'.crc32($module).'_tmp';
254                include $dest;
255                $str_lang = $GLOBALS[$memtrad];  // on a vu certains fichiers faire des betises et modifier idx_lang
256
257                $langues_base = sql_allfetsel('*','spip_tradlangs','id_tradlang_module='.intval($id_tradlang_module).' AND lang='.sql_quote($lang));
258                $modifs = array();
259                foreach($langues_base as $strings_id => $strings){
260                        if(_request($strings['id']) == 'oui')
261                                $modifs[] = $strings['id'];
262                        unset($langues_base[$strings_id]);
263                }
264        }else if(file_exists($destpo)){
265                $langues_base = sql_allfetsel('id','spip_tradlangs','id_tradlang_module='.intval($id_tradlang_module).' AND lang='.sql_quote($lang));
266                $modifs = array();
267                foreach($langues_base as $strings_id => $strings){
268                        if(_request($strings['id']) == 'oui')
269                                $modifs[] = $strings['id'];
270                        unset($langues_base[$strings_id]);
271                }
272        }
273        else
274                $erreurs['message_erreur'] = "Le fichier temporaire $dest n'a pas été créé";
275        if(!count($modifs))
276                $erreurs['message_erreur'] = _T('tradlang:erreur_upload_choisir_une');
277        return $erreurs;
278}
279
280function formulaires_tradlang_importer_langue_traiter_dist($id_tradlang_module,$lang) {
281        include_spip('action/editer_tradlang');
282
283        $module = sql_getfetsel('module','spip_tradlang_modules','id_tradlang_module='.intval($id_tradlang_module));
284        $fichier_php = $module.'_'.$lang.'.php';
285        $fichier_po = $module.'_'.$lang.'.po';
286        $dir_lang = sous_repertoire (_DIR_VAR, 'cache-tradlang');
287        $count=0;
288        if(file_exists($dest = $dir_lang.$fichier_php)){
289                $memtrad = $GLOBALS['idx_lang'] = 'i18n_'.crc32($module).'_tmp';
290                include $dest;
291               
292                /**
293                 * Recuperation des statuts dans le fichier
294                 */
295                $contenu=file_get_contents($dest);
296                $contenu = str_replace("\t",'',$contenu);
297                $tab=preg_split("/\r\n|\n\r|;\n|\n\/\/|\(\n|\n\);\n|\'\,\n|\n[\s\t]*(\')|\/\/[\s\t][0-9A-Z]\n[\s\t](\')/", $contenu,'-1',PREG_SPLIT_NO_EMPTY);
298                $liste_trad=array();
299                reset($tab);
300               
301                while (list(,$ligne) = each($tab)){
302                        $ligne = str_replace("\'",'',$ligne);
303                        if (strlen($ligne)>0) {
304                                if (preg_match("/\'(.*?)\'[\s\t]*=>[\s\t]*\'(.*?)\'[\s\t]*,{0,1}[\s\t]*(#.*)?/ms",$ligne,$matches)) {
305                                        if (isset($matches[1]) and isset($matches[3]) and strlen(trim($matches[3]))>0 ) {
306                                                list(,$comm)=explode("#",$matches[3]);
307                                                if(in_array(trim($comm),array('NEW','MODIF','RELIRE')))
308                                                        $liste_trad[$matches[1]]=trim($comm);
309                                        }
310                                }
311                        }
312                }
313                reset($liste_trad);
314                $keys_liste_trad = array_keys($liste_trad);
315               
316                $str_lang = $GLOBALS[$memtrad];  // on a vu certains fichiers faire des betises et modifier idx_lang
317
318                if (is_null($str_lang)) {
319                        spip_log("Erreur, fichier $module mal forme",'tradlang');
320                }
321               
322                $langues_base = sql_allfetsel('*','spip_tradlangs','module='.sql_quote($module).' AND lang='.sql_quote($lang));
323                $modifs = array();
324                foreach($langues_base as $strings_id => $strings){
325                        if(_request($strings['id']) == 'oui'){
326                                $set_new = tradlang_utf8(preg_replace(',^(<(MODIF|NEW|PLUS_UTILISE)>)+,US', '', $str_lang[$strings['id']]));
327                                $set = array('str'=>$set_new,'statut'=> (in_array($strings['id'],$keys_liste_trad) ? $liste_trad[$strings['id']] : 'OK'));
328                                tradlang_set($strings['id_tradlang'],$set);
329                                $count++;
330                                unset($langues_base[$strings_id]);
331                        }
332                }
333                spip_unlink($dest);
334        }
335        else if(file_exists($dest = $dir_lang.$fichier_po)){
336                lire_fichier($dest,$contenu_po);
337                preg_match_all(',(\#\, php-format|\#\, fuzzy\, php-format).*msgstr "(.*)\n(\n|\Z),Uims', $contenu_po,$matches);
338                $array_po = array();
339                foreach($matches[0] as $match){
340                        $statut = "OK";
341                        preg_match(',msgstr \"(.*)\n(\n|\Z),Uims',$match,$matches_str);
342                        $str = rtrim(trim($matches_str[1]),'"');
343                        $str = trim(str_replace("\"\n\"","\n",$str));
344                        preg_match(',\#\| msgid \"(.*)\"\n,Uims',$match,$matches);
345                        if(!isset($matches[1]) || $matches[1] == ''){
346                                preg_match(',\nmsgid \"(.*)\nmsgstr,Uims',$match,$matches_str_orig);
347                                $str_orig = rtrim(trim($matches_str_orig[1]),'"');
348                                $str_orig = trim(str_replace("\"\n\"","",$str_orig));
349                                $matches[1] = sql_getfetsel('id','spip_tradlangs','id_tradlang_module='.intval($id_tradlang_module)." AND str=".sql_quote($str_orig));
350                        }
351                        if(preg_match(',\#\, fuzzy\, php-format,',$match,$matches_statut))
352                                $statut = "MODIF";
353                        if($str != '')
354                                $array_po[$matches[1]] = array('str'=>$str, 'statut'=>$statut);
355                }
356
357                $langues_base = sql_allfetsel('id_tradlang,id,str,statut','spip_tradlangs','module='.sql_quote($module).' AND lang='.sql_quote($lang));
358                $modifs_po = array();
359                foreach($langues_base as $strings_id => $strings){
360                        if(_request($strings['id']) == 'oui'){
361                                $set=$instit=null;
362                                if(isset($array_po[$strings['id']]['str']) && strlen(trim($array_po[$strings['id']]['str'])) > 0){
363                                        $set = array('str'=>$array_po[$strings['id']]['str']);
364                                        tradlang_set($strings['id_tradlang'],$set);
365                                        $instit = array('statut'=>$array_po[$strings['id']]['statut']);
366                                        instituer_tradlang($strings['id_tradlang'],$instit);
367                                        $count++;
368                                        unset($langues_base[$strings_id]);
369                                }
370                        }
371                }
372                spip_unlink($dest);
373        }
374        $res['editable'] = false;
375        if($count > 1)
376                $res['message_ok'] = _T('tradlang:message_upload_nb_modifies',array('nb'=>$count));
377        else
378                $res['message_ok'] = _T('tradlang:message_upload_nb_modifies',array('nb'=>$count));
379        return $res;
380}
381?>
Note: See TracBrowser for help on using the repository browser.