浏览代码

after typo3 v10 upgrade fixes

Olivier Massot 4 年之前
父节点
当前提交
72bf56fc7e

+ 100 - 0
doc/upgrade_v10.md

@@ -0,0 +1,100 @@
+
+
+php composer.phar update
+./vendor/bin/typo3 referenceindex:update
+rm public/typo3conf/ext/ot_admin
+rm public/typo3conf/ext/ot_connect
+rm public/typo3conf/ext/ot_core
+rm public/typo3conf/ext/ot_stats
+rm public/typo3conf/ext/ot_templating
+rm public/typo3conf/ext/ot_optimizer
+./vendor/bin/typo3 upgrade:run
+
+> error: ot_templating not loaded
+
+ln -s /var/opentalent/git/ot_typo3/ot_core public/typo3conf/ext/
+ln -s /var/opentalent/git/ot_typo3/ot_connect public/typo3conf/ext/
+ln -s /var/opentalent/git/ot_typo3/ot_admin public/typo3conf/ext/
+ln -s /var/opentalent/git/ot_typo3/ot_stats public/typo3conf/ext/
+ln -s /var/opentalent/git/ot_typo3/ot_templating public/typo3conf/ext/
+ln -s /var/opentalent/git/ot_typo3/ot_optimizer public/typo3conf/ext/
+php composer.phar dumpautoload
+./vendor/bin/typo3 upgrade:run
+
+> Uncaught TYPO3 Exception Cannot autowire service "Opentalent\OtAdmin\Controller\ScanController": argument "$otWebsiteRepository" of method "Opentalent\OtCore\Controller\ActionController::injectOtWebsiteRepository()" references class "Opentalent\OtCore\Website\OtWebsiteRepository" but no such service exists.
+thrown in file /var/www/typo3/vendor/symfony/dependency-injection/Compiler/DefinitionErrorExceptionPass.php
+in line 54
+
+rm public/typo3conf/ext/ot_admin
+rm public/typo3conf/ext/ot_connect
+rm public/typo3conf/ext/ot_core
+rm public/typo3conf/ext/ot_stats
+rm public/typo3conf/ext/ot_templating
+rm public/typo3conf/ext/ot_optimizer
+php composer.phar dumpautoload
+./vendor/bin/typo3 upgrade:run
+
+> An exception occurred while executing 'SELECT `content` FROM `cache_hash` WHERE (`identifier` = ?) AND (`expires` >= ?)' with params ["cb5eaa637b55d65c307d774a1920fc83", 1633424030]:
+Table 'typo3.cache_hash' doesn't exist                                                                                                                                                  
+
+disable all caches by adding these lines to AdditionalConfiguration.php:
+
+    foreach ($GLOBALS['TYPO3_CONF_VARS']['SYS']['caching']['cacheConfigurations'] as $cacheName => $cacheConfiguration) {
+    $GLOBALS['TYPO3_CONF_VARS']['SYS']['caching']['cacheConfigurations'][$cacheName]['backend'] = \TYPO3\CMS\Core\Cache\Backend\NullBackend::class;
+    }
+
+
+./vendor/bin/typo3 upgrade:run
+
+> [ERROR] <error>Error running Database Up-to-Date. Please ensure this prerequisite manually and try again.</error>
+
+./vendor/bin/typo3 upgrade:run extensionManagerTables
+./vendor/bin/typo3 upgrade:run separateSysHistoryFromLog
+./vendor/bin/typo3 upgrade:run rsaauthExtension >> no when asked
+./vendor/bin/typo3 upgrade:run feeditExtension >> no when asked
+./vendor/bin/typo3 upgrade:run taskcenterExtension >> no when asked
+./vendor/bin/typo3 upgrade:run sysActionExtension >> no when asked
+./vendor/bin/typo3 upgrade:run svgFilesSanitization >> no when asked
+./vendor/bin/typo3 upgrade:run databaseRowsUpdateWizard
+
+access to the BE
+
+run remaining upgrade wizard (felogin)
+flush cache
+analyse db
+apply changes to fields
+languages: update all
+reset BE users preferences
+clear persistent tables: all   >> useless, I guess...
+
+./vendor/bin/typo3 referenceindex:update
+
+> long, prévoir 1h+ / voir à lui passer un param quiet ou silent
+
+ln -s /var/opentalent/git/ot_typo3/ot_core public/typo3conf/ext/
+ln -s /var/opentalent/git/ot_typo3/ot_connect public/typo3conf/ext/
+ln -s /var/opentalent/git/ot_typo3/ot_admin public/typo3conf/ext/
+ln -s /var/opentalent/git/ot_typo3/ot_stats public/typo3conf/ext/
+ln -s /var/opentalent/git/ot_typo3/ot_templating public/typo3conf/ext/
+ln -s /var/opentalent/git/ot_typo3/ot_optimizer public/typo3conf/ext/
+php composer.phar dumpautoload
+
+http://local.sub.opentalent.fr/typo3/install.php
+
+I fix every deprecated call in my extensions
+BE is loading, ok
+
+analyse db structure >> nothing new
+Environment Status > ok
+Directory Status >> permission denied, I let it asit is for the moment (docker...)
+
+I re-enable the cache by deleting these lines in AdditionalConfiguration.php:
+
+    foreach ($GLOBALS['TYPO3_CONF_VARS']['SYS']['caching']['cacheConfigurations'] as $cacheName => $cacheConfiguration) {
+    $GLOBALS['TYPO3_CONF_VARS']['SYS']['caching']['cacheConfigurations'][$cacheName]['backend'] = \TYPO3\CMS\Core\Cache\Backend\NullBackend::class;
+    }
+
+Backend is not working anymore, I access to the typo3 install page, and run a db analysis
+I create the new tables
+
+BE is back to life

