From 6e0c8a922c10559535ff1cb059abd286b91117db Mon Sep 17 00:00:00 2001
From: Lina Wolf <112@linawolf.de>
Date: Sun, 16 Nov 2025 12:52:00 +0100
Subject: [PATCH] [TASK] Consolidate Clipboard labels

The clipboard is used in both the Content > List module
and the Media > Filelist module, but its labels were scattered across several language files and different
 prefixes.

Resolves: #108145
Releases: main
Change-Id: I85b8c46333d527f7a8a2885c362707edcb5a18f9
---

diff --git a/vendor/typo3/cms-backend/Classes/Clipboard/Clipboard.php b/vendor/typo3/cms-backend/Classes/Clipboard/Clipboard.php
index 3bff9f8..c434d14 100644
--- a/vendor/typo3/cms-backend/Classes/Clipboard/Clipboard.php
+++ b/vendor/typo3/cms-backend/Classes/Clipboard/Clipboard.php
@@ -49,6 +49,8 @@
  */
 class Clipboard
 {
+    private const CLIPBOARD_DOMAIN = 'core.components.clipboard';
+    private const GENERAL_ACTIONS_DOMAIN = 'core.actions.general';
     /**
      * Clipboard data kept here
      *
@@ -232,7 +234,7 @@
 
     public function getClipboardData(string $table = ''): array
     {
-        $lang = $this->getLanguageService();
+        $languageService = $this->getLanguageService();
 
         $clipboardData = [
             'current' => $this->current,
@@ -245,8 +247,8 @@
             [
                 'identifier' => 'normal',
                 'info' => $this->getTabInfo('normal', $table),
-                'title' => $lang->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.normal'),
-                'description' => $lang->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.normal-description'),
+                'title' => $languageService->translate('tabs.normal', self::CLIPBOARD_DOMAIN),
+                'description' => $languageService->translate('tabs.normal.description', self::CLIPBOARD_DOMAIN),
                 'items' => $this->current === 'normal' ? $this->getTabItems('normal', $table) : [],
             ],
         ];
@@ -255,8 +257,8 @@
             $tabs[] = [
                 'identifier' => 'tab_' . $a,
                 'info' => $this->getTabInfo('tab_' . $a, $table),
-                'title' => sprintf($lang->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.cliptabs-name'), (string)$a),
-                'description' => $lang->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.cliptabs-description'),
+                'title' => $languageService->translate('tabs.multiple', self::CLIPBOARD_DOMAIN, [(string)$a]),
+                'description' => $languageService->translate('tabs.multiple.description', self::CLIPBOARD_DOMAIN),
                 'items' => $this->current === 'tab_' . $a ? $this->getTabItems('tab_' . $a, $table) : [],
             ];
         }
@@ -448,12 +450,13 @@
      */
     protected function getTabInfo(string $padIdentifier, string $table = ''): string
     {
-        $el = count($this->elFromTable($table, $padIdentifier));
-        if (!$el) {
+        $itemCount = count($this->elFromTable($table, $padIdentifier));
+        if ($itemCount < 1) {
             return '';
         }
-        $modeLabel = ($this->clipData['normal']['mode'] ?? '') === 'copy' ? $this->clipboardLabel('cm.copy') : $this->clipboardLabel('cm.cut');
-        return ' (' . ($padIdentifier === 'normal' ? $modeLabel : htmlspecialchars((string)$el)) . ')';
+        $modeLabel = $this->getLanguageService()->translate($this->clipData['normal']['mode'] ?? '', self::GENERAL_ACTIONS_DOMAIN)
+            ?? $this->getLanguageService()->translate('cut', self::CLIPBOARD_DOMAIN);
+        return ' (' . ($padIdentifier === 'normal' ? $modeLabel : $itemCount) . ')';
     }
 
     /**
@@ -550,17 +553,16 @@
     }
 
     /**
-     * Returns confirm JavaScript message
+     * Returns the localized confirmation message
      *
-     * @param string $table Table name
-     * @param array|string $reference For records its an array, for files its a string (path)
-     * @param string $type Type-code
-     * @return string the text for a confirm message
+     * @param string $table Table name or '_FILE' for files
+     * @param array|string $reference For records it is an array, for files it is a string (path)
+     * @param string $positionType One of 'before', 'after', 'into'
      */
     public function confirmMsgText(
         string $table,
-        $reference,
-        string $type,
+        array|string $reference,
+        string $positionType,
         CountMode $countMode = CountMode::CURRENT,
     ): string {
         if (!$this->getBackendUser()->jsConfirmation(JsConfirmation::COPY_MOVE_PASTE)) {
@@ -572,47 +574,58 @@
             CountMode::ALL => $this->elFromTable(),
         };
 
-        $labelKey = 'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:mess.'
-            . ($this->currentMode() === 'copy' ? 'copy' : 'move')
-            . ($this->current === 'normal' ? '' : 'cb') . '_' . $type;
-        $confirmationMessage = $this->getLanguageService()->sL($labelKey);
-
+        $multipleSelected = false;
         if ($table === '_FILE' && is_string($reference)) {
             $recordTitle = PathUtility::basename($reference);
-            if ($this->current === 'normal') {
+            if ($this->current === 'normal' || count($selectedElements) === 1) {
                 $selectedItem = reset($selectedElements);
-                $selectedRecordTitle = PathUtility::basename($selectedItem);
+                $selectedRecordTitleOrCount = PathUtility::basename($selectedItem);
+                $itemType = $this->getLanguageService()->translate('item.file', self::CLIPBOARD_DOMAIN);
             } else {
-                $selectedRecordTitle = (string)count($selectedElements);
+                $selectedRecordTitleOrCount = (string)count($selectedElements);
+                $multipleSelected = true;
+                $itemType = $this->getLanguageService()->translate('item.files', self::CLIPBOARD_DOMAIN);
             }
         } else {
             $recordTitle = $table === 'pages' && !is_array($reference)
                 ? $GLOBALS['TYPO3_CONF_VARS']['SYS']['sitename']
                 : BackendUtility::getRecordTitle($table, $reference);
-            if ($this->current === 'normal') {
+            if ($this->current === 'normal' || count($selectedElements) === 1) {
                 $selectedItem = $this->getSelectedRecord();
-                $selectedRecordTitle = $selectedItem['_RECORD_TITLE'];
+                $selectedRecordTitleOrCount = $selectedItem['_RECORD_TITLE'];
+                $itemType = $this->getLanguageService()->translate('item.record', self::CLIPBOARD_DOMAIN);
             } else {
-                $selectedRecordTitle = (string)count($selectedElements);
+                $selectedRecordTitleOrCount = (string)count($selectedElements);
+                $multipleSelected = true;
+                $itemType = $this->getLanguageService()->translate('item.records', self::CLIPBOARD_DOMAIN);
             }
         }
 
-        return sprintf(
-            $confirmationMessage,
-            GeneralUtility::fixed_lgd_cs($selectedRecordTitle, 30),
-            GeneralUtility::fixed_lgd_cs($recordTitle, 30)
+        // Labels like "copy.single.into.confirmation" or "move.multiple.after.confirmation"
+        $labelKey = sprintf(
+            '%s.%s.%s.confirmation',
+            $this->currentMode() === 'copy' ? 'copy' : 'move',
+            $multipleSelected ? 'multiple' : 'single',
+            $positionType, // one of 'before', 'after', 'into'
+        );
+
+        return $this->getLanguageService()->translate(
+            $labelKey,
+            self::CLIPBOARD_DOMAIN,
+            [
+                GeneralUtility::fixed_lgd_cs($selectedRecordTitleOrCount, 30),
+                $itemType,
+                GeneralUtility::fixed_lgd_cs($recordTitle, 30),
+            ]
         );
     }
 
     /**
-     * Clipboard label - getting from "EXT:core/Resources/Private/Language/locallang_core.xlf:"
-     *
-     * @param string $key Label Key
-     * @return string htmspecialchared' label
+     * returns a localized label passed
      */
     protected function clipboardLabel(string $key): string
     {
-        return htmlspecialchars($this->getLanguageService()->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:' . $key));
+        return htmlspecialchars($this->getLanguageService()->translate($key, self::CLIPBOARD_DOMAIN) ?? $key);
     }
 
     /*****************************************
diff --git a/vendor/typo3/cms-backend/Classes/ContextMenu/ItemProviders/RecordProvider.php b/vendor/typo3/cms-backend/Classes/ContextMenu/ItemProviders/RecordProvider.php
index 259fb60..a9daaf1 100644
--- a/vendor/typo3/cms-backend/Classes/ContextMenu/ItemProviders/RecordProvider.php
+++ b/vendor/typo3/cms-backend/Classes/ContextMenu/ItemProviders/RecordProvider.php
@@ -348,7 +348,7 @@
         $attributes = [];
         if ($this->backendUser->jsConfirmation(JsConfirmation::COPY_MOVE_PASTE)) {
             $selItem = $this->clipboard->getSelectedRecord();
-            $title = $this->languageService->sL('LLL:EXT:core/Resources/Private/Language/locallang_mod_web_list.xlf:clip_paste');
+            $title = $this->languageService->translate('paste_clipboard', 'core.components.clipboard');
 
             $confirmMessage = sprintf(
                 $this->languageService->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:mess.'
diff --git a/vendor/typo3/cms-backend/Classes/Controller/ClipboardController.php b/vendor/typo3/cms-backend/Classes/Controller/ClipboardController.php
index f76ad38..710093c 100644
--- a/vendor/typo3/cms-backend/Classes/Controller/ClipboardController.php
+++ b/vendor/typo3/cms-backend/Classes/Controller/ClipboardController.php
@@ -35,6 +35,8 @@
 #[AsController]
 class ClipboardController
 {
+    private const CLIPBOARD_DOMAIN = 'core.components.clipboard';
+    private const GENERAL_ACTIONS_DOMAIN = 'core.actions.general';
     private const ALLOWED_ACTIONS = ['getClipboardData'];
 
     protected ResponseFactoryInterface $responseFactory;
@@ -83,14 +85,14 @@
         // Add labels for the panel
         $lang = $this->getLanguageService();
         $clipboardLabels = [
-            'clipboard' => $lang->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:buttons.clipboard'),
-            'copyElements' => $lang->sL('LLL:EXT:core/Resources/Private/Language/locallang_misc.xlf:copyElements'),
-            'moveElements' => $lang->sL('LLL:EXT:core/Resources/Private/Language/locallang_misc.xlf:moveElements'),
-            'copy' => $lang->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:cm.copy'),
-            'cut' => $lang->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:cm.cut'),
-            'info' => $lang->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:cm.info'),
-            'removeAll' => $lang->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:buttons.removeAll'),
-            'removeItem' => $lang->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.removeItem'),
+            'clipboard' => $lang->translate('header', self::CLIPBOARD_DOMAIN),
+            'copyElements' => $lang->translate('copy_items', self::CLIPBOARD_DOMAIN),
+            'moveElements' => $lang->translate('move_items', self::CLIPBOARD_DOMAIN),
+            'copy' => $lang->translate('copy', self::GENERAL_ACTIONS_DOMAIN),
+            'cut' => $lang->translate('cut', self::GENERAL_ACTIONS_DOMAIN),
+            'info' => $lang->translate('info', self::GENERAL_ACTIONS_DOMAIN),
+            'removeAll' => $lang->translate('remove_all', self::CLIPBOARD_DOMAIN),
+            'removeItem' => $lang->translate('remove_item', self::CLIPBOARD_DOMAIN),
         ];
 
         return $this->createResponse([
diff --git a/vendor/typo3/cms-backend/Classes/Controller/RecordListController.php b/vendor/typo3/cms-backend/Classes/Controller/RecordListController.php
index 9b7b901..da7ba3a 100644
--- a/vendor/typo3/cms-backend/Classes/Controller/RecordListController.php
+++ b/vendor/typo3/cms-backend/Classes/Controller/RecordListController.php
@@ -469,12 +469,12 @@
                 $confirmMessage = $clipboard->confirmMsgText('pages', $this->pageContext->pageRecord, 'into', CountMode::ALL);
                 $pasteButton = $this->componentFactory->createLinkButton()
                     ->setHref($clipboard->pasteUrl('', $this->pageContext->pageId))
-                    ->setTitle($lang->sL('LLL:EXT:core/Resources/Private/Language/locallang_mod_web_list.xlf:clip_paste'))
+                    ->setTitle($lang->translate('paste_clipboard', 'core.components.clipboard'))
                     ->setClasses('t3js-modal-trigger')
                     ->setDataAttributes([
                         'severity' => 'warning',
                         'bs-content' => $confirmMessage,
-                        'title' => $lang->sL('LLL:EXT:core/Resources/Private/Language/locallang_mod_web_list.xlf:clip_paste'),
+                        'title' => $lang->translate('paste_clipboard', 'core.components.clipboard'),
                     ])
                     ->setIcon($this->iconFactory->getIcon('actions-document-paste-into', IconSize::SMALL))
                     ->setShowLabelText(true);
@@ -519,7 +519,7 @@
             $viewModeItems[] = $this->componentFactory->createDropDownToggle()
                 ->setActive((bool)$this->moduleData->get('clipBoard'))
                 ->setHref($this->createModuleUri($request, ['clipBoard' => $this->moduleData->get('clipBoard') ? 0 : 1]))
-                ->setLabel($lang->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.view.showClipboard'))
+                ->setLabel($lang->translate('show_clipboard', 'core.components.clipboard'))
                 ->setIcon($this->iconFactory->getIcon('actions-clipboard'));
         }
         if (!empty($viewModeItems)) {
diff --git a/vendor/typo3/cms-backend/Classes/Form/FieldControl/InsertClipboard.php b/vendor/typo3/cms-backend/Classes/Form/FieldControl/InsertClipboard.php
index 18f120b..ae00261 100644
--- a/vendor/typo3/cms-backend/Classes/Form/FieldControl/InsertClipboard.php
+++ b/vendor/typo3/cms-backend/Classes/Form/FieldControl/InsertClipboard.php
@@ -52,7 +52,7 @@
             'element' => $elementName,
             'clipboardItems' => [],
         ];
-        $title = sprintf($languageService->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.clipInsert_db'), count($clipboardElements));
+        $title = sprintf($languageService->translate('insert_multiple', 'core.components.clipboard'), count($clipboardElements));
         foreach ($clipboardElements as $clipboardElement) {
             $dataAttributes['clipboardItems'][] = [
                 'title' => $clipboardElement['title'],
diff --git a/vendor/typo3/cms-backend/Classes/RecordList/DatabaseRecordList.php b/vendor/typo3/cms-backend/Classes/RecordList/DatabaseRecordList.php
index e24323c..c792287 100644
--- a/vendor/typo3/cms-backend/Classes/RecordList/DatabaseRecordList.php
+++ b/vendor/typo3/cms-backend/Classes/RecordList/DatabaseRecordList.php
@@ -2102,7 +2102,7 @@
         ) {
             $clipboardButtons['divider'] = $this->componentFactory->createDropDownDivider();
             $pasteAfterUrl = $this->clipObj->pasteUrl($table, -$record->getUid());
-            $pasteAfterTitle = $this->getLanguageService()->sL('LLL:EXT:core/Resources/Private/Language/locallang_mod_web_list.xlf:clip_pasteAfter');
+            $pasteAfterTitle = $this->getLanguageService()->translate('paste_after_record', 'core.components.clipboard');
             $pasteAfterContent = $this->clipObj->confirmMsgText($table, $record->getRawRecord()?->toArray(), 'after');
             $clipboardButtons['pasteAfter'] = $this->componentFactory->createGenericButton()
                 ->setIcon($this->iconFactory->getIcon('actions-document-paste-after', IconSize::SMALL))
@@ -2119,7 +2119,7 @@
         // Now, looking for elements in general:
         if ($table === 'pages' && $isEditable && $this->clipObj->elFromTable() !== []) {
             $pasteIntoUrl = $this->clipObj->pasteUrl('', $record->getUid());
-            $pasteIntoTitle = $this->getLanguageService()->sL('LLL:EXT:core/Resources/Private/Language/locallang_mod_web_list.xlf:clip_pasteInto');
+            $pasteIntoTitle = $this->getLanguageService()->translate('paste_into_page', 'core.components.clipboard');
             $pasteIntoContent = $this->clipObj->confirmMsgText($table, $record->getRawRecord()?->toArray(), 'into');
             $clipboardButtons['pasteInto'] = $this->componentFactory->createGenericButton()
                 ->setIcon($this->iconFactory->getIcon('actions-document-paste-into', IconSize::SMALL))
@@ -3396,21 +3396,21 @@
                 <button type="button"
                     class="btn btn-sm btn-default"
                     ' . ($this->clipObj->current === 'normal' ? 'disabled' : '') . '
-                    title="' . htmlspecialchars($lang->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:cm.transferToClipboard')) . '"
+                    title="' . htmlspecialchars($lang->translate('add_to_clipboard', 'core.components.clipboard')) . '"
                     data-multi-record-selection-action="copyMarked"
                 >
                     ' . $this->iconFactory->getIcon('actions-edit-copy', IconSize::SMALL)->render() . '
-                    ' . htmlspecialchars($lang->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:cm.transferToClipboard')) . '
+                    ' . htmlspecialchars($lang->translate('add_to_clipboard', 'core.components.clipboard')) . '
                 </button>';
             $removeMarked = '
                 <button type="button"
                     class="btn btn-sm btn-default"
                     ' . ($this->clipObj->current === 'normal' ? 'disabled' : '') . '
-                    title="' . htmlspecialchars($lang->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:cm.removeFromClipboard')) . '"
+                    title="' . htmlspecialchars($lang->translate('remove_from_clipboard', 'core.components.clipboard')) . '"
                     data-multi-record-selection-action="removeMarked"
                 >
                     ' . $this->iconFactory->getIcon('actions-minus', IconSize::SMALL)->render() . '
-                    ' . htmlspecialchars($lang->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:cm.removeFromClipboard')) . '
+                    ' . htmlspecialchars($lang->translate('remove_from_clipboard', 'core.components.clipboard')) . '
                 </button>';
             // Add "copy marked" after "edit", or in case "edit" is not set, as first item
             if (!isset($actions['edit'])) {
diff --git a/vendor/typo3/cms-core/Resources/Private/Language/actions/general.xlf b/vendor/typo3/cms-core/Resources/Private/Language/actions/general.xlf
new file mode 100644
index 0000000..a44acfa
--- /dev/null
+++ b/vendor/typo3/cms-core/Resources/Private/Language/actions/general.xlf
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<xliff version="2.0" xmlns="urn:oasis:names:tc:xliff:document:2.0" srcLang="en">
+	<file id="f1">
+		<unit id="copy">
+			<segment>
+				<source>Copy</source>
+			</segment>
+		</unit>
+		<unit id="cut">
+			<segment>
+				<source>Cut</source>
+			</segment>
+		</unit>
+		<unit id="info">
+			<segment>
+				<source>Info</source>
+			</segment>
+		</unit>
+    </file>
+</xliff>
diff --git a/vendor/typo3/cms-core/Resources/Private/Language/components/clipboard.xlf b/vendor/typo3/cms-core/Resources/Private/Language/components/clipboard.xlf
new file mode 100644
index 0000000..81d68e8
--- /dev/null
+++ b/vendor/typo3/cms-core/Resources/Private/Language/components/clipboard.xlf
@@ -0,0 +1,171 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<xliff version="2.0" xmlns="urn:oasis:names:tc:xliff:document:2.0" srcLang="en">
+	<file id="f1">
+		<!-- Component -->
+		<unit id="header">
+			<segment>
+				<source>Clipboard</source>
+			</segment>
+		</unit>
+		<!-- Buttons -->
+		<unit id="remove_all">
+			<segment>
+				<source>Remove all</source>
+			</segment>
+		</unit>
+		<unit id="remove_item">
+			<segment>
+				<source>Remove item</source>
+			</segment>
+		</unit>
+		<unit id="copy_items">
+			<segment>
+				<source>Copy items</source>
+			</segment>
+		</unit>
+		<unit id="move_items">
+			<segment>
+				<source>Move items</source>
+			</segment>
+		</unit>
+		<!-- Tabs -->
+		<unit id="tabs.normal">
+			<segment>
+				<source>Normal – single selection</source>
+			</segment>
+		</unit>
+		<unit id="tabs.normal.description">
+			<segment>
+				<source>Select and edit one item at a time.</source>
+			</segment>
+		</unit>
+		<unit id="tabs.multiple">
+			<segment>
+				<source>Clipboard #%s</source>
+			</segment>
+		</unit>
+		<unit id="tabs.multiple.description">
+			<segment>
+				<source>Select and edit multiple items.</source>
+			</segment>
+		</unit>
+		<!-- Confirmation dialogues -->
+		<unit id="copy.single.into.confirmation">
+			<segment>
+				<source>Copy %2$s "%1$s" into "%3$s"?</source>
+			</segment>
+		</unit>
+		<unit id="copy.single.before.confirmation">
+			<segment>
+				<source>Copy %2$s "%1$s" before "%3$s"?</source>
+			</segment>
+		</unit>
+		<unit id="copy.single.after.confirmation">
+			<segment>
+				<source>Copy %2$s "%1$s" after "%3$s"?</source>
+			</segment>
+		</unit>
+		<unit id="move.single.into.confirmation">
+			<segment>
+				<source>Move %2$s "%1$s" into "%3$s"?</source>
+			</segment>
+		</unit>
+		<unit id="move.single.before.confirmation">
+			<segment>
+				<source>Move %2$s "%1$s" before "%3$s"?</source>
+			</segment>
+		</unit>
+		<unit id="move.single.after.confirmation">
+			<segment>
+				<source>Move %2$s "%1$s" after "%3$s"?</source>
+			</segment>
+		</unit>
+		<unit id="copy.multiple.into.confirmation">
+			<segment>
+				<source>Copy all %1$s %2$s into "%3$s"?</source>
+			</segment>
+		</unit>
+		<unit id="copy.multiple.after.confirmation">
+			<segment>
+				<source>Copy all %1$s %2$s after "%3$s"?</source>
+			</segment>
+		</unit>
+		<unit id="move.multiple.into.confirmation">
+			<segment>
+				<source>Move all %1$s %2$s into "%3$s"?</source>
+			</segment>
+		</unit>
+		<unit id="move.multiple.before.confirmation">
+			<segment>
+				<source>Move all %1$s %2$s before "%3$s"?</source>
+			</segment>
+		</unit>
+		<unit id="move.multiple.after.confirmation">
+			<segment>
+				<source>Move all %1$s %2$s after "%3$s"?</source>
+			</segment>
+		</unit>
+		<!-- item types -->
+		<unit id="item.file">
+			<segment>
+				<source>file</source>
+			</segment>
+		</unit>
+		<unit id="item.files">
+			<segment>
+				<source>files</source>
+			</segment>
+		</unit>
+		<unit id="item.record">
+			<segment>
+				<source>record</source>
+			</segment>
+		</unit>
+		<unit id="item.records">
+			<segment>
+				<source>records</source>
+			</segment>
+		</unit>
+		<!-- Actions -->
+		<unit id="paste_clipboard">
+			<segment>
+				<source>Paste from clipboard</source>
+			</segment>
+		</unit>
+		<unit id="paste_after_record">
+			<segment>
+				<source>Paste after this record</source>
+			</segment>
+		</unit>
+		<unit id="paste_into_page">
+			<segment>
+				<source>Paste into this page</source>
+			</segment>
+		</unit>
+		<unit id="paste_into_folder">
+			<segment>
+				<source>Paste into this folder</source>
+			</segment>
+		</unit>
+		<unit id="add_to_clipboard">
+			<segment>
+				<source>Add to clipboard</source>
+			</segment>
+		</unit>
+		<unit id="remove_from_clipboard">
+			<segment>
+				<source>Remove from clipboard</source>
+			</segment>
+		</unit>
+		<unit id="show_clipboard">
+			<segment>
+				<source>Show clipboard</source>
+			</segment>
+		</unit>
+		<unit id="insert_multiple">
+			<segment>
+				<source>Insert %s record(s) from the clipboard</source>
+			</segment>
+		</unit>
+	</file>
+</xliff>
diff --git a/vendor/typo3/cms-core/Resources/Private/Language/locallang_core.xlf b/vendor/typo3/cms-core/Resources/Private/Language/locallang_core.xlf
index d11e15b..fdcdbac 100644
--- a/vendor/typo3/cms-core/Resources/Private/Language/locallang_core.xlf
+++ b/vendor/typo3/cms-core/Resources/Private/Language/locallang_core.xlf
@@ -211,7 +211,7 @@
 			<trans-unit id="labels.view.showThumbnails">
 				<source>Show thumbnails</source>
 			</trans-unit>
-			<trans-unit id="labels.view.showClipboard">
+			<trans-unit id="labels.view.showClipboard" x-unused-since="14.0">
 				<source>Show clipboard</source>
 			</trans-unit>
 			<trans-unit id="labels.view.showSearch">
@@ -424,10 +424,10 @@
 			<trans-unit id="labels.browse_db">
 				<source>Browse for records</source>
 			</trans-unit>
-			<trans-unit id="labels.clipInsert_file">
+			<trans-unit id="labels.clipInsert_file" x-unused-since="14.0">
 				<source>Insert %s file(s) from the clipboard</source>
 			</trans-unit>
-			<trans-unit id="labels.clipInsert_db">
+			<trans-unit id="labels.clipInsert_db" x-unused-since="14.0">
 				<source>Insert %s record(s) from the clipboard</source>
 			</trans-unit>
 			<trans-unit id="labels.generalOptions">
@@ -445,34 +445,34 @@
 			<trans-unit id="labels.noMatchingLabel">
 				<source>MISSING LABEL ("%s")</source>
 			</trans-unit>
-			<trans-unit id="labels.thumbmode_clip">
+			<trans-unit id="labels.thumbmode_clip" x-unused-since="14.0">
 				<source>Show Thumbnails on ClipBoard</source>
 			</trans-unit>
 			<trans-unit id="labels.copymode">
 				<source>Copy items instead of moving them</source>
 			</trans-unit>
-			<trans-unit id="labels.normal">
+			<trans-unit id="labels.normal" x-unused-since="14.0">
 				<source>Normal (single record mode)</source>
 			</trans-unit>
-			<trans-unit id="labels.normal-description">
+			<trans-unit id="labels.normal-description" x-unused-since="14.0">
 				<source>"Normal" clipboard allows to copy/move one record at time.</source>
 			</trans-unit>
-			<trans-unit id="labels.cliptabs">
+			<trans-unit id="labels.cliptabs" x-unused-since="14.0">
 				<source>Clipboard #</source>
 			</trans-unit>
-			<trans-unit id="labels.cliptabs-name">
+			<trans-unit id="labels.cliptabs-name" x-unused-since="14.0">
 				<source>Clipboard #%s (multi-selection mode)</source>
 			</trans-unit>
-			<trans-unit id="labels.cliptabs-description">
+			<trans-unit id="labels.cliptabs-description" x-unused-since="14.0">
 				<source>This clipboard allows to select and edit/copy/move multiple records at once. Choose it to show a checkbox by each record.</source>
 			</trans-unit>
-			<trans-unit id="labels.clipboard.delete_elements">
+			<trans-unit id="labels.clipboard.delete_elements" x-unused-since="14.0">
 				<source>Delete elements</source>
 			</trans-unit>
-			<trans-unit id="labels.clipboard.clear_clipboard">
+			<trans-unit id="labels.clipboard.clear_clipboard" x-unused-since="14.0">
 				<source>Clear clipboard</source>
 			</trans-unit>
-			<trans-unit id="labels.removeItem">
+			<trans-unit id="labels.removeItem" x-unused-since="14.0">
 				<source>Remove element</source>
 			</trans-unit>
 			<trans-unit id="labels.holdDownCTRL">
@@ -898,7 +898,7 @@
 			<trans-unit id="mess.delete.title">
 				<source>Delete this record?</source>
 			</trans-unit>
-			<trans-unit id="mess.deleteClip">
+			<trans-unit id="mess.deleteClip" x-unused-since="14.0">
 				<source>Are you sure you want to delete ALL referenced elements (%s) on the clipboard?</source>
 			</trans-unit>
 			<trans-unit id="mess.refresh_login" xml:space="preserve">
@@ -974,31 +974,33 @@
 			<trans-unit id="mess.refreshRequired.confirm">
 				<source>Save and refresh</source>
 			</trans-unit>
-			<trans-unit id="mess.move_into">
+			<!-- todo: Replace the following messages with messages from core.component.clipboard once typescript supports language domains -->
+			<trans-unit id="mess.move_into"> <!-- core.component.clipboard:move.single.into.confirmation -->
 				<source>Move "%s" into "%s"?</source>
 			</trans-unit>
-			<trans-unit id="mess.move_before">
+			<trans-unit id="mess.move_before"> <!-- core.component.clipboard:move.single.before.confirmation -->
 				<source>Move "%s" to before "%s"?</source>
 			</trans-unit>
-			<trans-unit id="mess.move_after">
+			<trans-unit id="mess.move_after">  <!-- core.component.clipboard:move.single.after.confirmation -->
 				<source>Move "%s" to after "%s"?</source>
 			</trans-unit>
-			<trans-unit id="mess.copy_into">
+			<!-- end: Replace the following messages with messages from core.component.clipboard once typescript supports language domains -->
+			<trans-unit id="mess.copy_into" x-unused-since="14.0">
 				<source>Copy "%s" into "%s"?</source>
 			</trans-unit>
-			<trans-unit id="mess.copy_after">
+			<trans-unit id="mess.copy_after" x-unused-since="14.0">
 				<source>Copy "%s" to after "%s"?</source>
 			</trans-unit>
-			<trans-unit id="mess.copycb_into">
+			<trans-unit id="mess.copycb_into" x-unused-since="14.0">
 				<source>Copy all elements (%s) from the clipboard into "%s"?</source>
 			</trans-unit>
-			<trans-unit id="mess.copycb_after">
+			<trans-unit id="mess.copycb_after" x-unused-since="14.0">
 				<source>Copy all elements (%s) from the clipboard to the position after "%s"?</source>
 			</trans-unit>
-			<trans-unit id="mess.movecb_into">
+			<trans-unit id="mess.movecb_into" x-unused-since="14.0">
 				<source>Move all elements (%s) from the clipboard into "%s"?</source>
 			</trans-unit>
-			<trans-unit id="mess.movecb_after">
+			<trans-unit id="mess.movecb_after" x-unused-since="14.0">
 				<source>Move all elements (%s) from the clipboard to the position after "%s"?</source>
 			</trans-unit>
 			<trans-unit id="rm.menu">
@@ -1134,10 +1136,10 @@
 			<trans-unit id="buttons.clear">
 				<source>Clear</source>
 			</trans-unit>
-			<trans-unit id="buttons.clipboard">
+			<trans-unit id="buttons.clipboard" x-unused-since="14.0">
 				<source>Clipboard</source>
 			</trans-unit>
-			<trans-unit id="buttons.removeAll">
+			<trans-unit id="buttons.removeAll" x-unused-since="14.0">
 				<source>Remove all</source>
 			</trans-unit>
 			<trans-unit id="buttons.toggleLinkExplanation">
@@ -1326,10 +1328,10 @@
 			<trans-unit id="cm.history">
 				<source>History/Undo</source>
 			</trans-unit>
-			<trans-unit id="cm.transferToClipboard">
+			<trans-unit id="cm.transferToClipboard" x-unused-since="14.0">
 				<source>Transfer to clipboard</source>
 			</trans-unit>
-			<trans-unit id="cm.removeFromClipboard">
+			<trans-unit id="cm.removeFromClipboard" x-unused-since="14.0">
 				<source>Remove from clipboard</source>
 			</trans-unit>
 			<trans-unit id="sortable.dragmove">
diff --git a/vendor/typo3/cms-core/Resources/Private/Language/locallang_misc.xlf b/vendor/typo3/cms-core/Resources/Private/Language/locallang_misc.xlf
index 16f8bee..455e1d3 100644
--- a/vendor/typo3/cms-core/Resources/Private/Language/locallang_misc.xlf
+++ b/vendor/typo3/cms-core/Resources/Private/Language/locallang_misc.xlf
@@ -63,10 +63,10 @@
 			<trans-unit id="moveElementToHere">
 				<source>Move element to this position</source>
 			</trans-unit>
-			<trans-unit id="moveElements">
+			<trans-unit id="moveElements" x-unused-since="14.0">
 				<source>Move elements</source>
 			</trans-unit>
-			<trans-unit id="copyElements">
+			<trans-unit id="copyElements" x-unused-since="14.0">
 				<source>Copy elements</source>
 			</trans-unit>
 			<trans-unit id="copyElementToHere">
diff --git a/vendor/typo3/cms-core/Resources/Private/Language/locallang_mod_web_list.xlf b/vendor/typo3/cms-core/Resources/Private/Language/locallang_mod_web_list.xlf
index d04be13..c80d4d4 100644
--- a/vendor/typo3/cms-core/Resources/Private/Language/locallang_mod_web_list.xlf
+++ b/vendor/typo3/cms-core/Resources/Private/Language/locallang_mod_web_list.xlf
@@ -12,25 +12,26 @@
 			<trans-unit id="mlang_tabs_tab" x-unused-since="14.0">
 				<source>List</source>
 			</trans-unit>
-			<trans-unit id="clip_pasteAfter">
+			<trans-unit id="clip_pasteAfter" x-unused-since="14.0">
 				<source>Paste after: Clipboard content is inserted after this record</source>
 			</trans-unit>
-			<trans-unit id="clip_pasteInto">
+			<trans-unit id="clip_pasteInto" x-unused-since="14.0">
 				<source>Paste into: Clipboard content is inserted on this page</source>
 			</trans-unit>
-			<trans-unit id="clip_paste">
+			<trans-unit id="clip_paste" x-unused-since="14.0">
 				<source>Paste in clipboard content</source>
 			</trans-unit>
-			<trans-unit id="clip_markRecords">
+			<trans-unit id="clip_markRecords" x-unused-since="14.0">
 				<source>Mark All/Mark none</source>
 			</trans-unit>
-			<trans-unit id="clip_selectMarked">
+			<trans-unit id="clip_selectMarked" x-unused-since="14.0">
 				<source>Transfer the selection of records to clipboard</source>
 			</trans-unit>
+			<!-- todo: The following language strings are bulk edit related and should go to the content_list modules language file -->
 			<trans-unit id="clip_duplicates">
 				<source>Mark duplicates</source>
 			</trans-unit>
-			<trans-unit id="clip_editMarked">
+			<trans-unit id="clip_editMarked" x-unused-since="14.0">
 				<source>Edit marked</source>
 			</trans-unit>
 			<trans-unit id="clip_deleteMarked">
@@ -39,6 +40,7 @@
 			<trans-unit id="clip_deleteMarkedWarning">
 				<source>Are you sure you want to delete all marked records from the table '%s'?</source>
 			</trans-unit>
+			<!-- end: The following language strings are bulk edit related and should go to the content_list modules language file -->
 			<trans-unit id="showInfo">
 				<source>Info</source>
 			</trans-unit>
@@ -117,7 +119,7 @@
 			<trans-unit id="collapseExpandTable">
 				<source>Collapse and expand records of table "%s"</source>
 			</trans-unit>
-			<trans-unit id="showClipBoard">
+			<trans-unit id="showClipBoard" x-unused-since="14.0">
 				<source>Show clipboard</source>
 			</trans-unit>
 			<trans-unit id="editShownColumns">
diff --git a/vendor/typo3/cms-filelist/Classes/ContextMenu/ItemProviders/FileProvider.php b/vendor/typo3/cms-filelist/Classes/ContextMenu/ItemProviders/FileProvider.php
index ad7aed3..61b4f7b 100644
--- a/vendor/typo3/cms-filelist/Classes/ContextMenu/ItemProviders/FileProvider.php
+++ b/vendor/typo3/cms-filelist/Classes/ContextMenu/ItemProviders/FileProvider.php
@@ -454,7 +454,7 @@
             $selItem = reset($elArr);
             $fileOrFolderInClipBoard = GeneralUtility::makeInstance(ResourceFactory::class)->retrieveFileOrFolderObject($selItem);
 
-            $title = $this->languageService->sL('LLL:EXT:core/Resources/Private/Language/locallang_mod_web_list.xlf:clip_paste');
+            $title = $this->languageService->translate('paste_clipboard', 'core.components.clipboard');
 
             $confirmMessage = sprintf(
                 $this->languageService->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:mess.'
diff --git a/vendor/typo3/cms-filelist/Classes/Controller/FileListController.php b/vendor/typo3/cms-filelist/Classes/Controller/FileListController.php
index a31ddc7..e45b27f 100644
--- a/vendor/typo3/cms-filelist/Classes/Controller/FileListController.php
+++ b/vendor/typo3/cms-filelist/Classes/Controller/FileListController.php
@@ -527,7 +527,7 @@
             $viewModeItems[] = GeneralUtility::makeInstance(DropDownToggle::class)
                 ->setActive((bool)$this->moduleData->get('clipBoard'))
                 ->setHref($this->filelist->createModuleUri(['clipBoard' => $this->moduleData->get('clipBoard') ? 0 : 1]))
-                ->setLabel($lang->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.view.showClipboard'))
+                ->setLabel($lang->translate('show_clipboard', 'core.components.clipboard'))
                 ->setIcon($this->iconFactory->getIcon('actions-clipboard'));
         }
         if (($this->getBackendUser()->getTSConfig()['options.']['file_list.']['displayColumnSelector'] ?? true)
@@ -689,7 +689,7 @@
                 if ($addPasteButton) {
                     $confirmText = $this->filelist->clipObj
                         ->confirmMsgText('_FILE', $this->folderObject->getReadablePath(), 'into');
-                    $pastButtonTitle = $lang->sL('LLL:EXT:filelist/Resources/Private/Language/locallang_mod_file_list.xlf:clip_paste');
+                    $pastButtonTitle = $lang->translate('paste_clipboard', 'core.components.clipboard');
                     $pasteButton = $this->componentFactory->createLinkButton()
                         ->setHref($this->filelist->clipObj
                             ->pasteUrl('_FILE', $this->folderObject->getCombinedIdentifier()))
diff --git a/vendor/typo3/cms-filelist/Classes/FileList.php b/vendor/typo3/cms-filelist/Classes/FileList.php
index ca2110c..c4277c0 100644
--- a/vendor/typo3/cms-filelist/Classes/FileList.php
+++ b/vendor/typo3/cms-filelist/Classes/FileList.php
@@ -1384,7 +1384,7 @@
             }
         }
 
-        $pasteTitle = $this->getLanguageService()->sL('LLL:EXT:filelist/Resources/Private/Language/locallang_mod_file_list.xlf:clip_pasteInto');
+        $pasteTitle = $this->getLanguageService()->translate('paste_into_folder', 'core.components.clipboard');
         $button = $this->componentFactory->createLinkButton();
         $button->setTitle($pasteTitle);
         $button->setHref($this->clipObj->pasteUrl('_FILE', $resourceView->getIdentifier()));
diff --git a/vendor/typo3/cms-filelist/Resources/Private/Language/locallang_mod_file_list.xlf b/vendor/typo3/cms-filelist/Resources/Private/Language/locallang_mod_file_list.xlf
index 95a417e..71135cc 100644
--- a/vendor/typo3/cms-filelist/Resources/Private/Language/locallang_mod_file_list.xlf
+++ b/vendor/typo3/cms-filelist/Resources/Private/Language/locallang_mod_file_list.xlf
@@ -6,10 +6,10 @@
 			<trans-unit id="clipBoard">
 				<source>Show clipboard</source>
 			</trans-unit>
-			<trans-unit id="clip_paste">
+			<trans-unit id="clip_paste" x-unused-since="14.0">
 				<source>Paste in clipboard content</source>
 			</trans-unit>
-			<trans-unit id="clip_pasteInto">
+			<trans-unit id="clip_pasteInto" x-unused-since="14.0">
 				<source>Paste into: Clipboard content is inserted into this folder</source>
 			</trans-unit>
 			<trans-unit id="editMarked">
@@ -21,10 +21,10 @@
 			<trans-unit id="deleteMarked">
 				<source>Delete marked items</source>
 			</trans-unit>
-			<trans-unit id="clip_selectMarked">
+			<trans-unit id="clip_selectMarked" x-unused-since="14.0">
 				<source>Transfer to clipboard</source>
 			</trans-unit>
-			<trans-unit id="clip_deleteMarked">
+			<trans-unit id="clip_deleteMarked" x-unused-since="14.0">
 				<source>Remove from clipboard</source>
 			</trans-unit>
 			<trans-unit id="deleteMarkedWarning">
diff --git a/vendor/typo3/cms-filelist/Resources/Private/Templates/File/List.fluid.html b/vendor/typo3/cms-filelist/Resources/Private/Templates/File/List.fluid.html
index 682f0a2..7ef0d27 100644
--- a/vendor/typo3/cms-filelist/Resources/Private/Templates/File/List.fluid.html
+++ b/vendor/typo3/cms-filelist/Resources/Private/Templates/File/List.fluid.html
@@ -124,13 +124,13 @@
                             <div class="col">
                                 <div class="btn-group">
                                     <button type="button" class="btn btn-default btn-sm" {f:if(condition: '{enableClipBoard.mode} == normal', then: 'disabled')} data-multi-record-selection-action="copyMarked">
-                                        <span title="{f:translate(key: 'LLL:EXT:filelist/Resources/Private/Language/locallang_mod_file_list.xlf:clip_selectMarked')}">
-                                            <core:icon identifier="actions-edit-copy" size="small" /> <f:translate key="LLL:EXT:filelist/Resources/Private/Language/locallang_mod_file_list.xlf:clip_selectMarked" />
+                                        <span title="{f:translate(key: 'add_to_clipboard', domain: 'core.components.clipboard')}">
+                                            <core:icon identifier="actions-edit-copy" size="small" /> {f:translate(key: 'add_to_clipboard', domain: 'core.components.clipboard')}
                                         </span>
                                     </button>
                                     <button type="button" class="btn btn-default btn-sm" {f:if(condition: '{enableClipBoard.mode} == normal', then: 'disabled')} data-multi-record-selection-action="removeMarked">
-                                        <span title="{f:translate(key: 'LLL:EXT:filelist/Resources/Private/Language/locallang_mod_file_list.xlf:clip_deleteMarked')}">
-                                            <core:icon identifier="actions-minus" size="small" /> <f:translate key="LLL:EXT:filelist/Resources/Private/Language/locallang_mod_file_list.xlf:clip_deleteMarked" />
+                                        <span title="{f:translate(key: 'remove_from_clipboard', domain: 'core.components.clipboard')}">
+                                            <core:icon identifier="actions-minus" size="small" /> {f:translate(key: 'remove_from_clipboard', domain: 'core.components.clipboard')}
                                         </span>
                                     </button>
                                 </div>
