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 ( { ) : ( {loading - ? translate('similarAssetsModal.loading', 'Loading...') + ? translate('similarAssetsModal.loading', 'Loading…') : translate('similarAssetsModal.noResults', 'No results')} )} diff --git a/Resources/Private/Translations/de/Main.xlf b/Resources/Private/Translations/de/Main.xlf index fe9c85840..dac7a0983 100644 --- a/Resources/Private/Translations/de/Main.xlf +++ b/Resources/Private/Translations/de/Main.xlf @@ -12,21 +12,623 @@ Mit dem Medienmodul können alle Dateien, einschließlich Bilder, Dokumente, Videos und Audiodateien, verwaltet werden. + + Loading media module UI… + Medienmodul wird geladen… + + + + Upload + Hochladen + + + Drag 'n' drop some files here, or click to select files. + Dateien hier ablegen oder klicken, um Datei hochzuladen. + Maximum file size is {size} and file limit is {limit} - Maximale Dateigröße ist {size} und Dateilimit ist {limit} + Die maximale Dateigröße beträgt {size}. Es können maximal {limit} Dateien ausgewählt werden. + + + Upload assets + Assets hochladen + + + Selected files + Ausgewählte Dateien + + + Upload + Hochladen - Uploading… Hochladen… + + Successful uploads + Erfolgreiche Uploads + + + Failed uploads + Fehlgeschlagene Uploads + + + ADDED + OK + + + EXISTS + EXISTIERT + + + Replace asset + Asset ersetzen + + + Generate redirects + Weiterleitungen erstellen + + + Keep original filename + Ursprünglichen Dateinamen beibehalten + + + Replace + Ersetzen + + + Replacement finished + Das Asset wurde ersetzt + + + Replacement failed + Ersetzen des Assets fehlgeschlagen + + + Close + Schließen + + + Cancel + Abbrechen + You can only select any of the following types: {types} Sie können nur einen der folgenden Typen auswählen: {types} + + Replace asset + Asset ersetzen + + + Title + Titel + + + Label + Bezeichnung + + + Cancel + Abbrechen + + + Create + Erstellen + + + No matches found + Keine Treffer gefunden + + + assets + Assets + + + Clipboard + Zwischenablage + + + Close clipboard + Zwischenablage schließen + + + Delete all assets in clipboard + Alle Assets in der Zwischenablage löschen + + + Delete Assets + Assets löschen + + + Do you really want to delete {0} assets? + Wollen Sie wirklich {0} Assets löschen? + + + Yes, proceed with deleting the assets + Ja, mit dem Löschen fortfahren + + + The assets have been deleted + Die Assets wurden gelöscht + + + Error while trying to delete the assets + Fehler beim Löschen der Assets + + + Flush clipboard + Zwischenablage leeren + + + Flush clipboard + Zwischenablage leeren + + + Do you really want to remove all assets from the clipboard? + Wollen Sie die Zwischenablage wirklich leeren? + + + Yes, proceed with flushing the clipboard + Ja, Zwischenablage leeren + + + + + + Asset was successfully imported + Das Asset wurde erfolgreich importiert + + + Failed to import asset + Das Asset konnte nicht importiert werden + + + The asset has been deleted + Das Asset wurde gelöscht + + + Preview asset + Vorschau + + + Import asset + Asset importieren + + + Delete asset + Asset löschen + + + Cannot delete an asset that is in use + Ein Asset, das verwendet wird, kann nicht gelöscht werden + + + Download asset + Asset herunterladen + + + Copy to clipboard + In die Zwischenablage kopieren + + + Delete Asset + Asset löschen + + + Do you really want to delete the asset "{0}"? + Wollen Sie das Asset "{0}" wirklich löschen? + + + Yes, proceed with deleting the asset + Ja, mit dem Löschen fortfahren + + + + + + Collections + Sammlungen + + + Favourites + Favoriten + + + Create new asset collection + Neue Sammlung erstellen + + + Create new tag + Neuen Tag erstellen + + + Delete + Löschen + + + Toggle favourite + Als Favorit (ent-)markieren + + + All + Alle + + + Show assets for all collections + Zeige Assets aller Sammlungen + + + Unassigned + Nicht zugewiesen + + + Show assets which are not assigned to any collection + Zeige Assets, die keiner Sammlung zugewiesen sind + + + Untagged + Nicht getaggt + + + + + + Create Asset Collection in "{location}" + Sammlung erstellen in "{location}" + + + Asset collection was created + Sammlung wurde erstellt + + + Failed to create asset collection + Fehler beim Erstellen der Sammlung + + + Delete collection + Sammlung löschen + + + Do you really want to delete the collection "{0}"? + Wollen Sie die Sammlung "{0}" wirklich löschen? + + + Yes, proceed with deleting the collection + Ja, mit dem Löschen fortfahren + + + Asset collection was successfully deleted + Die Sammlung wurde gelöscht + + + Failed to delete asset collection + Fehler beim Löschen der Sammlung + + + Create tag + Tag erstellen + + + Tag was created + Tag wurde erstellt + + + Failed to create tag + Fehler beim Erstellen des Tags + + + Delete tag + Tag löschen + + + Do you really want to delete the tag "{0}"? + Wollen Sie den Tag "{0}" wirklich löschen? + + + Do you really want to delete the tag "{0}"? + Wollen Sie den Tag "{0}" wirklich löschen? + + + Yes, proceed with deleting the tag + Ja, mit dem Löschen fortfahren + + + The tag has been deleted + Der Tag wurde gelöscht + + + Error while trying to delete the tag + Fehler beim Löschen des Tags + + + + + + Media source description + Medienquellen-Beschreibung + + + Media sources + Medienquellen + + + Local + Lokal + + + + + + Search + Suche + + + + + + Toggle asset filters + Filteroptionen anzeigen + + + Filter + Filter + + + Video + Video + + + Audio + Audio + + + Image + Bilder + + + Document + Dokumente + + + Unused + Nicht verwendet + + + All + Alle + + + + + + Last Modified + Zuletzt geändert + + + Name + Name + + + Size + Größe + + + Ascending + Aufsteigend + + + Descending + Absteigend + + + Switch sort direction + Sortierrichtung wechseln + + + + + + Switch view + Ansicht wechseln + + + List + Listenansicht + + + Thumbnails + Miniaturansicht + + + + + + Loading assets + Assets werden geladen + + + No assets found for "{searchTerm}" + Keine Assets gefunden für "{searchTerm}" + + + No assets found + Keine Assets gefunden + + + Name + Name + + + Last modified + Zuletzt geändert + + + File size + Dateigröße + + + Type + Typ + + + + + + Selected collection + Ausgewählte Sammlung + + + Selected tag + Ausgewählter Tag + + + Path + Pfad + + + + Properties + Eigenschaften + + + Title + Titel + + + Label + Bezeichnung + + + Caption + Beschriftung + + + Copyright notice + Urheberrechtshinweis + + + Discard + Verwerfen + + + Apply + Anwenden + + + Collection + Sammlung + + + Collections + Sammlungen + + + Select a collection + Sammlung auswählen + + + Tags + Tags + + + Select a tag + Tag auswählen + + + Tasks + Aktionen + + + Rename asset + Asset umbenennen + + + Metadata + Metadaten + + + Dimensions + Dimensionen + + + Size + Größe + + + Filename + Dateinamen + + + Last modified + Zuletzt geändert + + + MIME type + MIME-Type + + + IPTC Metadata + IPTC-Metadaten + + + + + + Show similar assets + Ähnliche Assets anzeigen + + + Similar assets to "{asset}" + Ähnliche Assets wie "{asset}" + + + Cancel + Abbrechen + + + Loading… + Wird geladen… + + + No results + Keine Resultate + + + + + + Replace asset + Asset ersetzen + + + + + + Rename asset + Asset umbenennen + + + Filename + Dateiname + + + Cancel + Abbrechen + + + Update + Ändern + + + Updating… + Wird geändert… + + + Neos documents and content Neos Dokumente und Inhalte @@ -37,7 +639,7 @@ n/a - k.A. + n. v. Usage details for "{asset}" @@ -87,6 +689,44 @@ Show usages Verwendungen anzeigen + + + + Image Variants + Bildvarianten + + + Loading Variants + Bildvarianten werden geladen… + + + No variants found + Keine Bildvarianten gefunden + + + + + + Go to previous page + Gehe zu vorheriger Seite + + + Go to first page + Gehe zu erster Seite + + + Go to page {page} + Gehe zu Seite {page} + + + Go to last page + Gehe zu letzter Seite + + + Go to next page + Gehe zu nächster Seite + + diff --git a/Resources/Private/Translations/en/Main.xlf b/Resources/Private/Translations/en/Main.xlf index 83857808a..1b9587f05 100644 --- a/Resources/Private/Translations/en/Main.xlf +++ b/Resources/Private/Translations/en/Main.xlf @@ -11,7 +11,7 @@ - Loading media module UI... + Loading media module UI… @@ -23,9 +23,30 @@ Maximum file size is {size} and file limit is {limit} + + Upload assets + + + Selected files + + + Upload + Uploading… + + Successful uploads + + + Failed uploads + + + ADDED + + + EXISTS + Replace asset @@ -38,6 +59,12 @@ Replace + + Replacement finished + + + Replacement failed + Close @@ -55,6 +82,15 @@ Title + + Label + + + Cancel + + + Create + No matches found @@ -67,6 +103,36 @@ Close clipboard + + Delete all assets in clipboard + + + Delete Assets + + + Do you really want to delete {0} assets? + + + Yes, proceed with deleting the assets + + + The assets have been deleted + + + Error while trying to delete the assets + + + Flush clipboard + + + Flush clipboard + + + Do you really want to remove all assets from the clipboard? + + + Yes, proceed with flushing the clipboard + @@ -97,6 +163,15 @@ Copy to clipboard + + Delete Asset + + + Do you really want to delete the asset "{0}"? + + + Yes, proceed with deleting the asset + @@ -134,6 +209,72 @@ Untagged + + + + Create Asset Collection in "{location}" + + + Asset collection was created + + + Failed to create asset collection + + + Delete collection + + + Do you really want to delete the collection "{0}"? + + + Yes, proceed with deleting the collection + + + Asset collection was successfully deleted + + + Failed to delete asset collection + + + Create tag + + + Tag was created + + + Failed to create tag + + + Delete tag + + + Do you really want to delete the tag "{0}"? + + + Do you really want to delete the tag "{0}"? + + + Yes, proceed with deleting the tag + + + The tag has been deleted + + + Error while trying to delete the tag + + + + + + Media source description + + + Media sources + + + Local + + @@ -170,14 +311,11 @@ - Last Modified + Last modified Name - - Last Modified - Size @@ -214,6 +352,18 @@ No assets found + + Name + + + Last modified + + + File size + + + Type + @@ -233,6 +383,9 @@ Title + + Label + Caption @@ -284,6 +437,27 @@ MIME type + + IPTC Metadata + + + + + + Show similar assets + + + Similar assets to "{asset}" + + + Cancel + + + Loading… + + + No results + @@ -305,6 +479,9 @@ Update + + Updating… + @@ -353,6 +530,17 @@ Show usages + + + Image Variants + + + Loading Variants… + + + No variants found + +