+ 7 - 11
ot_core/Classes/Website/OtPageRepository.php

@@ -25,11 +25,11 @@ class OtPageRepository
     }
 
     /**
-     * @var \TYPO3\CMS\Frontend\Page\PageRepository
+     * @var \TYPO3\CMS\Core\Domain\Repository\PageRepository
      */
-    private \TYPO3\CMS\Frontend\Page\PageRepository $pageRepository;
+    private \TYPO3\CMS\Core\Domain\Repository\PageRepository $pageRepository;
 
-    public function injectPageRepository(\TYPO3\CMS\Frontend\Page\PageRepository $pageRepository)
+    public function injectPageRepository(\TYPO3\CMS\Core\Domain\Repository\PageRepository $pageRepository)
     {
         $this->pageRepository = $pageRepository;
     }
@@ -76,16 +76,12 @@ class OtPageRepository
      */
     public function getRootPageFor($pageUid): array
     {
-        $rootLine = $this->pageService->getRootLine($pageUid);
+        $page = $this->getPage($pageUid);
 
-        for (end($rootLine); key($rootLine)!==null; prev($rootLine)){
-            $page = current($rootLine);
-            if ($page['is_siteroot'] == 1) {
-                $page = $this->pageRepository->getPage($page['uid'], true);
-                return $page;
-            }
+        while ($page && $page['is_siteroot'] !== 1) {
+            $page = $this->getPage($page['pid']);
         }
-        return [];
+        return $page;
     }
 
     /**

+ 2 - 5
ot_core/Configuration/RequestMiddlewares.php

@@ -8,11 +8,8 @@ return [
         'typo3/cms-frontend/site' => [
             'target' => Opentalent\OtCore\Middleware\Frontend\OtSiteResolver::class,
             'before' => [
-                'typo3/cms-adminpanel/initiator'
-            ],
-            'after' => [
-                'typo3/cms-adminpanel/sql-logging'
-            ],
+                'typo3/cms-frontend/page-resolver'
+            ]
         ],
     ],
 ];

+ 11 - 0
ot_core/Configuration/Services.yaml

@@ -0,0 +1,11 @@
+services:
+  _defaults:
+    autowire: true
+    autoconfigure: true
+    public: false
+
+  Opentalent\OtCore\:
+    resource: '../Classes/*'
+
+  FluidTYPO3\Vhs\:
+    resource: '/var/www/typo3/public/typo3conf/ext/vhs/Classes/*'

+ 0 - 20
ot_core/Tests/Unit/Fixtures/PageFixtures.php

@@ -80,26 +80,6 @@ class PageFixtures
         return null;
     }
 
-    /**
-     * Returns the rootline of the page
-     * as it could be returned by:
-     *
-     *    \FluidTYPO3\Vhs\Service\PageService->getRootLine($pageUid);
-     *
-     * @return array[]
-     */
-    public function getRootlineFor(int $pageUid): array
-    {
-        $page = $this->getByUid($pageUid);
-        $rootLine = [$page];
-
-        while ($page['pid'] != 0) {
-            $page = $this->getByUid($page['pid']);
-            $rootLine[] = $page;
-        }
-        return array_reverse($rootLine);
-    }
-
     /**
      * Returns the direct subpages of the page
      * as it could be returned by

+ 7 - 13
ot_core/Tests/Unit/Website/OtPageRepositoryTest.php

@@ -19,7 +19,7 @@ class OtPageRepositoryTest extends UnitTestCase
     public function setUp() {
         // Prophecies to be injected in the under test OtPageRepository
         $this->pageService = $this->prophesize(\FluidTYPO3\Vhs\Service\PageService::class);
-        $this->pageRepository = $this->prophesize(\TYPO3\CMS\Frontend\Page\PageRepository::class);
+        $this->pageRepository = $this->prophesize(\TYPO3\CMS\Core\Domain\Repository\PageRepository::class);
         $this->connectionPool = $this->prophesize(\TYPO3\CMS\Core\Database\ConnectionPool::class);
 
         // Fixtures
@@ -70,13 +70,12 @@ class OtPageRepositoryTest extends UnitTestCase
 
         // Prepare prophecies
         $page_uid = 210;
+        $page = $this->pageFixtures->getByUid($page_uid);
 
         $root_uid = 200;
         $root_page = $this->pageFixtures->getByUid($root_uid);
 
-        $root_line = $this->pageFixtures->getRootlineFor($page_uid);
-
-        $this->pageService->getRootLine($page_uid)->shouldBeCalled()->willReturn($root_line);
+        $this->pageRepository->getPage($page_uid, true)->shouldBeCalled()->willReturn($page);
         $this->pageRepository->getPage($root_uid, true)->shouldBeCalled()->willReturn($root_page);
         $this->injectProphecies();
 
@@ -98,9 +97,6 @@ class OtPageRepositoryTest extends UnitTestCase
         $root_uid = 200;
         $root_page = $this->pageFixtures->getByUid($root_uid);
 
-        $root_line = $this->pageFixtures->getRootlineFor($root_uid);
-
-        $this->pageService->getRootLine($root_uid)->shouldBeCalled()->willReturn($root_line);
         $this->pageRepository->getPage($root_uid, true)->shouldBeCalled()->willReturn($root_page);
         $this->injectProphecies();
 
@@ -120,10 +116,9 @@ class OtPageRepositoryTest extends UnitTestCase
 
         // Prepare prophecies
         $page_uid = 100;
+        $page = $this->pageFixtures->getByUid($page_uid);
 
-        $rootline = $this->pageFixtures->getRootlineFor($page_uid);
-
-        $this->pageService->getRootLine($page_uid)->shouldBeCalled()->willReturn($rootline);
+        $this->pageRepository->getPage($page_uid, true)->shouldBeCalled()->willReturn($page);
         $this->injectProphecies();
 
         // Test
@@ -269,13 +264,12 @@ class OtPageRepositoryTest extends UnitTestCase
 
         // Prepare prophecies
         $page_uid = 210;
+        $page = $this->pageFixtures->getByUid($page_uid);
 
         $root_uid = 200;
         $root_page = $this->pageFixtures->getByUid($root_uid);
 
-        $root_line = $this->pageFixtures->getRootlineFor($page_uid);
-
-        $this->pageService->getRootLine($page_uid)->shouldBeCalled()->willReturn($root_line);
+        $this->pageRepository->getPage($page_uid, true)->shouldBeCalled()->willReturn($page);
         $this->pageRepository->getPage($root_uid, true)->shouldBeCalled()->willReturn($root_page);
         $this->injectProphecies();
 

+ 0 - 213
ot_optimizer/Classes/XClass/Core/Routing/OtPageRouter.php

@@ -1,213 +0,0 @@
-<?php
-namespace Opentalent\OtOptimizer\XClass\Core\Routing;
-
-use Doctrine\DBAL\Connection;
-use TYPO3\CMS\Core\Context\Context;
-use TYPO3\CMS\Core\Database\ConnectionPool;
-use TYPO3\CMS\Core\Database\Query\Restriction\DeletedRestriction;
-use TYPO3\CMS\Core\Database\Query\Restriction\FrontendWorkspaceRestriction;
-use TYPO3\CMS\Core\Exception\SiteNotFoundException;
-use TYPO3\CMS\Core\Routing\PageRouter;
-use TYPO3\CMS\Core\Routing\SiteMatcher;
-use TYPO3\CMS\Core\Site\Entity\Site;
-use TYPO3\CMS\Core\Utility\GeneralUtility;
-use TYPO3\CMS\Frontend\Page\PageRepository;
-
-/**
- * Override the default core PageRouter of typo3 to exclude the pages
- * which do not belong to the current website
- *
- * @see https://docs.typo3.org/m/typo3/reference-coreapi/master/en-us/ApiOverview/Xclasses/Index.html
- * @package Opentalent\OtOptimizer\Routing
- */
-class OtPageRouter extends PageRouter
-{
-    /**
-     * special: patch 2020-09-22 by Opentalent, for performances reason
-     * Returns an array containing all the subpages'uids, including the given $pageId
-     * >> made for typo3 v9.5
-     *
-     * @param int $pageId
-     * @return array|int[]
-     */
-    private function getAllSubpagesUidFor(int $pageId) {
-        $subpages = [$pageId];
-
-        $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('pages');
-        $queryBuilder
-            ->getRestrictions()
-            ->removeAll()
-            ->add(GeneralUtility::makeInstance(DeletedRestriction::class));
-
-        $queryBuilder
-            ->select('uid')
-            ->from('pages')
-            ->where(
-                $queryBuilder->expr()->eq('pid', (int)$pageId)
-            );
-
-        $statement = $queryBuilder->execute();
-
-        while ($row = $statement->fetch()) {
-            $subpages = array_merge($subpages, $this->getAllSubpagesUidFor($row['uid']));
-        }
-
-        return $subpages;
-    }
-
-    /**
-     * -- Override the original method from the typo3 PageRouter --
-     * Check for records in the database which matches one of the slug candidates.
-     *
-     * @param array $slugCandidates
-     * @param int $languageId
-     * @param array $excludeUids when called recursively this is the mountpoint parameter of the original prefix
-     * @return array
-     */
-    protected function getPagesFromDatabaseForCandidates(array $slugCandidates, int $languageId, array $excludeUids = []): array
-    {
-        $context = GeneralUtility::makeInstance(Context::class);
-        $searchLiveRecordsOnly = $context->getPropertyFromAspect('workspace', 'isLive');
-        $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)
-            ->getQueryBuilderForTable('pages');
-        $queryBuilder
-            ->getRestrictions()
-            ->removeAll()
-            ->add(GeneralUtility::makeInstance(DeletedRestriction::class))
-            ->add(GeneralUtility::makeInstance(FrontendWorkspaceRestriction::class, null, null, $searchLiveRecordsOnly));
-
-        $statement = $queryBuilder
-            ->select('uid', 'l10n_parent', 'pid', 'slug', 'mount_pid', 'mount_pid_ol', 't3ver_state', 'doktype', 't3ver_wsid', 't3ver_oid')
-            ->from('pages')
-            ->where(
-                $queryBuilder->expr()->eq(
-                    'sys_language_uid',
-                    $queryBuilder->createNamedParameter($languageId, \PDO::PARAM_INT)
-                ),
-                $queryBuilder->expr()->in(
-                    'slug',
-                    $queryBuilder->createNamedParameter(
-                        $slugCandidates,
-                        Connection::PARAM_STR_ARRAY
-                    )
-                )
-            )
-            // Exact match will be first, that's important
-            ->orderBy('slug', 'desc')
-            // Sort pages that are not MountPoint pages before mount points
-            ->addOrderBy('mount_pid_ol', 'asc')
-            ->addOrderBy('mount_pid', 'asc')
-            ->execute();
-        $isRecursiveCall = !empty($excludeUids);
-
-        $pages = [];
-        $siteMatcher = GeneralUtility::makeInstance(SiteMatcher::class);
-        $pageRepository = GeneralUtility::makeInstance(PageRepository::class, $context);
-
-        // <----
-        // special: patch 2020-09-22 by Opentalent, for performances reason
-        // >> made for typo3 v9.5.22
-        $siteRootPageUid = $this->site->getRootPageId();
-        $sitePages = $this->getAllSubpagesUidFor($siteRootPageUid);
-        // ---->
-
-        while ($row = $statement->fetch()) {
-            $mountPageInformation = null;
-            $pageRepository->fixVersioningPid('pages', $row);
-            $pageIdInDefaultLanguage = (int)($languageId > 0 ? $row['l10n_parent'] : $row['uid']);
-            // When this page was added before via recursion, this page should be skipped
-            if (in_array($pageIdInDefaultLanguage, $excludeUids, true)) {
-                continue;
-            }
-
-            // <----
-            // special: patch 2020-09-22 by Opentalent, for performances reason
-            // >> made for typo3 v10.4.8
-            if (!in_array($pageIdInDefaultLanguage, $sitePages)) {
-                continue;
-            }
-            // ---->
-
-            try {
-                $isOnSameSite = $siteMatcher->matchByPageId($pageIdInDefaultLanguage)->getRootPageId() === $this->site->getRootPageId();
-            } catch (SiteNotFoundException $e) {
-                // Page is not in a site, so it's not considered
-                $isOnSameSite = false;
-            }
-
-            // If a MountPoint is found on the current site, and it hasn't been added yet by some other iteration
-            // (see below "findPageCandidatesOfMountPoint"), then let's resolve the MountPoint information now
-            if (!$isOnSameSite && $isRecursiveCall) {
-                // Not in the same site, and called recursive, should be skipped
-                continue;
-            }
-            $mountPageInformation = $pageRepository->getMountPointInfo($pageIdInDefaultLanguage, $row);
-            // Mount Point Pages which are not on the same site (when not called on the first level) should be skipped
-            // As they just clutter up the queries.
-            if (!$isOnSameSite && !$isRecursiveCall && $mountPageInformation) {
-                continue;
-            }
-            $mountedPage = null;
-            if ($mountPageInformation) {
-                // Add the MPvar to the row, so it can be used later-on in the PageRouter / PageArguments
-                $row['MPvar'] = $mountPageInformation['MPvar'];
-                $mountedPage = $pageRepository->getPage_noCheck($mountPageInformation['mount_pid_rec']['uid']);
-                // Ensure to fetch the slug in the translated page
-                $mountedPage = $pageRepository->getPageOverlay($mountedPage, $languageId);
-                // Mount wasn't connected properly, so it is skipped
-                if (!$mountedPage) {
-                    continue;
-                }
-                // If the page is a MountPoint which should be overlaid with the contents of the mounted page,
-                // it must never be accessible directly, but only in the MountPoint context. Therefore we change
-                // the current ID and slug.
-                // This needs to happen before the regular case, as the $pageToAdd contains the MPvar information
-                if (PageRepository::DOKTYPE_MOUNTPOINT === (int)$row['doktype'] && $row['mount_pid_ol']) {
-                    // If the mounted page was already added from above, this should not be added again (to include
-                    // the mount point parameter).
-                    if (in_array((int)$mountedPage['uid'], $excludeUids, true)) {
-                        continue;
-                    }
-                    $pageToAdd = $mountedPage;
-                    // Make sure target page "/about-us" is replaced by "/global-site/about-us" so router works
-                    $pageToAdd['MPvar'] = $mountPageInformation['MPvar'];
-                    $pageToAdd['slug'] = $row['slug'];
-                    $pages[] = $pageToAdd;
-                    $excludeUids[] = (int)$pageToAdd['uid'];
-                    $excludeUids[] = $pageIdInDefaultLanguage;
-                }
-            }
-
-            // This is the regular "non-MountPoint page" case (must happen after the if condition so MountPoint
-            // pages that have been replaced by the Mounted Page will not be added again.
-            if ($isOnSameSite && !in_array($pageIdInDefaultLanguage, $excludeUids, true)) {
-                $pages[] = $row;
-                $excludeUids[] = $pageIdInDefaultLanguage;
-            }
-
-            // Add possible sub-pages prepended with the MountPoint page slug
-            if ($mountPageInformation) {
-                $siteOfMountedPage = $siteMatcher->matchByPageId((int)$mountedPage['uid']);
-                if ($siteOfMountedPage instanceof Site) {
-                    $morePageCandidates = $this->findPageCandidatesOfMountPoint(
-                        $row,
-                        $mountedPage,
-                        $siteOfMountedPage,
-                        $languageId,
-                        $slugCandidates,
-                        $context
-                    );
-                    foreach ($morePageCandidates as $candidate) {
-                        // When called previously this MountPoint page should be skipped
-                        if (in_array((int)$candidate['uid'], $excludeUids, true)) {
-                            continue;
-                        }
-                        $pages[] = $candidate;
-                    }
-                }
-            }
-        }
-        return $pages;
-    }
-
-}

