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 | }
|
---|