‪TYPO3CMS  ‪main
TranslationStatusController.php
Go to the documentation of this file.
1 <?php
2 
3 declare(strict_types=1);
4 
5 /*
6  * This file is part of the TYPO3 CMS project.
7  *
8  * It is free software; you can redistribute it and/or modify it under
9  * the terms of the GNU General Public License, either version 2
10  * of the License, or any later version.
11  *
12  * For the full copyright and license information, please read the
13  * LICENSE.txt file that was distributed with this source code.
14  *
15  * The TYPO3 project - inspiring people to share!
16  */
17 
19 
20 use Psr\Http\Message\ResponseInterface;
21 use Psr\Http\Message\ServerRequestInterface;
25 use TYPO3\CMS\Backend\Utility\BackendUtility;
30 use TYPO3\CMS\Core\Imaging\IconSize;
36 
41 #[Controller]
43 {
47  protected array ‪$siteLanguages = [];
48  protected int ‪$currentDepth = 0;
49  protected int ‪$currentLanguageId = 0;
50 
51  public function ‪handleRequest(ServerRequestInterface $request): ResponseInterface
52  {
53  $this->‪init($request);
54  $this->‪initializeSiteLanguages($request);
55  $backendUser = $this->‪getBackendUser();
56  $moduleData = $request->getAttribute('moduleData');
57  $allowedModuleOptions = $this->‪getAllowedModuleOptions();
58  if ($moduleData->cleanUp($allowedModuleOptions)) {
59  $backendUser->pushModuleData($moduleData->getModuleIdentifier(), $moduleData->toArray());
60  }
61  $this->currentDepth = (int)$moduleData->get('depth');
62  $this->currentLanguageId = (int)$moduleData->get('lang');
63 
64  if ($this->id) {
65  $tree = $this->‪getTree();
66  $content = $this->‪renderL10nTable($tree, $request);
67  $this->view->assignMultiple([
68  'pageUid' => $this->id,
69  'depthDropdownOptions' => $allowedModuleOptions['depth'],
70  'depthDropdownCurrentValue' => $this->currentDepth,
71  'displayLangDropdown' => !empty($allowedModuleOptions['lang']),
72  'langDropdownOptions' => $allowedModuleOptions['lang'],
73  'langDropdownCurrentValue' => $this->currentLanguageId,
74  'content' => $content,
75  ]);
76  }
77  return $this->view->renderResponse('TranslationStatus');
78  }
79 
80  protected function ‪getTree(): ‪PageTreeView
81  {
82  // Initialize starting point of page tree
83  $treeStartingPoint = ‪$this->id;
84  $treeStartingRecord = BackendUtility::getRecordWSOL('pages', $treeStartingPoint);
85  $tree = GeneralUtility::makeInstance(PageTreeView::class);
86  $tree->init('AND ' . $this->‪getBackendUser()->getPagePermsClause(‪Permission::PAGE_SHOW));
87  $tree->addField('l18n_cfg');
88  $tree->tree[] = [
89  'row' => $treeStartingRecord,
90  // Creating top icon; the current page
91  'HTML' => $this->iconFactory->getIconForRecord('pages', $treeStartingRecord, IconSize::SMALL)->render(),
92  ];
93  // Create the tree from starting point
94  if ($this->currentDepth) {
95  $tree->getTree($treeStartingPoint, $this->currentDepth);
96  }
97  return $tree;
98  }
99 
100  protected function ‪getAllowedModuleOptions(): array
101  {
102  $lang = $this->‪getLanguageService();
103  $menuArray = [
104  'depth' => [
105  0 => $lang->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.depth_0'),
106  1 => $lang->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.depth_1'),
107  2 => $lang->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.depth_2'),
108  3 => $lang->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.depth_3'),
109  4 => $lang->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.depth_4'),
110  999 => $lang->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.depth_infi'),
111  ],
112  ];
113  // Languages:
114  $menuArray['lang'] = [];
115  foreach ($this->siteLanguages as $language) {
116  if ($language->getLanguageId() === 0) {
117  $menuArray['lang'][0] = $lang->sL('LLL:EXT:core/Resources/Private/Language/locallang_general.xlf:LGL.allLanguages');
118  } else {
119  $menuArray['lang'][$language->getLanguageId()] = $language->getTitle();
120  }
121  }
122  return $menuArray;
123  }
124 
131  protected function ‪renderL10nTable(‪PageTreeView $tree, ServerRequestInterface $request): string
132  {
133  $lang = $this->‪getLanguageService();
134  $backendUser = $this->‪getBackendUser();
135  // Title length:
136  $titleLen = (int)$backendUser->uc['titleLen'];
137  // Put together the TREE:
138  ‪$output = '';
139  $langRecUids = [];
140 
141  $userTsConfig = $backendUser->getTSConfig();
142  $showPageId = !empty($userTsConfig['options.']['pageTree.']['showPageIdWithTitle']);
143 
144  $pageModule = 'web_layout';
145  $pageModuleAccess = $this->moduleProvider->accessGranted($pageModule, $backendUser);
146 
147  foreach ($tree->tree as $data) {
148  $tCells = [];
149  $langRecUids[0][] = $data['row']['uid'];
150  $pageTitle = ($showPageId ? '[' . (int)$data['row']['uid'] . '] ' : '') . ‪GeneralUtility::fixed_lgd_cs($data['row']['title'], $titleLen);
151  // Page icons / titles etc.
152  if ($pageModuleAccess) {
153  $pageModuleLink = (string)$this->uriBuilder->buildUriFromRoute($pageModule, ['id' => $data['row']['uid'], 'SET' => ['language' => 0]]);
154  $pageModuleLink = '<a href="' . htmlspecialchars($pageModuleLink) . '" title="' . $lang->sL('LLL:EXT:info/Resources/Private/Language/locallang_webinfo.xlf:lang_renderl10n_editPage') . '">' . htmlspecialchars($pageTitle) . '</a>';
155  } else {
156  $pageModuleLink = htmlspecialchars($pageTitle);
157  }
158 
159  $tCells[] = '<td' . (!empty($data['row']['_CSSCLASS']) ? ' class="' . $data['row']['_CSSCLASS'] . '"' : '') . '>' .
160  (!empty($data['depthData']) ? $data['depthData'] : '') .
161  BackendUtility::wrapClickMenuOnIcon($data['HTML'], 'pages', $data['row']['uid']) .
162  $pageModuleLink .
163  ((string)$data['row']['nav_title'] !== '' ? ' [Nav: <em>' . htmlspecialchars(‪GeneralUtility::fixed_lgd_cs($data['row']['nav_title'], $titleLen)) . '</em>]' : '') .
164  '</td>';
165  $previewUriBuilder = ‪PreviewUriBuilder::create((int)$data['row']['uid']);
166  // DEFAULT language:
167  $pageTranslationVisibility = new ‪PageTranslationVisibility((int)($data['row']['l18n_cfg'] ?? 0));
168  $status = $pageTranslationVisibility->shouldBeHiddenInDefaultLanguage() ? 'danger' : 'success';
169  // Create links:
170  $editUrl = (string)$this->uriBuilder->buildUriFromRoute('record_edit', [
171  'edit' => [
172  'pages' => [
173  $data['row']['uid'] => 'edit',
174  ],
175  ],
176  'returnUrl' => $request->getAttribute('normalizedParams')->getRequestUri(),
177  ]);
178  $info = '<button ' . ($previewUriBuilder->serializeDispatcherAttributes() ?? 'disabled="true"')
179  . ' class="btn btn-default" title="' . $lang->sL('LLL:EXT:info/Resources/Private/Language/locallang_webinfo.xlf:lang_renderl10n_viewPage') . '">' .
180  $this->iconFactory->getIcon('actions-view-page', IconSize::SMALL)->render() . '</button>';
181  if ($backendUser->check('tables_modify', 'pages')) {
182  $info .= '<a href="' . htmlspecialchars($editUrl)
183  . '" class="btn btn-default" title="' . $lang->sL(
184  'LLL:EXT:info/Resources/Private/Language/locallang_webinfo.xlf:lang_renderl10n_editDefaultLanguagePage'
185  ) . '">' . $this->iconFactory->getIcon('actions-page-open', IconSize::SMALL)->render() . '</a>';
186  }
187  $info .= '&nbsp;';
188  $info .= $pageTranslationVisibility->shouldBeHiddenInDefaultLanguage() ? '<span title="' . htmlspecialchars($lang->sL('LLL:EXT:frontend/Resources/Private/Language/locallang_tca.xlf:pages.l18n_cfg.I.1')) . '">D</span>' : '&nbsp;';
189  $info .= $pageTranslationVisibility->shouldHideTranslationIfNoTranslatedRecordExists() ? '<span title="' . htmlspecialchars($lang->sL('LLL:EXT:frontend/Resources/Private/Language/locallang_tca.xlf:pages.l18n_cfg.I.2')) . '">N</span>' : '&nbsp;';
190  // Put into cell:
191  $tCells[] = '<td class="' . $status . ' col-border-left"><div class="btn-group">' . $info . '</div></td>';
192  $tCells[] = '<td class="' . $status . '" title="' . $lang->sL(
193  'LLL:EXT:info/Resources/Private/Language/locallang_webinfo.xlf:lang_renderl10n_CEcount'
194  ) . '" align="center">' . ($this->‪getContentElementCount((int)$data['row']['uid'], 0) ?: '-') . '</td>';
195  // Traverse system languages:
196  foreach ($this->siteLanguages as $siteLanguage) {
197  $languageId = $siteLanguage->getLanguageId();
198  if ($languageId === 0) {
199  continue;
200  }
201  if ($this->currentLanguageId === 0 || $this->currentLanguageId === $languageId) {
202  $row = $this->‪getLangStatus((int)$data['row']['uid'], $languageId);
203  if ($pageTranslationVisibility->shouldBeHiddenInDefaultLanguage() || $pageTranslationVisibility->shouldHideTranslationIfNoTranslatedRecordExists()) {
204  $status = 'danger';
205  } else {
206  $status = '';
207  }
208  if (is_array($row)) {
209  $langRecUids[$languageId][] = $row['uid'];
210  if (!$row['_HIDDEN']) {
211  $status = 'success';
212  }
213  $info = ($showPageId ? ' [' . (int)$row['uid'] . ']' : '') . ' ' . htmlspecialchars(
214  ‪GeneralUtility::fixed_lgd_cs($row['title'], $titleLen)
215  ) . ((string)$row['nav_title'] !== '' ? ' [Nav: <em>' . htmlspecialchars(
216  ‪GeneralUtility::fixed_lgd_cs($row['nav_title'], $titleLen)
217  ) . '</em>]' : '') . ($row['_COUNT'] > 1 ? '<div>' . $lang->sL(
218  'LLL:EXT:info/Resources/Private/Language/locallang_webinfo.xlf:lang_renderl10n_badThingThereAre'
219  ) . '</div>' : '');
220 
221  if ($pageModuleAccess) {
222  $pageModuleLink = (string)$this->uriBuilder->buildUriFromRoute($pageModule, ['id' => $data['row']['uid'], 'SET' => ['language' => $languageId]]);
223  $pageModuleLink = '<a href="' . htmlspecialchars($pageModuleLink) . '" title="' . $lang->sL('LLL:EXT:info/Resources/Private/Language/locallang_webinfo.xlf:lang_renderl10n_editPageLang') . '">' . $info . '</a>';
224  } else {
225  $pageModuleLink = $info;
226  }
227  $icon = $this->iconFactory->getIconForRecord('pages', $row, IconSize::SMALL);
228  $iconMarkup = '<span title="' . BackendUtility::getRecordIconAltText($row, 'pages') . '">' . $icon->render() . '</span>';
229  $tCells[] = '<td class="' . $status . ' col-border-left">' .
230  BackendUtility::wrapClickMenuOnIcon($iconMarkup, 'pages', (int)$row['uid']) .
231  $pageModuleLink .
232  '</td>';
233  // Edit whole record:
234  // Create links:
235  $editUrl = (string)$this->uriBuilder->buildUriFromRoute('record_edit', [
236  'edit' => [
237  'pages' => [
238  $row['uid'] => 'edit',
239  ],
240  ],
241  'returnUrl' => $request->getAttribute('normalizedParams')->getRequestUri(),
242  ]);
243  // ViewPageLink
244  $info = '<button ' . ($previewUriBuilder
245  ->withLanguage($languageId)
246  ->serializeDispatcherAttributes() ?? 'disabled="true"')
247  . ' class="btn btn-default" title="' . $lang->sL('LLL:EXT:info/Resources/Private/Language/locallang_webinfo.xlf:lang_renderl10n_viewPage') . '">' .
248  $this->iconFactory->getIcon('actions-view', IconSize::SMALL)->render() . '</button>';
249  $info .= '<a href="' . htmlspecialchars($editUrl)
250  . '" class="btn btn-default" title="' . $lang->sL(
251  'LLL:EXT:info/Resources/Private/Language/locallang_webinfo.xlf:lang_renderl10n_editLanguageOverlayRecord'
252  ) . '">' . $this->iconFactory->getIcon('actions-open', IconSize::SMALL)->render() . '</a>';
253  $tCells[] = '<td class="' . $status . '"><div class="btn-group">' . $info . '</div></td>';
254  $tCells[] = '<td class="' . $status . '" title="' . $lang->sL(
255  'LLL:EXT:info/Resources/Private/Language/locallang_webinfo.xlf:lang_renderl10n_CEcount'
256  ) . '" align="center">' . ($this->‪getContentElementCount((int)$data['row']['uid'], $languageId) ?: '-') . '</td>';
257  } else {
258  $idName = sprintf('new-overlay-%d-%d', $languageId, $data['row']['uid']);
259  $info = '<div class="form-check form-check-type-icon-toggle">'
260  . '<input type="checkbox" data-lang="' . $languageId . '" data-uid="' . (int)$data['row']['uid'] . '" name="newOL[' . $languageId . '][' . $data['row']['uid'] . ']" id="' . htmlspecialchars($idName) . '" class="form-check-input" value="1" />'
261  . '<label class="form-check-label" for="' . $idName . '">'
262  . '<span class="form-check-label-icon">'
263  . '<span class="form-check-label-icon-checked">' . $this->iconFactory->getIcon('actions-check', IconSize::SMALL)->render() . '</span>'
264  . '<span class="form-check-label-icon-unchecked">' . $this->iconFactory->getIcon('empty-empty', IconSize::SMALL)->render() . '</span>'
265  . '</span>'
266  . '</label>'
267  . '</div>';
268  $tCells[] = '<td class="' . $status . ' col-border-left">&nbsp;</td>';
269  $tCells[] = '<td class="' . $status . '">&nbsp;</td>';
270  $tCells[] = '<td class="' . $status . '">' . $info . '</td>';
271  }
272  }
273  }
274  ‪$output .= '
275  <tr>
276  ' . implode('
277  ', $tCells) . '
278  </tr>';
279  }
280  // Put together HEADER:
281  $headerCells = [];
282  $headerCells[] = '<th>' . $lang->sL('LLL:EXT:info/Resources/Private/Language/locallang_webinfo.xlf:lang_renderl10n_page') . '</th>';
283  if ($backendUser->check('tables_modify', 'pages') && is_array($langRecUids[0])) {
284  $editUrl = (string)$this->uriBuilder->buildUriFromRoute('record_edit', [
285  'edit' => [
286  'pages' => [
287  implode(',', $langRecUids[0]) => 'edit',
288  ],
289  ],
290  'columnsOnly' => 'title,nav_title,l18n_cfg,hidden',
291  'returnUrl' => $request->getAttribute('normalizedParams')->getRequestUri(),
292  ]);
293  $editIco = '<a href="' . htmlspecialchars($editUrl)
294  . '" class="btn btn-default" title="' . $lang->sL(
295  'LLL:EXT:info/Resources/Private/Language/locallang_webinfo.xlf:lang_renderl10n_editPageProperties'
296  ) . '">' . $this->iconFactory->getIcon('actions-document-open', IconSize::SMALL)->render() . '</a>';
297  } else {
298  $editIco = '';
299  }
300  if (isset($this->siteLanguages[0])) {
301  $defaultLanguageLabel = $this->siteLanguages[0]->getTitle();
302  } else {
303  $defaultLanguageLabel = $lang->sL('LLL:EXT:info/Resources/Private/Language/locallang_webinfo.xlf:lang_renderl10n_default');
304  }
305  $headerCells[] = '<th class="col-border-left" colspan="2">' . htmlspecialchars($defaultLanguageLabel) . '&nbsp;' . $editIco . '</th>';
306  foreach ($this->siteLanguages as $siteLanguage) {
307  $languageId = $siteLanguage->getLanguageId();
308  if ($languageId === 0) {
309  continue;
310  }
311  if ($this->currentLanguageId === 0 || $this->currentLanguageId === $languageId) {
312  // Title:
313  $headerCells[] = '<th class="col-border-left">' . htmlspecialchars($siteLanguage->getTitle()) . '</th>';
314  // Edit language overlay records:
315  if (is_array($langRecUids[$languageId] ?? null)) {
316  $editUrl = (string)$this->uriBuilder->buildUriFromRoute('record_edit', [
317  'edit' => [
318  'pages' => [
319  implode(',', $langRecUids[$languageId]) => 'edit',
320  ],
321  ],
322  'columnsOnly' => 'title,nav_title,hidden',
323  'returnUrl' => $request->getAttribute('normalizedParams')->getRequestUri(),
324  ]);
325  $editButton = '<a href="' . htmlspecialchars($editUrl)
326  . '" class="btn btn-default" title="' . $lang->sL(
327  'LLL:EXT:info/Resources/Private/Language/locallang_webinfo.xlf:lang_renderl10n_editLangOverlays'
328  ) . '">' . $this->iconFactory->getIcon('actions-document-open', IconSize::SMALL)->render() . '</a>';
329  } else {
330  $editButton = '';
331  }
332  // Create new overlay records:
333  $createLink = (string)$this->uriBuilder->buildUriFromRoute('tce_db', [
334  'redirect' => $request->getAttribute('normalizedParams')->getRequestUri(),
335  ]);
336  $newButton = '<a href="' . htmlspecialchars($createLink) . '" data-edit-url="' . htmlspecialchars($createLink) . '" class="btn btn-default disabled t3js-language-new" data-lang="' . $languageId . '" title="' . $lang->sL(
337  'LLL:EXT:info/Resources/Private/Language/locallang_webinfo.xlf:lang_getlangsta_createNewTranslationHeaders'
338  ) . '">' . $this->iconFactory->getIcon('actions-document-new', IconSize::SMALL)->render() . '</a>';
339 
340  $headerCells[] = '<th>' . $editButton . '</th>';
341  $headerCells[] = '<th>' . $newButton . '</th>';
342  }
343  }
344 
345  ‪$output =
346  '<div class="table-fit">' .
347  '<table class="table table-striped table-hover" id="langTable">' .
348  '<thead>' .
349  '<tr>' .
350  implode('', $headerCells) .
351  '</tr>' .
352  '</thead>' .
353  '<tbody>' .
354  ‪$output .
355  '</tbody>' .
356  '</table>' .
357  '</div>';
358  return ‪$output;
359  }
360 
368  protected function ‪getLangStatus(int $pageId, int $langId): bool|array
369  {
370  $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)
371  ->getQueryBuilderForTable('pages');
372  $queryBuilder
373  ->getRestrictions()
374  ->removeAll()
375  ->add(GeneralUtility::makeInstance(WorkspaceRestriction::class, $this->‪getBackendUser()->workspace))
376  ->add(GeneralUtility::makeInstance(DeletedRestriction::class));
377  $result = $queryBuilder
378  ->select('*')
379  ->from('pages')
380  ->where(
381  $queryBuilder->expr()->eq(
382  ‪$GLOBALS['TCA']['pages']['ctrl']['transOrigPointerField'],
383  $queryBuilder->createNamedParameter($pageId, ‪Connection::PARAM_INT)
384  )
385  )
386  ->andWhere(
387  $queryBuilder->expr()->eq(
388  ‪$GLOBALS['TCA']['pages']['ctrl']['languageField'],
389  $queryBuilder->createNamedParameter($langId, ‪Connection::PARAM_INT)
390  )
391  )
392  ->executeQuery();
393 
394  $row = $result->fetchAssociative();
395  BackendUtility::workspaceOL('pages', $row);
396  if (is_array($row)) {
397  $row['_COUNT'] = $queryBuilder->count('uid')->executeQuery()->fetchOne();
398  $row['_HIDDEN'] = $row['hidden'] || (int)$row['endtime'] > 0 && (int)$row['endtime'] < ‪$GLOBALS['EXEC_TIME'] || ‪$GLOBALS['EXEC_TIME'] < (int)$row['starttime'];
399  }
400  $result->free();
401  return $row;
402  }
403 
411  protected function ‪getContentElementCount(int $pageId, int $sysLang): int
412  {
413  $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)
414  ->getQueryBuilderForTable('tt_content');
415  $queryBuilder->getRestrictions()
416  ->removeAll()
417  ->add(GeneralUtility::makeInstance(DeletedRestriction::class))
418  ->add(GeneralUtility::makeInstance(WorkspaceRestriction::class, $this->‪getBackendUser()->workspace));
419  return (int)$queryBuilder
420  ->count('uid')
421  ->from('tt_content')
422  ->where(
423  $queryBuilder->expr()->eq(
424  'pid',
425  $queryBuilder->createNamedParameter($pageId, ‪Connection::PARAM_INT)
426  )
427  )
428  ->andWhere(
429  $queryBuilder->expr()->eq(
430  'sys_language_uid',
431  $queryBuilder->createNamedParameter($sysLang, ‪Connection::PARAM_INT)
432  )
433  )
434  ->executeQuery()
435  ->fetchOne();
436  }
437 
442  protected function ‪initializeSiteLanguages(ServerRequestInterface $request): void
443  {
445  $currentSite = $request->getAttribute('site');
446  $this->siteLanguages = $currentSite->getAvailableLanguages($this->‪getBackendUser(), false, $this->id);
447  }
448 }
‪TYPO3\CMS\Info\Controller\TranslationStatusController\$currentLanguageId
‪int $currentLanguageId
Definition: TranslationStatusController.php:49
‪TYPO3\CMS\Info\Controller\InfoModuleController
Definition: InfoModuleController.php:49
‪TYPO3\CMS\Core\Site\Entity\SiteInterface
Definition: SiteInterface.php:26
‪TYPO3\CMS\Core\Database\Connection\PARAM_INT
‪const PARAM_INT
Definition: Connection.php:50
‪TYPO3\CMS\Core\Utility\GeneralUtility\fixed_lgd_cs
‪static string fixed_lgd_cs(string $string, int $chars, string $appendString='...')
Definition: GeneralUtility.php:91
‪TYPO3\CMS\Info\Controller\TranslationStatusController\$siteLanguages
‪array $siteLanguages
Definition: TranslationStatusController.php:47
‪TYPO3\CMS\Info\Controller\TranslationStatusController\handleRequest
‪handleRequest(ServerRequestInterface $request)
Definition: TranslationStatusController.php:51
‪TYPO3\CMS\Info\Controller\TranslationStatusController
Definition: TranslationStatusController.php:43
‪TYPO3\CMS\Info\Controller\InfoModuleController\getBackendUser
‪getBackendUser()
Definition: InfoModuleController.php:170
‪TYPO3\CMS\Backend\Attribute\Controller
Definition: Controller.php:25
‪TYPO3\CMS\Info\Controller\TranslationStatusController\$currentDepth
‪int $currentDepth
Definition: TranslationStatusController.php:48
‪TYPO3\CMS\Info\Controller\InfoModuleController\getLanguageService
‪getLanguageService()
Definition: InfoModuleController.php:165
‪TYPO3\CMS\Core\Type\Bitmask\PageTranslationVisibility
Definition: PageTranslationVisibility.php:30
‪TYPO3\CMS\Info\Controller\TranslationStatusController\renderL10nTable
‪string renderL10nTable(PageTreeView $tree, ServerRequestInterface $request)
Definition: TranslationStatusController.php:131
‪TYPO3\CMS\Backend\Tree\View\PageTreeView
Definition: PageTreeView.php:28
‪TYPO3\CMS\Core\Type\Bitmask\Permission
Definition: Permission.php:26
‪TYPO3\CMS\Info\Controller\InfoModuleController\init
‪init(ServerRequestInterface $request)
Definition: InfoModuleController.php:71
‪TYPO3\CMS\Core\Site\Entity\SiteLanguage
Definition: SiteLanguage.php:27
‪TYPO3\CMS\Info\Controller\TranslationStatusController\getLangStatus
‪array bool getLangStatus(int $pageId, int $langId)
Definition: TranslationStatusController.php:368
‪TYPO3\CMS\Backend\Routing\PreviewUriBuilder\create
‪static static create(int $pageId)
Definition: PreviewUriBuilder.php:65
‪TYPO3\CMS\Core\Type\Bitmask\Permission\PAGE_SHOW
‪const PAGE_SHOW
Definition: Permission.php:35
‪TYPO3\CMS\Info\Controller\TranslationStatusController\getContentElementCount
‪int getContentElementCount(int $pageId, int $sysLang)
Definition: TranslationStatusController.php:411
‪TYPO3\CMS\Info\Controller\TranslationStatusController\getTree
‪getTree()
Definition: TranslationStatusController.php:80
‪TYPO3\CMS\Info\Controller\InfoModuleController\$id
‪int $id
Definition: InfoModuleController.php:57
‪$output
‪$output
Definition: annotationChecker.php:119
‪TYPO3\CMS\Core\Database\Connection
Definition: Connection.php:39
‪$GLOBALS
‪$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['adminpanel']['modules']
Definition: ext_localconf.php:25
‪TYPO3\CMS\Core\Database\Query\Restriction\DeletedRestriction
Definition: DeletedRestriction.php:28
‪TYPO3\CMS\Backend\Routing\PreviewUriBuilder
Definition: PreviewUriBuilder.php:44
‪TYPO3\CMS\Info\Controller\TranslationStatusController\getAllowedModuleOptions
‪getAllowedModuleOptions()
Definition: TranslationStatusController.php:100
‪TYPO3\CMS\Core\Database\ConnectionPool
Definition: ConnectionPool.php:48
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:51
‪TYPO3\CMS\Info\Controller\TranslationStatusController\initializeSiteLanguages
‪initializeSiteLanguages(ServerRequestInterface $request)
Definition: TranslationStatusController.php:442
‪TYPO3\CMS\Info\Controller
‪TYPO3\CMS\Core\Database\Query\Restriction\WorkspaceRestriction
Definition: WorkspaceRestriction.php:39