+ 11 - 11
ot_optimizer/Configuration/RequestMiddlewares.php

@@ -4,15 +4,15 @@
  * Register middlewares, which will be triggered at each request
  */
 return [
-    'frontend' => [
-        'typo3/cms-frontend/page-resolver' => [
-            'target' => Opentalent\OtOptimizer\Middleware\Frontend\OtPageResolver::class,
-            'before' => [
-                'typo3/frontendediting/initiator'
-            ],
-            'after' => [
-                'typo3/cms-frontend/preview-simulator'
-            ],
-        ],
-    ],
+//    'frontend' => [
+//        'typo3/cms-frontend/page-resolver' => [
+//            'target' => Opentalent\OtOptimizer\Middleware\Frontend\OtPageResolver::class,
+//            'before' => [
+//                'typo3/frontendediting/initiator'
+//            ],
+//            'after' => [
+//                'typo3/cms-frontend/preview-simulator'
+//            ],
+//        ],
+//    ],
 ];

+ 0 - 4
ot_optimizer/ext_localconf.php

@@ -1,10 +1,6 @@
 <?php
 defined('TYPO3_MODE') || die();
 
-$GLOBALS['TYPO3_CONF_VARS']['SYS']['Objects'][TYPO3\CMS\Core\Routing\PageRouter::class] = [
-    'className' => Opentalent\OtOptimizer\XClass\Core\Routing\OtPageRouter::class
-];
-
 // \TYPO3\CMS\Frontend\Middleware\SiteResolver is overridden but not xclassed here; instead it is
 //   replaced in the middlewares array (@see ot_optimizer/Configuration/RequestMiddlewares.php)
 

