Feature #88137
closedCreate multi-step fallback for content and arbitrary records
Added by Benni Mack over 5 years ago. Updated over 1 year ago.
100%
Description
It should be possible to show content of language=2, and if it is not translated, use the fallback chain to language=1 and stop there.
Updated by Benni Mack over 5 years ago
- Related to Bug #86762: Site-Configuration defined language fallbacks not working added
Updated by Benni Mack over 5 years ago
Also see Daniel's comment / code snippet in the other issue
Updated by David Bruchmann over 5 years ago
Hi Benni,
just pulled news master-dev and tested a bit.
Good news is that without RouteEnhancer everything is working fine, also if I use only the uid in RouteEnhancer.
Fine is related to my (known) personal scenario:
language 0 no fallback
language 1 no fallback
language 2 fallback to language 1
In languages 0 and 1 the slugs are created correct if I use news_title in RouteEnhancer - that's working well.
In language 2 the titles are not produced (by extension seo?) but instead the uids are appended to the configured path, but this is not resolved by EXT:news and results in a 404 error.
So the URLs look like this: https://domain.com/a-lactu/article/255
So my issue is about the RouteEnhancer and the language-fallback of the titles of the news.
Now I don't know if the RouteEnhancer just has to be configured different or if some extensions like seo, backend, frontend, etc. have to be changed (or even something in news).
Here still my desired setup for the news-titles (categories, etc. I leave away here):
routeEnhancers: News: type: Extbase extension: News plugin: Pi1 routes: - routePath: '/{news_title}' _controller: 'News::detail' _arguments: news_title: news defaultController: 'News::list' requirements: news_title: '^[a-zA-Z0-9].*$' page: \d+ aspects: news_title: type: PersistedAliasMapper tableName: tx_news_domain_model_news routeFieldName: path_segment
and here the working setup with uids only:
routeEnhancers: News: type: Extbase extension: News plugin: Pi1 routes: - routePath: '/{news_uid}' _controller: 'News::detail' _arguments: news_uid: news defaultController: 'News::list' aspects: news_uid: type: PersistedAliasMapper tableName: tx_news_domain_model_news routeFieldName: uid
Updated by David Hedden over 3 years ago
For folks that find this and want to impelement a solution for Typo3 9.5.
Typo3DbQueryParser and PageRepository via XCLASS, fallback can be enabled by settings languageAspect to true for a table.
This solution works for 1 level Typo3DbQueryParser.phpTypo3DbQueryParser.php
<?php
namespace Vendor\Extension\Xclass\TYPO3;
use TYPO3\CMS\Core\Context\Context;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Core\Utility\MathUtility;
use TYPO3\CMS\Extbase\Persistence\Generic\QuerySettingsInterface;
class Typo3DbQueryParser extends \TYPO3\CMS\Extbase\Persistence\Generic\Storage\Typo3DbQueryParser {
/**
* Builds the language field statement
*
* @param string $tableName The database table name
* @param string $tableAlias The table alias used in the query.
* @param QuerySettingsInterface $querySettings The TYPO3 CMS specific query settings
* @return string
*/
protected function getLanguageStatement($tableName, $tableAlias, QuerySettingsInterface $querySettings)
{
if (empty($GLOBALS['TCA'][$tableName]['ctrl']['languageField'])) {
return '';
}
if(!isset($GLOBALS['TCA'][$tableName]['ctrl']['languageAspect']) || $GLOBALS['TCA'][$tableName]['ctrl']['languageAspect'] == false) {
return parent::getLanguageStatement($tableName, $tableAlias, $querySettings);
}
$fallbackChain = array_unique(array_filter(GeneralUtility::makeInstance(Context::class)->getAspect('language')->getFallbackChain(), function ($item) {
return MathUtility::canBeInterpretedAsInteger($item);
}));
// Select all entries for the current language
// If any language is set -> get those entries which are not translated yet
// They will be removed by \TYPO3\CMS\Frontend\Page\PageRepository::getRecordOverlay if not matching overlay mode
$languageField = $GLOBALS['TCA'][$tableName]['ctrl']['languageField'];
$transOrigPointerField = $GLOBALS['TCA'][$tableName]['ctrl']['transOrigPointerField'] ?? '';
if (!$transOrigPointerField || !$querySettings->getLanguageUid()) {
return $this->queryBuilder->expr()->in(
$tableAlias . '.' . $languageField,
[(int)$querySettings->getLanguageUid(), -1]
);
}
$mode = $querySettings->getLanguageOverlayMode();
if (!$mode) {
return $this->queryBuilder->expr()->in(
$tableAlias . '.' . $languageField,
[(int)$querySettings->getLanguageUid(), -1]
);
}
$defLangTableAlias = $tableAlias . '_dl';
$defaultLanguageRecordsSubSelect = $this->queryBuilder->getConnection()->createQueryBuilder();
$defaultLanguageRecordsSubSelect
->select($defLangTableAlias . '.uid')
->from($tableName, $defLangTableAlias)
->where(
$defaultLanguageRecordsSubSelect->expr()->andX(
$defaultLanguageRecordsSubSelect->expr()->eq($defLangTableAlias . '.' . $transOrigPointerField, 0),
$defaultLanguageRecordsSubSelect->expr()->eq($defLangTableAlias . '.' . $languageField, 0)
)
);
$andConditions = [];
// records in language 'all'
$andConditions[] = $this->queryBuilder->expr()->eq($tableAlias . '.' . $languageField, -1);
// translated records where a default language exists
$andConditions[] = $this->queryBuilder->expr()->andX(
$this->queryBuilder->expr()->eq($tableAlias . '.' . $languageField, (int)$querySettings->getLanguageUid()),
$this->queryBuilder->expr()->in(
$tableAlias . '.' . $transOrigPointerField,
$defaultLanguageRecordsSubSelect->getSQL()
)
);
if(count($fallbackChain) == 1) {
$translatedOnlyTableAlias = $tableAlias . '_to';
$queryBuilderForSubselect = $this->queryBuilder->getConnection()->createQueryBuilder();
$queryBuilderForSubselect
->select($translatedOnlyTableAlias . '.l10n_parent' )
->from($tableName, $translatedOnlyTableAlias)
->where(
$queryBuilderForSubselect->expr()->andX(
$queryBuilderForSubselect->expr()->gt($translatedOnlyTableAlias . '.' . $transOrigPointerField, 0),
$queryBuilderForSubselect->expr()->eq($translatedOnlyTableAlias . '.' . $languageField, $querySettings->getLanguageUid())
)
);
$andConditions[] = $this->queryBuilder->expr()->andX(
$this->queryBuilder->expr()->in($tableAlias . '.' . $languageField, $fallbackChain),
$this->queryBuilder->expr()->notIn(
$tableAlias . '.l10n_parent',
$queryBuilderForSubselect->getSQL()
)
);
}
return $this->queryBuilder->expr()->orX(...$andConditions);
}
}
This works for multiple levels Typo3DbQueryParser.phpTypo3DbQueryParser.php
<?php
namespace Vendor\Extension\Xclass\TYPO3;
use Doctrine\DBAL\FetchMode;
use TYPO3\CMS\Core\Context\Context;
use TYPO3\CMS\Core\Database\Connection;
use TYPO3\CMS\Core\Utility\ArrayUtility;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Core\Utility\MathUtility;
use TYPO3\CMS\Extbase\Persistence\Generic\QuerySettingsInterface;
class Typo3DbQueryParser extends \TYPO3\CMS\Extbase\Persistence\Generic\Storage\Typo3DbQueryParser {
/**
* Builds the language field statement
*
* @param string $tableName The database table name
* @param string $tableAlias The table alias used in the query.
* @param QuerySettingsInterface $querySettings The TYPO3 CMS specific query settings
* @return string
*/
protected function getLanguageStatement($tableName, $tableAlias, QuerySettingsInterface $querySettings)
{
if (empty($GLOBALS['TCA'][$tableName]['ctrl']['languageField'])) {
return '';
}
if(!isset($GLOBALS['TCA'][$tableName]['ctrl']['languageAspect']) || $GLOBALS['TCA'][$tableName]['ctrl']['languageAspect'] == false) {
return parent::getLanguageStatement($tableName, $tableAlias, $querySettings);
}
$languageField = $GLOBALS['TCA'][$tableName]['ctrl']['languageField'];
$transOrigPointerField = $GLOBALS['TCA'][$tableName]['ctrl']['transOrigPointerField'] ?? '';
$mode = $querySettings->getLanguageOverlayMode();
if (!$transOrigPointerField || !$querySettings->getLanguageUid() || !$mode) {
return $this->queryBuilder->expr()->in(
$tableAlias . '.' . $languageField,
[(int)$querySettings->getLanguageUid(), -1]
);
}
$andConditions = [];
$andConditions[] = $this->queryBuilder->expr()->eq($tableAlias . '.' . $languageField, -1);
$fallbackCain = GeneralUtility::makeInstance(Context::class)->getAspect('language')->getFallbackChain();
$languageOrder = array_merge([$querySettings->getLanguageUid()], array_unique(array_filter($fallbackCain, function ($item) {
return MathUtility::canBeInterpretedAsInteger($item);
})));
$fallbackUidList = $this->queryBuilder->getConnection()->createQueryBuilder();
$fallbackUidList
->selectLiteral("`uid`, IF(`". $transOrigPointerField. "` = 0, `uid`, `". $transOrigPointerField. "`) AS group_field,`sys_language_uid`")
->from($tableName)
->where(
$fallbackUidList->expr()->in('sys_language_uid', $languageOrder)
)
->add('orderBy', 'FIELD(`sys_language_uid`,' . implode(',', $languageOrder ). ')')
#->setMaxResults(1000000); if there are problems with big queries, limit forces indexes to be used
/** @var Connection $connection */
$connection = $this->queryBuilder->getConnection();
$res = $connection->executeQuery("SELECT `uid` FROM (" . $fallbackUidList->getSQL(). ") as tmp GROUP BY `tmp`.`group_field`")->fetchAll(FetchMode::NUMERIC);
if(count($res)) {
$andConditions[] = $this->queryBuilder->expr()->andX(
$this->queryBuilder->expr()->in($tableAlias . '.' . $languageField, $languageOrder),
$this->queryBuilder->expr()->in(
$tableAlias . '.uid',
ArrayUtility::flatten($res)
)
);
}
return $this->queryBuilder->expr()->orX(...$andConditions);
}
}
PageRepository.phpPageRepository.php
<?php
namespace Vendor\Extension\Xclass\TYPO3;
use TYPO3\CMS\Core\Database\Connection;
use TYPO3\CMS\Core\Database\ConnectionPool;
use TYPO3\CMS\Core\Database\Query\Restriction\FrontendRestrictionContainer;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Core\Utility\MathUtility;
class PageRepository extends \TYPO3\CMS\Frontend\Page\PageRepository {
/**
* Creates language-overlay for records in general (where translation is found
* in records from the same table)
*
* @param string $table Table name
* @param array $row Record to overlay. Must contain uid, pid and $table]['ctrl']['languageField']
* @param int $sys_language_content Pointer to the sys_language uid for content on the site.
* @param string $OLmode Overlay mode. If "hideNonTranslated" then records without translation will not be returned un-translated but unset (and return value is FALSE)
* @param array fallbackChain for translations
* @throws \UnexpectedValueException
* @return mixed Returns the input record, possibly overlaid with a translation. But if $OLmode is "hideNonTranslated" then it will return FALSE if no translation is found.
*/
public function getRecordOverlay($table, $row, $sys_language_content, $OLmode = '') {
$tableControl = $GLOBALS['TCA'][$table]['ctrl'] ?? [];
if(!isset($tableControl['languageAspect']) || $tableControl['languageAspect'] == false) {
return parent::getRecordOverlay($table, $row, $sys_language_content, $OLmode);
}
$sys_language_content = $this->context->getAspect('language')->getId();
$fallbackChain = array_unique(array_filter($this->context->getAspect('language')->getFallbackChain(), function ($item) {
return MathUtility::canBeInterpretedAsInteger($item);
}));
if (!empty($tableControl['languageField'])
// Return record for ALL languages untouched
// TODO: Fix call stack to prevent this situation in the first place
&& (int)$row[$tableControl['languageField']] !== -1
&& !empty($tableControl['transOrigPointerField'])
&& $row['uid'] > 0
&& ($row['pid'] > 0 || in_array($tableControl['rootLevel'] ?? false, [true, 1, -1], true))) {
// Will try to overlay a record only if the sys_language_content value is larger than zero.
if ($sys_language_content !== $row[$tableControl['languageField']]) {
// Must be default language, otherwise no overlaying
if ((int)$row[$tableControl['languageField']] === 0) {
// Select overlay record:
$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)
->getQueryBuilderForTable($table);
$queryBuilder->setRestrictions(
GeneralUtility::makeInstance(FrontendRestrictionContainer::class)
);
$languageChain = implode(',', array_merge([$sys_language_content],$fallbackChain));
$query = $queryBuilder->select('*')
->from($table)
->where(
$queryBuilder->expr()->eq(
'pid',
$queryBuilder->createNamedParameter($row['pid'], \PDO::PARAM_INT)
),
$queryBuilder->expr()->in(
$tableControl['languageField'],
$queryBuilder->createNamedParameter(GeneralUtility::intExplode(',', $languageChain), Connection::PARAM_INT_ARRAY)
),
$queryBuilder->expr()->eq(
$tableControl['transOrigPointerField'],
$queryBuilder->createNamedParameter($row['uid'], \PDO::PARAM_INT)
)
)
->add('orderBy', 'FIELD(' . $tableControl['languageField'] . ', ' . $languageChain . ')', true)
->setMaxResults(1);
$olrow = $query->execute()
->fetch();
$this->versionOL($table, $olrow);
// Merge record content by traversing all fields:
if (is_array($olrow)) {
if (isset($olrow['_ORIG_uid'])) {
$row['_ORIG_uid'] = $olrow['_ORIG_uid'];
}
if (isset($olrow['_ORIG_pid'])) {
$row['_ORIG_pid'] = $olrow['_ORIG_pid'];
}
foreach ($row as $fN => $fV) {
if ($fN !== 'uid' && $fN !== 'pid' && isset($olrow[$fN])) {
$row[$fN] = $olrow[$fN];
} elseif ($fN === 'uid') {
$row['_LOCALIZED_UID'] = $olrow['uid'];
}
}
} elseif (!in_array($row[$tableControl['languageField']], $fallbackChain)) {
unset($row);
}
} elseif ($sys_language_content != $row[$tableControl['languageField']]) {
unset($row);
}
} elseif($sys_language_content == 0 && $row[$tableControl['languageField']] > 0) {
unset($row);
}
}
return $row;
}
}
Difference is that rows get discarded if default (0) is not defined in fallback chain.
Updated by Gerrit Code Review over 3 years ago
- Status changed from New to Under Review
Patch set 2 for branch master of project Packages/TYPO3.CMS has been pushed to the review server.
It is available at https://review.typo3.org/c/Packages/TYPO3.CMS/+/67893
Updated by Gerrit Code Review over 3 years ago
Patch set 1 for branch master of project Packages/TYPO3.CMS has been pushed to the review server.
It is available at https://review.typo3.org/c/Packages/TYPO3.CMS/+/67894
Updated by Gerrit Code Review over 3 years ago
Patch set 1 for branch master of project Packages/TYPO3.CMS has been pushed to the review server.
It is available at https://review.typo3.org/c/Packages/TYPO3.CMS/+/67895
Updated by Gerrit Code Review over 3 years ago
Patch set 3 for branch master of project Packages/TYPO3.CMS has been pushed to the review server.
It is available at https://review.typo3.org/c/Packages/TYPO3.CMS/+/67893
Updated by Gerrit Code Review over 3 years ago
Patch set 3 for branch master of project Packages/TYPO3.CMS has been pushed to the review server.
It is available at https://review.typo3.org/c/Packages/TYPO3.CMS/+/67893
Updated by Gerrit Code Review over 3 years ago
Patch set 3 for branch master of project Packages/TYPO3.CMS has been pushed to the review server.
It is available at https://review.typo3.org/c/Packages/TYPO3.CMS/+/67893
Updated by Gerrit Code Review over 3 years ago
Patch set 2 for branch master of project Packages/TYPO3.CMS has been pushed to the review server.
It is available at https://review.typo3.org/c/Packages/TYPO3.CMS/+/67895
Updated by Gerrit Code Review over 3 years ago
Patch set 4 for branch master of project Packages/TYPO3.CMS has been pushed to the review server.
It is available at https://review.typo3.org/c/Packages/TYPO3.CMS/+/67893
Updated by Gerrit Code Review over 3 years ago
Patch set 3 for branch master of project Packages/TYPO3.CMS has been pushed to the review server.
It is available at https://review.typo3.org/c/Packages/TYPO3.CMS/+/67895
Updated by Gerrit Code Review over 3 years ago
Patch set 4 for branch master of project Packages/TYPO3.CMS has been pushed to the review server.
It is available at https://review.typo3.org/c/Packages/TYPO3.CMS/+/67895
Updated by Gerrit Code Review over 3 years ago
Patch set 1 for branch master of project Packages/TYPO3.CMS has been pushed to the review server.
It is available at https://review.typo3.org/c/Packages/TYPO3.CMS/+/67957
Updated by Gerrit Code Review over 3 years ago
Patch set 5 for branch master of project Packages/TYPO3.CMS has been pushed to the review server.
It is available at https://review.typo3.org/c/Packages/TYPO3.CMS/+/67895
Updated by Gerrit Code Review over 3 years ago
Patch set 6 for branch master of project Packages/TYPO3.CMS has been pushed to the review server.
It is available at https://review.typo3.org/c/Packages/TYPO3.CMS/+/67895
Updated by Gerrit Code Review over 3 years ago
Patch set 5 for branch master of project Packages/TYPO3.CMS has been pushed to the review server.
It is available at https://review.typo3.org/c/Packages/TYPO3.CMS/+/67893
Updated by Gerrit Code Review over 3 years ago
Patch set 6 for branch master of project Packages/TYPO3.CMS has been pushed to the review server.
It is available at https://review.typo3.org/c/Packages/TYPO3.CMS/+/67893
Updated by Gerrit Code Review over 3 years ago
Patch set 7 for branch master of project Packages/TYPO3.CMS has been pushed to the review server.
It is available at https://review.typo3.org/c/Packages/TYPO3.CMS/+/67893
Updated by Gerrit Code Review over 3 years ago
Patch set 8 for branch master of project Packages/TYPO3.CMS has been pushed to the review server.
It is available at https://review.typo3.org/c/Packages/TYPO3.CMS/+/67893
Updated by Gerrit Code Review over 3 years ago
Patch set 9 for branch master of project Packages/TYPO3.CMS has been pushed to the review server.
It is available at https://review.typo3.org/c/Packages/TYPO3.CMS/+/67893
Updated by Simon Praetorius about 3 years ago
We recently experienced this bug in a client project and developed a temporary workaround that works in our case. Maybe this is helpful for somebody:
config.yaml:
aspects: news-title: type: LanguageFallbackPersistedAliasMapper tableName: tx_news_domain_model_news routeFieldName: path_segment
ext_localconf.php:
$GLOBALS['TYPO3_CONF_VARS']['SYS']['routing']['aspects']['LanguageFallbackPersistedAliasMapper'] = \Sitegeist\Sitepackage\Routing\Aspect\LanguageFallbackPersistedAliasMapper::class;
LanguageFallbackPersistedAliasMapper.php:
[...] class LanguageFallbackPersistedAliasMapper extends PersistedAliasMapper { /** * @param array|null $record * @return array|null */ protected function resolveOverlay(?array $record): ?array { $result = parent::resolveOverlay($record); $languageAware = $this->languageFieldName !== null && $this->languageParentFieldName !== null; if (!$languageAware) { return $result; } $languageFallbackChain = array_reverse($this->resolveAllRelevantLanguageIds()); $pageRepository = $this->createPageRepository(); if (!$result || $result[$this->languageFieldName] == 0 && $languageFallbackChain) { foreach ($languageFallbackChain as $fallbackLanguageId) { $result = $pageRepository ->getRecordOverlay($this->tableName, $record, $fallbackLanguageId) ?: null; if ($result[$this->languageFieldName] == $fallbackLanguageId) { break; } } } return $result; } }
Note that this will lead to more SQL queries during link generation, but in our case the correct links were more important.
Updated by Gerrit Code Review about 3 years ago
Patch set 10 for branch master of project Packages/TYPO3.CMS has been pushed to the review server.
It is available at https://review.typo3.org/c/Packages/TYPO3.CMS/+/67893
Updated by Gerrit Code Review almost 3 years ago
Patch set 11 for branch master of project Packages/TYPO3.CMS has been pushed to the review server.
It is available at https://review.typo3.org/c/Packages/TYPO3.CMS/+/67893
Updated by Gerrit Code Review almost 3 years ago
Patch set 12 for branch master of project Packages/TYPO3.CMS has been pushed to the review server.
It is available at https://review.typo3.org/c/Packages/TYPO3.CMS/+/67893
Updated by Gerrit Code Review almost 3 years ago
Patch set 13 for branch master of project Packages/TYPO3.CMS has been pushed to the review server.
It is available at https://review.typo3.org/c/Packages/TYPO3.CMS/+/67893
Updated by Gerrit Code Review almost 3 years ago
Patch set 14 for branch master of project Packages/TYPO3.CMS has been pushed to the review server.
It is available at https://review.typo3.org/c/Packages/TYPO3.CMS/+/67893
Updated by Gerrit Code Review almost 3 years ago
Patch set 15 for branch master of project Packages/TYPO3.CMS has been pushed to the review server.
It is available at https://review.typo3.org/c/Packages/TYPO3.CMS/+/67893
Updated by Gerrit Code Review almost 3 years ago
Patch set 16 for branch master of project Packages/TYPO3.CMS has been pushed to the review server.
It is available at https://review.typo3.org/c/Packages/TYPO3.CMS/+/67893
Updated by Gerrit Code Review almost 3 years ago
Patch set 17 for branch master of project Packages/TYPO3.CMS has been pushed to the review server.
It is available at https://review.typo3.org/c/Packages/TYPO3.CMS/+/67893
Updated by Gerrit Code Review almost 3 years ago
Patch set 18 for branch master of project Packages/TYPO3.CMS has been pushed to the review server.
It is available at https://review.typo3.org/c/Packages/TYPO3.CMS/+/67893
Updated by Gerrit Code Review almost 3 years ago
Patch set 19 for branch master of project Packages/TYPO3.CMS has been pushed to the review server.
It is available at https://review.typo3.org/c/Packages/TYPO3.CMS/+/67893
Updated by Gerrit Code Review almost 3 years ago
Patch set 20 for branch master of project Packages/TYPO3.CMS has been pushed to the review server.
It is available at https://review.typo3.org/c/Packages/TYPO3.CMS/+/67893
Updated by Gerrit Code Review almost 3 years ago
Patch set 21 for branch master of project Packages/TYPO3.CMS has been pushed to the review server.
It is available at https://review.typo3.org/c/Packages/TYPO3.CMS/+/67893
Updated by Gerrit Code Review almost 3 years ago
Patch set 22 for branch master of project Packages/TYPO3.CMS has been pushed to the review server.
It is available at https://review.typo3.org/c/Packages/TYPO3.CMS/+/67893
Updated by Gerrit Code Review almost 3 years ago
Patch set 23 for branch master of project Packages/TYPO3.CMS has been pushed to the review server.
It is available at https://review.typo3.org/c/Packages/TYPO3.CMS/+/67893
Updated by Gerrit Code Review almost 3 years ago
Patch set 24 for branch master of project Packages/TYPO3.CMS has been pushed to the review server.
It is available at https://review.typo3.org/c/Packages/TYPO3.CMS/+/67893
Updated by Gerrit Code Review over 2 years ago
Patch set 25 for branch main of project Packages/TYPO3.CMS has been pushed to the review server.
It is available at https://review.typo3.org/c/Packages/TYPO3.CMS/+/67893
Updated by Gerrit Code Review over 2 years ago
Patch set 26 for branch main of project Packages/TYPO3.CMS has been pushed to the review server.
It is available at https://review.typo3.org/c/Packages/TYPO3.CMS/+/67893
Updated by Gerrit Code Review over 2 years ago
Patch set 27 for branch main of project Packages/TYPO3.CMS has been pushed to the review server.
It is available at https://review.typo3.org/c/Packages/TYPO3.CMS/+/67893
Updated by Gerrit Code Review over 2 years ago
Patch set 28 for branch main of project Packages/TYPO3.CMS has been pushed to the review server.
It is available at https://review.typo3.org/c/Packages/TYPO3.CMS/+/67893
Updated by Gerrit Code Review about 2 years ago
Patch set 29 for branch main of project Packages/TYPO3.CMS has been pushed to the review server.
It is available at https://review.typo3.org/c/Packages/TYPO3.CMS/+/67893
Updated by Gerrit Code Review about 2 years ago
Patch set 30 for branch main of project Packages/TYPO3.CMS has been pushed to the review server.
It is available at https://review.typo3.org/c/Packages/TYPO3.CMS/+/67893
Updated by Gerrit Code Review almost 2 years ago
Patch set 31 for branch main of project Packages/TYPO3.CMS has been pushed to the review server.
It is available at https://review.typo3.org/c/Packages/TYPO3.CMS/+/67893
Updated by Gerrit Code Review almost 2 years ago
Patch set 32 for branch main of project Packages/TYPO3.CMS has been pushed to the review server.
It is available at https://review.typo3.org/c/Packages/TYPO3.CMS/+/67893
Updated by Oliver Hader almost 2 years ago
- Sprint Focus deleted (
On Location Sprint)
Updated by Gerrit Code Review over 1 year ago
Patch set 33 for branch main of project Packages/TYPO3.CMS has been pushed to the review server.
It is available at https://review.typo3.org/c/Packages/TYPO3.CMS/+/67893
Updated by Gerrit Code Review over 1 year ago
Patch set 34 for branch main of project Packages/TYPO3.CMS has been pushed to the review server.
It is available at https://review.typo3.org/c/Packages/TYPO3.CMS/+/67893
Updated by Gerrit Code Review over 1 year ago
Patch set 35 for branch main of project Packages/TYPO3.CMS has been pushed to the review server.
It is available at https://review.typo3.org/c/Packages/TYPO3.CMS/+/67893
Updated by Gerrit Code Review over 1 year ago
Patch set 36 for branch main of project Packages/TYPO3.CMS has been pushed to the review server.
It is available at https://review.typo3.org/c/Packages/TYPO3.CMS/+/67893
Updated by Gerrit Code Review over 1 year ago
Patch set 37 for branch main of project Packages/TYPO3.CMS has been pushed to the review server.
It is available at https://review.typo3.org/c/Packages/TYPO3.CMS/+/67893
Updated by Gerrit Code Review over 1 year ago
Patch set 38 for branch main of project Packages/TYPO3.CMS has been pushed to the review server.
It is available at https://review.typo3.org/c/Packages/TYPO3.CMS/+/67893
Updated by Gerrit Code Review over 1 year ago
Patch set 39 for branch main of project Packages/TYPO3.CMS has been pushed to the review server.
It is available at https://review.typo3.org/c/Packages/TYPO3.CMS/+/67893
Updated by Gerrit Code Review over 1 year ago
Patch set 40 for branch main of project Packages/TYPO3.CMS has been pushed to the review server.
It is available at https://review.typo3.org/c/Packages/TYPO3.CMS/+/67893
Updated by Anonymous over 1 year ago
- Status changed from Under Review to Resolved
Applied in changeset b00bc4bd822adb037c6a57726d96acd99153bab8.
Updated by Benni Mack 6 months ago
- Related to Bug #91781: Language Fallback Chain is not working in custom Extension added