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

Last change on this file since 732 was 732, checked in by maron, 11 years ago
  • Fixed: Column database change to double
  • Added: smooth progress bar in export
File size: 30.3 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 }
25
26 function SaveAllUsers() {
27 $DbResult = $this->System->Database->query('SELECT * FROM `Export` WHERE `Id`='.$this->Id);
28 $Export = $DbResult->fetch_assoc();
29 if ($Export['AllUsers']) {
30 $DbResult2 = $this->System->Database->query('SELECT ID FROM `User` WHERE `ID` NOT IN(SELECT `User` FROM `ExportUser` WHERE `Export`='.$this->Id.')');
31 while($UserLine = $DbResult2->fetch_assoc())
32 {
33 $Condition = ' WHERE `Export`='.$this->Id.' AND `User`='.$UserLine['ID'];
34 $DbResult = $this->System->Database->query('SELECT * FROM `ExportUser` '.$Condition); //,MAX(`Sequence`) as MaxSequence
35 if($DbResult->num_rows > 0)
36 {
37 // $this->System->Database->query('UPDATE `ExportUser` SET `Sequence`='.$Value.$Condition);
38 } else
39 {
40 $this->System->Database->query('INSERT INTO `ExportUser` (`Export`, `User`, `Sequence`) VALUES ('.$this->Id.', '.$UserLine['ID'].', 0)');
41 }
42 }
43
44 $this->System->Database->query('SET @I = 0');
45 $this->System->Database->query('UPDATE `ExportUser` SET `Sequence` = (@I := @I + 1) WHERE `Export`='.$this->Id.' ORDER BY `Sequence`;');
46 }
47 }
48
49 function LoadFilters()
50 {
51 $DbResult = $this->Database->query('SELECT * FROM `Export` WHERE `Id`='.$this->Id);
52 if($DbResult->num_rows == 0) throw new Exception('Export '.$this->Id.' neexistuje');
53 $this->Export = $DbResult->fetch_assoc();
54
55 // Filter selected users
56 $this->UserNames = '';
57 $DbResult = $this->Database->query('SELECT `ExportUser`.*, `User`.`Name`, `User`.`ID` FROM `ExportUser` '.
58 'LEFT JOIN `User` ON `User`.`ID`=`ExportUser`.`User` '.
59 'WHERE `ExportUser`.`Export`='.$this->Id.' ORDER BY `ExportUser`.`Sequence`');
60 while($UserLine = $DbResult->fetch_assoc())
61 {
62 $this->UserNames .= ', '.$UserLine['Name'];
63 }
64 $this->UserNames = substr($this->UserNames, 2);
65
66 if($this->Export['ClientVersion'] != '')
67 {
68 $DbResult = $this->Database->query('SELECT * FROM `ClientVersion` WHERE `Id`='.$this->Export['ClientVersion']);
69 $this->ClientVersion = $DbResult->fetch_assoc();
70 } else $this->ClientVersion = '';
71 }
72
73 function BuildQuery($Group, $Version = '')
74 {
75 global $TranslationTree;
76 $this->SaveAllUsers();
77
78 if ($Version <> '')
79 $ExportVersion = $Version;
80 else
81 $ExportVersion = $this->ClientVersion['BuildNumber'];
82
83 $DbResultItem = $this->System->Database->query('SELECT * FROM `ExportGroupItem` WHERE `Export`='.$this->Id);
84 while($GroupItem = $DbResultItem->fetch_assoc())
85 {
86 $GroupItems[$GroupItem['GroupItem']] = 1;
87 }
88 // Build selected columns
89 $Columns = '';
90 foreach($TranslationTree[$Group['Id']]['Items'] as $Column) {
91 if (!isset($GroupItems[$Column['Id']])) $Columns .= ' `T`.`'.$Column['Column'].'` AS `'.$Column['Column'].'`, ';
92 }
93 // $Columns = substr($Columns, 0, -2);
94
95
96 $Query = 'SELECT * FROM (SELECT '.$Columns.' T.`ID`,T.`Language`,T.`User`,T.`Entry`,T.`VersionEnd`,T.`VersionStart`, `User`.`Name` AS `UserName` FROM `'.$Group['TablePrefix'].'` AS `T`'.
97 ' JOIN `ExportUser` ON (`ExportUser`.`User`=`T`.`User`) AND (`ExportUser`.`Export`='.$this->Id.') '.
98 ' JOIN `User` ON `User`.`ID`=`T`.`User`'.
99 ' JOIN `ExportLanguage` ON (`ExportLanguage`.`Export`='.$this->Id.')'.
100 ' WHERE (`Complete` = 1) AND (`VersionStart` <= '.$ExportVersion.') AND (`VersionEnd` >= '.$ExportVersion.')'.
101 ' ORDER BY `ExportLanguage`.`Sequence`, `ExportUser`.`Sequence`) AS `TT` GROUP BY `TT`.`Entry`';
102
103 // Build columns for english texts
104 $OriginalColumns = '';
105 foreach($TranslationTree[$Group['Id']]['Items'] as $Column) {
106 $OriginalColumns .= ' `T3`.`'.$Column['Column'].'` AS `En'.$Column['Column'].'`, ';
107 if (isset($GroupItems[$Column['Id']]))
108 $OriginalColumns .= ' `T3`.`'.$Column['Column'].'` AS `'.$Column['Column'].'`, ';
109 }
110 $OriginalColumns = substr($OriginalColumns, 0, -2);
111
112 // Expand query for loading english texts
113 $Query = 'SELECT `T4`.*, '.$OriginalColumns.' FROM ('.$Query.') AS `T4` '.
114 ' LEFT JOIN `'.$Group['TablePrefix'].'` AS `T3` ON (`T3`.`Entry` = `T4`.`Entry`) '.
115 'AND (`T3`.`Language` = '.$this->System->Config['OriginalLanguage'].') AND '.
116 '(`T3`.`VersionStart` = `T4`.`VersionStart`) AND (`T3`.`VersionEnd` = `T4`.`VersionEnd`)';
117
118 return($Query);
119 }
120
121 function NeedGeneration()
122 {
123 $this->LoadFilters();
124 $file = '';
125 if ($this->Export['OutputType'] == 10) $file = $this->TempDir.'Instalace_CzechWoW_'.$this->ClientVersion['Version'].'.exe';
126 if ($this->Export['OutputType'] == 9) $file = $this->TempDir.'CzWoW_DBC.zip';
127
128 if (file_exists($file))
129 $date = date('Y-m-d H:i',(filemtime($file)));
130 else return(true);
131 // echo $file;
132
133 $DbResult = $this->Database->query('SELECT `Group`.* FROM `ExportGroup` '.
134 'JOIN `Group` ON `Group`.`Id` = `ExportGroup`.`Group` WHERE `ExportGroup`.`Export`='.$this->Id);
135 $result = false;
136 while($Group = $DbResult->fetch_assoc())
137 {
138 $Query = 'SELECT * FROM `'.$Group['TablePrefix'].'` AS `T`'.
139 ' JOIN `ExportUser` ON (`ExportUser`.`User`=`T`.`User`) AND (`ExportUser`.`Export`='.$this->Id.') '.
140 ' JOIN `User` ON `User`.`ID`=`T`.`User`'.
141 ' JOIN `ExportLanguage` ON (`ExportLanguage`.`Export`='.$this->Id.')'.
142 ' WHERE ( \''.$date.'\' < `T`.`ModifyTime`) AND (`Complete` = 1) AND (`VersionStart` <= '.$this->ClientVersion['BuildNumber'].') AND (`VersionEnd` >= '.$this->ClientVersion['BuildNumber'].')'.
143 ' ';
144
145 $DbResult2 = $this->Database->query($Query);
146 if ($DbResult2->num_rows > 0) {
147 $result = true;
148 }
149 }
150 return($result);
151 }
152
153 function ExportToMangosSQL()
154 {
155 global $TranslationTree;
156
157 $this->LoadFilters();
158
159 $Buffer =
160 "-- Generováno projektem wowpreklad.zdechov.net\n".
161 "-- ===========================================\n".
162 "--\n".
163 "-- Web projektu: ".$this->Config['Web']['Host'].$this->System->Link('/')."\n".
164 "-- Datum exportu: ".date("j.n.Y H:i:s")."\n".
165 "-- Znaková sada: ".$this->Config['Database']['Charset']." / ".$this->Config['Web']['Charset']."\n".
166 "-- Diakritika: ".$this->AnoNe[$this->Export['WithDiacritic']]."\n".
167 "-- Vygeneroval uživatel: ".$this->System->User->Name."\n".
168 "-- Vzato od uživatelů: ".$this->UserNames."\n".
169 "-- Generované tabulky: ";
170
171 $DbResult = $this->Database->query('SELECT `Group`.* FROM `ExportGroup` '.
172 'JOIN `Group` ON `Group`.`Id` = `ExportGroup`.`Group` WHERE `ExportGroup`.`Export`='.$this->Id);
173 while($Group = $DbResult->fetch_assoc())
174 {
175 $Buffer .= $Group['TablePrefix'].', ';
176 }
177 $Buffer .= "\n\n";
178
179 $DbResult = $this->Database->query('SELECT `Group`.* FROM `ExportGroup` '.
180 'JOIN `Group` ON `Group`.`Id` = `ExportGroup`.`Group` WHERE `ExportGroup`.`Export`='.$this->Id);
181 while($Group = $DbResult->fetch_assoc())
182 {
183 if($Group['MangosTable'] != '')
184 {
185 $Buffer .= "\n\n-- ".$Group['Name']."\n\n";
186 $DbResult2 = $this->Database->query($this->BuildQuery($Group));
187 if($DbResult2->num_rows > 0)
188 while($Line = $DbResult2->fetch_array())
189 {
190 $Values = '';
191 foreach($TranslationTree[$Group['Id']]['Items'] as $GroupItem)
192 if($GroupItem['Column'] != $Group['PrimaryKeyItem']) // Do not update primary key
193 {
194 if($GroupItem['MangosColumn'] == '') $GroupItem['MangosColumn'] = $GroupItem['Column'];
195 $Values .= ', `'.$GroupItem['MangosColumn'].'`="'.addslashes($Line[$GroupItem['Column']]).'"';
196 }
197 $Values = substr($Values, 2);
198
199 // Get multicolumn index
200 $ColumnItems = explode(',', $Group['MangosTableIndex']);
201 if(count($ColumnItems) > 1)
202 {
203 $Where = 'CONCAT(';
204 foreach($ColumnItems as $ColumnItem)
205 $Where .= '`'.$ColumnItem.'`, "_", ';
206 $Where = substr($Where, 0, -7).')';
207 } else $Where = '`'.$Group['MangosTableIndex'].'`';
208 $Where .= ' = "'.$Line[$Group['PrimaryKeyItem']].'";';
209
210 $Line = 'UPDATE `'.$Group['MangosTable'].'` SET '.$Values.' WHERE '.$Where;
211 $Line = str_replace("\n", '\n', $Line);
212 $Line = str_replace("\r", '', $Line);
213 $Buffer .= $Line."\n";
214 }
215 }
216 }
217 if($this->Export['WithDiacritic'] != 1) $Buffer = utf2ascii($Buffer);
218 return($Buffer);
219 }
220
221 function ExportToAoWoWSQL()
222 {
223 global $TranslationTree, $AoWoWconf;
224
225 //require_once('../aowow/configs/config.php');
226
227 $Buffer = $this->ExportToMangosSQL();
228
229 /*
230 // Data to aowow
231 $Database2 = new mysqli($this->Config['Database']['Host'], $this->Config['Database']['User'], $this->Config['Database']['Password'], $this->Config['Database']['Database']);
232 $Database2->query('SET NAMES '.$this->Config['Database']['Charset']);
233 $Database2->select_db($AoWoWconf['mangos']['db']);
234 $AoWoWTables = array(
235 'aowow_resistances' => 'Id',
236 'aowow_spelldispeltype' => 'Id',
237 'aowow_skill' => 'skillID',
238 );
239 foreach($AoWoWTables as $AoWoWTable => $IndexColum)
240 {
241 $Buffer .= '--'.$AoWoWTable.', ';
242 $Buffer .= "\n\n";
243 $Query = 'SELECT `name`,`'.$IndexColum.'` FROM `'.$AoWoWTable.'`';
244 $DbResult = $Database2->query($Query);
245 while($Line = $DbResult->fetch_assoc())
246 {
247 $Ori_text = $Line['name'];
248 $DbResult2 = $Database2->query('SELECT `Text` AS `En`,
249 (SELECT `Text` FROM `'.$this->System->Config['Database']['Database'].'`.`TextGlobalString` AS `TableTran`
250 WHERE `TableEn`.`Entry` = `TableTran`.`Entry` AND (`Complete` = 1) AND '.$this->WhereLang.' AND '.$this->WhereUsers.$this->OrderByUserList.' LIMIT 1) AS `Tran`
251 FROM `'.$this->System->Config['Database']['Database'].'`.`TextGlobalString` AS `TableEn` WHERE
252 `Text` = "'.addslashes($Ori_text).'" LIMIT 1');
253 $Tran = $DbResult2->fetch_assoc();
254 //echo ($Line['name'].'='.$Tran['tran']);
255 if($Tran['Tran'] == '')
256 {
257 $DbResult2 = $Database2->query('SELECT `OptionText` AS `En`,
258 (SELECT `OptionText` FROM `'.$this->Config['Database']['Database'].'`.`TextNPCOption` AS `TableTran`
259 WHERE `TableEn`.`Entry` = `TableTran`.`Entry` AND (`Complete` = 1) AND '.$this->WhereLang.'
260 AND '.$this->WhereUsers.$this->OrderByUserList.' LIMIT 1) AS `Tran`
261 FROM `'.$this->Config['Database']['Database'].'`.`TextNPCOption` AS `TableEn` WHERE
262 `OptionText` = "'.addslashes($Ori_text).'" LIMIT 1');
263 $Tran = $DbResult2->fetch_assoc();
264 }
265
266 if($Tran['Tran'] <> '')
267 $Buffer .= 'UPDATE `'.$AoWoWTable.'` SET `name` = "'.addslashes($Tran['Tran']).'" WHERE '.$IndexColum.' = '.$Line[$IndexColum].' ;'."\n";
268 }
269 $Buffer .= "\n\n";
270 }
271 */
272 if($this->Export['WithDiacritic'] != 1) $Buffer = utf2ascii($Buffer);
273 return($Buffer);
274 }
275
276 function HaveVarible($String1, $String2, $StartChar = '$')
277 {
278 //Export only if translate have same varible %
279
280 if (strpos($String1,$StartChar) !== false) {
281
282 while ( strpos($String1,$StartChar) !== false) {
283 $pos = strpos($String1,$StartChar);
284 $String1 = substr($String1,$pos+1);
285 $varible = $String1;
286 if (strpos($varible,' ')) $varible = substr($varible,0,strpos($varible,' '));
287 if (strpos($varible,'.')) $varible = substr($varible,0,strpos($varible,'.'));
288 if (strpos($varible,',')) $varible = substr($varible,0,strpos($varible,','));
289 if (strpos($varible,'%')) $varible = substr($varible,0,strpos($varible,'%'));
290 if (strpos($varible,chr(10))) $varible = substr($varible,0,strpos($varible,chr(10)));
291 // echo $pos.'-'.$varible.'-'.$String1.'-' .$String2.'
292 // ';
293
294 if (false === strpos($String2,$varible)) {
295 // echo $varible;
296 return(false);
297 }
298 }
299 }
300 return (true);
301 }
302
303 function AddProgress($add = 1) {
304
305 $DbResult = $this->System->Database->query('SELECT Progress FROM `ExportTask` WHERE `Export`='.$this->Id);
306 $Task = $DbResult->fetch_assoc();
307 $per = $Task['Progress']+$add;
308 $this->System->Database->query('UPDATE `ExportTask` SET `Progress`='.$per.' WHERE `Export`='.$this->Id);
309 }
310
311 function ExportToDBC()
312 {
313 global $TranslationTree;
314
315 $this->LoadFilters();
316
317 $DbResult = $this->Database->query('SELECT `Group`.* FROM `ExportGroup` '.
318 'JOIN `Group` ON `Group`.`Id` = `ExportGroup`.`Group` '.
319 'WHERE `ExportGroup`.`Export`='.$this->Id.' AND `Group`.`DBCFileName` != ""');
320 $Output = 'Počet generovaných skupin: '.$DbResult->num_rows."\n";
321 while($Group = $DbResult->fetch_assoc())
322 {
323 $this->AddProgress(2);
324 $Output .= $Group['Name'].', ';
325 if(file_exists($this->SourceDir.$this->ClientVersion['Version'].'/dbc/'.$Group['DBCFileName'].'.dbc'))
326 {
327 // Load string column index list
328 $DbResult2 = $this->Database->query('SELECT * FROM `GroupItem` '.
329 'JOIN `GroupItemDBC` ON `GroupItem`.`Id` = `GroupItemDBC`.`GroupItem` AND `GroupItemDBC`.`ClientVersion` = '.$this->ClientVersion['Id'].' WHERE `GroupItem`.`Group` = '.$Group['Id']);
330 $ColumnIndexes = array();
331 $ColumnFormat = array();
332 while($DbRow = $DbResult2->fetch_assoc())
333 {
334 $ColumnFormat[$DbRow['ColumnIndex']] = FORMAT_STRING;
335 $ColumnIndexes[$DbRow['GroupItem']] = $DbRow['ColumnIndex'];
336 }
337
338 // Load all data into lookup table
339 $LookupTable = array();
340 $DbResult2 = $this->Database->query($this->BuildQuery($Group));
341 while($DbRow = $DbResult2->fetch_assoc()) {
342 //Export only if translate have same varible %
343 $CanExport = true;
344 foreach($TranslationTree[$Group['Id']]['Items'] as $Column) {
345 $DbRow[$Column['Column']] = str_replace ( '$ ','$',$DbRow[$Column['Column']]);
346 if (!$this->HaveVarible($DbRow['En'.$Column['Column']],$DbRow[$Column['Column']])) {
347 $CanExport = false;
348 $Output .= ', NE='.$DbRow['ID'];
349 }
350 if (!$this->HaveVarible($DbRow[$Column['Column']],$DbRow['En'.$Column['Column']])) {
351 $CanExport = false;
352 $Output .= ', NE='.$DbRow['ID'];
353 }
354 }
355
356 if ($CanExport)
357 $LookupTable[$DbRow[$Group['PrimaryKeyItem']]] = $DbRow;
358
359 }
360
361 // Open original DBC file
362 $SourceDBCFile = new DBCFile();
363 $SourceDBCFile->OpenFile($this->SourceDir.$this->ClientVersion['Version'].'/dbc/'.$Group['DBCFileName'].'.dbc', $ColumnFormat);
364
365 // Create new DBC file
366 if(!file_exists($this->TempDir.'dbc/')) mkdir ($this->TempDir.'dbc/', 0777, true);
367 $NewDBCFile = new DBCFile();
368 $NewDBCFile->CreateFile($this->TempDir.'dbc/'.$Group['DBCFileName'].'.dbc', $ColumnFormat);
369 $NewDBCFile->SetRecordCount($SourceDBCFile->GetRecordCount());
370 $NewDBCFile->SetFieldCount($SourceDBCFile->GetFieldCount());
371 $NewDBCFile->Commit();
372
373 // Replace translated strings
374 $OldProgress = -1;
375 $Output .= "\n\r";
376 $RowCount = $SourceDBCFile->GetRecordCount();
377 $FieldCount = $SourceDBCFile->GetFieldCount();
378 for($Row = 0; $Row < $RowCount; $Row++)
379 {
380 $Line = $SourceDBCFile->GetLine($Row);
381
382 // Get multicolumn index value
383 $PrimaryKeyItem = '';
384 $ColumnItems = explode(',', $Group['DBCIndex']);
385 if(count($ColumnItems) > 1)
386 {
387 foreach($ColumnItems as $ColumnItem)
388 $PrimaryKeyItem .= $Line[$ColumnItem].'_';
389 $PrimaryKeyItem = substr($PrimaryKeyItem, 0, -1);
390 } else $PrimaryKeyItem = $Line[$Group['DBCIndex']];
391
392 if(array_key_exists($PrimaryKeyItem, $LookupTable))
393 {
394 // Replace text columns
395 $LookupTableItem = $LookupTable[$PrimaryKeyItem];
396 foreach($TranslationTree[$Group['Id']]['Items'] as $GroupItem)
397 {
398 if(array_key_exists($GroupItem['Id'], $ColumnIndexes))
399 $Line[$ColumnIndexes[$GroupItem['Id']]] = $LookupTableItem[$GroupItem['Column']];
400 }
401 }
402 $NewDBCFile->SetLine($Row, $Line);
403
404 // Show completion progress
405 $Progress = round($Row / $RowCount * 100);
406 if($Progress != $OldProgress)
407 {
408 if (($Group['Id'] == 13) and ($Progress <> 100)) $this->AddProgress(0.01);
409 $Output .= $Progress."%\r";
410 echo($Output);
411 $Output = '';
412 $OldProgress = $Progress;
413 }
414 }
415 $NewDBCFile->Commit();
416 } else $Output .= ShowMessage('Zdrojový soubor '.$this->SourceDirRelative.$this->ClientVersion['Version'].'/dbc/'.$Group['DBCFileName'].'.dbc'.' nenalezen.'."\n", MESSAGE_CRITICAL);
417 }
418 $Output .= 'Hotovo <br />';
419 return($Output);
420 }
421
422 function ExportToLua()
423 {
424 global $TranslationTree;
425
426 $this->LoadFilters();
427
428 $Output = '';
429 if(!file_exists($this->TempDir.'lua/')) mkdir($this->TempDir.'lua/', 0777, true);
430 $DbResult = $this->Database->query('SELECT `Group`.* FROM `ExportGroup` JOIN `Group` ON `Group`.`Id` = `ExportGroup`.`Group` WHERE `ExportGroup`.`Export`='.$this->Id.' AND `Group`.`LuaFileName` != ""');
431 while($Group = $DbResult->fetch_assoc())
432 {
433 $this->AddProgress(1);
434 // $this->AddProgress();
435 $Output .= $Group['Name'].'... ';
436 $File = new FileStream();
437 if (!file_exists($this->SourceDir.$this->ClientVersion['Version'].'/lua/'.$Group['LuaFileName'].'.lua'))
438 continue;
439 $File->OpenFile($this->SourceDir.$this->ClientVersion['Version'].'/lua/'.$Group['LuaFileName'].'.lua');
440 $File2 = new FileStream();
441 $File2->CreateFile($this->TempDir.'lua/'.$Group['LuaFileName'].'.lua');
442
443 $LookupTable = array();
444 $DbResult2 = $this->Database->query($this->BuildQuery($Group));
445 while($DbRow = $DbResult2->fetch_assoc()) {
446 $CanExport = true;
447 foreach($TranslationTree[$Group['Id']]['Items'] as $Column) {
448 // if (strpos($DbRow[$Column['Column']],'\\'))
449 // $CanExport = false;
450 // $DbRow[$Column['Column']] = str_replace ( '$ ','$',$DbRow[$Column['Column']]);
451 // $DbRow[$Column['Column']] = $DbRow['En'.$Column['Column']];
452
453 if (!$this->HaveVarible($DbRow['En'.$Column['Column']],$DbRow[$Column['Column']])) {
454 if ($CanExport) $Output .= ', NE='.$DbRow['ID'];
455 $CanExport = false;
456 }
457 if (!$this->HaveVarible($DbRow[$Column['Column']],$DbRow['En'.$Column['Column']])) {
458 if ($CanExport) $Output .= ', NE='.$DbRow['ID'];
459 $CanExport = false;
460 }
461 if (!$this->HaveVarible($DbRow['En'.$Column['Column']],$DbRow[$Column['Column']],'%')) {
462 if ($CanExport) $Output .= ', NE='.$DbRow['ID'];
463 $CanExport = false;
464 }
465 if (!$this->HaveVarible($DbRow[$Column['Column']],$DbRow['En'.$Column['Column']],'%')) {
466 if ($CanExport) $Output .= ', NE='.$DbRow['ID'];
467 $CanExport = false;
468 }
469 if (!$this->HaveVarible($DbRow[$Column['Column']],$DbRow['En'.$Column['Column']],'\\')) {
470 if ($CanExport) $Output .= ', NE='.$DbRow['ID'];
471 $CanExport = false;
472 }
473 if (!$this->HaveVarible($DbRow['En'.$Column['Column']],$DbRow[$Column['Column']],'\\')) {
474 if ($CanExport) $Output .= ', NE='.$DbRow['ID'];
475 $CanExport = false;
476 }
477 if (!$this->HaveVarible($DbRow[$Column['Column']],$DbRow['En'.$Column['Column']],'|')) {
478 if ($CanExport) $Output .= ', NE='.$DbRow['ID'];
479 $CanExport = false;
480 }
481 if (!$this->HaveVarible($DbRow['En'.$Column['Column']],$DbRow[$Column['Column']],'|')) {
482 if ($CanExport) $Output .= ', NE='.$DbRow['ID'];
483 $CanExport = false;
484 }
485 if (!$this->HaveVarible($DbRow[$Column['Column']],$DbRow['En'.$Column['Column']],chr(10))) {
486 if ($CanExport) $Output .= ', NE='.$DbRow['ID'];
487 $CanExport = false;
488 }
489 if (!$this->HaveVarible($DbRow['En'.$Column['Column']],$DbRow[$Column['Column']],chr(10))) {
490 if ($CanExport) $Output .= ', NE='.$DbRow['ID'];
491 $CanExport = false;
492 }
493 }
494
495 if ($CanExport)
496 $LookupTable[$DbRow['ShortCut']] = $DbRow;
497 }
498
499 while(!$File->EOF())
500 {
501 $Line = $File->ReadLine();
502 if(strpos($Line, '=') !== false)
503 {
504 $LineParts = explode('=', $Line, 2);
505 $Value['ShortCut'] = trim($LineParts[0]);
506 $Line = trim($LineParts[1]);
507
508 if($Line[0] == '"')
509 {
510 // Quoted string value
511 $Line = substr($Line, 1); // Skip start qoute
512 $TempLine = str_replace('\"', ' ', $Line); // Temporary remove slashed quotes
513 if (strpos($TempLine, '"')) {
514 $Value['Text'] = substr($Line, 0, strpos($TempLine, '"'));
515 } else {
516 $Value['Text'] = substr($Line, 0, strpos($Line, '"'));
517 }
518// $Value['Text'] = str_replace('\n', "\n", $Value['Text']);
519// $Value['Text'] = addslashes(stripslashes($Value['Text']));
520 $Line = trim(substr($Line, strpos($TempLine, '"') + 1)); // Skip closing quote and semicolon {
521 } else
522 {
523 // Nonstring value
524 $Value['Text'] = substr($Line, 0, strpos($Line, ';'));
525 }
526 $Line = substr($Line, strpos($Line, ';') + 1);
527 $Value['Comment'] = addslashes(stripslashes(substr($Line, 3))); // Skip " --"
528
529 if(array_key_exists($Value['ShortCut'], $LookupTable))
530 {
531 $DbRow = $LookupTable[$Value['ShortCut']];
532 $Value['Text'] = $DbRow['Text'];
533 //addslashes
534 $Value['Text'] = str_replace('"', '\"', $Value['Text']);
535 // Escape new line control characters
536 $Value['Text'] = str_replace("\n", '\n', $Value['Text']);
537 $Value['Text'] = str_replace("\r", '', $Value['Text']);
538 $Value['Comment'] = $DbRow['Comment'];
539 // Only one line comments allowed
540 $Value['Comment'] = str_replace("\n", ' ', $Value['Comment']);
541 $Value['Comment'] = str_replace("\r", '', $Value['Comment']);
542 //echo('.');
543 }
544 $NewLine = $Value['ShortCut'].' = "'.$Value['Text'].'";';
545 //if($Value['Comment'] != '') $NewLine .= ' -- '.$Value['Comment'];
546 $NewLine .= "\r\n";
547 $File2->WriteLine($NewLine);
548 } else $File2->WriteLine($Line);
549 }
550 $Output .= 'Hotovo <br/>';
551 }
552 return($Output);
553 }
554
555 function GetReadme() {
556 $_GET['ExportId'] = $this->Id;
557 $PageExport = new PageExport($this->System);
558 $this->LoadFilters();
559 $Output = '';
560 //generation readme
561 $Output .= '<?xml version="1.0" encoding="utf-8"?\>'.
562'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">'.
563'<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="cs">'.
564'<head>'.
565 '<STYLE type="text/css">'.
566'.BaseTable {margin: 2px auto 2px auto;border-width: 1px;border-color: black;border-style: solid;border-collapse: collapse;}'.
567
568'.BaseTable tr td{ border-width: 1px; border-color: black; border-style: solid; padding: 2px; text-align: center;}'.
569
570'.BaseTable tr th{ border-width: 1px; border-color: black; border-style: solid; padding: 2px; background-color: #F0F0F0; text-align: center;}'.
571 '</STYLE>'.
572 '<meta http-equiv="content-type" content="application/xhtml+xml; charset=utf-8" />'.
573 '<title>Čeština pro WoW</title>'.
574'</head><body>'.
575'<h1>České WoW - čestina pro klienta hry World of Warcraft</h1>'.
576
577'<table cellspacing="10"><tr><td valign="top">'.
578
579'<p>Texty přebírány z projektu <a href="http://wowpreklad.zdechov.net/">wowpreklad.zdechov.net</a><br>'.
580'<a href="http://wowpreklad.zdechov.net/export/?Action=View&ExportId='.$this->Id.'&Tab=0">Export '.$this->Id.'</a></p><br>'.
581
582
583'<p><strong>Vlastnosti</strong>'.
584'<ul>'.
585'<li>Požadovaná verze klienta: '.$this->ClientVersion['Version'].'</li>'.
586'<li>Datum uvolnění: '.date('d.m.Y h:m',time()).'</li>'.
587'<li>Sestaveno automaticky překladovým systémem <a href="http://wowpreklad.zdechov.net/">WoW překlad</a></li>'.
588//'<li>Tento soubor se generuje každý den. Pokud se zapojíte do překladu, zítra můžete stáhnout tento soubor znovu včetně svých překladů</li>'.
589//'<li>Sestavil: Maron</li>'.
590'</ul>'.
591'</p>'.
592'<br>'.
593
594'<h2>Nejčastější otázky</h2>'.
595'<p><strong>Jak mám hru spustit?</strong><br>'.
596'Hru musíte spustit přes soubor WowLua.exe v kořenovém adresáři hry.</p>'.
597
598'<p><strong>Mohu použít tuto češtinu na oficiálních serverech?</strong><br>'.
599'Ne úplně, protože se vystavujete riziku zablokování vašeho účtu z důvodu použití upravené hry. Na oficiálním serveru lze využít pouze Addon s češtinou CzWoW.</p>'.
600
601'<p><strong>Mám nainstalovánu češtinu a nejde mi spustit Wow.exe.</strong><br>'.
602'Pokud chcete opět spouštět hru přes původní Wow.exe v angličtině, musíte češtinu nejprve odinstalovat ze systému. Především se jedná o soubor Data/enGB/patch-enGB-5.MPQ či Data/enUS/patch-enUS-5.MPQ, který je nutno smazat.</p>'.
603
604'<p><strong>Nedaří se mi provést aktualizaci klienta s nainstalovanou češtinou.</strong><br>'.
605'Před aktualizací na novější verzi klienta musíte nejprve češtinu odinstalovat. Čeština totiž mění v rámci patch MPQ souboru některé soubory hry, což oficiální instalátory vyhodnotí jako poškození hry.</p>'.
606
607'</td><td>';
608
609 $Output .= $PageExport->ExportViewStat(' WHERE `DBCFileName` !=\'\' OR `LuaFileName` !=\'\' OR `Group`.`Id` = 1 OR `Group`.`Id` = 2 OR `Group`.`Id` = 3 OR `Group`.`Id` = 16');
610
611 $Output .= '</td></tr></table>'.
612
613
614 '</body></html>';
615 return $Output;
616}
617
618 function ExportToXML()
619 {
620 global $TranslationTree;
621
622 $this->LoadFilters();
623
624 $Buffer = '<?xml version="1.0" encoding="utf-8"?>'."\n".
625 "<document>\n".
626 " <meta>\n".
627 " <projecturl>".$this->Config['Web']['Host'].$this->System->Link('/')."</projecturl>\n".
628 " <time>".date('r')."</time>\n".
629 " <diacritics mode=".'"'.$this->Export['WithDiacritic'].'"'." />\n".
630 " <author>".$this->System->User->Name."</author>\n".
631 " <contributors>\n";
632 foreach(explode(',', $this->UserNames) as $UserName)
633 $Buffer .= " <user>".$UserName."</user>\n";
634 $Buffer .=
635 " </contributors>\n".
636 " </meta>\n".
637 " <translation>\n";
638
639 $DbResult = $this->Database->query('SELECT `Group`.* FROM `ExportGroup` '.
640 'JOIN `Group` ON `Group`.`Id` = `ExportGroup`.`Group` WHERE `ExportGroup`.`Export`='.$this->Id);
641 while($Group = $DbResult->fetch_assoc())
642 {
643 if($Group['MangosTable'] == '')
644 {
645 $Group['MangosTable'] = $Group['TablePrefix'];
646 $Group['MangosTableIndex'] = 'entry';
647 }
648 $Buffer .= ' <group id="'.$Group['Id'].'" name="'.$Group['TablePrefix'].'">'."\n";
649 $DbResult2 = $this->Database->query($this->BuildQuery($Group));
650 while($Line = $DbResult2->fetch_assoc())
651 {
652 $Buffer .= ' <item id="'.$Line['Entry'].'" user="'.$Line['UserName'].'">'."\n";
653 $Values = '';
654 foreach($TranslationTree[$Group['Id']]['Items'] as $GroupItem)
655 {
656 if($GroupItem['MangosColumn'] == '') $GroupItem['MangosColumn'] = $GroupItem['Column'];
657 if($Line[$GroupItem['Column']] != '')
658 $Buffer .= ' <text index="'.$GroupItem['Id'].'" name="'.
659 $GroupItem['Column'].'">'.addslashes($Line[$GroupItem['Column']]).'</text>'."\n";
660 }
661 $Buffer .= " </item>\n";
662 }
663 $Buffer .= " </group>\n";
664 }
665 if($this->Export['WithDiacritic'] != 1) $Buffer = utf2ascii($Buffer);
666 $Buffer .= " </translation>\n".
667 "</document>";
668 return($Buffer);
669 }
670}
671
672include_once(dirname(__FILE__).'/Page.php');
673include_once(dirname(__FILE__).'/ExportOutput.php');
674
675class ModuleExport extends AppModule
676{
677 function __construct($System)
678 {
679 parent::__construct($System);
680 $this->Name = 'Export';
681 $this->Version = '1.0';
682 $this->Creator = 'Chronos';
683 $this->License = 'GNU/GPL';
684 $this->Description = 'Allow parametric export of translated texts to various supported output formats';
685 $this->Dependencies = array();
686 }
687
688 function Start()
689 {
690 $this->System->RegisterPage('export', 'PageExport');
691 $this->System->RegisterMenuItem(array(
692 'Title' => 'Exporty',
693 'Hint' => 'Zde si můžete stáhnout přeložené texty',
694 'Link' => $this->System->Link('/export/'),
695 'Permission' => LICENCE_ANONYMOUS,
696 'Icon' => '',
697 ), 2);
698 }
699}
700
Note: See TracBrowser for help on using the repository browser.