+ 2 - 2
ot_templating/Classes/ViewHelpers/PaginationViewHelper.php

@@ -6,9 +6,9 @@ use Opentalent\OtCore\ViewHelpers\OtAbstractViewHelper;
 
 /**
  *
- *     {namespace ot=Opentalent\OtTemplating\ViewHelpers}
+ * {namespace ot=Opentalent\OtTemplating\ViewHelpers}
  *
- *     {ot:pagination(collection:collection)}
+ * {ot:pagination(collection:collection)}
  *
  * @package Opentalent\OtTemplating\ViewHelpers
  */

+ 5 - 5
ot_templating/Resources/Private/Templates/Content/Carousel.html

@@ -13,16 +13,16 @@
 
     <f:section name="Configuration">
         <flux:form id="Carousel"
-                   label="{f:translate(key: 'insert_carousel')}"
-                   description="{f:translate(key: 'insert_carousel')}"
+                   label="LLL:EXT:ot_templating/Resources/Private/Language/locallang.xlf:insert_carousel"
+                   description="LLL:EXT:ot_templating/Resources/Private/Language/locallang.xlf:insert_carousel"
                    extensionName="OtTemplating"
         >
             <flux:form.option.group value="ot_widgets" />
             <flux:form.option.icon value="EXT:ot_templating/Resources/Public/Icons/opentalent-144x144.png" />
 
