diff --git a/Classes/GraphQL/Resolver/Type/MutationResolver.php b/Classes/GraphQL/Resolver/Type/MutationResolver.php
index b527f193e..f3124d859 100644
--- a/Classes/GraphQL/Resolver/Type/MutationResolver.php
+++ b/Classes/GraphQL/Resolver/Type/MutationResolver.php
@@ -22,6 +22,7 @@
use Flowpack\Media\Ui\Exception;
use Flowpack\Media\Ui\GraphQL\Context\AssetSourceContext;
use Neos\Flow\Annotations as Flow;
+use Neos\Flow\I18n\Translator;
use Neos\Flow\Persistence\Exception\IllegalObjectTypeException;
use Neos\Flow\Persistence\Exception\InvalidQueryException;
use Neos\Flow\Persistence\PersistenceManagerInterface;
@@ -47,6 +48,10 @@
*/
class MutationResolver implements ResolverInterface
{
+ protected const STATE_ADDED = 'ADDED';
+ protected const STATE_EXISTS = 'EXISTS';
+ protected const STATE_ERROR = 'ERROR';
+
/**
* @Flow\Inject
* @var AssetRepository
@@ -364,7 +369,7 @@ public function uploadFile($_, array $variables): array
$assetCollectionId = $variables['assetCollectionId'] ?? null;
$success = false;
- $result = 'ERROR';
+ $result = self::STATE_ERROR;
$filename = $file->getClientFilename();
try {
@@ -379,7 +384,7 @@ public function uploadFile($_, array $variables): array
$resource->setMediaType($file->getClientMediaType());
if ($this->assetRepository->findOneByResourceSha1($resource->getSha1())) {
- $result = 'EXISTS';
+ $result = self::STATE_EXISTS;
} else {
try {
$className = $this->mappingStrategy->map($resource);
@@ -403,10 +408,10 @@ public function uploadFile($_, array $variables): array
}
$this->assetRepository->add($asset);
- $result = 'ADDED';
+ $result = self::STATE_ADDED;
$success = true;
} else {
- $result = 'EXISTS';
+ $result = self::STATE_EXISTS;
}
} catch (IllegalObjectTypeException $e) {
$this->systemLogger->error('Type of uploaded file cannot be stored');
@@ -479,7 +484,7 @@ public function replaceAsset($_, array $variables, AssetSourceContext $assetSour
}
$success = false;
- $result = 'ERROR';
+ $result = self::STATE_ERROR;
$sourceMediaType = MediaTypes::parseMediaType($asset->getMediaType());
$replacementMediaType = MediaTypes::parseMediaType($file->getClientMediaType());
$filename = $file->getClientFilename();
@@ -806,4 +811,5 @@ public function deleteTag($_, array $variables): bool
return true;
}
+
}
diff --git a/Resources/Private/JavaScript/asset-collections/src/components/DeleteButton.tsx b/Resources/Private/JavaScript/asset-collections/src/components/DeleteButton.tsx
index ea65d90cb..781b638c9 100644
--- a/Resources/Private/JavaScript/asset-collections/src/components/DeleteButton.tsx
+++ b/Resources/Private/JavaScript/asset-collections/src/components/DeleteButton.tsx
@@ -28,7 +28,7 @@ const DeleteButton: React.FC = () => {
if (!canDeleteTag) return;
// TODO: Implement `obtainApprovalToDeleteCollection` for deleting
const confirm = window.confirm(
- translate('action.deleteTag.confirm', 'Do you really want to delete the tag ' + selectedTag.label, [
+ translate('action.deleteTag.confirm', `Do you really want to delete the tag "${selectedTag.label}"?`, [
selectedTag.label,
])
);
diff --git a/Resources/Private/JavaScript/asset-editing/src/components/EditAssetDialog.tsx b/Resources/Private/JavaScript/asset-editing/src/components/EditAssetDialog.tsx
index 645b73baa..85040c57e 100644
--- a/Resources/Private/JavaScript/asset-editing/src/components/EditAssetDialog.tsx
+++ b/Resources/Private/JavaScript/asset-editing/src/components/EditAssetDialog.tsx
@@ -101,7 +101,7 @@ const EditAssetDialog: React.FC = () => {
{translate('uploadDialog.generateRedirects', 'Generate redirects')}
)}
- {loading &&
{translate('EditAssetDialog.updating', 'Updating…')}
}
+ {loading && {translate('editAssetDialog.updating', 'Updating…')}
}
);
diff --git a/Resources/Private/JavaScript/asset-tags/src/components/CreateTagDialog.tsx b/Resources/Private/JavaScript/asset-tags/src/components/CreateTagDialog.tsx
index 6fc01f3df..760c4a58e 100644
--- a/Resources/Private/JavaScript/asset-tags/src/components/CreateTagDialog.tsx
+++ b/Resources/Private/JavaScript/asset-tags/src/components/CreateTagDialog.tsx
@@ -26,10 +26,10 @@ const CreateTagDialog: React.FC = () => {
setDialogState((state) => ({ ...state, visible: false }));
createTag(dialogState.label, selectedAssetCollection?.id)
.then(() => {
- Notify.ok(translate('assetCollectionActions.create.success', 'Tag was created'));
+ Notify.ok(translate('tagActions.create.success', 'Tag was created'));
})
.catch((error) => {
- Notify.error(translate('assetCollectionActions.create.error', 'Failed to create tag'), error.message);
+ Notify.error(translate('tagActions.create.error', 'Failed to create tag'), error.message);
});
}, [Notify, setDialogState, createTag, dialogState, translate, selectedAssetCollection]);
const setLabel = useCallback((label) => setDialogState((state) => ({ ...state, label })), [setDialogState]);
diff --git a/Resources/Private/JavaScript/asset-upload/src/components/FilePreview.module.css b/Resources/Private/JavaScript/asset-upload/src/components/FilePreview.module.css
index 7b27b4bb0..82a53a17d 100644
--- a/Resources/Private/JavaScript/asset-upload/src/components/FilePreview.module.css
+++ b/Resources/Private/JavaScript/asset-upload/src/components/FilePreview.module.css
@@ -1,22 +1,7 @@
-.fileList {
- margin-top: var(--theme-spacing-Full);
- display: flex;
- flex-direction: row;
- flex-wrap: wrap;
-}
-
-.fileListHeader {
- flex: 1 1 100%;
- margin-bottom: var(--theme-spacing-Full);
- font-size: var(--theme-fontSize-base);
-}
-
.thumb {
display: inline-flex;
border-radius: 2px;
border: 1px solid #eaeaea;
- margin-bottom: var(--theme-spacing-Half);
- margin-right: var(--theme-spacing-Half);
width: 100px;
height: 100px;
padding: var(--theme-spacing-Quarter);
@@ -35,6 +20,7 @@
.thumbInner span {
margin-left: var(--theme-spacing-Half);
user-select: none;
+ word-break: break-all;
}
.img {
diff --git a/Resources/Private/JavaScript/asset-upload/src/components/FilePreview.tsx b/Resources/Private/JavaScript/asset-upload/src/components/FilePreview.tsx
index 7533aea7e..b119cac56 100644
--- a/Resources/Private/JavaScript/asset-upload/src/components/FilePreview.tsx
+++ b/Resources/Private/JavaScript/asset-upload/src/components/FilePreview.tsx
@@ -4,6 +4,7 @@ import cx from 'classnames';
import { Icon } from '@neos-project/react-ui-components';
import classes from './FilePreview.module.css';
+import { useIntl } from '@media-ui/core';
interface FilePreviewProps {
file: UploadedFile;
@@ -12,10 +13,10 @@ interface FilePreviewProps {
}
const FilePreview: React.FC = ({ file, loading = false, fileState }: FilePreviewProps) => {
+ const { translate } = useIntl();
const success = fileState?.success;
const error = fileState && !success;
- // TODO: Output helpful localised messages for results 'EXISTS', 'ADDED', 'ERROR'
return (
= ({ file, loading = false, fileSt
{loading && }
{success && }
{error && }
- {fileState?.result && {fileState.result}}
+ {fileState?.result && (
+ {translate(`uploadDialog.fileList.${fileState.result.toLowerCase()}`)}
+ )}
);
diff --git a/Resources/Private/JavaScript/asset-upload/src/components/PreviewSection.module.css b/Resources/Private/JavaScript/asset-upload/src/components/PreviewSection.module.css
index b5ffea535..a8ae7a43d 100644
--- a/Resources/Private/JavaScript/asset-upload/src/components/PreviewSection.module.css
+++ b/Resources/Private/JavaScript/asset-upload/src/components/PreviewSection.module.css
@@ -3,10 +3,10 @@
display: flex;
flex-direction: row;
flex-wrap: wrap;
+ gap: var(--theme-spacing-Full);
}
.fileListHeader {
flex: 1 1 100%;
- margin-bottom: var(--theme-spacing-Full);
font-size: var(--theme-fontSize-base);
}
diff --git a/Resources/Private/JavaScript/asset-upload/src/components/PreviewSection.tsx b/Resources/Private/JavaScript/asset-upload/src/components/PreviewSection.tsx
index 74701590c..efb4345de 100644
--- a/Resources/Private/JavaScript/asset-upload/src/components/PreviewSection.tsx
+++ b/Resources/Private/JavaScript/asset-upload/src/components/PreviewSection.tsx
@@ -37,7 +37,7 @@ const PreviewSection: React.FC = ({ files, loading, uploadS
{files.rejected.length > 0 && (
<>
- {translate('uploadDialog.fileList.uploadedHeader', 'Failed uploads')}
+ {translate('uploadDialog.fileList.failedUploadsHeader', 'Failed uploads')}
{files.rejected.map((file) => (
= ({ files, loading, uploadS
{files.finished.length > 0 && (
<>
- {translate('uploadDialog.fileList.uploadedHeader', 'Successful uploads')}
+ {translate('uploadDialog.fileList.successfulUploadsHeader', 'Successful uploads')}
{files.finished.map((file) => (
{
return (
{result.loading ? (
-
Loading Variants
+
{translate('assetVariants.loadingVariants', 'Loading Variants…')}
) : (
<>
-
Image Variants
+
{translate('assetVariants.title', 'Image Variants')}
{result.variants?.length > 0 ? (
result.variants?.map((variant) => (
diff --git a/Resources/Private/JavaScript/core/src/strategy/ApprovalAttainmentStrategy.ts b/Resources/Private/JavaScript/core/src/strategy/ApprovalAttainmentStrategy.ts
index f55824a2b..723f8ddd6 100644
--- a/Resources/Private/JavaScript/core/src/strategy/ApprovalAttainmentStrategy.ts
+++ b/Resources/Private/JavaScript/core/src/strategy/ApprovalAttainmentStrategy.ts
@@ -43,7 +43,7 @@ export const DefaultApprovalAttainmentStrategyFactory: ApprovalAttainmentStrateg
title: deps.intl.translate('actions.deleteAsset.confirm.title', 'Delete Asset', [asset.label]),
message: deps.intl.translate(
'action.deleteAsset.confirm.message',
- `Do you really want to delete the asset "${asset.label}"`,
+ `Do you really want to delete the asset "${asset.label}"?`,
[asset.label]
),
buttonLabel: deps.intl.translate(
@@ -57,7 +57,7 @@ export const DefaultApprovalAttainmentStrategyFactory: ApprovalAttainmentStrateg
title: deps.intl.translate('actions.deleteAssets.confirm.title', 'Delete Assets', [assets.length]),
message: deps.intl.translate(
'action.deleteAssets.confirm.message',
- `Do you really want to delete ${assets.length} assets`,
+ `Do you really want to delete ${assets.length} assets?`,
[assets.length]
),
buttonLabel: deps.intl.translate(
@@ -73,7 +73,7 @@ export const DefaultApprovalAttainmentStrategyFactory: ApprovalAttainmentStrateg
]),
message: deps.intl.translate(
'action.deleteAssetCollection.confirm.message',
- `Do you really want to delete the collection "${assetCollection.title}"`,
+ `Do you really want to delete the collection "${assetCollection.title}"?`,
[assetCollection.title]
),
buttonLabel: deps.intl.translate(
@@ -87,7 +87,7 @@ export const DefaultApprovalAttainmentStrategyFactory: ApprovalAttainmentStrateg
title: deps.intl.translate('actions.deleteTag.confirm.title', 'Delete tag', [tag.label]),
message: deps.intl.translate(
'action.deleteTag.confirm.message',
- `Do you really want to delete the tag "${tag.label}"`,
+ `Do you really want to delete the tag "${tag.label}"?`,
[tag.label]
),
buttonLabel: deps.intl.translate(
diff --git a/Resources/Private/JavaScript/media-module/src/components/Main/ListView.tsx b/Resources/Private/JavaScript/media-module/src/components/Main/ListView.tsx
index ce9754312..91302e90a 100644
--- a/Resources/Private/JavaScript/media-module/src/components/Main/ListView.tsx
+++ b/Resources/Private/JavaScript/media-module/src/components/Main/ListView.tsx
@@ -39,7 +39,7 @@ const ListView: React.FC = ({ assetIdentities }: ListViewProps) =
|
{translate('thumbnailView.header.name', 'Name')} |
- {translate('thumbnailView.header.lastModified', 'Last Modified')}
+ {translate('thumbnailView.header.lastModified', 'Last modified')}
|
{translate('thumbnailView.header.fileSize', 'File size')}
diff --git a/Resources/Private/JavaScript/similar-assets/src/components/SimilarAssetsModal.tsx b/Resources/Private/JavaScript/similar-assets/src/components/SimilarAssetsModal.tsx
index 6020ecc0c..84f968875 100644
--- a/Resources/Private/JavaScript/similar-assets/src/components/SimilarAssetsModal.tsx
+++ b/Resources/Private/JavaScript/similar-assets/src/components/SimilarAssetsModal.tsx
@@ -26,7 +26,7 @@ const SimilarAssetsModal: React.FC = () => {
return (
|