source: trunk/Modules/Export/Export.php@ 664

Last change on this file since 664 was 664, checked in by maron, 11 years ago
  • Fixed: crash game by bad export of lua
File size: 24.4 KB
Line 
1<?php
2
3class Export extends Model
4{
5 var $Id;
6 var $AnoNe = array('Ne', 'Ano');
7 var $WhereLang;
8 var $WhereUsers;
9 var $SelectedUsers;
10 var $UserNames;
11 var $ClientVersion;
12 var $OrderByUserList;
13 var $TempDir;
14 var $SourceDir;
15
16 function Init()
17 {
18 $this->TempDir = dirname(__FILE__).'/../../'.$this->Config['Web']['TempFolder'].'Export/'.$this->Id.'/';
19 if(!file_exists($this->TempDir)) mkdir($this->TempDir, 0777, true);
20 $this->TempDirRelative = $this->Config['Web']['TempFolder'].'Export/'.$this->Id.'/';
21 $this->SourceDir = dirname(__FILE__).'/../../'.$this->Config['Web']['SourceFolder'];
22 $this->SourceDirRelative = $this->Config['Web']['SourceFolder'];
23 if(!file_exists($this->SourceDir)) mkdir($this->SourceDir, 0777, true);
24 $this->SaveAllUsers();
25 }
26
27 function SaveAllUsers() {
28 $DbResult = $this->System->Database->query('SELECT * FROM `Export` WHERE `Id`='.$this->Id);
29 $Export = $DbResult->fetch_assoc();
30 if ($Export['AllUsers']) {
31 $DbResult2 = $this->System->Database->query('SELECT ID FROM `User` WHERE `ID` NOT IN(SELECT `User` FROM `ExportUser` WHERE `Export`='.$this->Id.')');
32 while($UserLine = $DbResult2->fetch_assoc())
33 {
34 $Condition = ' WHERE `Export`='.$this->Id.' AND `User`='.$UserLine['ID'];
35 $DbResult = $this->System->Database->query('SELECT * FROM `ExportUser` '.$Condition); //,MAX(`Sequence`) as MaxSequence
36 if($DbResult->num_rows > 0)
37 {
38 // $this->System->Database->query('UPDATE `ExportUser` SET `Sequence`='.$Value.$Condition);
39 } else
40 {
41 $this->System->Database->query('INSERT INTO `ExportUser` (`Export`, `User`, `Sequence`) VALUES ('.$this->Id.', '.$UserLine['ID'].', 0)');
42 }
43 }
44
45 $this->System->Database->query('SET @I = 0');
46 $this->System->Database->query('UPDATE `ExportUser` SET `Sequence` = (@I := @I + 1) WHERE `Export`='.$this->Id.' ORDER BY `Sequence`;');
47 }
48 }
49
50 function LoadFilters()
51 {
52 $DbResult = $this->Database->query('SELECT * FROM `Export` WHERE `Id`='.$this->Id);
53 if($DbResult->num_rows == 0) throw new Exception('Export '.$this->Id.' neexistuje');
54 $this->Export = $DbResult->fetch_assoc();
55
56 // Filter selected users
57 $this->UserNames = '';
58 $DbResult = $this->Database->query('SELECT `ExportUser`.*, `User`.`Name`, `User`.`ID` FROM `ExportUser` '.
59 'LEFT JOIN `User` ON `User`.`ID`=`ExportUser`.`User` '.
60 'WHERE `ExportUser`.`Export`='.$this->Id.' ORDER BY `ExportUser`.`Sequence`');
61 while($UserLine = $DbResult->fetch_assoc())
62 {
63 $this->UserNames .= ', '.$UserLine['Name'];
64 }
65 $this->UserNames = substr($this->UserNames, 2);
66
67 if($this->Export['ClientVersion'] != '')
68 {
69 $DbResult = $this->Database->query('SELECT * FROM `ClientVersion` WHERE `Id`='.$this->Export['ClientVersion']);
70 $this->ClientVersion = $DbResult->fetch_assoc();
71 } else $this->ClientVersion = '';
72 }
73
74 function BuildQuery($Group, $Columns = '', $Version = '')
75 {
76 global $TranslationTree;
77
78 if ($Version <> '')
79 $ExportVersion = $Version;
80 else
81 $ExportVersion = $this->ClientVersion['BuildNumber'];
82
83 $Query = 'SELECT * FROM (SELECT `T`.*, '.$Columns.'`User`.`Name` AS `UserName` FROM `'.$Group['TablePrefix'].'` AS `T`'.
84 ' JOIN `ExportUser` ON (`ExportUser`.`User`=`T`.`User`) AND (`ExportUser`.`Export`='.$this->Id.') '.
85 ' JOIN `User` ON `User`.`ID`=`T`.`User`'.
86 ' JOIN `ExportLanguage` ON (`ExportLanguage`.`Export`='.$this->Id.')'.
87 ' WHERE (`Complete` = 1) AND (`VersionStart` <= '.$ExportVersion.') AND (`VersionEnd` >= '.$ExportVersion.')'.
88 ' ORDER BY `ExportLanguage`.`Sequence`, `ExportUser`.`Sequence`) AS `TT` GROUP BY `TT`.`Entry`';
89
90 // Build columns for english texts
91 $OriginalColumns = '';
92 foreach($TranslationTree[$Group['Id']]['Items'] as $Column)
93 $OriginalColumns .= ' `T3`.`'.$Column['Column'].'` AS `En'.$Column['Column'].'`, ';
94 $OriginalColumns = substr($OriginalColumns, 0, -2);
95
96 // Expand query for loading english texts
97 $Query = 'SELECT `T4`.*, '.$OriginalColumns.' FROM ('.$Query.') AS `T4` '.
98 ' LEFT JOIN `'.$Group['TablePrefix'].'` AS `T3` ON (`T3`.`Entry` = `T4`.`Entry`) '.
99 'AND (`T3`.`Language` = '.$this->System->Config['OriginalLanguage'].') AND '.
100 '(`T3`.`VersionStart` = `T4`.`VersionStart`) AND (`T3`.`VersionEnd` = `T4`.`VersionEnd`)';
101
102 return($Query);
103 }
104
105 function ExportToMangosSQL()
106 {
107 global $TranslationTree;
108
109 $this->LoadFilters();
110
111 $Buffer =
112 "-- Generováno projektem wowpreklad.zdechov.net\n".
113 "-- ===========================================\n".
114 "--\n".
115 "-- Web projektu: ".$this->Config['Web']['Host'].$this->System->Link('/')."\n".
116 "-- Datum exportu: ".date("j.n.Y H:i:s")."\n".
117 "-- Znaková sada: ".$this->Config['Database']['Charset']." / ".$this->Config['Web']['Charset']."\n".
118 "-- Diakritika: ".$this->AnoNe[$this->Export['WithDiacritic']]."\n".
119 "-- Vygeneroval uživatel: ".$this->System->User->Name."\n".
120 "-- Vzato od uživatelů: ".$this->UserNames."\n".
121 "-- Generované tabulky: ";
122
123 $DbResult = $this->Database->query('SELECT `Group`.* FROM `ExportGroup` '.
124 'JOIN `Group` ON `Group`.`Id` = `ExportGroup`.`Group` WHERE `ExportGroup`.`Export`='.$this->Id);
125 while($Group = $DbResult->fetch_assoc())
126 {
127 $Buffer .= $Group['TablePrefix'].', ';
128 }
129 $Buffer .= "\n\n";
130
131 $DbResult = $this->Database->query('SELECT `Group`.* FROM `ExportGroup` '.
132 'JOIN `Group` ON `Group`.`Id` = `ExportGroup`.`Group` WHERE `ExportGroup`.`Export`='.$this->Id);
133 while($Group = $DbResult->fetch_assoc())
134 {
135 if($Group['MangosTable'] != '')
136 {
137 $Buffer .= "\n\n-- ".$Group['Name']."\n\n";
138 $DbResult2 = $this->Database->query($this->BuildQuery($Group));
139 if($DbResult2->num_rows > 0)
140 while($Line = $DbResult2->fetch_array())
141 {
142 $Values = '';
143 foreach($TranslationTree[$Group['Id']]['Items'] as $GroupItem)
144 if($GroupItem['Column'] != $Group['PrimaryKeyItem']) // Do not update primary key
145 {
146 if($GroupItem['MangosColumn'] == '') $GroupItem['MangosColumn'] = $GroupItem['Column'];
147 $Values .= ', `'.$GroupItem['MangosColumn'].'`="'.addslashes($Line[$GroupItem['Column']]).'"';
148 }
149 $Values = substr($Values, 2);
150
151 // Get multicolumn index
152 $ColumnItems = explode(',', $Group['MangosTableIndex']);
153 if(count($ColumnItems) > 1)
154 {
155 $Where = 'CONCAT(';
156 foreach($ColumnItems as $ColumnItem)
157 $Where .= '`'.$ColumnItem.'`, "_", ';
158 $Where = substr($Where, 0, -7).')';
159 } else $Where = '`'.$Group['MangosTableIndex'].'`';
160 $Where .= ' = "'.$Line[$Group['PrimaryKeyItem']].'";';
161
162 $Line = 'UPDATE `'.$Group['MangosTable'].'` SET '.$Values.' WHERE '.$Where;
163 $Line = str_replace("\n", '\n', $Line);
164 $Line = str_replace("\r", '', $Line);
165 $Buffer .= $Line."\n";
166 }
167 }
168 }
169 if($this->Export['WithDiacritic'] != 1) $Buffer = utf2ascii($Buffer);
170 return($Buffer);
171 }
172
173 function ExportToAoWoWSQL()
174 {
175 global $TranslationTree, $AoWoWconf;
176
177 //require_once('../aowow/configs/config.php');
178
179 $Buffer = $this->ExportToMangosSQL();
180
181 /*
182 // Data to aowow
183 $Database2 = new mysqli($this->Config['Database']['Host'], $this->Config['Database']['User'], $this->Config['Database']['Password'], $this->Config['Database']['Database']);
184 $Database2->query('SET NAMES '.$this->Config['Database']['Charset']);
185 $Database2->select_db($AoWoWconf['mangos']['db']);
186 $AoWoWTables = array(
187 'aowow_resistances' => 'Id',
188 'aowow_spelldispeltype' => 'Id',
189 'aowow_skill' => 'skillID',
190 );
191 foreach($AoWoWTables as $AoWoWTable => $IndexColum)
192 {
193 $Buffer .= '--'.$AoWoWTable.', ';
194 $Buffer .= "\n\n";
195 $Query = 'SELECT `name`,`'.$IndexColum.'` FROM `'.$AoWoWTable.'`';
196 $DbResult = $Database2->query($Query);
197 while($Line = $DbResult->fetch_assoc())
198 {
199 $Ori_text = $Line['name'];
200 $DbResult2 = $Database2->query('SELECT `Text` AS `En`,
201 (SELECT `Text` FROM `'.$this->System->Config['Database']['Database'].'`.`TextGlobalString` AS `TableTran`
202 WHERE `TableEn`.`Entry` = `TableTran`.`Entry` AND (`Complete` = 1) AND '.$this->WhereLang.' AND '.$this->WhereUsers.$this->OrderByUserList.' LIMIT 1) AS `Tran`
203 FROM `'.$this->System->Config['Database']['Database'].'`.`TextGlobalString` AS `TableEn` WHERE
204 `Text` = "'.addslashes($Ori_text).'" LIMIT 1');
205 $Tran = $DbResult2->fetch_assoc();
206 //echo ($Line['name'].'='.$Tran['tran']);
207 if($Tran['Tran'] == '')
208 {
209 $DbResult2 = $Database2->query('SELECT `OptionText` AS `En`,
210 (SELECT `OptionText` FROM `'.$this->Config['Database']['Database'].'`.`TextNPCOption` AS `TableTran`
211 WHERE `TableEn`.`Entry` = `TableTran`.`Entry` AND (`Complete` = 1) AND '.$this->WhereLang.'
212 AND '.$this->WhereUsers.$this->OrderByUserList.' LIMIT 1) AS `Tran`
213 FROM `'.$this->Config['Database']['Database'].'`.`TextNPCOption` AS `TableEn` WHERE
214 `OptionText` = "'.addslashes($Ori_text).'" LIMIT 1');
215 $Tran = $DbResult2->fetch_assoc();
216 }
217
218 if($Tran['Tran'] <> '')
219 $Buffer .= 'UPDATE `'.$AoWoWTable.'` SET `name` = "'.addslashes($Tran['Tran']).'" WHERE '.$IndexColum.' = '.$Line[$IndexColum].' ;'."\n";
220 }
221 $Buffer .= "\n\n";
222 }
223 */
224 if($this->Export['WithDiacritic'] != 1) $Buffer = utf2ascii($Buffer);
225 return($Buffer);
226 }
227
228
229
230 function HaveVarible($String1, $String2, $StartChar = '$')
231 {
232 //Export only if translate have same varible %
233
234 if (strpos($String1,$StartChar) !== false) {
235
236 while ( strpos($String1,$StartChar) !== false) {
237 $pos = strpos($String1,$StartChar);
238 $String1 = substr($String1,$pos+1);
239 $varible = $String1;
240 if (strpos($varible,' ')) $varible = substr($varible,0,strpos($varible,' '));
241 if (strpos($varible,'.')) $varible = substr($varible,0,strpos($varible,'.'));
242 if (strpos($varible,',')) $varible = substr($varible,0,strpos($varible,','));
243 if (strpos($varible,'%')) $varible = substr($varible,0,strpos($varible,'%'));
244 if (strpos($varible,chr(10))) $varible = substr($varible,0,strpos($varible,chr(10)));
245 // echo $pos.'-'.$varible.'-'.$String1.'-' .$String2.'
246 // ';
247
248 if (false === strpos($String2,$varible)) {
249 // echo $varible;
250 return(false);
251 }
252 }
253 }
254 return (true);
255 }
256
257 function ExportToDBC()
258 {
259 global $TranslationTree;
260
261 $this->LoadFilters();
262
263 $DbResult = $this->Database->query('SELECT `Group`.* FROM `ExportGroup` '.
264 'JOIN `Group` ON `Group`.`Id` = `ExportGroup`.`Group` '.
265 'WHERE `ExportGroup`.`Export`='.$this->Id.' AND `Group`.`DBCFileName` != ""');
266 $Output = 'Počet generovaných skupin: '.$DbResult->num_rows."\n";
267 while($Group = $DbResult->fetch_assoc())
268 {
269 $Output .= $Group['Name'].', ';
270 if(file_exists($this->SourceDir.$this->ClientVersion['Version'].'/dbc/'.$Group['DBCFileName'].'.dbc'))
271 {
272 // Load string column index list
273 $DbResult2 = $this->Database->query('SELECT * FROM `GroupItem` '.
274 'JOIN `GroupItemDBC` ON `GroupItem`.`Id` = `GroupItemDBC`.`GroupItem` AND `GroupItemDBC`.`ClientVersion` = '.$this->ClientVersion['Id'].' WHERE `GroupItem`.`Group` = '.$Group['Id']);
275 $ColumnIndexes = array();
276 $ColumnFormat = array();
277 while($DbRow = $DbResult2->fetch_assoc())
278 {
279 $ColumnFormat[$DbRow['ColumnIndex']] = FORMAT_STRING;
280 $ColumnIndexes[$DbRow['GroupItem']] = $DbRow['ColumnIndex'];
281 }
282
283 // Load all data into lookup table
284 $LookupTable = array();
285 $DbResult2 = $this->Database->query($this->BuildQuery($Group));
286 while($DbRow = $DbResult2->fetch_assoc()) {
287 //Export only if translate have same varible %
288 $CanExport = true;
289 foreach($TranslationTree[$Group['Id']]['Items'] as $Column) {
290 $DbRow[$Column['Column']] = str_replace ( '$ ','$',$DbRow[$Column['Column']]);
291 if (!$this->HaveVarible($DbRow['En'.$Column['Column']],$DbRow[$Column['Column']])) {
292 $CanExport = false;
293 $Output .= ', NE='.$DbRow['ID'];
294 }
295 if (!$this->HaveVarible($DbRow[$Column['Column']],$DbRow['En'.$Column['Column']])) {
296 $CanExport = false;
297 $Output .= ', NE='.$DbRow['ID'];
298 }
299 }
300
301 if ($CanExport)
302 $LookupTable[$DbRow[$Group['PrimaryKeyItem']]] = $DbRow;
303
304 }
305
306 // Open original DBC file
307 $SourceDBCFile = new DBCFile();
308 $SourceDBCFile->OpenFile($this->SourceDir.$this->ClientVersion['Version'].'/dbc/'.$Group['DBCFileName'].'.dbc', $ColumnFormat);
309
310 // Create new DBC file
311 if(!file_exists($this->TempDir.'dbc/')) mkdir ($this->TempDir.'dbc/', 0777, true);
312 $NewDBCFile = new DBCFile();
313 $NewDBCFile->CreateFile($this->TempDir.'dbc/'.$Group['DBCFileName'].'.dbc', $ColumnFormat);
314 $NewDBCFile->SetRecordCount($SourceDBCFile->GetRecordCount());
315 $NewDBCFile->SetFieldCount($SourceDBCFile->GetFieldCount());
316 $NewDBCFile->Commit();
317
318 // Replace translated strings
319 $OldProgress = -1;
320 $Output .= "\n\r";
321 $RowCount = $SourceDBCFile->GetRecordCount();
322 $FieldCount = $SourceDBCFile->GetFieldCount();
323 for($Row = 0; $Row < $RowCount; $Row++)
324 {
325 $Line = $SourceDBCFile->GetLine($Row);
326
327 // Get multicolumn index value
328 $PrimaryKeyItem = '';
329 $ColumnItems = explode(',', $Group['DBCIndex']);
330 if(count($ColumnItems) > 1)
331 {
332 foreach($ColumnItems as $ColumnItem)
333 $PrimaryKeyItem .= $Line[$ColumnItem].'_';
334 $PrimaryKeyItem = substr($PrimaryKeyItem, 0, -1);
335 } else $PrimaryKeyItem = $Line[$Group['DBCIndex']];
336
337 if(array_key_exists($PrimaryKeyItem, $LookupTable))
338 {
339 // Replace text columns
340 $LookupTableItem = $LookupTable[$PrimaryKeyItem];
341 foreach($TranslationTree[$Group['Id']]['Items'] as $GroupItem)
342 {
343 if(array_key_exists($GroupItem['Id'], $ColumnIndexes))
344 $Line[$ColumnIndexes[$GroupItem['Id']]] = $LookupTableItem[$GroupItem['Column']];
345 }
346 }
347 $NewDBCFile->SetLine($Row, $Line);
348
349 // Show completion progress
350 $Progress = round($Row / $RowCount * 100);
351 if($Progress != $OldProgress)
352 {
353 $Output .= $Progress."%\r";
354 echo($Output);
355 $Output = '';
356 $OldProgress = $Progress;
357 }
358 }
359 $NewDBCFile->Commit();
360 } else $Output .= ShowMessage('Zdrojový soubor '.$this->SourceDirRelative.$this->ClientVersion['Version'].'/dbc/'.$Group['DBCFileName'].'.dbc'.' nenalezen.'."\n", MESSAGE_CRITICAL);
361 }
362 $Output .= 'Hotovo <br />';
363 return($Output);
364 }
365
366 function ExportToLua()
367 {
368 global $TranslationTree;
369
370 $this->LoadFilters();
371
372 $Output = '';
373 if(!file_exists($this->TempDir.'lua/')) mkdir($this->TempDir.'lua/', 0777, true);
374 $DbResult = $this->Database->query('SELECT `Group`.* FROM `ExportGroup` JOIN `Group` ON `Group`.`Id` = `ExportGroup`.`Group` WHERE `ExportGroup`.`Export`='.$this->Id.' AND `Group`.`LuaFileName` != ""');
375 while($Group = $DbResult->fetch_assoc())
376 {
377 $Output .= $Group['Name'].'... ';
378 $File = new FileStream();
379 $File->OpenFile($this->SourceDir.$this->ClientVersion['Version'].'/lua/'.$Group['LuaFileName'].'.lua');
380 $File2 = new FileStream();
381 $File2->CreateFile($this->TempDir.'lua/'.$Group['LuaFileName'].'.lua');
382
383 $LookupTable = array();
384 $DbResult2 = $this->Database->query($this->BuildQuery($Group));
385 while($DbRow = $DbResult2->fetch_assoc()) {
386 $CanExport = true;
387 foreach($TranslationTree[$Group['Id']]['Items'] as $Column) {
388 // if (strpos($DbRow[$Column['Column']],'\\'))
389 // $CanExport = false;
390 // $DbRow[$Column['Column']] = str_replace ( '$ ','$',$DbRow[$Column['Column']]);
391 // echo $DbRow[$Column['Column']].' - '.$DbRow['En'.$Column['Column']].'
392//';
393 if (!$this->HaveVarible($DbRow['En'.$Column['Column']],$DbRow[$Column['Column']])) {
394 if ($CanExport) $Output .= ', NE='.$DbRow['ID'];
395 $CanExport = false;
396 }
397 if (!$this->HaveVarible($DbRow[$Column['Column']],$DbRow['En'.$Column['Column']])) {
398 if ($CanExport) $Output .= ', NE='.$DbRow['ID'];
399 $CanExport = false;
400 }
401 if (!$this->HaveVarible($DbRow['En'.$Column['Column']],$DbRow[$Column['Column']],'%')) {
402 if ($CanExport) $Output .= ', NE='.$DbRow['ID'];
403 $CanExport = false;
404 }
405 if (!$this->HaveVarible($DbRow[$Column['Column']],$DbRow['En'.$Column['Column']],'%')) {
406 if ($CanExport) $Output .= ', NE='.$DbRow['ID'];
407 $CanExport = false;
408 }
409 if (!$this->HaveVarible($DbRow[$Column['Column']],$DbRow['En'.$Column['Column']],'\\')) {
410 if ($CanExport) $Output .= ', NE='.$DbRow['ID'];
411 $CanExport = false;
412 }
413 if (!$this->HaveVarible($DbRow['En'.$Column['Column']],$DbRow[$Column['Column']],'\\')) {
414 if ($CanExport) $Output .= ', NE='.$DbRow['ID'];
415 $CanExport = false;
416 }
417 if (!$this->HaveVarible($DbRow[$Column['Column']],$DbRow['En'.$Column['Column']],'|')) {
418 if ($CanExport) $Output .= ', NE='.$DbRow['ID'];
419 $CanExport = false;
420 }
421 if (!$this->HaveVarible($DbRow['En'.$Column['Column']],$DbRow[$Column['Column']],'|')) {
422 if ($CanExport) $Output .= ', NE='.$DbRow['ID'];
423 $CanExport = false;
424 }
425 if (!$this->HaveVarible($DbRow[$Column['Column']],$DbRow['En'.$Column['Column']],chr(10))) {
426 if ($CanExport) $Output .= ', NE='.$DbRow['ID'];
427 $CanExport = false;
428 }
429 if (!$this->HaveVarible($DbRow['En'.$Column['Column']],$DbRow[$Column['Column']],chr(10))) {
430 if ($CanExport) $Output .= ', NE='.$DbRow['ID'];
431 $CanExport = false;
432 }
433 }
434
435 if ($CanExport)
436 $LookupTable[$DbRow['ShortCut']] = $DbRow;
437 }
438
439 while(!$File->EOF())
440 {
441 $Line = $File->ReadLine();
442 if(strpos($Line, '=') !== false)
443 {
444 $LineParts = explode('=', $Line, 2);
445 $Value['ShortCut'] = trim($LineParts[0]);
446 $Line = trim($LineParts[1]);
447
448 if($Line[0] == '"')
449 {
450 // Quoted string value
451 $Line = substr($Line, 1); // Skip start qoute
452 $TempLine = str_replace('\"', ' ', $Line); // Temporary remove slashed quotes
453 if (strpos($TempLine, '"')) {
454 $Value['Text'] = substr($Line, 0, strpos($TempLine, '"'));
455 } else {
456 $Value['Text'] = substr($Line, 0, strpos($Line, '"'));
457 }
458// $Value['Text'] = str_replace('\n', "\n", $Value['Text']);
459// $Value['Text'] = addslashes(stripslashes($Value['Text']));
460 $Line = trim(substr($Line, strpos($TempLine, '"') + 1)); // Skip closing quote and semicolon {
461 } else
462 {
463 // Nonstring value
464 $Value['Text'] = substr($Line, 0, strpos($Line, ';'));
465 }
466 $Line = substr($Line, strpos($Line, ';') + 1);
467 $Value['Comment'] = addslashes(stripslashes(substr($Line, 3))); // Skip " --"
468
469 if(array_key_exists($Value['ShortCut'], $LookupTable))
470 {
471 $DbRow = $LookupTable[$Value['ShortCut']];
472 $Value['Text'] = $DbRow['Text'];
473 //addslashes
474 $Value['Text'] = str_replace('"', '\"', $Value['Text']);
475 // Escape new line control characters
476 $Value['Text'] = str_replace("\n", '\n', $Value['Text']);
477 $Value['Text'] = str_replace("\r", '', $Value['Text']);
478 $Value['Comment'] = $DbRow['Comment'];
479 // Only one line comments allowed
480 $Value['Comment'] = str_replace("\n", ' ', $Value['Comment']);
481 $Value['Comment'] = str_replace("\r", '', $Value['Comment']);
482 //echo('.');
483 }
484 $NewLine = $Value['ShortCut'].' = "'.$Value['Text'].'";';
485 //if($Value['Comment'] != '') $NewLine .= ' -- '.$Value['Comment'];
486 $NewLine .= "\r\n";
487 $File2->WriteLine($NewLine);
488 } else $File2->WriteLine($Line);
489 }
490 $Output .= 'Hotovo <br/>';
491 }
492 return($Output);
493 }
494
495 function ExportToXML()
496 {
497 global $TranslationTree;
498
499 $this->LoadFilters();
500
501 $Buffer = '<?xml version="1.0" encoding="utf-8"?>'."\n".
502 "<document>\n".
503 " <meta>\n".
504 " <projecturl>".$this->Config['Web']['Host'].$this->System->Link('/')."</projecturl>\n".
505 " <time>".date('r')."</time>\n".
506 " <diacritics mode=".'"'.$this->Export['WithDiacritic'].'"'." />\n".
507 " <author>".$this->System->User->Name."</author>\n".
508 " <contributors>\n";
509 foreach(explode(',', $this->UserNames) as $UserName)
510 $Buffer .= " <user>".$UserName."</user>\n";
511 $Buffer .=
512 " </contributors>\n".
513 " </meta>\n".
514 " <translation>\n";
515
516 $DbResult = $this->Database->query('SELECT `Group`.* FROM `ExportGroup` '.
517 'JOIN `Group` ON `Group`.`Id` = `ExportGroup`.`Group` WHERE `ExportGroup`.`Export`='.$this->Id);
518 while($Group = $DbResult->fetch_assoc())
519 {
520 if($Group['MangosTable'] == '')
521 {
522 $Group['MangosTable'] = $Group['TablePrefix'];
523 $Group['MangosTableIndex'] = 'entry';
524 }
525 $Buffer .= ' <group id="'.$Group['Id'].'" name="'.$Group['TablePrefix'].'">'."\n";
526 $DbResult2 = $this->Database->query($this->BuildQuery($Group));
527 while($Line = $DbResult2->fetch_assoc())
528 {
529 $Buffer .= ' <item id="'.$Line['Entry'].'" user="'.$Line['UserName'].'">'."\n";
530 $Values = '';
531 foreach($TranslationTree[$Group['Id']]['Items'] as $GroupItem)
532 {
533 if($GroupItem['MangosColumn'] == '') $GroupItem['MangosColumn'] = $GroupItem['Column'];
534 if($Line[$GroupItem['Column']] != '')
535 $Buffer .= ' <text index="'.$GroupItem['Id'].'" name="'.
536 $GroupItem['Column'].'">'.addslashes($Line[$GroupItem['Column']]).'</text>'."\n";
537 }
538 $Buffer .= " </item>\n";
539 }
540 $Buffer .= " </group>\n";
541 }
542 if($this->Export['WithDiacritic'] != 1) $Buffer = utf2ascii($Buffer);
543 $Buffer .= " </translation>\n".
544 "</document>";
545 return($Buffer);
546 }
547}
548
549include_once(dirname(__FILE__).'/Page.php');
550include_once(dirname(__FILE__).'/ExportOutput.php');
551
552class ModuleExport extends AppModule
553{
554 function __construct($System)
555 {
556 parent::__construct($System);
557 $this->Name = 'Export';
558 $this->Version = '1.0';
559 $this->Creator = 'Chronos';
560 $this->License = 'GNU/GPL';
561 $this->Description = 'Allow parametric export of translated texts to various supported output formats';
562 $this->Dependencies = array();
563 }
564
565 function Start()
566 {
567 $this->System->RegisterPage('export', 'PageExport');
568 $this->System->RegisterMenuItem(array(
569 'Title' => 'Exporty',
570 'Hint' => 'Zde si můžete stáhnout přeložené texty',
571 'Link' => $this->System->Link('/export/'),
572 'Permission' => LICENCE_ANONYMOUS,
573 'Icon' => '',
574 ), 2);
575 }
576}
577
Note: See TracBrowser for help on using the repository browser.