-            <flux:field.input name="width" eval="trim" default="600" label="{f:translate(key: 'width_in_pixels')}"/>
-            <flux:field.input name="height" eval="trim" default="400" label="{f:translate(key: 'height_in_pixels')}"/>
-            <flux:field.checkbox name="crop" label="{f:translate(key: 'crop_large_images')} ?" default="0"/>
+            <flux:field.input name="width" eval="trim" default="600" label="LLL:EXT:ot_templating/Resources/Private/Language/locallang.xlf:width_in_pixels"/>
+            <flux:field.input name="height" eval="trim" default="400" label="LLL:EXT:ot_templating/Resources/Private/Language/locallang.xlf:height_in_pixels"/>
+            <flux:field.checkbox name="crop" label="LLL:EXT:ot_templating/Resources/Private/Language/locallang.xlf:crop_large_images ?" default="0"/>
 
             <flux:field.inline.fal name="images" minItems="2" maxItems="24"/>
 

+ 4 - 4
ot_templating/Resources/Private/Templates/Content/FCE50-50.html

@@ -7,8 +7,8 @@
 
 <f:section name="Configuration">
     <flux:form id="FCE50-50"
-               label="{f:translate(key: 'container_50-50')}"
-               description="{f:translate(key: 'two_cols_container')}"
+               label="LLL:EXT:ot_templating/Resources/Private/Language/locallang.xlf:container_50-50"
+               description="LLL:EXT:ot_templating/Resources/Private/Language/locallang.xlf:two_cols_container"
                extensionName="OtTemplating"
     >
         <flux:form.option.group value="ot_widgets" />
