| 1 | <?php
|
|---|
| 2 |
|
|---|
| 3 | include_once(dirname(__FILE__).'/Comparison.php');
|
|---|
| 4 | include_once(dirname(__FILE__).'/Form.php');
|
|---|
| 5 | include_once(dirname(__FILE__).'/Save.php');
|
|---|
| 6 | include_once(dirname(__FILE__).'/TranslationList.php');
|
|---|
| 7 | include_once(dirname(__FILE__).'/Progress.php');
|
|---|
| 8 | include_once(dirname(__FILE__).'/LoadNames.php');
|
|---|
| 9 | include_once(dirname(__FILE__).'/UserLevel.php');
|
|---|
| 10 |
|
|---|
| 11 | class ModuleTranslation extends Module
|
|---|
| 12 | {
|
|---|
| 13 | public array $TranslationTree;
|
|---|
| 14 |
|
|---|
| 15 | function __construct(System $System)
|
|---|
| 16 | {
|
|---|
| 17 | parent::__construct($System);
|
|---|
| 18 | $this->Name = 'Translation';
|
|---|
| 19 | $this->Version = '1.0';
|
|---|
| 20 | $this->Creator = 'Chronos';
|
|---|
| 21 | $this->License = 'GNU/GPL';
|
|---|
| 22 | $this->Description = 'Translation of text items and groups from original language to other languages.';
|
|---|
| 23 | $this->Dependencies = array('News', 'Search');
|
|---|
| 24 | }
|
|---|
| 25 |
|
|---|
| 26 | function DoStart(): void
|
|---|
| 27 | {
|
|---|
| 28 | $this->System->RegisterPage(['comparison.php'], 'PageTranslationComparison');
|
|---|
| 29 | $this->System->RegisterPage(['form.php'], 'PageTranslationForm');
|
|---|
| 30 | $this->System->RegisterPage(['save.php'], 'PageTranslationSave');
|
|---|
| 31 | $this->System->RegisterPage(['progress'], 'PageProgress');
|
|---|
| 32 | $this->System->RegisterPage(['translation-groups'], 'PageTranslationGroups');
|
|---|
| 33 | $this->System->RegisterPage(['TranslationList.php'], 'PageTranslationList');
|
|---|
| 34 | $this->System->RegisterPage(['LoadNames.php'], 'PageLoadNames');
|
|---|
| 35 | $this->System->ModuleManager->Modules['News']->RegisterRSS(array('Title' => T('Last translations'),
|
|---|
| 36 | 'Channel' => 'translation', 'Callback' => array($this, 'ShowRSS'), 'Permission' => LICENCE_ANONYMOUS));
|
|---|
| 37 | Core::Cast($this->System)->RegisterMenuItem(array(
|
|---|
| 38 | 'Title' => T('Completion status'),
|
|---|
| 39 | 'Hint' => 'Stav dokončení překládů',
|
|---|
| 40 | 'Link' => $this->System->Link('/progress/'),
|
|---|
| 41 | 'Permission' => LICENCE_ANONYMOUS,
|
|---|
| 42 | 'Icon' => '',
|
|---|
| 43 | ), 1);
|
|---|
| 44 | Core::Cast($this->System)->RegisterMenuItem(array(
|
|---|
| 45 | 'Title' => T('Data source'),
|
|---|
| 46 | 'Hint' => 'Informace o překladových skupinách',
|
|---|
| 47 | 'Link' => $this->System->Link('/translation-groups/'),
|
|---|
| 48 | 'Permission' => LICENCE_ANONYMOUS,
|
|---|
| 49 | 'Icon' => '',
|
|---|
| 50 | ));
|
|---|
| 51 | if (array_key_exists('Search', $this->System->ModuleManager->Modules))
|
|---|
| 52 | {
|
|---|
| 53 | $TranslationTree = $this->System->ModuleManager->Modules['Translation']->GetTranslationTree();
|
|---|
| 54 | foreach ($TranslationTree as $Group)
|
|---|
| 55 | {
|
|---|
| 56 | $Table = $Group['TablePrefix'];
|
|---|
| 57 |
|
|---|
| 58 | $Columns = array('ID', 'Entry');
|
|---|
| 59 | foreach ($Group['Items'] as $Item)
|
|---|
| 60 | {
|
|---|
| 61 | if ($Item['Column'] != '') $Columns[] = $Item['Column'];
|
|---|
| 62 | }
|
|---|
| 63 |
|
|---|
| 64 | $this->System->ModuleManager->Modules['Search']->RegisterSearch('group'.$Group['Id'],
|
|---|
| 65 | sprintf(T('Translation group "%s"'), $Group['Name']), $Columns, '`'.$Table.'`',
|
|---|
| 66 | $this->System->Link('/TranslationList.php?group='.
|
|---|
| 67 | $Group['Id'].'&user=0&state=0&entry=&text='));
|
|---|
| 68 | }
|
|---|
| 69 | }
|
|---|
| 70 | Core::Cast($this->System)->RegisterPageBarItem('Right', 'TranslatedMenu', array($this, 'ShowTranslatedMenu'));
|
|---|
| 71 | }
|
|---|
| 72 |
|
|---|
| 73 | function ShowRSS()
|
|---|
| 74 | {
|
|---|
| 75 | $Items = array();
|
|---|
| 76 | $DbResult = $this->Database->query('SELECT UNIX_TIMESTAMP(`Date`) AS `Date`, `User`.`Name` AS `UserName`, `Text` FROM `Log` '.
|
|---|
| 77 | 'JOIN `User` ON `User`.`ID` = `Log`.`User` WHERE `Type` = 1 ORDER BY `Date` DESC LIMIT 100');
|
|---|
| 78 | while ($DbRow = $DbResult->fetch_assoc())
|
|---|
| 79 | {
|
|---|
| 80 | $Items[] = array
|
|---|
| 81 | (
|
|---|
| 82 | 'Title' => strip_tags($DbRow['Text'].' ('.$DbRow['UserName'].')'),
|
|---|
| 83 | 'Link' => 'http://'.Core::Cast($this->System)->Config['Web']['Host'].$this->System->Link('/'),
|
|---|
| 84 | 'Description' => $DbRow['Text'],
|
|---|
| 85 | 'Time' => $DbRow['Date'],
|
|---|
| 86 | );
|
|---|
| 87 | }
|
|---|
| 88 | $Output = GenerateRSS(array
|
|---|
| 89 | (
|
|---|
| 90 | 'Title' => Core::Cast($this->System)->Config['Web']['Title'].' - '.T('Last translations'),
|
|---|
| 91 | 'Link' => 'https://'.Core::Cast($this->System)->Config['Web']['Host'].$this->System->Link('/'),
|
|---|
| 92 | 'Description' => Core::Cast($this->System)->Config['Web']['Description'],
|
|---|
| 93 | 'WebmasterEmail' => Core::Cast($this->System)->Config['Web']['AdminEmail'],
|
|---|
| 94 | 'Items' => $Items,
|
|---|
| 95 | ));
|
|---|
| 96 | return $Output;
|
|---|
| 97 | }
|
|---|
| 98 |
|
|---|
| 99 | function ShowBox()
|
|---|
| 100 | {
|
|---|
| 101 | $Count = 40;
|
|---|
| 102 | $Output = '<strong>'.T('Last translated').':</strong>';
|
|---|
| 103 | $Output .= '<div class="box">';
|
|---|
| 104 |
|
|---|
| 105 | $GroupListQuery = 'SELECT `Group`.* FROM `Group`';
|
|---|
| 106 | $Query = '';
|
|---|
| 107 | $UnionItems = array();
|
|---|
| 108 | $DbResult = $this->Database->query($GroupListQuery);
|
|---|
| 109 | if ($DbResult->num_rows > 0)
|
|---|
| 110 | {
|
|---|
| 111 | while ($DbRow = $DbResult->fetch_assoc())
|
|---|
| 112 | {
|
|---|
| 113 | $UnionItems[] = 'SELECT `T`.`ID`, `T`.`Take`, `T`.`User`, `T`.`ModifyTime`, `T`.`Group`, `T`.`GroupName` '.
|
|---|
| 114 | 'FROM (SELECT `T`.`User`, `T`.`ID`, `T`.`ModifyTime`, '.
|
|---|
| 115 | $DbRow['Id'].' AS `Group`, "'.addslashes($DbRow['Name']).'" AS `GroupName`, `T`.`Take` FROM `'.
|
|---|
| 116 | $DbRow['TablePrefix'].'` AS `T`'.
|
|---|
| 117 | ' WHERE (`T`.`Complete` = 1) AND (`T`.`Language` != '.Core::Cast($this->System)->Config['OriginalLanguage'].') ORDER BY `T`.`ModifyTime` DESC LIMIT '.
|
|---|
| 118 | $Count.') AS `T`';
|
|---|
| 119 | }
|
|---|
| 120 | $Query = 'SELECT `TT`.*, `User`.`Name` AS `UserName`, `User`.`Id` AS `UserId` '.
|
|---|
| 121 | ' FROM ('.implode(' UNION ', $UnionItems).') AS `TT`'.
|
|---|
| 122 | ' JOIN `User` ON `User`.`Id` = `TT`.`User`'.
|
|---|
| 123 | ' ORDER BY `ModifyTime` DESC LIMIT '.$Count;
|
|---|
| 124 | $DbResult = $this->Database->query($Query);
|
|---|
| 125 | $Output .= '<table class="MiniTable"><tr><th>'.T('Date').'</th><th>'.T('Who').'</th><th>'.T('New').'</th><th>'.T('Source').'</th><th>'.T('Group').'</th></tr>';
|
|---|
| 126 | while ($DbRow = $DbResult->fetch_assoc())
|
|---|
| 127 | {
|
|---|
| 128 | $Output .= '<tr><td>'.HumanDate($DbRow['ModifyTime']).'</td>'.
|
|---|
| 129 | '<td><a href="'.$this->System->Link('/user/?user='.$DbRow['UserId']).'">'.$DbRow['UserName'].'</a></td>'.
|
|---|
| 130 | '<td><a href="'.$this->System->Link('/form.php?group='.$DbRow['Group'].'&ID='.$DbRow['ID']).'">'.$DbRow['ID'].'</a></td>'.
|
|---|
| 131 | '<td><a href="'.$this->System->Link('/form.php?group='.$DbRow['Group'].'&ID='.$DbRow['Take']).'">'.$DbRow['Take'].'</a></td>'.
|
|---|
| 132 | '<td><a href="'.$this->System->Link('/TranslationList.php?group='.$DbRow['Group'].'&action=filter').'">'.T($DbRow['GroupName']).'</a></td></tr>';
|
|---|
| 133 | }
|
|---|
| 134 | $Output .= '</table>';
|
|---|
| 135 | }
|
|---|
| 136 | $Output .= '</div>';
|
|---|
| 137 | return $Output;
|
|---|
| 138 | }
|
|---|
| 139 |
|
|---|
| 140 | function GetTranslationTree()
|
|---|
| 141 | {
|
|---|
| 142 | if (isset($this->TranslationTree)) return $this->TranslationTree;
|
|---|
| 143 | else
|
|---|
| 144 | {
|
|---|
| 145 | $Result = array();
|
|---|
| 146 | $Groups = array();
|
|---|
| 147 | $DbResult = $this->System->Database->query('SELECT *, UNIX_TIMESTAMP(`LastImport`) AS `LastImportTime` FROM `Group`');
|
|---|
| 148 | while ($DbRow = $DbResult->fetch_assoc())
|
|---|
| 149 | $Groups[T($DbRow['Name'])] = $DbRow;
|
|---|
| 150 | ksort($Groups);
|
|---|
| 151 | foreach ($Groups as $Group)
|
|---|
| 152 | {
|
|---|
| 153 | $Group['Items'] = array();
|
|---|
| 154 | $Group['Game'] = T($Group['Name']);
|
|---|
| 155 | $Result[$Group['Id']] = $Group;
|
|---|
| 156 | }
|
|---|
| 157 | $DbResult = $this->System->Database->query('SELECT * FROM `GroupItem` ORDER BY `Group`, `Sequence`');
|
|---|
| 158 | while ($DbRow = $DbResult->fetch_assoc())
|
|---|
| 159 | {
|
|---|
| 160 | $Result[$DbRow['Group']]['Items'][] = $DbRow;
|
|---|
| 161 | }
|
|---|
| 162 | $this->TranslationTree = $Result;
|
|---|
| 163 | return $Result;
|
|---|
| 164 | }
|
|---|
| 165 | }
|
|---|
| 166 |
|
|---|
| 167 | function ShowTranslatedMenu()
|
|---|
| 168 | {
|
|---|
| 169 | $User = ModuleUser::Cast($this->System->GetModule('User'))->User;
|
|---|
| 170 | $TranslationTree = $this->GetTranslationTree();
|
|---|
| 171 |
|
|---|
| 172 | $Output = '<strong>'.T('Translate groups').':</strong><br /><div id="TranslationMenu">';
|
|---|
| 173 | $DbResult = $this->System->Database->select('Group', '`Id`, `Name`', '1 ORDER BY `Name`');
|
|---|
| 174 | while ($Group = $DbResult->fetch_assoc())
|
|---|
| 175 | {
|
|---|
| 176 | $Groups[T($Group['Name'])] = $Group;
|
|---|
| 177 | }
|
|---|
| 178 | ksort($Groups);
|
|---|
| 179 | foreach ($Groups as $Group)
|
|---|
| 180 | {
|
|---|
| 181 | $Output .= '<div id="menuitem-group'.$Group['Id'].'" onmouseover="show(\'group'.$Group['Id'].'\')" onmouseout="hide(\'group'.$Group['Id'].'\')">'.
|
|---|
| 182 | '<a href="'.$this->System->Link('/TranslationList.php?group='.$Group['Id'].
|
|---|
| 183 | '&action=filter').'">'.str_replace(' ',' ', T($Group['Name'])).'</a></div>'.
|
|---|
| 184 | '<div id="group'.$Group['Id'].'" class="hidden-menu-item" onmouseover="show(\'group'.$Group['Id'].'\')" onmouseout="hide(\'group'.$Group['Id'].'\')">';
|
|---|
| 185 | $Output .= ' <a title="Zde můžete začít překládat" href="'.
|
|---|
| 186 | $this->System->Link('/TranslationList.php?group='.$Group['Id'].'&state=1&user=0&entry=&text=').'">'.T('Untranslated').'</a><br />'.
|
|---|
| 187 | ' <a title="Přeložené texty, můžete zde hlasovat, nebo opravovat překlady" href="'.
|
|---|
| 188 | $this->System->Link('/TranslationList.php?group='.$Group['Id'].'&state=2&user=0&entry=&text=').'">'.T('Translated').'</a><br />';
|
|---|
| 189 | if (isset($User) and $User->Licence(LICENCE_USER))
|
|---|
| 190 | {
|
|---|
| 191 | $Output .= ' <a title="'.T('Unfinished translations').'" href="'.$this->System->Link('/TranslationList.php?group='.$Group['Id'].'&state=3').'">'.T('Unfinished').'</a><br />'.
|
|---|
| 192 | ' <a title="Všechny překlady, které jste přeložil" href="'.
|
|---|
| 193 | $this->System->Link('/TranslationList.php?group='.$Group['Id'].'&state=1&user='.
|
|---|
| 194 | $User->Id).'&entry=&text=">'.T('Own').'</a><br />';
|
|---|
| 195 | }
|
|---|
| 196 | $Output .= ' <a title="'.T('Compose special filter').'" href="'.
|
|---|
| 197 | $this->System->Link('/TranslationList.php?group='.$Group['Id'].'&action=filter').
|
|---|
| 198 | '">'.T('Filter').'</a><br />';
|
|---|
| 199 | $Output .= '</div>';
|
|---|
| 200 | }
|
|---|
| 201 | $Output .= '</div>';
|
|---|
| 202 | return $Output;
|
|---|
| 203 | }
|
|---|
| 204 |
|
|---|
| 205 | static function Cast(Module $Module): ModuleTranslation
|
|---|
| 206 | {
|
|---|
| 207 | if ($Module instanceof ModuleTranslation)
|
|---|
| 208 | {
|
|---|
| 209 | return $Module;
|
|---|
| 210 | }
|
|---|
| 211 | throw new Exception('Expected '.ModuleTranslation::GetClassName().' type but got '.gettype($Module));
|
|---|
| 212 | }
|
|---|
| 213 | }
|
|---|