Search code examples
typo3typo3-9.x

Change language parameters in site configuration for some pages in a site


Is there a possibility in TYPO3 10 LTS to change the option fallbackType in the site configuration for a single page?

Background:

I use for the site the option fallbackType fallback. But for a few page I need fallbackType strict. Up to TYPO3 8 this could be achieved with a simple extension template and different config configurations. Is there a way in TYPO3 10?


Solution

  • As far as i know there is no possibility to configurate TYPO3 to behave in this way. The only way to override the language configuration for a single page is a custom middleware.

    You can find a working example here: https://github.com/qbus-agentur/typo3-dynamic-language-mode.

    I changed the main function:

        public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
    {
        $lang = $this->getCurrentSiteLanguage($request);
        $pageArguments = $this->getPageArguments($request);
    
        if ($lang === null || $pageArguments === null) {
            return $handler->handle($request);
        }
    
        // get current page ID
        $currentRouting = $request->getAttribute('routing');
        $currentPage = $currentRouting->getPageId();
    
        $site = $request->getAttribute('site');
        $default = $site->getLanguages()[0];
        if ($lang->getLanguageId() !== $default->getLanguageId()) {
            // Check if page is in $pagesWhereToChange and apply a dynamic language configuration in that case
    
            if (in_array($currentPage, $this->pagesWhereToChange) > 0) {
                \Closure::bind(function() use ($lang, $newId) {
                    $lang->fallbackType = 'free';
                    $lang->fallbackLanguageIds = [];
                }, null, SiteLanguage::class)();
            }
        }
    
        return $handler->handle($request);
    }
    

    Where $this->pagesWhereToChange is an array of pages:

    /**
     * pagesWhereToChange
     *
     * @var array
     */
    protected $pagesWhereToChange = [30,41];
    

    It's not possible to configure the array with typoscript because TSFE is not rendered yet.