@@ -16,8 +16,8 @@
     </flux:form>
     <flux:grid>
         <flux:grid.row>
-            <flux:grid.column name="contentLeft" label="{f:translate(key: 'left_column')}" colPos="0"/>
-            <flux:grid.column name="contentRight" label="{f:translate(key: 'right_column')}" colPos="1"/>
+            <flux:grid.column name="contentLeft" label="LLL:EXT:ot_templating/Resources/Private/Language/locallang.xlf:left_column" colPos="0"/>
+            <flux:grid.column name="contentRight" label="LLL:EXT:ot_templating/Resources/Private/Language/locallang.xlf:right_column" colPos="1"/>
         </flux:grid.row>
     </flux:grid>
 </f:section>

+ 6 - 6
ot_templating/Resources/Private/Templates/Content/Faq.html

@@ -12,18 +12,18 @@
 
     <f:section name="Configuration">
         <flux:form id="Faq"
-                   label="{f:translate(key: 'faq')}"
-                   description="{f:translate(key: 'make_your_faq_section')}"
+                   label="LLL:EXT:ot_templating/Resources/Private/Language/locallang.xlf:faq"
+                   description="LLL:EXT:ot_templating/Resources/Private/Language/locallang.xlf:make_your_faq_section"
                    extensionName="OtTemplating"
         >
             <flux:form.option.group value="ot_widgets" />
             <flux:form.option.icon value="EXT:ot_templating/Resources/Public/Icons/opentalent-144x144.png" />
 
             <flux:form.section name="faq">
-                <flux:form.object name="item" label="{f:translate(key: 'question')}">
-                    <flux:field.input name="question" label="{f:translate(key: 'question')}"/>
-                    <flux:field.text name="reponse" label="{f:translate(key: 'answer')}" defaultExtras="richtext[]:rte_transform[mode=ts_css]"/>
-                    <flux:field.checkbox name="open" label="{f:translate(key: 'unfolded')} ?"/>
+                <flux:form.object name="item" label="LLL:EXT:ot_templating/Resources/Private/Language/locallang.xlf:question">
+                    <flux:field.input name="question" label="LLL:EXT:ot_templating/Resources/Private/Language/locallang.xlf:question"/>
+                    <flux:field.text name="reponse" label="LLL:EXT:ot_templating/Resources/Private/Language/locallang.xlf:answer" defaultExtras="richtext[]:rte_transform[mode=ts_css]"/>
+                    <flux:field.checkbox name="open" label="LLL:EXT:ot_templating/Resources/Private/Language/locallang.xlf:unfolded ?"/>
                 </flux:form.object>
             </flux:form.section>
         </flux:form>

+ 2 - 2
ot_templating/Resources/Private/Templates/Content/ShareBar.html

@@ -8,8 +8,8 @@
 
 <f:section name="Configuration">
   <flux:form id="ShareBar"
-             label="{f:translate(key: 'share-bar')}"
-             description="{f:translate(key: 'share-bar-description')}"
+             label="LLL:EXT:ot_templating/Resources/Private/Language/locallang.xlf:share-bar"
+             description="LLL:EXT:ot_templating/Resources/Private/Language/locallang.xlf:share-bar-description"
              extensionName="OtTemplating"
   >
     <flux:form.option.group value="ot_widgets" />